2016-03-03 13 views
0

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

ответ

1

Изменение только несходства является тривиальным, но несходство, которое вы используете, должно быть таким, чтобы вы добавляли и анализировали термины по видам. Условия квадрат Евклидово расстояние такое. Тем не менее, simper() делает всевозможные странные трюки с несходствами, и я вовсе не уверен, что эти трюки действительны для квадратичного евклидова расстояния (я даже не уверен, что они действительны для Брей-Кертиса, которые мы использовали, но по крайней мере они соглашаются с опубликованным методом). NB, мы делаем предупреждение против использования 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) 
+0

Thanks @Jari. Действительно, я читал об ограничениях, связанных с использованием анализа SIMPER. В моем случае я использую simper() в качестве пост-hoc-теста для adonis persova для оценки вклада каждой аминокислоты в изменение состава белка между образцами. До сих пор я не нашел хорошей альтернативы simper, кроме выполнения простой ANOVA для каждой аминокислоты. Но это не отвечает на один и тот же вопрос. У вас могут быть другие предложения? – Pierrick