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

如何遍历两个列表的所有组合执行机器学习建模分析

问题描述

我需要先按特定条件筛选数据(根据列值移除行),再用筛选后的数据训练模型。之后重新获取原始数据,用相同或不同条件测试模型,最后绘制ROC曲线和瀑布图。核心需求是遍历两个列表的所有组合完成上述分析,比如:

list1 = list(c('a','b','c'),c('A','B','C'))
list2 = list(c('x','y','z'),c('X','Y','Z'))

要依次执行以下组合:

  • c('a','b','c') + c('x','y','z')
  • c('a','b','c') + c('X','Y','Z')
  • c('A','B','C') + c('x','y','z')
  • c('A','B','C') + c('X','Y','Z')

下面是我当前的代码,现在use_train和use_test内容一致,但后续会调整,分开处理两个列表更方便。目前只用了单循环,所有模型和图表都存在预定义列表里,请问是不是需要用嵌套循环来实现所有组合的遍历?

use_train = list(c('CR','PR','SD'),c('CR','PR','SD','PD')) # 训练模型用的筛选条件
use_test = list(c('CR','PR','SD'), c('CR','PR','SD','PD')) # 测试模型用的筛选条件

xgb_models = auc_test = auc_test_plot = data_list = waterfall = list() 

for(i in 1:length(use_train)){
  
  data_list[[i]] = create_data(mydata,metadata, 
                                  recist.use = use_train[[i]], case = 'CR', use_batch = FALSE, seed=40)
  
  xgb_models[[i]] = train_ici(data_list[[i]])
  #parallelStop()
  
  auc_test[[i]] = evaluate_model(xgb_models[[i]], mydata, metadata, 
                         recist.use = use_test[[i]], case = 'CR' , use_batch = FALSE, seed = 40)
  
  auc_test_plot[[i]] = evaluate_model_plot(xgb_models[[i]], data_list[[i]][[2]])
  
  waterfall[[i]] = waterfall(xgb_models[[i]], metadata, data_list[[i]][[2]], case  = 'CR',
                                train.recist = use_train[[i]], test.recist = use_test[[i]])
}

最终需要完成4轮分析:

  1. use_train取c('CR','PR','SD'),use_test取c('CR','PR','SD')
  2. use_train取c('CR','PR','SD'),use_test取c('CR','PR','SD','PD')
  3. use_train取c('CR','PR','SD','PD'),use_test取c('CR','PR','SD')
  4. use_train取c('CR','PR','SD','PD'),use_test取c('CR','PR','SD','PD')

补充数据

以下是create_data函数处理后的数据样本,可直接用于train_ici函数:

structure(list(`totaldata_new[, "RECIST"]` = c("PD", "SD", "PR", 
"PD", "PD", "PD", "PD", "PR", "SD", "PD", "SD", "PD", "PD", "PD", 
"PR", "CR", "PD", "PR", "SD", "SD", "SD", "PD", "SD", "PR", "PD"
), Gender = c("male", "female", "female", "female", "male", "female", 
"female", "male", "male", "male", "female", "male", "female", 
"female", "male", "female", "female", "male", "male", "male", 
"female", "male", "female", "male", "male"), treatment = c("anti-PD1", 
"anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", 
"anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", 
"anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", 
"anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1", "anti-PD1"
), Cancer_Type = c("Melanoma", "Melanoma", "Melanoma", "Melanoma", 
"Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", 
"Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", 
"Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", "Melanoma", 
"Melanoma", "Melanoma", "Melanoma"), `CD4-T-cells` = c(-0.0741098696855045, 
-0.094401270881699, 0.0410284948786532, -0.163302950330185, -0.0942478217207681, 
-0.167314411991775, -0.118272811489486, -0.0366277340916379, 
-0.0349008907108641, -0.167823357941815, -0.0809646843667242, 
-0.140727850456348, -0.148668434567449, -0.0726825919321525, 
-0.062499826731091, -0.0861178015030313, -0.117687306656149, 
-0.141342090175904, -0.206661192280272, -0.15593285099477, -0.0897617831679252, 
-0.0627645386986058, -0.136416087222329, -0.100351419040291, 
-0.167041995646525)), row.names = c("Pt1", "Pt10", "Pt101", "Pt103", 
"Pt106", "Pt11", "Pt17", "Pt18", "Pt2", "Pt24", "Pt26", "Pt27", 
"Pt28", "Pt29", "Pt3", "Pt30", "Pt31", "Pt34", "Pt36", "Pt37", 
"Pt38", "Pt39", "Pt4", "Pt44", "Pt46"), class = "data.frame")

解决方案

是的,必须用嵌套循环才能覆盖use_train和use_test的所有组合。单循环只能对应两个列表索引相同的情况,没法实现交叉组合。

修改后的代码如下:

use_train = list(c('CR','PR','SD'),c('CR','PR','SD','PD'))
use_test = list(c('CR','PR','SD'), c('CR','PR','SD','PD'))

# 初始化存储列表,用命名索引更方便后续查找
xgb_models = list()
auc_test = list()
auc_test_plot = list()
data_list = list()
waterfall = list()

# 嵌套循环遍历所有组合
for (i in 1:length(use_train)) {
  for (j in 1:length(use_test)) {
    # 生成唯一的组合名称,方便后续索引
    combo_name = paste0("train_", paste(use_train[[i]], collapse = "_"), 
                       "_test_", paste(use_test[[j]], collapse = "_"))
    
    # 1. 创建训练数据
    data_list[[combo_name]] = create_data(mydata, metadata, 
                                          recist.use = use_train[[i]], case = 'CR', 
                                          use_batch = FALSE, seed = 40)
    
    # 2. 训练模型
    xgb_models[[combo_name]] = train_ici(data_list[[combo_name]])
    
    # 3. 评估模型
    auc_test[[combo_name]] = evaluate_model(xgb_models[[combo_name]], mydata, metadata, 
                                            recist.use = use_test[[j]], case = 'CR', 
                                            use_batch = FALSE, seed = 40)
    
    # 4. 绘制ROC曲线
    auc_test_plot[[combo_name]] = evaluate_model_plot(xgb_models[[combo_name]], 
                                                      data_list[[combo_name]][[2]])
    
    # 5. 绘制瀑布图
    waterfall[[combo_name]] = waterfall(xgb_models[[combo_name]], metadata, 
                                        data_list[[combo_name]][[2]], case = 'CR',
                                        train.recist = use_train[[i]], 
                                        test.recist = use_test[[j]])
  }
}

代码说明

  1. 嵌套循环:外层循环遍历use_train的每个条件,内层循环遍历use_test的每个条件,确保所有4种组合都被执行。
  2. 命名索引:用combo_name生成每个组合的唯一标识(比如train_CR_PR_SD_test_CR_PR_SD),后续查看结果时能快速对应到具体的训练/测试条件,比数字索引更直观。
  3. 逻辑保留:完全保留了你原本的分析流程,只是把单循环改成嵌套循环,同时优化了结果存储的可读性。

这样运行后,就能自动完成你需要的4轮分析,每个组合的模型、评估结果、图表都会存在对应的列表中,方便后续查看和对比。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:31:32