Ошибка при замене новых уровней фактора в тестовом наборе данных на «NA»

Я разделил свой набор данных на наборы данных для тестирования и обучения. Я попытался подогнать регрессию к тренировочному набору, а затем использовать прогнозирование на тестовом наборе. Когда я это делаю, я получаю сообщение об ошибке, в котором говорится: «Ошибка в факторе model.frame x имеет новые уровни». Я знаю, что это потому, что в моих тестовых данных есть уровни, которых нет в моих обучающих данных.

Что я хочу сделать, так это просто исключить или игнорировать уровни, которых нет в обоих наборах данных. Я пытался сделать это, но он не устанавливает никаких уровней в NA, а объект id говорит «целое (пусто)»:

id <- which(!(test$x %in% levels (train$x))
train$x[id] <- NA

fit <- lm(y ~ x, data=train)
P <- predict(fit,test)

person grig109    schedule 07.01.2017    source источник
comment
Но даже до того, как нужно добавить команду droplevels, первая часть не работает должным образом. Кажется, я получаю либо пустое целое число, либо ошибку о том, что в замене 190708 строк, в данных 189590.   -  person grig109    schedule 07.01.2017


Ответы (1)


Вы получите ошибку «длина замены отличается» с вашим кодом.

id <- which(!(test$x %in% levels (train$x))

говорит вам, какие элементы в test$x не находятся в levels(train$x), поэтому вы должны использовать id для индексации test$x, а не train$x, при выполнении замены.

test$x[id] <- NA
test$x <- droplevels(test$x)  ## also don't forget to remove unused factor levels

fit <- lm(y ~ x, data = train)
P <- predict(fit, test)

Все данные в train будут использоваться для построения вашей модели линейной регрессии. Некоторые прогнозы в P будут NA.


Я все еще не могу заставить объект id правильно определить, каких уровней нет в обоих наборах данных. В рабочей области просто отображается integer(0).

Тогда к чему ваш вопрос??!! Все уровни в test$x находятся внутри levels(train$x) и нового уровня нет.

person Zheyuan Li    schedule 07.01.2017
comment
Я все еще не могу заставить объект Id правильно определить, каких уровней нет в обоих наборах данных. В рабочей области он просто показывает целое число (пусто). - person grig109; 08.01.2017
comment
Потому что я получаю сообщение об ошибке, в котором говорится, что ошибка в model.frame factor x имеет новые уровни. Кажется, это говорит о том, что все уровни в test$x не входят в train$x. - person grig109; 08.01.2017