項目反応理論(IRT)モデルでは、能力パラメータと項目パラメータ(など)を同時に推定する。しかし、何らかの制約を課さなければパラメータが一意に定まらない 識別性(identifiability) の問題がある。
識別性の問題とは¶
識別性(identifiability) とは、観測データからモデルのパラメータを一意に決定できるかどうかという性質である。
IRTモデルでは、2パラメータロジスティックモデル(2PLM)を例にとると
というモデルを考える。このとき、能力パラメータと項目パラメータの間には本質的な不定性が存在する。
位置の不定性(Location Indeterminacy)¶
能力パラメータと困難度パラメータに同じ定数を加えても、モデルの予測確率は変わらない。
つまり、とは観測データに対して同じ尤度を与える。これを 位置の不定性 という。
直感的には「全員の能力を10点ずつ上げて、全問題の難易度も10点ずつ上げても、正答確率は変わらない」ということである。
尺度の不定性(Scale Indeterminacy)¶
能力パラメータと困難度パラメータを同じ正の定数で割り、識別力パラメータを倍しても、モデルの予測確率は変わらない。
つまり、とは観測データに対して同じ尤度を与える。これを 尺度の不定性 という。
直感的には「能力と難易度の単位を変えても(例:点数からパーセントに変換)、識別力を適切に調整すれば正答確率は変わらない」ということである。
識別性の確保¶
識別性の問題を解決するためには、パラメータに制約を課す必要がある。主に2つのアプローチがある。
能力パラメータへの制約:能力の分布を固定する
項目パラメータへの制約:特定の項目のパラメータを固定する
能力パラメータへの制約¶
最も一般的な方法は、能力パラメータが標準正規分布に従うと仮定することである。
この制約により:
位置の不定性の解消:と固定することで、とに任意の定数を加える自由度がなくなる
尺度の不定性の解消:と固定することで、とを任意の定数で割る自由度がなくなる
この制約は周辺最尤推定法(MML)やベイズ推定で自然に導入される。
項目パラメータへの制約¶
別のアプローチとして、特定の項目パラメータを固定する方法がある。
例えば:
1つの項目の困難度を固定:(位置の不定性を解消)
1つの項目の識別力を固定:(尺度の不定性を解消)
または、複数の項目パラメータの平均や分散を固定する方法もある:
(困難度の平均を0に固定)
(識別力の平均を1に固定)
この方法は同時最尤推定法(JML)でよく用いられる。
シミュレーション:識別性の問題の確認¶
識別性の問題を具体的に確認するため、同じデータに対して異なるパラメータが同じ尤度を与えることを示す。
import numpy as np
def icc_2pl(theta, a, b):
"""2PLモデルのICC(項目特性曲線)"""
return 1 / (1 + np.exp(-a * (theta - b)))
def log_likelihood(responses, theta, a, b):
"""対数尤度の計算"""
prob = icc_2pl(theta[:, None], a, b)
ll = np.sum(responses * np.log(prob + 1e-10) + (1 - responses) * np.log(1 - prob + 1e-10))
return ll
# 真のパラメータ
np.random.seed(42)
n_persons, n_items = 100, 5
theta_true = np.random.normal(0, 1, n_persons)
a_true = np.array([1.0, 1.2, 0.8, 1.5, 1.1])
b_true = np.array([-1.0, -0.5, 0.0, 0.5, 1.0])
# データ生成
prob = icc_2pl(theta_true[:, None], a_true, b_true)
responses = np.random.binomial(1, prob)
# 真のパラメータでの対数尤度
ll_true = log_likelihood(responses, theta_true, a_true, b_true)
print(f"真のパラメータでの対数尤度: {ll_true:.4f}")真のパラメータでの対数尤度: -278.3950
位置の不定性の確認¶
# 位置の不定性:θとbに同じ定数cを加える
c = 5.0 # 任意の定数
theta_shifted = theta_true + c
b_shifted = b_true + c
ll_shifted = log_likelihood(responses, theta_shifted, a_true, b_shifted)
print(f"位置をシフトしたパラメータでの対数尤度: {ll_shifted:.4f}")
print(f"差: {abs(ll_true - ll_shifted):.10f}")位置をシフトしたパラメータでの対数尤度: -278.3950
差: 0.0000000000
尺度の不定性の確認¶
# 尺度の不定性:θとbをkで割り、aをk倍する
k = 2.0 # 任意の正の定数
theta_scaled = theta_true / k
b_scaled = b_true / k
a_scaled = a_true * k
ll_scaled = log_likelihood(responses, theta_scaled, a_scaled, b_scaled)
print(f"尺度を変換したパラメータでの対数尤度: {ll_scaled:.4f}")
print(f"差: {abs(ll_true - ll_scaled):.10f}")尺度を変換したパラメータでの対数尤度: -278.3950
差: 0.0000000000
上記のように、異なるパラメータの組み合わせが全く同じ対数尤度を与えることが確認できた。これが識別性の問題である。
視覚的な確認¶
異なるパラメータ化でも、正答確率(ICC)は同じになることを確認する。
Source
import matplotlib.pyplot as plt
# 項目1のICCを比較
theta_range = np.linspace(-4, 4, 100)
j = 0 # 項目1
# 真のパラメータでのICC
icc_true = icc_2pl(theta_range, a_true[j], b_true[j])
# 位置シフトしたパラメータでのICC(θも調整が必要)
icc_shifted = icc_2pl(theta_range + c, a_true[j], b_shifted[j])
# 尺度変換したパラメータでのICC(θも調整が必要)
icc_scaled = icc_2pl(theta_range / k, a_scaled[j], b_scaled[j])
fig, ax = plt.subplots(figsize=(6, 3))
ax.plot(theta_range, icc_true, 'b-', linewidth=2, label='Original')
ax.plot(theta_range, icc_shifted, 'r--', linewidth=2, label=f'Location shift (c={c})')
ax.plot(theta_range, icc_scaled, 'g:', linewidth=2, label=f'Scale transform (k={k})')
ax.set(xlabel=r'$\theta$ (original scale)', ylabel=r'$P(u=1)$', title='Item 1: ICC under different parameterizations')
ax.legend()
ax.grid(True, alpha=0.3)
plt.show()
3つの曲線が完全に重なっており、異なるパラメータ化が同じ正答確率を生成することが確認できる。
ベイズ推定における識別性¶
ベイズ推定では、事前分布を通じて識別性を確保することが自然にできる。
標準的な事前分布の設定¶
:位置と尺度の両方を固定
の制約:識別力は正であるべき(負だとICCの傾きが反転する)
には緩い正規分布:困難度の範囲を緩やかに制限
1PLモデル(Raschモデル)の識別性¶
1PLモデルでは識別力がすべての項目で共通(通常と固定)であるため、尺度の不定性は最初から存在しない。
この場合、位置の不定性のみを解消すればよく、以下のいずれかの制約を課す:
(能力の総和を0に固定)
(困難度の総和を0に固定)
(能力の平均を0に固定)
まとめ¶
| 不定性の種類 | 変換 | 解消方法 |
|---|---|---|
| 位置の不定性 | または | |
| 尺度の不定性 | または |
IRTモデルの推定では、これらの制約を意識することが重要である。特に:
使用するソフトウェアがどの制約を採用しているか確認する
異なる研究間でパラメータを比較する際は尺度を揃える
ベイズ推定では事前分布を通じて自然に識別性を確保できる