2017-01-24 2 views
-1

У меня есть набор данных из 400 наблюдений, которые я разделил на 2 отдельных набора для обучения (300 наблюдений) и один для тестирования (100 наблюдений). Я пытаюсь создать ступенчатую функцию регрессию, проблема в том, когда я пытаюсь использовать модель для того, чтобы предсказать значения образуют тестовый набор, я получаю предупреждение:Получение предупреждения с использованием функции прогнозирования в R

Предупреждения сообщения: «NewData» был 100 строк, но переменные, найденные у 300 строк

переменная Я пытаюсь предсказать это Income и объясняющей переменной называется Age.

Это код:

fit=lm(Income∼cut (training$Age ,4) ,data=training) 
predict(fit,test) 

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

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

lm.fit=lm(Income~Age,data = training) 
predict(lm.fit,test) 
+2

Трудно сказать без воспроизводимого примера, но попробуйте 'fit = lm (Income ~ cut (Age, 4), data = training)'. – Roland

+0

Не могли бы вы предоставить нам первые 10 строк данных или что-то похожее на это? Таким образом, мы сможем проверить код и найти возможную ошибку. Основываясь на том, чего вы пытаетесь достичь, я бы сказал, что есть проблема с преобразованием числового в фактор, который применяется только к образцу обучения, но не к образцу проверки. –

ответ

2

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

MyData = iris[,3:4] 
set.seed(2017)   # for reproducibility 
T = sample(150, 100) 
training = MyData[ T, ] 
test  = MyData[-T, ] 

fit=lm(Petal.Width ~ cut(training$Petal.Length, 4), data=training) 
predict(fit,test) 
Warning message: 
'newdata' had 50 rows but variables found have 100 rows 

Так я получаю тот же тип ошибки.

cut изменяет непрерывную переменную Petal.Length в коэффициент с 4 уровнями. Вы построили свою модель по коэффициенту, но когда вы пытаетесь предсказать новые значения, вы просто прошли тест, который по-прежнему имеет непрерывные значения (возраст в ваших данных, Petal.Length в моем). Пытаясь оценить инструкцию predict, нам необходимо оценить cut(test$Petal.Length, 4) как часть процесса. Посмотрите, что это значит.

C1 = cut(training$Petal.Length, 4) 
C2 = cut(test$Petal.Length, 4) 
levels(C1) 
[1] "(0.994,2.42]" "(2.42,3.85]" "(3.85,5.28]" "(5.28,6.71]" 
levels(C2) 
[1] "(1.09,2.55]" "(2.55,4]" "(4,5.45]" "(5.45,6.91]" 

Уровни совершенно разные. Невозможно использовать вашу модель на разных уровнях. Вы можете видеть границы контейнера для C1, поэтому возникает соблазн просто использовать эти границы и разбивать тестовые данные.

levels(C1) 
"[0.994,2.42]" "(2.42,3.85]" "(3.85,5.28]" "(5.28,6.71]" 
CutPoints = c(0.994, 2.42, 3.85, 5.28, 6.71) 
C2 = cut(test$Petal.Length, breaks=CutPoints, include.lowest=TRUE) 

Но при тщательном рассмотрении вы увидите, что это не сработало. Просто распечатайте соответствующий фрагмент данных

C2[42:46] 
[1] (5.28,6.71] (5.28,6.71] <NA> (3.85,5.28] (3.85,5.28] 

C2 [44] не определено. Зачем? Одно из значений в наборе тестов выходило за пределы значений для набора тренировок, поэтому оно не принадлежит ни одному биту.

test$Petal.Length[44] 
[1] 6.9 

Так что вам действительно нужно сделать, не накладывать ни нижнего предела, ни верхнего предела.

## cut the training data to get cut points 
C1 = cut(training$Petal.Length, 4) 
levels(C1) 
"[0.994,2.42]" "(2.42,3.85]" "(3.85,5.28]" "(5.28,6.71]" 
CutPoints = c(-Inf, 2.42, 3.85, 5.28, Inf) 

Проще всего просто создать новые данные.кадры с Binned данных

Binned.training = training 
Binned.training$Petal.Length = cut(training$Petal.Length, CutPoints) 
Binned.test = test 
Binned.test$Petal.Length = cut(test$Petal.Length, CutPoints) 

fit=lm(Petal.Width ~ Petal.Length, data=Binned.training) 
predict(fit,Binned.test) 
## No errors 

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

Смежные вопросы