第 12 章 评估应试者的能力
根据项目反应理论,对考生进行测试的主要目的是在能力量表上定位该人。如果每个参加测试的考生获得这样的能力度量,则可以根据考生拥有多少潜在能力来对其进行评估,比较等。
12.1 能力 \(\theta\) 估计方法
若用于测量潜在特征(latent trait)的测试将由 \(J\) 个项目组成,且每个项目都测量该特征的某些方面。为了估计考生的能力\(\theta\),假设测试项目的参数已知,进行测试时,考生将对测试中的 \(J\) 个项目中的每一个做出回答,并以二分法计分。
根据项目反应理论,采用最大似然法估计考生的能力\(\theta\),双参数模型能力估计方程如下: \[\hat{\theta}_{s+1}=\hat{\theta}_{s}-\frac{\sum_{j=1}^{J} a_{j}\left[u_{j}-P_{j}\left(\hat{\theta}_{s}\right)\right]}{-\sum_{j=1}^{J} a_{j}^{2} P_{j}\left(\hat{\theta}_{s}\right) Q_{j}\left(\hat{\theta}_{s}\right)} \tag1\] 其中, \(\hat{\theta}_{s}\)为考生在第\(s\)次迭代内的估计能力; \(a_{j}\)为项目第\(j\)个项目的项目区分度参数; \(u_{j}\)是考生对项目 \(j\) 的回答,正确响应时\(u_{j}=1\),错误响应时\(u_{j}=0\); \(P_{j}(\hat{\theta}_{s})\)是在第\(s\)次迭代内,给定ICC曲线参数和; \(\hat{\theta_{s}}\)是正确响应项目 \(j\) 的概率,\(Q_{j}(\hat{\theta}_{s})=1-P_{j}(\hat{\theta}_{s})\)为做出错误响应的概率。
计算过程: 开始时,根据经验,设置初始值,如\(\hat{\theta}_{s} = 1\)。在该能力水平下,使用已知项目参数计算测试中每个项目的正确响应概率。然后计算等号右边的第二项(记为\(\Delta \hat{\theta}_{s}\)), 即 \(\hat{\theta}_{s+1}=\hat{\theta}_{s}-\Delta \hat{\theta}_{s}\)
假设一个测试包含3个项目,即\(J=3\),每个项目参数(双参模型): \[b_1=-1.0\quad b_2=0.0\quad b_3=1.0 \\ a_1=-1.0\quad a_2=1.2\quad a_3=0.8\] 考生的项目反应 \(u_1=1, u_2=0, u_3=1\) 考生能力的先验估计 \(\hat{\theta_{s}}=1.0\)。将这些值代入双参模型:
\[ P_{j}\left(\hat{\theta}_{s}\right)=\frac{1}{1+\exp \left[-a_{j}\left(\hat{\theta}_{s}-b_{j}\right)\right]} \]
第一次迭代:
\(\Delta \hat{\theta}_{s}=-0.4030 /(-0.5212)=0.7733, \quad \hat{\theta}_{s+1}=1.0-0.7733=0.2267\)
第二次迭代:
\(\Delta \hat{\theta}_{s}=0.0656 /(-0.6744)=-0.0972, \quad \hat{\theta}_{s+1}=0.2267-(-0.0972)=0.3239\)
第三次迭代:
\(\Delta \hat{\theta}_{s}=0.0006 /(-0.6616)=-0.0009, \quad \hat{\theta}_{s+1}=0.3239-(-0.0009)=0.3248\)
此时,\(\Delta \hat{\theta}_{s}=0.0009\)非常小,停止迭代,考生的能力估计值 \(\hat{\theta}= 0.32\)
考生实际的能力无法计算,只能进行估计,计算其误差。其基本原则是,假设考生可以多次参加相同的考试,且不记得以前的考试项目是如何作答,每次测试获得能力估计为\(\hat{\theta}\),考生能力的标准误(standard error): \[\operatorname{SE}(\hat{\theta})=\frac{1}{\sqrt{\sum_{j=1}^{J} a_{j}^{2} P_{j}(\hat{\theta}) Q_{j}(\hat{\theta})}} \tag2\]
上述例子中,\(\mathrm{SE}(\hat{\theta}=0.32)=1 / \sqrt{0.6616}=1.229446\) 准误差 1.23 非常大,因此无法非常准确地估计考生的能力。这里主要是因为这里只使用了三个项目。
此外在两种情况下,最大似然法无法产生有效的能力估计。首先,当考生没有答对任何一个项目时,相应的能力估计是负无穷大。二、当一个考生答对所有试题时,对应的能力估计值为正无穷大。在这两种情况下,都不可能获得对考生能力的估计,此情况需要单独处理。
12.2 考生能力估计的项目不变性 Item Invariance of an Examinee’s Ability Estimate
ICC曲线能横跨整个能力尺度,且能力量表的任意一个子区间都可以用于项目参数估计(项参数的组不变性),ICC曲线的对应段都可用来估计一个考生的能力。因此,在IRT中考生的能力相对于用来测量它的项目是固定不变的,即考生能力估计的项目不变性( Item Invariance of an Examinee’s Ability Estimate)。但需注意,其不变性要满足两个条件: 所有项目都测量相同的潜在特征;所有项目参数使用公共度量(common metric)。
由于考生能力估计的项目不变性,位于能力量表上任何位置的测试都可以用来估计应试者的能力,考生参加“简单”或“困难”的考试,都能获得相同的能力估计。而在经典考试理论中,考生会在简单的考试中获得高分,在困难的考试中得低分,无法确定考生的潜在能力。
需注意“能力固定不变”中关于“固定”一词的含义。考生的能力只有在特定情境下,且具有特定价值的情况下才是固定的。例如,一个考生多次参加同一个测试,只有假定考生不记得这些测试的作答时,能力才是“固定”的。但是,若考生在两次测试之间接受了辅导能力进步,或存在遗留效应,那么在每次测试中考生的潜在能力水平都会有所不同。
考生能力的项目不变性和项目参数的组不变性是IRT不变性原理的两个方面,该原理是IRT的许多实际应用的基础。
12.3 R语言示例
12.3.1 能力估计过程
前述计算过程R语言实现。
假设一次测验中包含3个,且项目参数(双参)已知。
# 示例
u <- c(1, 0, 1) # 考生作答
b <- c(-1.0, 0.0, 1.0) # 项目难度
a <- c(1.0, 1.2, 0.8) # 项目区分度
th <- 1.0 # 初始能力
J <- length(b) # 项目数
S <- 10 # 迭代次数
ccrit <- 0.001 # 迭代收敛
for (s in 1:S) {
sumnum <- 0.0
sumdem <- 0.0
# 公式1 迭代计算theta
for (j in 1:J) {
phat <- 1 / (1 + exp(-a[j] * (th - b[j])))
sumnum <- sumnum + a[j] * (u[j] - phat)
sumdem <- sumdem - a[j]**2 * phat * (1.0 - phat)
}
delta <- sumnum / sumdem
th <- th - delta
cat(paste("th=", th, "\n"))
if (abs(delta) < ccrit | s == S) {
se <- 1 / sqrt(-sumdem) # 公式2 计算标准差
cat(paste("se=", se, "\n"))
break
}
}
th= 0.226675883845771
th= 0.323936590129193
th= 0.324846185533961
se= 1.22944623655813
[1] 0.3248462
[1] 1.229446
12.3.2 能力参数估计R函数
R 函数估计能力参数,并计算标准误差。
- ablility(mdl, u, b, a, c)
- md1: 模型类别
- u: 考生作答情况(二分计分 0,1)
- b: 各项目难度向量
- a: 各项目区分度向量
- c: 各项目猜对概率向量
ability <- function(mdl, u, b, a, c) {
J <- length(b)
if (mdl == 1 | mdl == 2 | missing(c)) {
c <- rep(0, J)
}
if (mdl == 1 | missing(a)) { a <- rep(1, J) }
x <- sum(u)
# 处理作答全对或全错情况,无标准的普遍方案
# 还可采用 -log(2J-1) log(2J-1)
if (x == 0) {
th <- -log(2 * J)
}
if (x == J) {
th <- log(2 * J)
}
if (x == 0 | x == J) {
sumdem <- 0.0
for (j in 1:J) {
pstar <- 1 / (1 + exp(-a[j] * (th - b[j])))
phat <- c[j] + (1.0 - c[j]) * pstar
sumdem <- sumdem - a[j]**2 * phat * (1.0 - phat) *
(pstar / phat)**2
}
se <- 1 / sqrt(-sumdem)
}
if (x != 0 & x != J) {
th <- log(x / (J - x)) # 能力值初始化
S <- 10
ccrit <- 0.001
for (s in 1:S) {
sumnum <- 0.0
sumdem <- 0.0
for (j in 1:J) {
pstar <- 1 / (1 + exp(-a[j] * (th - b[j])))
phat <- c[j] + (1.0 - c[j]) * pstar
# 能力估计方程,当为单或双参模型时pstar=phat,即为公式1)
sumnum <- sumnum + a[j] * (u[j] - phat) *
(pstar / phat)
sumdem <- sumdem - a[j]**2 * phat * (1.0 - phat) *
(pstar / phat)**2
}
delta <- sumnum / sumdem
th <- th - delta
if (abs(delta) < ccrit | s == S) {
se <- 1 / sqrt(-sumdem)
break
}
}
}
cat(paste("th=", th, "\n")); flush.console()
cat(paste("se=", se, "\n")); flush.console()
thse <- c(th, se)
return(thse)
}
u <- c(1, 0, 1)
b <- c(-1.0, 0.0, 1.0)
a <- c(1.0, 1.2, 0.8)
ability(2, u, b, a)
th= 0.324846275728124
se= 1.2295613112834
[1] 0.3248463 1.2295613
12.4 能力估计的抽样变异性
下示例用于说明当同一测试进行多次时,考生的能力估计的抽样变异性。
假设模型、项目参数和能力参数已知。
mdl <- 2
theta <- 0.5 # 随机给定一个能力值 rnorm(1, 0, 1)
b <- c(-0.5, -0.25, 0.0, 0.25, 0.5)
a <- c(1.0, 1.5, 0.7, 0.6, 1.8) # 同一测验,且项目参数b,a已知
J <- length(b)
if (mdl == 1 | mdl == 2) { c <- rep(0, J) }
if (mdl == 1) { a <- rep(1, J) }
sumdemt <- 0.0
for (j in 1:J) {
Pstar <- 1 / (1 + exp(-a[j] * (theta - b[j])))
P <- c[j] + (1 - c[j]) * Pstar
sumdemt <- sumdemt - a[j]**2 * P * (1.0 - P) *
(Pstar / P)**2
}
set <- 1 / sqrt(-sumdemt) # 理论标准误
# 测试10次,假定考生不记得每一次作答
R <- 10
thr <- rep(0, R) # 重复测试的能力估计
ser <- rep(0, R) # 重复测试的标准误
for (r in 1:R) {
u <- rep(0, J)
# 根据参数随机生成项目响应向量
for (j in 1:J) {
P <- c[j] + (1 - c[j]) /
(1 + exp(-a[j] * (theta - b[j])))
u[j] <- rbinom(1, 1, P)
}
thse <- ability(mdl, u, b, a, c) # 能力参数估计ablility()函数
thr[r] <- thse[1]
ser[r] <- thse[2]
}
th= -1.30702474484631
se= 1.10435953751303
th= 1.05473681387911
se= 0.90623356609621
th= 0.262224626532964
se= 0.76935937888796
th= -0.28741764210042
se= 0.809252372567874
th= 2.30258509299405
se= 1.69354677428117
th= 0.262224626532964
se= 0.76935937888796
th= 2.30258509299405
se= 1.69354677428117
th= -0.641004361672664
se= 0.879637416512356
th= -0.0971554497517839
se= 0.785336975693255
th= -1.74019871235214
se= 1.31658360513145
[1] 0.5
[1] 0.7829669
[1] -1.30702474 1.05473681 0.26222463 -0.28741764 2.30258509 0.26222463
[7] 2.30258509 -0.64100436 -0.09715545 -1.74019871
[1] 0.2111555
[1] 1.1043595 0.9062336 0.7693594 0.8092524 1.6935468 0.7693594 1.6935468
[8] 0.8796374 0.7853370 1.3165836
[1] 1.072722
12.5 考生能力的项目不变性
模拟对给定的考生进行多次不同的测试,用以说明能力估计应该集中在考生实际能力附近。
假设考生实际能力参数和测试项目数已知,每个项目参数随机生成,并利用这些参数生成项目响应向量。
mdl <- 2
theta <- 0.5
J <- 30
R <- 10 # 模拟测试次数
thr <- rep(0, R)
ser <- rep(0, R)
for (r in 1:R) {
# 随机项目参数
# b <- round(runif(J,-3,3), 2)
# a <- round(runif(J,0.2,2.8), 2)
# c <- round(runif(J,0,.35), 2)
b <- rnorm(J, 0, 1)
a <- rlnorm(J, 0, 0.25)
c <- rbeta(J, 401, 1601)
if (mdl == 1 | mdl == 2) { c <- rep(0, J) }
if (mdl == 1) { a <- rep(1, J) }
# 根据项目参数模拟项目响应向量
u <- rep(0, J)
for (j in 1:J) {
P <- c[j] + (1 - c[j]) /
(1 + exp(-a[j] * (theta - b[j])))
u[j] <- rbinom(1, 1, P)
}
thse <- ability(mdl, u, b, a, c)
thr[r] <- thse[1]
ser[r] <- thse[2]
}
th= 1.11588353495085
se= 0.448750097957961
th= 0.734420163975072
se= 0.398887627607359
th= 0.807175135527344
se= 0.433936412283098
th= 1.40739763541249
se= 0.470269690275539
th= 0.628601548826526
se= 0.405080331050569
th= 0.989816261034184
se= 0.416365853817401
th= -0.0192993483804716
se= 0.377837894203677
th= -0.0357680479025388
se= 0.365747643320322
th= 0.751868585775706
se= 0.438822229817308
th= 0.976798547635693
se= 0.43923583943367
[1] 0.5
[1] 1.11588353 0.73442016 0.80717514 1.40739764 0.62860155 0.98981626
[7] -0.01929935 -0.03576805 0.75186859 0.97679855
[1] 0.7356894