You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:37:37