线性模型函数 lm() 错误:外部函数调用中的 NA/NaN/Inf (arg 1)

Posted

技术标签:

【中文标题】线性模型函数 lm() 错误:外部函数调用中的 NA/NaN/Inf (arg 1)【英文标题】:Linear model function lm() error: NA/NaN/Inf in foreign function call (arg 1) 【发布时间】:2012-01-14 23:47:56 【问题描述】:

假设我有 data.frame a

我用

m.fit <- lm(col2 ~ col3 * col4, na.action = na.exclude)

col2 有一些 NA 值,col3col4 的值小于 1。

我一直在努力

Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
NA/NaN/Inf in foreign function call (arg 1)

我检查了邮件列表,似乎是因为col2 中的NAs,但我尝试使用na.action=na.exclude/omit/pass,但它们似乎都不起作用。我在前 10 个条目上再次测试了lm,绝对不是因为NAs。这个警告的问题是每个谷歌结果似乎都指向NA

是我误解了错误还是我错误地使用了lm

数据位于kaggle。我正在使用线性回归对 MonthlyIncome 数据进行建模(因为我无法让某个 glm 家庭工作)。我已经创建了自己的变量以供使用,但如果您尝试使用已经存在的变量对 MonthlyIncome 进行建模,则会失败。

【问题讨论】:

m.fit&lt;-lm(col2 ~ col3 + col4 + col3*col4, data=a, na.action=na.exclude) 在指定模型时更具可读性 如果没有可重现的示例,很难回答您的问题。请参阅***.com/q/5963269/567015 了解如何执行此操作的说明。 如果您将a 子集化为col2 中没有NA 的行,然后运行lm(),您还会收到错误吗? 不管怎样,~ col3*col4 等价于 ~ col3+col4+col3:col4,而~ col3+col4+col3*col4 又等价于~ col3+col4+col3*col4(最后一个是无害的冗余) 您在lm 中使用了哪些列?如果你在文件的标题行中使用名称,它比col2等更清晰。我尝试了几个列组合,无法重现你的错误。 【参考方案1】:

尝试更改 col2 的类型(以及所有其他变量)

col2 <- as.integer(col2)

【讨论】:

【参考方案2】:

我知道这个帖子很老了,但答案似乎并不完整,我也遇到了同样的问题。

我遇到的问题是因为 NA 列也有 NaN 和 Inf。删除这些并重试。具体来说:

col2[which(is.nan(col2))] = NA
col2[which(col2==Inf)] = NA

希望对您 18 个月大的问题有所帮助!

【讨论】:

感谢您的建议。添加它以防万一您有一些 -Inf,请确保也制作这些 NA。这解决了我的问题。 单行:col2[which(!is.finite(col2))] = NA 正如我所说的问题的根源是:log(0) = -Inf。在这种情况下,零日志无法绘制。如果您考虑您的方法,您将有效地替换数据值并省略那些行,正如我对 NA 所理解的那样。如果是这样,我猜你最终没有错误,但可能不是相同的箱形图?【参考方案3】:

我刚刚遇到了同样的问题。使用

获取有限元
finiteElements = which(is.finite(col3*col4))
finiteData = data[finiteElements,]
lm(col2~col3*col4,na.action=na.exclude,data=finiteData)

【讨论】:

【参考方案4】:

您应该阅读A Beginner’s Guide to R 这本书以获得完整的解释。具体来说,它提到了以下错误:

lm.fit 中的错误(x, y, offset = offset, single.ok = single.ok,...):外部函数调用中的 NA/NaN/Inf (arg 4)

解决方案是在强度数据中添加一个小的常数值,例如 1。请注意,统计界一直在讨论添加一个小值。尽管如此,在 R 中进行计算时,您不能使用零的对数。

【讨论】:

【参考方案5】:

我通过重置选项解决了此类问题。 options(na.action="na.exclude") 要么 options(na.action="na.omit")

我检查了我的设置,之前已将选项更改为 “na.pass”并没有放弃我对 NA 的 y 观察结果(y~x)。

【讨论】:

【参考方案6】:

我只是遇到了另一种可能性,毕竟可能有na.omitna.exclude 检查。

我正在服用类似的东西:

lm(log(x) ~ log(y), data = ...)

没有注意到,对于我的数据集中的某些值,x 或 y 可能为零: log(0) = -Inf

所以还有一点需要注意!

【讨论】:

【参考方案7】:

当我的 col2 等效项是 integer64 而不是整数时,并且在使用自然和多项式样条曲线时,例如 splines::bs 和 splines:ns,我遇到了这个错误:

m.fit <- lm(col1 ~ ns(col2))
m.fit <- lm(col1 ~ bs(col2, degree = 3))

转换为标准整数对我有用:

m.fit <- lm(col1 ~ ns(as.integer(col2)))
m.fit <- lm(col1 ~ bs(as.integer(col2), degree = 3))

【讨论】:

【参考方案8】:

当我在调用reformulate 时反转参数并在我的lm 调用中使用公式而不检查时遇到此错误,因此我有错误的预测变量和响应变量。

【讨论】:

【参考方案9】:

要注意的另一件事是使用 log() 或 sin() 之类的函数使您的 x 和 y 成为 inf。例如。 log 0 = 0 或 sin(pi) = 0。

【讨论】:

【参考方案10】:

确保因变量中没有任何 0。

【讨论】:

欢迎来到 Stack Overflow!您的帖子没有提供问题的答案。一旦你有足够的声誉,你就可以comment on any post。相反,provide answers that don't require clarification from the asker.

以上是关于线性模型函数 lm() 错误:外部函数调用中的 NA/NaN/Inf (arg 1)的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用lm函数拟合回归模型(简单线性回归一元回归simple regression)并解读拟合模型

如何在自己的函数中使用lm中的变量?

R语言使用lmPerm包应用于线性模型的置换方法(置换检验permutation tests)使用lm模型构建多元线性回归模型使用lmp函数生成置换检验多元线性回归模型

R语言使用lm函数拟合多元线性回归模型假定预测变量没有交互作用(Multiple linear regression)

R语言使用lmPerm包应用于线性模型的置换方法(置换检验permutation tests)使用lm模型构建简单线性回归模型使用lmp函数生成置换检验回归分析模型

R语言使用lm函数拟合多元线性回归模型假定预测变量之间有交互作用R语言使用effects包的effect函数查看交互作用对于回归模型预测响应变量的影响