rms包Predict函数多值预测异常:单值正常多值返回大量行
解决rms包Predict函数多值预测返回大量行的问题
问题根源
你用cph()构建Cox模型时设置了surv=T,这会让模型保存生存函数的相关信息。而Predict.rms()的默认行为是:对每个输入的预测样本,输出其在原始数据所有观测到的事件时间点上的生存概率(或衍生指标),因此36个样本乘以所有事件时间点的数量,就会产生远超预期的46566行结果。
解决方案
以下是几种按需选择的解决方式:
1. 获取每个样本的线性预测值(log风险)
指定fun=linear.predictors,直接返回每个样本的单一线性预测结果,共36行:
Predict(cox_model, Risk1=c(5,3,2,1.5,1.5,2,3,2.5,4,2,5.5,6,3,3.5,4,5,4.5,3,2,6,3,5,4,1.8,3,3.5,1.5,2.5,3.5,5,6,4,1.5,5,4,2.5), Risk2=c(1,1,1,1,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0,1,0,1,0,0,0,1,1,0,1,1,0,1,1,0,0,0), Risk3=c(0,0.07,0,0.03,0.01,0.02,0.01,0,0.05,0,0.04,0.03,0.01,0.01,0.01,0,0.11,0.03,0,0.05,0,0,0.02,0.04,0.01,0,0,0.01,0.03,0,0.01,0,0.06,0,0,0.1), fun=linear.predictors)
2. 获取每个样本的风险比(相对风险)
用fun=exp将线性预测值转换为风险比,同样返回36行:
Predict(cox_model, Risk1=c(5,3,2,1.5,1.5,2,3,2.5,4,2,5.5,6,3,3.5,4,5,4.5,3,2,6,3,5,4,1.8,3,3.5,1.5,2.5,3.5,5,6,4,1.5,5,4,2.5), Risk2=c(1,1,1,1,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0,1,0,1,0,0,0,1,1,0,1,1,0,1,1,0,0,0), Risk3=c(0,0.07,0,0.03,0.01,0.02,0.01,0,0.05,0,0.04,0.03,0.01,0.01,0.01,0,0.11,0.03,0,0.05,0,0,0.02,0.04,0.01,0,0,0.01,0.03,0,0.01,0,0.06,0,0,0.1), fun=exp)
3. 获取指定时间点的生存概率
如果需要特定时间点的生存概率,比如时间=50时的结果,添加time=50参数,每个样本对应一行:
Predict(cox_model, Risk1=c(5,3,2,1.5,1.5,2,3,2.5,4,2,5.5,6,3,3.5,4,5,4.5,3,2,6,3,5,4,1.8,3,3.5,1.5,2.5,3.5,5,6,4,1.5,5,4,2.5), Risk2=c(1,1,1,1,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0,1,0,1,0,0,0,1,1,0,1,1,0,1,1,0,0,0), Risk3=c(0,0.07,0,0.03,0.01,0.02,0.01,0,0.05,0,0.04,0.03,0.01,0.01,0.01,0,0.11,0.03,0,0.05,0,0,0.02,0.04,0.01,0,0,0.01,0.03,0,0.01,0,0.06,0,0,0.1), time=50)
4. 构建模型时去掉surv=T(可选)
如果不需要生存函数相关输出,构建模型时删除surv=T参数,此时Predict()默认返回线性预测值:
cox_model <-cph(Surv(Time,Event==1) ~ Risk1 + Risk2 + Risk3, x = T, y = T, data = df) # 多值预测直接返回36行线性预测值 Predict(cox_model, Risk1=c(5,3,2,1.5,1.5,2,3,2.5,4,2,5.5,6,3,3.5,4,5,4.5,3,2,6,3,5,4,1.8,3,3.5,1.5,2.5,3.5,5,6,4,1.5,5,4,2.5), Risk2=c(1,1,1,1,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0,1,0,1,0,0,0,1,1,0,1,1,0,1,1,0,0,0), Risk3=c(0,0.07,0,0.03,0.01,0.02,0.01,0,0.05,0,0.04,0.03,0.01,0.01,0.01,0,0.11,0.03,0,0.05,0,0,0.02,0.04,0.01,0,0,0.01,0.03,0,0.01,0,0.06,0,0,0.1))
内容的提问来源于stack exchange,提问作者user2110417
相关产品推荐
相关产品推荐

