Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

項目反応理論

古典的テスト理論(CTT)では項目の指標(困難度、識別力)や信頼性係数、測定の標準誤差などのいずれもがテストの受験者集団の性質に依存する問題があった。

IRTではテストに含まれる項目の難易度と受験者の能力を分離して表現できる。

IRTの考え方

IRTでは受験者の能力と項目(設問)の特徴を分離する。

テストを例にすると、IRTで使う観測データは「ある受験者iiが、ある設問jjについて、正解したかどうかuij{0,1}u_{ij} \in \{0, 1\}」。

この観測値uiju_{ij}の背後には潜在的に「正解する確率(このくらいの能力の人たちのN%はこの設問に正解する)P(uij=1)P(u_{ij} = 1)」が存在すると考える。

そして正解する確率P(uij=1)P(u_{ij}=1)に影響を与える要因として、 受験者の能力θi\theta_i設問の識別力aja_j設問の困難度bb といったパラメータがあると考える。

Loading...

正解する確率 P(uij=1)P(u_{ij}=1) はロジスティック・シグモイド関数を使うモデル(logistic model)が一般的。

このaj,bj,θia_j, b_j, \theta_iは未知の値(モデル上のパラメータ)なので、ベルヌーイ分布を仮定してデータuiju_{ij}から最尤推定法などを使って推定する。

項目特性曲線

IRTでは 項目特性曲線(item characteristic curve: ICC) を使うことで受験者の能力と項目の困難度を分離する。

最も標準的なIRTモデルである2PLM(2 parameters logistic model)は

Pj(θ)=11+exp(1.7aj(θbj)),<θ<P_j(\theta)=\frac{1}{1+\exp \left(-1.7 a_j\left(\theta-b_j\right)\right)}, \quad-\infty<\theta<\infty

であり、これを図にしたものがICCになる。

Source
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
x = np.linspace(-4, 4, 1000)

fig, axes = plt.subplots(figsize=[8, 2], ncols=2)


a = 1
for beta in [-1, 0, 1]:
    axes[0].plot(x, norm.cdf(x, loc=beta, scale=1/a), label=r"$b$ = " + f"{beta}")
axes[0].set(xlabel=r"$\theta_i$", ylabel=r"$P(y_{ij} = 1)$", xticklabels=[], yticklabels=[])
axes[0].legend()
axes[0].grid(True)

beta = 0
for a in [0.5, 1, 3]:
    axes[1].plot(x, norm.cdf(x, loc=beta, scale=1/a), label=r"$a$ = " + f"{a}")
axes[1].set(xlabel=r"$\theta_i$", ylabel=r"$P(y_{ij} = 1)$", xticklabels=[], yticklabels=[])
axes[1].legend()
axes[1].grid(True)
<Figure size 800x200 with 2 Axes>

困難度bbが能力値θ\thetaと等しくなる点で正答率P(y=1)=0.5P(y=1)=0.5となるようになっている

  • 識別力aaが高いほどシグモイド関数の傾きが急で、能力値がある値を超えると明確に正答率が変わっていることを示す

    • θ=b\theta = bのときにどれだけθ\thetaに敏感なのかを示す

  • 困難度bbが高いほどシグモイド関数が右側にシフトしており、能力値が高くないと正答できないことを示す

    • θ=b\theta = bの点がP=0.5P=0.5なので、θ<b\theta < bならP<0.5P < 0.5、逆も然り

ICCは2種類の解釈がある

  1. 能力値がθ\thetaである個々の受験者の(設問jjに対する)正答確率

  2. 能力値がθ\thetaである受験者母集団における(設問jjに対する)正答者の比率

後者が頻度主義的であり一般的で無理のない解釈

イメージ

あるテストで、データセット(項目反応行列)が次のようになっていたとする。1は正解、0は不正解を意味する。

item1item2item3item4item5
person111110
person211101
person311000
person410001
  • item1は全員が正解している設問 → 困難度bbは低く、識別力aaも低い項目

  • item2~item4を見る限り、person1 > person2 > person3 のθ\thetaになりそう

  • item4はθ\thetaが高そうな(他の項目でも正解率の高い)person1しか正解していない → 困難度bbは高くなる

  • item5は他の項目との相関性がなくバラバラ → 識別力aaは低い項目

IRTモデルの仮定

主な仮定

  1. 一次元性 :能力は1次元で表せる

  2. 局所独立性θ\thetaで条件づけた下での項目間の独立性。尤度関数の構築のために仮定。

詳細:validation

一次元性

2PLMのように1次元の能力パラメータθ\thetaをもつモデルは、能力が1次元で表せることを仮定している。

データがこのモデルに合っているかどうかを確かめる必要がある

検証方法

スクリープロットを描き、第1主成分が突出して高ければ一次元性を満たすと判断する。厳密な判断基準はない。

Source
# ------------------------------
# サンプルデータの生成
# ------------------------------
import numpy as np
import pandas as pd

np.random.seed(42)

n_persons = 100
n_items = 10

# 能力θと項目困難度bを設定
theta = np.random.normal(0, 1, n_persons)
b = np.random.normal(0, 0.2, n_items)
a = np.random.normal(0, 0.1, n_items)

# 2PLMで応答を生成
prob = 1 / (1 + np.exp(- a * (theta[:, None] - b)))
responses = np.random.binomial(1, prob)

df = pd.DataFrame(responses, columns=[f"item_{i+1}" for i in range(n_items)])
# print(df.head())

# ------------------------------
# スクリープロット
# ------------------------------
import numpy as np
from ordinalcorr import hetcor

cor_matrix = hetcor(df)
eigenvalues, _ = np.linalg.eig(cor_matrix)
eigenvalues = np.sort(eigenvalues)[::-1]

import matplotlib.pyplot as plt
plt.figure(figsize=(4, 2))
plt.plot(range(1, len(eigenvalues) + 1), eigenvalues, 'o-', linewidth=2)
plt.title("Scree Plot")
plt.xlabel("Component Number")
plt.ylabel("Eigenvalue")
plt.xticks(range(1, len(eigenvalues) + 1))
plt.grid(True)
plt.show()
<Figure size 400x200 with 1 Axes>

局所独立性(local independence)

局所独立性(local independence) の定義は「能力θ\thetaの値を固定したもとで、各項目の反応uju_jは独立」というもの。

局所独立性が仮定される理由は2つある

  1. θ\thetaが反応傾向の変動要因だから

  2. 尤度関数が作りやすいから

1. θ\thetaが反応傾向の変動要因だから

IRTモデルでは、各項目への反応傾向(正答率)uju_{j}が変化する要因はθ\thetaであると仮定して項目反応曲線をモデリングしている。

θ\thetaが各項目の反応uju_jに影響しているため、θ\thetaが反応同士uj,ulu_j, u_lの疑似相関corr(uj,ul)corr(u_j, u_l)を起こす第3の変数(交絡因子)になっている状態。しかしθ\thetaの値を固定する(統制する)と、この疑似相関は消えるはず。

もしθ\theta以外にuju_jに影響を与える共通の要因(θ\theta以外の交絡因子)があるなら、局所独立性が満たされない。ということ。

Loading...

2. 尤度関数が作りやすいから

尤度関数(≒反応パターンの同時分布)を各項目の積

L(T,θU)=i=1Ij=1JPj(θiT)uij{1Pj(θiT)}1uij\begin{aligned} L(\mathbf{T}, \boldsymbol{\theta} \mid \mathbf{U}) &=\prod_{i=1}^I \prod_{j=1}^J P_j(\theta_i \mid \mathbf{T})^{u_{i j}} \cdot \{ 1 - P_j(\theta_i \mid \mathbf{T}) \} ^{1-u_{i j}} \end{aligned}

とするために、θ\thetaで条件づけた下での項目間の独立性を仮定している。 (なおT\mathbf{T}は項目パラメータ、uiju_{i j}は二値の反応、U\mathbf{U}は反応パターン行列、Pj(θiT)P_j(\theta_i \mid \mathbf{T})はICC)

局所独立性の正確な検証は難しいが、Q3Q_3統計量が参考によく用いられる。

Q3Q_3統計量は

  • θ\thetaによって項目間の相関関係が十分に説明されているとすれば、その影響を除去した残差得点同士の相関は0に近くなるはず

  • θ\theta以外に項目間に相関をもたらす要因がある場合はθ\thetaの影響を除いてもなお相関が残る

という考え方をとっている。

目安としては、「Q3>0.20Q_3 > 0.20の項目ペアは局所独立性の侵害を疑う必要がある」とされるが0.20も絶対の閾値ではない。

モデル

ii番目の被験者のjj番目の項目の値yijy_{ij}が二値{0,1}\{0, 1\}であるとする(例えば正解・不正解だったり、アンケートの「あてはまる」「あてはまらない」という2件法など)。

yijy_{ij}の背後には潜在的な能力の連続量θiR\theta_i \in \mathbb{R}が存在し、θi\theta_iが閾値bjb_jを超えていたら1、超えていなければ0が観測されるとする。つまりyijy_{ij}が以下のように決まるとする。

yij={0 if θi<bj1 if θibjy_{ij} = \begin{cases} 0 & \text{ if } \theta_i < b_j\\ 1 & \text{ if } \theta_i \geq b_j\\ \end{cases}

1パラメータ正規累積モデル

しかし、実際には被験者iiの体調や運(たまたま正解できた)などにより、常にこのようにきれいに正解・不正解が決まるわけではないと考えられる。こうした誤差を表すパラメータεijN(0,σε2)\varepsilon_{ij} \sim N(0, \sigma^2_{\varepsilon})も追加して

yij={0 if (θiεij)<bj1 if (θiεij)bjy_{ij} = \begin{cases} 0 & \text{ if } (\theta_i - \varepsilon_{ij}) < b_j\\ 1 & \text{ if } (\theta_i - \varepsilon_{ij}) \geq b_j\\ \end{cases}

とする。誤差が確率変数のため、yijy_{ij}のとる値も確率変数として考えることができるようになる。bjb_jを移項すると

yij={0 if (θiεijbj)<01 if (θiεijbj)0y_{ij} = \begin{cases} 0 & \text{ if } (\theta_i - \varepsilon_{ij} - b_j) < 0\\ 1 & \text{ if } (\theta_i - \varepsilon_{ij} - b_j) \geq 0\\ \end{cases}

となる。θiεijbjN(θibj,σε2)\theta_i - \varepsilon_{ij} - b_j \sim N(\theta_i - b_j, \sigma^2_{\varepsilon})である。 εij\varepsilon_{ij}を移項すれば

yij={0 if (θibj)<εij1 if (θibj)εijy_{ij} = \begin{cases} 0 & \text{ if } (\theta_i - b_j) < \varepsilon_{ij}\\ 1 & \text{ if } (\theta_i - b_j) \geq \varepsilon_{ij}\\ \end{cases}

でもあるので「yij=1y_{ij}=1となるのは誤差εij\varepsilon_{ij}θibj\theta_i - b_j以下のとき」とわかる。

仮にεij\varepsilon_{ij}が標準正規分布(σε2=1\sigma^2_{\varepsilon} = 1の正規分布)に従うならば、特性値θi\theta_iの人が項目jjに当てはまると回答する確率は

P(yij=1)=P(εijθibj)=(θibj)12πexp(z22)dz\begin{aligned} P(y_{ij} = 1) &= P(\varepsilon_{ij} \leq \theta_i - b_j)\\ &= \int_{-\infty}^{\left(\theta_i-b_j\right)} \frac{1}{\sqrt{2 \pi}} \exp \left(-\frac{z^2}{2}\right) d z \end{aligned}

となる(最後のは、εij\varepsilon_{ij}が従う標準正規分布のうち -\infty から θibjk\theta_i-b_j までの範囲の面積がP(εijθibj)P(\varepsilon_{ij} \leq \theta_i - b_j)ということ)。

Source
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
epsilon = np.linspace(-4, 4, 1000)
y = norm.pdf(epsilon)
fig, ax = plt.subplots(figsize=[4,2])
ax.plot(epsilon, y, 'k-')

c = 1

ax.fill_between(epsilon, y, where=(epsilon < c), color='blue', alpha=0.3, label=r'$P(y_{ij} = 1)$')
ax.fill_between(epsilon, y, where=(epsilon >= c), color='red', alpha=0.3, label=r'$P(y_{ij} = 0)$')
ax.axvline(x=c, color='grey', linestyle='--', label=r'$\theta_i - b_j$')
ax.set(
    title=r'$\varepsilon_{ij} \sim N(0, 1)$',
    xlabel=r"$\varepsilon_{ij}$",
    ylabel="density"
)
ax.legend()
ax.grid(True)
fig.show()
<Figure size 400x200 with 1 Axes>

2パラメータ正規累積モデル

σε2\sigma^2_{\varepsilon}が項目ごとに異なる場合を考える。σε2=1/aj\sigma^2_{\varepsilon}=1/a_jとすると、誤差の確率分布は

εijN(0,1aj)\varepsilon_{ij} \sim N\left(0, \frac{1}{a_j}\right)

となる。両辺をaja_j倍すると、ajεijN(0,1)a_j \varepsilon_{ij} \sim N(0, 1)と表すことができ、引き続き標準正規分布を使うことができる。そのためモデルはaia_iが追加され

P(yij=1)=P(ajεijθibj)=aj(θibj)12πexp(z22)dz\begin{aligned} P(y_{ij} = 1) &= P(a_j \varepsilon_{ij} \leq \theta_i - b_j)\\ &= \int_{-\infty}^{ a_j (\theta_i-b_j)} \frac{1}{\sqrt{2 \pi}} \exp \left(-\frac{z^2}{2}\right) d z \end{aligned}

となる。

Source
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
x = np.linspace(-4, 4, 1000)

fig, axes = plt.subplots(figsize=[8, 2], ncols=2)


a = 1
for beta in [-1, 0, 1]:
    axes[0].plot(x, norm.cdf(x, loc=beta, scale=1/a), label=r"$b$ = " + f"{beta}")
axes[0].set(xlabel=r"$\theta_i$", ylabel=r"$P(y_{ij} = 1)$", xticklabels=[], yticklabels=[])
axes[0].legend()
axes[0].grid(True)

beta = 0
for a in [0.5, 1, 2]:
    axes[1].plot(x, norm.cdf(x, loc=beta, scale=1/a), label=r"$a$ = " + f"{a}")
axes[1].set(xlabel=r"$\theta_i$", ylabel=r"$P(y_{ij} = 1)$", xticklabels=[], yticklabels=[])
axes[1].legend()
axes[1].grid(True)

fig.show()
<Figure size 800x200 with 2 Axes>

なお横軸にθi\theta_i、縦軸にP(yij=1)P(y_{ij}=1)をとったグラフは 項目特性曲線 (item characteristic curve: ICC) と呼ばれる。

項目パラメータの推定

主に2つのアプローチがある

  1. 能力パラメータθ\thetaと項目パラメータa,ba,bを同時に推定する方法(主に1PLM)

    • 最尤推定だと 同時最尤推定法(joint maximum likelihood estimation)

    • ベイズ推定だと 階層ベイズ推定法(hierarchical Bayes estimation)

  2. 能力パラメータθ\theta消去 して項目パラメータa,ba,bを推定する方法(基本こっちが使われる)

    • 最尤推定だと 周辺最尤推定法(marginal maximum likelihood estimation)

    • ベイズ推定だと 周辺ベイズ推定法(marginal Bayes estimation)

最尤推定法の場合、1~3PLMではEMアルゴリズムが多く(統計ソフトウェアでもデフォルト)、4PLMや多次元IRTモデルといった複雑なモデルではMHRM(Metropolis–Hastings Robbins–Monro)などが使われる

最尤推定法について

尤度関数は項目パラメータT\mathbf{T}、反応パターン行列U\mathbf{U}をもとに次のように表される

尤度関数
L(T,θU)=i=1IL(T,θiui)=i=1Ij=1JPj(θiT)uijQj(θiT)1uij\begin{aligned} L(\mathbf{T}, \boldsymbol{\theta} \mid \mathbf{U}) &=\prod_{i=1}^I L(\mathbf{T}, \theta_i \mid \mathbf{u}_i) \\ &=\prod_{i=1}^I \prod_{j=1}^J P_j(\theta_i \mid \mathbf{T})^{u_{i j}} Q_j(\theta_i \mid \mathbf{T})^{1-u_{i j}} \end{aligned}

同時最尤推定法

以下の手順で解く。

  1. パラメータの初期値を与える

  2. θ\mathbf{\theta}を所与としてT\mathbf{T}を推定する

  3. T\mathbf{T}を所与としてθ\mathbf{\theta}を推定する

  4. 2.と3.を収束するまで繰り返す

同時最尤推定法は1PLMでは十分機能するが、2PLM以上の複雑なモデルだと解が収束しないことがあったり、項目パラメータが一致性をもたないなどの問題がある。そのため、実際に多くのIRTソフトウェア(IRTPRO, BILOG-MG, ICLなど)で用いられているのは周辺最尤推定法である。

周辺最尤推定法

Bock & Lieberman (1970)が提案した 周辺最尤推定法(marginal likelihood estimation) では尤度関数から θ\thetaを積分消去 した尤度関数(周辺尤度関数)を使用して項目パラメータを求める。周辺尤度関数LML_Mは次のように定義される。

LM(TU)=i=1IL(T,θiui)f(θi)dθi=i=1I{j=1JPj(θi)uijQj(θi)1uij}f(θi)dθi\begin{aligned} L_M(\mathbf{T} \mid \mathbf{U}) & =\prod_{i=1}^I \int_{-\infty}^{\infty} L(\mathbf{T}, \theta_i \mid \mathbf{u}_i) f(\theta_i) d \theta_i \\ & =\prod_{i=1}^I \int_{-\infty}^{\infty} \left \{\prod_{j=1}^J P_j(\theta_i)^{u_{i j}} Q_j(\theta_i)^{1-u_{i j}} \right\} f(\theta_i) d \theta_i \end{aligned}

ここでf(θi)f(\theta_i)はあらかじめ定めたθ\thetaの母集団分布(事前分布)であり、通常は標準正規分布N(0,1)\mathcal{N}(0,1)が用いられる。 θ\thetaに分布を仮定して期待値をとることでθ\thetaを除去している。

しかし、周辺尤度の対数をとった対数周辺尤度関数

lnLM(TU)=i=1Iln{L(T,θiui)f(θi)dθi}\ln L_M(\mathbf{T} \mid \mathbf{U})=\sum_{i=1}^I \ln \left\{\int_{-\infty}^{\infty} L\left(\mathbf{T}, \theta_i \mid \mathbf{u}_i\right) f\left(\theta_i\right) d \theta_i\right\}

を使ってのパラメータ推定は計算が難しかった。 そこでBock & Aitkin (1981)が EMアルゴリズム (Dempster et al., 1977)の利用を提案した。

EMアルゴリズム

対数周辺尤度関数のうち積分の対象となっている関数

LC(Tui,θi)=L(T,θiui)f(θi)L_C(\mathbf{T} \mid \mathbf{u}_i, \theta_i)=L(\mathbf{T}, \theta_i \mid \mathbf{u}_i) f(\theta_i)

は項目パラメータが与えられたときの反応ui\mathbf{u}_iと能力パラメータθi\theta_iの同時確率分布を表している。仮に、U\mathbf{U}に加えて θ\boldsymbol{\theta}も既知である とするなら、項目パラメータに関してのみ最大化すればいいのでLC(Tui,θi)L_C(\mathbf{T} \mid \mathbf{u}_i, \theta_i)を全受験者について積をとった

LC(TU,θ)=i=1ILC(Tui,θi)L_C(\mathbf{T} \mid \mathbf{U}, \boldsymbol{\theta})=\prod_{i=1}^I L_C(\mathbf{T} \mid \mathbf{u}_i, \theta_i)

を最大化して最尤推定値を得ることができる。このように考えたとき、LC(TU,θ)L_C(\mathbf{T} \mid \mathbf{U}, \boldsymbol{\theta})完全データ尤度関数(complete data likelihood function) といい、その対数をとった

(TU,θ)=lnLC(TU,θ)=i=1IlnLC(Tui,θi)\begin{aligned} \ell(\mathbf{T} \mid \mathbf{U}, \boldsymbol{\theta}) &= \ln L_C(\mathbf{T} \mid \mathbf{U}, \boldsymbol{\theta}) \\ &=\sum_{i=1}^I \ln L_C\left(\mathbf{T} \mid \mathbf{u}_i, \theta_i\right) \end{aligned}

対数完全データ尤度関数(log complete data likelihood function) という。

θ\boldsymbol{\theta}は実際には未知であるため、EMアルゴリズムでは対数完全データ尤度関数のθ\boldsymbol{\theta}に関する期待値をもとめて尤度関数からθ\boldsymbol{\theta}を消去する(このステップはexpectationの頭文字をとって Eステップ と呼ばれる)。そして項目パラメータT\mathbf{T}を最尤推定して求める(maximizationの頭文字を取って Mステップ という)。EMアルゴリズムではEステップとMステップを交互に繰り返す。

E-step (expectation step)

E-step では、項目パラメータの現在の推定値Told\mathbf{T}^{\text{old}}とデータで条件づけた能力パラメータθ\thetaの条件付き分布f(θU,Told)f(\theta \mid \mathbf{U}, \mathbf{T}^{\text{old}}) と完全データ対数尤度 lnLC(TU,θ)\ln L_C(\mathbf{T} \mid \mathbf{U}, \boldsymbol{\theta}) を用いて、

Q(TTold)=Eθ[lnLC(TU,θ)]=lnLC(TU,θ)f(θU,Told)dθ\begin{aligned} Q(\mathbf{T}\mid \mathbf{T}^{\text{old}}) &= \operatorname{E}_{\theta} \big[ \ln L_C(\mathbf{T} \mid \mathbf{U}, \boldsymbol{\theta}) \big]\\ &= \int_{-\infty}^{\infty} \ln L_C(\mathbf{T} \mid \mathbf{U}, \boldsymbol{\theta}) f(\theta \mid \mathbf{U}, \mathbf{T}^{\text{old}}) d \theta \end{aligned}

という計算を行う。この積分計算はGauss–Hermiteなどの数値積分法で近似される。

M-step (maximization step)

Q(TTold)Q(\mathbf{T}\mid \mathbf{T}^{\text{old}})を最大化するパラメータTnew\mathbf{T}^{\text{new}}を求める

Tnew:=arg maxTQ(TTold)\mathbf{T}^{\text{new}} := \operatorname*{\text{arg max}}_{\mathbf{T}} Q(\mathbf{T}\mid \mathbf{T}^{\text{old}})

Tnew\mathbf{T}^{\text{new}}は次のE-stepでのTold\mathbf{T}^{\text{old}}となる。収束基準が満たされるまで、E-stepとM-stepを繰り返す

能力パラメータの推定

最尤推定法による推定

例として2PLMを考え、項目パラメータa,ba,bが既知であり、θ\thetaを推定したい場合であるとする。

局所独立性の仮定のもとで、受験者iiの能力値θi\theta_iのもとでの項目反応ui\mathbf{u}_iの同時分布は

P(uiθi)=j=1JPj(θi)uijQj(θi)1uijP(\mathbf{u}_i \mid \theta_i)=\prod_{j=1}^J P_j(\theta_i)^{u_{i j}} Q_j(\theta_i)^{1-u_{i j}}

となる。ここでPj(θi)P_j(\theta_i)は能力値θi\theta_iの受験者が項目jjに正答する確率であり、2PLMのICC

Pj(θ)=11+exp(1.7aj(θbj)),<θ<P_j(\theta)=\frac{1}{1+\exp \left(-1.7 a_j\left(\theta-b_j\right)\right)}, \quad-\infty<\theta<\infty

で表現される。Qj(θi)Q_j(\theta_i)は誤答する確率であり、Qj(θi):=1Pj(θi)Q_j(\theta_i):= 1 - P_j(\theta_i)である。

項目反応が既知であればP(uiθi)P(\mathbf{u}_i \mid \theta_i)は尤度L(θiui)L(\theta_i \mid \mathbf{u}_i)となる。

例:mirtパッケージに実装された様々なパラメータ推定法

Rのmirtパッケージは多次元IRTモデルも推定可能で、モダンなパラメータ推定方法も実装されている

mirt()関数のドキュメントを見るとmethodの欄に色々書いてある

1~3次元IRTまではEMで足りる様子。

The ‘EM’ is generally effective with 1-3 factors, but methods such as the ‘QMCEM’, ‘MCEM’, ‘SEM’, or ‘MHRM’ should be used when the dimensions are 3 or more.

References
  1. Cai, L. (2010). High-dimensional Exploratory Item Factor Analysis by A Metropolis–Hastings Robbins–Monro Algorithm. Psychometrika, 75(1), 33–57. 10.1007/s11336-009-9136-x