简介:
可以使用coxph
包的survival
函数估算Cox比例风险(PH)模型。从这种类型的模型中获得明显结果的明显要求是危险是成比例的,即它们随时间是恒定的。如果对于某个变量不是这种情况,可以通过使该可变时间的系数变化来解决。 (现在它在技术上是一个扩展的Cox模型。)这是通过将tt()
添加到该变量并指定一段时间的函数来完成的(参见vignette("timedep", package = "survival")
第19页+)。
问题:
如果在未指定功能的情况下使用tt()
,则使用哪个功能?
以下是一个例子:
library(survival)
data(lung)
cox_model <- coxph(Surv(time, status) ~ age + sex + ph.karno, data = lung)
cox_model_ph <- cox.zph(cox_model)
# rho chisq p
# age 0.00701 0.00871 0.92566
# sex 0.12249 2.42336 0.11954
# ph.karno 0.23135 8.24167 0.00409
# GLOBAL NA 11.54750 0.00911
我们发现ph.karno
违反了PH假设(小p值),因此添加tt()
:
cox_model_tt <- coxph(Surv(time, status) ~ age + sex + tt(ph.karno), data = lung)
cox_model_tt_ph <- cox.zph(cox_model_tt)
# rho chisq p
# age -0.00907 0.0142 0.9052
# sex 0.12844 2.7270 0.0987
# tt(ph.karno) 0.11643 2.3846 0.1225
# GLOBAL NA 5.0220 0.1702
现在PH假设已经满足,但我不知道tt()
函数究竟做了什么。我尝试了一些常用的功能,例如tt = function(x, t, ...) x*t
,tt = function(x, t, ...) x + t
,tt = function(x, t, ...) x*log(t)
。但是所有结果都不同(并且无法修复PH违规)。
感谢任何帮助。
答案 0 :(得分:2)
查看coxph
的代码,我想如果找到它的话。你没有为'tt'参数提供任何值,所以我认为这会被执行:
if (is.null(tt)) {
tt <- function(x, time, riskset, weights) {
obrien <- function(x) {
r <- rank(x)
(r - 0.5)/(0.5 + length(r) - r)
}
unlist(tapply(x, riskset, obrien))
}
这是一个实验性的确认:
> cox_model_OB <- coxph(Surv(time, status) ~ age + sex + tt(ph.karno), data = lung, tt= function(x, time, riskset, weights) {
+ obrien <- function(x) {
+ r <- rank(x)
+ (r - 0.5)/(0.5 + length(r) - r)
+ }
+ unlist(tapply(x, riskset, obrien))
+ }
+ )
> ( cox_model_tt_ph <- cox.zph(cox_model_tt) )
rho chisq p
age -0.00907 0.0142 0.9052
sex 0.12844 2.7270 0.0987
tt(ph.karno) 0.11643 2.3846 0.1225
GLOBAL NA 5.0220 0.1702
我想知道这是否是故意的。我怀疑它是在开发会话期间留下的代码。我怀疑Therneau打算不提供'tt'功能应至少发出警告,但可能更喜欢错误。
所以这是一个猜测,我发现我错了,通过搜索小插图并发现它是有意的:“这依赖于tt()的输入参数按事件编号或风险集排序的事实。如果在coxph调用中没有tt参数,则用作默认值,但在模型公式中有tt项。(这样做允许我折旧survobrien函数)。参考:当前生存包索引帮助页面链接到Vignettes的“使用Cox模型中的时间相关协变量和时间相关系数”的第23页。