Here is my code:
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 as output. What can be the reason? If it is package related problem. Could anyone provide manual calculation of BIC for this case?
Check the comment below your question from @StupidWolf, I think it’s correct that BIC is not provided for LM models. Even when you print
mdf.summary(), you will find neither BIC nor AIC in the output.
But if you want to calculate BIC, the formula is quite simple. You can even refer to the code in
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
This should answer your question:
self.reml(REstricted Maximum Likelihood) is set to true – that’s the reason why are you getting
- it shows you, how to calculate BIC
You can see that BIC calculation follow a standard BIC formula. It takes logarithms of number of data points/observations multiplied by number of free parameters/degree of freedom (
np.log(self.nobs) * df) and subtract Log-likelihood of model times 2 (
-2 * self.llf). So, you could calculate BIC with your code as follows:
-2 * mdf.llf + np.log(mdf.nobs) * (mdf.df_modelwc)
Note, that here I used
mdf.df_modelwc which in fact, in this case, returns
But beware of the things mentioned in the beginning (for completeness, here is the link to SE provided by @StupidWolf – How should mixed effects models be compared and or validated?.