วิธีสร้างข้อมูลการอยู่รอดของของเล่น (เวลากับเหตุการณ์) ด้วยการเซ็นเซอร์ที่ถูกต้อง


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
สำหรับงานของคุณเริ่มต้นอย่างรวดเร็วคือการใช้แพคเกจการจำลองที่มีอยู่: 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)

ดังนั้นนี่คือวิธีการทั่วไปตามด้วยรหัส R


สร้างเวลาการเอาชีวิตรอดเพื่อจำลองโมเดลอันตรายตามสัดส่วนของ Cox

ในการสร้างเหตุการณ์ครั้งจากแบบจำลองความเป็นอันตรายตามสัดส่วนเราสามารถใช้วิธีความน่าจะเป็นแบบผกผัน(Bender et al., 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). ผลลัพธ์นี้เรียกว่า `` การแปลงความน่าจะเป็นอินทิกรัล '' ดังนั้นเพื่อสร้างเวลาเอาชีวิตรอดให้ covariate vector มันพอเพียงที่จะดึงจากและ ที่จะทำให้การเปลี่ยนแปลงผกผัน{x})TS(|x)vVU(0,1)t=S1(v|x)

ตัวอย่าง [อันตรายพื้นฐานของ Weibull]

ให้มีรูปร่างและขนาด0 จากนั้นและโร}} ตามวิธีผกผันความน่าจะเป็นการสร้างได้จากการคำนวณ กับตัวแปรเครื่องแบบ1) การใช้ผลลัพธ์ในการแปลงตัวแปรสุ่มอาจสังเกตได้ว่ามีการแจกแจงแบบ Weibull แบบมีเงื่อนไข (ให้h0(t)=λρtρ1ρ>0λ>0H0(t)=λtρ TS(H01(t)=(tλ)1ρt = ( - บันทึก( v )TS(|x)วี(0,1)Txρλประสบการณ์(x'β)

t=(log(v)λexp(xβ))1ρ
v(0,1)Tx) ที่มีรูปร่างและขนาดเบต้า})ρλexp(xβ)

รหัส R

ฟังก์ชั่น R ต่อไปนี้สร้างชุดข้อมูลด้วยไบนารี covariateเดียว(เช่นตัวบ่งชี้การรักษา) อันตรายพื้นฐานมีรูปแบบ Weibull เวลาเซ็นเซอร์ถูกสุ่มจากการแจกแจงแบบเอ็กซ์โปเนนเชียล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

สำหรับการแจกแจงแบบ Weibull
S (t) =e(λe(xβ)t)ρ

" " จะใช้สำหรับบันทึก (v) เท่านั้น(1/rho)

ดังนั้นฉันจึงแก้ไขเช่นนี้

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

ถ้า rho = 1 ผลลัพธ์จะเหมือนกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.