When building linear mixed models with Python’s statsmodules module, I repeatedly, and often incoherently, ran into np.linalg.LinAlgError
errors that are Singular matrix
errors.
There are a couple of things to check for with these errors:
First, drop any rows where there are NaN values for the predictors:
e.g. if your predictors are in a list called predictors, try this
df= df.dropna(subset=predictors)
Second, remove any columns whose sum is zero:
to_drop = list(df.loc[:,df.sum(axis=0) <1].columns)
df.drop(columns=to_drop)
Third, now that you have dropped columns, make sure they are still in your predictors. Something like
updated_predictors = list(set(predictors).intersection(set(df.columns)))
Finally, when all that doesn’t work, you should try different methods to fit the model. These are the methods I currently use, and I try them in this order and save the results for the first one that completes.
results = None
for meth in 'bfgs', 'lbfgs', 'cg', 'powell', 'nm':
try:
result = model.fit(method=meth)
print(f"Method {meth} PASSED", file=sys.stderr)
break
except np.linalg.LinAlgError as e:
print(f"Method {meth} failed", file=sys.stderr)
if results:
print(results.summary)