【问题标题】:Plotting estimated HR from coxph object with time-dependent coefficient and splines使用时间相关系数和样条从 coxph 对象绘制估计的 HR
【发布时间】:2015-06-28 22:00:27
【问题描述】:

coxph 模型的情况下,我想将估计的风险比绘制为时间函数,该模型具有基于样条项的时间相关系数。我使用函数 tt 创建了时间相关系数,类似于直接来自 ?coxph 的示例:

# Fit a time transform model using current age
cox = coxph(Surv(time, status) ~ ph.ecog + tt(age), data=lung,
     tt=function(x,t,...) pspline(x + t/365.25))

调用survfit(cox) 会导致survfit 无法理解带有tt 术语(as described in 2011 by Terry Therneau) 的模型的错误。

您可以使用cox$linear.predictors 提取线性预测器,但我需要以某种方式提取年龄,并且不那么琐碎地提取每个时间。因为tt 在事件时间上拆分数据集,所以我不能只将输入数据框的列与coxph 输出匹配。此外,我真的很想绘制估计函数本身,而不仅仅是观察到的数据点的预测。

这里有a related question涉及样条,但不涉及tt

编辑 (7/7)

我仍然坚持这一点。我一直在深入研究这个对象:

spline.obj = pspline(lung$age)
str(spline.obj)

# something that looks very useful, but I am not sure what it is
# cbase appears to be the cardinal knots
attr(spline.obj, "printfun")

function (coef, var, var2, df, history, cbase = c(43.3, 47.6, 
51.9, 56.2, 60.5, 64.8, 69.1, 73.4, 77.7, 82, 86.3, 90.6)) 
{
    test1 <- coxph.wtest(var, coef)$test
    xmat <- cbind(1, cbase)
    xsig <- coxph.wtest(var, xmat)$solve
    cmat <- coxph.wtest(t(xmat) %*% xsig, t(xsig))$solve[2, ]
    linear <- sum(cmat * coef)
    lvar1 <- c(cmat %*% var %*% cmat)
    lvar2 <- c(cmat %*% var2 %*% cmat)
    test2 <- linear^2/lvar1
    cmat <- rbind(c(linear, sqrt(lvar1), sqrt(lvar2), test2, 
        1, 1 - pchisq(test2, 1)), c(NA, NA, NA, test1 - test2, 
        df - 1, 1 - pchisq(test1 - test2, max(0.5, df - 1))))
    dimnames(cmat) <- list(c("linear", "nonlin"), NULL)
    nn <- nrow(history$thetas)
    if (length(nn)) 
        theta <- history$thetas[nn, 1]
    else theta <- history$theta
    list(coef = cmat, history = paste("Theta=", format(theta)))
}

所以,我有结,但我仍然不确定如何将 coxph 系数与结结合以实际绘制函数。非常感谢任何潜在客户。

【问题讨论】:

  • 据我所知,每个患者的肺数据集只有一行。您需要扩展数据集,以便有多行带有t-vector 的数据。
  • 所以我必须基本上重新创建 tt 在幕后所做的事情?我不相信有办法让tt 返回长格式数据集...
  • 另外,如果我这样做,我仍然会被困在只绘制观察数据点的预测,对吧?
  • 如果您在当前的努力中遇到了错误,那么您为什么对我制定不同策略的努力感到恼火?据我所知,您没有一组与时间相关的日期点。如果您想要一个加速时间回归解决方案,那么您应该“步入正轨”并这么说。
  • 其实我一点也不生气。我问的是澄清问题。你说得对,我没有时间相关的日期点,虽然 AFT 模型的想法很有意义,但我的目标之一是直接将带有样条的 Cox 模型与没有样条的 Cox 模型进行比较。

标签: r spline cox-regression


【解决方案1】:

我认为可以通过使用pspline 生成输入矩阵并将其与coxph 输出中的相关系数相乘来生成您需要的内容。要获得 HR,您需要取指数。

output <- data.frame(Age = seq(min(lung$age) + min(lung$time) / 365.25,
                               max(lung$age + lung$time / 365.25),
                               0.01))
output$HR <- exp(pspline(output$Age) %*% cox$coefficients[-1] -
                 sum(cox$means[-1] * cox$coefficients[-1]))
library("ggplot2")
ggplot(output, aes(x = Age, y = HR)) + geom_line()

请注意,此处的年龄是感兴趣时间的年龄(即基线年龄和自研究开始后经过的时间之和)。它必须使用指定的范围来匹配原始模型中的参数。也可以使用x = TRUEx 输出来计算,如下所示:

cox <- coxph(Surv(time, status) ~ ph.ecog + tt(age), data=lung,
             tt=function(x,t,...) pspline(x + t/365.25), x = TRUE)
index <- as.numeric(unlist(lapply(strsplit(rownames(cox$x), "\\."), "[", 1)))
ages <- lung$age[index]
output2 <- data.frame(Age = ages + cox$y[, 1] / 365.25,
                      HR = exp(cox$x[, -1] %*% cox$coefficients[-1] -
                               sum(cox$means[-1] * cox$coefficients[-1])))

【讨论】:

  • 完美!非常感谢!我可能会在一篇正在进行的论文中使用基于这种方法的情节,如果您愿意,我很乐意感谢您。
  • @half-pass 很高兴你承认我。我刚刚对此进行了更多思考(并查看了survival:::coxpenal.fit 的代码)并意识到我应该从log(HR) 中减去means * coefficients 的总和。我已经编辑了上面的代码以反映这一点。图形的形状相同,但 y 轴上的数字移动。 HR 线穿过 1 也更有意义。
  • 啊,是的!我的实际示例使用了二元协变量,因此没有必要。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-08-18
  • 2013-02-10
  • 2016-09-18
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
相关资源
最近更新 更多