2012-08-03 4 views
7

Berechnung mit einem Datenrahmen arbeitenWarnung, wenn vorhergesagten Werte

x 
    Date  Val 
    1/1/2012 7 
    2/1/2012 9 
    3/1/2012 20 
    4/1/2012 24 
    5/1/2012 50 
a <- seq(as.Date(tail(x, 1)$Date), by="month", length=5) 
a <- data.frame(a) 
x.lm <- lm(x$Val ~ x$Date) 

x.pre<-predict(x.lm, newdata=a) 

Ich erhalte diese erro:

Warning message: 
'newdata' had 5 rows but variable(s) found have 29 rows 

, was mache ich falsch?

hier ist die dput Ausgang:

dput(x) 
structure(list(Date = structure(c(14610, 14641, 14669, 14700, 
14730, 14761, 14791, 14822, 14853, 14883, 14914, 14944, 14975, 
15006, 15034, 15065, 15095, 15126, 15156, 15187, 15218, 15248, 
15279, 15309, 15340, 15371, 15400, 15431, 15461), class = "Date"), 
    Val = c(45, 51, 56, 56, 59, 60, 60, 60, 64, 65, 75, 73, 74, 
    80, 87, 91, 92, 96, 109, 108, 123, 129, 133, 143, 127, 127, 
    123, 121, 130)), .Names = c("Date", "Val"), row.names = c(NA, 
29L), class = "data.frame") 
+1

Soll das 'z' in Ihrer ersten Zeile ein' x' sein? sonst wissen wir nicht, was 'z' ist. Sie erhalten keine Fehlermeldung, Sie erhalten eine Warnung. Außerdem hat nichts, was Sie uns zeigen, 29 Zeilen, so dass wir das nicht wiederholen können. Verwenden Sie 'dput', um uns Ihre tatsächlichen Daten anzuzeigen. – Justin

+0

Entschuldigung, es ist x. Ich habe es gerade aktualisiert – user1471980

Antwort

10

Ihre Variablennamen, wie im x.lm Modell gespeichert werden, beziehen sich auf die x Datenrahmen. Es gibt keine Variablen mit den gleichen Namen in a, so dass es die 29 von x wieder verwenden wird, was wahrscheinlich nicht das ist, was Sie wollten, also die Warnung. Sie können wie folgt vorgehen, um immer einen uneingeschränkten Variable Date in dem Modell mit dem Namen zu verwenden:

a <- seq(as.Date(tail(x, 1)$Date), by="month", length=5) 
a <- data.frame(Date = a) 
x.lm <- lm(Val ~ Date, data=x) 
x.pre<-predict(x.lm, newdata=a) 
+1

oder 'x.lm <- lm (Val ~ Datum, Daten = x); (x.lm, newdata = data.frame (Datum = a)) ' –

+0

@BenBolker, du hast Recht, ein' mit (x, ...) 'ist hier wahrscheinlich zu viel. Änderte meine Antwort entsprechend. Vielen Dank. – MvG

+0

Übrigens, gibt es eine Möglichkeit zu sehen, wie die R-Parameterübergabe funktioniert, die Ihrem Gehirn nicht schadet? –

1

Ihre data.frame a eine Spalte a genannt hat. Sie haben Ihr Modell mit den Spalten Val und Date erstellt, also das, wonach es sucht.

, wenn Sie Ihren Namen data.frame a dass Spalte Date machen und du bist gut zu gehen:

a <- data.frame(Date=a) 

Dann läuft es ohne die Warnung.

Pro Kommentar:

Bearbeiten Sie Ihre lm Anruf sein:

lm(Val ~ Date, data=x) 
+0

Gibt immer noch die Warnung für mich, wie die Variable 'x $ Date' hier heißt. Sogar das tatsächliche Angeben von "x $ Date" im Datenrahmen scheint nicht ausreichend zu sein. Hast du das getestet, so wie das OP es geschrieben hat? Wenn ja, könnte es einen Unterschied zwischen Ihrer Version von R und meiner 2.15.1 geben. – MvG

+0

@MvG yeah, du hast Recht, ich hatte den Code des OPs während des Fiedelns geändert und vergessen. – Justin

0

Wenn Sie nicht predict.lm() Arbeit machen können, dann sollten Sie versuchen, Ihre eigene Funktion function() zu schreiben:

yourown_function<- function(predictor1, predictor2,...){intercept+b1*predictor1+b2*predictor2+...} 

Verwendung yourown_function von jedem neuen Datenrahmen vorherzusagen:

newvalues<- yourown_function(predictor1=data.frame$predictor1, predictor2=data.frame$predictor2,....) 

die neuen Werte verwenden, können Sie Comput e Residuen, MSE, etc ...

+0

Diese Art von Schrift und Format ist wirklich schwer zu lesen, Alter. – skyline75489

0

Statt x.lm < - lm (x $ Val ~ x $ Datum, Daten = x) benutze x.lm < - lm (Val ~ Datum, Daten = x) . Das Entfernen des Dataset-Namens vor dem Variablennamen in der Funktion lm sollte helfen.