Предикат.lm дает неверное количество предсказанных значений, когда я подгоняю и прогнозирую модель, используя матричную переменную - PullRequest
0 голосов
/ 07 сентября 2018

В прошлом я использовал функцию lm с данными типа matrix и типа data.frame. Но я думаю, что это первый раз, когда я пытался использовать predict, используя модель без data.frame. И я не могу понять, как заставить это работать.

Я прочитал некоторые другие вопросы (например, Получение предупреждения: "у 'newdata' было 1 строка, но у найденных переменных есть 32 строки" на Forex.lm ), и я почти уверен, что моя проблема связана с именами коэффициентов я получаю после подгонки модели. По какой-то причине имена коэффициентов являются вставкой имени матрицы с именем столбца ... и я не смог найти, как это исправить ...

library(tidyverse)
library(MASS)

set.seed(1)
label <- sample(c(T,F), nrow(Boston), replace = T, prob = c(.6,.4))

x.train <- Boston %>% dplyr::filter(., label) %>%
  dplyr::select(-medv) %>% as.matrix()
y.train <- Boston %>% dplyr::filter(., label) %>%
  dplyr::select(medv) %>% as.matrix()
x.test <- Boston %>% dplyr::filter(., !label) %>%
  dplyr::select(-medv) %>% as.matrix()
y.test <- Boston %>% dplyr::filter(., !label) %>%
  dplyr::select(medv) %>% as.matrix()

fit_lm <- lm(y.train ~ x.train)
fit_lm2 <- lm(medv ~ ., data = Boston, subset = label)
predict(object = fit_lm, newdata = x.test %>% as.data.frame()) %>% length() 
predict(object = fit_lm2, newdata = x.test %>% as.data.frame()) %>% length()
# they get different numbers of predicted data
# the first one gets a number a results consistent with x.train

Любая помощь будет приветствоваться.

1 Ответ

0 голосов
/ 07 сентября 2018

Я не могу исправить ваш tidyverse код, потому что я не работаю с этим пакетом. Но я могу объяснить, почему predict терпит неудачу в первом случае.

Позвольте мне использовать встроенный набор данных trees для демонстрации:

head(trees, 2)
#  Girth Height Volume
#1   8.3     70   10.3
#2   8.6     65   10.3

Обычный способ использования lm -

fit <- lm(Girth ~ ., trees)

Имена переменных (в RHS ~):

attr(terms(fit), "term.labels")
#[1] "Height" "Volume"

Эти переменные необходимо указывать в newdata при использовании predict.

predict(fit, newdata = data.frame(Height = 1, Volume = 2))
#       1 
#11.16125 

Теперь, если вы подходите модели с использованием матрицы:

X <- as.matrix(trees[2:3])
y <- trees[[1]]
fit2 <- lm(y ~ X)
attr(terms(fit2), "term.labels")
#[1] "X"

Переменная, которую нужно указать в newdata для predict, теперь X, а не Height или Girth. Обратите внимание, что, поскольку X является матричной переменной, вам необходимо защитить ее с помощью I() при передаче ее во фрейм данных.

newdat <- data.frame(X = I(cbind(1, 2)))
str(newdat)
#'data.frame':  1 obs. of  1 variable:
# $ X: AsIs [1, 1:2] 1 2

predict(fit2, newdat)
#       1 
#11.16125 

Неважно, что cbind(1, 2) не имеет имен столбцов. Важно то, что эта матрица называется X в newdat.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...