permute 包中的函数 how() 可以在为 vegan::adonis2() 定义排列限制的上下文中支持不平衡数据吗?

问题描述 投票:0回答:1

我正在进行一项研究,比较三个不同森林地区的森林冠层间隙和封闭冠层森林中的昆虫群落。我的实验设计是分层且不平衡的。

研究设计的简化描述(这种简化的设计反映在下面的虚拟小标题中):

  • 三个森林地区;
  • 每个森林区域内都有两个树冠间隙;
  • 与每个树冠间隙相关的是三个样方 - 一个在间隙本身,两个在相邻的封闭树冠森林中(这是数据不平衡的地方)。

我有兴趣使用

vegan::adonis2()
中实施的 PERMANOVA 来比较存在差距的社区与邻近森林中的社区。由于调查设计是分层的,因此我必须限制排列。然而,据报道,包
permute
要求“数据集保持平衡”,这意味着“不平衡的数据必须手动排列”(link)。我的问题是:

  • 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
)的使用来支持不平衡数据吗?

r permutation vegan permute
1个回答
0
投票

permute 真的不支持不平衡数据吗?

不,这不是真的。 permute 一般不需要数据平衡。但是,如果您尝试测试在整个图 (

plots
) 水平上变化的变量,那么您确实需要有一个平衡的设计。我不确定如何排列不平衡设计中的数据,以便在整个图中保持相同的样本(或残差)顺序(如果您有一些带有 1 个样本的整个图,另一些带有 2 个样本)。这就像试图将方钉塞入圆孔中一样。 这个问题可能有一个解决方案 - 但如果有的话,我不知道它是什么,Canoco 的开发人员(

permute

中使用的排列设计源自何处)也不知道。我很乐意了解它,但是那样我就可以在 permute 中实现它。 如果您想在不平衡的数据集中测试整个图变量,直接的解决方案是在每个森林区域的相邻封闭树冠中删除一个样方,以便保持平衡,然后进行分析。

但是,您似乎并没有测试在整个绘图级别上变化的变量。所以这整个平衡问题是没有意义的,不是吗?只要您限制样本在整个图中进行排列,从实际角度来看,数据是否不平衡并不重要,因为我们只是在

gapNo

的水平内随机排列样本。 对于这种事情,我倾向于使用

blocks
参数来限制排列(因为它更容易输入)。在这里你可以做

h <- with(data, how(blocks = gapNo, nperm = 999) )

并注意,您

想要在排列中观察到的排列,因为已经为观察到的数据计算了伪 $F$。

由于这些数据只有 46656 种排列,您可能会考虑进行精确测试并评估所有可能的排列,而不是仅仅进行 1000 种随机排列。

© www.soinside.com 2019 - 2024. All rights reserved.