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

如何将双循环下的模型交叉验证评估指标存入DataFrame?

解决R语言循环存储交叉验证AUC到DataFrame的问题

你的核心问题是循环中未计算正确的行索引,导致后续循环覆盖了之前的AUC值。以下是两种可靠的实现方案:

方案1:预先初始化DataFrame(推荐,效率更高)

预先根据变量组合数和折数创建足够行数的DataFrame,直接通过计算索引赋值,避免动态修改的性能损耗:

# 计算总记录数:变量组合数 × 10折
total_rows <- length(var_combinations) * 10

# 预先创建结构完整的DataFrame
Table <- data.frame(
  Model = rep(paste0("j=", seq_along(var_combinations)), each = 10),
  Fold = rep(paste0("i=", 1:10), times = length(var_combinations)),
  AUC = numeric(total_rows),
  stringsAsFactors = FALSE
)

# 双层循环遍历变量组合与折数
for (j in seq_along(var_combinations)) {
  for(i in 1:10) {
    # --- 这里插入你的模型训练与AUC计算代码 ---
    # 示例:从已训练好的模型列表中提取并计算AUC
    # current_model <- models_vgam[[j]][[i]]
    # auc <- ... # 替换为你的AUC计算逻辑,比如使用pROC包的roc()函数
    
    # 计算当前循环对应的行索引:(j-1)*10 + i
    row_idx <- (j - 1) * 10 + i
    # 为对应行的AUC赋值
    Table$AUC[row_idx] <- auc
  }
}

方案2:动态添加行(适合小数据量)

如果变量组合数量不多,可以直接在每次循环中构造新行并追加到DataFrame:

# 初始化空DataFrame
Table <- data.frame(
  Model = character(),
  Fold = character(),
  AUC = numeric(),
  stringsAsFactors = FALSE
)

for (j in seq_along(var_combinations)) {
  for(i in 1:10) {
    # --- 模型训练与AUC计算 ---
    # auc <- ...
    
    # 构造当前循环的记录行
    new_row <- data.frame(
      Model = paste0("j=", j),
      Fold = paste0("i=", i),
      AUC = auc,
      stringsAsFactors = FALSE
    )
    # 追加到DataFrame
    Table <- rbind(Table, new_row)
  }
}

问题原因说明

你之前使用Table[i + 1, 3] <- auc的方式,当j进入下一轮循环时,i会重新从1开始,导致覆盖上一个j对应的行数据,最终只保留了最后一个变量组合的10折结果。而通过(j-1)*10 + i计算的索引,能确保每个j和i的组合对应唯一的行,不会出现覆盖问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:25:28