我正在尝试在R中使用randomForest包,但是我遇到了一个问题,其中R告诉我响应向量中缺少数据。
> rf_blackcomb_earlyGame <- randomForest(max_cohort ~ ., data=blackcomb_earlyGame[-c(1,2), ])
Error in na.fail.default(list(max_cohort = c(47, 25, 20, 37, 1, 0, 23, :
missing values in object
指定的错误足够清楚。我之前和之前都遇到过它实际上已经丢失了数据,但这次没有任何数据丢失。
> class(blackcomb_earlyGame$max_cohort)
[1] "numeric"
> which(is.na(blackcomb_earlyGame$max_cohort))
integer(0)
我已尝试使用na.roughfix查看是否有帮助,但我收到以下错误。
Error in na.roughfix.data.frame(list(max_cohort = c(47, 25, 20, 37, 1, :
na.roughfix only works for numeric or factor
我已经检查了每个向量,以确保它们都不包含任何NA,并且没有一个向量。
有人有任何建议吗?
答案 0 :(得分:4)
randomForest
可能会失败。缺少值(NA
),NaN
,Inf
或-Inf
的值以及未投入因子的字符类型都会失败,并会显示各种错误消息
我们可以在下面看到由这些问题产生的错误消息的一些示例:
my.df <- data.frame(a = 1:26, b=letters, c=(1:26)+rnorm(26))
rf <- randomForest(a ~ ., data=my.df)
# this works without issues, because b=letters is cast into a factor variable by default
my.df$d <- LETTERS # Now we add a character column
rf <- randomForest(a ~ ., data=my.df)
# Error in randomForest.default(m, y, ...) :
# NA/NaN/Inf in foreign function call (arg 1)
# In addition: Warning message:
# In data.matrix(x) : NAs introduced by coercion
rf <- randomForest(d ~ ., data=my.df)
# Error in y - ymean : non-numeric argument to binary operator
# In addition: Warning message:
# In mean.default(y) : argument is not numeric or logical: returning NA
my.df$d <- c(NA, rnorm(25))
rf <- randomForest(a ~ ., data=my.df)
rf <- randomForest(d ~ ., data=my.df)
# Error in na.fail.default(list(a = 1:26, b = 1:26, c = c(3.14586293058335, :
# missing values in object
my.df$d <- c(Inf, rnorm(25))
rf <- randomForest(a ~ ., data=my.df)
rf <- randomForest(d ~ ., data=my.df)
# Error in randomForest.default(m, y, ...) :
# NA/NaN/Inf in foreign function call (arg 1)
有趣的是,您收到的错误消息是由于数据框中包含character
类型而导致的错误消息(请参阅comments),这是我在看到有{的数字列时看到的错误{1}}。这表明,不同版本的NA
或(2)中的错误可能存在(1)差异,即错误消息以更复杂的方式依赖于数据结构。无论哪种方式,对于接收上述错误的任何人的建议是查找上面列出的数据的所有可能问题,以便找出原因。
答案 1 :(得分:2)
可能有Inf
或-Inf
值?
is.na(c(1, NA, Inf, NaN, -Inf))
#[1] FALSE TRUE FALSE TRUE FALSE
is.finite(c(1, NA, Inf, NaN, -Inf))
#[1] TRUE FALSE FALSE FALSE FALSE