Cox模型选择:如何调整代码测试所有变量组合筛选最优模型
基于AIC筛选最优Cox模型变量组合的实现方案
你需要遍历所有可能的协变量组合,拟合Cox模型并比较AIC值来选择最优模型。注意:followup是生存时间列,CRD是事件结局列,这两个不能作为协变量放入模型自变量,需单独区分。
修改后的代码实现
import itertools from lifelines import CoxPHFitter # 区分协变量与结局相关列 covariates = ['v1', 'v3', 'v4', 'v5'] duration_col = "followup" event_col = "CRD" # 存储所有模型的变量组合与对应AIC值 model_results = [] # 遍历1个到全部协变量的所有组合 for k in range(1, len(covariates)+1): for combo in itertools.combinations(covariates, k): # 构造模型所需的列:协变量组合 + 结局列 cols = list(combo) + [duration_col, event_col] # 拟合Cox模型 cph = CoxPHFitter() cph.fit(df[cols], duration_col=duration_col, event_col=event_col, step_size=0.5) # 记录结果 model_results.append({ 'variables': combo, 'partial_AIC': cph.AIC_partial_ }) # 按AIC值升序排序(AIC越小拟合效果越好) model_results.sort(key=lambda x: x['partial_AIC']) # 输出最优模型信息 print("最优模型:") print(f"变量组合: {model_results[0]['variables']}") print(f"部分AIC值: {model_results[0]['partial_AIC']:.5f}") # 可选:输出所有模型的排序结果 print("\n所有模型AIC排序:") for idx, res in enumerate(model_results, 1): print(f"排名{idx}: 变量={res['variables']}, 部分AIC={res['partial_AIC']:.5f}")
代码说明
- 用
itertools.combinations生成所有非空协变量子集,覆盖从单个变量到全变量的所有可能组合。 - 每个组合对应拟合一个Cox模型,提取部分AIC(
cph.AIC_partial_)作为评估指标。 - 按AIC升序排序后,AIC最小的模型即为拟合效果最优的模型。
内容的提问来源于stack exchange,提问作者Mischa
相关产品推荐
相关产品推荐

