Você pode ter alguns problemas com o baunilha PCA nas coordenadas CLR. Existem dois grandes problemas com dados de composição:
- eles são estritamente não negativos
- eles têm uma restrição de soma
Várias transformações composicionais abordam um ou ambos esses problemas. Em particular, o CLR transforma seus dados registrando a razão entre as frequências observadas x e sua média geométrica G(x) , ou seja,
x^={log(x1G(x)),…,log(xnG(x))}={log(x1)−log(G(x)),…,log(xn)−log( G (x))}
Agora, considere isso
registro( G ( x ) ) = log( exp[ 1n∑i = 1nregistro( xEu) ] )= E[log( x ) ]
∑ x^= ∑ [ log( x ) - E[ log( x ) ] ] =0
Em outras palavras, o CLR remove a restrição do intervalo de valores (o que é bom para algumas aplicações), mas não remove a restrição de soma, resultando em uma matriz de covariância singular, que efetivamente quebra (M) ANOVA / regressão linear / ... e faz PCA sensível a valores discrepantes (porque a estimativa robusta de covariância requer uma matriz de classificação completa). Até onde eu sei, em todas as transformações composicionais, apenas o ILR aborda os dois problemas sem nenhuma suposição subjacente importante. A situação é um pouco mais complicada, no entanto. O SVD das coordenadas CLR fornece uma base ortogonal no espaço ILR (as coordenadas ILR abrangem um hiperplano no CLR); portanto, suas estimativas de variância não diferem entre ILR e CLR (isso é obviamente óbvio, porque ILR e CLR são isometrias no simplex). No entanto, existem métodos para estimativa robusta de covariância nas coordenadas de ILR [2].
Atualização I
Apenas para ilustrar que o CLR não é válido para métodos dependentes de correlação e localização. Vamos supor que amostramos uma comunidade de três componentes normalmente distribuídos linearmente independentes 100 vezes. Por uma questão de simplicidade, permita que todos os componentes tenham expectativas iguais (100) e variações (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
...: )
Atualização II
Considerando as respostas que recebi, acho necessário salientar que em nenhum momento da minha resposta eu disse que o PCA não funciona em dados transformados em CLR. Afirmei que o CLR pode quebrar o PCA de maneiras sutis , o que pode não ser importante para a redução da dimensionalidade, mas é importante para a análise exploratória de dados. O artigo citado por @Archie cobre a ecologia microbiana. Nesse campo da biologia computacional, PCA ou PCoA em várias matrizes de distância são usados para explorar fontes de variação nos dados. Minha resposta deve ser considerada apenas neste contexto. Além disso, isso é destacado no próprio artigo:
... O biplot composicional [nota: referente ao PCA] possui várias vantagens sobre os gráficos de coordenadas principais (PCoA) para análise de diversidade β. Os resultados obtidos são muito estáveis quando os dados são subconjuntos (Bian et al., 2017), o que significa que a análise exploratória não é conduzida simplesmente pelas relações de ausência de presença nos dados nem pela escarsidade excessiva (Wong et al., 2016; Morton et al. , 2017).
Gloor et al., 2017
Atualização III
Referências adicionais à pesquisa publicada (agradeço a @Nick Cox pela recomendação de adicionar mais referências):
- Argumentos contra o uso do CLR para PCA
- Argumentos contra o uso de CLR para métodos baseados em correlação
- Introdução ao ILR
clr
faz ....