library(DT)
library(glpkAPI)
library(irt)
library(irtoys)
library(ltm)
library(plink)
library(plyr)
library(psych)
library(reactable)
library(tidyverse)
項目反応理論がめざすもの
・「問題の良し悪し」を評価することで
→ 「回答者の潜在的な能力」をより良く測定する
psychometrics
)を軸に体系化されてきた項目パラメータ | 記号 | 説明 |
識別力(Discrimination) | a | 潜在特性値θに対する反応の鋭さ(ICC の傾き) |
困難度(Difficulty) | b | 項目に正答するために必要な能力水準(ICC の中央) |
item characteristice curve: ICC
)○問題の難易度が同じなら・・・
・受験者の能力が低いほど、正解の確率は低い
・受験者の能力が高いど、正解の確率は高い
困難度(Difficulty Parameter)
→ ICCの曲線が横軸上のどの位置で50%の正答率を持つかを見ることで、その問題の難しさを判断できる
識別力(Discrimination Parameter)
→ 曲線の傾きが大きいほど、能力の低い受験者と高い受験者をうまく区別できる項目であることがわかる
項目反応理論の特徴
・異なる問題から構成されるテスト結果を互いに比較できる
・異なる集団で得られたテスト結果を互いに比較できる
項目反応理論の利点
Computer-adaptive Testing: CAT
) ができる問題と回答者のマトリックスに正解=1、誤答=0のパターンを作る
そのパターンに最も近くなるロジスティック曲線を問題の数だけ当てはめる
その際、確率的に最もありそうな基準(=尤度(ゆうど))を使う
→ 尤度(ゆうど)に関しては後で解説
受験者の能力と、問題の難易度も推定可能
→ 良問と悪問題が区別できる
item bank
) を作る→ 受験者の解答結果しだいで出題問題を変える
→ 受験者の能力を推定する上で最も適切な問題を出題できる
→ 少ない問題・少ない時間で、受験者の能力を推定できる
○主な方法:
1. テスト得点との相関分析
2. 注意係数の算出
3. 項目反応理論の適用
古典的テスト理論 (classical test theory)
が直面する2つの問題 ・標本依存性 (sample
dependence) の問題
・項目依存性 (item dependence)
の問題
・受験者集団の能力が異なるから
→ テストの困難度の評価が、そのテストを受けたサンプル(集団)のレベルに依存する
・受験者集団のレベルが高い → 個々の受験者のテスト得点が高い → 集団全体の平均点が高い
・受験者集団のレベルが低い → 個々の受験者のテスト得点が低い → 集団全体の平均点が低い
解決策
・問題の困難度(難しさ)が異なるから
もし、去年と今年の問題が同一なら → 去年より20点学力が伸びた
しかし、今年より去年の問題の方が難しいなら
→ 今年のテストの平均点より、去年のテストの平均点は低い
→ 平均値が低い去年の生徒の方が学力が高い可能性がある
このことをテスト得点の項目依存性という
→ 異なるテストを比較することができない
受験者のテスト得点は、テスト個々の問題(=項目)の困難度によっても影響を受ける
解決策
例:2PLモデルでそれぞれの項目に対して識別力a、困難度bを推定
まとめ
テストの素点を偏差値に換算したとしても、次のような場合、受験者の能力を正しく比較できない:
(1)
学校ごとの受験者集団の能力が異なる
(2)
異なる試験時期のため問題の困難度(難しさ)が異なる
古典的テスト理論 | 項目反応理論 |
---|---|
素点 | 潜在特性値 \(θ\)(シータ)= 受験者の能力 |
偏差値 | 項目特性(問題の困難度・識別力) |
項目特性と受験者の能力が交絡 | 項目特性と受験者の能力を別々に表現できる |
→ 困難度と受験者の能力を区別できない | |
仮定 | 内容 |
---|---|
1. 局所独立性 | 項目同士に余計な関連性がないという仮定 |
2. 正答確率の単調増加性 | 問題の難易度が適切であるという |
3. データの適合度 | 項目反応モデルにデータが適合しているという仮定 |
局所独立性が成立している場合:
局所独立性が破られている場合:
確率 | これから起きることの可能性の大きさ |
尤度 | 既に起きたことに対して、その背後にある可能性の大きさ |
\[\frac{3}{5} × \frac{2}{5} × \frac{3}{5} = \frac{18}{125}\]
ポイント ・「局所独立の仮定」はIRTを使う際の大前提
・この仮定が満たされなければ、IRTで得点を算出すること自体が無意味になる
Fill in the blank with the correct form:
He ___ his homework before dinner every day
A. do
B. does
C. doing
D. done
問題1と問題2はともに、三人称単数の現在形の動詞の形(主語一致)を問うており、同一の文法知識に依存している
→ 問題1で正答した受験者は、問題2でも正答 (B) する可能性が高い
→ これは単に能力θによる説明ではなく、2つの項目間の内容的な関連性(共通のスキルへの依存)によるもの
→ ここでは、項目間に条件付き依存(conditional
dependence)が生じており、局所独立の仮定が破られている
このような結果が得られるためには、もともと袋の中に赤玉と白玉、それぞれ何個ずつ入っていた可能性が最も高いか?
玉の個数 | 尤度 |
赤1個、白4個の場合 | \(\frac{1}{5}×\frac{4}{5}×\frac{1}{5}= \frac{4}{125}\) |
赤2個、白3個の場合 | \(\frac{2}{5}×\frac{3}{5}×\frac{2}{5}= \frac{12}{125}\) |
赤3個、白2個の場合 | \(\frac{3}{5}×\frac{2}{5}×\frac{3}{5}= \frac{18}{125}\) |
赤4個、白1個の場合 | \(\frac{4}{5}×\frac{1}{5}×\frac{4}{5}= \frac{16}{125}\) |
ポイント ・IRT分析では最尤推定法(MLE)という推定法を採用している
・MLE: Maximum Likelihood Estimation
・例えば、ある生徒が「項目1に正答、項目2に誤答,項目3に正答」だった場合
→ 袋の事例では「1回目が赤色、2回目が白色、3回目が赤色」
・試験結果はわかっている(=袋から引いた玉の色はわかっている)
・この時、この生徒の学力θを推定する(=玉が入っていた袋の中にある赤と白の玉の色を推定する)
・袋の中にある玉の色は見えない
・生徒の学力θも見えない
・IRTではこのように生徒の学力θを推定する
IRTの最尤推定:玉の例にたとえると
・観測されたデータ:「赤・白・赤」
・仮定されたパラメータ:袋の中の赤・白の組み合わせ(例:赤1白4, 赤2白3,
赤3白2, 赤4白1)
・それぞれの仮説(パラメータ)で「その観測が起きる確率(尤度)」を計算
👉 最も高い尤度をもたらしたパラメータ(玉の組み合わせ)を採用
・つまり:
あるパラメータの候補セットの中で、観測されたデータを最もよく説明できるものを選ぶ
monotonicity
) とはmonotonicity
) が重要な理由:適合度のレベル | 概要 | 主な方法 |
全体モデル | モデル全体がデータに合っているか | AIC, BIC, M2, RMSEA |
項目ごと | 各項目がモデルと矛盾していないか | 残差分析、S-X²検定、infit/outfit |
個人ごと | 受験者がモデルに従って回答しているか | person-fit統計量(l_zなど) |
採点基準 | テスト実施者の考え方が入っても良い |
採点 | 主観が入ってはだめ |
採点基準にはテスト実施者の考え方が入っても良い
→ どの選択肢を「正答」とするか、どれの部分点を与えるか、どれを「誤答」とするか等などテスト実施者が決める
採点では、テスト実施者の主観が入ってはいけない
→ 決められた基準に照らして行う
→ 誰が、いつ、どこで採点しても同じ採点結果にならなくてはならない
→ 採点によって得られるのが「得点」
1. 正答数得点 | 正答した問題の数 |
2. 重み付き正答数得点 | 個々の問題の採点結果に対する配点を合計 |
3. 標準化(Z値)・偏差値 | 同一集団における相対的な位置を数値で表せる |
個々の問題に対して、どのように重み付け(=配点)するかが決定的に重要
配点の付け方によって、受験者の合計得点が変わることがあるから
個々の問題の配点を「合理的で客観的な根拠に基づいて」配点配分するのは困難
問題を難しい順(あるいは簡単な順)に並べるのは容易ではない
合理的な配点の決め方はない
配点が妥当かどうかを十分に検証することもできない
例えば、100点満点で90点得点したとする
これは、正答した問題に対する配点の合計
採点が基準どおりに行われ、得点の合計も正確に行われたとしても
→ 個々の問題の配点は「合理的で客観的な根拠に基づいて」決められていない
→ この問題の配点には「おそらく90点くらいでいいのではないか」という「あいまいさ」の要素が混じっている
もし、この「あいまいさ」の程度が客観的にわかれば
→ それを踏まえて、テストの得点を解釈すれば良い
1.
問題が異なるテストの場合、正答数得点や重み付き正答数得点を比較できない
2.
正答数得点では、出題された問題の難易度や重要度が得点に反映されない
3.
重み付け正答数得点のばあい、合理的で客観的な配点の決め方が不明確
4. 異なる集団から得られた偏差値は比較できない
従来のテスト得点の問題点に関して
問題が異なるテストの場合、正答数得点や重み付き正答数得点を比較できない
→ 問題が異なるテストでも、テストの点数を相互に比較できる
(ただし「局所独立の仮定」と「テストの1次元性条件」を満たす必要あり)
正答数得点では、出題された問題の難易度や重要度が得点に反映されない
→ 問題の難易度を合理的な方法で分析し数値化できる
(問題の「難易度」がわかる)
→ 学力の違いによって、正誤にどれだけの差があるかわかる
(問題の「重要度」がわかる)
重み付け正答数得点のばあい、合理的で客観的な配点の決め方が不明確
→ IRT分析では、事前でも事後でも配点を決める必要はない
→ IRT分析では配点に代わるパラメータを使う
異なる集団から得られた偏差値は比較できない
→ 異なる集団から得られた結果も比較できる
項目反応理論の特徴
・異なる問題から構成されるテスト結果を互いに比較できる
・異なる集団で得られたテスト結果を互いに比較できる
IRT で使うデータの構造
→ どんなにやさしい問題に正答できても「学力θ」の値は高いとはいえない
→ どれくらい難しい問題にに正答できたか → 学力θが高いと判断される(=推定される)
学力テストの場合・・・項目の難しさを決めるもの=正答率
しかし、正答率を使うと、同じ項目でもテストを受験する集団のレベルが異なると
→ 正答率が変わる
・レベルが高い集団なら → 正答率は上がる(=その問題はやさしいとみなされる)
・レベルが低い集団なら → 正答率は下がる(=その問題は難しいとみなされる)
しかし、視力検査ではガットマンスケールを使って「輪の大きさ」に対応する視力をあらかじめ決めている
分析方法 | 項目の困難度を測る手がかり |
・視力検査 | 輪の大きさ(ガットマンスケール) |
・IRT | 項目特性 |
学力θの違いに応じた、その項目に正答できる確率
Item Characteristic Curve,ICC
)・横軸・・・学力θ(潜在特性値)
・縦軸・・・正答確率(0 〜 1)
・学力θが低い受験者 → 正答確率が緩やかに上昇している
・学力θが中程度の受験者 → 正答確率が急に上昇している
→ 傾きが最大 → 学力θが1単位上昇したときに正答する確率(=識別力)が最も大きい
・学力θが高い受験者 → 正答確率が緩やかに上昇している
項目特性は、テストを実施した結果を IRT 分析することで得られる
分析によって得られた項目特性は、個々の項目固有のもの
→ 項目ごとに項目特性曲線の形は異なる
IRT 分析では様々なモデルが使われるが、ここでは最も良く使われる 2
パラメータ・ロジスティック・モデルを紹介する
2
パラメータ・ロジスティック・モデルの項目特性曲線の形は、項目の「困難度」と「識別力」によって決まる
2 つのパラメータによって項目特性曲線の形が決まる
→ 2 パラメータ・ロジスティック・モデルと呼ばれる
「困難度」と「識別力」= 項目パラメータ
表記 | 詳細 |
---|---|
\(P(\theta)\) | 能力θを持つ受験者が、ある項目に正答する確率 |
\(\theta\) | 受験者の能力で、平均0・標準偏差1の正規分布に従うと仮定 |
\(a\) | 識別力(discrimination )パラメータ |
\(b\) | 困難度(difficulty )パラメータ=位置パラメータ |
\(j\) | 項目の番号 |
推奨される困難度 b の範囲 | −3 〜 3 |
最も推定が安定する b の範囲 | −2 〜 2 |
適切な困難力 b の大きさ
−3 〜 3
(出典:芝祐順編『項目反応理論』p.34)
識別力のポイント
・識別力は、学力θの差によって正答者と誤答者をどのくらい敏感にみわけられるか(=識別できる)を判断する基準
・ただし、学力θが困難度 = 0 付近のばあいに限られる
適切な識別力 a の大きさ
0.3 〜
2.0
(出典:芝祐順編『項目反応理論』p.34)
IRTで学力を推定するための方法
・学力が平均値 0、標準偏差が 1
で分布していると仮定
・その学力を、原点が0で、−3 〜 3
まで目盛りのついた「ものさし」で測定する
ltmパッケージ
の中に入っているデータを使う
• The Law School Admission Test
への解答結果を採点
受験者数: 1000人
項目数:Section IVに含まれる5項目
正答なら1、誤答なら0
変数名 | 詳細 |
---|---|
ID | 受験者のID |
Item1 | 1番目の項目への解答結果 (0 or 1) |
Item2 | 2番目の項目への解答結果 (0 or 1) |
Item3 | 3番目の項目への解答結果 (0 or 1) |
Item4 | 4番目の項目への解答結果 (0 or 1) |
Item5 | 5番目の項目への解答結果 (0 or 1) |
SS | Item1-5の合計点 |
class | 素点に基づく受験者のクラス分け |
•class: 1〜5で表され、値が高くなるほど素点の高いクラス
- このデータをIRTに基づき分析し、項目やテストの特性を評価する -
分析で使うパッケージを読み込む
LSAT
が含む変数名を確認する[1] "Item 1" "Item 2" "Item 3" "Item 4" "Item 5"
Item 1
を item1
に変更する(変数名から半角スペースを削除)LSAT <- LSAT |>
rename("item1" = "Item 1",
"item2" = "Item 2",
"item3" = "Item 3",
"item4" = "Item 4",
"item5" = "Item 5")
item1
から item5
までの合計点を表す変数
total
を作る目的 | 適した分析 |
項目の難易度や識別力を検討したい | ltm() と ICCプロット |
テストの範囲(θ空間)での有効性を評価したい | ICC や テスト情報関数(TIF)分析 |
個人に能力スコアをつけたい | mlebme() や factor.scores() |
irtoysパッケージ
を使うpsychパッケージ
を使うmlebme
パッケージを使う分析方法 | 使用パッケージ::関数 | 分析内容 |
1. 正答率の計算 | colMeans() | 各項目の難易度を平均正答率で把握 |
2. I-T相関の計算 | cor() | 項目が全体スコアと一致するか(弁別力の目安)を確認 |
3. 1次元性の検討 | psych::fa.parallel() | 全項目が1つの潜在特性で測れているかを確認 |
4. 項目パラメーターの推定 | irtoys::est() | 項目ごとの「識別力a」「困難度b」を数値として推定 |
5. 項目特性曲線 (ICC) | irtoys::irf() | 能力θに対する項目の正答確率の変化を可視化 |
6. 潜在特性値の推定(項目側) | ltm::ltm() | 「項目側」のθ推定(モデルのフィット、aとbの推定) |
7. テスト情報曲線 (TIC) | irtoys::tif() | このテストはどの能力レベルを正確に測れているか? |
8. 局所独立性の検討 | irtoys::irf(), base::cor() | 項目間に余分な依存関係がないか(モデルの前提違反)を検討 |
9. 項目適合度の検討 | irtoys::itf() | 各項目がIRTモデルにどれだけ適合しているかを検証 |
10. テスト特性曲線(TCC) | irtoys::trf() | 能力\(\theta\)の人がどれくらい得点できるのか? |
11. 潜在特性値の推定(受験者側) | irtoys::mlebme() | 「受験者側」のθ推定(どのくらいできる人か) |
colMeans()
colMeans()
関数を使って正答率
(Correct Response Rate: crr
)を計算item1 item2 item3 item4 item5
0.924 0.709 0.553 0.763 0.870
df_crr <- data.frame( # データフレーム名を指定(ここでは df_crr と指定)
item = names(crr), # 変数名を指定(ここでは item と指定)
seikai = as.numeric(crr) # 変数名を指定(ここでは seikai と指定)
)
item seikai
1 item1 0.924
2 item2 0.709
3 item3 0.553
4 item4 0.763
5 item5 0.870
ggplot(df_crr, aes(x = seikai, y = item)) +
geom_bar(stat = "identity", fill = "skyblue") +
geom_text(aes(label = round(seikai, 2)), # 小数第2位で丸める
hjust = 1.2, size = 6) + # 棒の内側に表示
labs(
title = "各項目の正答率",
x = "項目",
y = "正答率"
) +
theme_minimal() +
theme_bw(base_family = "HiraKakuProN-W3") # 文字化け対策
正答率の計算のポイント
・極端に正答率の高い/低い項目があるかどうか
- 極端に高い/低い項目がある場合 → 問題あり
- 極端に高い/低い項目がない場合 → 問題なし
→ ここでは極端に高い/低い項目がない → 問題なし
→ 次の分析に移る
cor()
cor()
関数を使って、素点 (item1
〜
item5
) と合計点 total
との相関を計算 [,1]
item1 0.3620104
item2 0.5667721
item3 0.6184398
item4 0.5344183
item5 0.4353664
it
は「「行名付きの1列行列(matrix)」」→ 使い勝手が悪いので、この matrix
をデータフレームに変換して、行名を項目名の列として追加する
# 行列をデータフレームに変換
df_it <- as.data.frame(it)
# 行名を項目名として列に追加
df_it$item <- rownames(df_it)
# 列名をわかりやすく変更(オプション)
colnames(df_it) <- c("correlation", "item")
ggplot(df_it, aes(x = item, y = correlation)) +
geom_bar(stat = "identity", fill = "orange") +
geom_text(aes(label = round(correlation, 3)),
vjust = -0.5, size = 4) +
ylim(0, 0.7) +
labs(
title = "項目-合計相関(item-total correlation)",
x = "項目",
y = "相関係数"
) +
theme_minimal() +
theme_bw(base_family = "HiraKakuProN-W3") # 文字化け対策
item1
〜 item5
) と各項目得点
(total
) との相関は 0.36〜0.61の間I-T相関の計算のポイント ・各項目への反応 (item1〜item5) と合計点 (ss) との間にI-T 相関が認められるかどうか
IT相関の値 | 評価 | 項目の扱い |
---|---|---|
〜 0.2 | 極めて低い(要注意) | 除外を検討する |
0.2〜0.3 | やや低い | 内容によって再検討 |
0.3〜0.4 | 妥当なレベル | 保留・文脈による判断 |
0.4以上 | 良好(望ましい) | 採用して問題なし |
→ ここでは全て 0.2 以上の相関が認められる → 問題なし
→ 項目を除外せず、次の分析に移る
psych::fa.parellel()
library(psych)
data <- read.csv("data/IRT_LSAT.csv")
item_data <- data[, -1] # 一列目は分析に含めない
# 一次元性の検討(主成分+平行分析)
fa.parallel(item_data,
fa = "pc",
n.iter = 100) # 100回のシミュレーションを指定
Parallel analysis suggests that the number of factors = NA and the number of components = 1
軸 | 示している内容 | 解釈のポイント |
X軸 | 因子番号(主成分番号) | 因子1〜因子5 |
Y軸 | 固有値(説明される分散量) | 1より大きい → 有意味な因子の可能性あり |
→ 固有値(Eigenvalue)
=>
主成分分析や因子分析において「その因子が説明するデータ全体の分散の量」を示す数値
→ 各因子がデータの分散をどれだけ説明しているかを表す指標
→ 固有値の値が大きいほど、その因子は多くの情報(=ばらつき、構造)をキャッチしており
→ その因子で、たくさんの項目のスコアをまとめて説明できるということ
線の色と種類 | 表す内容 | 解釈上の意味 |
青線 | 実データの固有値 | 実際の項目相関から得られた因子の強さ |
赤破線(細かい) | シミュレート | 完全にランダムなデータから得た固有値の平均 |
赤破線(やや太め) | リサンプル | 元データを再標本化した結果の固有値の平均 |
黒線 | 固有値=1 | 1より大きければ、有意味な因子の可能性あり |
分析結果
・実データ(青瀬)がランダムデータ(赤線)より大きいのは因子1だけ
・そのような因子は因子1だけ
→ 一次元性が成立している
→ 2PLやRaschなど1因子IRTモデルを使用する前提が妥当
→ 安心してIRTモデル(例:ltm() や mirt())の分析へ進めてOK
→ 項目パラメーター(「識別力a」と「困難度b」)と潜在特性値(学力θ)の推定へ
2 パラメタ・ロジスティックモデルの目的 テストに出題した項目パラメーターをもとに、受験者の正誤パターンが最も生じやすい学力θを推定する
• 潜在特性値は平均が0、分散が1の正規分布(標準正規分布)に従うと仮定して推定を行うのが一般的
推定対象 | 推定に必要な情報 |
---|---|
学力θ | 推定したい受験者の正誤パターン |
項目パラメータ | 全ての受験者の正誤パターン |
・項目パラメータは、その項目を含むテストを受験した受験生の正答・誤答情報をもとに、IRTを使って分析して得られる
項目パラメータ推定に関してできることとできないこと
・「識別力が○○、困難度が△△の問題」をあらかじめ作ること
← 試験結果を使って IRT分析しないと項目パラメータを得られないから
・多くの項目を作成し、それを受験生に受けてもらって IRT 分析する
→ ひとつひとつの項目の検証・検討を積み重ねる
特徴 | 1PLモデル(Raschモデル) | 2PLモデル(一般化ロジスティックモデル) |
---|---|---|
モデル式 | \(P(正答)= \frac{1}{1+e^-(\theta-b)}\) | \(P(正答)= \frac{1}{1+e^{-a}(\theta-b)}\) |
識別力 a | すべての項目で同じ(固定) | 項目ごとに推定 |
困難度 b | 項目ごとに推定 | 項目ごとに推定 |
パラメータ数 | 項目数(b のみ)+1(a 固定) | 項目数 × 2(a と b をそれぞれ推定) |
分析対象 | 能力と困難度 b の関係 | 能力、困難度 b、識別力 a の関係(より柔軟なモデル) |
→ 1PLモデルでは「困難度(bパラメータ)」だけが推定される
→ 2PLモデルでは「困難度(bパラメータ)」と「識別力(aパラメータ)」が推定され
→ 2PLモデルでは、項目ごとの「能力の区別のしやすさ」が明らかになる
2 パラメタ・ロジスティックモデル (2PL)
表記 | 詳細 |
---|---|
\(P(\theta)\) | 能力θを持つ受験者が、ある項目に正答する確率 |
\(\theta\) | 受験者の能力で、平均0・標準偏差1の正規分布に従うと仮定 |
\(a\) | 識別力(discrimination )パラメータ |
\(b\) | 困難度(difficulty )パラメータ=位置パラメータ |
\(j\) | 項目の番号 |
ltm
パッケージの
est()
関数で項目パラメーターを推定するex1 <- est(resp = LSAT[, 1:5], # テストデータを指定する引数
model = "2PL", # 2PLMを仮定
engine = "ltm") # ltmパッケージを利用して項目パラメーターを推定すると指定
ex1
$est
[,1] [,2] [,3]
item1 0.8253717 -3.3597333 0
item2 0.7229498 -1.3696501 0
item3 0.8904752 -0.2798981 0
item4 0.6885500 -1.8659193 0
item5 0.6574511 -3.1235746 0
$se
[,1] [,2] [,3]
[1,] 0.2580641 0.86694584 0
[2,] 0.1867055 0.30733661 0
[3,] 0.2326171 0.09966721 0
[4,] 0.1851659 0.43412010 0
[5,] 0.2100050 0.86998187 0
$vcm
$vcm[[1]]
[,1] [,2]
[1,] 0.06659708 0.2202370
[2,] 0.22023698 0.7515951
$vcm[[2]]
[,1] [,2]
[1,] 0.03485894 0.05385658
[2,] 0.05385658 0.09445579
$vcm[[3]]
[,1] [,2]
[1,] 0.05411071 0.012637572
[2,] 0.01263757 0.009933553
$vcm[[4]]
[,1] [,2]
[1,] 0.03428641 0.07741096
[2,] 0.07741096 0.18846026
$vcm[[5]]
[,1] [,2]
[1,] 0.04410211 0.1799518
[2,] 0.17995180 0.7568684
ex1 <- est(resp = LSAT[, 1:5], # テストデータを指定する引数
model = "2PL", # 2PLMを仮定
engine = "ltm") # ltmパッケージを利用して項目パラメーターを推定すると指定
plot(x = P1, # xは引数、irf関数で推定した結果を指定する
co = NA, # ICCの色を指定/項目毎に異なる色でICCを描く
label = TRUE) # 各ICCに項目の番号がつく
abline(v = 0, lty = 2) # x = 0 の縦点線を引く
横軸・・・潜在特性値 \(θ\)
(Ability
)
縦軸・・・正答確率 (Probability of a correct response
)
項目特性曲線 (ICC) でわかること ●
item3
の曲線は図の中央あたりにあり、識別力(a)も高め →
優れた項目
● item1・item5は曲線が左に寄っていて、問題が簡単すぎる項目
● 曲線が急なものほど、能力の違いをよく識別できる(item3が典型)
・item3 は θ ≒ −1 あたりで急激に上昇
→ 能力値が上がるにつれて正答確率が鋭く上がる
→ 識別力が高い
→ このような項目は、平均的な受験者を的確に弁別する良い項目
・項目が能力をどれだけ区別できるかを示すパラメータ
適切な識別力 a の大きさ
0.3 〜
2.0
(出典:芝祐順編『項目反応理論』p.34)
# 必要なパッケージ
library(irt)
library(ggplot2)
library(dplyr)
# モデル推定(再掲)
ex1 <- est(resp = LSAT[, 1:5],
model = "2PL",
engine = "ltm")
# 識別力(1列目)を取り出し
disc <- ex1$est[, 1]
# データフレームに変換して並び替え(小さい順に変更!)
disc_df <- data.frame(
Item = names(disc),
Discrimination = disc
) %>%
arrange(Discrimination) %>% # ★ここを修正
mutate(Item = factor(Item, levels = Item)) # 並び替えを反映
# グラフ描画
ggplot(disc_df, aes(x = Item, y = Discrimination)) +
geom_bar(stat = "identity", fill = "steelblue") +
geom_text(aes(label = round(Discrimination, 2)), vjust = -0.5, size = 4) +
labs(title = "識別力が小さい順に並べた項目", x = "項目", y = "識別力") +
theme_minimal() +
theme_bw(base_family = "HiraKakuProN-W3") # 文字化け対策
→ 識別力 a の範囲 ≈ 0.66 〜 0.89 → 問題なし
適切な困難力 b の大きさ
−3 〜 3
(出典:芝祐順編『項目反応理論』p.34)
# 必要パッケージ
library(irt)
library(ggplot2)
library(dplyr)
# モデル推定(再掲)
ex1 <- est(resp = LSAT[, 1:5],
model = "2PL",
engine = "ltm")
# 困難度(2列目)を取り出す
difficulty <- ex1$est[, 2]
# 項目名を取得してデータフレームに
diff_df <- data.frame(
Item = rownames(ex1$est),
Difficulty = difficulty
) %>%
arrange(Difficulty) %>% # 小さい順に並べる
mutate(Item = factor(Item, levels = Item)) # 並び順を固定
# グラフ描画(縦棒グラフ)
ggplot(diff_df, aes(x = Item, y = Difficulty)) +
geom_bar(stat = "identity", fill = "coral") +
geom_text(aes(label = round(Difficulty, 2)), vjust = -0.5, size = 4) +
labs(title = "困難度が小さい順に並べた項目", x = "項目", y = "困難度") +
theme_minimal() +
theme_bw(base_family = "HiraKakuProN-W3") # 文字化け対策
item1
とitem5
が簡単すぎる問題(困難度 b
が−3以下)item4, item2, item3
は適度な難易度→ 困難度 b の範囲 ≈ −3.36 〜 −0.28 → 簡単すぎる
標準誤差(識別力)の範囲
0.1 〜 0.4(識別力
a の標準誤差)
(出典:芝祐順編『項目反応理論』p.34)
# 必要パッケージ
library(irt)
library(ggplot2)
library(dplyr)
# モデル推定
ex1 <- est(resp = LSAT[, 1:5],
model = "2PL",
engine = "ltm")
# 識別力の標準誤差(標準偏差)を取り出す
disc_se <- ex1$se[, 1] # 1列目が識別力の標準誤差
# 項目名を取得
item_names <- rownames(ex1$est)
# データフレームに変換して、小さい順に並べ替え
disc_se_df <- data.frame(
Item = item_names,
Discrimination_SE = disc_se
) %>%
arrange(Discrimination_SE) %>% # 小さい順に並べ替え
mutate(Item = factor(Item, levels = Item)) # 並び順をグラフに反映
# グラフ描画(縦棒グラフ:左小 → 右大)
ggplot(disc_se_df, aes(x = Item, y = Discrimination_SE)) +
geom_bar(stat = "identity", fill = "darkgreen") +
geom_text(aes(label = round(Discrimination_SE, 3)),
vjust = -0.5, size = 4) +
labs(title = "識別力の標準誤差(SE)が小さい順に並べた項目",
x = "項目",
y = "識別力の標準誤差") +
theme_minimal() +
theme_bw(base_family = "HiraKakuProN-W3") # 文字化け対策
標準誤差(困難度)の範囲
0.2 〜 0.5(困難度 b
の標準誤差)
(出典:芝祐順編『項目反応理論』p.34)
# 必要パッケージ
library(irt)
library(ggplot2)
library(dplyr)
# モデル推定
ex1 <- est(resp = LSAT[, 1:5],
model = "2PL",
engine = "ltm")
# 困難度の標準誤差(標準偏差)を取り出す(2列目)
diff_se <- ex1$se[, 2]
# 項目名を取得
item_names <- rownames(ex1$est)
# データフレームに変換して、小さい順に並べ替え
diff_se_df <- data.frame(
Item = item_names,
Difficulty_SE = diff_se
) %>%
arrange(Difficulty_SE) %>% # 小さい順に並べ替え
mutate(Item = factor(Item, levels = Item)) # 並び順を固定
# グラフ描画
ggplot(diff_se_df, aes(x = Item, y = Difficulty_SE)) +
geom_bar(stat = "identity", fill = "purple") +
geom_text(aes(label = round(Difficulty_SE, 3)),
vjust = -0.5, size = 4) +
labs(title = "困難度の標準誤差(SE)が小さい順に並べた項目",
x = "項目",
y = "困難度の標準誤差") +
theme_minimal() +
theme_bw(base_family = "HiraKakuProN-W3") # 文字化け対策
item1
とitem5
の推定が不安定(どちらも se =
0.87)
・全体的に簡単な項目に偏っている
・item3 は 適度な難易度・高い識別力で、IRT的には非常に良い項目
・item1とitem5 は簡単すぎて識別力も低め
→ テストの目的によっては、除外や見直しすべき
・困難度という観点から、困難度が −3 以下の item1
と
item5
は削除対象
・代わりに難しい項目を追加するとバランスがよくなる
・識別力の高い(a > 1.2)項目を加えると、能力の区別精度が上がる
・b ≈ 0〜+2 の項目を加えると、高能力者の識別力も補強できる
最尤推定法の基本的な考え方
・学力 θ の候補値を −3 から 3 まで 0.1
ごとに調べる
・どの θ
のときに「そのパターンの回答が起こる可能性(尤度)」が最も高くなるかを探す
・その「最も可能性が高いθ」が、学力(潜在特性)の推定値
学力θを推定する確率計算
ltmパッケージ
の中に入っているデータを使う
• The Law School Admission Test
への解答結果を採点
受験者数: 1000人
項目数:Section IVに含まれる5項目
正答なら1、誤答なら0
# 2PLモデルによるIRT分析(5項目に限定)
mod <- ltm(LSAT[, 1:5] ~ z1, IRT.param = TRUE)
# 能力値 θ の範囲指定
theta_vals <- seq(-3, 3, by = 0.1)
# モデルから項目パラメーター(識別力 a、困難度 b)を抽出
coefs <- coef(mod) # 戻り値は列1 = Dffclt (b), 列2 = Discr (a)
# 正答確率を格納するデータフレームの作成
icc_df <- data.frame(theta = theta_vals)
# 各項目に対して正答確率を計算(2PLモデルの公式)
for (i in 1:nrow(coefs)) {
b <- coefs[i, 1] # 困難度 b
a <- coefs[i, 2] # 識別力 a
P_theta <- 1 / (1 + exp(-a * (theta_vals - b))) # 2PLのICC式
icc_df[[paste0("Item", i)]] <- round(P_theta, 4)
}
item1
から item5
までの正答確率theta(学力θのこと)の値が 0.1 ごとの項目ごとの正答率をすべて確認できる
この結果を項目特性曲線として可視化してみる
plot(mod, type = "ICC", items = 1:5)
# 縦の点線を追加(θ = -3)
abline(v = -3, col = "red", lty = 2, lwd = 1)
item1
の数値 0.5737item1
) は Probability = 0.57
を示しているitem3
の数値 0.0815item3
) は Probability = 0.0815
を示しているitem1 | item2 | item3 | item4 | item5 |
正答 | 正答 | 正答 | 正答 | 誤答 |
item5
に正答し、item1
から
item4
までは誤答する確率を計算theta(学力θ) | item1 | item2 | item3 | item4 | item5 |
-3 | 0.5737 | 0.2353 | 0.0815 | 0.3141 | 0.5203 |
item1
から item4
まで正答、item5
には誤答する確率を計算してみる\[item1の正答確率 × item2の正答確率 × item3の正答確率 × \\item4の正答確率 × item5の誤答確率(1-item5の正答確率)\] \[=0.5737×0.2353×0.0815×\\0.3141× (1-0.5203) = 0.001658 (=0.17\%)\]
・学力θが最も低い学生が、5問中4問に正答し1問だけ間違う確率は 0.17%
item5
に正答し、item1
から
item4
までは誤答する確率を計算theta(学力θ) | item1 | item2 | item3 | item4 | item5 |
0 | 0.9412 | 0.9412 | 0.562 | 0.7833 | 0.8863 |
item1
から item4
まで正答、item5
には誤答する確率を計算してみる\[item1の正答確率 × item2の正答確率 × item3の正答確率 × \\item4の正答確率 × item5の誤答確率(1-item5の正答確率)\] \[=0.9412×0.9412×0.562×\\0.7833× (1-0.8863) = 0.034343 (=3.4\%)\]
0.034343
・学力θが平均的な学生が、5問中4問に正答し1問だけ間違う確率は3.4%
item5
に正答し、item1
から
item4
までは誤答する確率を計算theta(学力θ) | item1 | item2 | item3 | item4 | item5 |
3 | 0.9948 | 0.9593 | 0.9489 | 0.9661 | 0.9825 |
item1
から item4
まで正答、item5
には誤答する確率を計算してみる\[item1の正答確率 × item2の正答確率 × item3の正答確率 × \\item4の正答確率 × item5の誤答確率(1-item5の正答確率)\] \[=0.9948×0.9593×0.9489×\\0.9489× (1-0.9825) = 0.015338 (=1.5\%)\]
・学力θが最も低い学生が、5問中4問に正答し1問だけ間違う確率は 1.5%
item1
から item5
までの正答確率」をもとに3 から 3
)ごとに、この学生の正誤パターン(正正正正誤)が起きる確率を計算してみるltm()
関数を使って(正正正正誤)が起こる確率を学力θごとに計算できる# 2PLモデルによるIRT分析(5項目に限定)
mod <- ltm(LSAT[, 1:5] ~ z1, IRT.param = TRUE)
# 能力値 θ の範囲指定
theta_vals <- seq(-3, 3, by = 0.1)
# モデルから項目パラメーター(a, b)を抽出
coefs <- coef(mod) # col1 = b(困難度), col2 = a(識別力)
# 回答パターン(1 = 正答, 0 = 誤答)
response_pattern <- c(1, 1, 1, 1, 0)
# 初期化:結果を格納するリスト
result_list <- list()
# 各θについて計算
for (j in seq_along(theta_vals)) {
theta <- theta_vals[j]
item_probs <- numeric(length(response_pattern))
for (i in 1:length(response_pattern)) {
b <- coefs[i, 1]
a <- coefs[i, 2]
P <- 1 / (1 + exp(-a * (theta - b)))
# 正答なら P、誤答なら 1 - P を保存
item_probs[i] <- ifelse(response_pattern[i] == 1, P, 1 - P)
}
# 尤度は5項目分の確率の積
likelihood <- prod(item_probs)
# 結果をデータフレーム形式で記録
result_list[[j]] <- data.frame(
theta = theta,
Item1 = round(item_probs[1], 4),
Item2 = round(item_probs[2], 4),
Item3 = round(item_probs[3], 4),
Item4 = round(item_probs[4], 4),
Item5 = round(item_probs[5], 4),
likelihood = round(likelihood, 6)
)
}
# 全θの結果を結合して表示
result_df <- do.call(rbind, result_list)
theta | item1 | item2 | item3 | item4 | item5 | likelihood |
0.5 | 0.9603 | 0.7944 | 0.667 | 0.836 | 0.0845 | 0.035957 |
最尤推定法の基本的な考え方
・学力 θ の候補値を −3 から 3 まで 0.1
ごとに調べる
・どの θ
のときに「そのパターンの回答が起こる可能性(尤度:likelyhood)」が最も高くなるかを探す
・その「最も可能性が高いθ」が、学力(潜在特性)の推定値
テスト情報関数 ・2パラメタ・ロジスティック・モデルの場合のテスト情報量は次の式で表せる
\[I(\theta) = 1.7^2\sum_{j=1}^na_j^2P_j(\theta)Q_j(\theta)\]
変数 | 内容 |
---|---|
\(I(θ)\) | テスト情報量 |
1.7 | 定数 |
\(a_j\) | 項目\(j\) の識別力 |
\(P_j(\theta)\) | 学力θに応じた項目 \(j\) に正答する確率 |
\(Q_j(\theta)\) | 学力θに応じた項目 \(j\) に誤答する確率 |
学力θごとに計算したテスト情報量
→ テスト情報曲線 (Test Information Curve,TIC
)
で可視化する
「テストがどの能力レベル(θ)でどれくらい正確に測れているか」を可視化できる
• 潜在特性値の値毎にテスト情報量を計算しプロットする
tif
関数を使ってテスト情報量を計算
→ plot
関数で TIC
を作成
様々な潜在特性値\(θ\)(能力)におけるテスト情報量(Information)が I
irtoys
パッケージの
tif()
関数を使って計算する
I <- irtoys::tif(ip = ex1$est) # データに対し2PLMを仮定
# x: tif関数で推定した結果を指定する引数
plot(x = I) # ip: テストに含まれる各項目の項目パラメーターを指定する引数
・横軸・・・潜在特性値\(θ\)(学力)
・縦軸・・・テスト情報量(測定の精度=標準誤差の逆数)
・実線・・・テスト情報曲線
→ 当該潜在特性値におけるテスト情報量をつなぎ合わせたもの
テスト情報曲線 (TIC) でわかること
1.
どの能力レベルを正確に測れているか?
・情報量が高いところ → その学力θレベルでテストが精度が高い
→ \(\theta =
−2\)付近の情報量が最も高い
→ \(\theta =
−2\)付近のレベルでテストが高精度
・情報量が低いところ
→ その学力θレベルではテストの精度が低い
→ \(\theta =
4\)の情報量が最も低い
→ \(\theta =
4\)のレベルでテストが低精度
例:TICがθ = 0の周辺で高ければ
→「平均的な人を測るのに最適なテスト」だといえる
2.
テストの設計意図が見える
・TICがどこで山になるかを見ることで、そのテストがどんな対象向けかが分かる
・TICが\(\theta =
−2\)付近で山になっている
→ このテストは比較的能力の低い人向け
・TICがどこで山になるかを見ることで
→ そのテストがどんな対象向けかが分かる
TICの山の位置 | 意味 | 対象 |
---|---|---|
θ = 0 周辺 | 平均均的な受験者向け | 一般的な学力テスト |
θ > 0(右寄り) | 高能力者向け | 難関資格・上級試験 |
θ < 0(左寄り) | 初級者・低能力者向け | 基礎力診断など |
・ここではTICの山の位置が左より
→ 平均均的な受験者向けだとわかる
3.
信頼性の高さ(精度)もわかる
・情報量が高い=その範囲の 標準誤差(SE)が小さい
・標準誤差との関係:
\[SE(\theta) = \frac{1}{\sqrt{{I(\theta)}}}\]
・つまり、情報量が大きいと \(\theta\) の推定がブレにくい(= 信頼できる)
4. テスト情報量の基準を設定する:0.5以上
・例えば、テスト情報量の基準を「0.5以上」と設定する
→ 情報精度の基準を満たしている学力θの範囲がわかる
項目適合度の結果のポイント
どの潜在特性値 \(\theta\)
の値で、情報量が最大になるか
・潜在特性値が −2 の辺りでテスト情報量が最大
⇒ 潜在特性値\(θ\)(能力)が低い( −2
の辺り )受験者の推定精度が最も高い
irf()
&
cor()
一次元性の仮定 各項目の正誤が、潜在特性値 \(\theta\) の値の大小によってのみばらつく
・つまり「受験者が正解するかどうかは、受験者の能力だけで決まる」という仮定
• 局所独立性の検討は \(Q_3\)統計量に基づいて行われることが多い
• \(Q_3\)統計量とは、各項目への回答(観測値)からその期待値を引き
→ 得られた残差得点間の相関を求めることで得られる
• たとえば今の場合、item1
の残差得点\(d_1\)は次の式で表せる
\[d_1 = u_1 - \hat{P_1(\theta)}\]
item1
への解答結果(正答なら1、誤答なら0)𝑄3 統計量(Yen, 1984)
・𝑄3 統計量(Yen,
1984)では、回帰分析でいうところの偏相関係数にあたるものを利用する
・偏相関係数は「変数 𝑧 の影響を取り除いた時の 𝑥 と 𝑦
の相関係数」のこと
→ 疑似相関の影響を検討する際に利用される
・これを IRT の文脈に当てはめる
→「変数 \(\theta_p\)
の影響を取り除いた時の \(y_{pi}\) と
\(y_{pj}\) の相関係数」
→ これが 0 であれば局所独立
Source: https://journals.sagepub.com/doi/10.1177/014662168400800201
mlebme
関数を利用して潜在特性値を推定 •
mlebme
関数を利用して潜在特性値を推定
⇒
mlebme
関数はirtoys
パッケージの中に入っている関数
head(mlebme(resp = LSAT[, 1:5], # テストデータを指定
ip = ex1$est, # データに対し2PLMを仮定
method = "BM")) # 最尤推定法 (ML) による潜在特性値の推定を指定
est sem n
[1,] -1.895392 0.7954829 5
[2,] -1.895392 0.7954829 5
[3,] -1.895392 0.7954829 5
[4,] -1.479314 0.7960948 5
[5,] -1.479314 0.7960948 5
[6,] -1.479314 0.7960948 5
resp
: テストデータを指定する引数ip
:
テストに含まれる各項目の項目パラメーターを指定する引数ex1$est
と指定method
: どの推定法を用いて潜在特性値を推定するかML
と指定BM
と指定est
)sem
)n
)irf
関数を利用して正答確率 ($f
)
を推定• irf
関数では2PLMを仮定
• ex1$est
と指定
→ データに対し2PLMを仮定したときの項目パラメーターの推定値を各項目の項目パラメーターとして指定
• theta.est[, 1]
と指定
→ データに対し2PLMを仮定したときの潜在特性の推定値を指定
⇒ 結果はPとして保存
変数 | 内容 |
---|---|
$x | 各受験者の潜在特性値\(\theta\)(能力) |
$f | 正答確率の推定値 |
行 | 受験者 (1,000名) |
列 | 項目 (item1〜item5) |
1 ≦ j ≦5 )
P$f
と指定することで,正答確率の推定値が抽出される(LSAT,1:5])
から正答確率を引いた残差得点を
\(d\) に保存 item1 item2 item3 item4 item5
1 -0.7700558 -0.4061064 -0.1917689 -0.4949268 -0.6915701
2 -0.7700558 -0.4061064 -0.1917689 -0.4949268 -0.6915701
3 -0.7700558 -0.4061064 -0.1917689 -0.4949268 -0.6915701
4 -0.8252089 -0.4801900 -0.2557741 -0.5661590 0.2533129
5 -0.8252089 -0.4801900 -0.2557741 -0.5661590 0.2533129
6 -0.8252089 -0.4801900 -0.2557741 -0.5661590 0.2533129
cor
関数を利用して \(Q_3\) 統計量の値を計算 item1 item2 item3 item4 item5
item1 1.00000000 -0.04142824 -0.04101429 -0.064167975 -0.062538809
item2 -0.04142824 1.00000000 -0.11322248 -0.097060194 -0.029585197
item3 -0.04101429 -0.11322248 1.00000000 -0.092262203 -0.104216701
item4 -0.06416797 -0.09706019 -0.09226220 1.000000000 -0.003656669
item5 -0.06253881 -0.02958520 -0.10421670 -0.003656669 1.000000000
局所独立性の検討のポイント
各項目の正誤が、潜在特性値 \(\theta\)
の値の大小によってのみばらつくかどうか
。\(Q_3\) の絶対値が 0
に近いほど、項目反応間に局所独立性を仮定できる
・\(Q_3\) の値の絶対値が
0.2以上の場合 → 問題あり: 局所依存性の疑い(Chen
& Thissen, 1997)
・\(Q_3\) の値の絶対値が
0.2以下の場合 → 問題なし
# Q3の絶対値をとる
Q3_abs <- abs(Q3)
# 対角成分(自己相関1.0)をNAにして除外する
diag(Q3_abs) <- NA
# 絶対値が0.2以上の個数を数える
count_0.2_or_more <- sum(Q3_abs >= 0.2, na.rm = TRUE)
# 全体の要素数(対角除外後の数)
total_elements <- sum(!is.na(Q3_abs))
# 割合を計算
proportion_0.2_or_more <- count_0.2_or_more / total_elements
# 結果を表示
cat("絶対値が0.2以上の個数:", count_0.2_or_more, "\n")
絶対値が0.2以上の個数: 0
割合: 0
library(ggplot2)
library(reshape2)
# Q3行列を絶対値に
Q3_abs <- abs(Q3)
diag(Q3_abs) <- NA # 対角成分除外
# meltしてロング形式に
Q3_long <- melt(Q3_abs, varnames = c("Item1", "Item2"), value.name = "Q3_value")
# 0.2超えのフラグをつける
Q3_long$Violation <- Q3_long$Q3_value > 0.2
# ヒートマップ作成
ggplot(Q3_long, aes(x = Item1, y = Item2, fill = Violation)) +
geom_tile(color = "white") +
scale_fill_manual(values = c("white", "deeppink")) +
labs(
title = "局所独立性違反ヒートマップ(ピンク=違反)",
x = "項目",
y = "項目"
) +
theme_bw(base_family = "HiraKakuProN-W3") + # 先に白背景+日本語フォント
theme(
axis.text.x = element_text(angle = 90, hjust = 1, vjust = 1), # ←ここで傾ける
axis.text.y = element_text(hjust = 1)
)
各項目の正誤が、潜在特性値 \(\theta\)
の値の大小によってのみばらつくかどうか
・Q_3 の絶対値が 0
に近いほど、項目反応間に局所独立性を仮定できる
・\(Q_3\) の値の絶対値が
0.2以上の場合 → 問題あり
→ 局所依存性の疑い(Chen & Thissen, 1997)
・\(Q_3\) の値の絶対値が 0.2以下の場合 → 問題なし
・\(Q_3\)
の値の絶対値の値を計算してみた
→ \(Q_3\)
の値の絶対値が0.2以上の個数がゼロ → 問題なし
→ 局所独立性が成立していることを示唆
→ 次の分析に進む
・Q3行列は「IRTモデルで推定された正答確率」と「実際の回答データ」
のズレ(= 残差)から作った残差相関行列
・従って、Q3が0.2以上というのは「局所独立性の仮定が破れている」ということ
→ 次のいずれかの可能性が高いことを示唆している
🔵 学力θで説明しきれない強い依存関係が残っている
🔵 何か別の理由で項目同士が結びついている
・局所依存性:局所独立性が満たされていない状態のこと
⇒ \(Q_3\)はあくまで一つの基準に過ぎないので注意が必要
→ ここでは\(Q_3\)
の値の絶対値が全て 0.2以下 → 問題なし
→ 局所独立性が成立していることを示唆
→ 次の分析に移る
・局所依存性:局所独立性が満たされていない状態のこと
⇒ \(Q_3\)はあくまで一つの基準に過ぎないので注意が必要
itf()
・「各項目が理論モデル(例:2PLモデル、3PLモデル)にちゃんと従っているかどうか」を評価するものが項目適合度
(Item Fit)
• IRTにおいては項目反応モデルへの適合度を検討することも重要
• ここでは、itf
関数を利用して item1
の項目適合度を検討してみる
resp
はテストデータを指定する引数irtoys::itf(resp = LSAT[, 1:5], # 応答データ [受験者, 項目]
item = 1, # 1番目の項目適合度の検討を指定する
ip = ex1$est, # 2PLモデルによる推定された項目パラメータ
theta = theta.est[, 1]) # 受験者ごとの能力推定値(θ)
Statistic DF P-value
10.0741811 6.0000000 0.1215627
Ability
) Proportion right
)項目適合度でわかること
その項目がIRTモデルに「合っているか」どうか
・各項目の「実際のデータによる反応パターン」と、IRTモデルが「理論的に予測する反応パターン」を比較
→ もしズレていたら、モデルの仮定がその項目には合っていないということ
・モデルに合っていない項目を使うと、潜在特性値\(θ\)(能力)の推定が不正確になる可能性あり
・項目の品質をチェックし、不適切な項目を修正・削除する判断材料になる
・バイアスの検出(DIF:Differential Item Functioning
)の手がかりにもなる
現象 | 可能性 |
---|---|
実際の正答率がモデルより低い | 問題文がわかりにくい/迷いやすい選択肢 |
特定の能力層だけ挙動がおかしい | バイアスがある、ミスリードされやすい項目 |
正答率がランダムに近い | 推測が強く影響(cパラメータが不十分) |
認知的に複雑すぎる | 単一の「能力θ」では説明できない |
適合度を判断する指標:
S-X²統計量(Orlando &
Thissenの項目適合度指標)
・より精度の高い適合度検定(特に2PLや3PLに使う)
・能力をグループ(通常は10分位など)に分け
→ 各グループでのモデルによる期待正答率と、実際の正答率の差を使う
→ カイ二乗型の統計量として適合度を評価
= これは、カイ二乗分布に従う統計量だが、S-X²
特有の方法
→ 通常のカイ二乗適合度検定とは区別される
結果の解釈
p値が有意水準 (0.05) よりも大きい:
p-value = 0.1215627
→ 帰無仮説は棄却できない
→
「当てはめた項目反応モデルがデータに適合している」と判断される
itf
関数を使用した際に出力される図において
実線と円の間の乖離が大きいほど、モデルがデータに当てはまっていないと判断
trf()
&
plot()
関数を使った分析
• 潜在特性値の値毎に素点の期待値を計算しプロットする
trf
関数を使ってテスト情報量を計算
→ plot
関数で TCC
を作成
E <- trf(ip = ex1$est) # データに対し2PLMを仮定
# ip: テストに含まれる各項目の項目パラメーターを指定する引数
plot(x = E) # 様々な潜在特性値における素点の期待値(Expectation)
横軸・・・潜在特性値 (
Ability
)
縦軸・・・予想される合計得点 (Expected Score
)
テスト特性曲線 (TCC
)
でわかること 1. 受験者の能力
\(\theta\)
と期待得点の関係
・実線が右肩上がり
→ 受験者の能力が上がるにつれて、得点も上がる傾向あり
2.
テストの難易度と分布の様子
・受験者の能力 \(\theta\) が 0
のあたりで急に得点が上がっている場合
→ 平均的な能力の人向けのテスト
・受験者の能力 \(\theta\) が 2
〜 4 のあたりで急に得点が上がっている場合
→ 平均以上の能力の人向けのテスト
・受験者の能力 \(\theta\) が −4
〜 −2 のあたりで急に得点が上がっている場合
→ 平均以下の能力の人向けのテスト
3.
得点分布の歪みや限界
・TCCの傾きが緩やかな部分
→ その能力帯では得点の変化が鈍い(= 差がつきにくい)
・予想される合計得点に近い部分が平坦になっている場合は
→ 高得点者と低得点者の差がつきにくい
mlebme
関数を利用して潜在特性値を推定mlebme
関数はirtoys
パッケージの中に入っている関数head(mlebme(resp = LSAT[, 1:5], # テストデータを指定
ip = ex1$est, # データに対し2PLMを仮定
method = "BM")) # 最尤推定法 (ML) による潜在特性値の推定を指定
est sem n
[1,] -1.895392 0.7954829 5
[2,] -1.895392 0.7954829 5
[3,] -1.895392 0.7954829 5
[4,] -1.479314 0.7960948 5
[5,] -1.479314 0.7960948 5
[6,] -1.479314 0.7960948 5
resp
: テストデータを指定する引数ip
:
テストに含まれる各項目の項目パラメーターを指定する引数ex1$est
と指定method
: どの推定法を用いて潜在特性値を推定するかML
と指定BM
と指定項目 | 意味 |
est | 能力値(θ)の推定値 |
sem | 標準誤差(Standard Error of Measurement) |
n | 推定に用いた項目数(ここでは全員5項目) |
→ 多くの受験者のθは-1.5〜0の範囲にある
→ 平均的またはやや低めの学力層が多い