一般来说,我会说refit=FALSE
在这种情况下使用它是合适的,但让我们继续尝试模拟实验。
首先将没有随机斜率的模型拟合到sleepstudy
数据集,然后模拟来自该模型的数据:
library(lme4)
mod0 <- lmer(Reaction ~ Days + (1|Subject), data=sleepstudy)
## also fit the full model for later use
mod1 <- lmer(Reaction ~ Days + (Days|Subject), data=sleepstudy)
set.seed(101)
simdat <- simulate(mod0,1000)
现在用完整模型和缩减模型重新拟合空数据,并保存由anova()
with 和 without生成的 p 值分布refit=FALSE
。这本质上是零假设的参数引导测试;我们想看看它是否具有适当的特征(即 p 值的均匀分布)。
sumfun <- function(x) {
m0 <- refit(mod0,x)
m1 <- refit(mod1,x)
a_refit <- suppressMessages(anova(m0,m1)["m1","Pr(>Chisq)"])
a_no_refit <- anova(m0,m1,refit=FALSE)["m1","Pr(>Chisq)"]
c(refit=a_refit,no_refit=a_no_refit)
}
我喜欢plyr::laply
它的方便,尽管您可以轻松地使用for
循环或其他*apply
方法之一。
library(plyr)
pdist <- laply(simdat,sumfun,.progress="text")
library(ggplot2); theme_set(theme_bw())
library(reshape2)
ggplot(melt(pdist),aes(x=value,fill=Var2))+
geom_histogram(aes(y=..density..),
alpha=0.5,position="identity",binwidth=0.02)+
geom_hline(yintercept=1,lty=2)
ggsave("nullhist.png",height=4,width=5)
alpha=0.05 的 I 类错误率:
colMeans(pdist<0.05)
## refit no_refit
## 0.021 0.026
您可以看到,在这种情况下,这两个过程给出了几乎相同的答案,并且两个过程都非常保守,众所周知的原因与假设检验的零值位于其可行空间的边界这一事实有关。对于测试单个简单随机效应的特定情况,将 p 值减半给出了适当的答案(参见 Pinheiro 和 Bates 2000 等);这实际上似乎在这里给出了合理的答案,尽管它并不是真正合理的,因为我们在这里丢弃了两个随机效应参数(斜率的随机效应以及斜率和截距随机效应之间的相关性):
colMeans(pdist/2<0.05)
## refit no_refit
## 0.051 0.055
其他要点:
- 您可能可以使用包中的
PBmodcomp
功能进行类似的练习pbkrtest
。
- 该
RLRsim
软件包专为对随机效应项的零假设进行快速随机化(参数引导)测试而设计,但在这种稍微复杂的情况下似乎不起作用
- 有关类似信息,请参阅相关的GLMM 常见问题解答部分,包括为什么您可能根本不想测试随机效应的重要性的论点......
- 对于额外的信用,您可以使用偏差(-2 对数似然)差异而不是 p 值作为输出重做参数引导运行,并检查结果是否符合 a
chi^2_0
(点质量为 0)和chi^2_n
分布(其中可能是n
2 ,但我不确定这个几何)