La domanda è "identificare le relazioni [lineari] sottostanti" tra le variabili.
Il modo rapido e semplice per rilevare le relazioni è regredire qualsiasi altra variabile (usare una costante, anche) rispetto a quelle variabili usando il tuo software preferito: qualsiasi buona procedura di regressione rileverà e diagnosticherà la collinearità. (Non ti preoccuperai nemmeno di guardare i risultati della regressione: stiamo solo facendo affidamento su un utile effetto collaterale di impostare e analizzare la matrice di regressione.)
Supponendo che venga rilevata la collinearità, tuttavia, quale sarà il prossimo? L'analisi dei componenti principali (PCA) è esattamente ciò che è necessario: i suoi componenti più piccoli corrispondono a relazioni quasi lineari. Queste relazioni possono essere lette direttamente dai "caricamenti", che sono combinazioni lineari delle variabili originali. I piccoli carichi (cioè quelli associati a piccoli autovalori) corrispondono a quasi collinearità. Un autovalore di corrisponderebbe a una relazione lineare perfetta. Autovalori leggermente più grandi che sono ancora molto più piccoli del più grande corrisponderebbero a relazioni lineari approssimative.0
(C'è un'arte e molta letteratura associata all'identificazione di cosa sia un "piccolo" caricamento. Per modellare una variabile dipendente, suggerirei di includerla all'interno delle variabili indipendenti nel PCA al fine di identificare i componenti, indipendentemente da le loro dimensioni - in cui la variabile dipendente svolge un ruolo importante. Da questo punto di vista, "piccolo" significa molto più piccolo di qualsiasi componente del genere.)
Diamo un'occhiata ad alcuni esempi. (Utilizzati R
per i calcoli e la stampa.) Inizia con una funzione per eseguire PCA, cercare piccoli componenti, tracciarli e restituire le relazioni lineari tra loro.
pca <- function(x, threshold, ...) {
fit <- princomp(x)
#
# Compute the relations among "small" components.
#
if(missing(threshold)) threshold <- max(fit$sdev) / ncol(x)
i <- which(fit$sdev < threshold)
relations <- fit$loadings[, i, drop=FALSE]
relations <- round(t(t(relations) / apply(relations, 2, max)), digits=2)
#
# Plot the loadings, highlighting those for the small components.
#
matplot(x, pch=1, cex=.8, col="Gray", xlab="Observation", ylab="Value", ...)
suppressWarnings(matplot(x %*% relations, pch=19, col="#e0404080", add=TRUE))
return(t(relations))
}
Appliciamo questo ad alcuni dati casuali. Questi sono costruiti su quattro variabili (la ed E della domanda). Ecco una piccola funzione per calcolare A come una data combinazione lineare delle altre. Aggiunge quindi i valori normalmente distribuiti a tutte e cinque le variabili (per vedere quanto bene la procedura esegue quando la multicollinearità è solo approssimativa e non esatta).B,C,D,EA
process <- function(z, beta, sd, ...) {
x <- z %*% beta; colnames(x) <- "A"
pca(cbind(x, z + rnorm(length(x), sd=sd)), ...)
}
Siamo pronti a partire: resta solo da generare e applicare queste procedure. Uso i due scenari descritti nella domanda: A = B + C + D + E (più alcuni errori in ciascuno) e A = B + ( C + D ) / 2 + E (più alcuni errori in ciascuno). In primo luogo, tuttavia, si noti che la PCA viene quasi sempre applicata ai dati centrati , quindi questi dati simulati vengono centrati (ma non altrimenti riscalati) utilizzando .B,…,EA=B+C+D+EA=B+(C+D)/2+Esweep
n.obs <- 80 # Number of cases
n.vars <- 4 # Number of independent variables
set.seed(17)
z <- matrix(rnorm(n.obs*(n.vars)), ncol=n.vars)
z.mean <- apply(z, 2, mean)
z <- sweep(z, 2, z.mean)
colnames(z) <- c("B","C","D","E") # Optional; modify to match `n.vars` in length
B,…,EA
L'output associato al pannello in alto a sinistra era
A B C D E
Comp.5 1 -1 -1 -1 -1
00≈A−B−C−D−E
L'output per il pannello centrale superiore era
A B C D E
Comp.5 1 -0.95 -1.03 -0.98 -1.02
(A,B,C,D,E)
A B C D E
Comp.5 1 -1.33 -0.77 -0.74 -1.07
A′=B′+C′+D′+E′
1,1/2,1/2,1
In pratica, spesso non è possibile individuare una variabile come una combinazione ovvia delle altre: tutti i coefficienti possono avere dimensioni comparabili e segni diversi. Inoltre, quando esiste più di una dimensione delle relazioni, non esiste un modo unico per specificarle: sono necessarie ulteriori analisi (come la riduzione delle righe) per identificare una base utile per tali relazioni. È così che funziona il mondo: tutto ciò che puoi dire è che queste combinazioni particolari che sono prodotte da PCA corrispondono a quasi nessuna variazione nei dati. Per far fronte a questo, alcune persone usano i componenti più grandi ("principali") direttamente come variabili indipendenti nella regressione o nell'analisi successiva, qualunque sia la forma che potrebbe assumere. Se lo fai, non dimenticare prima di rimuovere la variabile dipendente dall'insieme di variabili e ripetere il PCA!
Ecco il codice per riprodurre questa figura:
par(mfrow=c(2,3))
beta <- c(1,1,1,1) # Also can be a matrix with `n.obs` rows: try it!
process(z, beta, sd=0, main="A=B+C+D+E; No error")
process(z, beta, sd=1/10, main="A=B+C+D+E; Small error")
process(z, beta, sd=1/3, threshold=2/3, main="A=B+C+D+E; Large error")
beta <- c(1,1/2,1/2,1)
process(z, beta, sd=0, main="A=B+(C+D)/2+E; No error")
process(z, beta, sd=1/10, main="A=B+(C+D)/2+E; Small error")
process(z, beta, sd=1/3, threshold=2/3, main="A=B+(C+D)/2+E; Large error")
(Ho dovuto armeggiare con la soglia nei casi di errore di grandi dimensioni per visualizzare solo un singolo componente: questa è la ragione per fornire questo valore come parametro a process
.)
L'utente ttnphns ha gentilmente indirizzato la nostra attenzione su un thread strettamente correlato. Una delle sue risposte (di JM) suggerisce l'approccio descritto qui.