共分散構造分析(lavaan)

##############共分散構造分析(lavaan)############################

コード概要
モデル名<-
#測定変数の指定(=~を使う)
潜在変数名1=~観測変数1+観測変数2+・・・・・
潜在変数名2=~観測変数1+観測変数2+・・・・・
#回帰式(~を使う)
従属変数名1~説明変数1+説明変数2+・・・
従属変数名2~説明変数1+説明変数2+・・・
#分散、共分散(~~を使う)
変数名i~~変数名i #分散
変数名j~~変数名k #共分散

モデル部分はシングルカンマ(')でくくる
すべての変数の分散を推定する場合は分散の指定は省力できる

パラメタ値の推定
lavaanオブジェクト名<-sem(モデル名,data=データ名)
または
lavaanオブジェクト名<-lavaan(モデル名,data=データ名,model.type="sem",
   auto.var=TRUE,auto.fix.first=TRUE, auto.cov.lv.x=FALSE,auto.cov.y=FALSE)
#auto.var=TRUE      :すべての変数の分散または残差分散を推定する
#auto.fix.first=TRUE:非標準化解において測定変数のうち最初の1つのパス係数を1に固定する
#auto.cov.lv.x=FALSE:潜在変数間の共分散を自動的には推定しない
#auto.cov.y=FALSE   :従属変数の残差間の共分散を自動的には推定しない
#int.ov.free 観測変数の切片を自由にするか(FALSEなら0に固定)
#int.lv.free 潜在変数の切片を自由にするか(FALSEなら0に固定)

summary(lavaanオブジェクト名,fit.measures=TRUE,standardized=TRUE)
#出力オプション
fit.measures:適合度指標
modindices:修正指標
standardized=TRUE:論理値。標準化されたパラメータ値を出力に加える。Parameter Estimates:以下の表に、Std.lv(潜在変数だけが標準化されている)、Std.all(潜在変数と観測変数が標準化されている。確認的因子分析ではこれを見ましょう)の2列を追加する。

#確認的因子分析
確認的因子分析の場合は出力の際にcfa関数を使用するといいでしょう。(下記参照)
オブジェクト名 <- cfa(モデル名,data=データ名)
使用例
cfa1 <- cfa(model1, data= d0)
summary(cfa1)
inspect(cfa1, "fit”) #適合度の確認
inspect(cfa1, "modindices”) #修正指標の出力

#オプションについて
orthogonal=TRUE:CFAモデル内の潜在変数の全ての共分散が直行するように制約する(共分散を0に固定する)。
std.lv=TRUE:CFAモデル内の全ての潜在変数の分散を1に固定する。なおこの指定を行った場合、各潜在変数の第1指標の因子負荷量は1に固定されない(=自由母数となる)

#cfa関数とは
lavaan::cfa() は確認的因子分析を実行する関数である。正確にはモデル式の全てをコントロール可能な低レベル関数であるlavaan:lavaan()のいくつかのパラメータを、通常の確認的因子分析で使用されるものに自動設定して使い勝手を高めたラッパー関数である。
cfa()では裏方で以下の設定を自動で行う。
  1. 潜在変数の最初の指標の因子負荷量を1に固定する(潜在変数のスケールを固定するため)
  2. 残差分散を加える
  3. 全ての外生的な潜在変数に相関を持たせる
#関数の使い分けに関して
lavaan::lavaan() cfa(),sem(),growth()の土台となる低レベル関数
lavaan::sem() 共分散方程式モデルをあてはめる
lavaan()は低レベル関数なので、出力時に各種詳細設定が必要です。




使用例(lavaan)
lavaan.data<-xn[,c("a1","a3","b16","b19","b15","b14","b13","b17",
                   "b18","b4","b5","b1","b2","b7","b6","b3",
                   "b52","b48","b53","b50","b51","b49",
                   "b44","b43","b46","b45","b41","b42","b24","b26","b20")]

lavaan.data<-data.frame(lavaan.data)

head(lavaan.data)

model.1<-'
#因子を設定
f1=~b16+b19+b15+b14+b13+b17+b18
f2=~b4+b5+b1+b2+b7+b6+b3
f3=~b52+b48+b53+b50+b51+b49
f4=~b44+b43+b46+b45+b41+b42
f5=~b24+b26+b20
f6=~a1
f7=~a3
#回帰式
f6~f1+f2+f3+f4+f5
f1~f7
f2~f7
#分散、共分散
'
lavaan.1<-sem(model.1,data=lavaan.data
              #または
              lavaan.1<-lavaan(model.1,data=lavaan.data,model.type="sem",
                               auto.var=TRUE,auto.fix.first=TRUE, auto.cov.lv.x=TRUE,auto.cov.y=FALSE)

              summary(lavaan.1,fit.measures=TRUE,standardized=TRUE)


#交互作用項の作成
install.packages("semTools")
library(semTools)

data_sete <- indProd(data,
var1 = c("p_24","p_14","p_29","p_06"),
var2 = c("img_02","img_06","img_04","img_08"))

indProd(data_sete,var1,var2=NULL,match=TRUE,meanC=TRUE,residualC = TRUE,doubleMC = TRUE)

int.model<-'
f1=~p_08 + p_06 + p_29 + p_14 + p_24
f2=~img_08 + img_04 + img_06 + img_02
f12=~p_08.img_08 + p_06.img_04+p_14.img_06+p_24.img_02
f3=~a01+a02+a03+a04

f3~ f1 + f1 + f12
'


# パス図の描画
library(semPlot)
semPaths(cfa1, "par") # ほとんどデフォルトの図(下の最初の図)
semPaths(cfa1, "par", style="lisrel", # LISREL型の図(下の二番目の図)
mar=c(6,1,3,1), # 余白の指定、下、左、上、右の順
edge.label.cex=.8, # 矢印の係数の文字の大きさ
fade=F, # デフォルトでは係数の大きさに比例して、係数や矢印の色が薄くなるので、色の濃さを均一に指定
gray=T) # モノクロにしたいときに指定

結果の見方
適合度
Comparative Fit Index (CFI)比較適合度指標
    0から1の間の値を取り、数値が大きい方が適合度が高いと考えます。0.95以上あればよいモデルだと判断されます。
    1に近いほど良い。0.90以上が及第点、0.95以上が合格点。
Tucker-Lewis Index (TLI) Tucker–Lewis 指標
    CFI同様に、1に近い方がよいと判断できる数値ですが、1以上の値をとる場合もあります。
Akaike (AIC)赤池情報量基準(Akaikes Information Criterion)
    ・モデルを比較する場合の相対的評価基準です。比較した中で数値が小さい方がよいモデルと判断します。
    「説明力」と「安定性」を統合的な立場から評価する。
    最尤推定法によって母数を推定した「統計モデルの良さ」を図る指標
    小さいほどデータに対する当てはまりがいい。
    複数のモデルを比較する際の、モデルの相対的な良さを評価するための指標
Bayesian (BIC) ベイジアン情報量基準&Sample-size adjusted Bayesian (BIC) サンプルサイズ調整済みベイジアン情報量基準
    AIC同様、相対的な比較基準で、最も値の小さなモデルがよいモデルと判断されます。
    相対評価。より低いモデルがいいモデル。
RMSEARoot Mean Square Error of Approximation)平均二乗誤差平方根
    ・一般に0.05以下であればあてはまりがよく、0.1を超えるとあてはまりが悪いと判断されます。
    0に近いほど良い。0.10以下が及第点、0.05以下が合格点。
SRMRStandardized Root Mean Square Residual)標準化残差平均平方
    ・下限が0で、0に近いほどあてはまりがよいと判断します。
GFI(Goodness-of-fit index)
    ・1に近いほど良い。0.90以上が及第点、0.95以上が合格点。
AGFI(Adjusted goodness-of-fit index)
    GFIとの差が大きい時はパラメータを減らした方がいい。

Regressions : 構造方程式の係数
Covariances : 共分散に関する推定結果
Intercepts : 切片パラメータ
Variances : 分散の推定結果
R-Square : 重相関係数の平方(決定係数R2
Estimate : 推定値
S.E : 標準誤差
EST./S.R z : 1.96以上で5%有意


サンプルに関して
標本数は少なくとも100、可能であれば200以上を確保する必要がある。(平井, 2012, p.210)
標本数が小さいときには、
1.最尤法を用いること (∵正規性が頑健)
2.複雑なモデルの構築を避けること、 に留意するべき。
なお一度に多くの標本数を得られない場合は、質問紙調査を何回かに分けて実施し、多母集団分析を行う。(豊田, 2006, p.60)
(cf. 多母集団分析:測定状況の異なる母集団間の等質/異質性を検討する分析)

エラー




  • 用いる観測変数に対して、サインプル数が少ないとエラーが出るようです。
  • 1因子を観測変数2項目以下で指定すると、エラーが出ます。分散を固定するなどの解決法があるようですが、betterな解決法はまだわかりません。
  • 推定値は少なくなった方が良いようなので、複雑なモデルや観測変数が多いモデルの場合は、観測変数をくっつけて因子の指定をすると良いようです。どのように観測変数をくっつけるかはまだ方法が確立されていないので、自由にやるみたいです。ただ、変に観測変数をくっつけると適合度が下がることもあるようなので、注意が必要です。また、観測変数をくっつけすぎて1因子あたり2項目以下になるとまた問題なので、適度にしておきましょう。
  • lavaanだけでなく、semlibraryすると競合してしまうことがあるようなので、lavaanしか使わない人はsemlibraryしないようにしましょう。

コメント

このブログの人気の投稿

subsetで必要なデータだけを、取り出す。

Googleフォームの使い方(基本編)

Rでの、データの基礎統計量の算出(summary,describe)

Googleフォーム使い方(応用編) 回答に応じて分岐、セッションの移動

Googleフォームの使い方(応用編) 設定の使い方