井出草平の研究ノート

同族テストモデル・タウ等価モデル・平行テストモデル[R]

信頼性係数はα係数が使用されることが多いが、問題点が指摘されている。α係数は因子構造を無視して一次元性の検証をしているという点である。別の言い方をすると、各因子での真の得点が共通している(一元性)と仮定しているが、ほとんどのケースでは一元性は仮定できない。観測得点に対して真の値から等しく影響を与えていないとα係数は正常に機能しない。α係数は信頼性の下限であると言われることもある。

同族テストモデル

データ

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である。こちらもすべて異なったラベルになる。意味も同じで、各測定の精度が同じでないことを表している。

:=いう記号はモデル母数を使って、新たな推定対象を定義する際に使用する。ここでは,因子負荷と誤差分散を使って,信頼性係数 \rhoを定義する。

モデル

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)) )
'

一応、モデルを図示しておこう。

f:id:iDES:20200927132530p:plain

実行

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")