Regressione polinomiale grezza o ortogonale?


22

Voglio regredire una variabile y su x,x2,,x5 . Dovrei farlo usando polinomi grezzi o ortogonali? Ho esaminato la domanda sul sito che tratta di questi, ma non capisco davvero quale sia la differenza tra il loro utilizzo.

Perché non posso semplicemente fare una regressione "normale" per ottenere i coefficienti βi di y=i=05βixi (insieme ai valori p e tutte le altre cose carine) e dovrei invece preoccuparmi se usare polinomi grezzi o ortogonali? Questa scelta mi sembra al di fuori dell'ambito di ciò che voglio fare.

Nel libro delle statistiche che sto attualmente leggendo (ISLR di Tibshirani et al) queste cose non sono state menzionate. In realtà, sono stati minimizzati in un certo senso.
Il motivo è, AFAIK, che nella lm()funzione in R, usando y ~ poly(x, 2)quantità per usare polinomi ortogonali e usando y ~ x + I(x^2)quantità per usare quelli grezzi. Ma a pagina 116 gli autori affermano che usiamo la prima opzione perché quest'ultima è "ingombrante" che non lascia alcuna indicazione del fatto che questi comandi in realtà su cose completamente diverse (e di conseguenza hanno output diversi).
(terza domanda) Perché gli autori di ISLR confonderebbero così i loro lettori?


1
@Sycorax So che polyha qualcosa a che fare con i polinomi ortogonali e io (x ^ 2) no (anche se non conosco i dettagli) - ma comunque, perché gli autori di ISLR raccomanderebbero un metodo che non funziona ? Sembra molto fuorviante se entrambi i comandi sembrano fare lo stesso, ma solo uno in realtà è ok.
l7ll7,

1
@gung Ho esaminato la documentazione polye ho già trascorso un po 'di tempo con questo problema, ma non riesco a capire perché poly (x, 2) e x + I (x ^ 2) facciano la differenza? Potresti per favore illuminarmi qui nei commenti, se la domanda è offtopica?
l7ll7,

1
@gung Ho fatto una completa modifica della mia domanda. Questa scelta grezza / ortogonale mi sta confondendo ancora di più - in precedenza pensavo che fosse solo un Rtecnicismo minore , che non capivo, ma ora sembra essere un problema stat completo che mi impedisce di programmare una regressione che non dovrebbe essere così difficile da programmare.
l7ll7,

2
@gung Questo in realtà mi ha confuso più di quanto abbia aiutato. In precedenza pensavo che avrei dovuto semplicemente seguire i polinomi ortogonali, perché sembrava essere la strada giusta, ma in quella risposta vengono utilizzati i polinomi grezzi. Sorprendentemente, tutti in rete stanno urlando "RTFM", ma in realtà non c'è una risposta chiara, quando usare cosa. (Anche il tuo link non fornisce una risposta a questo, solo un esempio, quando l'ortografia pol. Va male)
l7ll7

2
A meno che tu non stia lavorando in un dominio fisico o ingegneristico che afferma che la risposta sarà un polinomio quintico, quasi sicuramente l'approccio giusto non è quello di fare la regressione polinomiale in primo luogo. Investi i tuoi gradi di libertà in una spline o qualcosa che sarebbe molto più flessibile e stabile rispetto all'adattamento polinomiale.
whuber

Risposte:


10

Credo che la risposta sia meno sulla stabilità numerica (anche se questo ha un ruolo) e più sulla riduzione della correlazione.

In sostanza, il problema si riduce al fatto che quando regrediamo contro un gruppo di polinomi di alto ordine, le covariate contro cui stiamo regredendo diventano altamente correlate. Esempio di codice di seguito:

x = rnorm(1000)
raw.poly = poly(x,6,raw=T)
orthogonal.poly = poly(x,6)
cor(raw.poly)
cor(orthogonal.poly)

Questo è tremendamente importante. Man mano che le covariate diventano più correlate, la nostra capacità di determinare quali sono importanti (e quali sono le dimensioni dei loro effetti) si erode rapidamente. Questo è generalmente indicato come il problema della multicollinearità. Al limite, se avessimo due variabili che erano completamente correlate, quando le regrediamo contro qualcosa, è impossibile distinguere tra le due - puoi pensare a questa come una versione estrema del problema, ma questo problema influenza le nostre stime per anche minori gradi di correlazione. Quindi, in un vero senso - anche se l'instabilità numerica non era un problema - la correlazione dai polinomi di ordine superiore fa un danno enorme alle nostre routine di inferenza. Questo si manifesterà come errori standard più grandi (e quindi t-stats più piccoli) che altrimenti vedresti (vedi esempio di regressione di seguito).

y = x*2 + 5*x**3 - 3*x**2 + rnorm(1000)
raw.mod = lm(y~poly(x,6,raw=T))
orthogonal.mod = lm(y~poly(x,6))
summary(raw.mod)
summary(orthogonal.mod)

Se si esegue questo codice, l'interpretazione è un po 'difficile perché i coefficienti cambiano tutti e quindi le cose sono difficili da confrontare. Osservando le statistiche T, tuttavia, possiamo vedere che la capacità di determinare i coefficienti era MOLTO più grande con i polinomi ortogonali. Per i 3 coefficienti pertinenti, ho ottenuto t-stats di (560,21,449) per il modello ortogonale e solo (28, -38.121) per il modello polinomiale grezzo. Questa è una differenza enorme per un modello semplice con solo pochi termini polinomiali di ordine relativamente basso che contavano.

Ciò non significa che ciò avvenga senza costi. Ci sono due costi primari da tenere a mente. 1) perdiamo un po 'di interpretabilità con i polinomi ortogonali. Potremmo capire cosa x**3significhi il coefficiente , ma interpretare il coefficiente su x**3-3x(il terzo poli eremita - non necessariamente quello che userete) può essere molto più difficile. Secondo - quando diciamo che questi polinomi sono ortogonali - intendiamo che sono ortogonali rispetto a una certa misura della distanza. Scegliere una misura della distanza pertinente alla propria situazione può essere difficile. Tuttavia, detto ciò, credo che la polyfunzione sia progettata per scegliere in modo tale da essere ortogonale rispetto alla covarianza, il che è utile per le regressioni lineari.


3
-1. Gli errori standard più grandi che vedi sui coefficienti di ordine inferiore sono un'aringa rossa. I coefficienti di ordine inferiore nei due modelli stimano cose completamente diverse, quindi non ha senso confrontare i loro errori standard. Il coefficiente di ordine più alto è l'unico a stimare la stessa cosa in entrambi i modelli e vedrai che la statistica t è identica se i polinomi sono ortogonali o meno. I tuoi due modelli sono statisticamente equivalenti in termini di valori adattati, R ^ 2, ecc., Differiscono principalmente solo nell'interpretazione dei coefficienti
Jake Westfall

@JakeWestfall, non credo di essere d'accordo con te. Innanzitutto, l'esecuzione del codice produce valori diversi per tutti gli ordini polinomiali, non tutti ma uno - in sostanza prende il polinomio e fa PCA su di esso. In secondo luogo, e soprattutto, le t-stats sono sostanzialmente diverse - l'esecuzione del codice nella mia risposta lo confermerà - funzionalmente stiamo risolvendo il problema della multicollinearità. Hai ragione sul fatto che i valori adattati, R ^ 2, F-test ecc. Non cambiano. Questo in realtà è un motivo per ortogonalizzare - non cambia nulla tranne la nostra capacità di rilevare termini polinomiali .
user5957401

1
Ri: il primo punto, scusa, intendevo fare riferimento alla t-stat del termine di ordine più alto, non al suo coefficiente. Quel predittore viene ridimensionato + spostato tra i modelli, quindi sì, il coef cambia, ma verifica lo stesso effetto sostanziale, come mostrato da t
Jake Westfall,

Ri: il secondo punto, la ragione "le t-stats sono sostanzialmente diverse" per i termini di ordine inferiore è, ancora una volta, perché stanno stimando cose completamente diverse nei due modelli. Considera l'effetto lineare: in raw.modesso stima l'inclinazione della curva in x = 0, in orthogonal.modesso stima l'inclinazione marginale (cioè identica a lm(y ~ poly(x,1))dove vengono omessi termini di ordine superiore). Non vi è alcun motivo per cui le stime di questi stimandi completamente diversi dovrebbero avere errori standard comparabili. Si può facilmente costruire un contro-esempio in cui raw.modha t-stats molto più elevate
Jake Westfall,

@JakeWestfall. Penso ancora che ti stia perdendo la multicollinearità. Tuttavia, sembra che stiamo parlando l'uno accanto all'altro e forse c'è una soluzione. Dici che puoi facilmente costruire un contro-esempio, per favore fallo. Penso che vedere il dgp che hai in mente mi chiarirebbe molto. Al momento le uniche cose che sono stato in grado di escogitare che potrebbero comportarsi mentre descrivi riguardano una grave errata specificazione del modello.
user5957401

8

Perché non posso semplicemente fare una regressione "normale" per ottenere i coefficienti?

0.40.4000000059604644775390625

L'uso del polinomio grezzo causerà problemi perché avremo un numero enorme. Ecco una piccola dimostrazione: stiamo confrontando il numero di condizione della matrice con il polinomio grezzo e ortogonale.

> kappa(model.matrix(mpg~poly(wt,10),mtcars))
[1] 5.575962
> kappa(model.matrix(mpg~poly(wt,10, raw = T),mtcars))
[1] 2.119183e+13

Puoi anche controllare la mia risposta qui per un esempio.

Perché ci sono grandi coefficienti per il polinomio di ordine superiore


6
Sembra che tu stia usando dei galleggianti di precisione singoli e li citi per quadruplicare la precisione! Come è successo? Ad eccezione delle GPU, quasi tutti i calcoli statistici utilizzano almeno la doppia precisione. Ad esempio, Rnell'output di print(0.4, digits=20)is 0.40000000000000002.
whuber

6

Sento che molte di queste risposte mancano completamente il punto. La risposta di Haitao affronta i problemi computazionali nell'adattare i polinomi grezzi, ma è chiaro che OP sta chiedendo delle statistiche differenze tra i due approcci. Cioè, se avessimo un computer perfetto in grado di rappresentare esattamente tutti i valori, perché dovremmo preferire un approccio rispetto all'altro?

R2XYX=0X=0, otterresti esattamente la stessa pendenza ed errore standard, anche se il coefficiente e l'errore standard sul termine del primo ordine nella regressione polinomiale ortogonale sono completamente diversi dal suo valore nella regressione polinomiale grezza. Cioè, quando si cerca di ottenere le stesse quantità da entrambe le regressioni (cioè quantità che possono essere interpretate allo stesso modo), le stime e gli errori standard saranno identici. L'uso di polinomi ortogonali non significa che hai magicamente più sicurezza della pendenza diX

data("iris")

#Raw:
fit.raw <- lm(Petal.Length ~ Petal.Width + I(Petal.Width^2) +
                  I(Petal.Width^3), data = iris)
summary(fit.raw)

#> Coefficients:
#>                  Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)        1.1034     0.1304   8.464 2.50e-14 ***
#> Petal.Width        1.1527     0.5836   1.975  0.05013 .  
#> I(Petal.Width^2)   1.7100     0.5487   3.116  0.00221 ** 
#> I(Petal.Width^3)  -0.5788     0.1408  -4.110 6.57e-05 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.3898 on 146 degrees of freedom
#> Multiple R-squared:  0.9522, Adjusted R-squared:  0.9512 
#> F-statistic: 969.9 on 3 and 146 DF,  p-value: < 2.2e-16

#Orthogonal
fit.orth <- lm(Petal.Length ~ stats::poly(Petal.Width, 3), data = iris)

#Marginal effect of X at X=0 from orthogonal model
library(margins)
summary(margins(fit.orth, variables = "Petal.Width", 
                at = data.frame(Petal.Width = 0)))
#> Warning in check_values(data, at): A 'at' value for 'Petal.Width' is
#> outside observed data range (0.1,2.5)!
#>       factor Petal.Width    AME     SE      z      p  lower  upper
#>  Petal.Width      0.0000 1.1527 0.5836 1.9752 0.0482 0.0089 2.2965

Creato il 25-10-2019 dal pacchetto reprex (v0.3.0)

L'effetto marginale di Petal.Widtha 0 dall'adattamento ortogonale e il suo errore standard sono esattamente uguali a quelli dall'adattamento polinomiale grezzo. L'uso di polinomi ortogonali non migliora la precisione delle stime della stessa quantità tra i due modelli.

YXYX

library(jtools)
data("iris")

fit.raw3 <- lm(Petal.Length ~ Petal.Width + I(Petal.Width^2) +
                  I(Petal.Width^3), data = iris)
fit.raw1 <- lm(Petal.Length ~ Petal.Width, data = iris)

round(summ(fit.raw3, part.corr = T)$coef, 3)
#>                    Est.  S.E. t val.     p partial.r part.r
#> (Intercept)       1.103 0.130  8.464 0.000        NA     NA
#> Petal.Width       1.153 0.584  1.975 0.050     0.161  0.036
#> I(Petal.Width^2)  1.710 0.549  3.116 0.002     0.250  0.056
#> I(Petal.Width^3) -0.579 0.141 -4.110 0.000    -0.322 -0.074

round(summ(fit.raw1, part.corr = T)$coef, 3)
#>              Est.  S.E. t val. p partial.r part.r
#> (Intercept) 1.084 0.073 14.850 0        NA     NA
#> Petal.Width 2.230 0.051 43.387 0     0.963  0.963

fit.orth3 <- lm(Petal.Length ~ stats::poly(Petal.Width, 3), 
               data = iris)
fit.orth1 <- lm(Petal.Length ~ stats::poly(Petal.Width, 3)[,1], 
               data = iris)

round(summ(fit.orth3, part.corr = T)$coef, 3)
#>                                Est.  S.E.  t val. p partial.r part.r
#> (Intercept)                   3.758 0.032 118.071 0        NA     NA
#> stats::poly(Petal.Width, 3)1 20.748 0.390  53.225 0     0.975  0.963
#> stats::poly(Petal.Width, 3)2 -3.015 0.390  -7.735 0    -0.539 -0.140
#> stats::poly(Petal.Width, 3)3 -1.602 0.390  -4.110 0    -0.322 -0.074

round(summ(fit.orth1, part.corr = T)$coef, 3)
#>                                    Est.  S.E. t val. p partial.r part.r
#> (Intercept)                       3.758 0.039 96.247 0        NA     NA
#> stats::poly(Petal.Width, 3)[, 1] 20.748 0.478 43.387 0     0.963  0.963

Creato il 25-10-2019 dal pacchetto reprex (v0.3.0)

0.0010.0030.0050.9270.9270.0200.0050.927. Dal modello polinomiale ortogonale ma non dal modello polinomiale grezzo, sappiamo che la maggior parte della varianza spiegata nel risultato è dovuta al termine lineare, con pochissimo proveniente dal termine quadrato e ancor meno dal termine cubico. I valori polinomiali grezzi non raccontano quella storia.

Ora, se si desidera questo vantaggio interpretativo rispetto al vantaggio interpetazionale di essere effettivamente in grado di comprendere i coefficienti del modello, è necessario utilizzare i polinomi ortogonali. Se preferisci guardare i coefficienti e sapere esattamente cosa significano (anche se dubito che uno di solito lo faccia), allora dovresti usare i polinomi grezzi. Se non ti interessa (cioè, vuoi solo controllare per confondere o generare valori previsti), allora non importa davvero; entrambe le forme portano le stesse informazioni rispetto a tali obiettivi. Direi anche che i polinomi ortogonali dovrebbero essere preferiti nella regolarizzazione (ad esempio, lazo), poiché la rimozione dei termini di ordine superiore non influisce sui coefficienti dei termini di ordine inferiore, il che non è vero per i polinomi grezzi,


1
Ottimo contributo Non riesco a replicare i tuoi risultati marginali (la funzione margin fa apparire un errore su poly quando provo ad eseguire il tuo primo blocco di codice - non ho familiarità con il pacchetto margin) - ma sono esattamente quello che mi aspetto. Come piccolo suggerimento, è necessario includere anche l'output dell'analisi del margine sul modello non elaborato. Il tuo argomento è indebolito (leggermente) dalla modifica dei valori di p dal riepilogo alle funzioni di margine (cambiando le nostre conclusioni non meno!) - che sembra essere causato dall'uso di un normale invece che dalla distribuzione. Il tuo punto di regolarizzazione è eccellente.
user5957401

1
Grazie per le gentili parole. Penso che devi includere la stats::chiamata a poly()in lm()per marginsriconoscerlo (che è stupido). Volevo concentrare la mia argomentazione sulle stime puntuali e sugli errori standard e so che sono state presentate molte informazioni estranee e che distraggono, ma spero che il testo illustri i miei punti.
Noah,

Non è quello. Ho copiato esattamente il tuo codice e tu lo usi stats::poly(). L'errore dice 'degree' must be less than number of unique points: il che non mi aiuta molto. Tuttavia, margin()esegue il backup delle dichiarazioni verificabili, quindi non è importante.
user5957401

4

Conferma l'eccellente risposta di @ user5957401 e aggiungo commenti su interpolazione, estrapolazione e reportistica.

Anche nel dominio di valori di parametri stabili, i coefficienti / parametri modellati dai polinomi ortogonali avranno errori standard sostanzialmente inferiori rispetto ai coefficienti / parametri modellati dai parametri grezzi. In sostanza, i polinomi ortogonali sono una serie libera di descrittori a covarianza zero. Questo è PCA gratis!

L'unico potenziale svantaggio è doverlo spiegare a qualcuno che non capisce la virtù dei descrittori a covarianza zero. I coefficienti non sono immediatamente interpretabili nel contesto degli effetti del primo ordine (simili alla velocità) o del secondo ordine (simili all'accelerazione). Questo può essere abbastanza dannoso in un contesto aziendale.

10dR2adj R2

Quindi sarei "ordini di grandezza" più sicuri nel riferire il modello ortogonale rispetto a quello grezzo. In pratica, interpolerei con entrambi i modelli, ma estrapolerei solo con quello ortogonale.


1

Avrei solo commentato per menzionarlo, ma non ho abbastanza rappresentante, quindi proverò ad espandermi in una risposta. Potresti essere interessato a vedere che nella Sezione 7.8.1 del laboratorio in "Introduzione all'apprendimento statistico" (James et. Al., 2017, ottava stampa corretta), discutono alcune differenze tra l'uso di polinomi ortogonali o meno, che sta usando il raw=TRUEo raw=FALSEnella poly()funzione. Ad esempio, le stime dei coefficienti cambieranno, ma i valori adattati non:

# using the Wage dataset in the ISLR library
fit1 <- lm(wage ~ poly(age, 4, raw=FALSE), data=Wage)
fit2 <- lm(wage ~ poly(age, 4, raw=TRUE), data=Wage)
print(coef(fit1)) # coefficient estimates differ
print(coef(fit2))
all.equal(predict(fit1), predict(fit2)) #returns TRUE    

Il libro discute anche come quando vengono usati i polinomi ortogonali, i valori di p ottenuti usando il anova()test F annidato (per esplorare quale grado di polinomio potrebbe essere garantito) sono gli stessi di quelli ottenuti usando il test t standard, prodotti da summary(fit). Ciò dimostra che la statistica F è uguale al quadrato della statistica t in determinate situazioni.


I commenti non devono mai essere utilizzati come risposte indipendentemente dai numeri di reputazione.
Michael R. Chernick,

Per quanto riguarda il tuo ultimo punto, questo vale anche per i polinomi non ortogonali. Il coefficiente t-test è uguale al test F confrontando un modello con il coefficiente in esso e un modello senza per tutti i coefficienti in regressione (presi uno alla volta).
Noah,
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.