R执行logistic回归出现不明缺失值删除及极端P值异常问题
逻辑回归异常问题排查与解答
问题背景
本次分析基于370行的医学数据集开展二分类logistic回归,研究目标为探究各检查指标与肝硬化结局的关联:
- 因变量为
fibrosis.score,二分类因子变量,0代表无肝硬化,1代表存在肝硬化 - 自变量均为2~4水平的因子变量,包含CT、MR、US扫描结果,腹水、黄疸、静脉曲张出血等临床症状指标
初始异常表现
执行回归代码:
model0 <- glm(Fibrosis.score ~ Fibroscan + CT + MR + UL + ascites + ikterus + varicebloedning, family = binomial, data=d3)
出现两类异常:
- 收到警告:
glm.fit: fitted probabilities numerically 0 or 1 occurred summary(model0)输出显示124条观测因缺失被删除,但已确认纳入回归的自变量无缺失;绝大多数自变量P值接近0.99,和预期显著性表现不符。
核心疑问解答
1. glm函数是否会删除整行存在缺失的观测,即使缺失值出现在未纳入回归的列?
glm默认的缺失值处理规则为仅检查回归公式中涉及的所有变量(包括因变量和全部自变量),仅当某行在公式覆盖的任意变量上存在缺失时,才会被整行删除,未纳入回归公式的列的缺失值不会触发行删除。
2. 极端P值是否和参照水平设置有关?
接近1的极端P值通常和参照水平设置无关,更可能由两类问题导致:
- 完全/准完全分离:即某自变量的某一水平下,因变量的取值完全一致(比如CT提示肝硬化的分类下所有患者的因变量均为1),此时会出现你收到的拟合概率为0或1的警告,回归系数估计会异常偏大、标准误极高,最终P值接近1
- 共线性问题:如果自变量之间存在高度甚至完全共线性,也会导致系数估计不稳定,出现极端P值
3. 如何解决124条观测被意外删除的问题,是否需要单独提取回归用到的变量构建新数据集?
无需单独构建新数据集,按以下步骤排查即可:
- 优先检查回归公式覆盖的所有变量(不要仅检查自变量)的缺失情况,可执行以下代码统计缺失数:
# 替换错误的all.variables为正确的函数名all.vars vars_used <- all.vars(Fibrosis.score ~ Fibroscan + CT + MR + UL + ascites + ikterus + varicebloedning) apply(d3[,vars_used], 2, function(x) sum(is.na(x)))
- 若确认上述变量无官方NA编码,需排查是否存在非标准缺失值编码(比如用-99、空白字符串、特殊符号代替NA的情况)
附带报错说明
你运行代码时出现的could not find function "all.variables"报错是函数名拼写错误导致,R中提取公式涉及变量的正确函数名为all.vars。
最终问题根因
最终排查确认:因变量fibrosis.score存在124个缺失值,因此触发了glm的行删除规则,处理因变量缺失问题后回归结果恢复正常。
内容的提问来源于stack exchange,提问作者le2001
相关产品推荐
相关产品推荐

