据我所知,您描述的是部分交叉的设计。好消息是,这是 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)
模型中的形式术语 - 但是,请注意这些拟合将花费更长的时间......