如何从tidyr构建的数据框嵌套列表中提取segmented回归的斜率Est值
解决方法
核心逻辑是slope()返回的每个分组结果中,每个分段变量的斜率矩阵第一列就是你需要的Est.估计值,直接提取该列即可。
修改后完整代码
library(segmented) library(tidyr) library(dplyr) Group <- c("A", "B") x <- 0:5 y <- c(0, 1, 2, 2.1, 2.3, 2, 0, 2, 4, 4.5, 4.3, 4.4) df <- expand.grid(x = x, Group = Group) df$y <- y Segmented.values <- df %>% nest_by(Group) %>% mutate( my.lm = list(lm(data = data, formula = y ~ x)), my.seg = list(segmented(my.lm, seg.Z = ~ x)), intercepts = list(intercept(my.seg)), # 直接提取斜率的Est.列,[[1]]对应seg.Z里的第一个变量x slopes = list(slope(my.seg)[[1]][, "Est."]), R2 = summary(my.seg)$r.squared ) %>% # 展开截距和斜率,多个值会自动拆为独立列 unnest_wider(c(intercepts, slopes), names_sep = "_") %>% # 保留需要的列,删除中间模型对象 select(Group, starts_with("intercepts_"), starts_with("slopes_"), R2)
输出结果
运行后得到的结果如下:
# A tibble: 2 × 6 # Groups: Group [2] Group intercepts_1 intercepts_2 slopes_1 slopes_2 R2 <fct> <dbl> <dbl> <dbl> <dbl> <dbl> 1 A 8.33e-17 2.95 1 -0.05 0.985 2 B 1.37e-16 5.90 2 -0.05 0.999
如果你不想修改上游代码,也可以在你现有输出结果的基础上直接筛选需要的列:
Segmented.values <- Segmented.values %>% select(Group, `slopes 1`, `slopes 2`)
内容的提问来源于stack exchange,提问作者Daniel Valencia C.
相关产品推荐
相关产品推荐

