日々の記録簿

日々のできごとの記録

日記

RからMplusを使う(MplusAutomation)

投稿日:

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だと思うので、一度お試しあれ。

スポンサーリンク

スポンサーリンク

-日記

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

VLC3.0.4-3でTSファイルが再生できない【解決】

タイトルの通りですが、いつの間にかVLC(3.0.4-3)でTSファイルが再生できなくなっていました。OSはArch Linuxです。依存関係でダウングレードもできない模様。 ググってみると、【Mpe …

vimtexでuplatexがコンパイルできない(vimtex_compiler_latexmkの設定)

以前からLaTeXの執筆にはvimtexを使っていたのですが、2017年4月頃にアップデートしたらコンパイルできなくなったので原因を探ったときのメモ。 なお、「latexmkでコンパイルはできる」こと …

RStudioから、upLaTeXを経由して、pdfを作成する

かなり(無駄な)苦労をしたのでメモ。 RStudioでは、RnowebファイルからPDFを作成することができます。ただし、今のところ受け付けてくれるのは、pdfLaTeXか、xeLaTeXに限られてい …

Thinkpad X1 Carbon 2016 (4th gen)に、Arch Linuxをインストールする方法(その4)

Thinkpad X1 Carbon 2016 (4th gen)でLinuxが起動しないという問題の現状です。 最新のkernel 4.6で、OneLink+ ドックがほぼ安定して使えるようになりま …

デスクトップ環境をXfceに変更してみた!

なんとなくGnomeやめようかな・・・と思って、デスクトップ環境をXfceに変更してみました。 ついでに、NetworkManagerとか、Ibusとか、Evinceとか、代替する方法あるのかなあ?・ …