チラシの裏の落書き日記

統計とか,研究とか,日常についての備忘録的なもの。

Mplusのメモ

Mplusは潜在変数モデリングに適した解析ソフトで,心理学,社会学,疫学などの分野で近年人気が出ているソフトウェアである。ホームページは次のものがある。
Muthén & Muthén, Mplus Home Page

このソフトは非常に便利で,文法も簡潔なのであるが,文法が特に覚えられないため,自分のための備忘録として徐々にまとめを書き始める。基本的にはユーザーガイドを真似して,その都度似た分析のものをコピペするという使い方が基本。これまでにやった分析の書き方を基本に。

関西学院大学の清水先生がわかりやすいまとめを書いてくださっているので,この辺も参考に。
[http://www.slideshare.net/simizu706/mplus-lecture-1:embed:cite]

ユーザーガイドから幾つか例を書いておく。まず,MIMICモデル。これだけでもMplusの文法の重要な部分がかなり盛り込まれている。

DATA: FILE IS mimic.dat;
VARIABLE: NAMES ARE y1-y6 x1-x3;
MODEL:
f1 BY y1-y3;
f2 BY y4-y6;
f1 f2 ON x1-x3;

利用するデータファイルの名前をDATAコマンドに記述する。一文の終わりはセミコロン";"で締める。変数の名前はvariableコマンドで指定する。"-"を使って,一気に定義することができるので楽ちん。尺度ごとにまとめて変数を定義するといいかもしれない。最後にmodelコマンドでモデルを記述する。byは潜在変数の定義,onは回帰を意味する。これだけわかればかなりいろいろなモデルが記述出来ることができる。普通の人がAmosでやることは概ねできる。ちなみに,コメントは"!"で記述する。


次に成長曲線モデル。iは切片,sは傾きパラメータを意味する。この書き方は省略形である。

DATA: FILE IS growth.dat;
VARIABLE: NAMES ARE y1-y4 x1 x2;
MODEL:
i s | y1@0 y2@1 y3@2 y4@3;
i s ON x1 x2;

個人的にはbyを使ったi,sの定義の方がわかりやすい。

DATA: FILE IS growth.dat;
VARIABLE: NAMES ARE y1-y4 x1 x2;
MODEL:
s by y1@0 y2@1 y3@2 y4@3;
i by y1@1 y2@1 y3@1 y4@1;
i s ON x1 x2;

独立変数ありの探索的な潜在クラスモデリング

DATA: FILE IS lcax.dat;
VARIABLE: NAMES ARE u1-u4 x;
CLASSES = c (2);
CATEGORICAL = u1-u4;
ANALYSIS: TYPE = MIXTURE;
MODEL:
%OVERALL%
c ON x;
u4 ON x;

ポイントは潜在クラスの数をvariableコマンド内で定義し,顕在変数はカテゴリカルな変数であると定義しているてんである。また,analysisコマンド内で,type=mixtureを指定するのがポイント。
モデルの%overall%でクラス全体に関わる部分を記述する。クラスごとにモデリングを行いたい場合には,%c#1%の中に具体的なモデルを記述する。詳細はまた後日。

最後は,マルチレベルモデリング。また難しい記述の仕方である。

DATA: FILE IS reg.dat;
VARIABLE:NAMES ARE clus y x w;
CLUSTER = clus;
WITHIN = x;
BETWEEN = w;
MISSING = .;
DEFINE:
CENTER x (GRANDMEAN);
ANALYSIS: TYPE = TWOLEVEL RANDOM;
MODEL:
%WITHIN%
s | y ON x;
%BETWEEN%
y s ON w;

新しいところは,variableコマンドにcluster, within, betweenが現れ,defineというコマンドが出てきたところである。さらに,analysisのtypeも何やら新しい。順番に見てみよう。

clusterはデータが何によってネストされているかを定義する。例えば,学校の中に個人がネストされていたり,個人の中に測定時点がネストされている構造がある。このとき,withinでレベル1(学校の中の個人,あるいは個人の中の測定時点)の変数を定義している。さらに,betweenではレベル2(学校,個人)の変数を定義している。
defineコマンドによって,レベル1の変数を中心化しており,全体平均によって中心化するか,レベル2の単位で中心化する場合が多い。"ANALYSIS: TYPE = TWOLEVEL RANDOM;"はとりあえず,マルチレベルモデリングを行うときのおまじないと思っておけばよい。

modelコマンドの中では,%within%で個人レベルの回帰のモデルを作成している。”s |”によって,回帰係数を"s"としており,この"s"と従属変数"y"がレベル2の変数によって説明されるモデルを構築している。

ここまでで,相当色々な分析が出来ることがわかる。今後も気が向いた時に,モデルの記述の方法や,出力の読み方(Rでも読み込ませ方)などをメモ書きに残していく。monte carloコマンドやbayes推定の方法など,実用的なところまでたどり着ければよいかと思う。

lmerでの3レベルモデルの実行

3レベルの階層線形を行う時のlmerのメモ

学校のなかに,個人がネストされていて,個人の中に測定時点がネストされている場合。学校IDをschool_id, 個人IDがind_id,あとは独立変数をx, 従属変数をyとする。簡単のため,中心化は行われているとして,レベル2以上の変数は仮定しない。基本は level3/level2などのように上のレベルの変数からスラッシュで区切れば良いようだ。

result <- le4::lmer(y ~ 1 + x + (1 + x|school_id/ind_id), data = dat)


参考にした記事
rpsychologist.com

残差の分散共分散行列の指定の方法が色々と書かれているので,かなり使える記事。
マルチレベルで必要な分析はここでほとんどまかなえる。

今日のできごとなど

今日やったこと

  1. 某ポスター作成
  2. 発表資料の作成
  3. MCMCの観察
  4. なす購入

1.2.については直前に再度確認を行うこと。

3. について,バーンインは結構早い。サンプリングがえらく時間がかかる。いらないパラメータはサンプリングしないでいたほうがいいか?
欲しいところだけとる感じ。
thiningを大きめにして,自己相関を小さくすること。
4.なすは適当なときに植える。

明日やること

  1. シミュレーションを実行し直すこと
  2. 申請書No.1の内容を修正すること
  3. 申請書No.2の草稿を作成すること。
  4. 某発表のための資料の暫定版を作成すること
  5. 対応の続き。
  6. 某お仕事について。

1.すっかり忘れていた。
2. わりかし大事。イントロの部分を中心に直す。印刷してみて考えること。
3.全く手をつけていないが,No1の流れを参考にしてみる?
4. 暫定版を作成。必要なシミュを追加する?
5.引き続き。ただ,相談は必要。
6.誰がやるのだろうか。。。?

Rの使いかたメモ(purrrの使いかたについて)

最近読んだ良記事

最近のRの界隈で流行っている(気がする)purrrパッケージの使いかたについて。
よく参照させてもらうので,とりあえずまとめておく。

sinhrks.hatenablog.com
sinhrks.hatenablog.com
uribo.hatenablog.com
{purrr} による非テーブルデータの処理 - SSSSLIDE


自分が使うとしたらどう使うか?

一番やりそうだなぁと思ったのは最後の@sinhrksさんが紹介してくれているような,複数のモデルを作成して,まとめて分析するというやり方だと思う。
例えば,共分散構造分析を行うときに複数のモデルを立てて分析する,というような使いかたや,探索的因子分析を行うときに,因子数や回転方法を変えながら分析するという感じ。

確認的因子分析の例はこんな感じ。
このように書くメリットは,モデルの構築の部分の分析を分けられるから,記述がすっきりすることかと。

library("purr")
library("lavaan")

# lavaanの例を流用
model1<- ' visual  =~ x1 + x2 + x3
              textual =~ x4 + x5 + x6
speed   =~ x7 + x8 + x9 '

model2<- ' f1  =~ x1 + x2 + x3 + x4 + x5
          f2 =~ x6 + x7 + x8 + x9 '

model3<- ' f1  =~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 '

model4<- ' visual  =~ x1 + x2 + x3
              textual =~ x4 + x5 + x6
speed   =~ x7 + x8 + x9 
f1  =~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 
f1 ~~ 0* visual
f1 ~~ 0* textual
f1 ~~ 0* speed'

model5 <- ' visual  =~ x1 + x2 + x3
              textual =~ x4 + x5 + x6
speed   =~ x7 + x8 + x9 
f1 =~ visual +  textual +speed'

models <- list(model1,model2, model3, model4, model5)

# 推定できないモデルもあるが,とりあえずは気にしない。
fits <- purrr::map(models,~lavaan::cfa(., data=HolzingerSwineford1939))
fits %>% map(.,~summary(., fit.measures=TRUE))
fits %>% map(.,~lavaan::fitMeasures(.))

summary(fits[[1]])

sapply(fits,lavaan::fitMeasures)


psychパッケージのfa関数をつかって分析をおこなう。本来は因子数を予め決める必要があるが,ここでは,因子数を変える。さらに,回転方法も回転無し,直交回転,斜交回転の3種類に対して分析を行なってみる。それぞれの回転方法にたいして,1から7因子の場合を当てはめている。一応screeplotや平行分析からは5,6因子あたりが良さそう。推定方法は最尤推定を用いる。

library("purrr")
library("psych")
library("GPArotation")

# Big fiveの25項目
dat <- bfi[1:25]

# 因子数の確認。
scree(dat)
fa.parallel(dat)

# 関数をつくる関数を作成する。
myfa <-function(rotate){
    function(nf){
      fa(dat,nf,rotate=rotate,fm="ml")
    }
  }

rotate <- list("none", "varimax",  "promax")
nf <- c(1:7)
# 
results <- purrr::map(rotate,myfa) %>% map(.,~lapply(nf,function(x).(x))) %>% flatten()
# どんな出力があるのかを確認
names(results[[1]])

results %>% map(.,~.[c("RMSEA")])
results %>% map_df(.,~.[c("BIC","EBIC","TLI")])

指標的には因子数を増やすほどよい結果になっていますが,実際には解釈を考えたりしないといけないので,これだけでは決めがたいです。

とにかく,備忘録的なもの。

前回から随分間が空いているが,気にしない。
思ったらやってみるのが大事な気がする。

最近の困り

  1. 研究のオリジナリティが良くわからない。何を研究したら面白いのか全くわからない。
  2. 査読のコメントへの対応が困った。オリジナリティの主張の仕方,伝え方。
  3. というか,自分が何をやりたいのか,という話の気もする。
  4. 自分の進退をキチンと考えねばならない。
  5. 発表資料の作成がまるでできていない。

対処など

  1. 先生に相談を行うこと。アポイントメントを迅速にとること。
  2. コメントには,1つ1つ,何をやるべきかを冷静に受け止める。すぐに書けること,すぐには書けないこと,考えれば書けることなど,考える。困難は分割せよ。全体に関わることであっても,全体として考えるより,処理できるまで細かい単位に分割しまくる。そのために,自分のやることを書き出すこと。
  3. とりあえず,逃げ出すには早い。逃げるのはいつでもできる。頼れる人を頼れ。馬

鹿だと思われても気にするな。だって学生だし,と開き直れ。

  1. やれ。アウトラインを書いて,ポスターは簡単でもいい。発表出来るだけの材料をとにかく詰め込むこと。デザインやらなんやらは二の次。ただの文字芝居になってもいい。ポスターもわかりにくくてもいい。とにかくやるべし。

見ていたらが学部生みたいな困りも含まれていて,人間の成長には時間がかかるのだなぁと実感。
むやみにやるのもよくないけど,パニックになって何もやらないのはだめ。もっとだめ。

関連してみた記事のリンクをおいておく。
next49.hatenadiary.jp
next49.hatenadiary.jp
next49.hatenadiary.jp

キーボード

ノートパソコンで作業をしていると,そのノートパソコンに付属しているキーボードをそのまま使いがちです。

それはそれでいいのですが,外付けのキーボードを使ってみるとコレが意外といいもので,癖になります。

キーボードは文章を書くにしても,何かプログラムを書くにしても長く触れているものです。

この意味で,ストレスの少ないキーボードに変更することで作業それ自体のストレスも軽減するでしょう。

PC本体が変わっても,キーボードは使い慣れたものを使い続けたいものです。

個人的にはテンキーレスのRealforceが気に入っています。

高い買い物ではありましたがタイピングが気持ちよくて作業もはかどります。

マウスはまだ凝ったものを使っていないのですが,追々変えていきたいとは思っています。

 

東プレ NG01B0 REALFORCE91UBK

東プレ NG01B0 REALFORCE91UBK

 

 

お風呂。

何事も続けるのが大事ということですが,淡々と継続し続けるのも難しいものですよね。

本当にいまやっていることに飽きないで続けられればいいのですが,私は飽きっぽいので何かと続けることができません。

大事なことを続けるために大事かもしれないと最近思ったのは,どうやって休むか,ということです。

OnのためにOffがあるとも言えます。

どんな風に息を抜くか,休息をとるか,気分を変えるか,というのが大事な気がしています。

個人的には最近はきちんとお湯を張ってお風呂に入るのが重要な休息になっています。

肉体のメンテナンスと言う意味でもお風呂にはいるのがいいのかと感じているところです。

お風呂に入ると寝付きも良くなりますし,お酒のように次の日に響くようなこともありません。

この記事もお風呂あがりに書いていますが,リラックスするのにお風呂は最適だと思っています。

きちんと休んで元気になって,本業の方に集中しようと思う今日このごろです。