Подтвердить что ты не робот

R есть способ найти значения Inf/-Inf?

Я пытаюсь запустить 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's?

4b9b3361

Ответ 1

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

Обязательно внимательно прочитайте справку 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.

Ответ 2

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

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

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

RF <- randomForest(prePrior1[m:n],ntree=2,...)

Ответ 3

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

Ответ 4

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

> with(df, df == Inf)
        foo   bar   baz   abc ...
[1,]  FALSE FALSE  TRUE FALSE ...
[2,]  FALSE  TRUE FALSE FALSE ...
...

Ответ 5

Ответ joran - это то, что вы хотите и информативное. Для более подробной информации о 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