отсутствующее значение, где TRUE/FALSE необходимо с Caret

У меня есть фрейм данных, который содержит «переменную даты». (тестовые данные и код доступны здесь)

Однако я использую «function = caretFunc». Он показывает сообщение об ошибке.

    Error in { : task 1 failed - "missing value where TRUE/FALSE needed"
In addition: Warning messages:
1: In FUN(newX[, i], ...) : NAs introduced by coercion
2: In FUN(newX[, i], ...) : NAs introduced by coercion
3: In FUN(newX[, i], ...) : NAs introduced by coercion
4: In FUN(newX[, i], ...) : NAs introduced by coercion
5: In FUN(newX[, i], ...) : NAs introduced by coercion
6: In FUN(newX[, i], ...) : NAs introduced by coercion
7: In FUN(newX[, i], ...) : NAs introduced by coercion
8: In FUN(newX[, i], ...) : NAs introduced by coercion
9: In FUN(newX[, i], ...) : NAs introduced by coercion
10: In FUN(newX[, i], ...) : NAs introduced by coercion

Что я могу сделать?


Код для воспроизведения ошибки:

library(mlbench)
library(caret)
library(maps)
library(rgdal)
library(raster)
library(sp)
library(spdep)
library(GWmodel)
library(e1071)
library(plyr)
library(kernlab)
library(zoo)

mydata <- read.csv("Realestatedata_all_delete_date.csv", header=TRUE)
mydata$estate_TransDate <- as.Date(paste(mydata$estate_TransDate,1,sep="-"),format="%Y-%m-%d")
mydata$estate_HouseDate <- as.Date(mydata$estate_HouseDate,format="%Y-%m-%d")

rfectrl <- rfeControl(functions=caretFuncs, method="cv",number=10,verbose=TRUE,returnResamp = "final")
results <- rfe(mydata[,1:48],mydata[,49],sizes = c(1:48),rfeControl=rfectrl,method = "svmRadial")

print(results)
predictors(results)
plot(results, type=c("g", "o"))

person Chia-Hsien Lee    schedule 13.11.2015    source источник
comment
когда я исключаю столбцы 5 и 14 (estate_TransDate и estate_HouseDate), rfe занимает гораздо больше времени, а не возвращается относительно быстро с сообщением об ошибке. Если вы наберете warnings() после запуска кода, вы увидите множество In FUN(newX[, i], ...) : NAs introduced by coercion. Я предполагаю, что он пытается преобразовать объекты даты в числовое значение, которое затем создает NA. Вероятно, лучше «нормализовать» эти поля даты, например. заменив их количеством дней или лет с контрольной даты, т.е. 01.01.1973 для estate_TransDate и 01.01.1900 для estate_HouseDate или для обоих   -  person Andre Holzner    schedule 13.11.2015
comment
Пожалуйста, пришлите результаты sessionInfo()   -  person topepo    schedule 13.11.2015
comment
› sessionInfo() R версии 3.2.0 (16 апреля 2015 г.) Платформа: x86_64-w64-mingw32/x64 (64-разрядная версия) Работает под управлением: Windows 8 x64 (сборка 9200) языковой стандарт: [1] LC_COLLATE=китайский (традиционный )_Taiwan.950 LC_CTYPE=Китайский (традиционный)_Taiwan.950 [3] LC_MONETARY=Китайский (традиционный)_Taiwan.950 LC_NUMERIC=C [5] LC_TIME=Китайский (традиционный)_Taiwan.950 Прикрепленные базовые пакеты: [1] stats graphics grDevices использует базу методов наборов данных   -  person Chia-Hsien Lee    schedule 17.11.2015


Ответы (1)


У вас есть NAs (отсутствующие значения) в mydata в следующих входных переменных (которые вы передаете классификатору):

colnames(mydata)[unique(which(is.na(mydata[,1:48]), arr.ind = TRUE)[,2])]

дает:

 [1] "Aport_Distance"       "Univ_Distance"        "ParkR_Distance"
 [4] "TRA_StationDistance"  "THSR_StationDistance" "Schools_Distance"
 [7] "Lib_Distance"         "Sport_Distance"       "ParkS_Distance"
[10] "Hyper_Distance"       "Shop_Distance"        "Post_Distance"
[13] "Hosp_Distance"        "Gas_Distance"         "Incin_Distance"
[16] "Mort_Distance" 

Кроме того, похоже, что ваши переменные даты (дата транзакции и дата дома) преобразуются в NAs внутри rfe(..) .

Регрессор SVM, похоже, не может работать с NAs как есть.

Я бы преобразовал даты во что-то вроде «годы с момента ссылки»:

mydata$estate_TransAge <- as.numeric(as.Date("2015-11-01") - mydata$estate_TransDate) / 365.25
mydata$estate_HouseAge <- as.numeric(as.Date("2015-11-01") - mydata$estate_HouseDate) / 365.25

# define the set of input variables
inputVars = setdiff(colnames(mydata),

                    # exclude these
                    c("estate_TransDate", "estate_HouseDate", "estate_TotalPrice")
                   )

А также удалите эти записи с любым NA в любом из столбцов, которые вы используете в качестве входных данных для регрессора:

traindata <- mydata[complete.cases(mydata[,inputVars]),]

затем запустите rfe с помощью:

rfectrl <- rfeControl(functions=caretFuncs, method="cv",number=10,verbose=TRUE,returnResamp = "final")
results <- rfe(
               traindata[,inputVars], 
               traindata[,"estate_TotalPrice"],
               rfeControl=rfectrl,
               method = "svmRadial"
              )

В моем случае это заняло бы много времени, поэтому я протестировал его только на одном проценте данных, используя:

traindata <- sample_frac(traindata, 0.01)

Остается вопрос, что делать, если вам даны данные для прогнозирования цены, где некоторые из входных переменных равны NA.

person Andre Holzner    schedule 13.11.2015