使用lifelines的CoxPHFitter做生存分析时遇Series真值歧义错误
问题排查:lifelines CoxPHFitter 拟合时的 ValueError 错误
错误根源
核心问题:CoxPHFitter.fit()方法的duration_col和event_col参数需要传入列名字符串,而非直接传入pandas Series对象。
你当前传入的T = df['survival_time']和E = df['event_occurred']都是Series,当lifelines内部尝试判断self.event_col的布尔值时(如代码逻辑if self.event_col else ...),会触发pandas的经典报错——无法直接判断一个Series的真假,必须用any()/all()等方法,这就是你看到ValueError: The truth value of a Series is ambiguous的原因。
两种修正方案
方案1:合并生存数据到特征框,传入列名字符串
先把生存时间、事件状态列合并到特征数据框X中,再指定列名拟合:
from lifelines import CoxPHFitter import pandas as pd # 合并生存数据到特征数据框 X_combined = pd.concat([X, df['survival_time'], df['event_occurred']], axis=1) # 拟合模型,传入列名字符串 coxph = CoxPHFitter() coxph.fit(X_combined, duration_col='survival_time', event_col='event_occurred') print(coxph.summary())
方案2:直接使用原始全量数据框,指定列名
如果原始df已包含所有特征(CHOL、sex、age)和生存数据,可直接用df拟合:
from lifelines import CoxPHFitter coxph = CoxPHFitter() # 用原始df,指定生存时间、事件列,同时通过formula指定特征列 coxph.fit(df, duration_col='survival_time', event_col='event_occurred', formula="CHOL + sex + age") print(coxph.summary())
也可以省略formula,让模型自动使用df中除生存、事件列外的所有列作为特征。
验证说明
两种方案本质都是让duration_col和event_col接收字符串类型的列名,而非Series对象,从而让lifelines内部正确识别并处理数据,解决报错问题。
内容的提问来源于stack exchange,提问作者Lucy Janssens
相关产品推荐
相关产品推荐

