如何在ltm包中使用rasch函数将项目难度中心化至0?
问题:如何在ltm包中实现项目难度中心化至0而非被试能力中心化?
我正在使用ltm包从测试反应数据计算项目难度,具体代码如下:
model.1pl <- rasch(dfTestMatrix) # proportion correct (PC) dfPC <- data.frame(colnames(model.1pl$X), summary$perc) %>% dplyr::select(uiid = "colnames.model.1pl.X.", PC = "X1") # item difficulties dfItemParams <- data.frame(coef(model.1pl, prob = FALSE)) dfItemBank <- data.frame(colnames(model.1pl$X), dfItemParams$Dffclt, dfItemParams$Dscrmn) %>% rename(uiid="colnames.model.1pl.X.", b="dfItemParams.Dffclt", a="dfItemParams.Dscrmn") # compare difficulties and proportions correct dfItemDetails <- merge(dfItemBank, dfPC, by = "uiid", all = TRUE)
我希望将项目难度中心化至0,而非默认的被试能力中心化,但不清楚如何通过ltm包实现,查阅文档也未找到方法。运行上述代码后,我发现当前结果是被试能力被中心化了,请问是否有可行的实现方式?
解决方案
ltm包的rasch()函数默认将被试能力(θ)的均值固定为0,没有直接参数支持切换为项目难度(b)中心化到0,但可以通过手动调整参数实现——Rasch模型的识别条件仅要求θ和b的均值其中一个为0,调整其中一方时对应反向调整另一方即可保持模型拟合。
具体步骤及代码修改如下:
# 拟合默认Rasch模型(被试能力中心化) model.1pl <- rasch(dfTestMatrix) # 获取原始项目参数 dfItemParams <- data.frame(coef(model.1pl, prob = FALSE)) original_b <- dfItemParams$Dffclt # 计算原始难度参数的均值 b_mean <- mean(original_b) # 将难度中心化至0,同时调整被试能力以保持模型一致性 centered_b <- original_b - b_mean adjusted_theta <- model.1pl$scores[, 1] + b_mean # 原被试能力均值为0,加回难度均值完成调整 # 更新项目参数数据框 dfItemBank <- data.frame( uiid = colnames(model.1pl$X), b = centered_b, a = dfItemParams$Dscrmn # 1PL模型中区分度固定为1,无需调整 ) # 比例正确率计算及合并逻辑保持不变 dfPC <- data.frame(colnames(model.1pl$X), summary(model.1pl)$perc) %>% dplyr::select(uiid = "colnames.model.1pl.X.", PC = "X1") dfItemDetails <- merge(dfItemBank, dfPC, by = "uiid", all = TRUE)
关键说明
- 调整后项目难度的均值为0,被试能力的均值变为原来的难度均值,模型的拟合效果和项目特征曲线与原模型完全一致,仅参数参照点发生变化。
- 若需要后续使用调整后的被试能力,直接使用
adjusted_theta即可。
内容的提问来源于stack exchange,提问作者James Page
相关产品推荐
相关产品推荐

