Come eseguire la regressione ortogonale (totali minimi quadrati) tramite PCA?


29

Uso sempre lm()in R per eseguire la regressione lineare di su . Tale funzione restituisce un coefficiente tale chex β y = β x .yxβ

y=βx.

Oggi ho imparato a conoscere i minimi quadrati totali e quella princomp()funzione (analisi dei componenti principali, PCA) può essere utilizzata per eseguirlo. Dovrebbe essere buono per me (più preciso). Ho fatto alcuni test usando princomp(), come:

r <- princomp( ~ x + y)

Il mio problema è: come interpretarne i risultati? Come posso ottenere il coefficiente di regressione? Per "coefficiente" intendo il numero che devo usare per moltiplicare il valore per dare un numero vicino a .x yβxy


Un momento ragazzi, sono un po 'confuso. guarda: zoonek2.free.fr/UNIX/48_R/09.html Questo si chiama PCA (Analisi dei componenti principali, alias "regressione ortogonale" o "somme perpendicolari di quadrati" o "minimi quadrati totali"), quindi penso che stiamo parlando su TLS con princomp () No?
Dail

No; queste sono due cose diverse, vedi l'articolo di Wikipedia su PCA. Il fatto che sia usato qui è un hack (non so quanto sia esatto, ma lo controllerò); ecco perché la complessa estrazione di coefficienti.

1
Una domanda correlata: stats.stackexchange.com/questions/2691/… e un post sul blog è referenziato da una delle risposte: cerebralmastication.com/2010/09/…
Jonathan

Risposte:


48

Minimi quadrati ordinari vs. minimi minimi totali

Consideriamo innanzitutto il caso più semplice di una sola variabile predittore (indipendente) . Per semplicità, lascia entrambi e essere centrata, cioè intercetta è sempre zero. La differenza tra regressione OLS standard e regressione TLS "ortogonale" è chiaramente indicata su questa figura (adattata da me) dalla risposta più popolare nel thread più popolare su PCA:x yxxy

OLS vs TLS

OLS si adatta all'equazione minimizzando le distanze al quadrato tra i valori osservati e i valori previsti . TLS si adatta alla stessa equazione minimizzando le distanze al quadrato tra i punti e la loro proiezione sulla linea. In questo caso più semplice la linea TLS è semplicemente il primo componente principale dei dati 2D. Per trovare , esegui PCA su punti, ovvero costruisci la matrice di covarianza e trova il suo primo autovettore ; quindi .y y ( x , y ) β ( x , y ) 2 × 2y=βxyy^(x,y)β(x,y)2×2Σv=(vx,vy)β=vy/vx

In Matlab:

 v = pca([x y]);    //# x and y are centered column vectors
 beta = v(2,1)/v(1,1);

In R:

 v <- prcomp(cbind(x,y))$rotation
 beta <- v[2,1]/v[1,1]

Tra l'altro, questo produrrà corretta pendenza anche se ed non sono stati centrati (perché funzioni incorporate PCA eseguire automaticamente centraggio). Per recuperare l'intercettazione, calcolare .xyβ0=y¯βx¯

OLS vs. TLS, regressione multipla

Data una variabile dipendente e molte variabili indipendenti (di nuovo, tutte centrate per semplicità), la regressione si adatta a un'equazioneOLS si adatta minimizzando gli errori al quadrato tra i valori osservati di e i valori previsti . TLS si adatta minimizzando le distanze al quadrato tra i punti osservati e i punti più vicini sul piano di regressione / iperpiano.yxi

y=β1x1++βpxp.
yy^(x,y)Rp+1

Nota che non esiste più una "linea di regressione"! L'equazione sopra specifica un iperpiano : è un piano 2D se ci sono due predittori, iperpiano 3D se ci sono tre predittori, ecc. Quindi la soluzione sopra non funziona: non possiamo ottenere la soluzione TLS prendendo solo il primo PC (che è una linea). Tuttavia, la soluzione può essere facilmente ottenuta tramite PCA.

Come prima, la PCA viene eseguita su punti. Questo rese autovettori in colonne di . I primi autovettori definiscono una iperpiano dimensionale di cui abbiamo bisogno; l'ultimo autovettore (numero ) è ortogonale ad esso. La domanda è: come trasformare la base di dato dai primi autovettori nelle coefficienti.(x,y)p+1VppHp+1vp+1Hpβ

Nota che se impostiamo per tutti e solo , allora , ovvero il vettore sta nella iperpiano . D'altra parte, sappiamo che è ortogonale ad esso. dire che il loro punto prodotto deve essere zero:xi=0ikxk=1y^=βk

(0,,1,,βk)H
H
vp+1=(v1,,vp+1)H
vk+βkvp+1=0βk=vk/vp+1.

In Matlab:

 v = pca([X y]);    //# X is a centered n-times-p matrix, y is n-times-1 column vector
 beta = -v(1:end-1,end)/v(end,end);

In R:

 v <- prcomp(cbind(X,y))$rotation
 beta <- -v[-ncol(v),ncol(v)] / v[ncol(v),ncol(v)]

Di nuovo, questo produrrà sci corrette anche se ed non fosse centrato (perché funzioni incorporate PCA eseguire automaticamente centraggio). Per recuperare l'intercettazione, calcolare .xyβ0=y¯x¯β

Come controllo di integrità, notare che questa soluzione coincide con la precedente nel caso di un solo predittore . In effetti, quindi lo spazio è 2D, e quindi, dato che il primo autovettore PCA è ortogonale al secondo (ultimo), .x(x,y)vy(1)/vx(1)=vx(2)/vy(2)

Soluzione a forma chiusa per TLS

Sorprendentemente, si scopre che esiste un'equazione in forma chiusa per . L'argomento che segue è tratto dal libro di Sabine van Huffel "I minimi quadrati totali" (sezione 2.3.2).β

Consenti a e essere le matrici di dati centrate. L'ultimo autovettore PCA è un autovettore della matrice di covarianza di con un autovalore . Se si tratta di un autovettore, allora lo è anche . Annotare l'equazione di autovettore: Xyvp+1[Xy]σp+12vp+1/vp+1=(β1)

(XXXyyXyy)(β1)=σp+12(β1),
e calcolando il prodotto a sinistra, otteniamo immediatamente quel che ricorda fortemente l'espressione OLS familiare
βTLS=(XXσp+12I)1Xy,
βOLS=(XX)1Xy.

Regressione multipla multivariata

La stessa formula può essere generalizzata al caso multivariato, ma anche per definire cosa fa il TLS multivariato, richiederebbe un po 'di algebra. Vedi Wikipedia su TLS . La regressione OLS multivariata equivale a un gruppo di regressioni OLS univariate per ogni variabile dipendente, ma nel caso TLS non è così.


1
Non conosco R, ma volevo comunque fornire frammenti R per riferimento futuro. Ci sono molte persone qui competenti in R. Per favore sentiti libero di modificare i miei frammenti se necessario! Grazie.
ameba dice di reintegrare Monica il

Bel post, ma se posso chiedere cosa garantisce il fatto che il vettore trova nell'iperpiano? (0,,1,,βk)
JohnK,

@JohnK, non sono sicuro di cosa non sia chiaro. Come ho scritto, lascia che sia uguale a zero a parte . Quindi se lo inserisci in , otterrai . Quindi il punto trova sull'iperpiano definito dall'equazione . xixk=1y=βjxjy=βk1=βk(0,,1,βk)y=βjxj
ameba dice Ripristina Monica il

Mi sembra di aver letto male quella parte, ma ora è chiaro. Grazie anche per il chiarimento.
JohnK,

2
In R, potresti preferire "eigen (cov (cbind (x, y))) $ vettori" rispetto a "prcomp (cbind (x, y)) $ rotazione" perché il primo è molto più veloce per i vettori più grandi.
Thomas Browne,

9

Sulla base dell'implementazione ingenua di GNU Octave trovata qui , qualcosa come questo potrebbe (granello di sale, è tardi) funzionare.

tls <- function(A, b){

  n <- ncol(A)
  C <- cbind(A, b)

  V <- svd(C)$v
  VAB <- V[1:n, (n+1):ncol(V)]
  VBB <- V[(n+1):nrow(V), (n+1):ncol(V)]
  return(-VAB/VBB)
}

4

princompsta eseguendo l' analisi dei componenti principali anziché la regressione dei minimi quadrati totali. Per quanto ne so non esiste alcuna funzione R né pacchetto che faccia TLS; al massimo c'è una regressione Deming in MethComp .
Tuttavia, ti preghiamo di considerare questo come un suggerimento che molto probabilmente non ne vale la pena.


Pensavo che Deming nel pacchetto MethComp fosse TLS: qual è la differenza?
mark999,

Devi dargli il rapporto degli errori su xey; TLS puro lo ottimizza.
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.