はじめに

項目応答理論は基本的に2値データ (正解・不正解、はい・いいえ) の観測変数を目的変数、項目困難度・受験者能力という潜在変数を説明変数とした統計モデルでした。そのため、目的変数が複数となる場合 (0点・1点・2点、とてもそう思う・あまりそう思わない・どちらとも言えない・どちらかと言えばそう思う・とてもそう思う) のデータに対しては適用することができませんでした。また、これらはいずれも1つの構成概念を測定しているという前提 (一次元性) を有していました。そのため複数の構成概念をなしていると想定するアンケートや技能統合型テストについては分析できませんでした。また、項目数や受験者数が少ないデータに関してはノンパラメトリック分析を用いることが適切かもしれません。

ここでは2値のラッシュモデルを多値・順序データに拡張した段階反応モデル、一次元性が満たされていないと考えられる多次元データを扱う多次元IRT、ノンパラメトリックIRTであるモッケン尺度分析について紹介します。

段階反応モデル

順序データにおけるカットポイント

目的変数が順序データとなるテストの信頼性係数はクロンバックアルファやマクドナルドのオメガを使うよりも、一般化可能性理論におけるG係数やφ係数が適しています。

順序データを扱う順序ロジスティック回帰分析では、カットポイントや閾値と呼ばれる値が算出されます。例えば、5段階のリッカート尺度のアンケートでは、(1) 1と2の間、(2) 2と3の間、 (3) 3と4の間、(4) 4と5の間という4つのカットポイントが存在します。つまり、C個の段階があるとすると、カットポイントの数はC-1個存在すると考えられます。

右の図は「はい (2)・どちらでもない (1)・いいえ (0)」の3段階評価の閾値を表しています。これを見ると、1の値は−∞から$c_1$、2の値は$c_1$から$c_2$、3の値は$c_2$から∞を取ることが分かります。

閾値の概念を踏まえると、2値データの閾値は1つであると言えます。ラッシュモデルでは項目パラメータを推定する際、困難度bが1つあれば項目特徴曲線 (Item Characteristic Curve: ICC) をプロットすることができました。なお、ICCはx軸にθ、y軸に正解率をプロットしています。またICCでは、x軸とy軸の一致する位置は50%での正解率でした。

段階反応モデルでは、最下位の評価 (上記の例:いいえ (0)) を$u_j= 0$とすると、50%のICCは困難度$b_{j0}^$となります。一方、最上位の評価 (上記の例:はい (2)) を$u_j = C-1$とすると、50%のICCは困難度$b_{jC-1}^$となります。中間の値は隣接する困難度の平均とすれば良いため、上記の例 どちらでもない (1) は$(b_{jc}^* + b_{jC+1}^*)/2$となります。

Rでの実装

具体例で段階反応モデルについて見ていきましょう。今回はmirtパッケージとggmirtパッケージを使います。

# パッケージの読み込み
library(tidyverse)
library(mirt)
library(ggmirt)

# データの読み込み
data(SAT12)
head(SAT12)
str(SAT12)

分析で使用するデータは32項目に対して、600人が回答したデータとなります。1つの項目に対して、1から5と8で点数が与えられています。つまり、6つのカテゴリが存在し、カットポイントは5つであることが分かります。

mirtパッケージには古典的テスト理論における項目分析を行うitemstas関数が含まれています。こちらを使うと合計の平均点やそれぞれの項目におけるクロンバックのアルファ、各評定の割合などを一括で計算することができます。

itemstats(SAT12)
> str(SAT12)
'data.frame':	600 obs. of  32 variables:
$ Item.1 : int  1 3 1 2 2 1 1 2 5 5 ...
$ Item.2 : int  4 4 4 4 4 4 4 4 1 3 ...
$ Item.3 : int  5 2 5 4 5 3 5 1 2 4 ...
$ Item.4 : int  2 8 4 2 2 1 2 5 3 2 ...
$ Item.5 : int  3 3 3 3 3 3 2 3 2 3 ...
$ Item.6 : int  1 3 2 3 2 2 2 2 2 2 ...
$ Item.7 : int  2 2 2 2 2 2 2 2 4 4 ...
$ Item.8 : int  1 8 3 4 1 3 2 5 4 5 ...
$ Item.9 : int  3 3 3 3 1 3 3 3 4 3 ...
$ Item.10: int  1 1 2 2 2 1 1 1 2 1 ...
$ Item.11: int  2 2 2 2 2 2 2 2 2 2 ...
$ Item.12: int  4 8 1 4 4 3 4 5 4 4 ...
$ Item.13: int  2 2 3 2 2 2 2 1 1 2 ...
$ Item.14: int  1 1 1 1 1 1 1 1 3 1 ...
$ Item.15: int  5 5 5 5 5 5 5 5 5 3 ...
$ Item.16: int  3 2 5 2 4 5 5 3 5 3 ...
$ Item.17: int  4 4 4 4 4 4 4 4 4 4 ...
$ Item.18: int  4 1 1 1 5 4 2 1 5 2 ...
$ Item.19: int  1 1 3 3 1 1 1 1 1 1 ...
$ Item.20: int  4 4 4 4 4 4 4 4 3 4 ...
$ Item.21: int  3 3 3 3 3 3 3 3 3 3 ...
$ Item.22: int  3 3 3 1 3 3 3 3 3 3 ...
$ Item.23: int  4 8 1 5 3 4 3 4 1 1 ...
$ Item.24: int  1 1 1 2 1 1 1 1 2 5 ...
$ Item.25: int  3 8 3 5 1 1 5 2 1 2 ...
$ Item.26: int  5 4 4 4 5 4 5 5 4 1 ...
$ Item.27: int  1 1 1 1 1 1 1 1 1 1 ...
$ Item.28: int  3 4 3 3 3 4 3 4 4 4 ...
$ Item.29: int  1 5 4 4 1 2 3 1 5 5 ...
$ Item.30: int  5 8 4 2 2 3 1 5 5 3 ...
$ Item.31: int  4 4 4 4 4 4 4 4 1 5 ...
$ Item.32: int  5 8 1 2 1 3 3 1 4 2 …

データを読み込んだら段階反応モデルをmirt()関数によって実装してみましょう。mirt()関数は一つ目の引数にデータ、2つ目の引数に想定される次元数、itemtypeで分析の種類を指定します。itemtypeはデフォルトでは一次元性を仮定する2値ラッシュモデルとなります。今回は一次元性が保たれている段階反応モデル (graded) を実行しています。

# モデルの作成
fit_1 <- mirt(SAT12, 1, itemtype = 'graded', SE = T)

まずはモデルの適合度指標 (M2-based root mean square error of approximation) を確認しておきましょう。M2()関数を使うとモデルの適合度が計算されます。RMSEA ≦ .06およびSRMSR ≦ .08の基準に基づくと、モデルは十分に適合していることが分かります。なお、type = の引数はM2、M2*、C2から選択することができます。

> M2(fit_1, type = "C2", calcNULL = F)
       M2  df            p      RMSEA    RMSEA_5   RMSEA_95      SRMSR       TLI       CFI
stats 720.6588 464 1.969536e-13 0.03038825 0.02597839 0.03460478 0.05053491 0.7302877 0.7476885

続いてはitemfit()関数を用いて項目ごとのfitを見ていきます。S-X2のRMSEAは0.06以下の項目が適合していると判断されます。今回はいずれの項目もフィットしていることが分かります。個々の項目をプロットする際には引数にS_X2.plotを使って項目数を入力します。

> mirt::itemfit(fit_1)
      item    S_X2 df.S_X2 RMSEA.S_X2 p.S_X2
1   Item.1  85.048      72      0.017  0.139
2   Item.2  79.236      65      0.019  0.110
3   Item.3  84.226      94      0.000  0.755
4   Item.4 110.597      89      0.020  0.060
5   Item.5  87.275      81      0.011  0.297
6   Item.6  74.118      67      0.013  0.257
7   Item.7  23.935      27      0.000  0.634
8   Item.8 111.908      91      0.020  0.068
9   Item.9  21.547      28      0.000  0.802
10 Item.10  88.251      75      0.017  0.141
11 Item.11   4.375       2      0.045  0.112
12 Item.12 116.365      87      0.024  0.019
13 Item.13  54.802      65      0.000  0.812
14 Item.14  60.592      46      0.023  0.073
15 Item.15  63.809      51      0.020  0.107
16 Item.16  83.856      88      0.000  0.605
17 Item.17  13.157       5      0.052  0.022
18 Item.18  78.099      79      0.000  0.508
19 Item.19  54.518      48      0.015  0.241
20 Item.20  31.329      21      0.029  0.068
21 Item.21  10.575      18      0.000  0.912
22 Item.22  20.908      17      0.020  0.230
23 Item.23  81.264      90      0.000  0.733
24 Item.24  57.650      56      0.007  0.414
25 Item.25  97.622      86      0.015  0.184
26 Item.26  78.286      57      0.025  0.032
27 Item.27  40.603      32      0.021  0.142
28 Item.28  45.492      53      0.000  0.758
29 Item.29 117.574      90      0.023  0.027
30 Item.30  97.483      88      0.013  0.229
31 Item.31  43.809      42      0.008  0.395
32 Item.32  94.650      85      0.014  0.222
mirt::itemfit(fit_1, S_X2.plot = 1)

Untitled

x軸に合計点、y軸に選択された割合がプロットされています。cat1の青い予測値のプロットを見ると、合計点が低い場合には高く、合計点が高くなるにつれて減少していくことが分かります。一方、cat4は合計点が高くなるにつれて増加していきます。つまり、item1に関しては、合計点が高い人は4点を取る傾向があると考えられます。