疫学系院生ブログ

統計、因果推論、プログラミングなどの備忘録です。

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