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包中,必須將其轉化為一個數據框。