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

如何在R中对列内重复品种值循环运行lm回归模型

问题解决:按品种批量拟合线性回归模型

先说说你原始代码里的几个问题

  1. 索引逻辑错误:unique(nrow(df$Cultivar))完全不对——df$Cultivar是一列向量,nrow()用在向量上会返回NULL,你应该直接用unique(df$Cultivar)获取所有唯一的品种值。
  2. 数据筛选错误:df[i]是按列筛选数据,而你需要的是筛选当前品种对应的行,得写成df[df$Cultivar == i, ](或者用dplyr::filter更直观)。
  3. 模型摘要调用错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:20:29