分析部分交叉的设计

机器算法验证 r lme4-nlme 多层次分析 心理测量学 项目反应理论
2022-03-25 12:23:21

我有一个测试数据集(见下文)。评分算法给每个项目 ( item_id) 一个分数 ( y),该分数从01(就像概率一样,越高越正确)。问题是,出于测试安全的原因,项目池非常庞大,因此项目暴露的并不多。

结果,只有少数完全相同的项目被分配给100应试者 ( person_id),因此这是一个部分交叉的设计在这个数据集中,有16004unique item_ids 但只有2000应试者。仅有的11项目已被雇用超过100次,和5超过200次,和4超过300次。

我想知道什么建模框架可以告诉我每个项目的项目难度,在IRT Rasch 模型意义上,在这个测试中?

我非常感谢R演示。

dat <- read.csv('https://raw.githubusercontent.com/ilzl/i/master/d.csv')

tab <- table(dat$item_id)
sapply(1:3*1e2, function(i) length(tab[tab >= i])) # items nested within 100-300 'person_id's
# > [1] 11  5  4
1个回答

据我所知,您描述的是部分交叉的设计。好消息是,这是 Doug Bates 的主要开发目标之一lme4:有效拟合大型、部分交叉的线性混合模型。 免责声明:我对 Rasch 模型知之甚少,也不知道像这样的部分嵌套模型与它有多接近:从本文的简要介绍来看,它似乎非常接近。

一些通用的数据检查和探索:

dat <- read.csv('https://raw.githubusercontent.com/ilzl/i/master/d.csv')
plot(tt_item <- table(dat$item_id))
plot(tt_person <- table(dat$person_id))
table(tt_person)
tt <- with(dat,table(item_id,person_id))
table(tt)

确认 (1) 项目具有高度可变的计数;(2) 人有21-32个计数;(3) person:item 组合从不重复。

检查交叉结构:

library(lme4)
## run lmer without fitting (optimizer=NULL)
form <- y ~ item_type + (1| item_id) + (1 | person_id)
f0 <-  lmer(form,
              data = dat,
        control=lmerControl(optimizer=NULL))

查看随机效应模型矩阵:

image(getME(f0,"Zt"))

在此处输入图像描述

下面的对角线代表人员的指示变量:上面的东西是物品。相当均匀的填充证实了物品与人的组合没有特定的模式。

重新做模型,这次实际拟合:

system.time(f1 <- update(f0, control=lmerControl(), verbose=TRUE))

这在我的(中等功率)笔记本电脑上大约需要 140 秒。检查诊断图:

plot(f1,pch=".", type=c("p","smooth"), col.line="red")

在此处输入图像描述

和比例位置图:

 plot(f1,sqrt(abs(resid(.)))~fitted(.),
     pch=".", type=c("p","smooth"), col.line="red")

在此处输入图像描述

所以这里似乎确实存在一些非线性和异方差性问题。

如果您想以更合适的方式拟合 (0,1) 值(并且可能处理非线性和异方差问题),您可以尝试混合 Beta 回归:

library(glmmTMB)
system.time(f2 <-  glmmTMB(form,
              data = dat,
              family=beta_family()))

这比较慢(~1000 秒)。

诊断(我在这里跳了几圈来处理glmmTMB'sresiduals()功能的一些缓慢问题。)

system.time(f2_fitted < predict(f2, type="response", se.fit=FALSE))
v <- family(f2)$variance
resid <- (f2_fitted-dat$y)/sqrt(v(f2_fitted))  ## Pearson residuals
f2_diag <- data.frame(fitted=f2_fitted, resid)
g1 <- mgcv::gam(resid ~ s(fitted, bs ="cs"), data=f2_diag)
xvec <- seq(0,1, length.out=201)
plot(resid~fitted, pch=".", data=f2_diag)
lines(xvec, predict(g1,newdata=data.frame(fitted=xvec)), col=2,lwd=2)

在此处输入图像描述

比例位置图:

g2 <- mgcv::gam(sqrt(abs(resid)) ~ s(fitted, bs ="cs"), data=f2_diag)
plot(sqrt(abs(resid))~fitted, pch=".", data=f2_diag)
lines(xvec, predict(g2,newdata=data.frame(fitted=xvec)), col=2,lwd=2)

在此处输入图像描述

还有几个问题/评论:

  • ranef()方法将检索随机效应,代表项目的相对难度(和人的相对技能)
  • 您可能想担心剩余的非线性和异方差性,但我没有立即看到简单的选择(欢迎评论者的建议)
  • 添加其他协变量(例如性别)可能有助于模式或改变结果......
  • 这不是“最大”模型(参见 Barr et al 2013:即,由于每个人都有多种项目类型,您可能需要(item_type|person_id)模型中的形式术语 - 但是,请注意这些拟合将花费更长的时间......