Ошибка функции lm() линейной модели: NA/NaN/Inf при вызове сторонней функции (arg 1)
Скажем, у меня есть 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)
Я проверил список рассылки, и кажется, что это из-за NA
в col2
но я попытался использовать na.action=na.exclude/omit/pass
но ни один из них, похоже, не работает. Я снова проверил lm
на первых 10 записях, определенно не из-за NA
. Проблема с этим предупреждением заключается в том, что все результаты Google указывают на NA
.
Я неправильно истолковал ошибку или неправильно использую lm
?
Данные в Kaggle. Я моделирую данные MonthlyIncome с использованием линейной регрессии (поскольку я не могу заставить glm
определенное семейство glm
). Я создал свои собственные переменные для использования, но если вы попытаетесь смоделировать MonthlyIncome с уже существующими переменными, это не удастся.
Ответы
Ответ 1
Я знаю, что эта ветка действительно старая, но ответы не кажутся полными, и я просто столкнулся с одной и той же проблемой.
Проблема, с которой я столкнулась, состояла в том, что в столбцах NA также были NaN и Inf. Удалите их и повторите попытку. В частности:
col2[which(is.nan(col2))] = NA
col2[which(col2==Inf)] = NA
Надеюсь, что поможет ваш 18-месячный вопрос!
Ответ 2
Вам следует прочитать книгу Руководство для начинающих по R для полного объяснения этого. В частности, в нем упоминается следующая ошибка:
Ошибка в lm.fit(x, y, offset = offset, singular.ok = unique.ok,...): NA/NaN/Inf в вызове внешней функции (arg 4)
Решение состоит в том, чтобы добавить небольшое значение константы к данным Интенсивности, например 1. Обратите внимание, что в статистическом сообществе продолжается обсуждение вопроса о добавлении небольшого значения. Как бы то ни было, вы не можете использовать журнал нуля при выполнении вычислений в R.
Ответ 3
Я просто перенес другую возможность, после всех возможных na.omit
и na.exclude
проверок.
Я принимал что-то вроде:
lm(log(x) ~ log(y), data = ...)
Не замечая, что для некоторых значений в моем наборе данных x или y могут быть равны нулю:
log(0) = -Inf
Итак, еще одна вещь, о которой нужно следить!
Ответ 4
Я решил эту проблему, сбросив настройки. options(na.action="na.exclude")
или options(na.action="na.omit")
Я проверил свои настройки и ранее изменил параметр "na.pass", который не сбрасывал мои y-наблюдения с NA (где y~x
).
Ответ 5
Попробуйте изменить тип col2 (и всех других переменных)
col2 <- as.integer(col2)
Ответ 6
Я столкнулся с той же проблемой. получить конечные элементы, используя
finiteElements = which(is.finite(col3*col4))
finiteData = data[finiteElements,]
lm(col2~col3*col4,na.action=na.exclude,data=finiteData)
Ответ 7
Я столкнулся с этой ошибкой, когда мой эквивалент col2 был целым числом64, а не целым числом, и при использовании естественных и полиномиальных сплайнов сплайны:: bs и сплайны: 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 в вашей зависимой переменной.