2014-12-13 10 views
40

Znalazłem osobliwość podczas używania funkcji przewidywania i lm w R. Otrzymałem różne wyniki dla ramki danych i wektora dla tych samych danych . KodPierwsze ostrzeżenie: "'newdata" miał 1 wiersz, ale znalezione zmienne mają 32 wiersze "na predict.lm w R

DataFrame:

data(mtcars) 
fitCar<-lm(mtcars$mpg~mtcars$wt) 
predict(fitCar, 
     data.frame(x=mean(mtcars$wt)), 
     interval="confidence") 

wyjściowa:

 fit  lwr  upr 
1 23.282611 21.988668 24.57655 
2 21.919770 20.752751 23.08679 
3 24.885952 23.383008 26.38890 
4 20.102650 19.003004 21.20230 
5 18.900144 17.771469 20.02882 
6 18.793255 17.659216 19.92729 
7 18.205363 17.034274 19.37645 
8 20.236262 19.136179 21.33635 
9 20.450041 19.347720 21.55236 
10 18.900144 17.771469 20.02882 
11 18.900144 17.771469 20.02882 
12 15.533127 14.064349 17.00190 
13 17.350247 16.104455 18.59604 
14 17.083024 15.809403 18.35664 
15 9.226650 6.658271 11.79503 
16 8.296712 5.547468 11.04596 
17 8.718926 6.052112 11.38574 
18 25.527289 23.927797 27.12678 
19 28.653805 26.519252 30.78836 
20 27.478021 25.554415 29.40163 
21 24.111004 22.715653 25.50635 
22 18.472586 17.319886 19.62529 
23 18.926866 17.799465 20.05427 
24 16.762355 15.452833 18.07188 
25 16.735633 15.423002 18.04826 
26 26.943574 25.112491 28.77466 
27 25.847957 24.198041 27.49787 
28 29.198941 26.963760 31.43412 
29 20.343151 19.242185 21.44412 
30 22.480940 21.268498 23.69338 
31 18.205363 17.034274 19.37645 
32 22.427495 21.219818 23.63517 

komunikat ostrzegawczy:

'newdata' had 1 row but variables found have 32 rows

Kiedy SEPAR jedliśmy zarówno dane do wektora, mam inną odpowiedź

kodeks wektora

predict(fit,data.frame(x=mean(x)), interval="confidence") 

wyjściowa:

fit lwr upr 
1 20.09 18.99 21.19 

Jaki jest powód tej różnicy?

Odpowiedz

59

Jest to problem polegający na używaniu różnych nazw między data i newdata i nie stanowi problemu między używaniem wektorów lub ramek danych.

Kiedy dopasować model z funkcją lm a następnie użyć predict aby prognoz, predict stara się znaleźć te same nazwiska na swojej newdata. W twoim pierwszym przypadku nazwa x jest w konflikcie z mtcars$wt, a więc otrzymujesz ostrzeżenie.

Zobacz tutaj ilustracją tego, co mówię:

To, co zrobiłeś i nie pojawia się błąd:

a <- mtcars$mpg 
x <- mtcars$wt 

#here you use x as a name 
fitCar <- lm(a ~ x) 
#here you use x again as a name in newdata. 
predict(fitCar, data.frame(x = mean(x)), interval = "confidence") 

     fit  lwr  upr 
1 20.09062 18.99098 21.19027 

zauważyć, że w tym przypadku pasuje model używając nazwa X a także przewidzieć użycie nazwy x w twoim newdata. W ten sposób nie otrzymujesz ostrzeżeń i właśnie tego oczekujesz.

Zobaczmy, co się dzieje, kiedy zmienić nazwę na coś innego, kiedy pasuje do modelu:

a <- mtcars$mpg 
#name it b this time 
b <- mtcars$wt 

fitCar <- lm(a ~ b) 
#here I am using name x as previously 
predict(fitCar, data.frame(x = mean(x)), interval = "confidence") 

     fit  lwr  upr 
1 23.282611 21.988668 24.57655 
2 21.919770 20.752751 23.08679 
3 24.885952 23.383008 26.38890 
4 20.102650 19.003004 21.20230 
5 18.900144 17.771469 20.02882 
Warning message: 
'newdata' had 1 row but variables found have 32 rows 

Jedyną rzeczą, jaką zrobiłem było teraz zmienić nazwę x gdy dopasowania modelu do b a następnie przewidzieć używając nazwy x w newdata. Jak widzisz, mam ten sam błąd, co w twoim pytaniu.

Mam nadzieję, że teraz jest jasne!

+0

Dlaczego mam ten sam błąd w tym przypadku? 'install.packages ("samochód") biblioteka (CAR) danych (kwartet) lmfit = lm (kwartet $ ~ y2 poli (kwartet $ x, 2, surowy = PRAWDA)) NewData = data.frame (x = c (3,6,15)) predict (lmfit, newdata, interval = "confidence", level = 0,95) ' – agaved

+0

@agaved Jeden twój przypadek, ponieważ używasz pełnej nazwy' Quartet $ x' szukaj również tego w 'newdata'. Ponieważ nie ma 'Quartet $ x' w newdata, ale tylko' newdata $ x' nie działa. – LyzandeR

+0

@agaved Również, jeśli masz nowe pytanie, zadaj je jako nowe. Nie używaj komentarzy, aby zadawać różne pytania. Jest to inny problem niż ten wspomniany w pytaniu. – LyzandeR

4

sposób wokół to bez nazw jest użycie następujących:

fitCar<-lm(mpg ~ wt, mtcars) #here you use x as a name 
predict(fitCar,data.frame(wt=mean(mtcars$wt)), interval="confidence") 
3

we wzorze funkcji lm nie odnoszą się do zmiennych z wykorzystaniem wzorca DatasetName $ variableName. Zamiast tego użyj variablename + variablename ... Nie spowoduje to ostrzeżenia: 'newdata' ma wiersz nrow (test), ale zmienne found mają wiersze nrow (train).

Powiązane problemy