R 如何在具有多个预测因子的混合模型中绘制随机截距和斜率?

R 如何在具有多个预测因子的混合模型中绘制随机截距和斜率?,r,plot,mixed-models,lmer,random-effects,R,Plot,Mixed Models,Lmer,Random Effects,当混合模型有多个预测器时,是否可以绘制其随机截距或斜率 有了一个预测器,我会这样做: #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&

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

有了一个预测器,我会这样做:

#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])
}
#生成一个响应、两个预测值和一个因子(随机效应)
响应
lme4
的开发版本具有
predict()
功能 这让这更容易一点

  • 预测
    pred1
    范围,其中
    pred2
    等于其平均值, 反之亦然。这一切都比它需要的聪明一点 也就是说,因为它生成了两个焦点预测器的所有值 然后用ggplot一次完成绘制
()

您可能需要在最后一个
facet\u wrap()
中设置
scale=“free”
。。。或 使用
facet\u网格(~pred2,labeller=label\u两者)

对于演示文稿,您可能需要更换
颜色
美学, 使用
,如果您只想区分不同的组
(即,绘制单独的线)而不是识别它们…

基本上,您必须决定对其他变量要做什么。最常见的程序是为一个变量选择一个参考值(例如,
pred2
等于其平均值),并绘制该值相对于
pred1
的斜率。或者你可以选择几个
pred2
的值,并为每个值绘制(一组)线,可能是在单独的子图中,或者(最丑的)做3D打印和绘制平面
resp~f(pred1,pred2)
。谢谢你,本,对不起,我不确定要听你的,你说“为一个变量选择参考值”到底是什么意思?你在实践中会怎么做?非常有帮助!非常感谢。
mod<-gamm(resp ~ pred1 + pred2, random=list(RF1=~1))
mod<-lmer(resp ~ pred1 + pred2 + (1|RF1))
## 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)
RF1<-gl(10,10)
d <- data.frame(resp,pred1,pred2,RF1)

#lmer
library(lme4)
mod <- lmer(resp ~ pred1 + pred2 + (1|RF1),data=d)
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")
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)