我们如何为置换测试的参数创建置信区间?


9

置换检验是基于从原始数据中随机抽取的置换重采样进行的显着性检验。引导重采样是在没有替换的情况下绘制的,而引导程序样本是在替换后绘制的。这是我在R中进行的简单置换测试的示例。(欢迎您发表评论)

置换测试具有很大的优势。他们不需要特定的总体形状,例如正态分布。它们适用于各种统计数据,而不仅适用于在零假设下具有简单分布的统计数据。无论总体的形状和大小如何,它们都可以给出非常准确的p值(如果使用了足够的排列)。

我还读到,给出一个置信区间和一个测试通常很有用,该测试是使用引导重采样而不是置换重采样创建的。

您能否解释(或仅给出R代码)如何构建置信区间(即,上述示例中两个样本的均值之间的差异)?

编辑

经过一番谷歌搜索,我发现了这有趣的读物

Answers:


7

可以使用置换重采样。这实际上取决于许多因素。如果排列的数量相对较少,那么排列对您的置信区间的估计就不会太大。您的排列在某个灰色区域,可能很好。

与先前的代码唯一的不同是,您将随机生成样本,而不是进行排列。而且,您将生成更多的它们,例如说1000。获得您的1000次实验重复的得分。取中间950(95%)的临界值。那就是您的置信区间。它直接从引导程序掉落。

您已经在示例中完成了大部分操作。dif.treat长462件。因此,您需要较低的2.5%和较高的2.5%截止值(每端大约11个项目)。

从前使用您的代码...

y <- sort(dif.treat)
ci.lo <- y[11]
ci.hi <- y[462-11]

临时而言,我想说462有点低,但是您会发现一个分数升到10,000的引导程序几乎没有什么不同(可能更接近平均值)。

以为我还会添加一些需要启动库的简单代码(基于您之前的代码)。

diff <- function(x,i) mean(x[i[6:11]]) - mean(x[i[1:5]])
b <- boot(total, diff, R = 1000)
boot.ci(b)

谢谢。是否可以使用sample和生成样本replace=TRUE?有什么理由使用像这样的软件包boot吗?
乔治·唐塔斯

通常,它是通过替换完成的,因此您要将其设置为TRUE。至于为什么...该软件包已经过优化,因此它应该运行得更快...。如果将R设置为大,可能会出现问题。而且,如您所见,该代码简洁明了。它还具有很多功能,您无法轻松滚动自己的功能。
约翰2010年

boot.ci返回置信区间。是否有提供p.value的(引导)功能?(因为差异的数量与生成的样本总数之比至少与观察到的差异之比高)
George Dontas 2010年

好的,我找到了一种解决方法:sum(b$t>=b$t0)/b$R
乔治·唐塔斯

@ gd047:请考虑到这是您正在计算的单面p值。
Joris Meys 2010年

4

排列检验是一种精确的检验,可为您提供精确的p值。引导排列测试没有意义。

紧接着,确定围绕测试统计数据的置信区间也没有意义,因为它是根据您的样本而不是估计来计算的。您可以根据均值之类的估计值来确定置信区间,但不能根据检验统计量来确定置信区间。

排列测试不应用于太大的数据集,以致无法再计算所有可能的排列。如果是这种情况,请使用引导过程来确定所用测试统计信息的临界值。但是同样,这与95%的置信区间无关。

一个例子:我在这里使用经典的T统计量,但是使用一种简单的引导方法来计算我的统计量的经验分布。基于此,我计算出一个经验p值:

x <- c(11.4,25.3,29.9,16.5,21.1)
y <- c(23.7,26.6,28.5,14.2,17.9,24.3)

t.sample <- t.test(x,y)$statistic
t.dist <- apply(
      replicate(1000,sample(c(x,y),11,replace=F)),2,
      function(i){t.test(i[1:5],i[6:11])$statistic})

# two sided testing
center <- mean(t.dist)
t.sample <-abs(t.sample-center)
t.dist <- abs(t.dist - center)
p.value <- sum( t.sample < t.dist ) / length(t.dist)
p.value

请注意,此两面测试仅适用于对称分布。非对称分布通常仅在一侧进行测试。

编辑:

好的,我误解了这个问题。如果要计算差异估计的置信区间,则可以使用此处提到的代码在每个样本中进行引导。请注意,这是一个有偏见的估计:通常,这会导致CI值过小。另请参阅此处给出的示例,作为为什么必须对置信区间和p值使用不同方法的原因。


1
您能否解释一下为什么不能在无法计算所有可能排列的数据集上使用排列检验?
安迪W

@Andy W:首先定义“置换测试”。对我而言,置换测试是精确的测试,它会使用所有可能的置换。在较大的数据集上这是不可能的。实际上,“近似置换检验”是简单的蒙特卡洛方法,应该以这种方式进行处理。紧接着,中心极限定理确保了在大多数情况下使用大型数据集时,符合测试统计分布的假设。在复杂的测试中,在大型数据集上使用置换测试会使计算时间长得难以忍受,而不会增加任何重大价值。my2cents
Joris Meys 2010年

我没有说过引导置换测试。在阅读了[第14.5节|最后一节]后,我遇到了这个问题。摘要],在链接的pdf中。
乔治·唐塔斯

@ gd047然后,我误读了您的问题。但是,您应该真正将置信区间和p.value严格分开。置信区间是基于每个样本内的自举估计的(尽管它因定义而有偏差),而置换测试是通过对整个数据集进行置换来完成的。这两件事是完全不同的。
Joris Meys 2010年

@Kevin:代码是正确的。再次阅读代码:在应用中x[6:11]引用x匿名函数的参数。可能令人困惑,但是您的编辑给出了非常错误的结果。在编辑代码之前,请先评论一下您的想法。节省了我的回滚。为避免进一步的混乱,我将其更改xi
Joris Meys 2012年

0

摘自《答案》中的Joris Meys代码,但对其进行了修改,以使其可以应用于多种情况:

我尝试编辑另一个,但是我没有时间完成,由于某种原因我无法发表评论(也许是因为这是一个老问题)。

x <- c(11.4,25.3,29.9,16.5,21.1)
y <- c(23.7,26.6,28.5,14.2,17.9,24.3)

t.sample <- t.test(x,y)$statistic

t.dist <- apply(
          replicate(1000,sample(c(x,y),length(c(x,y)),replace=F)), 2,
          function(i){t.test(i[1:length(x)],i[length(x)+1:length(c(x,y))])$statistic})

# two sided testing
center <- mean(t.dist)
t.sample <-abs(t.sample-center)
t.dist <- abs(t.dist - center)
p.value <- sum( t.sample < t.dist ) / length(t.dist)
p.value
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.