如何通过正确的检查创建玩具生存(事件发生时间)数据


12

我希望创建一个正确检查的玩具生存(事件发生时间)数据,并按照比例风险和恒定基线风险进行某种分布。

我创建数据的方法如下,但是在将Cox比例风险模型拟合到模拟数据后,我无法获得接近真实值的估计风险比。

我做错什么了?

R代码:

library(survival)

#set parameters
set.seed(1234)

n = 40000 #sample size


#functional relationship

lambda=0.000020 #constant baseline hazard 2 per 100000 per 1 unit time

b_haz <-function(t) #baseline hazard
  {
    lambda #constant hazard wrt time 
  }

x = cbind(hba1c=rnorm(n,2,.5)-2,age=rnorm(n,40,5)-40,duration=rnorm(n,10,2)-10)

B = c(1.1,1.2,1.3) # hazard ratios (model coefficients)

hist(x %*% B) #distribution of scores

haz <-function(t) #hazard function
{
  b_haz(t) * exp(x %*% B)
}

c_hf <-function(t) #cumulative hazards function
{
  exp(x %*% B) * lambda * t 
}

S <- function(t) #survival function
{
  exp(-c_hf(t))
}

S(.005)
S(1)
S(5)

#simulate censoring

time = rnorm(n,10,2)

S_prob = S(time)

#simulate events

event = ifelse(runif(1)>S_prob,1,0)

#model fit

km = survfit(Surv(time,event)~1,data=data.frame(x))

plot(km) #kaplan-meier plot

#Cox PH model

fit = coxph(Surv(time,event)~ hba1c+age+duration, data=data.frame(x))

summary(fit)            

cox.zph(fit)

结果:

Call:
coxph(formula = Surv(time, event) ~ hba1c + age + duration, data = data.frame(x))

  n= 40000, number of events= 3043 

             coef exp(coef) se(coef)     z Pr(>|z|)    
hba1c    0.236479  1.266780 0.035612  6.64 3.13e-11 ***
age      0.351304  1.420919 0.003792 92.63  < 2e-16 ***
duration 0.356629  1.428506 0.008952 39.84  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

         exp(coef) exp(-coef) lower .95 upper .95
hba1c        1.267     0.7894     1.181     1.358
age          1.421     0.7038     1.410     1.432
duration     1.429     0.7000     1.404     1.454

Concordance= 0.964  (se = 0.006 )
Rsquare= 0.239   (max possible= 0.767 )
Likelihood ratio test= 10926  on 3 df,   p=0
Wald test            = 10568  on 3 df,   p=0
Score (logrank) test = 11041  on 3 df,   p=0

但是将真值设置为

B = c(1.1,1.2,1.3) # hazard ratios (model coefficients)

1
对于您的任务,快速入门
zhanxw

Answers:


19

我不清楚您如何生成事件时间(在您的情况下可能为)和事件指示符:<0

time = rnorm(n,10,2) 
S_prob = S(time)
event = ifelse(runif(1)>S_prob,1,0)

因此,这是一个通用方法,后跟一些R代码。


生成生存时间以模拟Cox比例风险模型

为了从比例风险模型生成事件时间,我们可以使用逆概率方法(Bender等,2005):如果在上是均匀的并且是从比例风险模型得出的条件生存函数,即 那么事实是随机变量 具有生存函数V(0,1)S(|x)

S(t|x)=exp(H0(t)exp(xβ)()
T=S1(V|x)=H01(log(V)exp(xβ))
S(|x)。该结果称为``逆概率积分变换''。因此,为了生成一个生存时间给定的协变量向量,它足以绘制从和进行逆变换。TS(|x)vVU(0,1)t=S1(v|x)

示例[Weibull基线危害]

令的形状并缩放。然后和。遵循逆概率方法,通过计算得到 其中的统一变量为。使用随机变量转换的结果,可能会注意到具有条件的威布尔分布(给定h0(t)=λρtρ1ρ>0λ>0H0(t)=λtρ Ť小号H01(t)=(tλ)1ρt = - 对数v TS(|x) v01ŤXρλEXPX'β

t=(log(v)λexp(xβ))1ρ
v(0,1)Tx)的形状为并缩放为。ρλexp(xβ)

R代码

以下R函数生成具有单个二进制协变量的数据集(例如,治疗指标)。基准危害具有威布尔形式。审查时间是从指数分布中随机得出的。x

# baseline hazard: Weibull

# N = sample size    
# lambda = scale parameter in h0()
# rho = shape parameter in h0()
# beta = fixed effect parameter
# rateC = rate parameter of the exponential distribution of C

simulWeib <- function(N, lambda, rho, beta, rateC)
{
  # covariate --> N Bernoulli trials
  x <- sample(x=c(0, 1), size=N, replace=TRUE, prob=c(0.5, 0.5))

  # Weibull latent event times
  v <- runif(n=N)
  Tlat <- (- log(v) / (lambda * exp(x * beta)))^(1 / rho)

  # censoring times
  C <- rexp(n=N, rate=rateC)

  # follow-up times and event indicators
  time <- pmin(Tlat, C)
  status <- as.numeric(Tlat <= C)

  # data set
  data.frame(id=1:N,
             time=time,
             status=status,
             x=x)
}

测试

这是一些使用快速仿真:β=0.6

set.seed(1234)
betaHat <- rep(NA, 1e3)
for(k in 1:1e3)
{
  dat <- simulWeib(N=100, lambda=0.01, rho=1, beta=-0.6, rateC=0.001)
  fit <- coxph(Surv(time, status) ~ x, data=dat)
  betaHat[k] <- fit$coef
}

> mean(betaHat)
[1] -0.6085473

感谢您的出色回答。我意识到我在随机分配事件时间后获取事件状态弄乱了事件时间,这没有道理..愚蠢​​的我!
stats_newb

我想问一下,为什么要从指数分布中得出审查时间呢?
pthao

@pthao:没有特别的原因(这只是我使用指数分布的一个例证)
ocram

1
有没有选择检查时间分布的指南?
pthao

@ocram有趣的是,当我flexsurvreg(Surv(time, status) ~ x, data=dat, dist = "weibull")在相同的模拟数据上运行时,系数显示为0.6212。为什么是这样?
也不是,

3

对于威布尔分布,
S(t)=e(λe(xβ)t)ρ

“ ”仅用于log(v)(1/rho)

所以,我这样修改

Tlat <- (- log(v))^(1 / rho) / (lambda * exp(x * beta))

如果rho = 1,结果将相同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.