Как подогнать распределение Вейбулла к входным данным, содержащим нули?


14

Я пытаюсь воспроизвести существующий алгоритм прогнозирования, переданный отставным исследователем. Первым шагом является согласование некоторых наблюдаемых данных с распределением Вейбулла, чтобы получить форму и масштаб, которые будут использоваться для прогнозирования будущих значений. Я использую 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). Это довольно хорошо соответствует ранее предсказанным данным, но, похоже, это неправильный способ.

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


5
Вейбулл - это непрерывное распределение, так что вероятность получить ровно ноль имеет вероятность ноль. Если вы получаете много нулей в ваших данных, это означает, что Вейбулл неуместен. В любом случае, ваши данные выглядят как данные подсчета (или, по крайней мере, являются дискретными), поэтому 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)


РЕДАКТИРОВАТЬ: Я только что установил 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 означает, что вы можете использовать алгоритм EM, потому что у вас есть проблема точности. Байесовские методы работают и здесь. Случай 3 означает, что вам просто нужно исключить значения, которые должны были отсутствовать.


О.П. пояснил , что предыдущий исследователь решил поместить распределения Вейбулла, даже если данные реальных отсчетов - неотрицательные целые Графы числа появлений чего - то. Непонятно, как ваши три дела связаны с такой ситуацией.
Res

О, хорошая записка! Подгонка к распределению Вейбулла вопиюще неверна. Он имеет постоянную поддержку и никогда не используется для моделирования счета, но времени выживания. Отрицательные биномиальные распределения были бы своего рода эквивалентным двухпараметрическим распределением для моделирования чисел, что, конечно, зависит от характера процесса генерирования данных (о котором у нас имеется 0 информации, как указано в задаче). Спасибо, что указал мне на это.
AdamO

1

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


0

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

Johnson, NL, Kotz, S. и Balakrishnan, N. (1994). Непрерывные одномерные распределения. Нью-Йорк: Wiley, примерно на странице 632.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.