2012-01-27 11 views
43

I posted earlier today su un errore che stavo usando con la funzione predict. Sono stato in grado di correggerlo e ho pensato di essere sulla strada giusta.Predict() - Forse non lo capisco

Ho un numero di osservazioni (actual) e ho alcuni punti dati che voglio estrapolare o prevedere. Ho usato lm per creare un modello, quindi ho provato a utilizzare predict con il valore effettivo che servirà come input predittore.

Questo codice è tutto ripetuto dal mio precedente post, ma qui è:

df <- read.table(text = ' 
    Quarter Coupon  Total 
1 "Dec 06" 25027.072 132450574 
2 "Dec 07" 76386.820 194154767 
3 "Dec 08" 79622.147 221571135 
4 "Dec 09" 74114.416 205880072 
5 "Dec 10" 70993.058 188666980 
6 "Jun 06" 12048.162 139137919 
7 "Jun 07" 46889.369 165276325 
8 "Jun 08" 84732.537 207074374 
9 "Jun 09" 83240.084 221945162 
10 "Jun 10" 81970.143 236954249 
11 "Mar 06" 3451.248 116811392 
12 "Mar 07" 34201.197 155190418 
13 "Mar 08" 73232.900 212492488 
14 "Mar 09" 70644.948 203663201 
15 "Mar 10" 72314.945 203427892 
16 "Mar 11" 88708.663 214061240 
17 "Sep 06" 15027.252 121285335 
18 "Sep 07" 60228.793 195428991 
19 "Sep 08" 85507.062 257651399 
20 "Sep 09" 77763.365 215048147 
21 "Sep 10" 62259.691 168862119', header=TRUE) 

str(df) 
'data.frame': 21 obs. of 3 variables: 
$ Quarter : Factor w/ 24 levels "Dec 06","Dec 07",..: 1 2 3 4 5 7 8 9 10 11 ... 
$ Coupon: num 25027 76387 79622 74114 70993 ... 
$ Total: num 132450574 194154767 221571135 205880072 188666980 ... 

Codice:

model <- lm(df$Total ~ df$Coupon, data=df) 

> model 

Call: 
lm(formula = df$Total ~ df$Coupon) 

Coefficients: 
(Intercept) df$Coupon 
    107286259   1349 

Prevedere codice (sulla base di aiuto precedente):

(Questi sono i valori dei predittori che voglio utilizzare per ottenere il valore previsto)

Quarter = c("Jun 11", "Sep 11", "Dec 11") 
Total = c(79037022, 83100656, 104299800) 
Coupon = data.frame(Quarter, Total) 

Coupon$estimate <- predict(model, newdate = Coupon$Total) 

Ora, quando corro che, ricevo questo messaggio di errore:

Error in `$<-.data.frame`(`*tmp*`, "estimate", value = c(60980.3823396919, : 
    replacement has 21 rows, data has 3 

mio frame di dati originali che ho usato per costruire il modello aveva 21 osservazioni in esso. Ora sto provando a prevedere 3 valori basati sul modello.

O non capisco veramente questa funzione, o ho un errore nel mio codice.

L'aiuto sarebbe apprezzato.

Grazie

+1

È quasi certamente bisogno di usare il data' argomento 'a' lm' t ottenere questo lavoro, vale a dire 'modello <- lm (Totale ~ Promozionale , data = df) '. Quindi suggerirei 'Coupon $ stima <- prevedere (modello, newdata = Cedola) $ Totale' –

+0

@BenBolker Concordo sulla prima parte, non così sicuro del secondo. Penso che 'predice (model, newdata = Coupon)' dovrebbe essere quello che vuole. – joran

+0

@joran sì, penso che tu abbia ragione. –

risposta

65

In primo luogo, si desidera utilizzare

model <- lm(Total ~ Coupon, data=df) 

nonmodel <-lm(df$Total ~ df$Coupon, data=df).

In secondo luogo, dicendo lm(Total ~ Coupon), si sta adattando un modello che utilizza Total come variabile di risposta, con Coupon come predittore. Cioè, il tuo modello è nella forma Total = a + b*Coupon, con a e i coefficienti da stimare. Si noti che la risposta va sul lato sinistro dello ~ e del predittore (i) sulla destra.

A causa di questo, quando si chiede R per darvi valori attesi per il modello, è necessario fornire una serie di nuove predittore valori, vale a dire i nuovi valori di Coupon, non Total.

In terzo luogo, a giudicare dalle vostre specifiche di newdata, sembra che si stia effettivamente dopo un modello per adattarsi acome una funzione di Total, non viceversa. Per fare questo:

model <- lm(Coupon ~ Total, data=df) 
new.df <- data.frame(Total=c(79037022, 83100656, 104299800)) 
predict(model, new.df) 
+0

Penso che tu abbia la formula all'indietro. Inoltre, 'new.df' dovrebbe contenere' Coupon' invece di 'Total'. Inoltre, la mia risposta alla domanda originale funziona pure;) –

+1

@ JoshO'Brien: sto uscendo dai nuovi dati che l'OP ha pubblicato, che specifica i valori di "Totale". Ciò implicherebbe che in realtà, dopo un modello, predice 'Coupon'. –

+0

Ma ha sempre messo "Totale" sul LHS della formula, come fai tu nella linea di apertura del tuo post! A meno che non sia incredibilmente confuso, 'Coupon' è destinato a essere il predittore. (Non che sia importante tanto quanto i concetti che stai cercando di superare). –

7

Grazie Hong, era esattamente il problema che stavo incontrando. L'errore che si ottiene suggerisce che il numero di righe è errato, ma il problema è in realtà che il modello è stato addestrato usando un comando che finisce con nomi errati per i parametri.

Questo è davvero un dettaglio critico che è del tutto non ovvio per lm e così via. Alcune delle esercitazioni fanno riferimento a linee come lm([email protected]$Palmitic) e finiscono con nomi di variabili di $ Area NON Area, quindi non è possibile utilizzare una voce utilizzando anewdata<-data.frame(Palmitic=2). Se si utilizza lm([email protected],data=olive), i nomi delle variabili sono corretti e la previsione funziona.

Il vero problema è che il messaggio di errore non indica affatto il problema:

messaggio di avviso: 'anewdata' ha avuto 1 righe, ma variabile (s) trovati ad avere X righe

+0

Grazie, questo è un punto molto importante, ho ricevuto l'errore che hai menzionato.Per applicare la risposta alla risposta di Hong: se la colonna nel suo nuovo.df non è stata nominata "Total", che è lo stesso nome di colonna del frame di dati originale, allora otterrebbe l'errore che tu (e io) abbiamo ottenuto. Quindi è importante assicurarsi che il nome della colonna nei nuovi dati sia lo stesso del predittore nel modello originale. – NeonBlueHair

+0

Segnalando ciò come non una risposta. L'uso di '@' -operator indica che hai a che fare con un oggetto S4 e che non ha nulla a che fare con la domanda originale né la risposta. Hai erroneamente confuso le tue difficoltà con un problema dei compiti non specificato con un problema più semplice a cui è stata data una risposta adeguata. –

2

invece di newdata si sta usando newdate nel codice di previsione, verificare una volta. e basta usare Coupon$estimate <- predict(model, Coupon) Funzionerà.

1

Per evitare errori, un punto importante sul nuovo set di dati è il nome della variabile indipendente. Deve essere uguale a quello riportato nel modello. Un altro modo è quello di nido la funzione due senza creare un nuovo insieme di dati

model <- lm(Coupon ~ Total, data=df) 
predict(model, data.frame(Total=c(79037022, 83100656, 104299800)))