信頼性係数はα係数が使用されることが多いが、問題点が指摘されている。α係数は因子構造を無視して一次元性の検証をしているという点である。別の言い方をすると、各因子での真の得点が共通している(一元性)と仮定しているが、ほとんどのケースでは一元性は仮定できない。観測得点に対して真の値から等しく影響を与えていないとα係数は正常に機能しない。α係数は信頼性の下限であると言われることもある。
同族テストモデル
データ
IPIP-NEOデータを利用する。
library("psych") data(bfi) # IPIP-NEOデータ d1 <- bfi[1:5] # 因子分析に使用するのは1~5列目。Agreeableness 協調性・調和性のみ。 d1 <-na.omit(d1) # 欠損値のあるケースを削除
分析
パッケージの読み込み
library(lavaan) library(semTools)
モデルはすべての因子負荷に異なるラベルb1からb5をつける。Agreeableness協調性・調和性外向性(Agreea)を測定する各観測得点(変数)に対して,因子である協調性からの負荷はそれぞれ異なり得ることを意味している。
誤差分散のラベルしVe1からVe5である。こちらもすべて異なったラベルになる。意味も同じで、各測定の精度が同じでないことを表している。
:=
いう記号はモデル母数を使って、新たな推定対象を定義する際に使用する。ここでは,因子負荷と誤差分散を使って,信頼性係数を定義する。
モデル
model.con <- ' Agree =~ b1*A1 + b2*A2 + b3*A3 + b4*A4 + b5*A5 A1 ~~ Ve1 * A1 A2 ~~ Ve2 * A2 A3 ~~ Ve3 * A3 A4 ~~ Ve4 * A4 A5 ~~ Ve5 * A5 rho := ((b1+b2+b3+b4+b5)^2 / ((b1+b2+b3+b4+b5)^2 + (Ve1+Ve2+Ve3+Ve4+Ve5)) ) '
一応、モデルを図示しておこう。
実行
fit.con <- cfa(model.con, d1, std.lv=TRUE) summary(fit.con, fit.measures=TRUE, standardized=TRUE)
結果
Defined Parameters: Estimate Std.Err z-value P(>|z|) Std.lv Std.all rho 0.563 0.012 45.675 0.000 0.563 0.590
rhoは推定値0.563。標準誤差は0.012である。
fitMeasures(fit.con, c("chisq", "df", "cfi", "tli", "rmsea", "srmr", "aic"))
結果。
chisq df cfi tli rmsea srmr aic 86.696 5.000 0.968 0.935 0.078 0.032 43575.160
タウ等価モデル
この同族テストモデルでは、因子負荷のラベルb1からb5をつけた。一元性を仮定する場合、bという一つのラベルをつけることになる。そうすると、因子負荷聞に等値の制約が置かれることになって、タウ等価テストになる。タウ等価という前提は、因子分析ですべての変数に対する負荷が同じだという制約なので、実際に成り立ちにくい仮定である。
model.tau <- ' Agree =~ b*A1 + b*A2 + b*A3 + b*A4 + b*A5 A1 ~~ Ve1 * A1 A2 ~~ Ve2 * A2 A3 ~~ Ve3 * A3 A4 ~~ Ve4 * A4 A5 ~~ Ve5 * A5 rho := ((b+b+b+b+b)^2 / ((b+b+b+b+b)^2 + (Ve1+Ve2+Ve3+Ve4+Ve5)) ) ' fit.tau <- cfa(model.tau, d1, std.lv=TRUE) summary(fit.tau, fit.measures=TRUE, standardized=TRUE) fitMeasures(fit.tau, c("chisq", "df", "cfi", "tli", "rmsea", "srmr", "aic"))
結果。
Defined Parameters: Estimate Std.Err z-value P(>|z|) Std.lv Std.all rho 0.614 0.011 55.857 0.000 0.614 0.498 chisq df cfi tli rmsea srmr aic 1629.662 9.000 0.358 0.286 0.258 0.318 45110.126
平行テストモデル
タウ等価モデルに加えて、誤差分散も同じだというモデルが平行モデルである。この値はα係数と同じになる。
model.para <- ' Agree =~ b*A1 + b*A2 + b*A3 + b*A4 + b*A5 A1 ~~ Ve * A1 A2 ~~ Ve * A2 A3 ~~ Ve * A3 A4 ~~ Ve * A4 A5 ~~ Ve * A5 rho := ((b+b+b+b+b)^2 / ((b+b+b+b+b)^2 + (Ve+Ve+Ve+Ve+Ve)) ) ' fit.para <- cfa(model.para, d1, std.lv=TRUE) summary(fit.para, fit.measures=TRUE, standardized=TRUE) fitMeasures(fit.para, c("chisq", "df", "cfi", "tli", "rmsea", "srmr", "aic"))
結果。
Defined Parameters: Estimate Std.Err z-value P(>|z|) Std.lv Std.all rho 0.431 0.017 24.896 0.000 0.431 0.431 chisq df cfi tli rmsea srmr aic 2332.318 13.000 0.081 0.293 0.257 0.274 45804.7
まとめ
3つのモデルを比較しよう。
同族テストモデル
Defined Parameters: Estimate Std.Err z-value P(>|z|) Std.lv Std.all rho 0.563 0.012 45.675 0.000 0.563 0.590 chisq df cfi tli rmsea srmr aic 86.696 5.000 0.968 0.935 0.078 0.032 43575.160
タウ等価モデル
Defined Parameters: Estimate Std.Err z-value P(>|z|) Std.lv Std.all rho 0.614 0.011 55.857 0.000 0.614 0.498 chisq df cfi tli rmsea srmr aic 1629.662 9.000 0.358 0.286 0.258 0.318 45110.126
平行テストモデル
Defined Parameters: Estimate Std.Err z-value P(>|z|) Std.lv Std.all rho 0.431 0.017 24.896 0.000 0.431 0.431 chisq df cfi tli rmsea srmr aic 2332.318 13.000 0.081 0.293 0.257 0.274 45804.7
AICは同族<タウ等価<平行の順番である。
SRMRは同族のみ.05を下回っている。
RMSEAは同族<平行<タウ等価である。
CFI、TLIは同族のみ0.9を超えている。
rhoの値は平行<同族<タウ等価の順番だが、フィッティング指標から同族モデルが支持される。
信頼性係数rhoは0.563であり、標準誤差は0.012である。
reliability()を使う。
reliability(fit.con) reliability(fit.tau) reliability(fit.para)
reliability()を使うと同じ結果が得られる。
Agree alpha 0.4306169 omega 0.5634002 omega2 0.5634002 omega3 0.5587968 avevar 0.3393923 Agree alpha 0.4306169 omega 0.6143590 omega2 0.6143590 omega3 0.8586245 avevar 0.2416297 Agree alpha 0.4306169 omega 0.4306169 omega2 0.4306169 omega3 0.4306169 avevar 0.1313845
同族テストモデルの制約は手動でする必要はない。モデルをmodel <- ' Agree =~ A1 + A2 + A3 + A4 + A5'
と因子負荷、誤差分散ともにラベルをつけないシンプルなモデルを組んで、reliability()に入れると同族テストモデルの結果が出てくる。
制約を手動でつけるメリットはタウ等価モデル計算ができることと、信頼性係数の標準誤差がえられるところだろうか。
パス図
library(semPlot) semPaths(fit,layout="tree", whatLabels="stand",sizeMan=5, shapeLat="ellipse",sizeLat=12,sizeLat2=5, exoCov=F,residuals=F,nCharNodes=0, edge.label.cex=0.9,edge.color="black")