Python で最初の最尤推定を実行しようとしています。この手順の 1 つで、モデル パラメーターの可能性を計算する必要があります。ここに要約できるサンプルデータをいくつか見つけました。
import numpy as np
import pandas as pd
life_test = pd.DataFrame(columns=['points', 'time'])
life_test['points'] = np.linspace(1,14,14)
life_test['time'] = np.concatenate((np.linspace(5,40,8), np.linspace(50,100,6)), axis=0)
statsmodels.api を介して単純なモデルを実行するとします。results.summary() から -14.601 の値を取得します。
import statsmodels.api as sm
endog=np.array(life_test['points'])
exog=np.array(life_test['time'])
exog = sm.add_constant(exog)
results = sm.OLS(endog, exog).fit()
results.summary()
OLS のソースを見ると、これは対数尤度の基本的な計算のようです
params = np.array(results.params)
nobs2=results.nobs/2.0 # decimal point is critical here!
-nobs2*np.log(2*np.pi)-nobs2*np.log(1.0/(2*nobs2) *\
np.dot(np.transpose(endog - np.dot(exog, params)),\
(endog - np.dot(exog,params)))) - nobs2
これを PyMC で実装しようとすると、異なる結果が得られます。私の側での場所とスケールの計算ミスかもしれません。
import pymc.distributions as dist
mu = exog.mean()
sigma = exog.std()
dist.normal_like(exog, mu, 1/sigma**2)
ここでは -135.29 という値を取得します。scale と loc の値を誤って計算しているに違いないと感じていますが、実装の他のエラーである可能性があります。おそらく、OLS は通常の対数尤度以外の他の尤度を使用していますか? 私は統計モデル、PyMC、および MLE 全般にかなり慣れていません。ここで私が間違っていることを誰かが知っていますか?