じんたんのブログ

シカゴでの研究留学生活、その関連情報を記載していきます。

"R" と "Stata"

統計ソフトをどれを選ぶかというのは実はその後を左右する非常に大きな問題になります。

ノースウェスタ予防医学講座は疫学、統計等から構成されていますが、統計ソフトの主流はSAS、続いてRです。なので、解析で質問等に行くと、RかSASが使えるかをまず聞かれます。

ただし、ハーバード、ジョンスホプキンス、MITの友人に聞くと、少し状況は変わります。

ハーバードやジョンスホプキンスの主流は"R"でSASを使っている人もFacultyには多いが、若手は断然Rのようです。それに加えて、ノースウェスタンではほとんど使われていないStataも使用している人も比較的多く、Stata用の授業もあるとのことです。MITに行くと、Pythonを使用する人がかなり多くなるといった状況のようです。

 

私はもともとJMP、Easy Rを使用して統計解析をしていましたが、Institutional licenseが切れたためJMPが使用できなくなり、Easy Rを使用していましたが、Easy Rで対応できない問題が多々生じたためRを学び始めました。しかし、給与をもらっているため、ある一定の成果を上げる(つまり論文を書く)ことが常に求められるので、Rを一から学びながら、統計解析をし、論文を書くことが現実的に難しく、即戦力となる統計ソフトの導入が必要でした。そこで、上司やその他の先生方に相談し、最終的にはStataをポスドク 料金で購入し、使い始めました。

 

Stataの特徴としては、SPSS/JMP/Easy Rと同じように、クリックで統計を選択し、解析ができるため、Codeを知らなくても問題ない点です。しかも、非常に対応している解析にVariationがあり、ほとんどの解析ができるといっても良いかもしれません。ただ、素人が訳もわからず特殊な解析を選択してしまう可能性もあるので注意は必要です。

その他の特徴としては、RやPythonのようにフリーではありませんが、その他の統計ソフトと比べると圧倒的に安く、コミュニティーもあるため、何か問題があればバックアップをしてもらえまます。また、購入した会社に統計に関して問い合わせても1−2日で返答をもらえるため、安心は安心です。

 

そんなこんなで、Stataを昨年の7月頃に購入し、はや半年が経過しましたが、ほとんどの解析をStataでこなせるようになり、今ではクリックが面倒くさいので、Codeを直接書いたり、For loopをわましたり、Macroを使ったりまでできるようになってしまいました。StataのCodeは非常に簡単なので、初心者にもとっつき易いと思います。しかも、一旦自分の書いたCodeを保存しておけば、使い回しも効くので、同様の解析をする際の時間が大幅に短縮されます。また、論文を書いたさいにReviseで追加解析等をしなくてはならない時にも、Codeが残っているので、追加解析も容易であり、Reproducibleなレポートを作成できるようにもなりました。

 

ただし、Stataにもデメリットがないわけではありません。

 

私が感じる一番のデメリットは、Data tableが一つしか開くことができないため、新しいData tableを見たい時に、今開いているData tableを一旦閉じなければならない点です。意外と、Mergeする際等に面倒に思ってしまうことがあります。

あとは、Stataも十分data visualizationも強いのですが、Rのggplotと比べるとどうしてもcodeが長くなってしまうことがあります。

下記はx軸に時間、y軸に年齢調整死亡率(+ 95% CI)をとったline graphをStataで作成したもので、白人/黒人と男性/女性で4つのカテゴリーに分けて、一つのグラフに4本のlineが描写されています。

Dataは下記を参照:Copy and PasteでExcelに貼れます。

Year1 AAMR AAMRLOWER AAMRUPPER sexrace
1996 7.1 6.3 8 1
1997 6.9 6.1 7.8 1
1998 6.7 5.9 7.5 1
1999 7.3 6.5 8.1 1
2000 7.4 6.6 8.2 1
2001 6.9 6.1 7.7 1
2002 7.5 6.7 8.3 1
2003 6.8 6 7.5 1
2004 6.9 6.1 7.7 1
2005 8 7.2 8.8 1
2006 7.1 6.3 7.8 1
2007 7.3 6.6 8.1 1
2008 7.3 6.5 8 1
2009 8.8 8 9.6 1
2010 9.1 8.3 9.9 1
2011 9.4 8.6 10.1 1
2012 9.9 9.1 10.6 1
2013 10.4 9.6 11.2 1
2014 10.9 10.1 11.6 1
1996 9.2 8.9 9.4 2
1997 9.4 9.2 9.7 2
1998 9.9 9.6 10.2 2
1999 10.2 9.9 10.5 2
2000 10.1 9.8 10.4 2
2001 9.7 9.4 10 2
2002 10.5 10.2 10.8 2
2003 10.1 9.8 10.4 2
2004 10.2 9.9 10.5 2
2005 10.4 10.2 10.7 2
2006 10 9.7 10.3 2
2007 10.4 10.2 10.7 2
2008 11.2 10.9 11.5 2
2009 11.4 11.1 11.7 2
2010 12.1 11.8 12.4 2
2011 11.9 11.6 12.2 2
2012 13 12.7 13.3 2
2013 12.8 12.5 13.1 2
2014 13.5 13.2 13.8 2
1996 10.6 9.4 11.7 3
1997 10.5 9.3 11.7 3
1998 10.5 9.4 11.7 3
1999 10.7 9.6 11.9 3
2000 10.8 9.7 12 3
2001 10.4 9.3 11.5 3
2002 10.5 9.4 11.6 3
2003 11.9 10.8 13.1 3
2004 11.7 10.5 12.8 3
2005 12.2 11.1 13.3 3
2006 11.7 10.6 12.8 3
2007 12.4 11.3 13.6 3
2008 12.2 11.2 13.3 3
2009 14 12.9 15.1 3
2010 15.1 14 16.2 3
2011 15.9 14.8 17.1 3
2012 17.8 16.6 18.9 3
2013 18.1 16.9 19.2 3
2014 19.7 18.5 20.8 3
1996 14.2 13.8 14.6 4
1997 14.3 13.9 14.7 4
1998 14.2 13.8 14.5 4
1999 14.8 14.5 15.2 4
2000 14.8 14.4 15.2 4
2001 14.2 13.8 14.6 4
2002 14.8 14.5 15.2 4
2003 14.2 13.8 14.6 4
2004 14.6 14.2 15 4
2005 14.8 14.5 15.2 4
2006 14.8 14.5 15.2 4
2007 15.9 15.6 16.3 4
2008 16.7 16.3 17.1 4
2009 17.2 16.8 17.6 4
2010 18.8 18.4 19.2 4
2011 19.9 19.6 20.3 4
2012 21.1 20.7 21.5 4
2013 22.1 21.7 22.5 4
2014 23.4 23 23.8 4

f:id:Jinkei:20200214005445p:plain

Figure

separate commandを使用することで、lineとmarkerを一気に設定できるようにしているだけなので、If commandを用いて、グループごとにグラフを書いて、色を設定しても良いです。ただし、多少長くなります。

separate AAMR, by(sexrace)

separate AAMRLOWER, by(sexrace)

separate AAMRUPPER, by(sexrace)


twoway ///
(connected AAMR1 AAMR2 AAMR3 AAMR4 Year1, msymbol(square x triangle o) lcolor(red blue green orange) mcolor(red%20 blue%20 green%20 orange%20) msize(. 2 . .))|| ///
(rarea AAMRLOWER1 AAMRUPPER1 Year1, fcolor(red%20) lcolor(red%20) lpattern(".")) || ///
(rarea AAMRLOWER2 AAMRUPPER2 Year1, fcolor(blue%20) lcolor(blue%20) lpattern(".")) || ///
(rarea AAMRLOWER3 AAMRUPPER3 Year1, fcolor(green%20) lcolor(green%20) lpattern(".")) || ///
(rarea AAMRLOWER4 AAMRUPPER4 Year1, fcolor(orange%40) lcolor(orange%40) lpattern(".")) || ///
, title("Overall") ///
xtitle("Year") ///
ytitle("Age-adjusted Mortality Rate per 100,000") ///
xscale(r(1995 2015)) ///
xlabel(1995 "1995" 1997 "1997" 1999 "1999" 2001 "2001" 2003 "2003" 2005 "2005" 2007 "2007" 2009 "2009" 2011 "2011" 2013 "2013" 2015 "2015") ///
yscale(r(5 25)) ///
ylabel(5 "5" 10 "10" 15 "15" 20 "20" 25 "25", angle(0)) ///
scale(1.2) ///
legend(off)

 

Title等入れていませんが、主要なところ(上記赤文字の部分)をRで書くと、前処理も必要なく

library(ggplot2)
ggplot(Overall1, aes(x=Year1, y=AAMR, color=sexrace, shape=sexrace))+
geom_point(aes(size=1.0))+
geom_line()+
geom_ribbon(aes(ymin=AAMRLOWER, ymax=AAMRUPPER, color=sexrace), alpha=0.02, linetype="dotted")+
theme_classic()+
theme(legend.position="top")+
scale_x_continuous(breaks=seq(1995, 2015, 2), limits=c(1995, 2015))+
scale_y_continuous(breaks=seq(5, 25, 5), limits=c(10, 25))

 

Rの特徴として、4つのカテゴリーを色やマーカーの形で自動で容易に分類できるため、Codeが短くて済むのがわかると思います。Stataではいくつものグラフを上に積み重ねると、色の設定等を揃える必要があり、それが面倒になる要因です(もしかしたら自分が知らないだけで、もっと良い手があるのかもしれませんが、、、)

 

このあたりが我慢できればStataで十分ではないかとも思います。高度な解析やsimulation、機械学習などでStataを使用する機会がないので、これ以上のことは分かりませんが、臨床医が臨床論文を書く際に必要なことはほぼカバーされていると思いますし、ImpactのあるFigure等も作成可能です。