R веганский упрощенный анализ: изменить матрицу расстояний

Я использую упрощенный анализ из пакета Vegan, чтобы определить, какие аминокислоты ответственны за различия в составе белка между разными образцами. Как я понял из этого обсуждения, simper() функция использует Брея-Кертиса. Мне нужно было бы использовать другой индекс несходства, обычно евклидов. Как я могу изменить его внутри функции? Спасибо.


person Drosof    schedule 03.03.2016    source источник


Ответы (1)


Изменение только несходства тривиально, но используемое вами несходство должно быть таким, чтобы вы добавляли и анализировали термины по видам. Таковы члены квадрата евклидова расстояния. Однако simper() проделывает всякие странные трюки с несходствами, и я вовсе не уверен, что эти приемы верны для квадрата евклидова расстояния (я даже не уверен, что они верны для используемого нами Брея-Кертиса, но, по крайней мере, они соответствуют с опубликованным методом). Обратите внимание, мы предостерегаем от использования simper. Это выдержка из справочной страницы — надеюсь, вы уже читали это:

Результаты «simper» может быть очень трудно интерпретировать. Этот метод очень плохо смешивает среднее между групповыми различиями и внутригрупповыми вариациями и, по-видимому, выделяет изменчивые виды вместо отличительных видов (Warton et al. 2012). Даже если вы создадите группы, которые являются копиями друг друга, метод выделит виды с высоким вкладом, но это не вклад в несуществующие межгрупповые различия, а вклад в внутригрупповую изменчивость численности видов.

Тем не менее, вот линии, которые вы должны изменить, чтобы переключиться с Брея-Кертиса на квадрат Евклида. Однако я предлагаю вам не использовать эту функцию:

diff --git a/R/simper.R b/R/simper.R
index 35fa189..f60c57f 100644
--- a/R/simper.R
+++ b/R/simper.R
@@ -13,9 +13,8 @@
         n.b <- nrow(gb)
         for(j in seq_len(n.b)) {
             for(k in seq_len(n.a)) {
-                mdp <- abs(ga[k, , drop = FALSE] - gb[j, , drop = FALSE])
-                mep <- ga[k, , drop = FALSE] + gb[j, , drop = FALSE]
-                contrp[(j-1)*n.a+k, ] <- mdp / sum(mep)
+                mdp <- (ga[k,, drop=FALSE] - gb[j,, drop = FALSE])^2
+                contrp[(j-1)*n.a+k, ] <- mdp
             }
         }
         colMeans(contrp)
@@ -53,9 +52,8 @@
         contr <- matrix(ncol = P, nrow = n.a * n.b)
         for (j in seq_len(n.b)) {
             for (k in seq_len(n.a)) {
-                md <- abs(group.a[k, , drop = FALSE] - group.b[j, , drop = FALSE])
-                me <- group.a[k, , drop = FALSE] + group.b[j, , drop = FALSE]
-                contr[(j-1)*n.a+k, ] <- md / sum(me)
+                md <- (group.a[k,,drop=FALSE] - group.b[j,,drop=FALSE])^2
+                contr[(j-1)*n.a+k, ] <- md
             }
         }
         average <- colMeans(contr)
person Jari Oksanen    schedule 04.03.2016
comment
Спасибо @Jari. Действительно, я читал об ограничениях, связанных с использованием анализа SIMPER. В моем случае я использую simper() в качестве апостериорного теста для адониса перманова, чтобы оценить вклад каждой аминокислоты в изменение состава белка между образцами. До сих пор я не нашел хорошей альтернативы simper, кроме выполнения простого ANOVA для каждой аминокислоты. Но это не ответ на тот же вопрос. У вас могут быть другие предложения? - person Drosof; 01.04.2016