2013-02-27 8 views
6

функция R в predict может принимать параметр newdata и его документ гласит:Кормление NewData для R предсказать функция

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

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

x <- rnorm(200, sd=10) 
y <- x + rnorm(200, sd=1) 
data <- data.frame(x, y) 
train = sample(1:length(x), size=length(x)/2, replace=F) 
dataTrain <- data[train,] 
dataTest <- data[-train,] 
m <- lm(y ~ x, data=dataTrain) 
head(predict(m,type="response")) 
head(predict(m,newdata=dataTest,type="response")) 

Но если модель подходит как таковой:

m2 <- lm(dataTrain$y ~ dataTrain$x) 
head(predict(m2,type="response")) 
head(predict(m2,newdata=dataTest,type="response")) 

Последние две строки будет точно такой же результат. Функция predict работает таким образом, чтобы игнорировать параметр newdata, то есть он не может реально вычислить предсказание для новых данных вообще.

Виновником, конечно же, является lm(y ~ x, data=dataTrain) против lm(dataTrain$y ~ dataTrain$x). Но я не нашел документа, в котором говорилось о различии между этими двумя. Это известная проблема?

Я использую R 2.15.2.

+0

Привет, у меня такая же проблема, есть ли у вас какая-нибудь возможность выяснить, как это решить? Заранее спасибо – jbest

ответ

11

См ?predict.lm и раздел Примечания, которые я привожу ниже:

Note: 

    Variables are first looked for in ‘newdata’ and then searched for 
    in the usual way (which will include the environment of the 
    formula used in the fit). A warning will be given if the 
    variables found are not of the same length as those in ‘newdata’ 
    if it was supplied. 

Хотя это не указует поведение в терминах «же имя» и т.д., насколько эта формула касается терминов, которые вы переданные в него, имели форму foo$var и нет таких переменных с такими именами, как в newdata или вдоль пути поиска, по которому R будет перемещаться, чтобы искать их.

В вашем втором случае вы полностью злоупотребляете нотной формулой модели; идея заключается в том, чтобы кратко и символически описать модель. Краткость и повторение объекта данных ad nauseum несовместимы.

Поведение, которое вы отмечаете, составляет точно в соответствии с документированным поведением. Проще говоря, вы установили модель с условиями data$x и data$y тогда попытался предсказать для условий x и y. Что касается R, то это разные имена и, следовательно, разные вещи, и это правильно, чтобы не соответствовать им.

+0

Полагаю, что это означает, что вы установили модель с данными условий $ x и данными $ y, а затем попытались предсказать для членов x и y '. Но я вижу вашу точку зрения. Спасибо за разъяснения. – edwardw

+0

@edwardw да, извините. Исправлено. –

+2

С риском получить downvotes: давайте посмотрим правде в глаза, руководство меньше, чем интуитивно понятное на эту тему. Например, если вы передаете модель в терминах столбцов фрейма данных, например, в 'lm (mydata $ y ~ mydata $ x, ...)', тогда будьте готовы ко всем видам сюрпризов, когда вы хотите передать 'mydata =' «предсказывать»(). Должен ли столб называться 'x'? 'MYDATA $ x'? Что-то еще? ... :-) Я не понял, просто скопировал столбцы в автономные векторы 'x' и' y', и после прочтения этого отличного объяснения я мог бы использовать 'pred (model, mydata = data.frame (х = то), ...) '. –

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