MixedLMResults 对象 return NaN BIC。可能是什么原因?

MixedLMResults object return NaN BIC. What can be the reason?

这是我的代码:

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 returns 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(受限最大似然)设置为 true - 这就是为什么 BIC 得到 nan 的原因。
  • 它告诉你,如何计算 BIC

您可以看到 BIC 计算遵循标准 BIC 公式。它取数据数量 points/observations 乘以自由数量 parameters/degree (np.log(self.nobs) * df) 的对数,然后减去模型的对数似然乘以 2 (-2 * self.llf)。因此,您可以使用如下代码计算 BIC:

-2 * mdf.llf + np.log(mdf.nobs) * (mdf.df_modelwc)

请注意,我在这里使用了 mdf.df_modelwc,实际上,在这种情况下,returns mdf.params.size

但要注意开头提到的事情(为了完整起见,这里是@StupidWolf 提供给 SE 的 link - How should mixed effects models be compared and or validated?.