Оценка максимального правдоподобия со статистическими моделями слишком усложняет ситуацию? Надеюсь на рекомендации

avatar
Coolio2654
8 апреля 2018 в 01:24
2619
1
2

После прохождения нескольких курсов по продвинутой статистике я решил закодировать некоторые функции/классы, чтобы просто автоматизировать оценку параметров для различных распределений с помощью MLE. В Matlab ниже показано то, что я однажды легко закодировал:

function [ params, max, confidence_interval ] = newroutine( fun, data, guesses )

lh = @(x,data) -sum(log(fun(x,data))); %Gets log-likelihood from user-defined fun.

options = optimset('Display', 'off', 'MaxIter', 1000000, 'TolX', 10^-20, 'TolFun', 10^-20);
[theta, max1] = fminunc(@(x) lh(x,data), guesses,options);
params = theta 
max = max1

end

Где мне просто нужно правильно указать базовое уравнение PDF как fun, и с дополнительным кодом я могу вычислить p-значения, доверительные интервалы и т. д.

Однако с Python все источники, которые я нашел по автоматизации MLE (например, здесь и здесь) сделать это, чтобы углубиться в ООП, используя подкласс statsmodel, GenericLikelihoodModel, что кажется мне слишком сложным. Я полагаю, что, поскольку логарифмическое правдоподобие может быть автоматически создано из pdf (по крайней мере, для подавляющего большинства функций) и scipy.stats."random_dist".fit() уже легко возвращает оценки MLE, кажется нелепым пишите ~30 строк кода класса каждый раз, когда у вас появляется новый dist. чтобы соответствовать.

Я понимаю, что способ, предложенный двумя ссылками, позволяет автоматически подключаться к statsmodel's функциям, но, честно говоря, это не кажется проще, чем подключаться к scipy и писать гораздо более простые функции.

Я пропустил более простой способ выполнения базового MLE, или есть действительно веская причина для того, как statsmodels делает это?

Источник
Warren Weckesser
8 апреля 2018 в 02:58
0

"... все источники, которые я нашел по автоматизации MLE (например, здесь и здесь), настаивают на том, что самый простой способ сделать это - углубиться в ООП, используя подкласс statsmodel, GenericLikelihoodModel" метод, показанный в разделе «Python, написанный вручную с помощью SciPy» в , ваша первая ссылка не требует использования statsmodels. (Это правда, что статья рекомендует statsmodels вместо этого метода.)

Josef
8 апреля 2018 в 04:33
0

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

Coolio2654
8 апреля 2018 в 05:44
0

Это может быть только я, но мне кажется, что каждый раз кодировать эти ~ 30 строк, которые не выглядят тривиальными, кажутся мне неэффективными. Вот почему я думаю, что должен быть лучший способ.

Josef
8 апреля 2018 в 12:58
0

@Coolio2654 Coolio2654 Если вы просто хотите обернуть множество дистрибутивов scipy, то написание подкласса для каждого из них, то написание одного подкласса для каждого дистрибутива - не самый короткий путь. Вы можете создать один подкласс, который принимает дистрибутив scipy в качестве аргумента __init__, и заставить loglike использовать метод logpdf. (Я хотел бы добавить это к статистическим моделям.)

Ответы (1)

avatar
Rob Hicks
17 апреля 2018 в 17:28
3

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

При использовании minimize, эквивалента python fminunc (как вы указали в своем примере), часто я вынужден использовать «Nelder-Meade» или какой-либо другой метод без градиента для получения сходимости. Поскольку мне нужны стандартные ошибки для статистического вывода, это влечет за собой дополнительный шаг с использованием numdifftools для восстановления гессиана. Итак, в конце концов, метод, который вы предлагаете, тоже имеет свои сложности (для моей работы). Если все, что вам нужно, это оценка максимального правдоподобия, а не вывод, то подход, который вы описываете, вероятно, лучший, и вы правы, что вам не нужен механизм statsmodel.

К вашему сведению: в позже я использую ваш подход в сочетании с autograd для значительного ускорения больших моделей максимального правдоподобия. Мне не удалось заставить это работать с statsmodels.

Coolio2654
17 апреля 2018 в 20:06
0

Спасибо за ответ! Вы нашли этот пост по моей ссылке на вашу статью? В любом случае, спасибо за предоставление дополнительного контекста, который полезен. Если я могу задать вопрос, вы говорите, что дополнительный шаг в реализации статистического вывода для MLE sans statsmodels включает в себя вычисление гессиана самостоятельно. Разве это не требует дополнительных 1 или 2 строк кода, если я что-то не упустил? И спасибо за вашу ссылку об автодифференциации, которая, мягко говоря, звучит увлекательно.

Rob Hicks
18 апреля 2018 в 11:06
0

Да, ссылка навела на мысль. Код, необходимый для добавления гессиана, не слишком громоздкий, это всего лишь несколько дополнительных строк (см. последний блок кода в разделе «Python, закодированный вручную с использованием Scipy» моего блога, на который вы ссылались).