【发布时间】:2026-01-13 07:45:01
【问题描述】:
我正在进行生存分析,但似乎无法弄清楚该怎么做。
来自 MSTATE 教程,以下是用于简单 Cox 回归的代码块。
如何计算每个非吸收状态的平均逗留时间?
代码:
library(mstate)
data(ebmt3)
tmat <- trans.illdeath(names=c("Tx","PR","RelDeath"))
ebmt3$prtime <- ebmt3$prtime/365.25
ebmt3$rfstime <- ebmt3$rfstime/365.25
covs <- c("dissub", "age", "drmatch", "tcd", "prtime")
msbmt <- msprep(time = c(NA, "prtime", "rfstime"), status = c(NA, "prstat", "rfsstat"), data = ebmt3, trans = tmat, keep = covs)
expcovs <- expand.covs(msbmt, covs[2:3], append = FALSE)
msbmt <- expand.covs(msbmt, covs, append = TRUE, longnames = FALSE)
c1 <- coxph(Surv(Tstart, Tstop, status) ~ dissub1.1 + dissub2.1 +
age1.1 + age2.1 + drmatch.1 + tcd.1 + dissub1.2 + dissub2.2 +
age1.2 + age2.2 + drmatch.2 + tcd.2 + dissub1.3 + dissub2.3 +
age1.3 + age2.3 + drmatch.3 + tcd.3 + strata(trans), data = msbmt,
method = "breslow")
newd <- data.frame(dissub = rep(0, 3), age = rep(0, 3), drmatch = rep(0,
3), tcd = rep(0, 3), trans = 1:3)
newd$dissub <- factor(newd$dissub, levels = 0:2, labels = levels(ebmt3$dissub))
newd$age <- factor(newd$age, levels = 0:2, labels = levels(ebmt3$age))
newd$drmatch <- factor(newd$drmatch, levels = 0:1, labels = levels(ebmt3$drmatch))
newd$tcd <- factor(newd$tcd, levels = 0:1, labels = levels(ebmt3$tcd))
attr(newd, "trans") <- tmat
class(newd) <- c("msdata", "data.frame")
newd <- expand.covs(newd, covs[1:4], longnames = FALSE)
newd$strata = 1:3
newd
msf1 <- msfit(c1, newdata = newd, trans = tmat)
谢谢!
【问题讨论】:
-
我假设这是家庭作业?您应该首先描述转换矩阵的结构。对于各种协变量值,转换将是不同的。如果您想要转换概率(从中得出平均逗留值,因为这是一个马尔可夫模型),您需要指定需要哪些协变量值。阅读
?msfit。 -
家庭作业——我希望!哎呀,我可以去问教授。不,我是自学成才的,所以我在与波动的术语作斗争。我可以看到转移概率,但你如何计算逗留时间?
-
那就是我们两个。一旦你有了转换矩阵,我相信它是一个相当简单的。所以我再说一遍,....指定你的协变量。
-
好的,现在你可以看到
tmat是转换矩阵,我拟合了msf1。顺便说一句,这对我来说没有什么是直截了当的:) -
不幸的是,对象的 msf1$trans 组件不是转换概率矩阵。它实际上只是状态到状态转换的标签。转移概率矩阵(这是我过去见过的称为“转移矩阵”的数学对象)的行和都等于 1。这个包确实有一个绘图方法,所以
plot(msf1)可能会提供信息。我认为这些数据需要由 msm 或 SemiMarkov 包处理以获得标准转换(概率)矩阵。
标签: r survival-analysis markov-chains