我尝试为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
您能看到我的手动实施存在缺陷吗?
答案 0 :(得分:1)
我认为这只是定义上的差异。
statsmodels在aic而不是rss
的定义中使用对数似然。 statsmodels.tools.eval_measures
有两个定义。
信息标准通常仅用于比较同一模型的不同版本,尤其是不同数量的解释变量。在这种情况下,通常会删除在模型的各个版本中保持不变的术语。但是,statsmodels在信息标准的计算中使用完整的对数似然定义。这样还可以跨模型进行比较。
关于aic定义的第二个问题是它是否除以观察次数。不同的统计数据包也有所不同。