计算标准偏差(或系数的方差)本质上意味着获得每个级别的固定效应估计值(类似于混合模型中的 BLUP/条件模式)并计算它们的方差。您可以通过将对比度适当地设置为contr.sum(总和为零的对比度)来做到这一点(在这种情况下,您仍然必须重建一个级别的值,因为该模型只会拟合n-1具有截距的模型中的系数),并且/或在模型中适当使用-1或+0在模型中拟合无截距模型,其中为每个级别计算系数。predict或者,如下所示,您可以通过(或例如通过包)使用蛮力lsmeans来计算每个级别的值......
仅使用两个水平的 RE 分组变量组成数据:
dd <- expand.grid(f1=factor(1:3),f2=factor(1:2),rep=1:10)
library(lme4)
simList <-
suppressMessages(simulate(~f1+(1|f2),
newdata=dd,
family="gaussian",
newparams=list(theta=1,beta=c(0,1,2),sigma=1),
seed=101,n=500))
作为f2随机效应拟合并检索估计方差:
sumfun1 <- function(y0) {
m <- lmer(y~f1+(1|f2),data=transform(dd,y=y0))
unlist(VarCorr(m))
}
library(plyr)
r1 <- laply(simList,sumfun1,.progress="text")
考虑到很少的级别,这实际上工作得非常好:
mean(r1) ## 0.98
confint(lm(r1~1))
## 2.5 % 97.5 %
## (Intercept) 0.9248779 1.189029
但是我们经常得到方差的零估计:
sum(r1==0) ## 60
(以及一些非常小的值)
sum(log10(r1)<(-6)) ## 69
现在通过固定效果试试:
sumfun2 <- function(y0) {
lm1 <- lm(y~f1+f2,data=transform(dd,y=y0))
pframe <- data.frame(f1="1",f2=levels(dd$f2))
var(predict(lm1,newdata=pframe))
}
r2 <- laply(simList,sumfun2,.progress="text")
mean(r2) ## 1.01294
confint(lm(r2~1))
## 2.5 % 97.5 %
## (Intercept) 0.89081 1.135071
r1[log10(r1)< (-6)] <- 1e-6
p0 <- rbind(data.frame(m="f1=random",r=r1),
data.frame(m="f1=fixed",r=r2))
library(ggplot2); theme_set(theme_bw())
ggplot(p0,aes(x=log10(r),fill=m))+
geom_histogram(alpha=0.5,position="identity")+
geom_vline(xintercept=0,lty=2)

固定效应方法实际上比我预期的效果更好......