具有嵌套随机效应的 lmer 模型的预测
prediction for lmer-model with nested random effects
我目前正在尝试帮助一位同事,但我根本找不到解决方案。所以我希望其他人可以帮助我们。
我有一个数据集,其中包含使用不同研究设计评估的权重数据,针对不同研究中的不同物种(一项研究包括多种设计和多种物种)。我想调查权重与研究设计之间的关系,使用研究和物种作为嵌套随机效应。
模型看起来像这样并且运行良好:
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)
'sameness' 是因为您正在设置 re.form = NULL
或等效的 re.form = ~ 0
。
线性混合效应模型对 Y|beta,b ~ intercept + X %*% beta + Z %*% b + e
进行建模,通过设置 re.form = NULL
,您将在预测期间设置 Z %*% b = 0
的定义。由于这是模型的随机部分(即 (1|report/species)
),因此您要删除 species
和 report
的随机效应。
在混合模型中,您可以将这种预测称为 "unconditional prediction"(或边际预测)[而在实践中它更像是伪无条件的]。它通常用于随机效应包含 individual
的模型中。在这种情况下,当您观察一个新个体时,您会产生未知的随机效应,但根据您的研究,您可能只对 "systematic" 或 "fixed" 效应感兴趣(即该个体之前是否步行上班被车撞了?他骑自行车吗?)。在这里只看 unconditional/marginal 效果是有意义的。
换句话说,设置 re.form = NULL
就是 Z %*% b = 0
。由于物种是权重 b
的 Z
的一部分,您无法看到特定物种对预测的影响。
只有当你知道物种并且可以在你的预测中使用随机效应时,你才能在具有相同固定效应的物种之间得到不同的预测。
Ps.
data.table
包有一个与 expand.grid
等效的函数,称为 CJ
,对于更大的集合,它会更快,内存效率更高。
您可以使用 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-02-07 创建
我目前正在尝试帮助一位同事,但我根本找不到解决方案。所以我希望其他人可以帮助我们。
我有一个数据集,其中包含使用不同研究设计评估的权重数据,针对不同研究中的不同物种(一项研究包括多种设计和多种物种)。我想调查权重与研究设计之间的关系,使用研究和物种作为嵌套随机效应。
模型看起来像这样并且运行良好:
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)
'sameness' 是因为您正在设置 re.form = NULL
或等效的 re.form = ~ 0
。
线性混合效应模型对 Y|beta,b ~ intercept + X %*% beta + Z %*% b + e
进行建模,通过设置 re.form = NULL
,您将在预测期间设置 Z %*% b = 0
的定义。由于这是模型的随机部分(即 (1|report/species)
),因此您要删除 species
和 report
的随机效应。
在混合模型中,您可以将这种预测称为 "unconditional prediction"(或边际预测)[而在实践中它更像是伪无条件的]。它通常用于随机效应包含 individual
的模型中。在这种情况下,当您观察一个新个体时,您会产生未知的随机效应,但根据您的研究,您可能只对 "systematic" 或 "fixed" 效应感兴趣(即该个体之前是否步行上班被车撞了?他骑自行车吗?)。在这里只看 unconditional/marginal 效果是有意义的。
换句话说,设置 re.form = NULL
就是 Z %*% b = 0
。由于物种是权重 b
的 Z
的一部分,您无法看到特定物种对预测的影响。
只有当你知道物种并且可以在你的预测中使用随机效应时,你才能在具有相同固定效应的物种之间得到不同的预测。
Ps.
data.table
包有一个与 expand.grid
等效的函数,称为 CJ
,对于更大的集合,它会更快,内存效率更高。
您可以使用 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-02-07 创建