Странная классификация в R и ошибка в eval (predvars, data, env): объект [...] не найден, ошибка (без опечатки!) - PullRequest
0 голосов
/ 21 июня 2020

Я новичок в R и потратил часы, пытаясь решить следующие проблемы (которые, как мне кажется, могут быть взаимосвязаны). Я прочитал другие ответы, в основном предполагающие, что в столбце DRB1 может быть опечатка. Это определенно так, и мне интересно, возникла ли ошибка раньше, поскольку матрица путаницы показывает, что все классифицируется как «-», в то время как около 20% факторов в «Ответе» равны «+»:

Call:
 randomForest(formula = Response ~ ., data = training, ntree = 21, importance = TRUE) 
               Type of random forest: classification
                     Number of trees: 21
No. of variables tried at each split: 1

OOB estimate of  error rate: 20.24%
Confusion matrix:

  

   -     +   class.error
 - 17504 0           0
 +  4443 0           1

Я пытаюсь использовать случайный лес fn для предсказания переменной ответа «Response» по столбцу DRB1:

library(randomForest)
#library(xlsx) 
library(xlsx)

# load data
path <- "C:/Users/[...].xlsx" #I have only removed the path for privacy reasons
data <- read.xlsx(path, sheetIndex = 2)

# show data [FINE]
head(data)

# make some data categorical
data$DRB1=as.factor(data$DRB1)
data$Response=as.factor(data$Response)

# to check data structure [FINE]
str(data)

# define 20% testing, 80% training data set etc. 
data_set_size=floor(nrow(data)*0.80)
index <- sample(1:nrow(data), size = data_set_size)

# training set up to first set of index 
training <- data[index,]

# testing set up to first set of index 
testing <- data[-index,]

head(testing,100)  #FINE!

# now apply random forest
rf <- randomForest(Response ~ ., data = training, ntree=21, importance=TRUE)
rf
plot(rf)

# testing$DRB1 [FINE]
str(testing)

# predict runs random forest
result <- data.frame(testing$Response, predict(rf, testing[,2], type = "response")) 
result
plot(result)

Вот уменьшенная версия информации, которую я получаю при запуске кода :

> library(randomForest)
> #library(xlsx) 
> library(xlsx)
> 
> # load data
> path <- "C:/Users/[...].xlsx"
> data <- read.xlsx(path, sheetIndex = 2)
> 
> # show data
> head(data)
  Response  DRB1
1        - 08_01
2        - 11_01
3        - 07_01
4        - 11_01
5        - 04_04
6        - 07_01
> 
> # make some data categorical
> 
> data$DRB1=as.factor(data$DRB1)
> data$Response=as.factor(data$Response)
> 
> # to check data structure
> str(data)
'data.frame':   27438 obs. of  2 variables:
 $ Response: Factor w/ 2 levels "-","+": 1 1 1 1 1 1 1 1 1 1 ...
 $ DRB1    : Factor w/ 47 levels "0","01_01","01_02",..: 19 26 18 26 10 18 18 19 31 18 ...
> 
> # define 20% testing, 80% training data set etc. 
> data_set_size=floor(nrow(data)*0.80)
> index <- sample(1:nrow(data), size = data_set_size)
> 
> # training set up to first set of index 
> training <- data[index,]
> 
> # testing set up to first set of index 
> testing <- data[-index,]
> 
> head(testing,20)
    Response  DRB1
2          - 11_01
6          - 07_01
9          - 12_01
13         - 03_01
14         - 12_01
27         - 08_01
28         + 04_02
31         - 04_04
33         - 03_01
39         - 14_54
54         - 01_01
55         - 03_01
60         - 04_02
69         - 03_02
81         - 08_01
83         - 11_01
88         - 04_04
90         - 04_07
104        - 15_03
115        - 11_01
> 
> # now apply random forest
> rf <- randomForest(Response ~ ., data = training, ntree=21, importance=TRUE)
> rf

Call:
 randomForest(formula = Response ~ ., data = training, ntree = 21,      importance = TRUE) 
               Type of random forest: classification
                     Number of trees: 21
No. of variables tried at each split: 1

        OOB estimate of  error rate: 20.24%
Confusion matrix:
      - + class.error
- 17504 0           0
+  4443 0           1

Вопрос 1: Почему нет прогнозов +?

> plot(rf)
> 
> # testing$DRB1
> 
> str(testing)
'data.frame':   5488 obs. of  2 variables:
 $ Response: Factor w/ 2 levels "-","+": 1 1 1 1 1 1 2 1 1 1 ...
 $ DRB1    : Factor w/ 47 levels "0","01_01","01_02",..: 26 18 31 5 31 19 8 10 5 40 ...

Вопрос 2: Если DRB1 имеет некоторые данные NA, учитываются ли они в качестве категории, как и любая другая, и учитывает ли randomForest ее как категорию или игнорирует ее?

> # predict runs random forest
> result <- data.frame(testing$Response, predict(rf, testing[,2], type = "response")) 
Error in eval(predvars, data, env) : object 'DRB1' not found

Вопрос 3: Я так старался понять это сообщение об ошибке но не может. Можете ли вы мне помочь?

> result
     testing.Response predict.rf..testing...2.3...type....response..
7                   -                                              -
11                  -                                              -
13                  -                                              -
16                  -                                              -
24                  -                                              -
36                  -                                              -
56                  -                                              -
58                  -                                              -
59                  -                                              -
65                  -                                              -
72                  -                                              -
73                  -                                              -
75                  -                                              -
77                  -                                              -
87                  -                                              -
89                  -                                              -
95                  -                                              -
101                 -                                              -
108                 -                                              -
111                 +                                              -
118                 -                                              -
123                 -                                              -
124                 -                                              -
126                 -                                              -
127                 -                                              -
130                 -                                              -
143                 -                                              -
149                 -                                              -
154                 -                                              -
155                 -                                              -
167                 -                                              -
169                 -                                              -
174                 -                                              -
175                 -                                              -
177                 -                                              -
199                 -                                              -
201                 -                                              -
202                 -                                              -
213                 -                                              -
220                 -                                              -
229                 -                                              -
231                 +                                              -
256                 -                                              -
259                 -                                              -
268                 -                                              -
278                 -                                              -
281                 -                                              -
291                 -                                              -
296                 +                                              -
297                 +                                              -
298                 -                                              -
301                 +                                              -
302                 -                                              -
303                 +                                              -
[...]
 [ reached 'max' / getOption("max.print") -- omitted 2244 rows ]
> plot(result)

Результат остается таким же, как и в предыдущем моделировании ...

Я СУПЕР благодарен за любую помощь / ответы даже на 1 из 3-х вопросов.

Спасибо много !

1 Ответ

0 голосов
/ 26 июня 2020

У вас есть только одна переменная DRB1 для прогнозирования, поэтому, скорее всего, случайный лес - излишний.

Я бы проверил простыми графиками, есть ли какая-либо связь между категориями DRB1 и вашим ответ, например, выполнение:

library(ggplot2)
library(dplyr)
data %>% group_by(DRB1) %>% 
count(Response) %>% 
mutate(prop=n/sum(n)) %>% 
ggplot(aes(x=DRB1,y=prop,fill=Response)) + geom_col()

Что касается NAs ... он не используется в модели, но я не знаю, насколько это применимо, учитывая, что вашим данным действительно не нужна модель ML

...