python-2.7 - 手动计算的 AIC 不同于 statsmodel AIC
问题描述
我试图为 AIC 手动编写公式。我想将它与 scikit learn 结合使用。为了测试我是否正确编码,我比较了给定相同数据集的 statsmodels 的 AIC 值。但是如果我比较模型 M1 和模型 M2,我的实现和 statsmodels 会产生不同的结果;不仅在数字上,而且 statsmodels AIC 更喜欢我的 AIC 之外的另一个模型。
我使用手动实现的残差平方和并将其放入 AIC 公式中。ols 是 scikit 的普通最小二乘估计器。索引 n 在数据集上运行,y_run(n) 是具有响应变量的第 n 个数据集,X_run(n) 是第 n 个输入训练数据集。最后一段代码是 statsmodel 的 AIC,其中 regr 是 statsmodels 普通最小二乘估计器。
def rss(n):
return ((y_run(n)-ols(n).predict(X_run(n)))**2).sum()
def AIC (n):
return len(X_run(n))*np.log(rss(n)/len(X_run(n)))+2*p
def AIC_regr (n):
return regr(n).aic
你能看到,我的手动实施存在缺陷吗?
解决方案
我认为这只是定义上的差异。
statsmodels 在 aic 和 not 的定义中使用对数似然rss
。statsmodels.tools.eval_measures
有两个定义。
信息标准通常仅用于比较同一模型的不同版本,特别是不同数量的解释变量。在这种情况下,模型版本中不变的项通常会被删除。但是,statsmodels 在计算信息标准时使用完整的对数似然定义。这也允许跨模型进行比较。
aic 定义的第二个问题是它是否除以观察次数。这也因统计包而异。