Perché sto ottenendo previsioni diverse per l'espansione polinomiale manuale e usando la funzione R `poly`?


10

Perché ricevo previsioni diverse per l'espansione polinomiale manuale e l'utilizzo della polyfunzione R ?

set.seed(0)
x <- rnorm(10)
y <- runif(10)
plot(x,y,ylim=c(-0.5,1.5))
grid()

# xp is a grid variable for ploting
xp <- seq(-3,3,by=0.01)
x_exp <- data.frame(f1=x,f2=x^2)
fit <- lm(y~.-1,data=x_exp)
xp_exp <- data.frame(f1=xp,f2=xp^2)
yp <- predict(fit,xp_exp)
lines(xp,yp)

# using poly function
fit2 <- lm(y~ poly(x,degree=2) -1)
yp <- predict(fit2,data.frame(x=xp))
lines(xp,yp,col=2)

inserisci qui la descrizione dell'immagine

Il mio tentativo:

  • Sembra essere un problema con l'intercettazione, quando inserisco il modello con l'intercettazione, cioè no -1nel modello formula, le due linee sono uguali. Ma perché senza l'intercettazione le due linee sono diverse?

  • Un'altra "correzione" sta usando rawl'espansione polinomiale invece del polinomio ortogonale. Se cambiamo il codice in fit2 = lm(y~ poly(x,degree=2, raw=T) -1), renderemo 2 righe uguali. Ma perché?


4
Questo è fuori tema dalla tua domanda, ma sei spesso molto aperto al commento. Quando leggo il tuo codice, la prima cosa che noto è che usi =e <-per l'assegnazione in modo incoerente. Non lo farei davvero, non è esattamente confuso, ma aggiunge un sacco di rumore visivo al tuo codice senza alcun vantaggio. Dovresti accontentarti dell'uno o dell'altro da utilizzare nel tuo codice personale e attenersi ad esso.
Matthew Drury,

grazie per avermi aiutato con la programmazione! domanda risolta. @MatthewDrury
Haitao Du,

3
Casuale punta di follow-up per fare <-meno di un fastidio al tipo: alt+-.
JAD

@JarkoDubbeldam grazie per la punta di codifica. Adoro le scorciatoie da tastiera
Haitao Du,

Risposte:


12

Come notate correttamente, la differenza originale è perché nel primo caso usate i polinomi "grezzi" mentre nel secondo caso usate i polinomi ortogonali. Pertanto se la lmchiamata successiva fosse modificata in: fit3<-lm(y~ poly(x,degree=2, raw = TRUE) -1)otterremmo gli stessi risultati tra fite fit3. Il motivo per cui otteniamo gli stessi risultati in questo caso è "banale"; montiamo esattamente lo stesso modello che abbiamo montato fit<-lm(y~.-1,data=x_exp), senza sorprese lì.

Si può facilmente verificare che le matrici dei modelli dei due modelli siano uguali all.equal( model.matrix(fit), model.matrix(fit3) , check.attributes= FALSE) # TRUE).


Ciò che è più interessante è il motivo per cui otterrai gli stessi grafici quando usi un'intercettazione. La prima cosa da notare è che, quando si monta un modello con un'intercettazione

  • Nel caso di fit2spostare semplicemente le previsioni del modello in verticale; la forma effettiva della curva è la stessa.

  • D'altra parte, includendo un'intercettazione nel caso dei fitrisultati, non solo una linea diversa in termini di posizionamento verticale, ma con una forma completamente diversa nel complesso.

Possiamo facilmente vederlo aggiungendo semplicemente i seguenti adattamenti alla trama esistente.

fit_b<-lm(y~. ,data=x_exp)
yp=predict(fit_b,xp_exp)
lines(xp,yp, col='green', lwd = 2)

fit2_b<-lm(y~ poly(x,degree=2, raw = FALSE) )
yp=predict(fit2_b,data.frame(x=xp))
lines(xp,yp,col='blue')

inserisci qui la descrizione dell'immagine

OK ... Perché gli adattamenti senza intercettazione erano diversi mentre gli adattamenti con intercettazione erano uguali? La cattura è di nuovo sulla condizione di ortogonalità.

Nel caso della fit_bmatrice modello utilizzata contiene elementi non ortogonali, la matrice Gram crossprod( model.matrix(fit_b) )è tutt'altro che diagonale; nel caso degli fit2_belementi sono ortogonali ( crossprod( model.matrix(fit2_b) )è effettivamente diagonale).

Pertanto, nel caso in fitcui lo espandiamo per includere un'intercettazione, fit_babbiamo modificato le voci off-diagonali della matrice Gram e quindi l'adattamento risultante è diverso nel suo complesso (diversa curvatura, intercetta, ecc.) A confronto con la vestibilità fornita da . Nel caso in cui, quando lo espandiamo per includere un'intercettazione come in appendichiamo solo una colonna che è già ortogonale alle colonne che avevamo, l'ortogonalità è contro il polinomio costante di grado 0 . Ciò si traduce semplicemente nello spostare verticalmente la nostra linea adattata dall'intercettazione. Questo è il motivo per cui le trame sono diverse.XTXfitfit2fit2_b

L'interessante domanda è perché fit_be fit2_bsono gli stessi; dopo tutto le matrici del modello da fit_be fit2_bnon sono le stesse in valore nominale . Qui dobbiamo solo ricordare che alla fine fit_be fit2_bavere le stesse informazioni. fit2_bè solo una combinazione lineare di fit_bcosì essenzialmente i loro adattamenti risultanti saranno gli stessi. Le differenze osservate nel coefficiente adattato riflettono la ricombinazione lineare dei valori fit_bal fine di ottenerli ortogonali. (vedi la risposta di G. Grothendieck anche qui per un altro esempio.)


+2.5 grazie per l'ottima risposta. Per il grafico finale, ho imparato da @kjetilb halvorsen: un modo più astratto di descriverlo è che il modello stesso dipende solo da un certo sottospazio lineare, vale a dire lo spazio di colonna definito dalla matrice di progettazione. Ma i parametri dipendono non solo da questo sottospazio, ma dalla base per quel sottospazio, dato dalle variabili specifiche utilizzate, cioè dalle colonne stesse. Le previsioni del modello, ad esempio, dipenderanno solo dal sottospazio lineare, non dalla base scelta.
Haitao Du,

spero non ti dispiaccia, ho riformattato un po '..
Haitao Du

@ hxd1011: nessun problema, grazie per aver dedicato del tempo a "pettinarlo" un po '.
usεr11852,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.