R 在 ggplot 键中显示不同的回归线

R showing different regression lines in a ggplot key

我试图在同一坐标平面上绘制不同的简单线性回归估计值,以了解不同方法之间的一些差异。但我的问题是关于在 R 代码中添加这些行,而不是关于差异行的统计信息。

这里我使用的是 mtcars 数据集。我正在使用 mblmquantreq 包来得出不同的回归方程,或者更具体地说,是不同简单线性回归估计的斜率和截距参数。

我使用 geom_smooth() 函数并指定 method 参数添加的 OLS 估计。在创建线性模型对象后,我可以使用 geom_abline() 添加斜率和截距;那是另一种选择。

Theil-Sen 和中值最小二乘偏差估计我首先使用各自的包为每个创建一个模型。然后我使用 geom_abline().

添加斜率和截距

现在我已经手动添加了这些行。但是我怎样才能在 ggplot 中创建一个键或图例来显示这些不同的行呢? ggplot()geom_smooth()分群时自动添加密钥。但我不认为它为 geom_abline 添加了图例。无论如何,我的情节混合使用了两者。有任何想法吗?我从来没有用这种方式添加更多自己的密钥。

library(mblm)
ts_fit <- mblm(mpg ~ wt, data = mtcars)

library(quantreg)
lad_fit <- rq(mpg ~ wt, data = mtcars)

ggplot(mtcars, aes(x = wt, y = mpg)) + 
  labs(subtitle = "Simple Linear Regressions") +
  geom_point() + 
  geom_smooth(method = 'lm', se = FALSE, color = '#376795') +
  geom_abline(intercept = coef(ts_fit)[1], slope = coef(ts_fit)[2], color = '#f7aa58', size = 1) +
  geom_abline(intercept = coef(lad_fit)[1], slope = coef(lad_fit)[2], color = '#72bcd5', size = 1) 

我不会为每个模型添加一个单独的 geom,而是创建一个包含所有模型的截距和斜率的数据框。然后你可以将它传递给单个 geom_abline() 并将 color 映射到不同的模型。

注意,我没有安装 {mblm} 或 {quantreg},所以我 运行 lm()mtcars 的不同子集上作为近似值。

library(tidyverse)

# create dataframe with model coefficients
models <- data.frame(
    lm = coef(lm(mpg ~ wt, data = mtcars[1:20,])),
    ts = coef(lm(mpg ~ wt, data = mtcars[7:26,])),
    lad = coef(lm(mpg ~ wt, data = mtcars[11:32,]))
  ) %>% 
  t() %>% 
  as_tibble(rownames = "model") %>% 
  rename_with(~ c("model", "intercept", "slope"))

models
# # A tibble: 3 x 3
#   model intercept slope
#   <chr>     <dbl> <dbl>
# 1 lm         38.5 -5.41
# 2 ts         38.9 -5.59
# 3 lad        37.6 -5.41

# specify ggplot, passing `mtcars` to `geom_point()` and `models` to `geom_abline()`
ggplot() + 
  labs(subtitle = "Simple Linear Regressions") +
  geom_point(data = mtcars, aes(wt, mpg)) + 
  geom_abline(
    data = models, 
    aes(intercept = intercept, slope = slope, color = model),
    size = 1
  )