statsmodels.api Logit 给出 LinAlgError
statsmodels.api Logit giving LinAlgError
我正在尝试对我的数据进行 Logit 回归,但我 运行 遇到了一个问题,每当我尝试拟合它时,我都会收到错误消息:
LinAlgError: Singular matrix
我不明白为什么会这样。我的数据框不全是 zeroes/ones,但它只包含一小部分 1。这是示例:
formula = 'wage ~ I( (33 > age) & (age >= 65) ) + I( (50 > age) & (age >= 33) ) + I( (65 > age) & (age >= 50) )'
test = [0 for i in range(3000)]
test[256] = 1
df['wage'] = test
ft = smf.logit(formula=formula, data=df).fit(disp=0)
我该如何摆脱它? 1s比例小的模型是不可能拟合不出来的。
你指定交互变量结果的方式真的很奇怪:
I( (33 > age) & (age >= 65) )
:这将全为零,年龄不能小于 33 岁且年龄不能大于 65 岁,所以你不适合这个。
如果您将上面的设置设为 I( (33 > age) | (age >= 65) )
,您的模型矩阵仍将排名不足(即过度确定),因为您的所有三个预测变量都是截距的线性组合。
如果你没有截距,它可能会起作用,这取决于你有多少正 classes。
有known issues with logistic regression on imbalanced data个。在您的情况下,拦截或 class 全零作为响应将是有问题的。
如果您的目标是找出哪个 class 与年龄组有正相关关系,请考虑使用 fisher.test
如果目的是预测..我认为没有办法解决不平衡的数据。
我正在尝试对我的数据进行 Logit 回归,但我 运行 遇到了一个问题,每当我尝试拟合它时,我都会收到错误消息:
LinAlgError: Singular matrix
我不明白为什么会这样。我的数据框不全是 zeroes/ones,但它只包含一小部分 1。这是示例:
formula = 'wage ~ I( (33 > age) & (age >= 65) ) + I( (50 > age) & (age >= 33) ) + I( (65 > age) & (age >= 50) )'
test = [0 for i in range(3000)]
test[256] = 1
df['wage'] = test
ft = smf.logit(formula=formula, data=df).fit(disp=0)
我该如何摆脱它? 1s比例小的模型是不可能拟合不出来的。
你指定交互变量结果的方式真的很奇怪:
I( (33 > age) & (age >= 65) )
:这将全为零,年龄不能小于 33 岁且年龄不能大于 65 岁,所以你不适合这个。如果您将上面的设置设为
I( (33 > age) | (age >= 65) )
,您的模型矩阵仍将排名不足(即过度确定),因为您的所有三个预测变量都是截距的线性组合。如果你没有截距,它可能会起作用,这取决于你有多少正 classes。
有known issues with logistic regression on imbalanced data个。在您的情况下,拦截或 class 全零作为响应将是有问题的。
如果您的目标是找出哪个 class 与年龄组有正相关关系,请考虑使用 fisher.test
如果目的是预测..我认为没有办法解决不平衡的数据。