Как рассчитать процентное соотношение видов для веганских объектов rda / cca?

Я пытаюсь воспроизвести столбец ("переменная" в FactoMineR::PCA, "виды" в vegan::rda) процентное отношение к осям из пакета FactoMineR в vegan. Вклады закодированы в FactoMiner::PCA объектах:

library(FactoMineR)
library(vegan)

data(dune)

fm <- FactoMineR::PCA(dune, scale.unit = FALSE, graph = FALSE)

head(round(sort(fm$var$contrib[,1], decreasing = TRUE), 3))
# Lolipere Agrostol Eleopalu Planlanc  Poaprat  Poatriv 
#  17.990   16.020   13.866    7.088    6.861    4.850 

Посмотрев на код для FactoMiner::PCA, я обнаружил, что вклады рассчитываются как квадрат координат оси, деленный на собственное значение оси и умноженный на 100%:

head(round(sort(100*fm$var$coord[,1]^2/fm$eig[1], decreasing = TRUE), 3))
# Lolipere Agrostol Eleopalu Planlanc  Poaprat  Poatriv 
#  17.990   16.020   13.866    7.088    6.861    4.850 

Мне не удалось воспроизвести вышеприведенные вычисления с помощью объекта vegan::rda:

vg <- rda(dune)

head(round(sort(100*scores(vg, choices = 1, display = "sp", 
scaling = 0)[,1]^2/vg$CA$eig[1], decreasing = TRUE), 3))
# Lolipere Agrostol Eleopalu Planlanc  Poaprat  Poatriv 
#   0.726    0.646    0.559    0.286    0.277    0.196

Я явно делаю что-то не так, и расхождение, вероятно, связано с разницей в том, как эти два пакета вычисляют координаты для столбцов, поскольку собственные значения для осей очень похожи (идентичны для моего фактического набора данных), но координаты не такие:

# vegan eigenvalue for axis 1
vg$CA$eig[1]
#     PC1 
# 24.79532 

# FactoMineR eigenvalue for axis 1
fm$eig[1]
# [1] 23.55555

# vegan column coordinates for axis 1
head(round(scores(vg, choices = 1, display = "sp", scaling = 0)[,1], 3))
# Achimill Agrostol Airaprae Alopgeni Anthodor Bellpere 
#  -0.176    0.400    0.007    0.155   -0.163   -0.097 

#FactoMineR, column coordinates for axis 1
head(round(fm$var$coord[,1], 3))
# Achimill Agrostol Airaprae Alopgeni Anthodor Bellpere 
#   0.854   -1.943   -0.033   -0.751    0.791    0.472 

# Sum of column coordinates for vegan axis 1 to illustrate the difference
sum(scores(vg, choices = 1, display = "sp", scaling = 0)[,1])
# [1] -0.796912

# Sum of column coordinates for FactoMineR axis 1 to illustrate the difference
sum(fm$var$coord[,1])
# [1] 3.867738

Как рассчитать процентные вклады столбцов / видов в оси ординации с помощью объекта vegan rda ?


person Mikko    schedule 04.05.2018    source источник
comment
Я нашел решение и ответил на свой вопрос. Если у кого-то есть объяснение получше, пожалуйста, и я приму ваш ответ.   -  person Mikko    schedule 04.05.2018


Ответы (2)


Немасштабированные оценки в веган немасштабированы в (нормальном) смысле, что их сумма квадратов равна 1 - независимо от собственных значений:

> colSums(scores(vg, choices=1:4,dis="sp", scaling=0)^2)
  PC1 PC2 PC3 PC4 
    1   1   1   1 

Думаю, это задокументировано. Если вы хотите называть эти квадратные выражения взносами, меня это устраивает. То же самое и для cca, но здесь вам нужно изучать взвешенные суммы квадратов. Более того, немасштабированные оценки для сайтов (dis = "si") будут иметь одинаковую сумму квадратов: это идея немасштабирования. Если вы масштабируете виды или участки, то те же отношения больше не действуют для другого набора оценок. В общем, немасштабирование означает, что оценки ортонормированы, так что их кросс-произведение представляет собой единичную матрицу (диагональ или сумма квадратов 1 и недиагональных элементов 0). Для масштабированных оценок эти суммы квадратов пропорциональны собственным значениям (но может быть полезно прочитать веганский виньетку о дизайнерских решениях для constant масштабирования оценок).

веганские функции goodness и inertcomp могут (или не могут) предоставлять вам информацию, которую вы ищете.

person Jari Oksanen    schedule 04.05.2018
comment
Спасибо за объяснение, Яри! Если бы вы могли скопировать решение из моего ответа на свой, я могу удалить свое. Ваш (конечно) лучше. - person Mikko; 05.05.2018
comment
Дело в том, что ваш ответ утверждает, что scaling = 0 возвращает масштабированные собственные значения, но на самом деле они немасштабированные. Под немасштабированным мы подразумеваем, что все они имеют равные суммы квадратов единицы независимо от их собственных значений. - person Jari Oksanen; 05.05.2018
comment
Хорошо, поправил формулировку. Может, один ответ все же лучше двух? У меня нет проблем с удалением моего, но ваш не дает прямого ответа на вопрос. Если бы вы добавили этот фрагмент моего кода в свой, я мог бы удалить свой. - person Mikko; 05.05.2018

Немасштабированные (scaling = 0) координаты столбца vegan имеют равные суммы квадратов (т.е. 1 для каждой оси). Вы можете получить «вклад столбца», просто возведя в квадрат немасштабированные координаты:

head(sort(round(100*scores(vg, display = "sp", scaling = 0)[,1]^2, 3), decreasing = TRUE))
# Lolipere Agrostol Eleopalu Planlanc  Poaprat  Poatriv 
#  17.990   16.020   13.866    7.088    6.861    4.850

Сумма этих «вкладов» равна 100%, как сказано выше:

sum(100*scores(vg, display = "sp", scaling = 0)[,1]^2)
# [1] 100
person Mikko    schedule 04.05.2018