生活随笔
收集整理的這篇文章主要介紹了
理解和实现置换检验
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先說什么是置換檢驗?
總體意思就是:對于兩個樣本,先計算兩個樣本的原始均值差,然后進行放回性的抽取樣本操作,每一次抽取的時候,都計算兩個組的均值差,這樣有多少次抽樣就有多少個均值差,然后看看有多少個均值差在實際均值差之上,也就是得到實際均值差在這里的位置,根據位置就得到了P值。因為多個均值差的排列接近正態分布。
適用范圍:對于小樣本試驗,用T檢驗或者wilcox檢驗都有誤差,不太準確,因而使用置換檢驗比較恰當。這里的小樣本一般統計學情況下是指的10個,就是小于等于10個的樣本建議使用置換檢驗而不是t檢驗。
當然,在核磁領域,一般都是用置換檢驗會更好一點。
介紹coin包:
Exact Wilcoxon-Mann-Whitney test(wilcox檢驗):(wt <- wilcox_test(pd ~ age, data = diffusion, distribution = “exact”, conf.int = TRUE))查看上述的檢驗值:statistic(wt, type = “linear”)expectation(wt);covariance(wt);pvalue(wt);confint(wt)。查看一些p值,置信區間kruskal_test(pd ~ age, data = diffusion, distribution = “exact”)Asymptotic Fisher-Pitman test(漸進的permutation test): oneway_test(pd ~ age, data = diffusion)Approximative (Monte Carlo) Fisher-Pitman test(蒙特卡洛法的近似置換檢驗):pvalue(oneway_test(pd ~ age, data = diffusion, distribution = approximate(nresample = 10000)))Exact Fisher-Pitman test(精確的置換檢驗):pvalue(ot <- oneway_test(pd ~ age, data = diffusion, distribution = “exact”))Exact Brown-Mood median test with different mid-scores(不同中位數的精確布朗情緒中位數測試):mt1 <- median_test(y ~ x, data = ex, distribution = “exact”)Approximative (Monte Carlo) Kruskal-Wallis test(蒙特卡洛法的近似Kruskal-Wallis檢驗):kruskal_test(length ~ site, data = yoy, distribution = approximate(nresample = 10000))
舉例:
1 10:10
A = 20,34,67,53,12,13,55,89,73, 62
B = 23,45,12,56,23,67,22,66,65,41
student t 檢驗結果, 0.596
wilcox的結果 p=0.7334
精確的置換檢驗的結果 0.5987
模特卡洛模擬的置換檢驗結果 0.5942
可以看出,置換檢驗其實很有用,能比較多的降低p值,其結果接近甚至比t檢驗更小。
可能有的人會說,你這精確的置換檢驗比t檢驗還大。但是要明白,這是10個值的sample,這里的t是student t,它有比較嚴格的假設前提,但是一般實際情況下,你是沒辦法用student t的,因為范圍不符合,只能用wilcox,這樣p值就比較大了。而置換檢驗不要求假設前提,不要求數據分布,并且它計算出來的p都非常小,所以置換檢驗很有用,值得學習。
而精確的置換檢驗和蒙特卡洛模擬的置換檢驗差了一點點,很正常,因為蒙特卡洛模擬具有隨機性。
本來想附上python的代碼,但是發現python沒有現成的permutation test包,這就很尷尬了,在統計方面還是R強。但其實自己寫代碼實現permutation test也很簡單,就是把A和B合并成一個序列,從中放回的隨機抽A個樣本,計算A的均值和剩下樣本的均值,然后計算均值差,重復10000次,再計算實際A和B的統計量差在這個的位置,就得到了p值。
附上網上別人的代碼。
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
def exact_mc_perm_test
(xs, ys, nmc
):n, k
= len
(xs
),
0diff = np.abs
(np.mean
(xs
) - np.mean
(ys
))zs
= np.concatenate
([xs, ys
])list=np.empty
(nmc
)for j in range
(999):np.random.shuffle
(zs
)list
[j
]=np.abs
(np.mean
(zs
[:n
]) - np.mean
(zs
[n:
]))k
+= diff < np.abs
(np.mean
(zs
[:n
]) - np.mean
(zs
[n:
]))return list
xs
= np.array
([24,43,58,67,61,44,67,49,59,52,62,50
])
ys
= np.array
([42,43,65,26,33,41,19,54,42,20,17,60,37,42,55,28
])
list_a=exact_mc_perm_test
(xs, ys,
999)
print
(list_a
)
作者:qtey
鏈接:https://www.jianshu.com/p/2fdb3bd07b6f
來源:簡書
總結
以上是生活随笔為你收集整理的理解和实现置换检验的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。