R中的灵活生存模型

时间:2015-02-16 08:33:23

标签: r survival-analysis

是否可以在R中安装灵活的危险模型并指定危险功能?例如,我有一个数据生成过程,我知道它会导致U形危险函数。如何拟合灵活的参数模型(并获得相应的估计值)?

我知道flexsurv可以拟合样条风险模型,但我无法使其适合已知的形状危险函数模型。任何帮助或示例都将非常受欢迎。

1 个答案:

答案 0 :(得分:3)

我的答案因为不单独使用R而有些作弊,但是使用可以从R内部运行的工具。你想要做的是相当高级的生存分析,我怀疑任何现有的R包都将是足够灵活。

以下示例基于Brad Carlin's software page上的代码,作为他们关于联合生存模型的论文的附录提供。 1 联合模型导致相当复杂的可能性,因此这种方法应该能够处理你想要实现的很多东西。

它使用了BUGS"一个技巧",如WinBUGS用户手册中所述。 2 这个技巧也可用于JAGS,我将使用它,因为它支持更多平台。该代码可用于拟合任意生存函数,因为它可以通过分析进行集成。从理论上讲,使用MCMC技术也可以处理更复杂的危险率,但是您必须从头开始编写自己的MCMC采样器并使用数值积分技术(或者组合各种随时间变化的危险函数)。

首先,调用模型的R代码:

library(rjags) # To enable JAGS within R

JAGSlist <- list("N" = N,         # number of observations
                 "event" = event, # 1 for event, zero for censor
                 "T" = T          # Survival time
)

#Construct the model
my.jags.model <- jags.model("MyJAGSmodel.jags",
                        JAGSlist,n.chains = 1,
                        n.adapt = 100)
my.results = coda.samples(my.jags.model, 
                          c("alpha","beta"), # parameters to monitor
                          n.iter = 10000)

my.results <- my.results[[1]] #To unlist it
summary(my.results)

接下来,MyJAGSmodel.jags文件的内容:

data{
      for (i in 1:N){
            ones[i] <- 1
      }     
}

model{
    for (i in 1:N) {

    q[i]<-L[i]/C 
    ones[i]~dbern(q[i])
    # Likelihood for survival data 
    # event=1 if event, and 0 if censoring
     L[i]<-pow(h[i],event[i])*S[i] 

    # Hazard for individual i at their survival time
    # This is where we specify it as U-shaped (quadratic)
     h[i] <- alpha*T[i] + beta*(T[i]^2)

    # Cumulative hazard H[t] = int_0^t (h[u] du)
     H[i] <- (alpha)*(1/2)*(T[i]^2) + (beta)*(1/3)*(T[i]^3)

    # Survival probability for individual i 
    # at their survival time
     S[i]<-exp(-H[i])

    # Density function
     f[i]<-h[i]*S[i]

    }  

C<- 10000000 # part of trick

#priors
#Parameters of interest
alpha~dnorm(0,1.0E-6)
beta~dnorm(0,1.0E-6)
}

如您所见,代码构建了生存模型使用的实际可能性(有关此问题的详细信息,为什么不在Cross Validated上提问?!) 您还可以使用具有increment_log_likelihood函数的Stan,因此它不需要JAGS使用的技巧来增加对数可能性。它也可以从R调用。如果你想要Stan代码,请告诉我或发布另一个问题。 您将不得不对此进行试验,看看它是否适用于您的方案。您想要做的是非常先进的生存分析,如果您想尝试更灵活的危险率,您可能必须编写自己的MCMC采样器。参见Gilks​​等(1996) 3 以获得良好的引物。

查看配有JAGS的模型的好地方是Doing Bayesian Data Analysis,以及该网站所基于的书。 4


更新,以防人们仍在访问此问题。

我一直致力于斯坦生存的例子,希望能在很多情况下工作,在这里找到它。这是一项正在进行的工作,但代码应该可用。我试图在那里解释我的工作(统计位,以及Stan位):

https://github.com/dwcoder/StanSurvivalBoilerplate


1 Guo,X.,Carlin,BP:使用标准计算机软件包对纵向和事件时间数据进行单独和联合建模美国统计员 i> 58(1),16-24,2004

2 Spiegelhalter,D.,Thomas,A.,Best,N.,Lunn,D。: WinBUGS用户手册。请参阅提前使用BUGS语言。

3 Gilks​​,W.R.,Richardson,S.,Spiegelhalter,D。: Markov Chain Monte Carlo in Practice ,Taylor&amp;弗朗西斯,1996年

4 Kruschke,J。K.(2011)。 进行贝叶斯数据分析