R есть ли способ найти значения Inf / -Inf? - PullRequest
12 голосов
/ 31 декабря 2011

Я пытаюсь запустить randomForest для набора данных большого размера (5000x300).К сожалению, я получаю сообщение об ошибке следующим образом:

> RF <- randomForest(prePrior1, postPrior1[,6]
+                    ,,do.trace=TRUE,importance=TRUE,ntree=100,,forest=TRUE)
Error in randomForest.default(prePrior1, postPrior1[, 6], , do.trace = TRUE,  : 
  NA/NaN/Inf in foreign function call (arg 1)

Поэтому я пытаюсь найти любое NA, использующее:

> df2 <- prePrior1[is.na(prePrior1)]
> df2 
character(0)
> df2 <- postPrior1[is.na(postPrior1[,6])]
> df2 
numeric(0)

, что заставляет меня поверить, что проблема заключается в Inf.поскольку там, кажется, нет никаких NA.

Любые предложения о том, как искоренить Inf?

Ответы [ 5 ]

22 голосов
/ 31 декабря 2011

Возможно, вы ищете is.finite, хотя я не уверен на 100%, что проблема заключается в значениях Inf во ваших входных данных.

Обязательно внимательно прочитайте справку для is.finite, в которойкомбинации отсутствуют, бесконечны и т. д.В частности, это:

> is.finite(c(1,NA,-Inf,NaN))
[1]  TRUE FALSE FALSE FALSE
> is.infinite(c(1,NA,-Inf,NaN))
[1] FALSE FALSE  TRUE FALSE

Одна из этих вещей не похожа на другие.Не удивительно, что есть и функция is.nan.

10 голосов
/ 29 октября 2012

randomForest's 'NA / NaN / Inf при вызове сторонней функции' часто является ложным предупреждением и действительно раздражает:

  • вы получите это, если любая из переданных переменных будет символом
  • фактические значения NaN и Infs почти никогда не встречаются в чистых данных

Быстрый и грязный трюк, чтобы сузить дело, выполнить бинарный поиск в вашем списке переменных и использовать параметры токена, такие как ntree=2, чтобы получить мгновенный пропуск / неудачу для подмножества переменных:

RF <- randomForest(prePrior1[m:n],ntree=2,...)
4 голосов
/ 31 декабря 2011

По аналогии с is.na вы можете использовать is.infinite для поиска случаев бесконечности.

2 голосов
/ 31 декабря 2011

Взгляните на with, например ::100100

> with(df, df == Inf)
        foo   bar   baz   abc ...
[1,]  FALSE FALSE  TRUE FALSE ...
[2,]  FALSE  TRUE FALSE FALSE ...
...
1 голос
/ 26 ноября 2015

Джоран ответ, что вы хотите и информативно. Для получения более подробной информации о is.na() и is.infinite(), вы должны проверить https://stat.ethz.ch/R-manual/R-devel/library/Matrix/html/is.na-methods.html и кроме того, после того, как вы получите логический вектор, который говорит, является ли каждый элемент исходного вектора NA / Inf, вы можете использовать функцию which() для получения индексов, вот так:

> v1 <- c(1, Inf, 2, NaN, Inf, 3, NaN, Inf)
> is.infinite(v1)
[1] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE
> which(is.infinite(v1))
[1] 2 5 8
> is.na(v1)
[1] FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE
> which(is.na(v1))
[1] 4 7

документ для which() находится здесь https://stat.ethz.ch/R-manual/R-devel/library/base/html/any.html

...