Как симулировать цензурированные данные

11

Мне интересно, как я могу смоделировать выборку из n времен жизни распределения Вейбулла, которые включают наблюдения типа I с правой цензурой. Например, пусть n = 3, shape = 3, scale = 1 и уровень цензуры = .15, а время цензуры = .88. Я знаю, как сгенерировать выборку Вейбулла, но я не знаю, как сгенерировать цензурированные данные с правым цензурой типа I в R.

T = rweibull(3, shape=.5, scale=1)
Emeli
источник

Ответы:

11

(Что касается R стиля кодирования, то лучше не использовать его T в качестве имени переменной, потому что это псевдоним для TRUE, и эта практика неизбежно приведет к проблемам.)


Ваш вопрос несколько двусмысленный; Есть несколько способов интерпретировать это. Давайте пройдемся по ним:

  1. Вы указываете, что хотите имитировать цензуру типа 1 . Как правило, это означает, что эксперимент проводится в течение определенного периода времени и что к тем учебным единицам, которые не имели события, к тому времени проводится цензура. Если это именно то, что вы имели в виду, то (необязательно) невозможно указать параметры формы и масштаба, а также время и скорость цензуры. Обозначив любые три, последнее обязательно фиксируется.

    (Попытка) решить для параметра формы:
    Это не удается; кажется, что невозможно получить 15% скорости цензуры при времени цензуры 0,88 с распределением Вейбулла, где параметр масштаба удерживается равным 1, независимо от того, какой параметр формы.

    optim(.5, fn=function(shp){(pweibull(.88, shape=shp, scale=1, lower.tail=F)-.15)^2})
    # $par
    # [1] 4.768372e-08
    # ...
    # There were 46 warnings (use warnings() to see them)
    pweibull(.88, shape=4.768372e-08, scale=1, lower.tail=F)
    # [1] 0.3678794
    
    optim(.5, fn=function(shp){(pweibull(.88, shape=shp, scale=1, lower.tail=F)-.15)^2},
          control=list(reltol=1e-16))
    # $par
    # [1] 9.769963e-16
    # ...
    # There were 50 or more warnings (use warnings() to see the first 50)
    pweibull(.88, shape=9.769963e-16, scale=1, lower.tail=F)
    # [1] 0.3678794
    

    Решение для параметра масштаба:

    optim(1, fn=function(scl){(pweibull(.88, shape=.5, scale=scl, lower.tail=F)-.15)^2})
    # $par
    # [1] 0.2445312
    # ...
    pweibull(.88, shape=.5, scale=0.2445312, lower.tail=F)
    # [1] 0.1500135
    

    Решаем за время цензуры:

    qweibull(.15, shape=.5, scale=1, lower.tail=F)
    # [1] 3.599064
    

    Решение для цензуры:

    pweibull(.88, shape=.5, scale=1, lower.tail=F)
    # [1] 0.3913773
    
  2. С другой стороны, мы можем думать о том, что цензура случайным образом (и, как правило, независимо) происходит в течение всего исследования из-за, скажем, отсева. В этом случае процедура состоит в том, чтобы моделировать два набора переменных Вейбулла. Затем вы просто отмечаете, что было первым: вы используете меньшее значение в качестве конечной точки и вызываете цензуру, если меньшее значение было временем цензуры. Например:

    set.seed(0775)  
    t    = rweibull(3, shape=.5, scale=1)
    t      # [1] 0.7433678 1.1325749 0.2784812
    c    = rweibull(3, shape=.5, scale=1.5)
    c      # [1] 3.3242417 2.8866217 0.9779436
    time = pmin(t, c)
    time   # [1] 0.7433678 1.1325749 0.2784812
    cens = ifelse(c<t, 1, 0)
    cens   # [1] 0 0 0
    
Gung - Восстановить Монику
источник
очень интересный ответ ( optimфункция потрясающая), но как бы вы откалибровали свой второй ответ, чтобы достичь определенного процента цензуры?
Дэн Чалтиэль
@DanChaltiel, 2-й на самом деле не откалиброван - он просто случайный. Также может быть невозможно достичь желаемой пропорции, учитывая другие аспекты, которые вы хотите (аналогично # 1). Тем не менее, может быть возможно идентифицировать долю населения (наблюдаемая доля будет отскакивать от итерации к итерации) путем оптимизации цензурированного распределения относительно распределения событий.
gung - Восстановить Монику
2

Просто чтобы быть уверенным, что мы говорим об одном и том же, цензура типа I это когда

... эксперимент имеет заданное количество предметов или предметов и останавливает эксперимент в заранее установленное время, после чего все оставшиеся предметы подвергаются цензуре.

Чтобы сгенерировать правильные данные с цензурой, используя время цензуры = 0,88 , вы просто используете minфункцию:

T <- rweibull(3, shape=.5, scale=1)
censoring_time <- 0.88
T_censored <- min(censoring_time, T)

Однако я не совсем уверен, что вы имеете в виду, когда говорите « уровень цензуры = 0,15 » ... Вы хотите сказать, что 15% ваших предметов подверглись правильной цензуре? Эти заметки о цензуре, похоже, указывают на то, что единственный параметр, который нужен для цензуры I типа, - это время цензуры , поэтому я не уверен, как этот показатель учитывается.

StevieP
источник
1
Обратите внимание, что ваша цитата не является определением цензуры: это только пример. Правая цензура происходит, когда каждое значение сравнивается с заранее заданным порогом и заменяется не числовым индикатором цензуры, когда значение превышает этот порог. Независимо от этого, применение min(или, в более общем смысле pmin) - это способ его моделирования R. (Примером правильной цензуры в исследовании, не связанном с выживанием, является анализ бактериальных колоний в сточных водах. Это делается путем ручного подсчета видимых на предметном стекле микроскопа. При сильном загрязнении результат дается как «слишком много для подсчета». )
whuber