Ошибка функции lm () линейной модели: NA / NaN / Inf в вызове внешней функции (аргумент 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 записях, определенно не из-за NAs. Проблема с этим предупреждением в том, что все результаты Google, похоже, указывают на NA.

Я неправильно истолковал ошибку или неправильно использую lm?

Данные находятся на kaggle. Я моделирую данные MonthlyIncome с помощью линейной регрессии (так как я не мог заставить работать определенное glm семейство). Я создал свои собственные переменные для использования, но если вы попытаетесь смоделировать MonthlyIncome с уже имеющимися переменными, это не удастся.


person Pk.yd    schedule 07.12.2011    source источник
comment
m.fit<-lm(col2 ~ col3 + col4 + col3*col4, data=a, na.action=na.exclude) гораздо более удобочитаем для определения вашей модели   -  person mindless.panda    schedule 07.12.2011
comment
Без воспроизводимого примера очень сложно ответить на ваш вопрос. См. Инструкции, как это сделать, в stackoverflow.com/q/5963269/567015.   -  person Sacha Epskamp    schedule 07.12.2011
comment
Если вы подмножество a для строк без NA в col2, а затем запустите lm(), вы все равно получите ошибку?   -  person mindless.panda    schedule 07.12.2011
comment
Как бы то ни было, ~ col3*col4 эквивалентно ~ col3+col4+col3:col4, что, в свою очередь, эквивалентно ~ col3+col4+col3*col4 (последнее безвредно избыточно)   -  person Ben Bolker    schedule 07.12.2011
comment
Спасибо, Бен, ты прав, я неправильно прочитал точку в своих записях.   -  person Pk.yd    schedule 07.12.2011
comment
Нет особого смысла размещать ссылку на файл данных за экраном входа в систему. А пока попробуйте нанести данные на график, чтобы увидеть, выглядят ли они хоть немного линейно.   -  person Carl Witthoft    schedule 07.12.2011
comment
О боже, я знал, что это случится: S. Но да, меньшая часть данных работает нормально, проблема в том, когда вы используете все наблюдения. И линейная регрессия довольно логична, учитывая данные, но определенно не то, что я хотел бы использовать, если бы у меня был лучший контроль над R.   -  person Pk.yd    schedule 07.12.2011
comment
@ Pk.yd: получите Dropbox и используйте там общедоступные ссылки (www.dropbox.com). Это по-прежнему самое чистое решение для обмена данными, о котором я знаю.   -  person Joris Meys    schedule 07.12.2011
comment
Я подписался на Kaggle и не могу повторить. a <- read.csv("~/Downloads/cs-training.csv"); names(a)[2:4] <- paste("col",2:4,sep=""); m.fit <-lm(col2~col3*col4,data=a) у меня работал нормально.   -  person Ben Bolker    schedule 07.12.2011
comment
Какие столбцы вы используете для lm подгонки? Если вы используете имена в строке заголовка в файле, это яснее, чем col2 и т. Д. Я пробовал несколько комбинаций столбцов и не могу воспроизвести вашу ошибку.   -  person Richie Cotton    schedule 07.12.2011
comment
Так делает a <- read.csv("~/Downloads/cs-training.csv"); m.fit <-lm(MonthlyIncome~age*DebtRatio*SeriousDlqin2yrs,data=a,na.action=na.exclude)   -  person Ben Bolker    schedule 07.12.2011
comment
Ура, извините всех Кажется, проблема заключалась в значениях Inf в моем настраиваемом столбце, который я исправил после хорошего ночного сна ... Еще раз очень-очень жаль, что потратил время.   -  person Pk.yd    schedule 08.12.2011


Ответы (10)


Я знаю, что эта ветка действительно старая, но ответы не кажутся полными, и я столкнулся с той же проблемой.

Проблема, с которой я столкнулся, заключалась в том, что столбцы NA также имели NaN и Inf. Удалите их и попробуйте снова. Конкретно:

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

Надеюсь, что это поможет в вашем вопросе 18-месячной давности!

person slammaster    schedule 04.09.2013
comment
Спасибо за это предложение. Добавьте это на случай, если у вас есть -Inf, обязательно сделайте и эти NA. Это решило мою проблему. - person bsg; 25.05.2014
comment
Для однострочника: col2[which(!is.finite(col2))] = NA - person Hugh; 26.05.2014
comment
Как я уже сказал, корень проблемы: log (0) = -Inf. Журнал нуля в таком случае не строится. Если вы рассматриваете свой подход, вы эффективно заменяете значения данных и опускаете эти строки, как я понимаю с помощью NA. Если это так, я думаю, у вас не будет ошибок, но, скорее всего, это будет не та же коробчатая диаграмма? - person algarecu; 30.11.2017

Прочтите книгу Руководство для начинающих по R для полного объяснения этого. В частности, упоминается следующая ошибка:

Ошибка в lm.fit (x, y, offset = offset, singular.ok = singular.ok, ...): NA / NaN / Inf в вызове внешней функции (аргумент 4)

Решение состоит в том, чтобы добавить небольшое постоянное значение к данным об интенсивности, например 1. Обратите внимание, что в статистическом сообществе идет постоянная дискуссия о добавлении небольшого значения. Как бы то ни было, вы не можете использовать журнал нуля при выполнении вычислений в R.

person algarecu    schedule 23.07.2015

Я просто потерпел еще одну возможность после всех возможных проверок na.omit и na.exclude.

Я принимал что-то вроде:

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

Не замечая этого, для некоторых значений в моем наборе данных x или y могут быть равны нулю: log(0) = -Inf

Так что еще одно, чего нужно остерегаться!

person arredond    schedule 21.09.2017

Я решил эту проблему, сбросив настройки. options(na.action="na.exclude") или options(na.action="na.omit")

Я проверил свои настройки и ранее изменил параметр на «na.pass», что не сбрасывает мои наблюдения y с помощью NA (где y~x).

person Andrew    schedule 29.08.2017

Попробуйте изменить тип col2 (и все другие переменные)

col2 <- as.integer(col2)
person user2475878    schedule 11.06.2013

Я столкнулся с той же проблемой. получить конечные элементы, используя

finiteElements = which(is.finite(col3*col4))
finiteData = data[finiteElements,]
lm(col2~col3*col4,na.action=na.exclude,data=finiteData)
person d2a2d    schedule 26.05.2014

Я столкнулся с этой ошибкой, когда мой эквивалент col2 был целым числом64, а не целым числом, и при использовании естественных и полиномиальных сплайнов, 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))
person Scott Kaiser    schedule 09.01.2018

Я получил эту ошибку, когда инвертировал аргументы при вызове reformulate и использовал формулу в моем вызове lm без проверки, поэтому у меня был неправильный предиктор и переменная ответа.

person Moody_Mudskipper    schedule 31.08.2018

Еще одна вещь, на которую следует обратить внимание, - это использовать такие функции, как log () или sin (), чтобы ваши x и y были inf. например. log 0 = 0 или sin (pi) = 0.

person Mihir Gada    schedule 14.02.2019

Убедитесь, что в вашей зависимой переменной нет 0.

person Adrian Cadena    schedule 15.04.2019
comment
Добро пожаловать в Stack Overflow! Ваш пост не дает ответа на вопрос. Когда у вас будет достаточная репутация, вы сможете комментировать любое сообщение. Вместо этого предоставьте ответы которые не требуют пояснений от автора вопроса. - person Joey; 15.04.2019