想问下各位大神,想做线性回归,提取出贝塔和残差,但需要分组后进行,请教各位如何实现。
如何做分组回归提取斜率和截距
拿mtcars
举例的话应该是这样:
mtcars_cyl <- split(mtcars, mtcars$cyl)
mtcars_cyl
sapply(mtcars_cyl, function(data, formula) {
lm(formula = formula, data = data)$coefficients
}, formula = mpg ~ disp)
meeeeeeeeo 谢谢兄弟,我试试
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 更改标题为「如何做分组回归提取斜率和截距」