2013-02-27 34 views
6

la funzione di R predict può prendere un parametro newdata e il documento si legge:alimentazione newdata a R prevedere la funzione

NewData Un frame di dati facoltativi in ​​cui cercare le variabili con cui prevedere. Se omessi, vengono utilizzati i valori adattati.

Ma ho scoperto che non è completamente vero a seconda di come il modello è in forma. Per esempio, a seguito di codice funziona come previsto:

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

Ma se il modello è in forma come ad esempio:

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

Gli ultimi due linea produrrà esattamente lo stesso risultato. La funzione predict funziona in un modo che ignora il parametro newdata, vale a dire che non è in grado di calcolare la previsione sui nuovi dati.

Il colpevole, ovviamente, è lm(y ~ x, data=dataTrain) versus lm(dataTrain$y ~ dataTrain$x). Ma non ho trovato nessun documento che menzionasse la differenza tra questi due. È un problema noto?

Sto usando R 2.15.2.

+0

Ciao sto avendo lo stesso problema, hai per caso qualche modo di risolvere questo? Grazie in anticipo, – jbest

risposta

11

Vedi ?predict.lm e la sezione nota, che cito qui di seguito:

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. 

Anche se non fa affermare il comportamento in termini di "omonimo", ecc, per quanto la formula concerne i termini che si passato a esso erano del modulo foo$var e non ci sono tali variabili con nomi come quello in newdata o lungo il percorso di ricerca che R attraverserà per cercarli.

Nel secondo caso, si sta completamente abusando della notazione della formula del modello; l'idea è di descrivere succintamente e simbolicamente il modello. La succinenza e la ripetizione dell'oggetto dati alla nausea non sono compatibili.

Il comportamento che si nota è esattamente coerente con il comportamento documentato. In termini semplici, il modello è stato adattato ai termini data$x e data$y, quindi è stato tentato di prevedere i termini x e . Per quanto riguarda R, questi sono nomi diversi e quindi cose diverse e ha fatto bene a non corrisponderli.

+0

, suppongo che significhi "hai adattato il modello con i termini $ x e dati $ y, poi hai cercato di prevedere i termini x e y". Ma capisco il tuo punto. Grazie per il chiarimento. – edwardw

+0

@edwardw sì, mi dispiace. Risolto ora. –

+2

A rischio di ottenere voti negativi: ammettiamolo, il manuale è meno intuitivo su questo argomento. Ad esempio, se si passa un modello in termini di colonne del frame di dati, come in 'lm (mydata $ y ~ mydata $ x, ...)' allora sii pronto per ogni sorta di sorpresa quando vuoi passare 'mydata =' per 'prevedere()'. La colonna dovrebbe essere chiamata 'x'? '$ X' mydata? Qualcos'altro? ... :-) Non l'ho capito, ho appena copiato le colonne sui vettori autonomi 'x' e' y', e dopo aver letto questa eccellente spiegazione ho potuto usare 'prevedere (model, mydata = data.frame (x = qualunque), ...) '. –

Problemi correlati