Подтвердить что ты не робот

Ошибка "Factor has new levels" для переменной, которую я не использую

Рассмотрим простой набор данных, разбитый на набор для обучения и тестирования:

dat <- data.frame(x=1:5, y=c("a", "b", "c", "d", "e"), z=c(0, 0, 1, 0, 1))
train <- dat[1:4,]
train
#   x y z
# 1 1 a 0
# 2 2 b 0
# 3 3 c 1
# 4 4 d 0
test <- dat[5,]
test
#   x y z
# 5 5 e 1

Когда я тренирую модель логистической регрессии для прогнозирования z с использованием x и получаю предсказания тестового набора, все хорошо:

mod <- glm(z~x, data=train, family="binomial")
predict(mod, newdata=test, type="response")
#         5 
# 0.5546394 

Однако это не соответствует эквивалентной модели логистической регрессии с ошибкой "Фактор имеет новые уровни":

mod2 <- glm(z~.-y, data=train, family="binomial")
predict(mod2, newdata=test, type="response")
# Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
#   factor y has new level e

Так как я удалил y из моего модельного уравнения, я с удивлением вижу это сообщение об ошибке. В моем приложении dat очень широк, поэтому z~.-y является наиболее удобной спецификацией модели. Простейшее обходное решение, о котором я могу думать, это удалить переменную y из моего фрейма данных, а затем обучить модель синтаксису z~., но я надеялся на способ использования исходного набора данных без необходимости удаления столбцов.

4b9b3361

Ответ 1

Вы можете попробовать обновить mod2$xlevels[["y"]] в объекте модели

mod2 <- glm(z~.-y, data=train, family="binomial")
mod2$xlevels[["y"]] <- union(mod2$xlevels[["y"]], levels(test$y))

predict(mod2, newdata=test, type="response")
#        5 
#0.5546394 

Другой вариант - исключить (но не удалить) "y" из данных обучения

mod2 <- glm(z~., data=train[,!colnames(train) %in% c("y")], family="binomial")
predict(mod2, newdata=test, type="response")
#        5 
#0.5546394 

Ответ 2

Я был смущен этой проблемой в течение длительного времени. Однако для этого было простое решение. Одна из переменных "тип трафика" имела 20 факторов, а для одного, то есть 17, была только одна строка. Следовательно, этот ряд может присутствовать либо в данных поезда, либо в данных испытаний. В моем случае это присутствовало в тестовых данных, поэтому возникла ошибка - коэффициент "тип трафика" имеет новый уровень 17, потому что нет строки с уровнем 17 в данных поезда. Я удалил эту строку из набора данных, и модель работает отлично

Ответ 3

Этот из предложенных вариантов работает:

mod2 <- glm(z~., data=train[,!colnames(train) %in% c("y")])