MissForest не будет вменять мои категориальные переменные - PullRequest
1 голос
/ 29 марта 2020

Я не опытный кодер и только начал изучать R за последние несколько недель, чтобы помочь с работой, связанной с моей докторской степенью. Вот проблема:

Я пытался много, много часов безуспешно пытаться вписать пропущенные значения в набор данных с помощью пакета missForest в R. Ниже приведен типичный пример проблемы, с которой я сталкиваюсь. изготовленный набор данных.

Набор данных содержит числовые значения c, которые являются категориальными. После импорта я использую следующий код, чтобы установить для класса «factor»


    data <- read.csv("~Data.csv", colClasses = c(rep('factor',3)))

>data  
a   b   c  
1   2   3  
4   5      
7   8   9

Чтобы проверить правильность установки класса, я запускаю:

missForest::varClass(data) 

возвращает:

[1] "factor" "factor" "factor"

Затем я пытаюсь вменять и просматривать данные, но я получаю исходный набор данных с отсутствующей точкой данных вместо вставленного вмененного значения.

    data.imp <- missForest(data)
    data.imp$ximp

a   b   c  
1   2   3  
4   5      
7   8   9  

Приведенный выше пример показывает, как я импортирование данных и преобразование их в фактор и попытка вменять недостающие данные. Приведенный ниже пример является воспроизводимым примером, который создает ту же проблему.

Приведенный ниже пример должен быть воспроизводимым в R

Я использую версию R 3.5.3 (2019-03-11)

#install and load the missForest package and library
install.packages("missForest")
library(missForest)
#create the test data frame with a missing value in column c
a <- c("1","4","7")
b <- c("2","5","8")
c <- c("3","","9")
data.test <- data.frame(a,b,c)
#print the data
data.test
#view the class of the data to ensure it is "factor"
missForest::varClass(data.test)
#create the imputed data frame using missForest
data.test.imp <- missForest(data.test)
#print the imputed data frame
data.test.imp$ximp

Приведенный выше код возвращает следующее значение, значение которого в столбце c по-прежнему отсутствует

> data.test
  a b c
1 1 2 3
2 4 5  
3 7 8 9
> missForest::varClass(data.test)
[1] "factor" "factor" "factor"
> data.test.imp <- missForest(data.test)
  missForest iteration 1 in progress...done!
  missForest iteration 2 in progress...done!
> data.test.imp$ximp
  a b c
1 1 2 3
2 4 5  
3 7 8 9

Если я преобразую все данные в цифру c, он будет вменять значения в отсутствуют точки данных, хотя эти вмененные значения являются десятичными, а все мои данные целыми числами, но, тем не менее, это работает ...

Реальный набор данных, который я использую, намного больше, но у меня точно такой же проблема с ним.

Далее, если я последую примеру в руководстве по missForest, используя набор данных iris, все будет работать как надо. Но если я загружаю тот же набор данных из репозитория UCI и вручную удаляю категориальную точку данных и пытаюсь запустить тот же код, он не работает.

Я уверен, что есть что-то незначительное, что мне не хватает, но после нескольких часов попыток понять это, я застрял.

1 Ответ

1 голос
/ 29 марта 2020

Это действительно кажется незначительной проблемой. В вашем data.test есть пустые строки, которые необходимо кодировать как отсутствующие.

Вы можете проверить это с помощью str:

str(data.test)
# 'data.frame': 3 obs. of  3 variables:
# $ a: Factor w/ 3 levels "1","4","7": 1 2 3
# $ b: Factor w/ 3 levels "2","5","8": 1 2 3
# $ c: Factor w/ 3 levels "","3","9": 2 1 3

Видите, уровни переменной c содержит "", который также закодирован как категория.

Вы можете легко это исправить, выполнив

data.test[data.test == ""] <- NA
data.test
#   a b    c
# 1 1 2    3
# 2 4 5 <NA>
# 3 7 8    9

Теперь missForest работает:

data.test.imp <- missForest::missForest(data.test)
data.test.imp$ximp
#   a b c
# 1 1 2 3
# 2 4 5 9
# 3 7 8 9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...