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となるように指定しています。