You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为起始时间不同的多组响应预测变量分组运行分段线性回归

分组分段回归实现方案

你现有代码直接对全量数据拟合模型,没有按response和predictor字段拆分数据,所以只会输出全数据集的单个R²。可以用「分组嵌套+逐组映射拟合」的方式实现需求,步骤如下:

  • 首先加载依赖包,提前处理缺失值避免模型报错
  • 按两个分组字段拆分数据,每个分组单独存为子数据集
  • 封装带容错的分段回归拟合函数,避免单组数据异常时整个流程中断
  • 逐组运行模型,提取每组的R²结果合并输出

完整代码

# 加载依赖
library(tidyverse)
library(segmented)

# 1. 数据预处理:去除x/y列的缺失值,按分组字段嵌套
nested_data <- df |> 
  drop_na(x, y) |> 
  group_by(response, predictor) |> 
  nest()

# 2. 封装分段回归拟合函数,带容错判断
fit_seg_lm <- function(sub_data) {
  # 单组样本量不足时直接返回NA,分段回归至少需要足够样本支撑断点估计
  if (nrow(sub_data) < 5) {
    return(tibble(r2 = NA_real_))
  }
  # 拟合基础线性模型
  lm_base <- lm(y ~ x, data = sub_data)
  # 拟合分段模型,捕获报错
  seg_model <- tryCatch(
    segmented(lm_base, seg.Z = ~x),
    error = \(e) NULL
  )
  # 拟合失败返回NA,成功提取R²
  if (is.null(seg_model)) {
    return(tibble(r2 = NA_real_))
  }
  return(tibble(r2 = summary(seg_model)$r.squared))
}

# 3. 逐组拟合,展开结果
group_result <- nested_data |> 
  mutate(fit_res = map(data, fit_seg_lm)) |> 
  unnest(fit_res) |> 
  select(-data)

注意事项

  • 你提供的示例数据中每个response+predictor组合仅3条有效观测,样本量不足以支撑分段回归拟合,实际使用时请保证每组至少5条以上有效数据,否则结果无统计意义
  • 原代码存在数据对象名混用问题(一会命名为df一会命名为results),运行时请统一数据对象名称
  • 如果需要额外提取断点位置、回归系数等指标,直接在封装的拟合函数返回值中添加对应字段即可,比如breakpoint = seg_model$psi[,"Est."]可以提取模型估计的断点值

内容的提问来源于stack exchange,提问作者Kristen Cyr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 23:33:21