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

如何生成含分组线性模型系数、R²等指标的DataFrame

分组线性模型提取指标解决方案

问题本质

你遇到的核心问题是分组拟合模型时,未能同时正确提取系数与模型统计量:

  • 使用ddply时,单独返回系数或R²均正常,但组合返回时因结构不一致导致列丢失;
  • dplyr的glance()仅返回模型整体统计量,无法直接获取变量系数;
  • r.squared()报错是因为该函数(多来自car包)不接受lm对象,应改用summary(model)$r.squared或broom包方法。

推荐解决方案(tidyverse流程)

用dplyr+broom包实现分组拟合,一次性提取所有所需指标,避免重复拟合模型:

1. 加载依赖并构造示例数据

library(dplyr)
library(broom)

# 构造与需求匹配的示例数据
set.seed(123)
df <- tibble(
  plot = rep(c("A", "B", "C"), each = 10),
  hrs_since = rep(1:10, 3),
  logT = c(2 + 0.5*1:10 + rnorm(10, 0, 0.2),
           1 + 0.3*1:10 + rnorm(10, 0, 0.15),
           3 + 0.7*1:10 + rnorm(10, 0, 0.25))
)

2. 分组拟合并提取指标

result <- df %>%
  group_by(plot) %>%
  do({
    # 每个分组仅拟合一次模型
    mod <- lm(logT ~ hrs_since, data = .)
    # 提取自变量hrs_since的斜率
    slope <- tidy(mod) %>% filter(term == "hrs_since") %>% pull(estimate)
    # 提取R²值
    r2 <- glance(mod)$r.squared
    # 计算RSD(模型残差的标准差)
    rsd <- summary(mod)$sigma
    
    # 组装目标DataFrame结构
    tibble(slope = slope, r2 = r2, rsd = rsd)
  }) %>%
  ungroup()

# 查看最终结果
print(result)

备选方案(plyr包流程)

若习惯使用ddply,只需在分组函数中返回包含所有指标的data.frame即可避免列丢失:

library(plyr)

result_plyr <- ddply(df, .(plot), function(x) {
  mod <- lm(logT ~ hrs_since, data = x)
  coeffs <- coef(mod)
  data.frame(
    slope = coeffs["hrs_since"],
    r2 = summary(mod)$r.squared,
    rsd = summary(mod)$sigma
  )
})

print(result_plyr)

关键细节说明

  • 斜率提取:通过tidy(mod)将系数转为表格后,筛选term == "hrs_since"的行即可精准获取自变量斜率;
  • R²值:直接使用summary(mod)$r.squared或glance(mod)$r.squared,避免调用不兼容lm对象的r.squared()函数;
  • RSD计算:模型残差的标准差即summary(mod)$sigma,这是统计分析中常用的残差离散程度指标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:45:29