如何生成含分组线性模型系数、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
相关产品推荐
相关产品推荐

