在R中使用Purrr计算斜率与截距比值的问题求助
解决分组线性回归斜率与截距的比值计算问题
我明白你现在的困扰——已经能分别提取mtcars按cyl分组后每个组的截距和斜率,但就是没法把它们放在一起计算比值对吧?之前的几种写法都是因为没有在正确的层级处理计算逻辑,我来给你梳理下正确的做法:
方法一:基于现有purrr代码的修改
你之前的代码是先分别提取截距和斜率,但其实可以在map_dbl里直接对每个模型的系数列表做除法运算,这样就能一次性得到每个组的比值:
mtcars %>% split(.$cyl) %>% map(~lm(mpg~wt, data = .)) %>% map(coefficients) %>% map_dbl(~ .x["wt"] / .x["(Intercept)"])
为什么之前的写法失败?
- 第一种写法
map_dbl("wt")/map_dbl("(Intercept)"):管道的前一步是系数列表,你不能直接在后面接两个独立的map_dbl调用做除法,管道是按顺序传递数据的,这种写法不符合管道的逻辑。 - 第二种写法
map_dbl("wt"/"(Intercept)"):你是在对两个字符串做除法,这显然是语法错误,map_dbl的参数应该是提取键或者函数,不能直接对字符串做运算。 - 第三种写法嵌套
map_dbl:map_dbl(map_dbl("wt")/map_dbl("(Intercept)"))逻辑错误,map_dbl的输入应该是处理每个元素的函数,而不是嵌套调用map_dbl。
方法二:用broom包更优雅地整理结果
如果想要更结构化的输出(比如同时保留分组cyl和对应的比值),可以用broom包的tidy函数来整理模型结果,步骤更清晰:
library(broom) library(dplyr) library(tidyr) mtcars %>% group_by(cyl) %>% do(tidy(lm(mpg~wt, data = .))) %>% pivot_wider(names_from = term, values_from = estimate) %>% mutate(ratio = wt / `(Intercept)`) %>% select(cyl, ratio)
这个方法会输出一个数据框,包含每个cyl分组和对应的斜率/截距比值,可读性更强。
内容的提问来源于stack exchange,提问作者Bryce.Brightside
相关产品推荐
相关产品推荐

