如何使用随机效应进行逐步模型(lme4 + lmerTest?)

Mar*_*nse 5 mixed r lme4 lmertest

我正在尝试执行具有随机效应的逐步模型,其中我可以获得 BIC 值。

lmerTest 包说它适用于 lme4,但只有从模型中删除我的一个自变量(这是一个具有两个选项 (TM) 的因素),我才能让它工作

错误代码是:

在错误$<-*tmp*,式中,值=条款):用于分配此S4类的子集的方法没有

或者

as_lmerModLmerTest(model) 中的错误:模型不属于“lmerMod”类:无法强制转换为“lmerModLmerTest”类

我在某处读过它可能与 drop1 有关,但我仍然没有弄清楚。我也愿意接受其他包和功能的建议。

之前,在尝试 full.model <- lm ( ... 一切正常。更改为 lmer 后,它不再起作用了。

我现在使用的代码:

full.model <- lme4::lmer(dep ~ TM + ind + (1 | dorp),  data=test)  #lmerTest:: give same outcome

step.model<- lmerTest::step(full.model, direction="both",k=log(16))   # n=16

summary(step.model)

BIC(step.model)
Run Code Online (Sandbox Code Playgroud)
#Example dataset

test <- data.frame(TM = as.factor(c(rep("org", 3), rep("min", 3),rep("org", 3), rep("min", 3),rep("org", 3), rep("min", 3))),
                   dep = runif(18,0,20),
                   ind = runif(18,0,7),
                   dorp = as.factor(c(rep(1,6),rep(2,6),rep(3,6))))

Run Code Online (Sandbox Code Playgroud)

Ben*_*ker 6

问题是,lmerTest::step.lmerModLmerTest当在随机效应选择阶段从模型中消除所有随机效应时,就会出现问题。它可能不应该(我认为该包的早期版本可能不应该),但解决起来并不难。您可以指定不应简化随机效应模型 ( step(full.model, reduce.random=FALSE)),或者,当您遇到此错误时,丢弃模型的随机效应分量,然后step()在生成的线性模型上使用:

fixmodel <- lm(formula(full.model,fixed.only=TRUE),
               data=eval(getCall(full.model)$data))
step(fixmodel)
Run Code Online (Sandbox Code Playgroud)

(因为它包含eval(),所以这仅在 R 可以找到参数引用的数据框的环境中有效data=)。

我已经提交了有关此问题的问题


此外(令人困惑),与包中的stats::step内容有不同的论点/做出不同的假设。定义为step.lmerModLmerTestlmerTeststats::step

step(object, scope, scale = 0,
     direction = c("both", "backward", "forward"),
     trace = 1, keep = NULL, steps = 1000, k = 2, ...)
Run Code Online (Sandbox Code Playgroud)

同时step.lmerModLmerTest使用

step(object, ddf = c("Satterthwaite",
  "Kenward-Roger"), alpha.random = 0.1, alpha.fixed = 0.05,
  reduce.fixed = TRUE, reduce.random = TRUE, keep, ...)
Run Code Online (Sandbox Code Playgroud)

特别是,该direction参数不适用(step.lmerModLmerTest仅进行向后消除);不是k(我相信step.lmerModLmerTest使用 AIC,但我必须仔细检查)。

set.seed(1001)
dd <- data.frame(x1=rnorm(500),x2=rnorm(500),
                 x3=rnorm(500),f=factor(rep(1:50,each=10)))
library(lme4)
dd$y <- simulate(~x1+x2+x3+(1|f),
                 newdata=dd,
                 newparams=list(theta=1,beta=c(1,2,0,0),
                                sigma=1),
                 family=gaussian)[[1]]
library(lmerTest)
full.model <- lmer(y~x1+x2+x3+(1|f), data=dd)
step.model<- step(full.model)
Run Code Online (Sandbox Code Playgroud)

step.model有课step_list;有打印方法,但没有摘要方法。

  • 我对非数字变量(簇变量)也有同样的问题。它是一个字符变量,这似乎不是使用 lmer() 进行模型估计的问题,而是 step() 的问题。当将其类更改为因子时,step() 函数对我来说效果很好。希望能帮助到你。 (2认同)