У вас могут возникнуть проблемы с ванильным PCA по координатам CLR. Есть две основные проблемы с композиционными данными:
- они строго неотрицательны
- у них есть ограничение по сумме
xG(x)
x^={log(x1G(x)),…,log(xnG(x))}={log(x1)−log(G(x)),…,log(xn)−log(G(x))}
Теперь посмотрим, что
log(G(x))=log(exp[1n∑i=1nlog(xi)])=E[log(x)]
∑x^=∑[log(x)−E[log(x)]]=0
Другими словами, CLR снимает ограничение диапазона значений (что хорошо для некоторых приложений), но не снимает ограничение суммы, что приводит к сингулярной ковариационной матрице, которая эффективно нарушает (M) ANOVA / линейную регрессию / ... и делает PCA чувствителен к выбросам (потому что для надежной оценки ковариации требуется матрица полного ранга). Насколько я знаю, из всех композиционных преобразований только ILR решает обе проблемы без каких-либо серьезных базовых допущений. Однако ситуация немного сложнее. SVD координат CLR дает вам ортогональный базис в пространстве ILR (координаты ILR охватывают гиперплоскость в CLR), поэтому ваши оценки дисперсии не будут различаться между ILR и CLR (что, конечно, очевидно, поскольку и ILR, и CLR являются изометриями на симплекс). Однако существуют методы для надежной оценки ковариации по координатам ILR [2].
Обновить я
Просто чтобы проиллюстрировать, что CLR не подходит для методов корреляции и определения местоположения. Предположим, мы 100 раз отобрали сообщество из трех линейно независимых нормально распределенных компонентов. Для простоты, пусть все компоненты имеют равные ожидания (100) и отклонения (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
...: )
Обновление II
Учитывая полученные ответы, я считаю необходимым указать, что ни в одном из своих ответов я не сказал, что PCA не работает с данными, преобразованными в CLR. Я заявлял, что CLR может тонко разрушать PCA , что, возможно, не важно для уменьшения размерности, но важно для анализа поисковых данных. Статья, цитируемая @Archie, посвящена микробной экологии. В этой области вычислительной биологии PCA или PCoA на различных матрицах расстояний используются для изучения источников изменения данных. Мой ответ следует рассматривать только в этом контексте. Более того, это подчеркивается в самой статье:
... Композиционный биплот [примечание: ссылаясь на PCA] имеет несколько преимуществ по сравнению с графиками основных координат (PCoA) для анализа β-разнесения. Полученные результаты очень стабильны, когда данные являются подмножествами (Bian et al., 2017), что означает, что предварительный анализ не обусловлен просто наличием отсутствующих связей в данных или чрезмерной разреженностью (Wong et al., 2016; Morton et al. al., 2017).
Gloor et al., 2017
Обновление III
Дополнительные ссылки на опубликованные исследования (я благодарю @Nick Cox за рекомендацию добавить больше ссылок):
- Аргументы против использования CLR для PCA
- Аргументы против использования CLR для методов, основанных на корреляции
- Введение в ILR
clr
делает ....