R中逻辑回归向后逐步选择仅得到截距模型的原因是什么
核心原因:你把向后逐步回归的起始模型传错了
向后逐步回归的运行逻辑是从包含全部候选变量的全模型出发,每一步尝试移除1个变量,若移除后模型AIC降低就保留该操作,直到移除任何变量都无法让AIC下降为止,最终输出最优模型。
你代码里的错误非常直接:
- 你给
step()传入的起始模型是仅含截距的空模型intercept_only,同时指定方向为backward(仅允许删除变量、不允许添加变量) - 空模型里本身没有任何自变量可供删除,因此
step()不会执行任何筛选步骤,直接把你传入的起始截距模型作为结果返回,这和变量本身是否显著没有任何关系。
你贴出的逐步回归输出也能佐证这一点:整个过程只有1步,残差自由度461、残差Deviance596.1084完全就是截距模型本身的拟合结果,根本没有执行变量移除的操作。
修正方法
把起始模型替换为你之前拟合的全变量模型即可,正确的向后逐步回归代码如下:
# 拟合全变量逻辑回归 full_model <- glm(chd ~ ., data = CHD, family = binomial(link = logit)) # 从全模型启动向后逐步回归 back <- step( full_model, direction = "backward", trace = 1 # 设为1可以打印每一步的变量移除过程,方便排查 )
补充:如果你要做向前逐步回归,才需要以截距模型为起点,方向设为forward,scope上限设为全模型,不要把两种方法的起始参数搞混:
intercept_only <- glm(chd ~ 1, data=CHD, family = binomial(link = logit)) # 向前逐步回归的正确写法 forward <- step( intercept_only, direction = "forward", scope = formula(full_model), trace = 1 )
修正代码后仍得到仅截距模型的含义
如果你修正代码后重新运行,最终结果仍然只剩截距项,才是统计层面的真实筛选结果,含义为:
- 你纳入的所有自变量(sbp、tobacco、ldl、adiposity、typea、obesity、alcohol、age)在当前数据集上,都无法对CHD的患病风险提供统计上足够显著的解释增益,加入任何变量都无法让模型AIC低于仅截距模型
- 通俗来说,基于当前样本,你用这些变量建出来的模型,预测效果还不如直接用样本中CHD的整体患病率作为所有人的预测概率
- 出现这类结果常见的诱因包括:CHD阳性样本量太少导致检验效能不足、自变量和CHD的真实关联强度极低、自变量间存在严重多重共线性、样本存在较严重的选择偏倚等。
内容的提问来源于stack exchange,提问作者MaximeTars
相关产品推荐
相关产品推荐

