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
相关产品推荐
相关产品推荐

