您看到的是一种称为收缩的现象,这是混合模型的基本属性;作为每个估计值的相对方差的函数,单个组估计值向整体平均值“缩小”。(虽然 CrossValidated 上的各种答案都讨论了收缩,但大多数都指的是套索或岭回归等技术;这个问题的答案提供了混合模型和其他收缩观点之间的联系。)
可以说收缩是可取的;它有时被称为借贷强度。特别是当我们每组的样本很少时,每组的单独估计将不如利用每个群体的一些汇集的估计精确。在贝叶斯或经验贝叶斯框架中,我们可以将人口水平分布视为群体水平估计的先验。当每组的信息量(样本大小/精度)变化很大时(例如,在人口非常少和非常大的区域的空间流行病学模型中),收缩估计特别有用/强大.
收缩属性应该适用于贝叶斯和常客拟合方法——方法之间的真正区别在于顶层(常客的“惩罚加权残差平方和”是贝叶斯在组级别的对数后验偏差...... ) 下图中显示lme4
和MCMCglmm
结果的主要区别在于,由于 MCMCglmm 使用随机算法,具有相同观察比例的不同组的估计值略有不同。
通过更多的工作,我认为我们可以通过比较组和整个数据集的二项式方差来计算出预期的精确收缩程度,但同时这里有一个演示(事实上 J=10 的情况看起来更少我认为比 J=20 缩小只是抽样变化)。(我不小心将模拟参数更改为均值 = 0.5,RE 标准偏差 = 0.7(在 logit 标度上)...)

library("lme4")
library("MCMCglmm")
##' @param I number of groups
##' @param J number of Bernoulli trials within each group
##' @param theta random effects standard deviation (logit scale)
##' @param beta intercept (logit scale)
simfun <- function(I=30,J=10,theta=0.7,beta=0,seed=NULL) {
if (!is.null(seed)) set.seed(seed)
ddd <- expand.grid(subject=factor(1:I),rep=1:J)
ddd <- transform(ddd,
result=suppressMessages(simulate(~1+(1|subject),
family=binomial,
newdata=ddd,
newparams=list(theta=theta,beta=beta))[[1]]))
}
sumfun <- function(ddd) {
fit <- glmer(result~(1|subject), data=ddd, family="binomial")
fit2 <- MCMCglmm(result~1,random=~subject, data=ddd,
family="categorical",verbose=FALSE,
pr=TRUE)
res <- data.frame(
props=with(ddd,tapply(result,list(subject),mean)),
lme4=plogis(coef(fit)$subject[,1]),
MCMCglmm=plogis(colMeans(fit2$Sol[,-1])))
return(res)
}
set.seed(101)
res <- do.call(rbind,
lapply(c(10,20,50,100,500),
function(J) {
data.frame(J=J,sumfun(simfun(J=J)))
}))
library("reshape2")
m <- melt(res,id.vars=c("J","props"))
library("ggplot2"); theme_set(theme_bw())
ggplot(m,aes(props,value))+
geom_point(aes(colour=factor(J),shape=variable))+
geom_abline(intercept=0,slope=1,colour="gray")+
labs(x="observed proportion",y="estimate")
ggsave("shrinkage.png",width=5,height=5)