Vous pouvez rencontrer des problèmes avec vanilla PCA sur les coordonnées CLR. Il y a deux problèmes majeurs avec les données de composition:
- ils sont strictement non négatifs
- ils ont une contrainte de somme
xG(x)
x^={log(x1G(x)),…,log(xnG(x))}={log(x1)−log(G(x)),…,log(xn)−log(G(x))}
Maintenant, considérez que
log(G(x))=log(exp[1n∑i=1nlog(xi)])=E[log(x)]
∑x^=∑[log(x)−E[log(x)]]=0
En d'autres termes, CLR supprime la restriction de plage de valeurs (ce qui est bon pour certaines applications), mais ne supprime pas la contrainte de somme, résultant en une matrice de covariance singulière, qui casse effectivement (M) ANOVA / régression linéaire / ... et rend ACP sensible aux valeurs aberrantes (car une estimation de covariance robuste nécessite une matrice de rang complet). Pour autant que je sache, de toutes les transformations de composition, seul ILR traite les deux problèmes sans aucune hypothèse sous-jacente majeure. La situation est cependant un peu plus compliquée. Les coordonnées SVD des CLR vous donnent une base orthogonale dans l'espace ILR (les coordonnées ILR s'étendent sur un hyperplan en CLR), donc vos estimations de la variance ne différeront pas entre ILR et CLR (c'est bien sûr évident, car ILR et CLR sont des isométries sur le simplex). Il existe cependant des méthodes d'estimation de covariance robuste sur les coordonnées ILR [2].
Mettre à jour I
Juste pour illustrer que CLR n'est pas valide pour les méthodes de corrélation et de localisation. Supposons que nous échantillonnions une communauté de trois composants distribués normalement linéairement indépendants 100 fois. Par souci de simplicité, laissez tous les composants ont des attentes (100) et des variances (100) égales:
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
...: )
Mise à jour II
Compte tenu des réponses que j'ai reçues, je trouve nécessaire de souligner qu'à aucun moment dans ma réponse, je n'ai dit que PCA ne fonctionne pas sur les données transformées par CLR. J'ai déclaré que le CLR peut briser l'ACP de manière subtile , ce qui peut ne pas être important pour la réduction de la dimensionnalité, mais est important pour l'analyse des données exploratoires. L'article cité par @Archie couvre l'écologie microbienne. Dans ce domaine de la biologie computationnelle, l'ACP ou l'APCo sur diverses matrices de distance est utilisée pour explorer les sources de variation des données. Ma réponse ne doit être considérée que dans ce contexte. En outre, cela est souligné dans le document lui-même:
... Le biplot de composition [note: se référant à l'ACP] présente plusieurs avantages par rapport aux graphiques en coordonnées principales (PCoA) pour l'analyse de la diversité β. Les résultats obtenus sont très stables lorsque les données sont en sous-ensemble (Bian et al., 2017), ce qui signifie que l'analyse exploratoire n'est pas simplement motivée par les relations de présence-absence dans les données ni par la rareté excessive (Wong et al., 2016; Morton et al., 2017).
Gloor et al., 2017
Mise à jour III
Références supplémentaires aux recherches publiées (je remercie @Nick Cox pour la recommandation d'ajouter plus de références):
- Arguments contre l'utilisation de CLR pour PCA
- Arguments contre l'utilisation de CLR pour les méthodes basées sur la corrélation
- Introduction à l'ILR
clr
qui ...