Puede experimentar algunos problemas con PCA de vainilla en las coordenadas CLR. Hay dos problemas principales con los datos de composición:
- son estrictamente no negativos
- tienen una restricción de suma
Diversas transformaciones compositivas abordan uno o ambos de estos problemas. En particular, CLR transforma sus datos tomando el registro de la relación entre las frecuencias observadas x su media geométrica G(x) , es decir
x^={log(x1G(x)),…,log(xnG(x))}={log(x1)−log(G(x)),…,log(xn)−log(G(x))}
Ahora, considera eso
log(G(x))=log(exp[1n∑i=1nlog(xi)])=E[log(x)]
∑x^=∑[log(x)−E[log(x)]]=0
En otras palabras, CLR elimina la restricción del rango de valores (que es buena para algunas aplicaciones), pero no elimina la restricción de suma, lo que resulta en una matriz de covarianza singular, que efectivamente rompe (M) ANOVA / regresión lineal / ... y hace PCA sensible a los valores atípicos (porque la estimación de covarianza robusta requiere una matriz de rango completo). Hasta donde sé, de todas las transformaciones compositivas, solo ILR aborda ambos problemas sin ningún supuesto subyacente importante. Sin embargo, la situación es un poco más complicada. Las coordenadas SVD de CLR le brindan una base ortogonal en el espacio ILR (las coordenadas ILR abarcan un hiperplano en CLR), por lo que sus estimaciones de varianza no diferirán entre ILR y CLR (eso es obviamente obvio, porque ILR y CLR son isometrías en el simplex). Sin embargo, existen métodos para la estimación robusta de covarianza en las coordenadas ILR [2].
Actualización I
Solo para ilustrar que CLR no es válido para la correlación y los métodos dependientes de la ubicación. Supongamos que muestreamos una comunidad de tres componentes linealmente independientes distribuidos normalmente 100 veces. En aras de la simplicidad, deje que todos los componentes tengan las mismas expectativas (100) y variaciones (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
...: )
Actualización II
Teniendo en cuenta las respuestas que recibí, considero necesario señalar que en ningún momento de mi respuesta he dicho que PCA no funciona en datos transformados por CLR. He declarado que CLR puede romper PCA de maneras sutiles , lo que podría no ser importante para la reducción de la dimensionalidad, pero es importante para el análisis exploratorio de datos. El artículo citado por @Archie cubre la ecología microbiana. En ese campo de la biología computacional, PCA o PCoA en varias matrices de distancia se utilizan para explorar fuentes de variación en los datos. Mi respuesta solo debe considerarse en este contexto. Además, esto se destaca en el propio documento:
... El biplot composicional [nota: refiriéndose a PCA] tiene varias ventajas sobre los gráficos de coordenadas principales (PCoA) para el análisis de diversidad β. Los resultados obtenidos son muy estables cuando los datos están subconjuntos (Bian et al., 2017), lo que significa que el análisis exploratorio no se debe simplemente a las relaciones de ausencia de presencia en los datos ni a la escasez excesiva (Wong et al., 2016; Morton et al., 2017).
Gloor et al., 2017
Actualización III
Referencias adicionales a investigaciones publicadas (agradezco a @Nick Cox por la recomendación de agregar más referencias):
- Argumentos en contra del uso de CLR para PCA
- Argumentos en contra del uso de CLR para métodos basados en correlación
- Introducción a ILR
clr
hace ...