Оценка выживаемости с помощью обобщенной гамма-функции в flexsurv не удалась

У меня есть данные о выживаемости пациентов. Некоторые из них подвергнуты цензуре. Я хочу подогнать обобщенную гамма-функцию к эмпирическим данным с помощью пакета flexsruv в R. В то время как все другие функции, которые я хочу подогнать (такие как экспоненциальная, weibull и т. д.) работают нормально, я получаю следующий код ошибки для dist = "gengamma":

Error in optim(method = "BFGS", par = c(5.02274354115438, -0.0670900421918298,  : 
  non-finite finite-difference value [2]

Вот данные, которые у меня есть:

db.survival <- data.frame(time =  c(101, 111, 185, 707, 85, 58, 427, 672, 90,
                                1452, 608, 99, 556, 62, 60, 1445, 563, 246,
                                163, 276, 216, 64, 61, 66, 67, 68, 81, 83,
                                99, 100, 100, 100, 100, 100, 100, 100, 100),
                      status = c(1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
                                 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,
                                 0, 0, 0, 0, 0, 0, 0, 0, 0))

Я получаю код ошибки для:

library(flexsurv)
flexsurvreg(Surv(time, status) ~ 1, data = db.survival, dist="gengamma")

Однако, когда я выбираю методы "CG" или "SANN", я получаю результаты (но они разные).

Мои вопросы: почему я получаю ошибку в первую очередь? Я неправильно кодирую?

Заранее большое спасибо за любую помощь!


person Frederick    schedule 03.11.2017    source источник


Ответы (1)


Я не думаю, что с вашим кодом что-то не так. Ошибка возникает из-за того, что optim использует flexsurvreg. По умолчанию optim использует конечно-разностную аппроксимацию для градиента, как указано в help("optim")

gr Функция для возврата градиента для методов "BFGS", "CG" и "L-BFGS-B". Если это NULL, будет использоваться конечно-разностное приближение. Для метода "SANN" он определяет функцию для создания новой точки-кандидата. Если это значение равно NULL, используется марковское ядро ​​Гаусса по умолчанию.

Вы можете увидеть, где код терпит неудачу со следующими вызовами

> options(error = recover)
> flexsurvreg(Surv(time, status) ~ 1, data = db.survival, dist="gengamma", control = list(trace = 100))
initial  value 144.298116 
iter  10 value 131.067771
iter  20 value 128.013812
iter  30 value 127.761461
iter  40 value 127.753269
Error in optim(control = list(trace = 100), method = "BFGS", par = c(5.02274354115438,  : 
  non-finite finite-difference value [2]

Enter a frame number, or 0 to exit   

1: flexsurvreg(Surv(time, status) ~ 1, data = db.survival, dist = "gengamma", control = list(trace = 100))
2: do.call("optim", optim.args)
3: optim(control = list(trace = 100), method = "BFGS", par = c(5.02274354115438, -0.0670900421918298, 0), fn = function (optpars, .

Selection: 3

После чего вы видите, что optim выполняется несколько итераций, но в каком-то коде C происходит сбой. Кроме того, вы можете видеть, что flexsurv не предоставляет аргументы lower или upper для optim, которые можно было бы использовать с методом "L-BFGS-B". В этой виньетке видно, что один из параметры имеют ограниченную поддержку, так что это может вам помочь.

person Benjamin Christoffersen    schedule 03.11.2017