Doğru sansürleme ile oyuncak hayatta kalma (olay zamanı) verileri nasıl oluşturulur


12

Doğru sansürlenmiş ve orantılı tehlikeler ve sürekli temel tehlike ile bazı dağılımları takip eden bir oyuncak hayatta kalma (olay zamanı) verileri oluşturmak istiyorum.

Verileri aşağıdaki gibi oluşturdum, ancak simüle edilen verilere bir Cox orantılı tehlike modeli taktıktan sonra gerçek değerlere yakın tahmini tehlike oranları elde edemiyorum.

Neyi yanlış yaptım?

R kodları:

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)

Sonuçlar:

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

ancak gerçek değerler

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

1
göreviniz için hızlı bir başlangıç ​​mevcut bir simülasyon paketini kullanmaktır: cran.r-project.org/web/packages/survsim/index.html
zhanxw

Yanıtlar:


19

Etkinlik zamanlarınızı (sizin durumunuzda olabilir ) ve etkinlik göstergelerini nasıl oluşturduğunuzun bana açık olmadığı açıktır :<0

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

İşte burada genel bir yöntem ve ardından bazı R kodları var.


Cox orantılı tehlike modellerini simüle etmek için hayatta kalma süreleri oluşturma

V(0,1)S(|x)

S(t|x)=tecrübe(-'H0(t)tecrübe(x'β)()
T=S-1(V|x)='H0-1(-günlük(V)tecrübe(x'β))
S(|x)T~S(|x)vV~U(0,1)t=S-1(v|x)

Örnek [Weibull temel tehlike]

h0(t)=λρtρ-1ρ>0λ>0'H0(t)=λtρ'H0-1(t)=(tλ)1ρT~S(|x)

t=(-günlük(v)λtecrübe(x'β))1ρ
v(0,1)Txρλtecrübe(x'β)

R kodu

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)
}

Ölçek

β=-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

Mükemmel cevabınız için teşekkür ederim. Olay zamanlarını rasgele hale getirdikten sonra olayların durumunu elde ederek olay zamanlarını berbat ettiğimi fark ettim, ki bu hiç mantıklı değil .. aptal bana!
stats_newb

Üstel bir dağılımdan sansürleme zamanı çekmenizin özel bir nedeni var mı?
pthao

@pthao: özel bir nedeni yok (bu sadece üstel dağılımı kullandığım bir örnekti)
ocram

1
Sansür süreleri için dağılım seçimi konusunda herhangi bir kılavuz var mı?
pthao

@ocram İlginç bir şekilde, flexsurvreg(Surv(time, status) ~ x, data=dat, dist = "weibull")aynı simüle edilmiş veriler üzerinde çalıştığımda, katsayı görünür 0.6212. Bu neden?
ne-ne de

3


e-(λ*e(x*β)*t)ρ

(1/rhÖ)

yani, böyle değiştirdim

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

rho = 1 ise sonuç aynı olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.