Come menzionato da @amoeba nei commenti, PCA esaminerà solo un insieme di dati e mostrerà i principali modelli (lineari) di variazione in tali variabili, le correlazioni o le covarianze tra tali variabili e le relazioni tra i campioni (le righe ) nel tuo set di dati.
C a2 +
0,5 × p H + 1,4 × C a2 ++ 0,1 × T o t a l C a r b o n
e il secondo componente
2,7 × p H + 0,3 × C a2 +- 5,6 × T o t a l C a r b o n
Questi componenti sono liberamente selezionabili tra le variabili misurate e vengono scelti quelli che spiegano in sequenza la maggiore quantità di variazione nel set di dati e che ogni combinazione lineare è ortogonale (non correlata con) le altre.
In un'ordinazione vincolata, abbiamo due set di dati, ma non siamo liberi di selezionare le combinazioni lineari del primo set di dati (i dati di chimica del suolo sopra) che desideriamo. Invece dobbiamo selezionare combinazioni lineari delle variabili nel secondo set di dati che spiegano meglio la variazione nel primo. Inoltre, nel caso di PCA, un unico set di dati è la matrice di risposta e non ci sono predittori (si potrebbe pensare alla risposta come a prevedere se stessa). Nel caso vincolato, abbiamo un set di dati di risposta che desideriamo spiegare con un set di variabili esplicative.
Anche se non hai spiegato quali variabili sono la risposta, normalmente si desidera spiegare la variazione delle abbondanze o della composizione di quelle specie (cioè le risposte) usando le variabili esplicative ambientali.
La versione vincolata di PCA è una cosa chiamata Analisi di ridondanza (RDA) nei circoli ecologici. Questo presuppone un modello di risposta lineare sottostante per la specie, che non è appropriato o è appropriato solo se si hanno brevi gradienti lungo i quali la specie risponde.
Un'alternativa alla PCA è una cosa chiamata analisi della corrispondenza (CA). Questo non è vincolato ma ha un modello di risposta unimodale sottostante, che è un po 'più realistico in termini di come le specie rispondono su pendenze più lunghe. Si noti inoltre che CA modella le abbondanze o la composizione relative , mentre la PCA modella le abbondanze grezze.
Esiste una versione vincolata di CA, nota come analisi di corrispondenza vincolata o canonica (CCA) - da non confondere con un modello statistico più formale noto come analisi di correlazione canonica.
Sia in RDA che in CCA l'obiettivo è quello di modellare la variazione nell'abbondanza o composizione delle specie come una serie di combinazioni lineari delle variabili esplicative.
Dalla descrizione sembra che tua moglie voglia spiegare la variazione nella composizione (o abbondanza) delle specie di millepiedi in termini di altre variabili misurate.
Alcune parole di avvertimento; RDA e CCA sono solo regressioni multivariate; CCA è solo una regressione multivariata ponderata. Tutto ciò che hai appreso sulla regressione si applica e ci sono anche un paio di altri aspetti:
- man mano che aumenti il numero di variabili esplicative, i vincoli in realtà diventano sempre meno e non stai realmente estraendo componenti / assi che spiegano la composizione delle specie in modo ottimale, e
- con CCA, quando si aumenta il numero di fattori esplicativi, si rischia di indurre un artefatto di una curva nella configurazione dei punti nel diagramma CCA.
- la teoria alla base di RDA e CCA è meno sviluppata rispetto a metodi statistici più formali. Possiamo solo ragionevolmente scegliere quali variabili esplicative continuare a usare la selezione graduale (che non è l'ideale per tutti i motivi per cui non ci piace come metodo di selezione in regressione) e per fare ciò dobbiamo usare i test di permutazione.
quindi il mio consiglio è lo stesso della regressione; pensa in anticipo quali sono le tue ipotesi e includi le variabili che riflettono tali ipotesi. Non buttare nel mix tutte le variabili esplicative.
Esempio
Ordinazione non vincolata
PCA
Mostrerò un esempio confrontando PCA, CA e CCA usando il pacchetto vegan per R che aiuto a mantenere e che è progettato per adattarsi a questi tipi di metodi di ordinazione:
library("vegan") # load the package
data(varespec) # load example data
## PCA
pcfit <- rda(varespec)
## could add `scale = TRUE` if variables in different units
pcfit
> pcfit
Call: rda(X = varespec)
Inertia Rank
Total 1826
Unconstrained 1826 23
Inertia is variance
Eigenvalues for unconstrained axes:
PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8
983.0 464.3 132.3 73.9 48.4 37.0 25.7 19.7
(Showed only 8 of all 23 unconstrained eigenvalues)
il vegano non standardizza l'inerzia, a differenza di Canoco, quindi la varianza totale è 1826 e gli autovalori sono in quelle stesse unità e si sommano al 1826
> cumsum(eigenvals(pcfit))
PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8
982.9788 1447.2829 1579.5334 1653.4670 1701.8853 1738.8947 1764.6209 1784.3265
PC9 PC10 PC11 PC12 PC13 PC14 PC15 PC16
1796.6007 1807.0361 1816.3869 1819.1853 1821.5128 1822.9045 1824.1103 1824.9250
PC17 PC18 PC19 PC20 PC21 PC22 PC23
1825.2563 1825.4429 1825.5495 1825.6131 1825.6383 1825.6548 1825.6594
Vediamo anche che il primo autovalore è circa la metà della varianza e con i primi due assi abbiamo spiegato ~ 80% della varianza totale
> head(cumsum(eigenvals(pcfit)) / pcfit$tot.chi)
PC1 PC2 PC3 PC4 PC5 PC6
0.5384240 0.7927453 0.8651851 0.9056821 0.9322031 0.9524749
Un biplot può essere estratto dai punteggi dei campioni e delle specie sui primi due componenti principali
> plot(pcfit)
Ci sono due problemi qui
- L'ordinazione è essenzialmente dominata da tre specie - queste specie si trovano più lontane dall'origine - in quanto si tratta dei taxa più abbondanti nel set di dati
- C'è un forte arco di curva nell'ordinazione, che suggerisce un gradiente singolo lungo o dominante che è stato scomposto nei due principali componenti principali per mantenere le proprietà metriche dell'ordinazione.
circa
Una CA può aiutare con entrambi questi punti poiché gestisce meglio il gradiente lungo grazie al modello di risposta unimodale e modella la composizione relativa delle specie e non le abbondanze grezze.
Il codice vegan / R per fare questo è simile al codice PCA usato sopra
cafit <- cca(varespec)
cafit
> cafit <- cca(varespec)
> cafit
Call: cca(X = varespec)
Inertia Rank
Total 2.083
Unconstrained 2.083 23
Inertia is mean squared contingency coefficient
Eigenvalues for unconstrained axes:
CA1 CA2 CA3 CA4 CA5 CA6 CA7 CA8
0.5249 0.3568 0.2344 0.1955 0.1776 0.1216 0.1155 0.0889
(Showed only 8 of all 23 unconstrained eigenvalues)
Qui spieghiamo circa il 40% della variazione tra i siti nella loro relativa composizione
> head(cumsum(eigenvals(cafit)) / cafit$tot.chi)
CA1 CA2 CA3 CA4 CA5 CA6
0.2519837 0.4232578 0.5357951 0.6296236 0.7148866 0.7732393
Il diagramma congiunto delle specie e dei punteggi dei siti è ora meno dominato da alcune specie
> plot(cafit)
Quale PCA o CA si sceglie dovrebbe essere determinato dalle domande che si desidera porre dei dati. Di solito con i dati sulle specie siamo più spesso interessati alla differenza nella suite di specie, quindi CA è una scelta popolare. Se avessimo un set di dati di variabili ambientali, diciamo chimica dell'acqua o del suolo, non ci aspetteremmo che rispondano in modo unimodale lungo i gradienti, quindi CA sarebbe inappropriato e PCA (di una matrice di correlazione, usando scale = TRUE
nella rda()
chiamata) sarebbe più appropriato.
Ordinazione vincolata; CCA
Ora, se abbiamo una seconda serie di dati che desideriamo utilizzare per spiegare i modelli nella prima serie di dati sulle specie, dobbiamo usare un'ordinazione vincolata. Spesso la scelta qui è CCA, ma RDA è un'alternativa, così come RDA dopo la trasformazione dei dati per consentirle di gestire meglio i dati delle specie.
data(varechem) # load explanatory example data
Riutilizziamo la cca()
funzione ma forniamo due frame di dati ( X
per specie e Y
per variabili esplicative / predittive) o una formula di modello che elenca la forma del modello che desideriamo adattare.
Per includere tutte le variabili che potremmo usare varechem ~ ., data = varechem
come formula per includere tutte le variabili, ma come ho detto sopra, questa non è una buona idea in generale
ccafit <- cca(varespec ~ ., data = varechem)
> ccafit
Call: cca(formula = varespec ~ N + P + K + Ca + Mg + S + Al + Fe + Mn +
Zn + Mo + Baresoil + Humdepth + pH, data = varechem)
Inertia Proportion Rank
Total 2.0832 1.0000
Constrained 1.4415 0.6920 14
Unconstrained 0.6417 0.3080 9
Inertia is mean squared contingency coefficient
Eigenvalues for constrained axes:
CCA1 CCA2 CCA3 CCA4 CCA5 CCA6 CCA7 CCA8 CCA9 CCA10 CCA11
0.4389 0.2918 0.1628 0.1421 0.1180 0.0890 0.0703 0.0584 0.0311 0.0133 0.0084
CCA12 CCA13 CCA14
0.0065 0.0062 0.0047
Eigenvalues for unconstrained axes:
CA1 CA2 CA3 CA4 CA5 CA6 CA7 CA8 CA9
0.19776 0.14193 0.10117 0.07079 0.05330 0.03330 0.01887 0.01510 0.00949
Il triplot dell'ordinazione sopra è prodotto usando il plot()
metodo
> plot(ccafit)
Certo, ora il compito è capire quale di queste variabili sia effettivamente importante. Si noti inoltre che abbiamo spiegato circa 2/3 della varianza delle specie usando solo 13 variabili. uno dei problemi dell'utilizzo di tutte le variabili in questa ordinazione è che abbiamo creato una configurazione ad arco nei punteggi dei campioni e delle specie, che è puramente un artefatto dell'utilizzo di troppe variabili correlate.
Se vuoi saperne di più, consulta la documentazione vegana o un buon libro sull'analisi multivariata dei dati ecologici.
Rapporto con regressione
È più semplice illustrare il collegamento con RDA, ma CCA è lo stesso, tranne per il fatto che tutto comprende somme marginali a due vie della riga e della colonna come pesi.
Al suo centro, RDA è equivalente all'applicazione di PCA a una matrice di valori adattati da una regressione lineare multipla adattata ai valori di ciascuna specie (risposta) (abbondanza, diciamo) con predittori forniti dalla matrice di variabili esplicative.
In R possiamo farlo come
## centre the responses
spp <- scale(data.matrix(varespec), center = TRUE, scale = FALSE)
## ...and the predictors
env <- as.data.frame(scale(varechem, center = TRUE, scale = FALSE))
## fit a linear model to each column (species) in spp.
## Suppress intercept as we've centred everything
fit <- lm(spp ~ . - 1, data = env)
## Collect fitted values for each species and do a PCA of that
## matrix
pclmfit <- prcomp(fitted(fit))
Gli autovalori per questi due approcci sono uguali:
> (eig1 <- unclass(unname(eigenvals(pclmfit)[1:14])))
[1] 820.1042107 399.2847431 102.5616781 47.6316940 26.8382218 24.0480875
[7] 19.0643756 10.1669954 4.4287860 2.2720357 1.5353257 0.9255277
[13] 0.7155102 0.3118612
> (eig2 <- unclass(unname(eigenvals(rdafit, constrained = TRUE))))
[1] 820.1042107 399.2847431 102.5616781 47.6316940 26.8382218 24.0480875
[7] 19.0643756 10.1669954 4.4287860 2.2720357 1.5353257 0.9255277
[13] 0.7155102 0.3118612
> all.equal(eig1, eig2)
[1] TRUE
Per qualche ragione non riesco a far corrispondere i punteggi degli assi (caricamenti), ma invariabilmente questi sono ridimensionati (o meno), quindi devo esaminare esattamente come vengono eseguiti qui.
Non eseguiamo l'RDA tramite rda()
come ho mostrato con lm()
ecc., Ma utilizziamo una decomposizione QR per la parte del modello lineare e quindi SVD per la parte PCA. Ma i passaggi essenziali sono gli stessi.