Как приспособить бета-версию к данным с заданным средним значением? - PullRequest
1 голос
/ 07 мая 2019

Я подгоняю бета-дистрибутив к своим данным с помощью MATLAB.

Для этого есть несколько опций, таких как fitdist, которые предоставляют набор a и b и статистику(mean и std) доступны с помощью команд betastat или просто mean и std.

Но что я могу сделать, если я хочу, чтобы у моего дистрибутива было заданное среднее значение, а только std было неизвестно.

Есть пример.У меня есть полугистограмма с размером ячейки с определенными центральными соотношениями и их вероятностями следующим образом:

central_ratios = [.005 .1 .4 .8   1]; 
probabilities  = [.5   .3 .1 .08 .02];
vul = sum(central_ratios.*probabilities);

Теперь я хочу подогнать «бета-распределение» к данным, ограниченным между [0,1] со средним значением, равным vul.все, что мне сейчас нужно, это лучшая пара std или a и b.

1 Ответ

0 голосов
/ 07 мая 2019

fitdist для бета-распределения получает параметры распределения от betafit, который устанавливает соответствующую функцию правдоподобия для распределения с учетом ваших данных, некоторые эвристические начальные предположения для a и b, а затем оптимизирует log(a) и log(b), чтобы максимизировать вероятность, используя fminsearch.

Ваше ограничение, определяющее среднее значение распределения, устанавливает принудительную связь между a и b. Из Википедии среднее mu относится к a и b, таким образом:

mu = 1 / (1 + b/a)

Это можно изменить, чтобы получить один параметр распределения, а другой:

b = a * (1/mu - 1)

Чтобы изучить неограниченную реализацию подгонки бета-распределения, которая доступна в MATLAB и которую вы хотите ограничить, вы можете просмотреть исходный код betafit, используя:

edit betafit

По крайней мере в MATLAB R2018b вы обнаружите, что оптимизация log(a) и log(b) происходит в точке, которая объявляет:

phat = fminsearch(negloglike,pstart,opts);
phat = exp(phat);

Ваша проблема подбора ограниченного распределения может быть описана в терминах используемой здесь оптимизированной целевой функции, которая может позволить вам повторно использовать другие аспекты поведения betafit:

negloglike1 = @(loga) negloglike([loga log(exp(loga) * (1/mu - 1))]);

Вы можете либо создать свой собственный дубликат betafit, который делает это объявление до вызова fminsearch, либо остановить встроенную betafit на точке останова после вызова линии и объявить новую функцию правдоподобия из командной строки. В любом случае, вы можете затем заменить параметры ограниченными параметрами, которые максимизируют вероятность в этом ограничении:

loga = fminsearch(negloglike1,pstart(1),opts);
phat = exp(loga) * [1 (1/mu - 1)];

Полученные параметры бета-распределения phat гарантированно приведут к распределению со средним значением mu и локально максимизируют функцию правдоподобия для ваших данных с учетом этого ограничения.

...