想问下各位大神,想做线性回归,提取出贝塔和残差,但需要分组后进行,请教各位如何实现。

mtcars举例的话应该是这样:

mtcars_cyl <- split(mtcars, mtcars$cyl)
mtcars_cyl

sapply(mtcars_cyl, function(data, formula) {
  lm(formula = formula, data = data)$coefficients
}, formula = mpg ~ disp)
    15 天 后
    mtcars %>% 
      select(cyl,mpg,disp) %>% 
      group_by(cyl) %>% 
      summarise(b = lm(mpg~disp)$coefficients[1],
             a = lm(mpg~disp)$coefficients[2])

    或者:summarise() 改为mutate() 不做汇总。
    其他提取结果类似。

    我还是比较喜欢 Base R 风格,过程简单清晰,便于 Debug

    # 拆分
    mtcars_cyl <- split(mtcars, mtcars$cyl)
    # 计算
    mtcars_fit <- lapply(mtcars_cyl, lm, formula = mpg ~ disp)
    mtcars_coef <- lapply(mtcars_fit, coef)
    # 合并
    dat <- do.call("rbind", mtcars_coef)
    > dat
      (Intercept)      disp
    4       40.87 -0.135142
    6       19.08  0.003605
    8       22.03 -0.019634

    如果使用 data.table 分组线性回归就更简洁了

    library(data.table)
    mtcars <- as.data.table(mtcars)
    mtcars[, as.list(coef(lm(mpg ~ disp))), by = .(cyl)]
       cyl (Intercept)         disp
    1:   6    19.08199  0.003605119
    2:   4    40.87196 -0.135141815
    3:   8    22.03280 -0.019634095
    4 个月 后
    Cloud2016 更改标题为「如何做分组回归提取斜率和截距