В scipy.stats rv_continuous имеет подходящий метод для поиска MLE, но rv_discrete этого не делает. Зачем?

Я хотел бы найти Оценщик максимального правдоподобия для некоторых данных, которые могут определяться дискретным распределением. Но в scipy.stats только классы, представляющие непрерывные распределения, имеют соответствующую функцию. В чем причина того, что классы, представляющие дискретные распределения, нет?

Ответ 1

Короткий ответ: потому что никто не написал код для него или даже не пытался, насколько я знаю.

Более длинный ответ: я не знаю, как далеко мы можем добраться с дискретными моделями с помощью общего метода максимального правдоподобия, поскольку ther - для непрерывных распределений, который работает для многих, но не для всех.

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

>>> [(f, getattr(stats, f).shapes) for f in dir(stats) if isinstance(getattr(stats, f), stats.distributions.rv_discrete)]
[('bernoulli', 'pr'), ('binom', 'n, pr'), ('boltzmann', 'lamda, N'), 
 ('dlaplace', 'a'), ('geom', 'pr'), ('hypergeom', 'M, n, N'), 
 ('logser', 'pr'), ('nbinom', 'n, pr'), ('planck', 'lamda'), 
 ('poisson', 'mu'), ('randint', 'min, max'), ('skellam', 'mu1,mu2'), 
 ('zipf', 'a')]

statsmodels предоставляет несколько дискретных моделей, где параметры также могут зависеть от некоторых объясняющих переменных. Большинство из них, например, обобщенные линейные модели, нуждаются в функции ссылок, чтобы ограничить значения параметров допустимым диапазоном, например интервалом (0, 1) для вероятностей, или больше нуля для параметров в моделях подсчета.

Затем параметр "n" в биномиальном и некоторых других должен быть целым числом, что делает невозможным использование обычных непрерывных минимизаторов из scipy.optimize.

Хорошим решением было бы для кого-то добавить специальные методы соответствия дистрибутивам, чтобы у нас были, по крайней мере, более легкие.