Ошибка в model.frame.default для Predict () - Фактор имеет новые уровни - Для переменной типа Char

У меня есть набор данных, который я разделил на наборы данных для тестирования / обучения. Сразу после этого разделения я создал логистическую модель с:

logModel1 = glm(Y ~ . -var1 -var2 -var3, data=train, family=binomial)

Если я использую эту модель для прогнозов на одном и том же наборе поездов, я не получаю ошибки (хотя, конечно, это не очень полезный тест моей модели). Поэтому я использовал приведенный ниже код для прогнозирования на моем тестовом наборе:

predictLog1 <- predict(logModel1, type="response", newdata=test)

Но я получаю следующую ошибку:

Ошибка в model.frame.default (Термины, newdata, na.action = na.action, xlev = object $ xlevels): фактор myCharVar имеет новые уровни Это наблюдение myCharVar, это еще один ...

Вот что меня особенно смутило:

  • myCharVar - это символьная переменная как в моем наборе поездов, так и в тестовом наборе. Я подтвердил это с помощью str(test$myCharVar) и str(train$myCharVar)
  • Моя модель даже не использует myCharVar как часть прогноза.

Я нашел объяснение для пули 2 по этой ссылке SO: Фактор имеет ошибку нового уровня для переменной, которую я не использую

И предложение полностью удалить символьные переменные из моего набора тестов и тестов предоставило мне обходной путь, так что, по крайней мере, я не задерживаюсь. Но это кажется довольно неэлегантным, в отличие от простого удаления их из модели с помощью "-myCharVar". Если кто-нибудь поймет, почему символьная переменная в моем наборе тестов выдает ошибку «фактор имеет новые уровни», меня, безусловно, заинтересует.


person Max Power    schedule 26.04.2015    source источник


Ответы (1)


Человек, ответивший на вопрос в сообщении, на которое вы указали ссылку, уже указал, почему myCharVar по-прежнему учитывается в модели. Когда вы используете z~.-y, формула в основном расширяется до z~(x+y)-y.

Теперь, чтобы ответить на ваш другой вопрос: рассмотрим следующую цитату из predict() документации: «Для факторных переменных, имеющих числовые уровни, вы можете указать числовые значения в newdata без предварительного преобразования переменных в факторы. Эти числовые значения проверяются на убедитесь, что они соответствуют уровню, затем переменная внутренне преобразуется в коэффициент ".

Я думаю, мы можем предположить, что такое же поведение имеет место для myCharVar. Значения myCharVar сначала сравниваются с соответствующими существующими уровнями в модели, и здесь все идет не так. Набор тестов содержит значения для myCharVar, которые никогда не встречались во время обучения модели (обратите внимание, что сама функция glm также выполняет преобразование коэффициентов. Она выдает предупреждение, когда необходимо выполнить преобразование). Таким образом, ошибка в основном означает, что модель не может делать прогнозы для неизвестных уровней в тестовых данных, которые никогда не встречались во время обучения модели.

В этом сообщении есть еще одно разъяснение по этому вопросу.

person Jellen Vermeir    schedule 26.04.2015
comment
Привет, Джеллен, я попытался передать, что нашел ответ на вопрос, почему myCharVar все еще рассматривается. Я нашел объяснение для маркера 2 в этой ссылке SO. Извините, если это было непонятно. Большое спасибо за объяснение внутренних преобразований переменных в факторы, это очень полезно знать и полностью отвечает на мой вопрос. - person Max Power; 26.04.2015