Mplusという統計ソフトウェアがあります。高機能なのですが、いかんせんエディタが残念仕様で使いづらい・・・。
と思っていたのですが、RからMplusを操作するMplusAutomationというパッケージがありましたので、ご紹介。
いろいろなことができるのですが、今回は、R上のデータフレームからMplus用のdatファイルを作成する方法と、Mplusの分析ファイル(inpファイル)をルールに従って生成する方法について書きます。
RからMplus用のdatファイルを生成する
ここでは、TIMSS2011 Grade4のデータを例に使う。今、TIMSSの数学得点(ASMMAT)と、家庭にある本の冊数(ASBG04)の関連を調べることを考えよう。せっかくMplusを使うので、マルチレベルモデルを使うことを考える。
# 必要なlibraryの読み込み library(foreign) library(MplusAutomation) # TIMSSデータを読み込み jp11 <- read.spss("asgjpnm5.sav", use.value.labels=F, to.data.frame=T, use.missing=T) # mplusデータに変換 prepareMplusData(jp11, filename="example.dat", keepCols= c("IDSCHOOL", "ASMMAT01", "ASMMAT02", "ASMMAT03", "ASMMAT04","ASMMAT05", "ASBG04"), overwrite=T)
prepareMplusDataでは、上記のように、Rのデータフレーム名、Mplusのdatファイル名、必要な変数名を指定すればよい。overwriteは同名のファイルがあった場合、それを上書きするかどうかを指定できる。今回は、上書きする指定にしている。
Rの出力として、Mplusのinpファイルの一部が出力されるので、これを利用するとよい。今回の場合は、下記のような出力が得られる。
TITLE: Your title goes here DATA: FILE = "example.dat"; VARIABLE: NAMES = IDSCHOOL ASMMAT01 ASMMAT02 ASMMAT03 ASMMAT04 ASMMAT05 ASBG04; MISSING=.;
Mplusの分析ファイルを生成する
TIMSSデータを扱う場合に面倒なのが、PV1からPV5まで、別々に計算する必要があるという点である。つまり、PV1のinpファイル、PV2のinpファイル・・・、といった具合に、よく似た5つのinpファイルを生成しなければならない。これはかなり面倒である。MplusAutomationには、これを自動化する機能がある。
具体的には、下記のようなファイルを用意する。拡張子は何でもよい。ここでは仮に、mplus_exampleとする。
[[init]] iterators = PVs model; PVs = 1:5; model = 1:2; outputDirectory="~/"; filename=model[[model]]pv[[PVs]].inp; [[/init]] Title: PV[[PVs]] of Model [[model]] Data: File = "example.dat"; Variable: Names = IDSCHOOL ASMMAT01 ASMMAT02 ASMMAT03 ASMMAT04 ASMMAT05 ASBG04; Missing=.; Cluster = IDSCHOOL; [[model = 1]] Usevariables = IDSCHOOL ASMMAT0[[PVs]]; [[/model = 1]] [[model = 2]] Usevariables = IDSCHOOL ASMMAT0[[PVs]] ASBG04; [[/model = 2]] Analysis: Type = twolevel; Estimator = MLR; Model: [[model = 1]] %Within% ASMMAT0[[PVs]]; %Between% ASMMAT0[[PVs]]; [[/model = 1]] [[model = 2]] %Between% ASMMAT0[[PVs]] on ASBG04; %Within% ASMMAT0[[PVs]] on ASBG04; [[/model = 2]]
ここで、前半のinit内がMplusAutomation独自の機能である。
[[init]] iterators = PVs model; PVs = 1:5; model = 1:2; outputDirectory="~/"; filename=model[[model]]pv[[PVs]].inp; [[/init]]
まず、iteratorsでは、変数名を指定する。今回は、PVsとmodelという二つの変数を指定している。
続いて、それぞれの変数PVsとmodelの範囲を指定する。PVsは1から5まであるので1:5とし、今回は二つのモデルを試そうと思うので、model=1:2とした。
outputDirectoryは、出力するディレクトリを決める。今回はホームディレクトリを指定している。なお、Windowsの場合は、”C://”などにすると良いはずである。
filenameは、inpファイルのファイル名を指定する。ここで、[[model]]や[[PVs]]となっている部分は、iteratosで指定した変数名のことである。それぞれ、先ほど指定した範囲(PVs=1:5, model=1:2)の範囲で変化する。つまり今回は、model1pv1.inp、model1pv2.inp、model1pv3.inp・・・model2pv1.inp、model2pv2.inp・・・model2pv5.inpまで、合計10のinpファイルが生成される。なお、ファイル名をかぶせるように設定すると、ファイルが上書きされてしまうので注意。
後半は、基本的にmplusのinpファイルである。ただし、[[PVs]]や[[model]]内は指定した範囲で変化する。
また、[[model=1]]から[[/model=1]]でくくられた範囲は、model=1のときのみ出力され、model=2のときは出力されない。
こうしたmplus_exampleファイルを作成した後、R内で、下記のように実行するとinpファイルが生成される。
createModels("mplus_example")
続いて、inpファイルを実行すればよい。これも、R内で下記のようにすると、指定したディレクトリ内のすべてのinpファイルが実行される。
runModels("~/", showOutput=TRUE, logFile=NULL)
shotOutputはmplusの出力をR上で見るためのものである。logFileはmplusのエラーログ等を保存してくれる。鬱陶しいので、今回はオフにしている。
今回のinpファイルはテキトーに作ったものなので、mplusではいくつかエラーがでるが、MplusAutomationの使い方は何となくわかると思う。
他にも、MplusAutomationには、outファイルの結果(係数やモデルの適合度など)をR上に読み込む関数も用意されている。細かいことは、使い方の例を読めば良い。RからMplusを使う方には、いろいろ便利なlibraryだと思うので、一度お試しあれ。