Potrebbero verificarsi alcuni problemi con PCA vaniglia sulle coordinate CLR. Esistono due problemi principali con i dati di composizione:
- sono rigorosamente non negativi
- hanno un vincolo di somma
Varie trasformazioni compositive affrontano uno o entrambi questi problemi. In particolare, CLR trasforma i tuoi dati prendendo il registro del rapporto tra le frequenze osservate x e la loro media geometrica G(x) , cioè
x^={log(x1G(x)),…,log(xnG(x))}={log(x1)−log(G(x)),…,log(xn)−log(G(x))}
Ora, consideralo
log(G(x))=log(exp[1n∑i=1nlog(xi)])=E[log(x)]
∑x^=∑[log(x)−E[log(x)]]=0
In altre parole, CLR rimuove la restrizione dell'intervallo di valori (che è buono per alcune applicazioni), ma non rimuove il vincolo di somma, risultando in una matrice di covarianza singolare, che rompe effettivamente (M) ANOVA / regressione lineare / ... e rende PCA sensibile ai valori anomali (poiché una solida stima della covarianza richiede una matrice full-rank). Per quanto ne so, di tutte le trasformazioni compositive solo l'ILR affronta entrambe le questioni senza ipotesi di fondo. La situazione è un po 'più complicata, però. SVD delle coordinate CLR ti fornisce una base ortogonale nello spazio ILR (le coordinate ILR coprono un iperpiano in CLR), quindi le tue stime di varianza non differiranno tra ILR e CLR (questo è ovviamente ovvio, perché sia ILR che CLR sono isometrie sulla simplex). Esistono, tuttavia, metodi per la stima robusta della covarianza sulle coordinate ILR [2].
Aggiornamento I.
Giusto per illustrare che CLR non è valido per i metodi di correlazione e dipendenti dalla posizione. Supponiamo di campionare 100 volte una comunità di tre componenti distribuiti normalmente linearmente indipendenti. Per semplicità, lascia che tutti i componenti abbiano pari aspettative (100) e varianze (100):
In [1]: import numpy as np
In [2]: from scipy.stats import linregress
In [3]: from scipy.stats.mstats import gmean
In [4]: def clr(x):
...: return np.log(x) - np.log(gmean(x))
...:
In [5]: nsamples = 100
In [6]: samples = np.random.multivariate_normal(
...: mean=[100]*3, cov=np.eye(3)*100, size=nsamples
...: ).T
In [7]: transformed = clr(samples)
In [8]: np.corrcoef(transformed)
Out[8]:
array([[ 1. , -0.59365113, -0.49087714],
[-0.59365113, 1. , -0.40968767],
[-0.49087714, -0.40968767, 1. ]])
In [9]: linregress(transformed[0], transformed[1])
Out[9]: LinregressResult(
...: slope=-0.5670, intercept=-0.0027, rvalue=-0.5936,
...: pvalue=7.5398e-11, stderr=0.0776
...: )
Aggiornamento II
Considerando le risposte che ho ricevuto, trovo necessario sottolineare che in nessun momento della mia risposta ho detto che PCA non funziona su dati trasformati con CLR. Ho affermato che CLR può interrompere la PCA in modi sottili , il che potrebbe non essere importante per la riduzione della dimensionalità, ma è importante per l'analisi dei dati esplorativi. L'articolo citato da @Archie tratta l'ecologia microbica. In quel campo della biologia computazionale, PCA o PCoA su varie matrici a distanza vengono utilizzati per esplorare le fonti di variazione dei dati. La mia risposta dovrebbe essere considerata solo in questo contesto. Inoltre, questo è evidenziato nel documento stesso:
... Il biplot compositivo [nota: riferendosi alla PCA] presenta numerosi vantaggi rispetto ai principali grafici coordinati (PCoA) per l'analisi della β-diversità. I risultati ottenuti sono molto stabili quando i dati sono un sottoinsieme (Bian et al., 2017), il che significa che l' analisi esplorativa non è guidata semplicemente dalle relazioni di assenza di presenza nei dati né da eccessiva scarsità (Wong et al., 2016; Morton et al., 2017).
Gloor et al., 2017
Aggiornamento III
Ulteriori riferimenti alla ricerca pubblicata (ringrazio @ Nick Cox per la raccomandazione di aggiungere altri riferimenti):
- Argomenti contro l'utilizzo di CLR per PCA
- Argomenti contro l'utilizzo di CLR per metodi basati sulla correlazione
- Introduzione a ILR
clr
fa ....