用时间相关系数和样条曲线绘制coxph对象的估计HR
我想在用时间相关系数和样条曲线绘制coxph对象的估计HR,r,spline,cox-regression,R,Spline,Cox Regression,我想在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
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
术语()的模型
您可以使用cox$linear.predictors
提取线性预测值,但我需要以某种方式提取年龄,而不是简单地提取时间。因为tt
根据事件时间分割数据集,所以我不能将输入数据帧的列与coxph
输出匹配。此外,我真的想绘制估计函数本身,而不仅仅是对观测数据点的预测
这里有涉及样条曲线,但不涉及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)))
}
spline.obj=pspline(lung$age)
str(spline.obj)
#看起来很有用的东西,但我不确定它是什么
#cbase似乎是主要节点
属性(spline.obj,“printfun”)
函数(coef,var,var2,df,history,cbase=c,
51.9, 56.2, 60.5, 64.8, 69.1, 73.4, 77.7, 82, 86.3, 90.6))
{
test1我认为您所需要的可以通过使用pspline
生成一个输入矩阵,并将其乘以coxph
输出的相关系数来生成。要获得HR,您需要取指数
i、 e
据我所知,lung数据集对于每个患者只有一行。您需要扩展数据集,以便有多行带有t
-向量的数据。因此,我必须基本上重新创建tt
在引擎盖下做什么?我不相信有办法让tt
返回长格式的dat另外,如果我这样做了,我仍然会被困在绘制观测数据点的预测上,对吗?如果你当前的努力出现了错误,那么为什么你会对我制定不同策略的努力感到恼火?据我所知,你没有一组与时间相关的日期点。如果你想要加速d-时间回归解那么你应该“走到板上”这么说吧。事实上,我一点也不生气。我问的是澄清问题。你说得对,我没有时间相关的日期点,虽然AFT模型的想法很有意义,但我的目标之一是直接比较有样条线的考克斯模型和没有样条线的考克斯模型。太好了!非常感谢!我可能会使用基于这种方法的绘图ach正在写论文,如果你愿意的话,我很高兴向你致谢。@half pass非常高兴你向我致谢。我刚刚仔细考虑了一下这个问题(并查看了生存代码:::coxpenal.fit
),我意识到我应该从log(HR)中减去平均数*系数之和。我编辑了上面的代码以反映这一点。图形的形状相同,但y轴上的数字会移动。HR线穿过1也更有意义。啊,是的!我的实际示例使用了二进制协变量,因此不需要。谢谢!
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()
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])))