Как смоделировать усеченные слева данные времени отказа Вейбулла в R

Я хочу смоделировать усеченные слева данные о времени отказа из распределения Вейбулла. Моя цель - смоделировать данные и получить коэффициенты (из x1, x2, x3, x4 и x5, которые я использовал для моделирования) путем подбора регрессионной модели Вейбулла. Здесь xt=runif(N, 30, 80) обозначает начало исследования, переменная Tm <- qweibull(runif(N,pweibull(xt,shape = 7.5, scale = 82*exp(lp)),1), shape=7.5, scale=82*exp(lp)) обозначает время отказа. Но всякий раз, когда я делаю регрессию, я получаю это предупреждающее сообщение.

Warning message:
In Surv(xt, time_M, event_M) : Stop time must be > start time, NA created```

Это была моя попытка:

N = 10^5
H <- within(data.frame(xt=runif(N, 30, 80), x1=rnorm(N, 2, 1), x2=rnorm(N, -2, 1)), {
  x3 <- rnorm(N, 0.5*x1 + 0.5*x2, 2)
  x4 <- rnorm(N, 0.3*x1 + 0.3*x2 + 0.3*x3, 2 )
  lp1 <- -2 + 0.5*x1 + 0.2*x2 + 0.1*x3 + 0.2*x4
  lp2 <- -2 + 0.5*x1 + 0.2*x2 + 0.1*x3 + 0.2*x4
  lp3 <- 0.5*x1 + 0.2*x2 + 0.1*x3 + 0.2*x4
  lp4 <- 0
  P1 <- exp(lp1)/(exp(lp2)+ exp(lp3)+1+exp(lp1))
  P2 <- exp(lp2)/(exp(lp1)+ exp(lp3)+1+exp(lp2))
  P3 <- exp(lp3)/(exp(lp2)+ exp(lp1)+1+exp(lp3))
  P4 <- 1/(exp(lp2)+ exp(lp3)+exp(lp1)+1)
  mChoices <- t(apply(cbind(P1,P2,P3,P4), 1, rmultinom, n = 1, size = 1))
  x5 <- apply(mChoices, 1, function(x) which(x==1))
  lp <-   0.05*x1 + 0.2*x2 + 0.1*x3 + 0.02*x4 + log(1.5)*(x5==1) + log(5)*(x5==2) + log(2)*(x5==3)
  Tm <- qweibull(runif(N,pweibull(xt,shape = 7.5, scale = 82*exp(lp)),1), shape=7.5, scale=82*exp(lp))
  Cens <- 100
  time_M <- pmin(Tm,Cens)
  event_M <- time_M == Tm })   
res.full_M <- weibreg(Surv(H$xt,H$time_M, H$event_M) ~ x1 + x2 + x3 + x4 + factor(x5), data = H)

Итак, может ли кто-нибудь помочь мне изменить этот код, чтобы я мог получить начальный возраст (xt) меньше, чем соответствующее время отказа (time_M), а подобранная модель регрессии имеет значения коэффициентов, близкие к значениям в следующем уравнении (lp <- 0.05*x1 + 0.2*x2 + 0.1*x3 + 0.02*x4 + log(1.5)*(x5==1) + log(5)*(x5==2) + log(2)*(x5==3))


person Aria    schedule 08.06.2020    source источник
comment
Вы имеете в виду цензуру слева или цензуру справа? Какое у вас мероприятие? Диагноз или начало заболевания? Другими словами, каково ваше время до события: время от 30 лет до постановки диагноза или время от начала заболевания до постановки диагноза?   -  person Limey    schedule 08.06.2020
comment
Привет, мое событие здесь - первая диагностика болезни. а время до события - это время от 30 лет до постановки диагноза.   -  person Aria    schedule 08.06.2020
comment
Ах-ха! Это то, о чем я думал. Это правильная цензура, а не левая... Но это хорошо, потому что упрощает ответ...   -  person Limey    schedule 08.06.2020
comment
Привет, извините, могу я объяснить это еще раз, мое событие здесь - это первый диагноз болезни. Я думаю, что правильный термин оставлен усеченным, поскольку моя когорта населения состоит из лиц в возрасте 30 лет и старше, у которых не было диагностировано интересующее меня событие (заболевание) до начала исследования. И здесь моя временная шкала — это возраст, а не время от начала исследования. Дайте мне знать, если вам нужны дополнительные разъяснения   -  person Aria    schedule 08.06.2020
comment
Если ошибка Surv(xt, time_M, event_M) : Stop time must be > start time, NA created, то вам нужно либо отбросить те строки, в которых это условие не выполняется, либо вам нужно добавить смоделированное время выживания к смоделированному времени запуска.   -  person IRTFM    schedule 10.06.2020


Ответы (1)


Ваш первый комментарий подразумевает, что вы хотите (возможно, подвергнутых цензуре) раз с 30 лет до диагноза. У вас есть два варианта: работать с «временами выживания» или с датой 30-летия пациентов и датой их диагноза. Легче использовать первый, так как проще указать уровень цензуры.

  1. Создайте время выживания без цензуры (T) из дистрибутива по вашему выбору.
  2. Нарисуйте случайное число из равномерного (0, 1) распределения. Если это число меньше вашего уровня цензурирования, наблюдение подвергается цензуре: перейдите к 3. В противном случае ваше наблюдаемое время выживания без цензуры равно (T).
  3. Нарисуйте другую случайную величину (X) из равномерного (0, 1) распределения. Установите Т = Т*Х. Это ваше цензурированное время выживания.

Эта процедура даст вам данные из любого распределения времени выживания, подвергнутые цензуре по вашему выбору.

Однако мое прочтение вашей спецификации говорит мне, что каждый участник в какой-то момент будет диагностирован с интересующим вас заболеванием. Нет конкурирующих рисков. Это разумно?

Ваш второй комментарий сбивает с толку. Это ваше время для события (а) «время от 30 лет до постановки диагноза» (что подразумевает цензуру справа) или (б) «время от начала заболевания до постановки диагноза» (что подразумевает цензуру слева, а также может включать цензуру справа). Если (а), мое решение остается в силе. Если (b), вам необходимо предоставить дополнительную информацию:

  • Каков процесс (распределение) времени от 30 лет до начала заболевания?
  • Когда/как часто проводятся диагностические процедуры?
  • Какова вероятность того, что диагностическая процедура даст каждый из следующих результатов: ложноположительный, ложноотрицательный, истинноположительный, истинноотрицательный

По-прежнему можно сгенерировать нужные данные, но это не так просто, как в (а).

person Limey    schedule 08.06.2020
comment
Извините за отсутствие разъяснений, я новичок в моделировании выживания. Я постараюсь объяснить это ясно здесь. Предположим, что 1 января 2000 г. я начал свое исследование когорты, состоящей из лиц в возрасте 30 лет и старше (10^5)(xt=runif(N, 30, 80)), и я записал возраст начала заболевания (Tm). Наконец, я подверг цензуре время отказа после 100 лет.Tm <- qweibull(runif(N,pweibull(xt,shape = 7.5, scale = 82*exp(lp)),1), shape=7.5, scale=82*exp(lp)) Cens <- 100 time_M <- pmin(Tm,Cens) event_M <- time_M == Tm. - person Aria; 08.06.2020