Как подогнать бета-распределение к данным с заданным средним значением?

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

Для этого есть несколько параметров, таких как fitdist, которые предоставляют набор a и b, а статистика (среднее и стандартное) доступна с помощью команд betastat или просто mean и 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.


person parisa    schedule 06.05.2019    source источник
comment
Является ли это бета-распределением, ограниченным между [0,1], или обобщенным бета-распределением, которое ограничено между [x1,x2, где x1,x2 — действительные числа? Ответ зависит от этого. В обоих случаях бета-распределение также имеет два параметра формы, обозначаемые либо альфа1, альфа2, либо, в случае MATLAB, a и b.   -  person SecretAgentMan    schedule 07.05.2019
comment
Также см. раздел Как спросить. Если вы редактируете свой вопрос, включив в него Минимальный, полный и проверяемый пример, вы получите более конкретную обратную связь и/или помощь.   -  person SecretAgentMan    schedule 08.05.2019
comment
Я отредактировал вопрос. надеюсь, это поможет получить лучшие ответы. @SecretAgentMan   -  person parisa    schedule 08.05.2019


Ответы (1)


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 и локально максимизируют функцию правдоподобия для ваших данных с учетом этого ограничения.

person Will    schedule 07.05.2019
comment
спасибо, но шаги неясны .. и я считаю, что это неглоглик. Я был бы признателен, если бы вы могли отредактировать ответ с полным выполненным образцом. - person parisa; 07.05.2019
comment
Я попытался немного уточнить ответ. negloglike — это дескриптор функции, используемый внутри betafit, который вы можете проверить, как описано. Это отличается от negloglik, который представляет собой метод распределения объектов, не используемый внутри betafit. В качестве альтернативы вы можете создать целевую функцию, которая вызывает makedist с использованием пробных параметров, а затем вызывает negloglik, но вы будете нести большие накладные расходы на каждой итерации в makedist. Если вам нужны ответы с полными выполненными примерами, на ваш вопрос нужен полный выполненный пример, на который можно ссылаться. - person Will; 07.05.2019