来自生存 coxph 和 rms cph 的不同预测图

机器算法验证 r 生存 cox模型
2022-03-17 02:54:19

我已经创建了我在本示例中使用的术语图的略微增强版本,您可以在此处找到它。我之前曾在SO上发过帖子,但我想得越多,我认为这可能与 Cox 比例风险模型的解释有关,而不是与实际编码有关。

问题

当我查看危险比图时,我希望有一个参考点,其中置信区间自然为 0,当我rms package使用survival package. coxph() 的行为是否正确,如果是,参考点是什么?此外, coxph() 中的虚拟变量有一个区间,并且该值不是吗?e0

例子

这是我的测试代码:

# Load libs
library(survival)
library(rms)

# Regular survival
survobj <- with(lung, Surv(time,status))

# Prepare the variables
lung$sex <- factor(lung$sex, levels=1:2, labels=c("Male", "Female"))
labels(lung$sex) <- "Sex"
labels(lung$age) <- "Age"

# The rms survival
ddist <- datadist(lung)
options(datadist="ddist")
rms_surv_fit <- cph(survobj~rcs(age, 4)+sex, data=lung, x=T, y=T)

cph 图

这段代码:

termplot2(rms_surv_fit, se=T, rug.type="density", rug=T, density.proportion=.05,
          se.type="polygon", yscale="exponential", log="y", 
          xlab=c("Age", "Sex"), 
          ylab=rep("Hazard Ratio", times=2),
          main=rep("cph() plot", times=2),
          col.se=rgb(.2,.2,1,.4), col.term="black")

给出了这个情节:

cph() 术语图2

coxph 图

这段代码:

termplot2(surv_fit, se=T, rug.type="density", rug=T, density.proportion=.05, 
          se.type="polygon", yscale="exponential", log="y", 
          xlab=c("Age", "Sex"), 
          ylab=rep("Hazard Ratio", times=2),
          main=rep("coxph() plot", times=2),
          col.se=rgb(.2,.2,1,.4), col.term="black")

给出了这个情节:

coxph() termplot2

更新

正如@Frank Harrell 建议的那样,在他最近的评论中调整了建议后,我得到了:

p <- Predict(rms_surv_fit, age=seq(50, 70, times=20), 
             sex=c("Male", "Female"), fun=exp)
plot.Predict(p, ~ age | sex,
             col="black",
             col.fill=gray(seq(.8, .75, length=5)))

这给了这个非常好的情节:

格子图

我在评论之后再次查看了 contrast.rms 并尝试了这段代码,它给出了一个情节......虽然可能还有更多可以做的事情:-)

w <- contrast.rms(rms_surv_fit, 
                  list(sex=c("Male", "Female"), 
                       age=seq(50, 70, times=20)))

xYplot(Cbind(Contrast, Lower, Upper) ~ age | sex, 
       data=w, method="bands")

给了这个情节:

对比图

更新 2

Thernau教授很客气地评论了缺乏自信腰的情节:

coxph 中的平滑样条曲线与 gam 中的样条曲线一样,被归一化,使得 sum(prediction) =0。所以我没有一个固定的单点,其方差非常小。

虽然我还不熟悉 GAM,但这似乎确实回答了我的问题:这似乎是一个解释问题。

1个回答

我认为肯定应该有一个置信区间为零宽度的点。您也可以尝试第三种方法,即仅使用 rms 函数。在 contrast.rms 的帮助文件下有一个示例,用于获取风险比图。它以注释 # 开始,按治疗和性别显示单独的估计值。您需要反对数才能获得比率。