2017-07-25 28 views
0

pythonに直接離散分布フィッティングパッケージがないので、私はstatmodels.base.model.GenericLikelihoodModelを使用して二項分布に適合させようとしました。しかしながら、いくつかの場合、例えばn = 5、p = 0.5において、推定概算における各項は、ポイント推定を除いて、すべての項はナノである。二項分布に適合するGenericLikelihoodModel:出力stderrがnan

nを5から10に変更すると、すべて正常に動作します。

私のコードは次のとおりです。

import numpy as np 
from statsmodels.base.model import GenericLikelihoodModel 
from scipy.stats import binom 


class Binom(GenericLikelihoodModel): 
    def loglike(self, params):    
     return np.log(binom.pmf(self.endog, *params)).sum() 

n, p = 5, 0.5 
params = (n, p) 
x = binom.rvs(5, p, size=1000, random_state=1) 

res = Binom(x).fit(start_params=params) 
res.df_model = len(params) 
res.df_resid = len(x) - len(params) 
print(res.summary()) 

関連出力:

 coef std err   z  P>|z|  [95.0% Conf. Int.] 
par0 5.0000  nan  nan  nan  nan  nan 
par1 0.4972  nan  nan  nan  nan  nan 

エラーメッセージ:

//anaconda/lib/python3.6/site-packages/ipykernel/ メイン .py:23:RuntimeWarning:ログに遭遇したゼロで割る

//anaconda/lib/python3.6/site-packages/statsmodels/tools/numdiff.py:329:runtimeWarning:double_scalarsで無効な値が見つかりました - f(*((x-ee [i、:] - ee [ j::]))+ args)、** kwargs)、)

//anaconda/lib/python3.6/site-packages/scipy/stats/_distn_infrastructure.py:875:RuntimeWarning:無効な値が見つかりました大きい リターン(self.a < X)&(X < self.b)

//anaconda/lib/python3.6/site-packages/scipy/stats/_distn_infrastructure.py:875:RuntimeWarning:無効な値出くわしました リターン(自己x)&(x< self.b)

//anaconda/lib/python3.6/site-packages/scipy/stats/_distn_infrastructure.py:1814:RuntimeWarning:less_equal COND2において遭遇無効値= cond0 &(X < =セルフ.a)

最終的に私のコードが失敗した理由がわかりました。 statsmodelsにおいて、STD ERRの計算は、点推定におけるヘッセ行列であるcov_params式

np.sqrt(np.diag(self.cov_params())) 

によるものです。 fはloglike関数であるフィッティングプロセスでは、ヘッセ行列を

hess[i, j] = (f(*((x + ee[i, :] + ee[j, :],) + args), **kwargs) 
         - f(*((x + ee[i, :] - ee[j, :],) + args), **kwargs) 
         - (f(*((x - ee[i, :] + ee[j, :],) + args), **kwargs) 
         - f(*((x - ee[i, :] - ee[j, :],) + args), **kwargs),) 
        )/(4.*hess[i, j]) 

によって計算される、xは点推定値及びEEは、推定誤差です。 nの点推定が実nである場合、hess [i、j]についてf(n-ee、p)を計算する必要がある。 n-ee < n。

私のカスタマイズされた対数関数と組み合わされて、log(0)= Inf(以下で説明します)の計算とhess [i、j]の計算にlog(0) 。だからこそ、最終的な標準誤差と他のすべての基準値がすべての値になります。

log(0)のゼロは、binom.pmf(x、n、p)= 0(x> n)によって得られます。 binom.pmf(5,5,0.5)= 0.03125とbinom.pmf(10,10,0.5)= 0.00097を仮定すると、n = 10、p = 0.5を選択すると分かりますサンプリングのために、サンプル中に10が存在しなくてもよい。したがって、ログ(0)のケースは発生しません。ただし、サンプルサイズを1000000に増やすと、サンプルエラーが予想どおりに発生します。

私のカスタマイズしたログ機能を変更するか、statsmodelsのhessian関数を上書きして、この場合のstdエラーを計算する方法がありますか?

答えて

0

一般に、分布のサポートがパラメータに依存する場合、最尤推定では理論上および計算上の問題があります。

この場合、nは分布の上限を定義します。この場合、標準エラーのような推論統計は有効ではありません。

通常の二項の場合、試行回数nは既知であると仮定し、確率または割合のみを推定します。統計モデルやその他のパッケージでは、GLMを使用して二項類の家族を作成し、成功数と失敗数を従属変数として指定することでこれを見積もることができます。 デフォルトでは、Logitリンクが使用されています。この場合、パラメータは、この場合の予測方法によって行われる確率を得るために変換される必要があります。

関連する問題