SAS好きの疫学系院生ブログ

MPH院生のブログです

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=平均ラベル)、のように自由に変数にラベルを指定することができます。

f:id:MisakiF:20200903225013p:plain

f:id:MisakiF:20200903225120p:plain

ヒストグラムや箱ひげ図に加えて、正規分布に従っているかどうかを確認するためのQ-Qプロットも出力してくれます。

Univariateプロシジャは一度に多くの記述統計量を表示できるため便利ではありますが、平均や分散だけ表示したい場合もあります。
その場合は、MeansプロシジャやSummaryプロシジャを使ったほうが良いでしょう。

ブログ始めてみました

ブログ始めました。

京大SPHの院生です。

 

現在はCovid-19の影響もあり、研究室の方と対面することが難しい状況です。なので少しでも自分の研究活動の記録を残して、議論のきっかけを作っていきたいと思い初めてみました。

同じ研究の悩み等を共有できたらいいですよね。

 

記事の内容としては、SPHで学んだ疫学・医療統計学、因果推論、将棋や読んだ本の紹介、興味あること等、とりあえず思いついたことを書いていこうと思います。

統計ソフトは基本SASメインで記事にしていこうかと思います。

 

間違いの指摘やちょっとしたコメント等、お待ちしております。