【问题标题】:How to plot random intercept and slope in a mixed model with multiple predictors?如何在具有多个预测变量的混合模型中绘制随机截距和斜率?
【发布时间】:2013-07-12 13:35:19
【问题描述】:

当混合模型有多个预测变量时,是否可以绘制其随机截距或斜率?

使用一个预测器,我会这样做:

#generate one response, two predictors and one factor (random effect)
resp<-runif(100,1, 100)
pred1<-c(resp[1:50]+rnorm(50, -10, 10),resp[1:50]+rnorm(50, 20, 5))
pred2<-resp+rnorm(100, -10, 10)
RF1<-gl(2, 50)

#gamm
library(mgcv)
mod<-gamm(resp ~ pred1, random=list(RF1=~1))
plot(pred1, resp, type="n")
for (i in ranef(mod$lme)[[1]]) {
abline(fixef(mod$lme)[1]+i, fixef(mod$lme)[2])
}

#lmer
library(lme4)
mod<-lmer(resp ~ pred1 + (1|RF1))
plot(pred1, resp, type="n")
for (i in ranef(mod)[[1]][,1]) {
abline(fixef(mod)[1]+i, fixef(mod)[2])
}

但是如果我有这样的模型呢?:

mod<-gamm(resp ~ pred1 + pred2, random=list(RF1=~1))

或者用 lmer

mod<-lmer(resp ~ pred1 + pred2 + (1|RF1))

我应该考虑所有系数还是只考虑我正在绘制的变量的系数?

谢谢

【问题讨论】:

  • 基本上,您必须决定要对其他变量做什么。最常见的过程是为一个变量选择一个参考值(例如,pred2 等于其平均值)并绘制该值相对于pred1 的斜率。或者您可以选择pred2 的几个值并为每个值绘制一组(一组)线,可能在单独的子图中,或者(最丑)做3D 绘图和绘图平面resp~f(pred1,pred2)
  • 谢谢 Ben,对不起,但我不确定是否会关注你,“为一个变量选择参考值”到底是什么意思?在实践中你会怎么做?

标签: r plot mixed-models lmer random-effects


【解决方案1】:
## generate one response, two predictors and one factor (random effect)
set.seed(101)
resp <- runif(100,1,100)
pred1<- rnorm(100, 
           mean=rep(resp[1:50],2)+rep(c(-10,20),each=50),
           sd=rep(c(10,5),each=50))
pred2<- rnorm(100, resp-10, 10)

注意您可能不应该尝试拟合随机数 对只有两个级别的分组变量的影响——这将 几乎总是导致估计的随机效应方差为零, 这反过来会将您预测的线条放在每个线条的顶部 其他——我正在从gl(2,50) 切换到gl(10,10) ...

RF1<-gl(10,10)
d <- data.frame(resp,pred1,pred2,RF1)

#lmer
library(lme4)
mod <- lmer(resp ~ pred1 + pred2 + (1|RF1),data=d)

lme4的开发版有predict()功能 这让这更容易一些......

  • 预测pred1 的范围,pred2 等于其平均值, 反之亦然。这一切都比它需要的要聪明一点 是,因为它为两个焦点预测变量生成所有值 并用 ggplot 一次性绘制它们...

()

nd <- with(d,
           rbind(data.frame(expand.grid(RF1=levels(RF1),
                      pred1=seq(min(pred1),max(pred1),length=51)),
                      pred2=mean(pred2),focus="pred1"),
                 data.frame(expand.grid(RF1=levels(RF1),
                      pred2=seq(min(pred2),max(pred2),length=51)),
                      pred1=mean(pred1),focus="pred2")))
nd$val <- with(nd,pred1[focus=="pred1"],pred2[focus=="pred2"])
pframe <- data.frame(nd,resp=predict(mod,newdata=nd))
library(ggplot2)
ggplot(pframe,aes(x=val,y=resp,colour=RF1))+geom_line()+
         facet_wrap(~focus,scale="free")
  • 或者,只关注pred1 并为pred2 值的(小/离散)范围生成预测...

()

nd <- with(d,
           data.frame(expand.grid(RF1=levels(RF1),
                      pred1=seq(min(pred1),max(pred1),length=51),
                      pred2=seq(-20,100,by=40))))
pframe <- data.frame(nd,resp=predict(mod,newdata=nd))
ggplot(pframe,aes(x=pred1,y=resp,colour=RF1))+geom_line()+
         facet_wrap(~pred2,nrow=1)

您可能希望在最后一个 facet_wrap() 中设置 scale="free" ... 或 使用facet_grid(~pred2,labeller=label_both)

对于演示,您可能希望替换 colour 美学, 使用group,如果您只想区分组 (即绘制单独的线)而不是识别它们......

【讨论】:

  • 非常有帮助!谢谢
猜你喜欢
  • 2019-09-05
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 2013-12-25
  • 2014-10-14
  • 2017-11-13
  • 2013-12-05
相关资源
最近更新 更多