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

R中按地点分组对多列浓度数据执行最小二乘lm回归的实现方法

R按分组遍历多列批量运行线性回归的实现方案

基础R实现(适配你原有代码逻辑)

你原有代码仅支持单个化学品回归,只需新增遍历化学品列的嵌套lapply逻辑即可,完整代码如下:

# 1. 按地点拆分数据集,和你原有逻辑一致
df.2 <- split(df, f = df$location)
# 2. 提取所有化学品浓度列的列名(第3至93列)
chem_cols <- colnames(df)[3:93]
# 3. 嵌套遍历:外层遍历所有地点,内层遍历所有化学品列跑回归
model_lm_all <- lapply(df.2, function(loc_data) {
  loc_models <- lapply(chem_cols, function(chem) {
    # 动态构造回归公式,替换y变量为当前遍历的化学品列
    lm_formula <- reformulate(termlabels = "sample_date", response = chem)
    return(lm(lm_formula, data = loc_data, na.action = na.omit))
  })
  # 给当前地点的模型列表命名,和化学品列名一一对应,方便后续提取
  names(loc_models) <- chem_cols
  return(loc_models)
})

结果调用说明

最终返回的model_lm_all是双层列表:

  • 第一层共19个元素,对应19个地点,名称为地点的因子值
  • 第二层每个地点下共91个元素,对应91个化学品的lm回归结果

比如要提取地点为「北京」的化学品「苯」的回归结果,调用方式为:model_lm_all[["北京"]][["苯"]]

Tidyverse方案(更方便后续批量整理结果)

如果需要批量提取回归系数、p值等指标,用tidyverse生态的工具更高效,代码如下:

library(dplyr)
library(tidyr)
library(purrr)
library(broom)

chem_cols <- colnames(df)[3:93]
model_result <- df %>%
  # 按地点分组嵌套数据集
  nest(data = -location) %>%
  # 对每个地点的数据集批量跑回归
  mutate(
    chem_result = map(data, ~ .x %>%
                        # 把化学品列从宽表转成长表
                        pivot_longer(cols = all_of(chem_cols), names_to = "chemical", values_to = "concentration") %>%
                        group_by(chemical) %>%
                        # 分组运行回归,同时提取回归结果指标
                        summarise(
                          lm_model = list(lm(concentration ~ sample_date, na.action = na.omit)),
                          # 直接提取系数、p值等指标生成表格
                          lm_stats = list(tidy(lm_model[[1]]))
                        )
                      )
  ) %>%
  # 展开所有结果,最终得到结构化的回归结果表
  unnest(chem_result) %>%
  unnest(lm_stats)

最终返回的model_result是结构化数据框,每一行对应「单个地点+单个化学品」的回归系数结果,可直接筛选、导出使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:27:01