2016-06-14 16 views
1

私はPythonでMLE実装を行っています。私の対数尤度関数には推定する5つのパラメータがあり、そのうち2つは0と1の間でなければならないという制約があります。私はstatsmodelsパッケージからGenericLikelihoodModelモジュールを使用してMLEを実装することができますが、これを制約で行う。 は、具体的には、私の負の対数尤度関数は制限付きMLE with Python

def ekop_ll(bs,alpha,mu,sigma,epsilon_b,epsilon_s): 
    ll=[] 
    for bsi in bs: 
     b=bsi[0] 
     s=bsi[1] 
     part1 = (1-alpha)*stats.poisson.pmf(b,epsilon_b)*stats.poisson.pmf(s,epsilon_s) 
     part2 = alpha*sigma*stats.poisson.pmf(b,epsilon_b)*stats.poisson.pmf(s,mu+epsilon_s) 
     part3 = alpha*(1-sigma)*stats.poisson.pmf(b,mu+epsilon_b)*stats.poisson.pmf(s,epsilon_s) 
     li = part1+part2+part3 
     if part1+part2+part3 == 0: 
      li = 10**(-100) 
     lli = np.log(li) 
     ll.append(lli) 
    llsum = -sum(ll) 
    return llsum 

とMLEの最適化クラスである

class ekop(GenericLikelihoodModel): 
    def __init__(self,endog,exog=None,**kwds): 
     if exog is None: 
      exog = np.zeros_like(endog) 
     super(ekop,self).__init__(endog,exog,**kwds) 
    def nloglikeobs(self,params): 
     alpha = params[0] 
     mu = params[1] 
     sigma = params[2] 
     epsilon_b = params[3] 
     epsilon_s = params[4] 
     ll = ekop_ll(self.endog,alpha=alpha,mu=mu,sigma=sigma,epsilon_b=epsilon_b,epsilon_s=epsilon_s) 
     return ll 
    def fit(self, start_params=None, maxiter=10000, maxfun=5000, **kwds): 
     if start_params == None: 
      # Reasonable starting values 
      alpha_default = 0.5 
      mu_default = np.mean(self.endog) 
      sigma_default = 0.5 
      epsilon_b_default = np.mean(self.endog) 
      epsilon_s_default = np.mean(self.endog) 
      start_params =[alpha_default,mu_default,sigma_default,epsilon_b_default,epsilon_s_default] 
     return super(ekop, self).fit(start_params=start_params, 
             maxiter=maxiter, maxfun=maxfun, 
             **kwds) 

そしてメインは、私がどのように知りません

if __name__ == '__main__': 
    bs = #my data# 
    mod = ekop(bs) 
    res = mod.fit() 

です制約を組み込むように私のコードを修正してください。私はアルファとシグマが0と1の間にあることを望みます。

答えて

1

制約を満たす内部解を得るための共通のアプローチの1つは、最適化が制約されないようにパラメータを変換することです。例えば

:オープン間隔となるように制約(0、1)、ロジット関数を用いて形質転換されたここでは例のために使用することができる。

https://github.com/statsmodels/statsmodels/blob/master/statsmodels/miscmodels/count.py#L243

我々は、確率ためmulinomialロジットを使用することができ、(0、1)にあり、1になるパラメータ

一般化された線形モデルでは、リンク関数を使用して予測平均に同様の制約を課しています(statsmodels/genmod/families/links.pyを参照)。

制約をバインドできる場合、これは機能しません。 Scipyにはオプティマイザが制約されていますが、統計モデルLikelihoodModelクラスにはまだ接続されていません。

関連するもの:scipyには、ローカルミニマムが複数ある場合にうまく動作し、likelihoodModelsに接続され、fitでmethod引数を使用して選択できるグローバルオプティマイザbasinhoppingがあります。

0

IMHOこれは数学の質問であり、あなたの質問を改造する必要があるという簡単な答えです。

問題を具体的に解決するには、元のモデルから派生した特別なケースモデルを作成し、その中に本質的に制約が定義されている必要があります。次に、特殊ケースモデルの計算されたMLEが、あなたが探している推定値を与えます。

しかし、2つのパラメータが制約されていない元のモデルのように、一般的なケースモデルの制約AND NOTを使用して派生モデルの推定が膨らんでいます。

実際に、MCMC、ANN、ニュートンベースの反復メソッドなどのパラメータ推定に使用する方法や、その他の方法は、派生モデルと拘束モデルの推定を提供します。

0

実際、これはプログラミングの質問ではなく、数学の質問です。私はこの問題を、制約を用いてパラメータを変換することによって解決した。 alpha_hatとsigma_hatにアルファとシグマ、

alpha = 1/(1+np.exp(-alpha_hat)) 
    sigma = 1/(1+np.exp(-sigma_hat)) 

我々は制約なしでalpha_hatとsigma_hatを推定することができるようにします。