在置换测试中P值等于0


15

我有两个数据集,我想知道它们是否存在显着差异(这来自“ 两组显着不同?请测试使用 ”)。

我决定使用置换测试,在R中执行以下操作:

permutation.test <- function(coding, lncrna) {
    coding <- coding[,1] # dataset1
    lncrna <- lncrna[,1] # dataset2

    ### Under null hyphotesis, both datasets would be the same. So:
    d <- c(coding, lncrna)

    # Observed difference
    diff.observed = mean(coding) - mean(lncrna)
    number_of_permutations = 5000
    diff.random = NULL

    for (i in 1:number_of_permutations) {
        # Sample from the combined dataset
        a.random = sample (d, length(coding), TRUE)
        b.random = sample (d, length(lncrna), TRUE)
        # Null (permuated) difference
        diff.random[i] = mean(b.random) - mean(a.random)
    }

    # P-value is the fraction of how many times the permuted difference is equal or more extreme than the observed difference
    pvalue = sum(abs(diff.random) >= abs(diff.observed)) / number_of_permutations
    pvalue
}

不过,根据本文,p值不应为0:http//www.statsci.org/smyth/pubs/permp.pdf

你推荐我做什么?以这种方式计算p值:

pvalue = sum(abs(diff.random) >= abs(diff.observed)) / number_of_permutations

一个好方法?还是做以下更好?

pvalue = sum(abs(diff.random) >= abs(diff.observed)) + 1 / number_of_permutations + 1

(1)问题的最后一行是错误的,因为它没有包括执行预期计算所需的括号。(这是保证产生结果大于,这对于任何p值是不可能的。)(2)你没有实际进行置换试验:两个样品和很少会包括数据的随机分区,但将典型地重叠实质上。而是将计算作为和的并集内的的补码。1a.randomb.randomb.randoma.randomcodinglncrna
whuber

因为p值是至少与观察值一样极端的一组值,所以如果评估排列分布,则观察到的统计信息将计入“排列”中。进行随机化时,通常会在考虑的置换统计中对观察到的统计进行计数(出于类似原因)。
Glen_b-恢复莫妮卡2014年

Answers:


15

讨论区

置换测试生成数据集的所有相关置换,为每个此类置换计算指定的测试统计信息,并根据统计信息的结果置换分布评估实际测试统计信息。评估它的一种常见方法是报告在某种意义上比实际统计“极端或极端”的统计比例。这通常称为“ p值”。

由于实际数据集是这些排列之一,因此其统计信息必然会在排列分布内找到。因此,p值永远不能为零。

除非数据集很小(通常少于大约20-30个总数),或者测试统计量具有特别好的数学形式,否则生成所有排列都不可行。(生成所有排列的示例出现在R中的“ 排列测试”中。)因此,排列测试的计算机实现通常从排列分布中采样。他们通过生成一些独立的随机排列来做到这一点,并希望结果是所有排列的代表性样本。

因此,从这样的样本派生的任何数字(例如“ p值”)仅是置换分布的属性的估计量估计的 p值很可能为零(通常在影响很大时发生)。这样做没有错,但是它立即引起了一个迄今为止被忽略的问题:估计的p值与正确的p值有多少不同? 因为比例的采样分布(例如估计的p值)是二项式的,所以可以用二项式置信区间解决该不确定性。


建筑

精心构建的实施方案将在所有方面密切关注讨论。 它将从计算测试统计信息的例程开始,因为该例程用于比较两组的平均值:

diff.means <- function(control, treatment) mean(treatment) - mean(control)

编写另一个例程以生成数据集的随机排列并应用测试统计量。此接口允许调用者提供测试统计信息作为参数。它将比较m数组的第一个元素(假定为参考组)与其余元素(“治疗”组)。

f <- function(..., sample, m, statistic) {
  s <- sample(sample)
  statistic(s[1:m], s[-(1:m)])
}

置换试验通过找到实际数据的统计(这里假定为被存储在两个阵列首先进行controltreatment),然后寻找用于其许多独立的随机排列统计:

z <- stat(control, treatment) # Test statistic for the observed data
sim<- sapply(1:1e4, f, sample=c(control,treatment), m=length(control), statistic=diff.means)

现在,计算p值的二项式估计及其置信区间。一种方法使用软件包中的内置binconf过程HMisc

require(Hmisc)                                    # Exports `binconf`
k <- sum(abs(sim) >= abs(z))                      # Two-tailed test
zapsmall(binconf(k, length(sim), method='exact')) # 95% CI by default

即使将结果与另一个测试进行比较也不是一个坏主意:即使您可能对结果应该位于的位置也有了一个数量级的了解。在此示例中(比较均值),无论如何,Student t检验通常会得出良好的结果:

t.test(treatment, control)

R测试变量是否遵循相同分布的情况下,使用工作代码在更复杂的情况下说明了此体系结构。


100201.5

set.seed(17)
control <- rnorm(10)
treatment <- rnorm(20, 1.5)

在使用前面的代码运行置换测试之后,我绘制了置换分布的样本以及垂直的红线以标记实际统计信息:

h <- hist(c(z, sim), plot=FALSE)
hist(sim, breaks=h$breaks)
abline(v = stat(control, treatment), col="Red")

数字

二项式置信极限计算得出

 PointEst Lower        Upper
        0     0 0.0003688199

00.000373.16e-050.000370.000370.050.010.001


注释

ķñ ķ/ñķ+1/ñ+1ñ

10102=1000.0000051.611.7百万分之几:比Student t检验所报告的小。尽管数据是使用正常的随机数生成器生成的,这可以使用Student t检验来证明是合理的,但置换检验的结果与Student t检验的结果有所不同,因为每组观测值中的分布都不是完全正态的。


上面引用的Smyth&Phipson的论文清楚地说明了为什么k / N对于p值估计器不是一个好的选择。简而言之,对于相关的显着性水平(例如alpha = 0.05),P((k / N)<α| H0)可能令人惊讶地大于alpha。这意味着使用k / N作为其p值估计量并以0.05作为其拒绝阈值的随机置换测试将拒绝原假设超过5%的次数!p值为零是此问题的极端情况-使用alpha = 0的准则,我们希望永远不会拒绝零值,但是b / m在零值之下可以等于零,从而导致错误拒绝。
Trisoloriansunscreen

1
@Tal 针对特定目的的 “糟糕选择” 我们作为统计学家与众不同的地方在于我们对可变性在数据分析和决策中的作用的理解,以及我们对可变性进行适当量化的能力。这就是我在此处的答案中所举例说明(暗含的提倡)的方法。执行此操作时,不会出现您所描述的问题,因为置换过程的用户将被理解为它的局限性和优势,并且可以自由地根据自己的目标采取行动。
whuber

13

中号+1中号+1

(B是获得的统计量大于或等于所观察到的统计量的随机排列的数量,M是采样的随机排列的总数)。

中号


1
+1这是论文要点的一个很好的总结。我特别感谢您注意估算的p值与真实排列p值之间的区别。
ub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.