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

如何在R中自动按分组计算拟合数据的RMSE?

批量按基因型计算回归模型的RMSE

问题背景

示例数据:

genotype=rep(c("A","B","C","D","E"), each=5)
env=rep(c(10,20,30,40,50), time=5)
outcome=c(10,15,17,19,22,12,13,15,18,25,10,11,12,13,18,11,15,20,22,28,10,9,10,12,15)
dataA=data.frame(genotype,env,outcome)

需求:对每个基因型分组拟合outcome ~ env的线性模型,提取方差分析表中残差的均方(MSE),计算其平方根得到RMSE,批量处理超过100个基因型的数据集。


解决方案

方法1:Base R原生实现

用by()函数按分组变量批量处理数据,搭配自定义函数完成计算:

# 定义计算RMSE的函数
calc_rmse <- function(df) {
  model <- lm(outcome ~ env, data = df)
  # 从方差分析表中提取残差均方,计算平方根
  sqrt(anova(model)$"Mean Sq"[2])
}

# 按基因型分组计算RMSE
rmse_results <- by(dataA, dataA$genotype, calc_rmse)

# 转换为数据框方便查看
as.data.frame(rmse_results)

运行结果示例:

rmse_results
A           0.9659193
B           1.5811388
C           0.9659193
D           1.8708287
E           1.2247449

方法2:dplyr tidy风格实现

适合习惯tidyverse语法的场景,代码更简洁直观:

library(dplyr)

# 分组计算并返回结构化数据框
dataA %>%
  group_by(genotype) %>%
  summarize(
    rmse = sqrt(anova(lm(outcome ~ env, data = cur_data()))$"Mean Sq"[2])
  ) %>%
  ungroup()

方法3:purrr列表式实现

通过拆分数据列表+映射函数完成批量计算:

library(purrr)
library(tibble)

# 按基因型拆分数据为列表
data_list <- split(dataA, dataA$genotype)

# 对每个子数据集计算RMSE
rmse_values <- map_dbl(data_list, ~sqrt(anova(lm(outcome ~ env, data = .x))$"Mean Sq"[2]))

# 转换为规范数据框
tibble(genotype = names(rmse_values), rmse = rmse_values)

内容的提问来源于stack exchange,提问作者J.K Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:52:50