第11回(1月14日) Task Check and Weekly Assignment

IRTとカテゴリカルな因子分析

☆課題 psychパッケージに含まれるサンプルデータ,msq(動機づけ状態調査)から, ADAC(活性ー不活性度形容詞チェックリスト)部分を抜き出し,カテゴリカル因子分析を行い, 探索的な因子構造を確認した上で構造方程式モデリングで確認しなさい。 ADAC部分の抜き出しについては,下部のサンプルコードを用いてよい。 また,msqデータに含まれる他の変数を用いても良い。

回答者の反応が「正答・誤答」や「はい・いいえ」のような二値で得られた場合,一般的な(ピアソンの積率)相関係数を求めて分析をすることはできません。

そうしたデータの場合は,新しいテスト理論ともいわれる項目反応理論(Item Response Theory/Latent Trait Model)を用いて分析することになります。

パッケージはltmを使います。

# install.packages('ltm')
library(ltm)
## Loading required package: MASS
## Loading required package: msm
## Loading required package: mvtnorm
## Loading required package: polycor
## Loading required package: sfsmisc

パッケージに含まれるサンプルデータ,LSATを使って次のコードを実行してみましょう

data(LSAT)
result.1 <- rasch(LSAT)
result.1
## 
## Call:
## rasch(data = LSAT)
## 
## Coefficients:
## Dffclt.Item 1  Dffclt.Item 2  Dffclt.Item 3  Dffclt.Item 4  Dffclt.Item 5  
##        -3.615         -1.322         -0.318         -1.730         -2.780  
##        Dscrmn  
##         0.755  
## 
## Log.Lik: -2467
plot(result.1)

plot of chunk unnamed-chunk-2

分析結果は数値で見ることも可能ですが,plotを見た方がわかりやすいかもしれません。plot(result.1)で示されているのは,項目特性曲線と呼ばれるもので,横軸が回答者の潜在能力(因子得点),縦軸が正答(あるいは「はい」と答える)率を示しています。

項目によってはこの確率を表す関数が右や左にずれていますが,右にずれるとより正答しにくい(「はい」と答えにくい)困難な項目であることになります。この曲線の位置を決めるのが困難度母数と呼ばれるもので,数値出力の際にDifficult.XXXXで示された数字です。

この曲線を変換し,どの値のときにもっともその項目の判別力が高くなるかを示したのが項目情報曲線です。

plot(result.1, type = "IIC")

plot of chunk unnamed-chunk-3

各項目の項目情報曲線を累積し,テスト全体(ここでは5項目からなるテスト)での判別力を示すのがテスト情報曲線です。

plot(result.1, type = "IIC", items = 0)

plot of chunk unnamed-chunk-4

項目の特徴を示すのに,困難度母数だけでなく,曲線の傾きに該当する識別力(Discriminant parameter)を加えるモデルもあります。

result.2 <- ltm(LSAT ~ z1)
result.2
## 
## Call:
## ltm(formula = LSAT ~ z1)
## 
## Coefficients:
##         Dffclt  Dscrmn
## Item 1  -3.360   0.825
## Item 2  -1.370   0.723
## Item 3  -0.280   0.890
## Item 4  -1.866   0.689
## Item 5  -3.124   0.657
## 
## Log.Lik: -2467
plot(result.2)

plot of chunk unnamed-chunk-5

ここで示されているDscrmnが識別力母数と呼ばれるもので,プロットを見るとカーブの傾きが項目毎に異なっていることがわかります。二つの母数を推定するので,二母数モデルともよばれます。

二母数モデルでも,情報曲線を描くことが可能です。

plot(result.2, type = "IIC")

plot of chunk unnamed-chunk-6

plot(result.1, type = "IIC", items = 0)

plot of chunk unnamed-chunk-6

さらに「あて推量母数Guessing parameter」を加えた三母数モデルというのもあります。

result.3 <- tpm(LSAT)
result.3
## 
## Call:
## tpm(data = LSAT)
## 
## Coefficients:
##         Gussng  Dffclt  Dscrmn
## Item 1   0.037  -3.296   0.829
## Item 2   0.078  -1.145   0.760
## Item 3   0.012  -0.249   0.902
## Item 4   0.035  -1.766   0.701
## Item 5   0.053  -2.990   0.666
## 
## Log.Lik: -2467
plot(result.3)

plot of chunk unnamed-chunk-7

plot(result.3, type = "IIC")

plot of chunk unnamed-chunk-7

plot(result.3, type = "IIC", items = 0)

plot of chunk unnamed-chunk-7

数値出力のGussngで表示されているのがそれで,曲線全体が少し上にあがっているのが確認できます。

二値反応ではなく,数段階の反応で回答が得られる場合もあります。複数の順序的反応に対応した項目反応理論のモデルが,段階反応モデルです。

ltmパッケージに含まれるサンプルデータセット,Scienceの一部を使ってみてみましょう。この調査データは,四段階での反応が得られています。

data(Science)
head(Science)
##          Comfort       Environment           Work         Future
## 1 strongly agree    strongly agree strongly agree          agree
## 2          agree    strongly agree          agree          agree
## 3          agree          disagree       disagree       disagree
## 4          agree             agree       disagree       disagree
## 5          agree strongly disagree strongly agree strongly agree
## 6 strongly agree             agree strongly agree          agree
##       Technology       Industry           Benefit
## 1 strongly agree          agree          disagree
## 2          agree          agree             agree
## 3 strongly agree strongly agree             agree
## 4 strongly agree strongly agree             agree
## 5       disagree          agree strongly disagree
## 6          agree strongly agree             agree
result.g <- grm(Science[c(1, 3, 4, 7)])
result.g
## 
## Call:
## grm(data = Science[c(1, 3, 4, 7)])
## 
## Coefficients:
##          Extrmt1  Extrmt2  Extrmt3  Dscrmn
## Comfort   -4.672   -2.536    1.408   1.041
## Work      -2.385   -0.735    1.849   1.226
## Future    -2.281   -0.965    0.856   2.299
## Benefit   -3.060   -0.906    1.543   1.094
## 
## Log.Lik: -1609
plot(result.g)

plot of chunk unnamed-chunk-8 plot of chunk unnamed-chunk-8 plot of chunk unnamed-chunk-8 plot of chunk unnamed-chunk-8

プロットで表示されるのは,アイテムカテゴリ反応特性曲線Item Response Category Characteristiv Curveと呼ばれる者で,各段階への反応確率が示されています。また,段階反応モデルでも情報曲線を描くことが可能です。

plot(result.g, type = "IIC")

plot of chunk unnamed-chunk-9

plot(result.g, type = "IIC", items = 0)

plot of chunk unnamed-chunk-9

ところで,なぜデータの一部しか使わなかったのか気になった方がいるかもしれません。全てのデータを使うとどうなるのでしょうか。

result.g2 <- grm(Science)
result.g2
## 
## Call:
## grm(data = Science)
## 
## Coefficients:
##              Extrmt1  Extrmt2  Extrmt3  Dscrmn
## Comfort      -10.768   -5.645    3.097   0.411
## Environment   -2.154   -0.790    0.627   1.570
## Work          32.102    9.261  -24.402  -0.074
## Future       -30.602  -11.806   10.455   0.108
## Technology    -2.462   -0.885    0.642   1.650
## Industry      -2.870   -1.529    0.286   1.642
## Benefit      -21.232   -5.982   10.297   0.136
## 
## Log.Lik: -2998
plot(result.g2)

plot of chunk unnamed-chunk-10 plot of chunk unnamed-chunk-10 plot of chunk unnamed-chunk-10 plot of chunk unnamed-chunk-10 plot of chunk unnamed-chunk-10 plot of chunk unnamed-chunk-10 plot of chunk unnamed-chunk-10

識別母数に負の数があるものが現れました。また,ICCの形も極端になだらかなおかしなものが含まれています。

これは項目反応理論が一因子(想定する潜在能力は一種類)を仮定したモデルだからであり,Scienceデータは実は複数の因子からなるデータセットなのです。

このことを確認するために,四段階という段階的反応(順序尺度水準)に対応した因子分析,カテゴリカル因子分析をして確認してみます。

下準備として,元のデータセットが因子型で入っているので,これを数値型に戻します。

summary(Science)
##               Comfort               Environment                 Work    
##  strongly disagree:  5   strongly disagree: 29   strongly disagree: 33  
##  disagree         : 32   disagree         : 90   disagree         : 98  
##  agree            :266   agree            :145   agree            :206  
##  strongly agree   : 89   strongly agree   :128   strongly agree   : 55  
##                Future                Technology               Industry  
##  strongly disagree: 14   strongly disagree: 18   strongly disagree: 10  
##  disagree         : 72   disagree         : 91   disagree         : 47  
##  agree            :210   agree            :157   agree            :173  
##  strongly agree   : 96   strongly agree   :126   strongly agree   :162  
##               Benefit   
##  strongly disagree: 21  
##  disagree         :100  
##  agree            :193  
##  strongly agree   : 78
str(Science)
## 'data.frame':    392 obs. of  7 variables:
##  $ Comfort    : Factor w/ 4 levels "strongly disagree",..: 4 3 3 3 3 4 3 3 3 4 ...
##  $ Environment: Factor w/ 4 levels "strongly disagree",..: 4 4 2 3 1 3 2 2 3 3 ...
##  $ Work       : Factor w/ 4 levels "strongly disagree",..: 4 3 2 2 4 4 2 2 3 3 ...
##  $ Future     : Factor w/ 4 levels "strongly disagree",..: 3 3 2 2 4 3 3 3 4 3 ...
##  $ Technology : Factor w/ 4 levels "strongly disagree",..: 4 3 4 4 2 3 4 3 4 3 ...
##  $ Industry   : Factor w/ 4 levels "strongly disagree",..: 3 3 4 4 3 4 4 4 4 3 ...
##  $ Benefit    : Factor w/ 4 levels "strongly disagree",..: 2 3 3 3 1 3 4 4 2 3 ...
Science.c <- as.data.frame(data.matrix(Science))
str(Science.c)
## 'data.frame':    392 obs. of  7 variables:
##  $ Comfort    : int  4 3 3 3 3 4 3 3 3 4 ...
##  $ Environment: int  4 4 2 3 1 3 2 2 3 3 ...
##  $ Work       : int  4 3 2 2 4 4 2 2 3 3 ...
##  $ Future     : int  3 3 2 2 4 3 3 3 4 3 ...
##  $ Technology : int  4 3 4 4 2 3 4 3 4 3 ...
##  $ Industry   : int  3 3 4 4 3 4 4 4 4 3 ...
##  $ Benefit    : int  2 3 3 3 1 3 4 4 2 3 ...

psychパッケージのfa関数やfa.parallel関数には,カテゴリカルに対応したfa.poly関数やfa.parallel.poly関数が用意されています。これを使って分析すると,カテゴリカル因子分析を行うことになります。

ちなみに,polyは量的変数のピアソンの積率相関係数に対する,順序尺度水準の相関係数であるポリコリック相関係数の略です。

library(psych)
## 
## Attaching package: 'psych'
## 
##  以下のオブジェクトはマスクされています (from 'package:ltm') : 
## 
##      factor.scores 
## 
##  以下のオブジェクトはマスクされています (from 'package:polycor') : 
## 
##      polyserial
fa.parallel.poly(Science.c)
## 
## 
## 
## 
##  See the graphic output for a description of the results

plot of chunk unnamed-chunk-12

## Parallel analysis suggests that the number of factors =  3  and the number of components =  2
## Call: fa.parallel.poly(x = Science.c)
## Parallel analysis suggests that the number of factors =  3  and the number of components =  2 
## 
##  Eigen Values of 
##   Original factors Simulated data Original components simulated data
## 1             1.43           0.64                2.08           1.20
## 2             0.94           0.15                1.88           1.13
## 3             0.18           0.09                0.87           1.07
fa.result <- fa.poly(Science.c, 2, rotate = "promax")
print(fa.result, sort = T, digit = 3, cut = 0.3)
## Factor Analysis using method =  minres
## Call: fa.poly(x = Science.c, nfactors = 2, rotate = "promax")
## Standardized loadings (pattern matrix) based upon correlation matrix
##             item    MR1    MR2    h2    u2  com
## Future         4  0.757        0.569 0.431 1.21
## Work           3  0.558        0.318 0.682 1.02
## Benefit        7  0.529        0.282 0.718 1.13
## Comfort        1  0.495        0.284 0.716 1.00
## Technology     5         0.700 0.486 0.514 1.03
## Environment    2         0.660 0.432 0.568 1.07
## Industry       6         0.631 0.423 0.577 1.00
## 
##                         MR1   MR2
## SS loadings           1.430 1.366
## Proportion Var        0.204 0.195
## Cumulative Var        0.204 0.399
## Proportion Explained  0.511 0.489
## Cumulative Proportion 0.511 1.000
## 
##  With factor correlations of 
##       MR1   MR2
## MR1 1.000 0.084
## MR2 0.084 1.000
## 
## Mean item complexity =  1.1
## Test of the hypothesis that 2 factors are sufficient.
## 
## The degrees of freedom for the null model are  21  and the objective function was  1.248 with Chi Square of  484.1
## The degrees of freedom for the model are 8  and the objective function was  0.075 
## 
## The root mean square of the residuals (RMSR) is  0.041 
## The df corrected root mean square of the residuals is  0.094 
## 
## The harmonic number of observations is  392 with the empirical chi square  27.92  with prob <  0.000491 
## The total number of observations was  392  with MLE Chi Square =  28.99  with prob <  0.000319 
## 
## Tucker Lewis Index of factoring reliability =  0.8806
## RMSEA index =  0.0826  and the 90 % confidence intervals are  0.0511 0.1149
## BIC =  -18.78
## Fit based upon off diagonal values = 0.975
## Measures of factor score adequacy             
##                                                  MR1   MR2
## Correlation of scores with factors             0.847 0.843
## Multiple R square of scores with factors       0.717 0.711
## Minimum correlation of possible factor scores  0.434 0.422

探索的因子分析ではなく,確認的因子分析(=構造方程式モデリング)をする場合は,推定の際に順序尺度水準で測定された変数があることをオプションで指定します。

library(lavaan)
## This is lavaan 0.5-15
## lavaan is BETA software! Please report any bugs.
model <- "
fa1 =~ Future+Work+Benefit+Comfort
fa2 =~ Technology+Environment+Industry
fa1 ~~ 0 * fa2
"
result.cfa <- cfa(model, Science.c, ordered = c("Future", "Work", "Benefit", 
    "Comfort", "Technology", "Environment", "Industry"))
summary(result.cfa, standardized = T, fit.measures = T)
## lavaan (0.5-15) converged normally after  20 iterations
## 
##   Number of observations                           392
## 
##   Estimator                                       DWLS      Robust
##   Minimum Function Test Statistic               47.563      41.383
##   Degrees of freedom                                14          14
##   P-value (Chi-square)                           0.000       0.000
##   Scaling correction factor                                  1.254
##   Shift parameter                                            3.459
##     for simple second-order correction (Mplus variant)
## 
## Model test baseline model:
## 
##   Minimum Function Test Statistic              683.313     530.404
##   Degrees of freedom                                21          21
##   P-value                                        0.000       0.000
## 
## User model versus baseline model:
## 
##   Comparative Fit Index (CFI)                    0.949       0.946
##   Tucker-Lewis Index (TLI)                       0.924       0.919
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.078       0.071
##   90 Percent Confidence Interval          0.055  0.103       0.046  0.096
##   P-value RMSEA <= 0.05                          0.027       0.078
## 
## Parameter estimates:
## 
##   Information                                 Expected
##   Standard Errors                           Robust.sem
## 
##                    Estimate  Std.err  Z-value  P(>|z|)   Std.lv  Std.all
## Latent variables:
##   fa1 =~
##     Future            1.000                               0.777    0.777
##     Work              0.677    0.080    8.455    0.000    0.526    0.526
##     Benefit           0.683    0.084    8.161    0.000    0.531    0.531
##     Comfort           0.663    0.087    7.649    0.000    0.515    0.515
##   fa2 =~
##     Technology        1.000                               0.701    0.701
##     Environment       0.945    0.109    8.657    0.000    0.662    0.662
##     Industry          0.886    0.099    8.928    0.000    0.621    0.621
## 
## Covariances:
##   fa1 ~~
##     fa2               0.000                               0.000    0.000
## 
## Intercepts:
##     fa1               0.000                               0.000    0.000
##     fa2               0.000                               0.000    0.000
## 
## Thresholds:
##     Future|t1        -1.803    0.119  -15.091    0.000   -1.803   -1.803
##     Future|t2        -0.774    0.071  -10.937    0.000   -0.774   -0.774
##     Future|t3         0.691    0.069    9.981    0.000    0.691    0.691
##     Work|t1          -1.377    0.091  -15.155    0.000   -1.377   -1.377
##     Work|t2          -0.428    0.066   -6.536    0.000   -0.428   -0.428
##     Work|t3           1.079    0.079   13.693    0.000    1.079    1.079
##     Benefit|t1       -1.611    0.105  -15.415    0.000   -1.611   -1.611
##     Benefit|t2       -0.500    0.066   -7.531    0.000   -0.500   -0.500
##     Benefit|t3        0.845    0.072   11.685    0.000    0.845    0.845
##     Comfort|t1       -2.234    0.172  -12.960    0.000   -2.234   -2.234
##     Comfort|t2       -1.314    0.088  -14.952    0.000   -1.314   -1.314
##     Comfort|t3        0.749    0.070   10.652    0.000    0.749    0.749
##     Technology|t1    -1.686    0.110  -15.343    0.000   -1.686   -1.686
##     Technology|t2    -0.589    0.068   -8.715    0.000   -0.589   -0.589
##     Technology|t3     0.464    0.066    7.034    0.000    0.464    0.464
##     Environmnt|t1    -1.447    0.094  -15.311    0.000   -1.447   -1.447
##     Environmnt|t2    -0.514    0.067   -7.729    0.000   -0.514   -0.514
##     Environmnt|t3     0.450    0.066    6.835    0.000    0.450    0.450
##     Industry|t1      -1.951    0.134  -14.547    0.000   -1.951   -1.951
##     Industry|t2      -1.056    0.078  -13.531    0.000   -1.056   -1.056
##     Industry|t3       0.219    0.064    3.428    0.001    0.219    0.219
## 
## Variances:
##     Future            0.396                               0.396    0.396
##     Work              0.723                               0.723    0.723
##     Benefit           0.718                               0.718    0.718
##     Comfort           0.734                               0.734    0.734
##     Technology        0.509                               0.509    0.509
##     Environment       0.562                               0.562    0.562
##     Industry          0.615                               0.615    0.615
##     fa1               0.604    0.074                      1.000    1.000
##     fa2               0.491    0.067                      1.000    1.000

このように,反応段階に応じたモデリングが可能ですから,実際に自分で研究を計画する際は回答者が反応しやすい段階,回答方法を考えて,より丁寧にデータを取るように心がけましょう。

追伸) 本日の課題で用いるデータセットを作るには,次のコードを使用してください。

data(msq)
msq.sub <- subset(msq, select = c("active", "energetic", "vigorous", "wakeful", 
    "full.of.pep", "lively", "sleepy", "tired", "drowsy"))