医療統計学を学ぶ大学生のブログ

医療統計学、因果推論を専攻しています。R, SASユーザーです。

SASによる解析:一元配置分散分析のシミュレート(One-way ANOVA)

f:id:NorihiroSuzuki:20210708142601p:plain
 

前回の記事では線形関係があるデータのシミュレート、分析を行ったということで、その続きとして今回は一元配置分散分析の場合を扱おうと思います。実行環境はいつも通りSAS Studioですが、SAS9.4で同様の結果を得ることが出来ます。

 

 

一元分散分析について

 ある2群のデータに対して、その平均が等しいかをどうかを検定する方法としては、t検定がありました。しかし、t検定では複数の因子が含まれていたり、3群以上からなるデータに対してはその母平均が等しいかどうかの検定をすることが出来ません。

 そこで用いるのが今回のテーマである「分散分析」です。分散分析は大きくは、一元配置分散分析と、2元以上であるN元配置分散分析に分かれます。

 

分散分析では、因子(要因)や水準といった言葉が出てくるので、まずはそれを整理します。より正確な定義が知りたい方は専門書での確認をよろしくお願いします。

  • 因子(要因)

→データに対して影響を及ぼすと考えられる項目。データを群に分ける項目。

  • 水準

→因子を複数に分ける条件となる値

 

このままだと少しわかりにくいので、以下のような具体例を考えます。

 

実験状況

マウスをA薬とB薬を投与するマウス群に分ける。さらにそれぞれの群を10mg, 25mg, 50mg投薬されるグループに分ける(下記の状況)

 

f:id:NorihiroSuzuki:20210708160632p:plain

 

この実験で因子となるのは処置(投薬の種類)、つまり、A薬かB薬であるかということです。さらにそれぞれの群はその投薬量(10mg, 25mg, 50mg)という3つの水準に分かれます。分散分析という言葉の前につく「〇元配置」の〇には、この因子数が入ります。このマウスを使った実験の場合であれば、(3水準の)二元配置分散分析となります。

 

今回この記事で紹介するのは、残念ながら二元配置分散分析ではなく、一元分散分析です。先ほどの例であれば、マウスに投与するのはA薬のみであり、3つある処置の水準ごとのアウトカムの平均が同一であるかどうかということを検定します。

 

 

 

SAS Studioでのシミュレート 

 SAS Studioでは、データのシミュレートのガイドとして、いくつかのスニペットが準備されています。今回はこのうち「一元配置分散分析データのシミュレート」を利用しつつ、線形な関係を持つ変数データの作成、またそれを用いての重回帰分析をやってみます。

 

 まずはSAS Studioにログインして、SAS Studioを起動します。
 次に、画面左にあるスニペットを展開し、データ、一元配置分散分析データのシミュレートを選択します。

f:id:NorihiroSuzuki:20210708161657p:plain

 以下のように自動的にコードが生成されます。このコードの内容について解説をまず行います。

 

f:id:NorihiroSuzuki:20210708161847p:plain

 

 今回のシミュレートはDATAステップを用いて行われているため、初めにデータセット名である"regdata"が指定されています。

 

 次に、call streaminit(数値)で乱数シードを指定しています。この数値が0でない場合、このコードで作成される乱数は同一になります。それに対して、数値を0とした場合には毎回異なる乱数が発生します。またdropステートメントによって変数nをデータセットに含めないようにしています。

 

 シミュレートで作成するデータのサイズはその次の行のdoステートメントによって指定がされています。(今回は100回)

 

f:id:NorihiroSuzuki:20210708162340p:plain

 

 次に3つの値をとるカテゴリー変数"treatment"を作成します。この記事の冒頭にあったマウスの例でいう投薬量がこれにあたります。

 各treatmentはテーブル分布による指定によって、確率0.2, 0.4, 0.4でtreatment1, 2, 3に割り振られます。つまり、サンプルの約20%がグループ1に、約40%がグループ2に、約40%がグループ3に分かれるわけです。この辺りのパラメータを変更すれば、サンプルサイズや、グループの相対的な大きさは変更可能です。

 

 そして最後にresponseという目的変数をそれぞれの群によって発生させる分布を変えて作成します。(同一分布であると水準間で差がなくなる為)

 

※rand関数で指定できる分布の詳細いについては、この記事の後半にまとめています。

 

(作成したデータの一部)

f:id:NorihiroSuzuki:20210708163333p:plain

  

シミュレートデータを用いた一元配置分散分析

 分散分析での帰無仮説は、「すべてのグループの平均値は等しい」 というものであり、分析に慣れていない人にとっては注意が必要です。なぜならば仮に帰無仮説が棄却され、グループの平均が同じではない(異なる平均を持つサブグループが存在する)と判断したとしても、どのグループが違うのかまでは判別できないからです。

 加えて、すべての群のペアに関してt検定を行い、平均が違うところを見つけようとしても、今度は多重比較問題というαエラーの増大に関しての別な問題が生じます。この辺りは、ANOVAの理論的な側面をまとめる際に一緒に扱おうかなと思います。

 

 というわけで、先ほど作成したシミュレートデータを用いて、一元配置分散分析を行います。結果はこちら!

 

f:id:NorihiroSuzuki:20210708164411p:plain

各グループに割り当てられたのは順に26, 45, 29ずつであり、グループごとの平均、標準偏差が算出されています。

 

f:id:NorihiroSuzuki:20210708164642p:plain

 一元分散分析自体の結果は上記のように、統計的に有意でした。すなわち帰無仮説を棄却し、対立仮説「グループ間の平均は異なる」を採択します。

 また、今回は一元分散分析であるため、全体の分散分析のテーブルに出力されている結果と同一なものになります。
 

 分散分析は、正規性と等分散性の仮定が必要となりますが、そのことについてはまた別な記事でまとめます。

 

 

rand関数で指定可能な分布の詳細

 関数rand()では以下のような20種類の分布が指定できます。

 

f:id:NorihiroSuzuki:20210701160929p:plain

 

SASコード

今回SAS Studioで行ったシミュレート、解析のコードです。(コピペ用)

 

 

data onewayanovadata;
call streaminit(112358);
drop n;
do n = 1 to 100;
treatment = rand( 'TABLE', .2, .4, .4);
if treatment = 1 then response = rand( 'NORMAL', 10, 0.8 );
else
if treatment = 2 then response = rand( 'NORMAL', 11, 0.8 );
else
if treatment = 3 then response = rand( 'NORMAL', 15, 0.8 );
output;
end;
run;

proc print
data=onewayanovadata;
run;

Title;
ods noproctitle;
ods graphics / imagemap=on;

proc glm data=WORK.ONEWAYANOVADATA;
class treatment;
model response=treatment;
means treatment / hovtest=levene welch plots=none;
lsmeans treatment / adjust=tukey pdiff alpha=.05;
run;
quit;

 

参考

video.sas.com
video.sas.com

support.sas.com