permutation-test 檢驗(yàn)
置換檢驗(yàn)(permutation test) 是一種非參數(shù)檢驗(yàn)茬斧。 在樣本分布未知且數(shù)量較小的時(shí)男杈,我們一般選用無參檢驗(yàn)方法直奋,一般選用秩和檢驗(yàn),例如之前文章提到的Mann-Whitney U test。
但是有時(shí)候也會(huì)遇到無參檢驗(yàn)也無法解決的小樣本樣本檢驗(yàn)间狂。這時(shí)候我們可以使用置換檢驗(yàn)。
置換檢驗(yàn)是Fisher20世紀(jì)30年代提出的一種基于大量計(jì)算(computationally intensive),利用樣本數(shù)據(jù)的全(隨機(jī))排列识颊,進(jìn)行統(tǒng)計(jì)推斷的方法。因其對(duì)總體分布自由奕坟,特別適合用于總體分布未知的小樣本數(shù)據(jù)祥款,以及一些常規(guī)方法難以使用的假設(shè)檢驗(yàn)情況。
假設(shè): 假設(shè)兩個(gè)樣本之間沒有差異月杉,成立則H0刃跛,不成立則H1】廖或者某個(gè)處理沒有效果桨昙,成立H0,不成立H1腌歉。
檢驗(yàn)步驟:
1.兩組樣本A蛙酪、B,提出原假設(shè)翘盖,比如A和B沒有差異桂塞,或者就B結(jié)果而言,某個(gè)處理對(duì)A無效馍驯,
2.首先計(jì)算A阁危、B均值差玛痊,觀測統(tǒng)計(jì)量 Sobj=meanA-meanB,
3.將A狂打、B樣本所有值進(jìn)行合并擂煞,并進(jìn)行隨機(jī)排序分組為A'、B'趴乡。并計(jì)算A'对省、B'的均值差,置換統(tǒng)計(jì)量 Sp1=meanA'-meanB'晾捏,
4.重復(fù)步驟3官辽,直到所有的排序可能都齊全,以獲得一系列的置換統(tǒng)計(jì)量粟瞬,假設(shè)我們進(jìn)行了n次置換則獲得統(tǒng)計(jì)量為Sp1-Spn同仆。我們盡可能多的重復(fù)3的步驟,以達(dá)到精確計(jì)算的結(jié)果裙品,如果未能實(shí)現(xiàn)所有的排序組合俗批,則是近似計(jì)算,重復(fù)次數(shù)越多市怎,得到的背景分布越”穩(wěn)定“岁忘,
5.最后將這些n個(gè)置換統(tǒng)計(jì)量按照從小到大排序,構(gòu)成抽樣分布区匠,再看Sobj是否落在分布的置信區(qū)間內(nèi)(如95%置信區(qū)間)干像,這時(shí)候可計(jì)算一個(gè)P值(如果抽樣總體1000次統(tǒng)計(jì)量中大于Sobj的有10個(gè),則估計(jì)的P值為10/1000=0.01)驰弄,落在置信區(qū)間外則拒絕原假設(shè)麻汰。
舉例
樣本A:{24,43,58,67,61,44,67,49,59,52,62,50}
樣本B:{42,43,65,26,33,41,19,54,42,20,17,60,37,42,55,28}
Sobj=(24+43+58+67+61+44+67+49+59+52+62+50)/12-(42+43+65+26+33+41+19+54+42+20+17+60+37+42+55+28)/16=14
合并A、B戚篙,all:{24,43,58,67,61,44,67,49,59,52,62,50,42,43,65,26,33,41,19,54,42,20,17,60,37,42,55,28}
重排序:A'={43,17,44,62,60,26,28,61,50,43,33,19}
B'={55,41,42,65,59,24,54,52,42,49,37,67,67,20,42,58}
Sp1=meanA'-meanB'=(43+17+44+62+60+26+28+61+50+43+33+19)/12-(55+41+42+65+59+24+54+52+42+49+37+67+67+20+42+58)/16=-7.875
我們?cè)O(shè)置置換次數(shù)n=5000五鲫,則會(huì)產(chǎn)生Sp1...Sp5000,將置換統(tǒng)計(jì)量進(jìn)行從大到小排序岔擂,然后我們進(jìn)行histogram繪圖如下:
其中大于14的置換統(tǒng)計(jì)量一共37個(gè)位喂,p=37/5000=0.0074,置信區(qū)間如果為95%乱灵,則拒絕原假設(shè)H0塑崖,故A,B有差異痛倚。
R包執(zhí)行permutation test 分析
install.packages("jmuOutlier")
library(jmuOutlier)
print( x <- rnorm(10,0.5) )
perm.test(A,B,sim=5000)