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

R语言中针对分组的Leave-one-out留一法实现问题

分组级留一法分析:结果转换与扩展方案

我来帮你一步步解决这个分组级留一法的问题,针对你的三个疑问逐一解答:


1. 将循环输出转换为数据框

你不用再手动整理打印的结果,用sapply批量收集结果后转成数据框更高效:

# 用sapply遍历每个分组,收集分组名和对应AIC
result_list <- sapply(unique(delete$f), function(i) {
  model <- glm(data = delete[delete$f != i, ], yi ~ vi)
  c(group = i, aic = model$aic)
})
# 转置矩阵并转换为数据框,同时修正数据类型
result_df <- as.data.frame(t(result_list), stringsAsFactors = FALSE)
result_df$aic <- as.numeric(result_df$aic)

print(result_df)

这样就能得到一个结构规整的两列数据框,包含分组标识和对应的AIC值。


2. 同时获取模型系数的简化方案

完全不需要分开处理再合并!你可以在同一个处理函数里一次性提取所有需要的信息,直接生成包含多列的数据框:

full_result <- lapply(unique(delete$f), function(i) {
  sub_data <- delete[delete$f != i, ]
  model <- glm(yi ~ vi, data = sub_data)
  # 一次性提取分组、AIC、模型系数
  coefs <- coef(model)
  data.frame(
    group_excluded = i,
    aic = model$aic,
    intercept = coefs["(Intercept)"],
    vi_coefficient = coefs["vi"],
    stringsAsFactors = FALSE
  )
})
# 把列表合并为单个数据框
full_result_df <- do.call(rbind, full_result)

print(full_result_df)

这种方式一步到位,避免了多次处理和合并的繁琐操作。


3. 用lapply+split实现分组子集分析

split可以帮你把原始数据按分组拆分成列表,之后遍历列表名称,排除对应分组后建模即可:

# 先按f分组,得到每个分组的子数据列表
grouped_data <- split(delete, delete$f)

# 遍历每个分组名称,排除该分组后分析
split_result <- lapply(names(grouped_data), function(group_name) {
  # 合并除当前分组外的所有数据
  sub_data <- do.call(rbind, grouped_data[names(grouped_data) != group_name])
  model <- glm(yi ~ vi, data = sub_data)
  data.frame(
    group_excluded = group_name,
    aic = model$aic,
    stringsAsFactors = FALSE
  )
})
split_result_df <- do.call(rbind, split_result)

print(split_result_df)

这种方式逻辑更直观,尤其适合后续需要对分组做更复杂操作的场景。


适配metafor包的实际需求

你提到实际是用metafor::rma函数,只需要替换上述代码中的模型函数和提取的指标即可,示例如下:

library(metafor)

rma_leave_one_group <- lapply(unique(delete$f), function(i) {
  sub_data <- delete[delete$f != i, ]
  model <- rma(yi, vi, data = sub_data)
  data.frame(
    group_excluded = i,
    ci.lb = model$ci.lb,
    ci.ub = model$ci.ub,
    stringsAsFactors = FALSE
  )
})
rma_result_df <- do.call(rbind, rma_leave_one_group)

完美适配你需要的分组级留一法,弥补metafor内置leave1out仅支持单观测的局限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:05:55