Ошибка оценки параметра распределения Вейбулла - PullRequest
0 голосов
/ 28 марта 2019

Я использовал следующую функцию для оценки трехпараметрического распределения Вейбулла.

library(bbmle)
library(FAdist)
set.seed(16)
xl=rweibull3(50, shape = 1,scale=1, thres = 0)
dweib3l <- function(shape, scale, thres) { 
  -sum(dweibull3(xl , shape, scale, thres, log=TRUE))
}
ml <- mle2(dweib3l, start= list(shape = 1, scale = 1, thres=0), data=list(xl))

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

Error in optim(par = c(shape = 1, scale = 1, thres = 0), fn = function (p)  : 
  non-finite finite-difference value [3]
In addition: There were 16 warnings (use warnings() to see them)

Есть ли способ преодолеть эту проблему? Спасибо!

1 Ответ

1 голос
/ 28 марта 2019

Проблема в том, что пороговый параметр является особым: он определяет четкую границу распределения, поэтому любое значение thres выше минимального значения данных даст нулевые вероятности (-In отрицательных логарифмических вероятностей): если данное значение xl на меньше , чем указанное пороговое значение, тогда это невозможно в соответствии с определенной статистической моделью. Кроме того, мы уже знаем, что максимальное значение вероятности порога равно минимальному значению в наборе данных (аналогичные результаты верны для MLE оценки границ равномерного распределения . ..)

Я не знаю, почему другие вопросы по SO , касающиеся этого вопроса, не сталкиваются с этой конкретной проблемой - возможно, потому, что они используют начальное значение порога это достаточно далеко ниже минимального значения в наборе данных ...

Ниже я использую фиксированное значение min(xl)-1e-5 для порога (смещение значения вниз позволяет избежать численных проблем, когда значение находится точно на границе). Я также использую интерфейс формул, чтобы мы могли напрямую вызывать функцию dweibull3() и устанавливать нижние границы для параметров формы и масштаба (в результате мне нужно использовать method="L-BFGS-B", который учитывает ограничения).

ml <- mle2(xl ~ dweibull3(shape=shape, scale = scale,
                        thres=min(xl)-1e-5),
           start=list(shape=1, scale=1),
           lower=c(0,0),
           method="L-BFGS-B",
           data=data.frame(xl))

(Интерфейс формулы удобен для простых примеров: если вы хотите сделать что-то намного более сложное, вы можете захотеть вернуться к явному определению собственной функции логарифмического правдоподобия.)


Если вы настаиваете на подборе порогового параметра, вы можете сделать это, установив верхнюю границу, которая (почти) равна минимальному значению в данных [любое большее значение даст NA значений и, таким образом, нарушит оптимизация]. Тем не менее, вы обнаружите, что оценка порогового параметра всегда сходится к этой верхней границе ... так что при таком подходе действительно трудно добраться до предыдущего ответа (вы также получите предупреждения о том, что параметры на границе и о невозможности инвертировать гессиан).

eps <- 1e-8
ml3 <- mle2(xl ~ dweibull3(shape=shape, scale = scale, thres = thres),
            start=list(shape=1, scale=1, thres=-5),
            lower=c(shape=0,scale=0,thres=-Inf),
            upper=c(shape=Inf,scale=Inf,thres=min(xl)-eps),
            method="L-BFGS-B",
            data=data.frame(xl))

Для того, чтобы это того стоило, кажется, что можно уместить модель без фиксирования порогового параметра, если вы начнете с небольшого значения и используете оптимизацию Nelder-Mead: однако, это, похоже, дает ненадежные результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...