2013-02-27 13 views
6

predict funkcja R mogą brać parametr newdata a jego dokument brzmi:Karmienie NewData R przewidzieć funkcja

NewData Opcjonalny ramki danych, w którym szukać zmiennych, z którymi do przewidzenia. Jeśli zostanie pominięty, zostaną użyte dopasowane wartości.

Ale okazało się, że nie jest to całkowicie prawda w zależności od tego, jak model jest odpowiedni. Na przykład, następujący kod działa zgodnie z oczekiwaniami:

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")) 

Ale jeśli model nadaje się jako takie:

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

Dwa ostatnie linia będzie produkować dokładnie ten sam rezultat. Funkcja predict działa w sposób ignorujący parametr newdata, tj. Nie może w ogóle dokładnie obliczyć prognozy dla nowych danych.

Winowajcą jest oczywiście lm(y ~ x, data=dataTrain) versus lm(dataTrain$y ~ dataTrain$x). Ale nie znalazłem żadnego dokumentu, który wspomniałby o różnicy między tymi dwoma. Czy to znany problem?

Używam wersji 2.15.2.

+0

Witam Mam ten sam problem, czy przypadkiem nie wymyśliłeś sposobu rozwiązania tego problemu? Z góry dziękuję – jbest

Odpowiedz

11

Zobacz ?predict.lm i sekcja Note, który cytuję poniżej:

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. 

Mimo, że nie stwierdza się zachowań w kategoriach „samej nazwie” etc, jeśli chodzi o wzór dotyczy terminu, który przekazane do niego były w postaci foo$var i nie ma takich zmiennych o takich nazwach w newdata lub wzdłuż ścieżki wyszukiwania, którą R będzie przemierzał, aby je wyszukać.

W drugim przypadku całkowicie nadużywasz notacji wzoru modelu; chodzi o zwięzłe i symboliczne opisanie modelu. Zwięzłość i powtarzanie obiektu danych ad nauseum nie są kompatybilne.

Zachowanie, o którym wspominasz, jest dokładnie zgodne z udokumentowanym zachowaniem. W prostych słowach dopasowałeś model do warunków data$x i data$y, a następnie próbowałeś przewidzieć warunki x i y. Jeśli chodzi o R, to są to różne nazwy, a więc różne rzeczy i nie pasuje do nich.

+0

Zakładam, że oznacza to, że "dopasowałeś model do danych warunków x i danych $ y, a następnie próbowałeś przewidzieć warunki x i y". Ale widzę twój punkt widzenia. Dziękuję za wyjaśnienie. – edwardw

+0

@ Directwardw Tak, przepraszam. Naprawiono teraz. –

+2

Ryzyko zawyżenia ceny: spójrzmy prawdzie w oczy, podręcznik jest mniej niż intuicyjny na ten temat. Na przykład, jeśli przekazujesz model pod względem kolumn w ramce danych, jak w 'lm (mydata $ y ~ mydata $ x, ...)' to bądź przygotowany na różnego rodzaju niespodzianki kiedy chcesz przekazać 'mydata =' do 'predict()'. Czy kolumnę należy nazwać 'x'? 'mydata $ x'? Coś jeszcze? ... :-) Nie wymyśliłem tego, po prostu skopiowałem kolumny do autonomicznych wektorów 'x' i' y', a po przeczytaniu tego znakomitego wyjaśnienia mogłem użyć 'predict (model, mydata = data.frame (x = cokolwiek), ...) '. –

Powiązane problemy