Firth惩罚逻辑回归出现无穷大卡方值的技术咨询
解答你的Firth惩罚逻辑回归相关问题
嘿,让我一步步帮你理清这些问题:
1. R中运行Firth惩罚逻辑回归的明显错误
你代码里藏了个关键的小失误:firth=FALSE!logistf()函数默认是通过firth=TRUE来启用Firth惩罚逻辑回归的,你把这个参数设成FALSE的话,相当于直接跑了普通的逻辑回归,完全没用到你想要的Firth方法来解决准完全分离问题。这绝对是最需要先修正的点,把参数改成firth=TRUE再重新运行模型试试。
2. 无穷大卡方值是否合理?
这种无穷大的卡方值其实是普通逻辑回归遇到准完全分离时的典型“错误信号”——当存在某个自变量组合,对应的因变量全为0或全为1时,极大似然估计会直接发散,导致卡方统计量变成无穷大。你说交叉制表没发现零类别,但别忘了你用了weights = weight,加权后的有效单元格计数可能出现了“实际为零”的情况;或者是多个自变量组合起来才出现了分离,单变量的交叉制表根本查不出来。所以这个无穷大卡方值是“符合错误场景的表现”,但显然不是合理的分析结果,这也正是你需要启用Firth惩罚的核心原因。
3. 除交叉制表外,检测准完全分离的方法
这里有几个R里实用的方法,帮你定位分离的来源:
- 用
detectseparation包的detectSeparation()函数:这个工具就是专门用来检测逻辑回归中的分离问题的,它会直接告诉你是哪些自变量组合导致了分离,用法很直观:library(detectseparation) detectSeparation(restaurant_spender ~ alc_spender + income_quintiles + eduation_hh, data = alcohol, weights = weight, family = binomial()) - 查看普通逻辑回归的拟合细节:先跑一遍普通的
glm()逻辑回归,看系数的标准误——如果某个系数的标准误大得离谱(比如几千、几万),那这个变量大概率参与了分离;另外,summary()输出里如果出现“fitted probabilities numerically 0 or 1 occurred”的警告,也直接提示存在分离问题。 - 多变量组合分组检查:把多个自变量交叉分组(比如
income_quintiles+eduation_hh+alc_spender),然后计算每个组里restaurant_spender的加权平均取值,如果有组的平均值是0或1,那这个组就是分离的来源。
最后补充一句:你的样本量超大(20万+),Firth惩罚在大样本下依然能很好地发挥作用,修正参数后再看结果,卡方值和系数应该都会恢复正常啦。
内容的提问来源于stack exchange,提问作者Isobel M




