线性模型函数 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
值,col3
和 col4
的值小于 1。
我一直在努力
Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
NA/NaN/Inf in foreign function call (arg 1)
我检查了邮件列表,似乎是因为col2
中的NA
s,但我尝试使用na.action=na.exclude/omit/pass
,但它们似乎都不起作用。我在前 10 个条目上再次测试了lm
,绝对不是因为NA
s。这个警告的问题是每个谷歌结果似乎都指向NA
。
是我误解了错误还是我错误地使用了lm
?
数据位于kaggle。我正在使用线性回归对 MonthlyIncome 数据进行建模(因为我无法让某个 glm
家庭工作)。我已经创建了自己的变量以供使用,但如果您尝试使用已经存在的变量对 MonthlyIncome 进行建模,则会失败。
【问题讨论】:
m.fit<-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.omit
和na.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)并解读拟合模型
R语言使用lmPerm包应用于线性模型的置换方法(置换检验permutation tests)使用lm模型构建多元线性回归模型使用lmp函数生成置换检验多元线性回归模型
R语言使用lm函数拟合多元线性回归模型假定预测变量没有交互作用(Multiple linear regression)
R语言使用lmPerm包应用于线性模型的置换方法(置换检验permutation tests)使用lm模型构建简单线性回归模型使用lmp函数生成置换检验回归分析模型
R语言使用lm函数拟合多元线性回归模型假定预测变量之间有交互作用R语言使用effects包的effect函数查看交互作用对于回归模型预测响应变量的影响