visreg:在一个图中叠加两个模型

visreg: overlay two models in a single plot

我正在尝试使用库 visreg:

在单个绘图中绘制原始和调整后的 GAM 模型
# Create DF
set.seed(123)
x1 = rnorm(2000)           
z = 1 + 3*x1 + 3*exp(x1)         
pr = 1/(1+exp(-z))         
y = rbinom(2000,1,pr)
df = data.frame(y=y,x1=x1, x2=exp(x1)*z)

# Fitting GAMs
library(mgcv)
crude <- gam(y ~ s(x1), family=binomial(link=logit), data=df)
adj   <- gam(y ~ s(x1) + s(x2), family=binomial(link=logit), data=df)

# Plot results using 'visreg'
library(visreg)
p.crude <- visreg(crude,  scale='response', "x1", line.par = list(col = 'red'), gg=TRUE) + theme_bw()
p.adj <- visreg(adj,  scale='response', "x1", gg=TRUE) + theme_bw()

使用 gridExtra 我可以生成两列图,但是我会有一个图覆盖两个模型图。

您可以使用 plot=FALSE 参数获取没有绘图的数据:

p.crude <- visreg(crude,  scale='response', "x1", line.par = list(col = 'red'), plot=FALSE)
p.adj <- visreg(adj,  scale='response', "x1", plot = FALSE)

然后,手动重新创建它:

dplyr::bind_rows(
  dplyt::mutate(p.crude$fit, plt = "crude"),
  dplyr::mutate(p.adj$fit, plt = "adj")
) -> fits

ggplot() +
  geom_ribbon(
    data = fits, 
    aes(x1, ymin=visregLwr, ymax=visregUpr, group=plt), fill="gray90"
  ) +
  geom_line(data = fits, aes(x1, visregFit, group=plt, color=plt)) +
  theme_bw()

https://github.com/pbreheny/visreg/blob/master/R/ggFactorPlot.R 有所有其他计算,geoms/aesthetics 你可以在游戏中使用。