Як встановити розподіл Weibull до вхідних даних, що містять нулі?


14

Я намагаюся відтворити існуючий алгоритм прогнозування, переданий дослідником у відставці. Перший крок - приєднання деяких спостережуваних даних до розподілу Weibull, щоб отримати форму та масштаб, які будуть використані для прогнозування майбутніх значень. Я використовую R для цього. Ось приклад мого коду:

x<-c(23,19,37,38,40,36,172,48,113,90,54,104,90,54,157,51,77,78,144,34,29,45,16,15,37,218,170,44,121)
f<-fitdistr(x, 'weibull')

Це добре працює, якщо у вхідному масиві немає жодних нулів, що призводить до повного виходу з ладу. Те саме відбувається і в SAS. Як я розумію, це тому, що одним із етапів підрахунку розподілу Вейбул є прийняття природного журналу, який не визначено для 0. Чи є розумний спосіб обійти це?

Найкраще, що я знайшов до цього часу, - це додати 1 до всіх моїх вхідних значень, підходити до кривої, а потім відняти одне з моїх передбачуваних значень ("змістити" криву вгору, а потім назад вниз на 1). Це досить добре відповідає попередньо прогнозованим даним, але, схоже, це має бути неправильним способом.

редагувати: Значення у вхідному масиві спостерігаються в реальному масштабі даних (кількість випадків чогось) протягом ряду років. Тож у деякі роки кількість випадків становила нульову. Будь це найкращий спосіб чи ні (я згоден, що це не може бути), автор оригінального алгоритму стверджує, що використовував розподіл Weibull, і я повинен спробувати повторити їх процес.


5
Вейбул - це безперервний розподіл, так що ймовірність отримання точно нуля має нульову ймовірність. Якщо ви отримуєте багато нулів у своїх даних, це негайно зрозуміло, що Weibull є недоречним. У будь-якому випадку, ваші дані виглядають як дані підрахунку (або, принаймні, дискретні), тому Weibull, мабуть, не найкращий вибір.
кардинал

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

Відповіді:


8

(Як зазначають інші, розподіл Вейбулла, швидше за все, не буде відповідним наближенням, коли дані є лише цілими числами. Наступне покликане допомогти вам визначити, що робив попередній дослідник правильно чи неправильно.)

Існує декілька альтернативних методів, на які нулі не впливають, наприклад, використання різних методів оцінювання моментів. Зазвичай вони вимагають чисельного розв’язання рівнянь, що включають гамма-функцію, оскільки моменти розподілу Вейбулла наведені з точки зору цієї функції. Я не знайомий з R, але ось програма Sage, яка ілюструє один з більш простих методів - можливо, його можна адаптувати до R? (Ви можете прочитати про це та інші подібні методи у, наприклад, "Розподіл Вейбула : посібник" Хорста Рінна, стор. 455ff - однак, в його еквіваленті 12.4b є помилка друку, як "-1" зайвий).

"""
Blischke-Scheuer method-of-moments estimation of (a,b)
for the Weibull distribution F(t) = 1 - exp(-(t/a)^b)
""" 

x = [23,19,37,38,40,36,172,48,113,90,54,104,90,54,157,
      51,77,78,144,34,29,45,16,15,37,218,170,44,121]
xbar = mean(x)
varx = variance(x)
var("b"); f(b) = gamma(1+2/b)/gamma(1+1/b)^2 - 1 - varx/xbar^2
bhat = find_root(f, 0.01, 100)
ahat = xbar/gamma(1+1/bhat)
print "Estimates: (ahat, bhat) = ", (ahat, bhat)

Це дало вихід

Estimates: (ahat, bhat) =  (81.316784310814455, 1.3811394719075942)


0

x = [23,0,37,38,40,36,172,48,113,90,54,104,90,54,157,
      51,77,78,144,34,29,45,0,0,37,218,170,44,121]

тоді ця сама процедура дає результат

Estimates: (ahat, bhat) =  (78.479354097488923, 1.2938352346035282)


EDIT: Я щойно встановив R, щоб спробувати. Ризикуючи зробити цю відповідь задовго, для всіх, хто цікавиться ось моїм R-кодом для методу Блішке-Шеуера:

fit_weibull <- function(x)
{
    xbar <- mean(x)
    varx <- var(x)
    f <- function(b){return(gamma(1+2/b)/gamma(1+1/b)^2 - 1 - varx/xbar^2)}
    bhat <- uniroot(f,c(0.02,50))$root
    ahat <- xbar/gamma(1+1/bhat)
    return(c(ahat,bhat))
}

Це відтворює (до п'яти значущих цифр) два приклади Sage вище:

x <- c(23,19,37,38,40,36,172,48,113,90,54,104,90,54,157,
     51,77,78,144,34,29,45,16,15,37,218,170,44,121)
fit_weibull(x)
[1] 81.316840  1.381145

x <- c(23,0,37,38,40,36,172,48,113,90,54,104,90,54,157,
      51,77,78,144,34,29,45,0,0,37,218,170,44,121)
fit_weibull(x)
[1] 78.479180  1.293821

4

θfitdistrθθfitdistr

foo <- function(theta, x)
{
  if (theta <= -min(x)) return(Inf);
  f <- fitdistr(x+theta, 'weibull')
  -2*f$loglik
}

Потім мінімізуйте цю функцію за допомогою одновимірної оптимізації:

bar <- optimize(foo, lower=-min(x)+0.001, upper=-min(x)+10, x=x)

де я щойно склав "+10" на основі взагалі нічого.

Для даних із трьома найменшими значеннями, заміненими нулями, отримуємо:

> bar
$minimum
[1] 2.878442

$objective
[1] 306.2792

> fitdistr(x+bar$minimum, 'weibull')
     shape        scale   
   1.2836432   81.1678283 
 ( 0.1918654) (12.3101211)
> 

bar$minimumθfitdistrθ


2

Це повинно бути невдалим, ви повинні бути вдячні, що не вдалося.

Ваші спостереження показали, що збої сталися в той самий момент, коли ви почали їх спостерігати. Якщо це справжній процес, що виходить із реальних (а не імітованих даних), вам потрібно якось вирахувати причину, чому ви отримуєте нулі. Я бачив дослідження виживання, де 0 разів виявляються як наслідок однієї з кількох речей:

  1. Дані насправді усічені: об’єкти опинилися під загрозою і не змогли до початку дослідження, і ви хочете зробити вигляд, що спостерігали за ними весь час.
  2. Прилади погано відкалібровані: у вас недостатньо точності вимірювання для дослідження, тому відмови, що виникають біля часу початку, були кодовані як рівно нульові.
  3. Річ, кодована як нуль, не є нулем. Це люди чи об'єкти, які так чи інакше були виключені з аналізу. Нуль просто відображається в даних як наслідок об'єднання, сортування або перекодування пропущених значень іншим чином.

Так для випадку 1: потрібно використовувати належні методи цензури, навіть якщо це означає ретроспективно витягування записів. Випадок 2 означає, що ви можете використовувати алгоритм ЕМ, оскільки у вас проблема з точністю. Аналогічно тут працюють і байєсовські методи. Випадок 3 означає, що вам просто потрібно виключити значення, які повинні були бути відсутніми.


ОП пояснила, що попередній дослідник вирішив підходити до розподілу Вейбулла, хоча дані є реальними підрахунками - невід'ємними цілими підрахунками кількості випадків чогось. Незрозуміло, як ваші три справи стосуються такої ситуації.
res

О, хороша примітка! Підходити до дистрибуції Вейбула - це грубо неправильно. Він має постійну підтримку і ніколи не використовується для моделювання підрахунків, але часу виживання. Негативні біноміальні розподіли були б своєрідним еквівалентним розподілом двох параметрів для моделювання підрахунків, що, звичайно, залежить від характеру процесу генерації даних (про що ми маємо 0 інформації, як зазначено в проблемі). Дякую, що вказали на мене.
АдамО

1

Я згоден з відповіддю кардинала вище. Однак також досить часто додавати константу, щоб уникнути нулів. Інше значення, яке зазвичай використовується 0,5, але будь-яка позитивна константа могла бути використана. Ви можете спробувати діапазон значень, щоб побачити, чи можете ви визначити точне значення, яке використовував попередній дослідник. Тоді ви можете бути впевнені, що зможете відтворити його результати, перш ніж вирушити на пошуки кращого розподілу.


0

[Припускаючи, що Вейбул підходить] У книзі Джонсона Коца та Балакришнана є багато способів оцінити параметри Вейбула. Деякі з них не залежать від даних, що не включають нулі (наприклад, із застосуванням середнього та стандартного відхилення або з використанням певних відсотків).

Johnson, NL, Kotz, S. and Balakrishnan, N. (1994). Постійні універсальні розподіли. Нью-Йорк: Вілі, приблизно на сторінці 632.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.