我是贝叶斯分析的新手,并且正陷入编程问题中(认为是问题所在)。我正在尝试使用MCMC和JAGS进行贝叶斯生存分析。 我有一个简单的具有生存功能的写模型:
fit0 <- coxph(Surv(time, event) ~ group + var1 + var2 + var3, data=mydata_simple)
summary(fit0)
对于我感兴趣的主变量(组(0,1)),我得到的HR为0.40(p = 0.023)。
我正在尝试使用非信息先验的贝叶斯方法进行此分析。为此,我使用cat函数用JAGS编写。
cat("
model{
for(i in 1:N){
sVL[i] <- (var1[i])
sCD4 [i]<- (var2[i])
h0[i]<-lambda*alpha*pow(time[i],alpha-1)
h[i]<-h0[i]*exp(beta[1]*equals(group[i],1) +
beta[2]*var3[i] + beta[3]*sVL[i] + beta[4]*sCD4[i])
#Cumulative Hazard H[t]
cumHaz[i]<-lambda*pow(time[i],alpha)*exp(beta[1]*equals(group[i],1) +
beta[2]*var3[i] + beta[3]*sVL[i]+ beta[4]*sCD4[i])
log.Surv[i] <- -cumHaz[i]
Surv[i]<-exp( -cumHaz[i])
# Definition of the log-likelihood using zeros trick
phi[i] <- C - ((1 - event[i]) * log(h[i]) + log.Surv[i])
zeros[i] ~ dpois(phi[i])
}
for(i in 1:5){
beta[i] ~ dnorm(0,0.001)
#Parameters probabilities
prob[i]<-step(beta[i])
#Hazard Ratio probabilities
HR[i]<-exp(beta[i])
probHR[i] <- step(HR[i]-1)
}
lambda~dgamma(0.1,0.1)
sigma~dunif(0,100)
alpha<-1/sigma
}
", file= "my_weibullph.txt")
然后我可以运行JAGS:
ni <- 5000
na <- 500
nt <- 5
data <- list(N=111, time = mydata_simple$time, event = mydata_simple$event,group = mydata_simple$group, var3 =mydata_simple$var3, var2 = mydata_simplevar2, var1 = mydata_simple$var1, C=50000,zeros=rep(0,111))
inits <- function(){list(beta=rnorm(5,0,0.5), sigma=runif(1,0,1), lambda=runif(1,0.01,1))}
parameters <- c("beta","alpha","lambda","prob" ,"HR", "probHR","h0")
model_ph<- jags.model(data=data, file="my_weibullph.txt",inits=inits,n.adapt=na,n.chains=3)
model_ph_result <- coda.samples(model_ph, variable.names=parameters,
n.iter=ni, thin=nt)#To generate posterior samples in mcmcm.list
formatsave(model_ph_result, file="model_ph_new.RData")
要获得HR的结果:
bss <- do.call(rbind,suppression_ph_result)
sims.list <- vector("list", length(parameters))
names(sims.list) <- parameters
for(p in seq_along(parameters)){
iik <- grep(paste("^", parameters[p], sep=""), colnames(bss))
sims.list[[p]] <- bss[,iik]
}
# Hazard ratios
HRB_group<-sims.list[[5]][,2]
HRB_var1<-sims.list[[5]][,3]
HRB_var2<-sims.list[[5]][,4]
HRB_var3<-sims.list[[5]][,5]
#prob HR
pHRB_group<-sims.list[[6]][,1]
pHRB_var1<-sims.list[[6]][,2]
pHRB_var2<-sims.list[[6]][,3]
pHRB_var<-sims.list[[6]][,4]
好吧,当我得到HRB_group的平均值时,我得到的是1.18(而不是生存包中的0.40)。我不知道我在脚本中做错了什么以获得这些如此不同的结果...
先谢谢您。抱歉,如果我无法提供数据,但它们是机密信息,并且我不知道模拟其他数据以将其包括在此处。