Может ли функция How() в пакете Permute поддерживать несбалансированные данные в контексте определения ограничений перестановки для vegan::adonis2()?

Я провожу исследование, сравнивающее сообщества насекомых в просветах лесного полога и в лесу с закрытым пологом на трех различных лесных участках. Мой экспериментальный план иерархичен и несбалансирован.

Упрощенное описание плана исследования (этот упрощенный дизайн отражен в подзаголовке ниже):

  • Три лесных массива;
  • Внутри каждого лесного массива есть два просвета в пологе;
  • С каждым пробелом в пологе связаны три квадрата — один в самом разрыве и два в соседнем лесу с закрытым пологом (здесь данные несбалансированы).

Мне интересно сравнить сообщество в пробелах с сообществом в соседнем лесу, используя 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 в более широком смысле), как показано выше, для поддержки несбалансированных данных?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Правда ли, что 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)

так как теперь вы можете частично исключить изменение между промежутками, что в идеале вам и нужно.

Спасибо за очень подробный ответ. У меня есть дополнительный вопрос, который я могу опубликовать как новый пост, если это будет более уместно.

fre1990 07.08.2024 22:27

Вы говорите: «Если вы пытаетесь протестировать переменную, которая варьируется на уровне всего графика (графиков), то вам действительно нужен сбалансированный дизайн». Вы правы в том, что я не проверяю различия между просветами в пологе и лесными массивами. Однако я подозреваю, что существуют важные различия между отдельными просветами полога и между лесными массивами, которые необходимо учитывать (каждый разрыв имеет неконтролируемый возраст, видовой состав растений и т. д., и каждый лесной массив имеет уникальный тип почвы), который (по моему мнению) понимание) означает, что никакие два пробела или лесных массива не могут быть заменены при нулевой гипотезе. ...

fre1990 07.08.2024 22:32

Насколько я понимаю ваш ответ, все это объясняется ограничением перестановок в пределах уровней пробелаNo и тем фактом, что существует нечетное количество типов квадратов обследования, связанных с каждым пробелом в пологе (2 лесных квадрата и 1 квадрат в пробеле) неважно. Скажите, это правильно?

fre1990 07.08.2024 22:34

Мы блокируем gapNo именно для того, чтобы избежать включения изменений между пробелами в нулевое распределение тестовой статистики. Вам не нужна модель, которая включает gapNo в качестве ковариаты (см. мою правку), потому что это объяснило бы различия между пробелами, а не между промежутками или соседними выборками. Что касается вашего второго комментария, да; с точки зрения того, как заставить тест перестановки работать, дисбаланс не является проблемой. Конечно, это проблема, поскольку вы менее точно можете оценить среднее значение «разрыва» по сравнению со средним значением «смежной» выборки. Но сейчас с этим ничего не поделаешь...

Gavin Simpson 11.08.2024 09:45

Другие вопросы по теме