逻辑回归中对连续变量执行log()变换时出现NA/NaN/Inf错误求助
解决逻辑回归log变换引发的NA/NaN/Inf错误
错误原因很明确:你对变量做log变换时,部分变量存在0值或负数——log(0)会生成-Inf,log负数会得到NaN,这些无效值导致glm.fit无法正常运行。
排查问题变量
先定位到底哪个变量出问题,运行以下代码检查目标变量的取值:
# 检查每个待log变换变量的最小值 sapply(data_model[c("LIQUDYRX", "ETRANPTP", "FINCBTXM", "MRPINSPQ", "MRTINTPQ", "EDUC_REF", "EOWNDWLP", "AGE_REF")], min) # 直接判断变量是否包含0或负数 sapply(data_model[c("LIQUDYRX", "ETRANPTP", "FINCBTXM", "MRPINSPQ", "MRTINTPQ", "EDUC_REF", "EOWNDWLP", "AGE_REF")], function(x) any(x <= 0))
解决方法
针对存在0值的变量,用以下两种方式处理:
- log(x + 1)变换:这是最常用的处理非负变量含0的方法,log(0+1)=0,不会生成无效值,对变量尺度的影响也可控。
- log(x + 极小值):如果变量值很大,x+1会明显改变变量尺度,可以用
log(x + 1e-5)这类极小值代替1,尽量保留原变量的分布特征。
如果变量存在负数,需要先根据业务逻辑处理(比如取绝对值、重新编码为0,或剔除异常值),因为log变换本身不支持负数。
修改后的代码示例
regTRANSFORM <- glm(DEFBENRP~BLS_URBN+log(LIQUDYRX + 1)+log(ETRANPTP + 1)+log(FINCBTXM + 1)+log(MRPINSPQ + 1)+log(MRTINTPQ + 1)+OTHLOAN+log(EDUC_REF + 1)+log(EOWNDWLP + 1)+log(AGE_REF + 1), data = data_model, family = "binomial")
另外,也可以在glm中添加na.action = na.omit临时跳过缺失值,但建议先单独处理缺失数据,避免丢失样本。
内容的提问来源于stack exchange,提问作者stupidperson
相关产品推荐
相关产品推荐

