生存资料Cox回归校准曲线绘制(2)

原始数据参考文章《生存资料Cox回归校准曲线绘制(1)》

方法3:

canshu<- val.surv(fit= model, # 模型
              newdata = veteran, # 测试集
              u=100, # 时间
              evaluate = 10,#设置点的数目以获取校准曲线
              S=Surv(veteran$time,veteran$status) 
)
plot(canshu,
     xlab="Predicted Probability of Surviving 100 Days",
     ylab="Actual Probability of Surviving 100 Days")

 方法4:

#模型预测概率
train_pre <- c((summary(survfit(model, newdata=train), times=100)$surv))
head(train_pre)
#切分四个点
cut <- unique(quantile(c(0, 1, train_pre), seq(0, 1, length = 5), na.rm = TRUE))
cut
#用K-M法估计生存概率
library(rms)
km_surv<- groupkm(train_pre,
                   Srv = Surv(train_df$time,train_df$status),
                   u = 100,
                   cuts = cuts)
km_surv
#简单图
plot(km_surv[,1], km_surv[,4],xlim=c(0,1),ylim=c(0,1))
lines(km_surv[,1], km_surv[,4])
#美化
plot(km_surv[,1], km_surv[,4],
     xlim=c(0,1),ylim=c(0,1),
     xlab = 'Predicted 100-day Survival Probability',
     ylab = 'Observed 100-day Survival Probability',
     main="Calibration curves",
     col="red"
);lines(km_surv[,1], km_surv[,4],col="red")
# 计算误差线范围
errl <- ifelse(km_surv[,"KM"] == 0, 0,  
               km_surv[,"KM"] * exp(1.959964 * (-km_surv[,"std.err"])))
errh <- ifelse(km_surv[,"KM"] == 0, 0, 
               pmin(1, km_surv[,"KM"] * exp(1.959964 * km_surv[,"std.err"])))
# 添加误差线
errbar(x = km_surv[,"x"],
       y = km_surv[,"KM"],
       yminus = errl,yplus = errh,
       add = T,
       pch=16,cex=1,
       asp=1,xaxs='i',yaxs='i',col="red")
# 添加对角线
abline(a = 0,b = 1,col='grey')
#继续添加
#用K-M法估计生存概率
library(rms)
km_surv_1<- groupkm(train_pre,
                  Srv = Surv(train_df$time,train_df$status),
                  u = 200,
                  cuts = cuts)
km_surv_1
lines(km_surv_1[,1], km_surv_1[,4],col="blue")
# 计算误差线范围
errl <- ifelse(km_surv_1[,"KM"] == 0, 0,  
               km_surv_1[,"KM"] * exp(1.959964 * (-km_surv_1[,"std.err"])))
errh <- ifelse(km_surv_1[,"KM"] == 0, 0, 
               pmin(1, km_surv_1[,"KM"] * exp(1.959964 * km_surv_1[,"std.err"])))
# 添加误差线
errbar(x = km_surv_1[,"x"],
       y = km_surv_1[,"KM"],
       yminus = errl,yplus = errh,
       add = T,
       pch=16,cex=1,
       asp=1,xaxs='i',yaxs='i',col="blue")
#添加图例
legend("topleft",legend = c("100 days","200 days"),fill=c("red","blue"))

<think>好的,我现在需要帮助用户了解如何在Python或R中绘制Cox比例风险模型的校准曲线。首先,我要回忆一下Cox模型校准曲线的基本概念。校准曲线用于评估模型预测的风险与实际观察到的风险之间的一致性。对于生存分析,这可能涉及时间依赖的校准,比如在特定时间点的比较。 接下来,我需要考虑用户提到的两种工具:Python和R。根据提供的引用,用户之前可能接触过R中的方法,比如引用[1]提到的校准方法1和方法2,但这次想用Python或R实现。另外,引用[3]指出在Python中可以使用lifelines包进行Cox回归,而引用[2]和[3]都提到了Cox模型在Python中的实现。 首先,对于R语言部分,我记得survival和riskRegression包可能相关。比如,riskRegression包中的calPlot函数可以绘制校准曲线。可能需要加载这些包,然后使用Cox模型拟合数据,最后调用校准函数。需要确认步骤是否正确,比如数据准备、模型拟合、校准曲线生成。可能需要使用calibrate函数,并指定时间点,比如1年或5年生存率。 对于Python部分,lifelines库支持生存分析,但不确定是否有内置的校准曲线功能。引用[4]提到决策曲线绘制,但校准曲线不同。可能需要手动计算预测风险与实际事件的差异。例如,将样本分成风险组,计算每组的平均预测风险和观察到的风险,然后绘图。这可能需要结合其他库如scikit-survival或自定义函数。 还需要注意校准曲线的解读,比如理想情况下曲线应接近对角线,偏离则表示预测存在偏差。可能还需要使用Brier分数或校准斜率来量化校准程度。 现在需要整理步骤,确保方法正确,并引用用户提供的参考资料。例如,在R中使用riskRegression包的方法,而在Python中可能需要组合lifelines和手动计算。同时,示例代码需要符合用户的要求,正确使用LaTeX格式,并生成相关问题。</think>### Cox模型校准曲线绘制方法 #### **R语言实现方法** 1. **安装加载包** ```r library(survival) library(riskRegression) ``` 2. **数据准备与模型拟合** ```r data(veteran) # 使用内置数据集 cox_model <- coxph(Surv(time, status) ~ age + celltype, data = veteran) ``` 3. **校准曲线绘制** ```r cal <- calibrate(cox_model, formula = Surv(time, status) ~ 1, times = 365, # 指定评估时间点(例如1年生存率) method = "quantile", n_groups = 5) plot(cal, xlab="预测风险", ylab="实际风险", axes=TRUE) ``` *解读*:校准曲线横轴为预测风险,纵轴为实际观察风险。理想情况下散点应沿对角线分布,偏离对角线表示模型存在高估或低估风险[^1]。 --- #### **Python实现方法** Python需结合`lifelines`和自定义计算: 1. **安装库** ```python !pip install lifelines scikit-survival matplotlib ``` 2. **数据准备与模型拟合** ```python from lifelines import CoxPHFitter from sklearn.model_selection import train_test_split data = load_survival_data() # 假设已加载生存数据 train, test = train_test_split(data) cph = CoxPHFitter().fit(train, "time", "status") ``` 3. **校准曲线计算与绘图** ```python import numpy as np import matplotlib.pyplot as plt # 计算预测风险 test["pred_risk"] = 1 - cph.predict_survival_function(test, times=365).T # 分箱计算实际风险 test["risk_group"] = pd.qcut(test["pred_risk"], 5) observed_risk = test.groupby("risk_group")["status"].mean() predicted_risk = test.groupby("risk_group")["pred_risk"].mean() # 绘制校准曲线 plt.plot(predicted_risk, observed_risk, 'o-', label="Cox模型") plt.plot([0,1], [0,1], 'k--', label="理想校准") plt.xlabel("预测风险") plt.ylabel("实际风险") plt.legend() plt.show() ``` *解读*:若点分布在虚线附近,说明模型校准良好;若点高于虚线,则模型低估风险;若低于虚线,则高估风险[^4]。 --- #### **校准指标补充** - **Brier分数**:评估预测概率准确性,值越小越好 $$ \text{Brier Score} = \frac{1}{N}\sum_{i=1}^N (y_i - \hat{p}_i)^2 $$ - **校准斜率**:通过回归分析$\log\left(\frac{\hat{p}}{1-\hat{p}}\right)$与实际事件关系,理想斜率为1 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值