Как вы прогнозируете результаты нового набора данных, используя модель, созданную из другого набора данных в R?

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

> bigmodel <- lm(score ~ lean + gender + age, data = mydata)
> summary(bigmodel)

Call:
lm(formula = score ~ lean + gender + age, data = mydata)

Residuals:
    Min      1Q  Median      3Q     Max 
-25.891  -4.354   0.892   6.240  18.537 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 70.96455    3.85275  18.419   <2e-16 ***
lean         0.62463    0.05938  10.518   <2e-16 ***
genderM     -2.24025    1.40362  -1.596   0.1121    
age          0.10783    0.06052   1.782   0.0764 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 9 on 195 degrees of freedom
Multiple R-squared:  0.4188,    Adjusted R-squared:  0.4098 
F-statistic: 46.83 on 3 and 195 DF,  p-value: < 2.2e-16

> head(predict(bigmodel),20)
       1        2        3        4        5        6        7        8        9       10 
75.36711 74.43743 77.02533 78.76903 79.95515 79.09251 80.38647 81.65807 80.14846 78.96234 
      11       12       13       14       15       16       17       18       19       20 
82.39052 82.04468 81.05187 81.26753 84.50240 81.80667 80.92169 82.40895 81.76197 82.94809

Но я не могу уложиться в голове после прочтения ?predict.lm. Мне кажется, что эти выходные данные хороши для моего исходного набора данных, но что, если я хочу запустить прогноз для другого набора данных, отличного от того, который я использовал для создания bigmodel?

Например, если я импортирую файл .csv в R под названием newmodel с 200 людьми с указанием худощавого телосложения, пола и возраста, как я могу использовать формулу регрессии из bigmodel для получения прогнозов для newmodel?

Спасибо!


person Ryan    schedule 17.04.2014    source источник


Ответы (1)


Если вы прочтете документацию по predict.lm, то увидите следующее. Итак, используйте аргумент newdata для передачи импортированных данных newmodel для получения прогнозов.

predict(object, newdata, se.fit = FALSE, scale = NULL, df = Inf,
        interval = c("none", "confidence", "prediction"),
        level = 0.95, type = c("response", "terms"),
        terms = NULL, na.action = na.pass,
        pred.var = res.var/weights, weights = 1, ...)
Arguments

object  
Object of class inheriting from "lm"

newdata 
An optional data frame in which to look for variables with which to predict. 
If omitted, the fitted values are used.

ОБНОВИТЬ. Что касается экспорта данных с прогнозами, вот как вы можете это сделать.

predictions = cbind(newmodel, pred = predict(bigmodel, newdata = newmodel))
write.csv(predictions, 'predictions.csv', row.names = F)

ОБНОВЛЕНИЕ 2. Полное минимально воспроизводимое решение

bigmodel <- lm(mpg ~ wt, data = mtcars)
newdata = data.frame(wt = runif(20, min = 1.5, max = 6))

cbind(
  newdata,
  mpg = predict(bigmodel, newdata = newdata)
)
person Ramnath    schedule 17.04.2014
comment
Ах! Я что-то упустил. Спасибо! Я видел newdata, но подумал, что это относится к фактическому фрейму данных, а не к аргументу. Но на самом деле и то, и другое — верно? Поэтому мне нужно было загрузить то, что я изначально назвал newmodel как newdata, и тогда это сработало. - person Ryan; 18.04.2014
comment
Кроме того, есть ли способ более легко экспортировать прогноз в столбец Excel? Или еще лучше способ экспортировать прогноз в последний столбец в newdata .csv? - person Ryan; 18.04.2014
comment
К вашему первому комментарию: да, вам нужно будет прочитать свои новые данные в кадре данных newmodel (именно так, как я предполагаю, вы его называете). - person Ramnath; 18.04.2014
comment
Спасибо, но мне кажется, что я все еще упускаю еще одну вещь. Чтобы создать свой объект bigmodel, я использовал набор данных mydata, который составляет 1707 строк, а мой набор данных newmodel — всего 135. Если я запускаю свою функцию прогнозирования как predict(bigmodel, newdata = newmodel, type = "p"), поскольку я использую bigmodel в качестве объекта, она все еще пытается соответствовать ему. до 1707 строк, что дает мне ошибку 'newdata' had 135 rows but variables found have 1707 rows. Что я здесь делаю неправильно? - person Ryan; 18.04.2014
comment
Он не должен жаловаться на строки, но будет жаловаться на столбцы, так как у вас должны быть все независимые переменные в newmodel. Можете ли вы опубликовать некоторые фиктивные данные, чтобы мы могли воспроизвести вашу ошибку? - person Ramnath; 18.04.2014
comment
Я опубликовал полностью воспроизводимое решение с использованием фиктивных данных. Обратите внимание, что newdata и mtcars имеют разное количество строк. - person Ramnath; 18.04.2014
comment
Спасибо за помощь! Я думаю, что это связано с тем, что определенные пустые значения импортируются в R как пустые вместо NAs - это то, что я пытаюсь решить здесь, если вы можете помочь: http://stackoverflow.com/вопросы/23145430/как-могу-я-убедиться-все-мои-csv-данные-получает-импортированный-как-на-вместо-пустого-в-г После того, как это будет исправлено, я могу проверить чтобы увидеть, работает ли это. - person Ryan; 19.04.2014