首页 文章

绘制来自coxph对象的估计HR与时间相关系数和样条曲线

提问于
浏览
6

我想绘制估计风险比作为时间的函数,在具有基于样条项的时间相关系数的情况下_822176_模型 . 我使用函数 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 系数与结合并以实际绘制函数 . 任何领导都非常感激 .

1 回答

  • 4

    我认为您需要的是通过使用 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()
    

    Plot of HR vs age

    注意,这里的年龄是感兴趣时的年龄(即基线年龄和自研究进入以来经过的时间的总和) . 它必须使用指定的范围来匹配原始模型中的参数 . 它也可以使用 x 使用 x = TRUE 输出计算,如下所示:

    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])))
    

相关问题