使用 ggplot2 和 facet_wrap 绘制估计值,无需重新拟合模型

Plotting estimates using ggplot2 & facet_wrap WITHOUT re-fitting models

我是 ggplot2 的新手,我希望生成一个包含多个散点图及其各自回归估计的图形。但是,我使用的是非标准回归方法(例如分位数回归和总回归),这些方法不在 geom_smooth() 中可用的 method 参数列表中。我有一个拟合模型和相应数据的列表。下面是一个工作示例。

require(data.table); require(ggplot2)
N <- 1000 # Generate some data
DT <- NULL
models <- list() # list of of fitted models. For simplicity i am using lm in this example
for(i in 1:8){
  x <- rnorm(N)
  y <- i*x + rnorm(N)
  z <- rep(i,N)
  DT <- rbind(DT,data.table(cbind(x=x,y=y,z=z)))
  models[[i]] <- lm(y~x,DT)
}

# Traditional way to plot the data with regression estimates is to use geom_smooth
my.plot <- ggplot(DT, aes(x=x, y=y)) + geom_point() + 
  facet_wrap(~ z, nrow=2, ncol=4) + 
  geom_smooth(method = "lm", se=FALSE, color="red", formula = y ~ x)
my.plot

我需要一种方法来绘制红色回归估计值,而无需在 geom_smooth 内拟合回归模型。是否有解决方法可以使我单独的已安装 Models 列表与 facet_wrap 兼容?

因为不清楚如何将美学映射到模型中使用的变量,所以您需要自己计算线条的值,然后将它们添加为标准 geom_line 层而不是比使用 geom_smooth。例如

lines <- purrr::map_dfr(models, function(m) {
  xrng <- range(m$model$x)
  data.frame(x=xrng, y=predict(m, data.frame(x=xrng)))
}, .id="z")

ggplot(DT, aes(x=x, y=y)) + geom_point() + 
  facet_wrap(~ z, nrow=2, ncol=4) + 
  geom_line(color="red", data=lines)

请注意,这里的坡度看起来有点 "off",但这与您实际建模的相符(您每次都使用了整个 DT)。如果你想在每次迭代中分别估计斜率,你的循环应该看起来更像

for(i in 1:8){
  x <- rnorm(N)
  y <- i*x + rnorm(N)
  z <- rep(i,N)
  chunk <- data.table(x=x,y=y,z=z)
  models[[i]] <- lm(y~x,chunk)
  DT <- rbind(DT, chunk)
}