簡體   English   中英

在 ggplot 中繪制具有固定效應交互作用的混合效應模型

[英]plot mixed effect model with interaction in fixed effects in ggplot

我正在繪制基於lmer()對象的混合效應模型中固定效應的相互作用。 為此,我根據我的模型預測新值。 這很好用,但由於我生成它們的方式,預測會延伸到整個可能的 x 軸范圍。 我現在可以通過基於循環定義 new.dat(根據分組變量“Variety”更改最大值和最小值)等將預測的回歸線限制在其各自分組變量的范圍內,但是 - 有沒有更優雅的/ 更簡單的解決方案來繪制這個? 我是否錯過了什么(我對 R 比較陌生)?

數據:

library(datasets)
data("Oats")

# manipulate data so it resembles more my actual data
Oats <- Oats %>%
  filter((Variety == "Golden Rain"  & nitro>=0.2) | (Variety == "Marvellous" & nitro <=0.4) | (Variety == "Victory" & nitro<=0.4 & nitro>=0.2))  #%>%

模型和繪圖:

mod2 <- lmer(yield ~ nitro * Variety + (1| Variety), data=Oats)

new.dat <- data.frame(nitro=seq(min(Oats$nitro),max(Oats$nitro), length.out = 48), Variety= Oats$Variety)
new.dat$pred<-predict(mod2,newdata=new.dat,re.form=~0)

ggplot(data=Oats, aes(x=nitro, y=yield, col = Variety)) +
  geom_point() +
  geom_line(data=new.dat, aes(y=pred)) +
  geom_point(data=new.dat, aes(y=pred))

結果圖

非常感謝每一個提示!

您可以通過計算每組的最小值/最大值,然后按組計算序列來獲得它。 與 tidyverse 保持一致,因為您的代碼已經使用了它:

library(tidyverse)
library(pairwiseCI)
#> Loading required package: MCPAN
#> Loading required package: coin
#> Loading required package: survival
library(lme4)
#> Loading required package: Matrix
#> 
#> Attaching package: 'Matrix'
#> The following objects are masked from 'package:tidyr':
#> 
#>     expand, pack, unpack

data("Oats")

 ## manipulate data so it resembles more my actual data
Oats <-
  Oats %>%
  filter((Variety == "Golden Rain"  & nitro>=0.2) | (Variety == "Marvellous" & nitro <=0.4) | (Variety == "Victory" & nitro<=0.4 & nitro>=0.2))  #%>%

mod2 <- lmer(yield ~ nitro * Variety + (1| Variety), data=Oats)
#> Warning in checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
#> unable to evaluate scaled gradient
#> Warning in checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
#> Hessian is numerically singular: parameters are not uniquely determined

## Calculate min/max by group
all_vals <-
  Oats %>%
  group_by(Variety) %>%
  summarize(min_nitro = min(nitro),
            max_nitro = max(nitro))
## Calculate sequence for each group
new.dat <-
  all_vals %>%
  group_split(Variety) %>%
  map_dfr(~ data.frame(Variety = .x$Variety, nitro = seq(.x$min_nitro, .x$max_nitro, length.out = 20)))


new.dat$pred<-predict(mod2,newdata=new.dat,re.form=~0)

ggplot(data=Oats, aes(x=nitro, y=yield, col = Variety)) +
  geom_point() +
  geom_line(data=new.dat, aes(y=pred)) +
  geom_point(data=new.dat, aes(y=pred))

圖片

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM