2013-07-14 59 views
6

當它有多個預測變量時,是否可以繪製混合模型的隨機截距或斜率?如何在具有多個預測變量的混合模型中繪製隨機截距和斜率?

有了一個預測,我會做這樣的:

#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)) 

或者11聚物與

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

應該我考慮所有的係數或只考慮我正在繪製的變量的係數?

感謝

+1

基本上,你必須決定你想要對其他變量做什麼。最常見的程序是爲一個變量選擇一個參考值(例如,'pred2'等於它的平均值)並且針對該值繪製關於'pred1'的斜率。或者你可以選擇幾個'pred2'值,併爲每個值繪製(一組)線條,可能在單獨的子圖中,或者(最醜)代替3D陰謀和繪製平面'resp〜f(pred1,pred2)'。 –

+0

謝謝Ben,對不起,但我不確定要關注你,你是什麼意思爲「選擇一個變量的參考值」?你如何在實踐中做到這一點? – Oritteropus

回答

4
## 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()功能 ,使這變得更輕鬆...

  • 預測一系列pred1pred2等於其平均值, 反之亦然。這是所有有點聰明比它需要 是,因爲它產生的所有值的兩焦點預測 和一步到位的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,如果你想要的要做的是區分羣體 (即繪製單獨的行)而不是識別它們...

+0

非常有幫助!謝謝 – Oritteropus

相關問題