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