素食主义者软件包中的函数adonis执行非参数MANOVA,也称为PERMANOVA。问题(也不是,也许我只是不完全了解测试的工作原理)是,每当我使用相同的数据运行它时,我都会得到略有不同的p值。
这是示例数据。
dframetest <- data.frame(X = rnorm(20), Y = rnorm(20), Z = rnorm(20), Label = c(rep("A",10),rep("B",10)))
adonis(dframetest[,1:3] ~ Label, permutations = 1000, data = dframetest, method = "euclidean")
如果您多次运行adonis
,您会发现p值几乎总是稍有不同,尽管看起来可能存在3-4个左右的值。这让我想知道,如果您的数据处于重要的“大范围”,将会发生什么。如果返回的值看起来像0.053
,0.047
,0.05
一样,您将如何解释结果?
答案 0 :(得分:1)
adonis
通过随机选择排列进行排列测试。您要求提供1000个随机排列,因此p值基于这1000个随机排列中观察到的测试统计量的等级。 (您可以更容易地使用默认的permutations = 999
来解释数字;然后p=0.264
意味着您观察到的统计信息与随机数一起包含在顶部的第264位。)
如果3次运行的返回值分别为0.053、0.047、0.05,则您将知道真实的p值(通过枚举每个可能的排列获得)约为0.05。但是,即使您知道真实的p值是0.049对0.051,结论也应该大致相同。有证据表明,对于纯随机数据,与预测变量无关,这种影响足够大,以至于偶然发生的概率仅为20倍左右。
对不起,我在这里下了话题。如果您想询问有关p值的解释,您可能应该使用交叉验证,而不是堆栈溢出。
答案 1 :(得分:1)
正如@ user2554330所提到的,我们使用数据的排列来测试测试统计量。排列是伪随机的,由 permute 包中的函数生成。如果要获得可重复的p值,请使用set.seed()
设置随机数生成器的种子。例如
set.seed(42)
adonis(....)
set.seed(42)
adonis(....)
将产生相同的排列集,因此具有相同的p值。
随着排列次数的增加,排列p值的准确性也会提高;如果您尝试在没有设置RNG种子但使用permutations = 10000
的情况下不设置来运行示例,则应看到较少的变化。