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?.
这是我的代码:
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?.