R中使用哪种置换测试实现代替t检验(配对和非配对)?


56

我有使用t检验分析的实验数据。对因变量进行间隔缩放,并且数据不成对(即2组)或成对(即对象内)。例如(主题内):

x1 <- c(99, 99.5, 65, 100, 99, 99.5, 99, 99.5, 99.5, 57, 100, 99.5, 
        99.5, 99, 99, 99.5, 89.5, 99.5, 100, 99.5)
y1 <- c(99, 99.5, 99.5, 0, 50, 100, 99.5, 99.5, 0, 99.5, 99.5, 90, 
        80, 0, 99, 0, 74.5, 0, 100, 49.5)

但是,数据并不正常,因此一位评论者要求我们使用t检验以外的其他方式。但是,很容易看出,数据不仅不呈正态分布,而且在不同条件之间分布也不相等: 替代文字

因此,不能使用常规的非参数检验,Mann-Whitney-U检验(成对)和Wilcoxon检验(成对),因为它们要求条件之间的分布相等。因此,我认为最好进行一些重采样或置换测试。

现在,我正在寻找基于t检验的基于置换的R实现,或有关如何处理数据的任何其他建议。

我知道有一些R包可以帮我做到这一点(例如硬币,烫发,exactRankTest等),但我不知道该选哪个。因此,如果有一些使用这些测试的经验的人可以给我一个快速的开始,那将是ubercool。

更新:如果您可以提供一个如何报告此测试结果的示例,那将是理想的。

Answers:


43

无关紧要,因为测试统计信息始终是均值(或等效值)上的差异。蒙特卡洛方法的实现可能会产生很小的差异。对数据进行三个方面的测试,然后对两个自变量进行单面测试:

DV <- c(x1, y1)
IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
library(coin)                    # for oneway_test(), pvalue()
pvalue(oneway_test(DV ~ IV, alternative="greater", 
                   distribution=approximate(B=9999)))
[1] 0.00330033

library(perm)                    # for permTS()
permTS(DV ~ IV, alternative="greater", method="exact.mc", 
       control=permControl(nmc=10^4-1))$p.value
[1] 0.003

library(exactRankTests)          # for perm.test()
perm.test(DV ~ IV, paired=FALSE, alternative="greater", exact=TRUE)$p.value
[1] 0.003171822

为了通过手动计算所有排列来检查确切的p值,我将数据限制为前9个值。

x1 <- x1[1:9]
y1 <- y1[1:9]
DV <- c(x1, y1)
IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
pvalue(oneway_test(DV ~ IV, alternative="greater", distribution="exact"))
[1] 0.0945907

permTS(DV ~ IV, alternative="greater", exact=TRUE)$p.value
[1] 0.0945907

# perm.test() gives different result due to rounding of input values
perm.test(DV ~ IV, paired=FALSE, alternative="greater", exact=TRUE)$p.value
[1] 0.1029412

# manual exact permutation test
idx  <- seq(along=DV)                 # indices to permute
idxA <- combn(idx, length(x1))        # all possibilities for different groups

# function to calculate difference in group means given index vector for group A
getDiffM <- function(x) { mean(DV[x]) - mean(DV[!(idx %in% x)]) }
resDM    <- apply(idxA, 2, getDiffM)  # difference in means for all permutations
diffM    <- mean(x1) - mean(y1)       # empirical differencen in group means

# p-value: proportion of group means at least as extreme as observed one
(pVal <- sum(resDM >= diffM) / length(resDM))
[1] 0.0945907

coin并且exactRankTests都是同一作者的,但coin似乎更笼统和广泛-也在文档方面。exactRankTests不再积极发展。因此,除非您不喜欢处理S4对象,否则我还是会选择coin(也是因为诸如的信息功能support())。

编辑:对于两个因变量,语法是

id <- factor(rep(1:length(x1), 2))    # factor for participant
pvalue(oneway_test(DV ~ IV | id, alternative="greater",
                   distribution=approximate(B=9999)))
[1] 0.00810081

感谢您的好评!还有2个问题:您的第二个例子是否意味着该硬币确实提供了所有可能的排列并且是一个精确的检验?在我的情况下不提供准确的测试有任何好处吗?
Henrik

10
(+1)毫不奇怪,(未配对的)t检验会产生基本相同的p值0.000349。尽管什么评论家说,t检验适用于这些数据。原因是,即使数据的分布不是均匀的,均值的采样分布还是近似正态的。而且,从结果可以看出,t检验实际上比置换检验更为保守。(这意味着t检验的显着结果表明置换检验也可能是显着的。)
whuber

2
@Henrik对于某些情况(选择测试和数值复杂度),coin确实可以计算出准确的排列分布(实际上并没有遍历所有排列,还有比这更优雅的算法)。给出选择后,确切的分布似乎更可取,但是与具有大量重复项的蒙特卡洛近似的差异应该很小。
caracal

1
@Caracal感谢您的澄清。一个问题仍然存在:我提供的数据是成对的。因此,我需要等同于配对t检验。是oneway_test准确的功能?如果是这样,对于未配对的数据,哪一个是正确的?
亨里克(Henrik)

2
@Henrik coin作者写信给我,我oneway_test()无法计算相关案例的确切分布,您必须采用MC近似值(仅wilcoxsign_test()适用于精确测试)。我不知道这一点,在这种情况下更喜欢出现错误,但是MC应该足够准确,并且要进行大量重复。
caracal

29

我相信,一些评论是有条理的。

1)我鼓励您尝试对数据进行多种视觉显示,因为它们可以捕获直方图(如曲线图)丢失的内容,并且我也强烈建议您在并排轴上绘图。在这种情况下,我认为直方图无法很好地传达数据的显着特征。例如,查看并排箱线图:

boxplot(x1, y1, names = c("x1", "y1"))

替代文字

甚至并排的带状图:

stripchart(c(x1,y1) ~ rep(1:2, each = 20), method = "jitter", group.names = c("x1","y1"), xlab = "")

替代文字

x1y1x1y1x1ÿ1个ÿ1个

2)您没有详细解释数据的来源或测量方式,但是在选择统计程序时,此信息非常重要。您上面的两个样本是否独立?是否有任何理由相信两个样本的边际分布应该相同(例如,除了位置不同外)?在进行研究之前,有哪些考虑因素导致您寻找两组之间差异的证据?

žpp

p

5)我认为,这些数据是一个完美的(?)例子,一张精心挑选的照片值得进行1000次假设检验。我们不需要统计数据即可分辨铅笔和谷仓之间的区别。我认为这些数据的适当陈述是“这些数据在位置,比例和形状方面显示出明显的差异”。您可以跟踪(稳健的)描述性统计数据以量化差异,并解释差异在您的原始研究背景下意味着什么。

pp

这个答案比我原本打算的要长得多。对于那个很抱歉。


我很好奇,如果您考虑采用以下合适的准可视化方法:引导估计两组的矩(均值,方差和更高的矩,如果您愿意),然后绘制这些估计及其置信区间,寻找每个时刻组之间的重叠程度。这使您可以讨论各种分布特征之间的潜在差异。如果数据是成对的,则计算差异分数并引导此单一分布的时刻。有什么想法吗?
Mike Lawrence

2
(+1)很好的分析。您完全正确,结果是显而易见的,不需要用p值按压该点。您对(3)的陈述可能有些极端,因为t检验不需要正态分布的数据。如果您担心的话,可以进行偏斜度的调整(例如Chen的变体):您可以看到调整后的测试的p值是否会改变答案。如果没有,您可能还可以。在这种特殊情况下,使用这些(高度偏斜的)数据,t检验可以正常工作。
Whuber

(+1)不错!和非常好的评论。
chl

我们似乎正在接受基本分布与随机实例“相似”的概念。因此,不能有人提出这样一个问题:这两者都是来自beta(0.25,0.25),然后进行检验就是它们是否具有相同的(非中心性)参数。使用排列测试或Wilcoxon证明是否合理?
DWin 2011年

4

5

我的评论不是关于置换测试的实现,而是关于这些数据引发的更一般问题及其讨论,特别是G. Jay Kerns的帖子。

实际上,除了Y1中的0组以外,这两个分布看上去与我非常相似,这与该样本中的其他观察值(0-100尺度上的下一个最小观察值约为50)以及X1中的所有观察值有很大不同。我将首先调查这些观察结果是否有任何不同。

其次,假设那些0确实属于分析范围,则表示置换检验无效,因为分布似乎有所不同,这就是问题所在。如果null为真(分布相同),您是否可以(以合理的概率)获得与这两个分布看起来不同的分布?回答就是测试的全部重点,不是吗?也许在这种情况下,如果不运行测试,某些人会认为答案很明显,但是由于这些小而奇特的分布,我认为我不会。


看来这应该是一个或多个评论,而不是答案。如果单击灰色的小“添加评论”,则可以将您的想法放在问题或特定答案下方的对话中(它们所属的位置)。您确实在这里提出了实质性要点,但是尚不清楚这不是适合他们的地方。
gung-恢复莫妮卡

1
@gung需要一点声誉才能发表评论;-)。
ub

4
21个/27.01

4

由于这个问题没有再次弹出,我可以添加用最近的启发另一个答案博客文章通过R-博客罗伯特Kabacoff,笔者快速-R中的R行动使用的lmPerm包。

但是,这种方法与由coin@caracakl回答的程序包所产生的结果形成鲜明对比(且非常不稳定)的结果(对象内分析的p值为0.008)。分析也从@caracal的答案中获取数据准备:

x1 <- c(99, 99.5, 65, 100, 99, 99.5, 99, 99.5, 99.5, 57, 100, 99.5, 
        99.5, 99, 99, 99.5, 89.5, 99.5, 100, 99.5)
y1 <- c(99, 99.5, 99.5, 0, 50, 100, 99.5, 99.5, 0, 99.5, 99.5, 90, 
        80, 0, 99, 0, 74.5, 0, 100, 49.5)

DV <- c(x1, y1)
IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
id <- factor(rep(1:length(x1), 2)) 

library(lmPerm)

summary(aovp( DV ~ IV + Error(id)))

产生:

> summary(aovp( DV ~ IV + Error(id)))
[1] "Settings:  unique SS "

Error: id
Component 1 :
          Df R Sum Sq R Mean Sq
Residuals 19    15946       839


Error: Within
Component 1 :
          Df R Sum Sq R Mean Sq Iter Pr(Prob)  
IV         1     7924      7924 1004    0.091 .
Residuals 19    21124      1112                
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

如果多次运行,p值将在〜.05和〜.1之间跳跃。

尽管它是对问题的解答,但让我允许在最后提出一个问题(如果需要,我可以将其移至新问题):
关于此分析为何如此不稳定并确实产生如此不同的p值的任何想法硬币分析?我做错什么了吗?


2
如果确实要回答这个问题,最好将其作为一个单独的问题提出来,而不是将其他问题列出来。我注意到您指定了一个错误层,但是@caracal没有指定;那将是我对这个输出与他的输出差b / t的第一个猜测。同样,在仿真时,值通常会跳动;为了重现性,您指定种子,例如set.seed(1); 为了提高MC估算的精度,您可以增加迭代次数;我不确定这些答案是否是您问题的“正确”答案,但它们可能是相关的。
gung-恢复莫妮卡

2
再次,我建议使用完全置换(重新随机化)测试,将MC结果与手动计算进行比较。请参阅示例代码,以比较oneway_anova()(始终接近正确结果)和aovp()(通常与正确结果相差很远)。我不知道为什么aovp()会给出千差万别的结果,但至少在这种情况下,它们令人难以置信。@gung oneway_test(DV ~ IV | id, ...)我的原始答案中的最后一个调用指定了相关情况的错误分层(语法与所使用的语法不同aov())。
卡拉卡尔2012年

@caracal,你是对的。我没有看编辑后的最后一个代码块。我一直在寻找最上面的代码块-我很马虎。
gung-恢复莫妮卡

我真的不需要答案。这只是在这里值得一提的另一种可能性。不幸的是,这与我也应注意的其他结果相去甚远。
亨里克

1
@Henrik使用maxExact = 1000运行aovp。如果花费的时间太长,则将iter = 1000000设置为Ca = 0.001。当估计的p的标准误差小于Ca * p时,计算终止。(值越低,结果越稳定。)
xmjx

1

这些分数是比例吗?如果是这样,您当然不应该使用高斯参数检验,尽管您可以继续使用非参数方法(例如置换检验或方法的自举),但我建议您可以通过以下方法获得更多的统计能力采用合适的非高斯参数化方法。具体来说,只要您可以在感兴趣的单位(例如实验的参与者)内计算比例度量,就可以并且很可能应该使用混合效应模型,该模型指定具有二项分布误差的观察值。参见Dixon 2004


分数不是比例,而是参与者在0到100范围内的估计(显示的数据是对该比例的几个项目的估计的平均值)。
亨里克(Henrik)

然后,非参数似乎是传统的解决方法。就是说,我想知道是否可以有用地推断出这样的比例数据是从二项式过程中得出的,并因此进行了分析。也就是说,您说每个分数是几个项目的平均值,并且假设每个项目是10分制,在这种情况下,我将表示“ 8”作为一系列试验的响应,其中8个为它们的值为1,其中两个的值为0,都在“ item”变量中用相同的标签标记。使用此扩展/二项式的数据,您可以计算二项式混合效果模型。
Mike Lawrence

根据我之前的评论,我应该注意,在扩展/二项式数据中,您可以将“ item”变量建模为固定或随机效应。我认为我倾向于将其建模为固定效果,因为大概您可能不仅对考虑因素而且对评估项目差异以及项目与其他预测变量之间的任何可能相互作用感兴趣。
Mike Lawrence

0

只需添加另一种方法,ezPermez包:

> # preparing the data
> DV <- c(x1, y1)
> IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
> id <- factor(rep(1:length(x1), 2))
> df <- data.frame(id=id,DV=DV,IV=IV)
>
> library(ez)
> ezPerm( data = df, dv = DV, wid = id, within = IV, perms = 1000)
|=========================|100%              Completed after 17 s 
  Effect     p p<.05
1     IV 0.016     *

这似乎oneway_testcoin软件包的一致:

> library(coin)
> pvalue(oneway_test(DV ~ IV | id,  distribution=approximate(B=999999)))
[1] 0.01608002
99 percent confidence interval:
 0.01575782 0.01640682

但是,请注意,这与@caracal提供的示例不同alternative="greater"因此,在他的示例中,他包括p值~0.008与的差~0.016

aovp答案之一中建议的程序包产生可疑的p值较低,并且即使我为IterCamaxIter参数尝试较高的值,其运行速度也可疑地快:

library(lmPerm)
summary(aovp(DV ~ IV + Error(id/IV), data=df,  maxIter = 1000000000))
summary(aovp(DV ~ IV + Error(id/IV), data=df,  Iter = 1000000000))
summary(aovp(DV ~ IV + Error(id/IV), data=df,  Ca = 0.00000000001))

这就是说,论据似乎略有减少p值的变化~.03~.1(我有一个更大的范围由吴丹的@Henrik报道),以0.030.07

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.