#r
#r
Вопрос:
Я разделил свой набор данных на 2 фрейма данных: обучающий (имеющий 830 строк) и тестовый (200 строк). Имена столбцов идентичны и расположены в том же порядке.
Я построил естественную сплайновую модель для прогнозирования прочности по одной переменной, цементу.
Когда я пытаюсь использовать эту модель для составления прогнозов в моем тестовом наборе, вместо ожидаемых 200 прогнозов я получаю 830 прогнозов. Я не знаю, почему это происходит. Я просмотрел страницы справки и Веб, но не нашел ничего, что решало бы эту проблему.
Я проверил размеры test $ cement, и в нем действительно всего 200 записей.
Вот мой код прямо сейчас:
library(tidyverse)
library(caret)
library(splines)
attach(train)
fit1 <- lm(strength~ns(cement, 4), data = train)
summary(fit1)
pred1 <- predict(fit1, newdata = data.frame(test$cement), se=T)
pred1
detach(train)
Я также пробовал эти версии predict:
pred2 <- fit1 %>% предсказать (тест $ cement)
—> что выдает мне ошибки, говорящие о том, что он не понимает %>%
pred = predict.BSpline(fit1, newdata = test $ cement, se = T)
и
pred = predict.bSpline2(fit1, newdata = test $ cement, se = T)
—> Оба из которых говорят мне, что они не могут найти функцию predict.BSpline или predict.bSpline2, хотя я открыл библиотеки как splines, так и splines2.
Также predict.ns, похоже, не существует.
Любая помощь была бы высоко оценена.
Комментарии:
1.
newdata
должно иметь то же имя, что и предсказатели в модели, поэтому попробуйтеnewdata = data.frame(cement=test$cement)
. и, пожалуйста, не используйтеattach
, поскольку это может вызвать кучу проблем.
Ответ №1:
У меня нет ваших данных, но вы должны попробовать пройти тест всего фрейма данных:
pred1 <- predict(fit1, newdata = test, se=T)
также «%>%» оператора определяется в «tidyr» библиотека верю.
Я думаю, что predict.ns predict.BSpline переопределяет функцию прогнозирования — посмотрите ее документацию. Хотя я никогда не использовал объекты spline, то, что я прочитал, предполагает, что вы просто используете тип объекта из этой библиотеки с обычной функцией «predict».
Ответ №2:
Я думаю, нам нужно было бы увидеть воспроизводимый пример вашего набора данных, потому что я думаю, что это может быть причиной вашей проблемы. Когда я использую следующий код, я получаю правильные результаты:
library(dplyr)
library(splines)
train <- sample_frac(mtcars, .8)
test <- setdiff(mtcars, train)
fit1 <- lm(mpg~ns(wt, 4), data = train)
pred1 <- predict(fit1, newdata = test, se=T)
pred1
Просто подумав о том, caret
я бы убедился, что вы не создаете объект list при создании своих разделений на поезда / тесты ( createDataPartition(list = FALSE)
)
Кроме того, я бы не использовал attach
. Для ввода всех имен переменных требуется немного больше ввода, но иногда вы можете получать странные результаты, которые могут быть тем, что происходит с вами. Я бы перезапустил ваш сеанс R, удалил прикрепление и затем повторил попытку.
Не лучшее решение, но я бы попробовал.