編輯 警告:下面舉例說明以下問題中的例子使用GenericLikelihoodModel
。 然而,在伽馬分佈的情況下,位置參數改變了對最大似然估計的一般假設排除的分佈的支持。更標準的用法將修復支持,floc = 0,所以它只是一個雙參數分佈。在那種情況下,標準的MLE理論適用。
Statsmodels有一個最大似然估計的泛型類,GenericLikelihoodModel
。它不是直接爲這種情況設計的,但可以使用一些幫助(定義屬性並提供start_params)。
import numpy as np
from statsmodels.base.model import GenericLikelihoodModel
from scipy.stats import gamma
shape = 12; loc = 0.71; scale = 0.0166
data = gamma.rvs(shape, loc=loc, scale=scale, size=1000)
params = gamma.fit(data) # params close to but not the same as (shape, loc, scale)
# HOW TO ESTIMATE/GET ERRORS FOR EACH PARAM?
print(params)
print('\n')
class Gamma(GenericLikelihoodModel):
nparams = 3
def loglike(self, params):
return gamma.logpdf(self.endog, *params).sum()
res = Gamma(data).fit(start_params=params)
res.df_model = len(params)
res.df_resid = len(data) - len(params)
print(res.summary())
這將打印基於最大似然估計以下
(10.31888758604304, 0.71645502437403186, 0.018447479022445423)
Optimization terminated successfully.
Current function value: -1.439996
Iterations: 69
Function evaluations: 119
Gamma Results
==============================================================================
Dep. Variable: y Log-Likelihood: 1440.0
Model: Gamma AIC: -2872.
Method: Maximum Likelihood BIC: -2852.
Date: Sun, 12 Jul 2015
Time: 04:00:05
No. Observations: 1000
Df Residuals: 997
Df Model: 3
==============================================================================
coef std err z P>|z| [95.0% Conf. Int.]
------------------------------------------------------------------------------
par0 10.3187 2.242 4.603 0.000 5.925 14.712
par1 0.7165 0.019 37.957 0.000 0.679 0.753
par2 0.0184 0.002 8.183 0.000 0.014 0.023
==============================================================================
其他結果然後也可用,例如一個Z測試,所述第一參數爲10可以像通過指定執行一個限制矩陣,或通過使用一個字符串表達式與等式:
>>> res.t_test(([1, 0, 0], [10]))
<class 'statsmodels.stats.contrast.ContrastResults'>
Test for Constraints
==============================================================================
coef std err z P>|z| [95.0% Conf. Int.]
------------------------------------------------------------------------------
c0 10.3187 2.242 0.142 0.887 5.925 14.712
==============================================================================
>>> res.t_test('par0=10')
<class 'statsmodels.stats.contrast.ContrastResults'>
Test for Constraints
==============================================================================
coef std err z P>|z| [95.0% Conf. Int.]
------------------------------------------------------------------------------
c0 10.3187 2.242 0.142 0.887 5.925 14.712
==============================================================================
非常感謝,我使用在http://scipy-central.org/item/36/2/error-estimates描述自舉方法 - 用於配合巴從最小二乘法擬合使用引導重採樣,但你給的答案似乎更完整,並允許我應用更多的測試。不過,我想知道爲什麼在這個過程中,我運行了幾次相同的腳本後,得到了(有時非常不同的)參數結果。這是正常的嗎?例如,c0在8到20之間變化(當然,更改標準錯誤)。再次感謝 – iluvatar
請注意,我使用scipy擬合結果作爲GenericLikelihoodModel的起始參數。一般來說,這可能不具有良好的默認開始值,並且在某些情況下,目標函數的曲率「不好」。我不知道Gamma分佈的三個參數表現得有多好。也許「流動購物」將爲優化提供一個成功的全球最小值。 – user333700
另一個一般性評論:我的猜測是,我們通常會將'loc'設置爲固定爲零以模擬正值數據。估計分佈支持的最大可能性往往或一般存在問題。 – user333700