【问题标题】:Linear model function lm() error: NA/NaN/Inf in foreign function call (arg 1)线性模型函数 lm() 错误:外部函数调用中的 NA/NaN/Inf (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) 在指定模型时更具可读性
  • 如果没有可重现的示例,很难回答您的问题。请参阅stackoverflow.com/q/5963269/567015 了解如何执行此操作的说明。
  • 如果您将a 子集化为col2 中没有NA 的行,然后运行lm(),您还会收到错误吗?
  • 不管怎样,~ col3*col4 等价于 ~ col3+col4+col3:col4,而~ col3+col4+col3*col4 又等价于~ col3+col4+col3*col4(最后一个是无害的冗余)
  • 您在lm 中使用了哪些列?如果你在文件的标题行中使用名称,它比col2等更清晰。我尝试了几个列组合,无法重现你的错误。

标签: r nan lm kaggle


【解决方案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。

                  【讨论】:

                  猜你喜欢
                  • 2012-09-05
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-07-27
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多