1 置换检验
置换方法和参数方法都计算了相同的t统计量。但置换方法并不是将统计量与理论分布进行比较,而是将其与置换观测数据后获得的经验分布进行比较,根据统计量值的极端性判断
是否有足够的理由拒绝零假设。
R目前有一些非常全面而复杂的软件包可以用来做置换检验。本节剩余部分将关注两个有用
的包:coin和lmPerm包。coin包对于独立性问题提供了一个非常全面的置换检验的框架,而lmPerm包则专门用来做方差分析和回归分析的置换检验。
2 用 coin 包做置换检验
对于独立性问题,coin包提供了一个进行置换检验的一般性框架。通过该包,你可以回答
如下问题:
q 响应值与组的分配独立吗?
q 两个数值变量独立吗?
q 两个类别型变量独立吗?
相对于传统检验,提供可选置换检验的coin函数
在coin函数中,y和x是数值变量,A和B是分类因子,C是类别型区组变量,D和E是有序因子,y1和y2是相匹配的数值变量。
上表中列出来的每个函数都是如下形式:
function_name( formula, data, distribution= )
formula描述的是要检验变量间的关系; q
data是一个数据框;
distribution指定经验分布在零假设条件下的形式,可能值有exact、asymptotic和approximate。若distribution="exact",那么在零假设条件下,分布的计算是精确的(即依据所有可能的排列组合)。当然,也可以根据它的渐进分布(distribution="asymptotic")或蒙特卡洛重抽样(distribution="approxiamate(B=#)")来做近似计算,其中#指所需重复的次数。distribution="exact"当前仅可用于两样本问题。
2.1 独立两样本和 K 样本检验
(1)独立样本传统t检验
install.packages("coin")
library(coin)
score <- c(40, 57, 45, 55, 58, 57, 64, 55, 62, 65) #生成10个向量
treatment <- factor(c(rep("A",5), rep("B",5))) #函数 factor 用于将一个向量编码为一个因子
mydata <- data.frame(treatment, score) #将上面向量和标签的组合成一个数据框
t.test(score~treatment, data=mydata, var.equal=TRUE)
#t.test()对数据向量进行单样本和双样本t检验。var.equal是一个逻辑变量,表示是否将两个方差视为相等,如果是TRUE,则使用集合方差来估计方差,否则就使用Welch(或Satterthwaite)自由度的近似值。
(2)单因素精确检验
oneway_test(score~treatment, data=mydata, distribution="exact")
#oneway_test()是两样本和K样本置换检验,若distribution="exact",那么在零假设条件下,分布的计算是精确的(即依据所有可能的排列组合)。
结果分析:传统t检验表明存在显著性差异(p<0.05),而精确检验却表明差异并不显著(p>0.072)。由于只有10个观测,可能更倾向于相信置换检验的结果,在做出最后结论之前,还要多收集些数据。
(3)Wilcoxon-Mann-Whitney U检验(Wilcoxon秩和检验)
本例子是检验美国南部监禁概率与非南部间的差异
library(MASS)
UScrime <- transform(UScrime, So = factor(So))
wilcox_test(Prob ~ So, data=UScrime, distribution="exact")
结果分析:p-value值小于0.05,所以美国南部监禁概率与非南部监禁概率差异非常显著,即监禁在南部可能更多,数值变量So被转化为因子,因为coin包规定所有的类别型变量都必须以因子形式编码。
(4)K样本置换检验
library(multcomp)
set.seed(1234) #设置随机种子,是为了可以让结果重现
oneway_test(response~trt, data=cholesterol,distribution=approximate(nresample=9999))
#response~trt是用来分析评价五种药物疗法对降低胆固醇的效果,蒙特卡洛重抽样(distribution="approxiamate(nresample=#)")来做近似计算,其中#指所需重复的次数
结果分析:p-value值小于0.05,即表明各组间病人的响应值显著不同。
2.2 数值变量间的独立性
spearman_test()函数提供了两数值变量的独立性置换检验。我们检验美国文
盲率与谋杀率间的相关性。如下代码可进行相关性的置换检验:
states <- as.data.frame(state.x77)
set.seed(1234)
spearman_test(Illiteracy~Murder, data=states,distribution=approximate(nresample=9999))
结果分析:基于9999次重复的近似置换检验可知:独立性假设并不被满足。注意,state.x77是一个矩阵,在coin包中,必须将其转化为一个数据框。