如何在R中对列内重复品种值循环运行lm回归模型
问题解决:按品种批量拟合线性回归模型
先说说你原始代码里的几个问题
- 索引逻辑错误:
unique(nrow(df$Cultivar))完全不对——df$Cultivar是一列向量,nrow()用在向量上会返回NULL,你应该直接用unique(df$Cultivar)获取所有唯一的品种值。 - 数据筛选错误:
df[i]是按列筛选数据,而你需要的是筛选当前品种对应的行,得写成df[df$Cultivar == i, ](或者用dplyr::filter更直观)。 - 模型摘要调用错误:
summary(line[i])里的[i]是多余的,line已经是单个品种的lm模型对象,直接用summary(line)就行。
方法1:修正后的for循环
如果习惯用基础R的循环,这么改就能跑通:
# 获取所有唯一品种 all_cultivars <- unique(df$Cultivar) # 循环遍历每个品种拟合模型 for(cv in all_cultivars){ # 筛选当前品种的数据集 cv_data <- df[df$Cultivar == cv, ] # 拟合回归模型 cv_model <- lm(DTT_mean ~ leaves_mean, data = cv_data) # 打印带品种标识的模型结果 cat("--- 品种", cv, "的回归结果 ---\n") print(summary(cv_model)) cat("\n") }
方法2:tidyverse批量处理(更简便,无需手动拆分)
用dplyr+purrr+broom的组合,能自动按品种分组拟合模型,还能把所有结果整理成整洁的表格,后续分析更方便:
library(dplyr) library(purrr) library(broom) # 按品种分组,批量拟合模型并提取结果 model_output <- df %>% group_by(Cultivar) %>% nest() %>% # 把每个品种的数据打包成列表列 mutate( # 为每个品种的数据拟合模型 model = map(data, ~ lm(DTT_mean ~ leaves_mean, data = .x)), # 提取模型系数、p值等细节 coef_table = map(model, tidy), # 提取模型整体统计量(R²、F检验p值等) model_stats = map(model, glance) ) # 查看每个品种的系数结果 model_output %>% select(Cultivar, coef_table) %>% unnest(coef_table) # 查看每个品种的模型整体表现 model_output %>% select(Cultivar, model_stats) %>% unnest(model_stats)
这个方法不用手动拆分数据框,所有步骤都是链式操作,结果也是结构化的tibble,不管是看结果还是导出都很方便。
内容的提问来源于stack exchange,提问作者lettuce_guy
相关产品推荐
相关产品推荐

