सही सेंसरिंग के साथ एक खिलौना अस्तित्व (घटना के समय) डेटा कैसे बनाएं


12

मैं एक खिलौना उत्तरजीविता (घटना के लिए समय) डेटा बनाना चाहता हूं जो सही सेंसर है और आनुपातिक खतरों और निरंतर आधारभूत खतरे के साथ कुछ वितरण का पालन करता है।

मैंने डेटा निम्नानुसार बनाया है, लेकिन मैं अनुमानित जोखिम अनुपात प्राप्त करने में असमर्थ हूं जो नकली डेटा के लिए कॉक्स आनुपातिक खतरों के मॉडल को फिट करने के बाद सच्चे मूल्यों के करीब हैं।

मैंने गलत क्या किया?

आर कोड:

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
अपने कार्य के लिए, एक त्वरित शुरुआत एक मौजूदा सिमुलेशन पैकेज का उपयोग करना है: cran.r-project.org/web/packages/survsim/index.html
zhanxw

जवाबों:


19

यह मेरे लिए स्पष्ट नहीं है कि आप अपने ईवेंट समय को कैसे उत्पन्न करते हैं (जो, आपके मामले में, हो सकता है ) और ईवेंट संकेतक:<0

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

तो यहाँ एक सामान्य विधि है, कुछ आर कोड के बाद।


कॉक्स आनुपातिक खतरों के मॉडल का अनुकरण करने के लिए जीवित रहने का समय

आनुपातिक खतरों के मॉडल से घटना समय उत्पन्न करने के लिए, हम व्युत्क्रम प्रायिकता विधि (बेंडर एट अल।, 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)

उदाहरण [वेइबुल बेसलाइन खतरा]

h0(t)=λρtρ1ρ>0λ>0H0(t)=λtρH01(t)=(tλ)1ρTS(|x)

t=(log(v)λexp(xβ))1ρ
v(0,1)Txρλexp(xβ)

आर कोड

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

आपके उत्कृष्ट उत्तर के लिए धन्यवाद। मुझे एहसास हुआ कि मैंने इवेंट के रैंडम होने के बाद इवेंट के समय को गड़बड़ कर दिया था, जो कि घटना के समय से नहीं हुआ था, जिसका कोई मतलब नहीं था .. मूर्खतापूर्ण!
सांख्यिकी_न्यूज २ '

क्या मैं पूछ सकता हूं कि क्या कोई विशिष्ट कारण है कि आप एक घातांक वितरण से सेंसरिंग समय निकालते हैं?
पीठाओ

@pthao: कोई विशेष कारण नहीं है (यह सिर्फ एक दृष्टांत था जहाँ मैंने घातांक वितरण का उपयोग किया था)
ओश्राम १६'१६

1
क्या सेंसरिंग समय के लिए वितरण चुनने के लिए कोई दिशानिर्देश है?
पीथो

@ocram दिलचस्प है, जब मैं flexsurvreg(Surv(time, status) ~ x, data=dat, dist = "weibull")एक ही नकली डेटा पर चलता हूं , तो गुणांक के रूप में दिखाई देता है 0.6212। ऐसा क्यों है?
न तो-न ही

3


e(λe(xβ)t)ρ

(1/rho)

इसलिए, मैंने इस तरह से संशोधन किया

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

यदि rho = 1, परिणाम समान होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.