Permutation test(置換檢驗)以及在R中的應用

Permutation test 可以稱作是置換檢驗,Fisher于20世紀30年代提出的一種基于大量計算(computationally intensive),利用樣本數據的全(或隨機)排列,進行統計推斷的方法,因其對總體分布自由,應用較為廣泛,特別適用于總體分布未知的小樣本資料,以及某些難以用常規方法分析資料的假設檢驗問題。在具體使用上它和Bootstrap Methods類似,通過對樣本進行順序上的置換,重新計算統計檢驗量,構造經驗分布,然后在此基礎上求出P-value進行推斷。

總體上其實就是重新采樣增加小樣本的整體樣本量,然后看其的概率分布來預測假設是否成立。這個基于t-test的,類似于與t-test,但是我覺的在樣本量非常少的情況下,用置換檢驗可以更好的說明問題。這個p-value主要是sobs值在置換經驗中均值的分布概率,最終也是利用p-value的值來判斷假設是否成立的,看p值的大小,p值小于0.05時,是說明拒絕H0,大于0.05.則是說明服從0假設。


下面說一下,置換檢驗在R中應用。

1.先舉R中帶的例子。


排列測試在實驗研究中特別相關,我們常常對治療組之間無差異的拒絕零假設感興趣。在這些情況下,置換檢驗很好的地代表了我們的推理過程,因為我們的零假設是兩個治療組在結果上沒有差異(即,結果是獨立于治療分配而觀察到的)。當我們在測試期間置換結果值時,因此我們看到我們可能具有的所有可能的替代治療分配排列以及我們觀察到的數據的平均差異(相對于我們可以看到的結果是獨立的所有差異的治療任務的位置)。雖然排列測試要求我們看到數據的所有可能排列(可能變得非常大),通過簡單地進行大量的重采樣,我們可以輕松地進行“近似置換測試”。在期望中,該過程應該近似于排列分布。假設我們的研究中有20個單位那么他的排列的數量是:

> factorial(20)

[1] 2.432902e+18

這個時候,數字完全超出了我們合理計算的數字,但是我們可以從該排列分布中隨機抽樣以獲得近似排列分布,只需運行大量重新采樣即可。讓我們看一下使用一些組成數據的例子:

> set.seed(1)

> n <- 100tr <- rbinom(100, 1, 0.5)

> y <- 1 + tr + rnorm(n, 0, 3)

> diff(by(y, tr, mean))? ?#得到差異的結果 1.341

> s <- sample(tr, length(tr), FALSE)

> diff(by(y, s, mean))? #-0.2612

當我們重新取樣而無需替換再次重新計算差異:為-0.2612

在這里,我們使用置換處理向量s計算差異并找到非常小的差異而不是用tr。如果我們重復這個過程很多次,我們可以建立我們的近似置換分布(即均值差的采樣分布)。我們將使用replicatedo重復我們的排列過程。結果將是每個排列(即我們的分布)的差異向量:

dist <- replicate(2000,diff(by(y, sample(tr, length(tr), FALSE), mean)))

hist(dist, xlim = c(-3, 3), col = "black", breaks = 100)####繪制直方圖

abline(v = diff(by(y, tr, mean)), col = "blue", lwd = 2)###畫差異值的直線位置

然后我們可以用hist函數看一下這個分布然后畫一個直方圖來看它的差異


通過看這個結果,看到我們的0假設是被拒絕的,也就是說治療組之間是有差異的。

然后我們可以量化這個結果,也就是生成一個p-value值,通過p-value來更直觀的觀測結果:

> sum(dist > diff(by(y, tr, mean)))/2000?# one-tailed test 單邊檢測## 0.009

> sum(abs(dist) > abs(diff(by(y, tr, mean))))/2000 # two-tailed test 雙邊檢測##0.018

單邊檢驗和雙邊檢驗的結果是不同的,但是這個結果差異不可能是由于改變治療與結果無關的變量集中可觀測變量相關的。


2:在R中我們不可能每次都要構造自己的置換檢驗的分布集,R那我們可以這用coin包中的independence_test函數,但是一個問題是實際問題考慮的可能只是單側的置換檢驗的結果:下面是這個函數針對于上述例子的應用。

library(coin)

independence_test(y ~ tr, alternative = "greater") # one-tailed

independence_test(y ~ tr) # two-tailed? ? # two-tailed,默認就是

結果顯示### ## Asymptotic General Independence Test

## ## data: y by tr

## Z = 2.315, p-value = 0.01029

## alternative hypothesis: greater

對于這個函數的應用,它的具體的參數及應用如下



independence_test(asat ~ group, data = asat,

? ? ? ? ? ? ? ? ? ## exact null distribution

? ? ? ? ? ? ? ? ? distribution = "exact",

? ? ? ? ? ? ? ? ? ## one-sided test

? ? ? ? ? ? ? ? ? alternative = "greater",

? ? ? ? ? ? ? ? ? ## apply normal scores to asat$asat

? ? ? ? ? ? ? ? ? ytrafo = function(data)

? ? ? ? ? ? ? ? ? ? ? trafo(data, numeric_trafo = normal_trafo),

? ? ? ? ? ? ? ? ? ## indicator matrix of 1st level of asat$group

? ? ? ? ? ? ? ? ? xtrafo = function(data)

? ? ? ? ? ? ? ? ? ? ? trafo(data, factor_trafo = function(x)

? ? ? ? ? ? ? ? ? ? ? ? ? matrix(x == levels(x)[1], ncol = 1)))



除此之外,還可以用oneway_test做,效果類似。

但是oneway_test計算的默認是雙側的P值,這時的計算最好是用Deducer包中的perm.t.test函數

這個函數的可以很簡單的設置是單邊的還是雙邊的,簡單的例子使用如下

library(Deducer)

x<-c(20,34,67,53,12,13,55,89)

y<-c(23,45,12,56,23,67,22,66)

perm.t.test(x,y,alternative = "greater",midp = TRUE,B = 1000) #進行1000次置換檢驗

下面簡單介紹下perm.t.test的 參數

如下所示

perm.t.test(x,y,statistic=c("t","mean"),alternative=c("two.sided", "less", "greater"), midp=TRUE, B=10000)

Arguments

x? 第一個參數向量(數字類型)

y? ?第二個參數向量(數字類型)

statistic 統計用的標準,t或者均值

alternative 進行統計排列的方式,主要有三種,如上面所示

midp?確定p-value是否應用

B? ? 進行隨機置換取樣的次數

這就是置換檢驗在R中的簡單介紹

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容