есть целый ряд проблем здесь, так что это будет сделать несколько шагов, чтобы добраться до хорошего ответа. Вы не предоставили данные, поэтому я собираюсь использовать другие данные, которые получают одно и то же сообщение об ошибке. Встроенный набор диафрагмы данных имеет 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
Это будет работать для ваших тестовых данных и любые данные, которые вы получите в будущем.
Трудно сказать без воспроизводимого примера, но попробуйте 'fit = lm (Income ~ cut (Age, 4), data = training)'. – Roland
Не могли бы вы предоставить нам первые 10 строк данных или что-то похожее на это? Таким образом, мы сможем проверить код и найти возможную ошибку. Основываясь на том, чего вы пытаетесь достичь, я бы сказал, что есть проблема с преобразованием числового в фактор, который применяется только к образцу обучения, но не к образцу проверки. –