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

基于嵌套数据框(nested dataframe/tibble)运行多组simple linear regression提取系数问询

没问题!我来帮你搞定嵌套数据框里的多组简单线性回归,还能用tidy()把系数整理成整洁的数据框。咱们用tidyverse家族的工具(dplyr、purrr、broom)来实现,一步步来:

1. 先加载需要的包

首先得把要用的包装上并加载,这些包能帮我们处理嵌套数据、运行回归、整理结果:

library(tidyverse)
library(broom)
2. 准备并嵌套你的数据

咱们用经典的mtcars数据集做演示——假设我们想按气缸数(cyl)分组,然后在每个组里,分别用disp、hp、drat这几个自变量和因变量mpg做简单线性回归。先把数据按cyl嵌套:

nested_data <- mtcars %>%
  group_by(cyl) %>%
  nest()

运行完后,nested_data会是一个嵌套 tibble:每一行对应一个cyl组,data列里是该组对应的子数据框。

3. 在嵌套数据中运行多组回归并整理结果

核心步骤来了!我们要遍历每个嵌套的子数据框,对每个自变量分别跑回归,再用tidy()把模型系数转成数据框:

reg_results <- nested_data %>%
  mutate(
    # 对每个嵌套的子数据框,生成多组回归的tidy结果
    regression_results = map(data, function(sub_df) {
      # 定义要用来做回归的自变量列表
      predictors <- c("disp", "hp", "drat")
      
      # 遍历每个自变量,跑回归并整理结果
      map_dfr(predictors, function(pred_col) {
        # 动态生成回归公式(比如 mpg ~ disp)
        lm_formula <- as.formula(paste("mpg ~", pred_col))
        # 运行回归 + 用tidy()转成数据框 + 标记自变量名称
        lm(lm_formula, data = sub_df) %>%
          tidy() %>%
          mutate(predictor = pred_col)
      })
    })
  ) %>%
  # 把嵌套的回归结果展开成普通列
  unnest(regression_results) %>%
  # 调整列顺序,让结果更易读
  select(cyl, predictor, term, estimate, std.error, statistic, p.value)

代码解释:

  • map(data, ...):遍历每个嵌套的子数据框,对每个子框单独处理。
  • map_dfr(predictors, ...):遍历每个自变量,为每个自变量生成一个回归模型,并用map_dfr把所有结果合并成一个数据框。
  • as.formula(paste("mpg ~", pred_col)):动态构建回归公式,避免手动写多个重复的lm(mpg ~ disp, ...)、lm(mpg ~ hp, ...)。
  • tidy():把lm模型的系数、标准误、p值等统计量转换成整洁的 tibble 格式。
  • unnest():把嵌套在regression_results里的结果展开,变成一行一个回归系数的结构。
4. 查看最终结果

运行完上面的代码后,reg_results就是你要的整洁数据框啦!它会包含每个分组(cyl)、每个自变量(predictor)、回归项(截距/自变量)、系数估计值、标准误等信息,示例输出大概是这样:

# A tibble: 18 × 7
    cyl predictor term        estimate std.error statistic  p.value
  <dbl> <chr>     <chr>          <dbl>     <dbl>     <dbl>    <dbl>
1     6 disp      (Intercept)  19.1      3.11        6.14  0.00129
2     6 disp      disp         -0.0196    0.0101     -1.94  0.0938 
3     6 hp        (Intercept)  28.4      4.29        6.62  0.000864
4     6 hp        hp           -0.0821    0.0290     -2.83  0.0296 
5     6 drat      (Intercept)   5.08     10.1         0.503 0.633  
6     6 drat      drat          2.78      2.47        1.12  0.302  
...
小技巧

如果你的自变量很多,不想手动列出来,可以用代码自动获取所有自变量列:

# 假设因变量是mpg,分组变量是cyl,剩下的都是自变量
predictors <- names(sub_df)[!names(sub_df) %in% c("mpg", "cyl")]

这样不管有多少个自变量,都能自动批量处理。

内容的提问来源于stack exchange,提问作者Balamurali N.R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:22:25