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?
Ответы
Ответ 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