在R中为数据框多列逐一执行线性回归并获取R²值
批量获取波数列与weight的线性回归R²值
问题描述
现有包含weight列和3000+个波数列的数据集,需要以weight为自变量、每个波数为因变量逐一执行线性回归,提取每个模型的R²值并整理成指定格式的表格。已知单个波数的建模代码,需实现批量处理。
示例数据与单波数建模代码:
df1 = data.frame( weight = c(15, 18, 20, 21, 18), X400 = c(12.5, 9, 16.5, 9, 20), X401 = c(12, 19, 14.5, 9, 26), X402 = c(11.5, 9.6, 18.5, 19, 20), X403 = c(10.5, 8, 12.5, 17, 23), X404 = c(12.5, 9, 15, 9, 20), X405 = c(14.5, 19, 12.5, 8, 21.2), X406 = c(13.5, 7, 18.5, 12, 17), X407 = c(12, 3.9, 12.9, 10, 4.8)) # 单波数建模 model <- lm(X400 ~ weight, data = df1) summary(model)$r.squared
期望输出表格格式:
| 波数 | R²值 |
|---|---|
| X400 | R1 |
| X401 | R2 |
| X402 | R3 |
| ... | ... |
解决方案
方法1:基础for循环
逻辑清晰,适合新手理解:
# 获取所有波数列名(排除weight列) wave_cols <- setdiff(names(df1), "weight") # 初始化空结果数据框 r_squared_results <- data.frame(波数 = character(), R²值 = numeric(), stringsAsFactors = FALSE) # 循环处理每个波数列 for(col in wave_cols) { # 动态构建回归公式 formula <- as.formula(paste(col, "~ weight")) # 拟合模型 model <- lm(formula, data = df1) # 提取R²并添加到结果框(可按需保留小数位数) r_squared_results <- rbind(r_squared_results, data.frame(波数 = col, R²值 = round(summary(model)$r.squared, 4))) } # 查看最终结果 print(r_squared_results)
方法2:lapply批量处理
比for循环更简洁,大数据量下性能更优:
wave_cols <- setdiff(names(df1), "weight") # 批量计算每个波数的R² r_squared_vals <- lapply(wave_cols, function(col) { model <- lm(as.formula(paste(col, "~ weight")), data = df1) round(summary(model)$r.squared, 4) }) # 转换为目标格式的数据框 r_squared_results <- data.frame(波数 = wave_cols, R²值 = unlist(r_squared_vals), stringsAsFactors = FALSE) print(r_squared_results)
方法3:tidyverse风格实现
代码简洁易读,符合现代R数据分析习惯:
library(tidyverse) r_squared_results <- df1 %>% # 将宽格式转为长格式,按波数分组 pivot_longer(cols = starts_with("X"), names_to = "波数", values_to = "波数值") %>% group_by(波数) %>% # 每组拟合回归并提取R² summarise(R²值 = round(summary(lm(波数值 ~ weight))$r.squared, 4)) %>% ungroup() print(r_squared_results)
内容的提问来源于stack exchange,提问作者Niro Mal
相关产品推荐
相关产品推荐

