手动计算的AIC与statsmodel AIC不同

时间:2019-05-22 17:00:36

标签: python-2.7 machine-learning scikit-learn statistics statsmodels

我尝试为AIC手动编写公式。我想将它与scikit学习结合使用。为了测试我是否正确编码,我比较了给定相同数据集的statsmodels中的AIC值。但是,如果我将模型M1和模型M2进行比较,则我的实现和统计模型会得出不同的结果。不仅是数值上的,而且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

您能看到我的手动实施存在缺陷吗?

1 个答案:

答案 0 :(得分:1)

我认为这只是定义上的差异。

statsmodels在aic而不是rss的定义中使用对数似然。 statsmodels.tools.eval_measures有两个定义。

信息标准通常仅用于比较同一模型的不同版本,尤其是不同数量的解释变量。在这种情况下,通常会删除在模型的各个版本中保持不变的术语。但是,statsmodels在信息标准的计算中使用完整的对数似然定义。这样还可以跨模型进行比较。

关于aic定义的第二个问题是它是否除以观察次数。不同的统计数据包也有所不同。