【问题标题】:prediction for lmer-model with nested random effects具有嵌套随机效应的 lmer 模型的预测
【发布时间】:2020-02-03 11:56:20
【问题描述】:

我目前正在尝试帮助一位同事,但我根本找不到解决方案。所以我希望其他人可以帮助我们。

我有一个数据集,其中包含针对不同研究中不同物种的不同研究设计评估的体重数据(一项研究包括多个设计和多个物种)。我想研究权重和研究设计之间的关系,使用研究和物种作为嵌套随机效应。

模型看起来像这样并且运行良好:

m <- lmer(weight ~ design +(1|study/species), data=dataset)

我尝试对不同的物种进行预测,但进行了一项通用研究: 我创建了一个新的 data.table new.dt,其中包含原始数据集的独特设计物种组合,并为报告添加了一个列。

new.dt <- unique(dataset[,.(design, species))
new.dt$study <- "xyz"

然后我使用了预测功能并允许新的级别。

new.dt$p <- predict(m, newdata=new.dt, re.form= NULL, allow.new.levels=TRUE) 

我没有收到错误,但我对设计中的每个物种都得到了相同的预测。

有没有办法让嵌套随机效果的一部分保持原来的关卡,让另一部分成为新的关卡?

提前谢谢你!

更新 - 工作示例: 此问题不依赖于数据集。

library(data.table)
library(lme4)

dt <- data.table(expand.grid(design=c("a", "b"), species=c("x", "y", "z"), report=c("1", "2", "3"), count=seq(1, 10, 1)))
dt$weight <- 0

dt[species=="x"]$weight <- rnorm(60, 70, 10)
dt[species=="y"]$weight <- rnorm(60, 80, 15)
dt[species=="z"]$weight <- rnorm(60, 90, 20)

dt[design=="a"]$weight <- dt[design=="a"]$weight- 0.1*dt[design=="a"]$weight

dt[report=="1"]$weight <- dt[report=="1"]$weight+0.15*dt[report=="1"]$weight
dt[report=="2"]$weight <- dt[report=="2"]$weight-0.15*dt[report=="1"]$weight

m <-lmer(weight~design+(1|report/species), data=dt)

dt.pred <- unique(dt[,c(1:2)])
dt.pred$report<- "xyz"
dt.pred$pred<-predict(m, newdata=dt.pred, re.form= NULL, allow.new.levels=TRUE) 

【问题讨论】:

  • 您可能需要查看merTools 包,以通过模拟从混合效应模型生成预测。文档here.
  • mspecies 的方差项的大小是多少?
  • var(ranef(m)$species:study) 是 8.15 - 如果这是这个问题的正确答案。
  • 不,我的意思是输出中显示的方差或VarCorr(m) 返回的方差——这只是一个想法,以防方差很小/几乎为零,那么预测中就没有什么不同了。只是一个想法。
  • 这似乎给出了与re.form=NAre.form=~0 相同的结果,即没有随机效应。我想知道这是否相关:“预测将使用以前未观察到的水平(或 NA)的数据的无条件(人口水平)值。

标签: r predict lme4 mixed-models random-effects


【解决方案1】:

“相同”来自您设置re.form = NULL 或等效re.form = ~ 0 的事实。

线性混合效应模型对Y|beta,b ~ intercept + X %*% beta + Z %*% b + e 建模,通过设置re.form = NULL,您可以在预测期间设置Z %*% b = 0 的定义。由于这是模型的随机部分(即(1|report/species)),因此您正在消除speciesreport 的随机效应。

在混合模型中,您可以将这种预测称为“无条件预测”(或边际预测)[而在实践中它更像是伪无条件的]。它通常用于随机效应包含individual 的模型中。在这种情况下,当您观察一个新个体时,您会遇到未知的随机效应,但根据您的研究,您可能只对“系统”或“固定”效应感兴趣(即个体在被汽车?他骑自行车吗?)。在这里,只看无条件/边际效应是有意义的。

换一种说法,通过设置re.form = NULL,你说的是Z %*% b = 0。由于物种是Z 的一部分,权重为b,因此您无法看到特定物种对您的预测的影响。

只有知道物种并且可以在预测中使用随机效应,才能在具有相同固定效应的物种之间得到不同的预测。

附言。 data.table 包具有与expand.grid 等效的功能,称为CJ,对于更大的集合,它会更快,内存效率更高。

【讨论】:

  • 当我将此与此处的“re.form”参数文档进行比较时,我对您的解释感到困惑:re.form (formula, NULL, or NA) 指定要以哪些随机效应为条件预测时。如果为 NULL,则包括所有随机效应;如果 NA 或 ~0,则不包括随机效应。您已经说过如果 NULL 没有随机效应,但这表示如果设置为 NA 实际上是真的,并且 NULL 意味着包括所有随机效应?我错过了什么吗? rdocumentation.org/packages/lme4/versions/1.1-28/topics/…
【解决方案2】:

您可以使用ggeffects-package,它允许您获得针对固定效应(包括 CI)的预测,或以随机效应的组级别为条件(此处不返回任何 CI)。

这是您的数据示例,更多示例可以在in this vignette找到。

library(data.table)
library(lme4)
#> Loading required package: Matrix

dt <- data.table(expand.grid(design=c("a", "b"), species=c("x", "y", "z"), report=c("1", "2", "3"), count=seq(1, 10, 1)))
dt$weight <- 0

dt[species=="x"]$weight <- rnorm(60, 70, 10)
dt[species=="y"]$weight <- rnorm(60, 80, 15)
dt[species=="z"]$weight <- rnorm(60, 90, 20)

dt[design=="a"]$weight <- dt[design=="a"]$weight- 0.1*dt[design=="a"]$weight

dt[report=="1"]$weight <- dt[report=="1"]$weight+0.15*dt[report=="1"]$weight
dt[report=="2"]$weight <- dt[report=="2"]$weight-0.15*dt[report=="1"]$weight

m <-lmer(weight~design+(1|report/species), data=dt)

library(ggeffects)
ggpredict(m, "design")
#> 
#> # Predicted values of weight
#> # x = design
#> 
#> x | Predicted |   SE |         95% CI
#> -------------------------------------
#> a |     72.64 | 6.57 | [59.77, 85.52]
#> b |     82.66 | 6.57 | [69.78, 95.54]
#> 
#> Adjusted for:
#> * species = 0 (population-level)
#> *  report = 0 (population-level)

ggpredict(m, c("design", "report"), type = "re")
#> 
#> # Predicted values of weight
#> # x = design
#> 
#> # report = 1
#> 
#> x | Predicted
#> -------------
#> a |     80.78
#> b |     90.80
#> 
#> # report = 2
#> 
#> x | Predicted
#> -------------
#> a |     64.91
#> b |     74.92
#> 
#> # report = 3
#> 
#> x | Predicted
#> -------------
#> a |     72.24
#> b |     82.26
#> 
#> Adjusted for:
#> * species = 0 (population-level)

plot(ggpredict(m, c("design", "report"), type = "re"))
#> Loading required namespace: ggplot2

reprex package (v0.3.0) 于 2020 年 2 月 7 日创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-13
    • 2020-08-19
    • 2018-08-26
    • 1970-01-01
    • 2021-04-04
    • 2015-09-26
    • 1970-01-01
    • 2014-07-24
    相关资源
    最近更新 更多