R代码出现‘NA/NaN/Inf in y’错误的排查求助
解决lm模型报错:NA/NaN/Inf in 'y'
我来帮你排查这个问题!你遇到的错误根源其实很容易被忽略——你单独修改了一个brozek向量,但你的线性模型根本没用到这个修改后的向量。
让我拆解一下问题:
- 你执行了
brozek <- brozek[ brozek != 0 ],这个操作确实过滤掉了0值,但这个brozek是一个独立的向量,和fat数据框没有任何关联。 - 当你运行
lm(log(brozek) ~ ..., data=fat)时,lm会从fat数据框中读取brozek列,而不是你刚才修改的那个全局向量。也就是说,原数据框里的brozek列仍然包含0值,当计算log(brozek)时,0的对数是-Inf,这就触发了NA/NaN/Inf in 'y'的错误。
你可以先验证一下原数据框的情况,运行:
table(fat$brozek == 0)
肯定会看到有若干个0值,这就是问题的核心。
正确的解决方法
你需要直接对fat数据框进行过滤,让模型使用过滤后的完整数据集,有两种简单的方式:
方法一:先过滤数据框再建模
library(rafalib) library(downloader) library(dplyr) library(faraway) # 过滤掉brozek为0的行,得到新的数据集 fat_filtered <- fat %>% filter(brozek > 0) # 用过滤后的数据集建模 model <- lm(log(brozek) ~ age + weight + height + neck + chest + abdom + hip + thigh + knee + ankle + biceps + forearm + wrist, data = fat_filtered) summary(model)
方法二:在lm中直接使用subset参数过滤
library(rafalib) library(downloader) library(dplyr) library(faraway) # 直接在lm里指定subset参数,只使用brozek>0的行 model <- lm(log(brozek) ~ age + weight + height + neck + chest + abdom + hip + thigh + knee + ankle + biceps + forearm + wrist, data = fat, subset = brozek > 0) summary(model)
这两种方法都能确保模型使用的是没有0值的brozek列,避免log()产生无穷值,也就不会再出现那个错误了。
内容的提问来源于stack exchange,提问作者air_nomad
相关产品推荐
相关产品推荐

