Я провожу исследование, сравнивающее сообщества насекомых в просветах лесного полога и в лесу с закрытым пологом на трех различных лесных участках. Мой экспериментальный план иерархичен и несбалансирован.
Упрощенное описание плана исследования (этот упрощенный дизайн отражен в подзаголовке ниже):
Мне интересно сравнить сообщество в пробелах с сообществом в соседнем лесу, используя PERMANOVA, реализованную в vegan::adonis2()
. Поскольку структура опроса является иерархической, я должен ограничить перестановки. Однако сообщается, что пакет permute
требует, чтобы «набор данных был сбалансирован», что означает, что «несбалансированные данные придется переставлять вручную» (ссылка ). Мой вопрос:
permute
не поддерживает несбалансированные данные?permute
таким образом, чтобы учитывать несбалансированные данные в контексте определения ограничений перестановки внутри vegan::adonis2()
?Ниже приведен макет tibble
в формате моих основных данных.
# read in packages
library(tibble)
library(vegan)
library(permute)
# Define tibble, where rows correspond to individual survey quadrats
# Tibble contains:
### three forested areas (column 'forestarea');
### six gaps (column 'gapNo');
### status of quadrat as gap or forest (column 'gapOrforest');
### count data for six insect species.
data <- tibble(
# three forest areas, each with 2 canopy gaps
forestarea = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3),
gapNo = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6),
# quadrat status as in gap or in forest
gapOrforest = rep(c("g", "f", "f"), 6),
# species data, integer counts
species1 = c(50, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 42, 0, 0),
species2 = c(0, 10, 8, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 5, 9, 9),
species3 = c(30, 0, 10, 0, 0, 23, 0, 0, 0, 45, 0, 0, 23, 10, 0, 43, 21, 60),
species4 = c(0, 5, 12, 0, 0, 3, 20, 0, 0, 0, 15, 0, 0, 0, 18, 0, 0, 0),
species5 = c(25, 0, 0, 0, 13, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 14, 0, 0),
species6 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 4, 5, 0, 0, 0, 6, 0),
species7 = c(14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 4),
species8 = c(0, 7, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0),
species9 = c(0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0),
species10 = c(8, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0)
)
Если бы данные были сбалансированы, PERMANOVA с ограниченными перестановками выполнялась бы, как показано ниже:
dist <- vegdist(data[,4:ncol(data)])
control <- how(within = Within(type = "free"),
plots = Plots(strata = data$gapNo, type = "none"),
nperm = 999,
observed = TRUE)
adonis2(dist ~ gapNo,
data=data,
permutations = control)
Можно ли изменить использование функции how()
(или пакета permute
в более широком смысле), как показано выше, для поддержки несбалансированных данных?
Правда ли, что permute не поддерживает данные о дисбалансе?
Нет, это неправда. permute не требует, чтобы данные были сбалансированы в целом. Однако если вы пытаетесь протестировать переменную, которая варьируется на уровне всего графика (plots
), вам необходим сбалансированный дизайн. Я не уверен, как можно переставлять данные из несбалансированного плана таким образом, чтобы сохранять одинаковый порядок выборок (или остатков) на всех графиках, если у вас есть целые графики с 1 выборкой, а другие - с 2. Это было бы это все равно, что пытаться засунуть квадратный колышек в круглую дыру.
Возможно, есть решение этой проблемы, но если оно есть, то я не знаю, что это такое, и разработчики Canoco (откуда берут начало конструкции перестановок, используемые в permute) тоже не знают. Однако я был бы рад узнать об этом, поскольку тогда я мог бы попытаться реализовать это в перестановке.
Если вы хотите протестировать всю переменную графика в несбалансированном наборе данных, немедленное решение состоит в том, чтобы отбросить один из квадратов в соседнем закрытом пологе на каждую лесную зону, чтобы у вас был баланс, а затем выполнить анализ.
Однако, похоже, вы не тестируете переменную, которая варьируется на всем уровне графика. Так что вся эта балансировка спорна, не так ли? Пока вы ограничиваете перестановку выборок на всех графиках, с практической точки зрения не имеет значения, являются ли эти данные несбалансированными, поскольку мы просто случайным образом переставляем выборки на уровнях gapNo
.
В подобных случаях я предпочитаю использовать аргумент blocks
для ограничения перестановок (так как его проще вводить). Здесь вы могли бы сделать
h <- with(data,
how(blocks = gapNo, nperm = 999)
)
и обратите внимание, что вам не нужна наблюдаемая перестановка в перестановке, поскольку псевдо$F$ уже вычислен для наблюдаемых данных.
Поскольку существует только 46656 перестановок этих данных, вы можете провести точный тест и оценить все возможные перестановки, а не просто выполнять 1000 случайных перестановок.
Наконец, ваша модель неверна. gapNo
коды мест отбора проб, где имеется 1 образец с пробелом и 2 соседних образца. Если вы подберете модель с gapNo
в качестве ковариаты, вы не будете проверять эффект gapOrForest
, а просто проверите различия между шестью пробелами. Вам нужен y ~ gapOrForest
.
Лично я бы подошёл к этому dbrda()
, если вам нужно использовать несходство:
spp <- data[, 4:ncol(data)]
dbrda(spp ~ gapOrForest + Condition(gapNo),
data = data,
permutations = control)
так как теперь вы можете частично исключить изменение между промежутками, что в идеале вам и нужно.
Вы говорите: «Если вы пытаетесь протестировать переменную, которая варьируется на уровне всего графика (графиков), то вам действительно нужен сбалансированный дизайн». Вы правы в том, что я не проверяю различия между просветами в пологе и лесными массивами. Однако я подозреваю, что существуют важные различия между отдельными просветами полога и между лесными массивами, которые необходимо учитывать (каждый разрыв имеет неконтролируемый возраст, видовой состав растений и т. д., и каждый лесной массив имеет уникальный тип почвы), который (по моему мнению) понимание) означает, что никакие два пробела или лесных массива не могут быть заменены при нулевой гипотезе. ...
Насколько я понимаю ваш ответ, все это объясняется ограничением перестановок в пределах уровней пробелаNo и тем фактом, что существует нечетное количество типов квадратов обследования, связанных с каждым пробелом в пологе (2 лесных квадрата и 1 квадрат в пробеле) неважно. Скажите, это правильно?
Мы блокируем gapNo
именно для того, чтобы избежать включения изменений между пробелами в нулевое распределение тестовой статистики. Вам не нужна модель, которая включает gapNo
в качестве ковариаты (см. мою правку), потому что это объяснило бы различия между пробелами, а не между промежутками или соседними выборками. Что касается вашего второго комментария, да; с точки зрения того, как заставить тест перестановки работать, дисбаланс не является проблемой. Конечно, это проблема, поскольку вы менее точно можете оценить среднее значение «разрыва» по сравнению со средним значением «смежной» выборки. Но сейчас с этим ничего не поделаешь...
Спасибо за очень подробный ответ. У меня есть дополнительный вопрос, который я могу опубликовать как новый пост, если это будет более уместно.