Transpose プロシジャ
経時測定データの解析やグラフ作成において欠かせないのが、列と行の転置です。
行と列の転置をする際に使用するのが、Transposeプロシジャです。
以下のような各対象者の4時点のアウトカムが測定された、経時測定データを想定します。
data d1; do ID=1 to 100; time1=rand("normal", 130, 10) - 1; time2=rand("normal", 130, 10) - 2; time3=rand("normal", 130, 10) - 3; time4=rand("normal", 130, 10) - 4; output; end; run;
Obs | ID | time1 | time2 | time3 | time4 |
---|---|---|---|---|---|
1 | 1 | 120.212 | 120.113 | 136.648 | 147.289 |
2 | 2 | 121.143 | 116.871 | 118.837 | 130.571 |
3 | 3 | 133.928 | 145.323 | 128.351 | 103.948 |
4 | 4 | 137.547 | 116.522 | 135.479 | 118.871 |
5 | 5 | 130.469 | 130.480 | 121.440 | 122.957 |
6 | 6 | 128.345 | 139.289 | 134.042 | 142.513 |
7 | 7 | 146.649 | 132.147 | 130.313 | 151.464 |
8 | 8 | 108.033 | 145.543 | 127.546 | 107.512 |
9 | 9 | 146.863 | 138.182 | 117.447 | 134.335 |
10 | 10 | 122.465 | 138.447 | 120.752 | 129.347 |
上記のデータから、4時点のアウトカムデータを以下のように一列で表示することを考えます。
Obs | ID | time | x1 |
---|---|---|---|
1 | 1 | time1 | 120.212 |
2 | 1 | time2 | 120.113 |
3 | 1 | time3 | 136.648 |
4 | 1 | time4 | 147.289 |
5 | 2 | time1 | 121.143 |
6 | 2 | time2 | 116.871 |
7 | 2 | time3 | 118.837 |
8 | 2 | time4 | 130.571 |
ここでTransposeプロシジャを使います。
proc transpose data=d1 out=out prefix=x name=time; var time1 time2 time3 time4; by ID; run;
上記のコードによってtime1~4をX1という一つの変数にまとめることができます。time1~4という時点に関する情報を保持するため、timeという変数を新たに作成しています。
VARステートメントでは転置する変数を指定します。今回のデータではtime1~4を1列にまとめることが目的なので指定しています。
BYステートメントでは各行に対応させる変数を指定します。実際のデータでは被験者IDなどを設定することが多いでしょう。
PROC TRANSPOSEステートメントでは変数名などのオプションを設定することができます。prefixは新しく生成する変数名を指定します。上記のコードでは、time1~4の変数を一つにまとめた際の変数名をXと指定していることになります。nameでは転置元の変数を値として格納する変数の名前を指定しています。上記のコードではtime1~4という値を格納するtimeという変数名を指定しています。
実は今回行った転置の逆を行うことも可能です。
proc transpose data=out out=out1; var x1; by ID; id time; run;
IDステートメントで転置変数のラベルとなる変数を指定します。X1を4つの列に転置する際のラベルを、time変数の値time1~4となるように指定しています。
1変量のデータ要約(Univariateプロシジャ)
SASによる1変量の記述統計の出力方法です。
まずは正規乱数でデータを生成します。以下のような2群データを想定しています。
data bp; do No=1 to 200; if No<=100 then group="treat"; if No>100 then group="placebo"; if No<=100 then bp=rand("normal", 130, 10); if No>100 then bp=rand("normal", 140, 10); output; end; run;
No | group | bp |
---|---|---|
1 | treat | 120.795 |
2 | treat | 121.15 |
3 | treat | 127.129 |
4 | treat | 140.005 |
5 | treat | 133.352 |
6 | treat | 135.889 |
7 | treat | 113.716 |
8 | treat | 126.45 |
9 | treat | 132.932 |
10 | treat | 118.033 |
今回はtreat群とplacebo群でそれぞれ記述統計を出力します。
1変量の記述統計を表示するには、Univariateプロシジャを使用します。
proc sort data=bp; by group; run; proc univariate data=bp normal plot; id No; var bp; by group; output out=out1 n=N mean=Mean std=STD median=Median qrange=Qrange; run;
まずPROC Univariate ステートメントで解析に使用するデータ(data=)を指定します。追加のオプションとして、正規性プロット(normal)やグラフ(plot)を出力するかどうかを指定できます。
idステートメントでは対象者番号を参照し、varステートメントで要約する変数を指定します。
byステートメントでカテゴリー変数を指定することで、記述統計を群ごとに出力できます。注意点は、byステートメントで指定する場合、データが事前に昇順に並び替えられていることが必要です。今回の場合、placebo群、treat群の順にアルファベット順にソートする必要があります。そのためSORTプロシジャで事前にデータをgroup変数でソートしておきます。
またOutputステートメントでは、データセットに要約統計量を出力することができます。対象者数(n=対象者ラベル)、平均(mean=平均ラベル)、のように自由に変数にラベルを指定することができます。
ヒストグラムや箱ひげ図に加えて、正規分布に従っているかどうかを確認するためのQ-Qプロットも出力してくれます。
Univariateプロシジャは一度に多くの記述統計量を表示できるため便利ではありますが、平均や分散だけ表示したい場合もあります。
その場合は、MeansプロシジャやSummaryプロシジャを使ったほうが良いでしょう。