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エラーを計算する方法がありますか?