下面是我的代码:
import statsmodels.formula.api as smf
md = smf.mixedlm("dep ~ indep", df, groups=df["groups"], re_formula='~indep')
mdf = md.fit(method=["lbfgs"])
mdf。Bic返回nan作为输出。原因是什么呢?如果是包装相关的问题。有没有人可以为这个案例手工计算BIC ?
查看@StupidWolf问题下方的评论,我认为没有为LM模型提供BIC是正确的。即使在输出mdf.summary()
时,您也不会在输出中找到BIC或AIC。
但是如果你想计算BIC,公式很简单。您甚至可以参考statsmodels
中的代码:
def bic(self):
"""Bayesian information criterion"""
if self.reml:
return np.nan
if self.freepat is not None:
df = self.freepat.get_packed(use_sqrt=False, has_fe=True).sum() + 1
else:
df = self.params.size + 1
return -2 * self.llf + np.log(self.nobs) * df
这应该可以回答你的问题:
self.reml
(REstricted Maximum Likelihood)被设置为true -这就是为什么你为BIC获得nan
的原因。- 它告诉你,如何计算BIC
您可以看到BIC计算遵循标准的BIC公式。它取数据点/观测数乘以自由参数数/自由度(np.log(self.nobs) * df
)的对数,然后减去模型的对数似然乘以2 (-2 * self.llf
)。因此,您可以使用以下代码计算BIC:
-2 * mdf.llf + np.log(mdf.nobs) * (mdf.df_modelwc)
注意,这里我使用的是mdf.df_modelwc
,实际上,在这种情况下,返回的是mdf.params.size
。
但是要注意开头提到的事情(为了完整,这里是@StupidWolf提供的SE链接-混合效果模型应该如何比较和或验证?)