1. 程式人生 > >【通俗理解】顯著性檢驗,T-test,P-value

【通俗理解】顯著性檢驗,T-test,P-value

顯著性檢驗,判定實驗結果是否由隨機誤差導致的。舉例很好,很清楚

雖然樣本中,均值蘇州銷售額大於鄭州,但T-test發現這是隨機導致的,P>0.05,當樣本量足夠大可能他們的銷售額就沒有差異了

假設:兩個樣本集之間不存在任何區別

結果:在顯著性水平α =0.05的情況下,p>0.05接受原假設,p值<0.05拒絕原假設

方法:F值 = 組間方差與組內方差的比值,查表:F實際值>F查表值,則p<=0.05;F實際值<F查表值,則p>0.05

----------------原文----------------------------------------------------------

無論你從事何種領域的科學研究還是統計調查,顯著性檢驗作為判斷兩個乃至多個數據集之間是否存在差異的方法被廣泛應用於各個科研領域。筆者作為科研界一名新人也曾經在顯著性檢驗方面吃過許多苦頭。後來醉心於統計理論半載有餘才摸到顯著性檢驗的皮毛,也為顯著性檢驗理論之精妙,品種之繁多,邏輯之嚴謹所折服。在此,特寫下這篇博文,以供那些仍然掙扎在顯著性檢驗泥潭的非統計專業的科研界同僚們參考。由於筆者本人也並非統計專業畢業,所持觀點粗陋淺鄙,貽笑大方之處還望諸位業界前輩,領域翹楚不吝賜教。小可在此謝過諸位看官了。

     本篇博文致力於解決一下幾點問題,在此羅列出來:1.什麼是顯著性檢驗? 2.為什麼要做顯著性檢驗? 3.怎麼做顯著性檢驗?下面就請跟隨筆者的步伐一步步走入顯著性檢驗的“前世與今生”。

一:顯著性檢驗前傳:什麼是顯著性檢驗?它與統計假設檢驗有什麼關係?為什麼要做顯著性檢驗?

     “顯著性檢驗”實際上是英文significance test的漢語譯名。在統計學中,顯著性檢驗是“統計假設檢驗”(Statistical hypothesis testing)的一種,顯著性檢驗是用於檢測科學實驗中實驗組與對照組之間是否有差異以及差異是否顯著的辦法。實際上,瞭解顯著性檢驗的“宗門背景”(統計假設檢驗)更有助於一個科研新手理解顯著性檢驗。“統計假設檢驗”這一正名實際上指出了“顯著性檢驗”的前提條件是“統計假設”,換言之“無假設,不檢驗”。任何人在使用顯著性檢驗之前必須在心裡明白自己的科研假設是什麼,否則顯著性檢驗就是“水中月,鏡中花”,可望而不可即。用更通俗的話來說就是要先對科研資料做一個假設,然後用檢驗來檢查假設對不對。一般而言,把要檢驗的假設稱之為原假設,記為H0;把與H0相對應(相反)的假設稱之為備擇假設,記為H1。

     如果原假設為真,而檢驗的結論卻勸你放棄原假設。此時,我們把這種錯誤稱之為第一類錯誤。通常把第一類錯誤出現的概率記為α

     如果原假設不真,而檢驗的結論卻勸你不放棄原假設。此時,我們把這種錯誤稱之為第二類錯誤。通常把第二類錯誤出現的概率記為β

     通常只限定犯第一類錯誤的最大概率α, 不考慮犯第二類錯誤的概率β。我們把這樣的假設檢驗稱為顯著性檢驗,概率α稱為顯著性水平。顯著性水平是數學界約定俗成的,一般有α =0.05,0.025.0.01這三種情況。代表著顯著性檢驗的結論錯誤率必須低於5%或2.5%或1%(統計學中,通常把在現實世界中發生機率小於5%的事件稱之為“不可能事件”)。(以上這一段話實際上講授了顯著性檢驗與統計假設檢驗的關係)

     為了方便接下來的講授,這裡舉一個例子。趙先生開了一家日用百貨公司,該公司分別在鄭州和杭州開設了分公司。現在存在下列資料作為兩個分公司的銷售額,集合中的每一個數代表著一年中某一個月的公司銷售額。

     鄭州分公司Z = {23,25,26,27,23,24,22,23,25,29,30}

     杭州分公司H = {24,25,23,26,27,25,25,28,30,31,29}

現在,趙先生想要知道兩個公司的銷售額是否有存在明顯的差異(是否存在鄭州分公司銷售額>杭州分公司銷售額,抑或反之),以便對接下來公司的戰略業務調整做出規劃。下屬們知道趙老闆的難處,紛紛建議“只需要求平均值就知道哪個分公司的銷售額更大了”。但是作為擁有高學歷的趙先生懂得這樣一件哲學即“我們生活在概率的世界之中”。那也就意味著,平均值並不能夠說明什麼問題,即便杭州分公司的銷售額平均值大於鄭州分公司的銷售額平均值仍然不能說明杭州分公司的銷售額一定就大於鄭州分公司的銷售額,因為“這樣一種看似存在的大於關係實質上是偶然造成的而並不是一種必然”。

     趙先生最終決定,使用方差驗檢查這兩個資料。(請先忽略為什麼用方差檢驗,檢驗方法的選擇下文中會詳述)

     最後趙先生髮現,方差檢驗的p 值= 0.2027,那也就意味著,雖然杭州分公司的年平均銷售額26.63大於鄭州分公司的銷售額25.18,但是實質上,兩個分公司的銷售額並沒有明顯的差異。(相信此時的你心中有萬千草泥馬奔過:方差檢驗是怎麼做的?p值是什麼鬼?為什麼p=0.2027意味著銷售額沒有明顯差異?資訊量好大腫麼辦?)

不要急,不要慌,讓我們從頭來過,整理一下趙先生這裡究竟發生了什麼。這裡很有必要了解一下根植於趙先生思維裡的“慢動作”。

第一點:如上文所述的一樣,“無假設,不檢驗”,趙先生做了什麼樣的假設(Hypothesis)?

由於趙先生想要知道兩個公司的銷售額是否有存在明顯的差異 ,所以他的假設就是“樣本集Z(鄭州分公司)和樣本集H(杭州分公司)不存在顯著性差異,換言之這兩個集合沒有任何區別(銷售額間沒有區別)!”這就是趙先生的假設。那麼問題來了,為什麼趙先生要假設這兩個樣本集之間不存在任何區別,而不是假設這兩個樣本集存在區別。因為這個假設(Hypothesis)正是方差檢驗的原假設(null hypothesis)。那麼問題又來了,什麼是原假設。所謂原假設是數學界為了方便討論而預設的“原始的假設”。沒有什麼為甚麼可言,約定俗成罷了。

第二點:p值怎麼回事?

這裡並不用管p值是怎樣得到的,直接給出結論。在顯著性水平α =0.05的情況下,p>0.05接受原假設,p值<0.05拒絕原假設。我們的原假設是樣本集Z和樣本集H間不存在顯著性差異,但是由於p=0.2027>0.05,所以接受原假設,即樣本集Z和樣本集H間不存在顯著性差異。當然有接受就有拒接,如果這裡的p值小於0.05,那麼就要拒絕原假設,即集合Z和集合H間存在顯著性差異。

第三點:怎麼做方差檢驗以及為何做方差檢驗之後再細講,這裡暫且不表。

在這一章節的最後,給出本章的兩個問題的答案,相信你現在已經可以理解:

1什麼是統計假設檢驗?

所謂統計假設檢驗就是事先對總體(隨機變數)的引數或總體分佈形式做出一個假設,然後利用樣本資訊來判斷這個假設是否合理。而把只限定第一類錯誤概率的統計假設檢驗就稱之為顯著性檢驗。在上例中,我們的假設就是一種顯著性檢驗。因為方差檢驗不適用於估計引數和估計總體分佈,而是用於檢驗試驗的兩個組間是否有差異。而方差檢驗正是用於檢測我們所關心的是這兩個集合(兩個分佈)的均值是否存在差異。

2.為什麼要做顯著性檢驗?

因為我們想要判斷樣本與我們對總體所做的假設之間的差異是純屬機會變異,還是由我們所做的假設與總體真實情況之間不一致所引起的。 在我們的例子中,差異就是H的均值要高於Z的均值,但是最終的結論p>0.05證明,這個差異純屬機會變異(H均值>Z均值是偶然的,當H和Z的取樣點數趨於無窮多時,H的均值會趨近等於Z的均值)而不是假設與真實情況不一致。如果p值<0.05,那麼也就意味著我們的假設(H集合和Z集合沒差別)與真實情況不一致,這就使得假設不成立,即H集合和Z集合有差別。

二:怎麼做顯著性檢驗?(基於MATLAB)

顯著性檢驗可以分為引數檢驗和非引數檢驗。引數檢驗要求樣本來源於正態總體(服從正態分佈),且這些正態總體擁有相同的方差,在這樣的基本假定(正態性假定和方差齊性假定)下檢驗各總體均值是否相等,屬於引數檢驗。

當資料不滿足正態性和方差齊性假定時,引數檢驗可能會給出錯誤的答案,此時應採用基於秩的非引數檢驗。

引數檢驗的方法及其相應知識點的解釋(這裡只給出引數檢驗中常見的方差分析):

方差分析主要分為'①單因素一元方差分析'; '②雙因素一元方差分析 '; '③多因素一元方差分析 '; '④單因素多元方差分析 '。下面一節對各種方差分析的實現方法進行介紹。但在介紹之前,我要首先“劇透”一下兩個重要的點,理解這些點有助於區別不同型別的方差分析。

什麼叫做因素,什麼叫做元?

先解釋一下什麼叫做"元"。我假定正在看這篇博文的人一定具有小學以上文化水平,那麼想必你一定對“一元二次方程”“二元一次方程”“多元一次方程”這種概念不陌生。所謂的“元”,正是指未知變數的個數。在統計假設檢驗中,仍然把待檢驗的未知變數稱之為“元”而把影響未知變數的行為(事件)稱之為“因素”。有過機器學習基礎的同學可以把“元”和“因素”分別理解成機器學習中的“特徵個數”和“標籤個數”。擁有多個特徵便是“多元”,而擁有多個標籤便是“多因素”。

①單因素一元方差分析的方法和案例:

相關MATLAB函式:

函式一:anova1( X, Group, displayopt)

引數解釋:在第一種用法中,X是一個n行1列的陣列,Group也是一個n行1列的陣列。X為待檢驗的樣本集,這個樣本集中包括若干個對照組和實驗組的全部資料。那麼機器怎麼知道哪個資料屬於哪個組呢?很簡單,通過Group這個列向量一一對應指明即可。一下這個例子來自於MATLAB的help文件,在這裡用於例項說明:

假定現在有三組資料

組一(st):82 86 79 83 84 85 86 87

組二(al1):74 82 78 75 76 77

組三(al2):79 79 77 78 82 79

現在需要對這三組資料做方差檢驗,使用anova1函式的方法如下

1.首先將所有的資料放在同一個陣列strength中:

>> strength = [82 86 79 83 84 85 86 87 74 82 78 75 76 77 79 79 77 78 82 79];

2.設定對應與strength對應位置的標籤為alloy:

>> alloy = {'st','st','st','st','st','st','st','st','al1','al1','al1','al1','al1','al1','al2','al2','al2','al2','al2','al2'};

3.呼叫anova1函式

>> p = anova1(strength,alloy)

最終得到的結果會是一個數值和兩幅圖,一個值是p值。p值得看法在上文已經介紹過,這裡不再細細的介紹。在本例中,p的值如下

p =

  1.5264e-004

顯然,從p值看,三組值之間存在顯著性差異。有一點必須提一下:這裡p存在顯著性差異並不意味著三組之間兩兩都存在顯著性差異,而只是說明顯著性差異在這三組之間存在。

第一幅圖是一張表,這張表被稱之為ANOVA表。相信許多非統計專業的同學見到ANOVA表的一瞬間是崩潰的,一堆問題奔湧而出:

Source是什麼鬼?SS是什麼鬼,df是什麼鬼,MS是什麼鬼,F是什麼鬼,Prob>F是什麼鬼,etc.

這裡為了解決“什麼鬼”的問題,對這張表給出詳細的解釋:

Source表示方差來源(誰的方差),這裡的方差來源包括Groups(組間),Error(組內),Total(總計);

SS(Sum of squares)表示平方和

df(Degree of freedom)表示自由度

MS(Mean squares)表示均方差

F表示F值(F統計量),F值等於組間均方和組內均方的比值,它反映的是隨機誤差作用的大小。

Prob>F表示p值

這裡需要引出兩個小問題:第一個小問題是F值怎麼使用,第二個小問題是p值和F值的關係是什麼?

率先普及一下p值和F值之間的關係:

F實際值>F查表值,則p<=0.05

F實際值<F查表值,則p>0.05

不難看出F值在本例中等於15.4,它正是組間方差92.4和組內方差6的比值。查F分佈表(下圖),

根據 n=19( Total 的df),m=2(Groups的df)

可得F0.05( m, n-m-1) = F0.05( 2, 16) = 3.634。F實際值15.4>F查表值3.634,所以可以判定顯著性差異存在,且p值小於0.05

以上講述瞭如何僅僅使用F值判斷顯著性差異的方法並講述了F值同p值之間的關係。下面這張表格是箱型圖,它的看法如下圖所表注:

這裡有必要提一下anova1函式中的引數displayopt 的作用。在大規模的anova1呼叫中(例如把anova1放在for迴圈中反覆呼叫),需要把displayopt設定為'off',否則anova1每呼叫一次就會繪製兩幅圖,這樣會迅速的耗費計算機的記憶體,容易造成程式崩潰。

除了上文中介紹的第一種呼叫anova1的方式,還有一種方式用於均衡的方差分析。所謂均衡就是要求不同的組別內的統計資料個數必須相同。在上例中出現的各個組的統計個數分別為{8,6,6}就屬於非均衡。在均衡狀態下,每個組的資料單獨構成X中的一列,這樣便可以省略引數Group,呼叫方式就可以簡化為anova1(X)

在上文中,我們提到過。方差分析必須滿足兩條假設,分別是正態性假定和方差齊性假定。因此,在一個完整的統計工程中,必須首先檢測資料的正態性假定和方差齊性假定,這就涉及到另外兩個函式lillietest正態檢驗函式(這正是我們上文提到的分佈假設檢驗而不是引數檢驗,它檢驗的目標是資料集服從何種分佈)和vartestn方差齊性檢驗(這正是我們上文提到的引數檢驗而不是分佈假設檢驗 ,它檢測的目標是資料集的分佈服從什麼樣的引數,這裡就是方差)

函式二:lillietest(X)

>> [h,p] = lillietest (strength(1:8))

h =

     0

p =

    0.5000

解釋:h = 0可以認為資料服從正態分佈,h=1則認為不服從正態分佈

p >0.05可以認為接受原假設h = 0,則資料服從正態分佈

>> [h,p] = lillietest (strength(9:14))

h =

     0

p =

    0.5000

>> [h,p] = lillietest (strength(15:20))

h =

     0

p =

    0.5000

可以得出結論,strength中三組數都服從正態分佈

函式三:vartestn(X, Group)

>> p = vartestn(strength,alloy,'off')

p

=0.5142

注意:X和Group必須是列向量,否則會報錯

p>0.05則說明X中的不同Group是齊次的,也就是方差性齊。

②雙因素一元方差分析的方法和案例:

正如上文所述,既然是雙因素,那便是有多個標籤了。因此雙因素一元方差分析可以理解成“單特徵雙標籤機器學習技術”。由於雙因素一元方差分析要求資料是均衡的,所以它的標籤可以省略,就如同上文中介紹的anova1的第二種使用方法一樣。這裡的例子引用於MATLAB的anova2的help文件,用於說明anova2的使用方法。

這裡有一批爆米花資料,現在我們知道這些爆米花的質量打分同兩個因素相關,一個是爆米花的品牌(有三個品牌:Gourmet,National,Generic)另一個是爆米花的製作工藝(油炸,氣壓)。這些資料如下所述:

                     brand    Gourmet        National       Generic

methods

     油炸                        5.5000          4.5000         3.5000

     油炸                        5.5000          4.5000         4.0000

     油炸                        6.0000          4.0000         3.0000

     氣壓                        6.5000          5.0000         4.0000

     氣壓                        7.0000          5.5000         5.0000

     氣壓                        7.0000          5.0000         4.5000

現在需要了解的目標有三個,第一:列和列之間是否有顯著性差異(品牌間的顯著性差異),原假設是顯著性差異不存在;第二:行與行之間是否存在顯著性差異,原假設是顯著性差異不存在 ;第三:品牌和方法之間的互動作用是否明顯,原假設是互動作用不明顯

為了完成以上三個問題,所以特別引入anova2函式,anova2函式的引數如下:

p = anova2( X, reps, displayopt)

X即為待檢驗陣列。其中,X的每列一代表一種因素,X的每若干行代表另一種因素,這裡的若干使用reps指明。displayopt同anova1一樣,這裡不再詳述。anova2的返回是一值一幅圖。下面是具體的MATLAB方法:

>> popcorn =[

  5.5000  4.5000  3.5000

  5.5000  4.5000  4.0000

  6.0000  4.0000  3.0000

  6.5000  5.0000  4.0000

  7.0000  5.5000  5.0000

  7.0000  5.0000  4.5000];

>> [p,table,stats] = anova2(popcorn,3)

p =

    0.0000    0.0001    0.7462

解釋:p(1) = 0.0000, 推翻原假設,所以列與列之間的顯著性差異存在(品牌間存在顯著性差異);p(2) = 0.0001,推翻原假設,所以行與行之間的顯著性差異存在(方法間的顯著性差異存在);p(3) = 0.7462,保留原假設,則品牌和方法間的互動作用不明顯。

圖表中的Columns代表列,Rows代表行,Interaction代表互動作用,其他的與我們在anova2中講述的完全相同,這裡也不再詳細分析。

③多因素一元方差分析的方法和案例:

p = anovan(X, Group, Opt);

其中,X代表著待檢驗資料;Group代表著X的因素,由於是多因素,所以Group是多個列組成的。Opt可以選擇為'model',model後面可以填寫'full'和'interaction'。

比如因素有三個x,y,z,那麼如果model為interaction,計算結果會包括x的顯著性,y的顯著性,z的顯著性,xy,xz,yz的互動影響顯著性

如果model為full,計算結果會包括x的顯著性,y的顯著性,z的顯著性,xy,xz,yz的互動影響顯著性以及xyz的互動顯著性。

這裡的例子仍然來自於MATLAB的help文件,y是待檢驗的資料,g1,g2,g3是與y中資料一一對應的3個因素(資料標籤)

y = [52.7 57.5 45.9 44.5 53.0 57.0 45.9 44.0]';

g1 = [1 2 1 2 1 2 1 2];

g2 = {'hi';'hi';'lo';'lo';'hi';'hi';'lo';'lo'};

g3 = {'may';'may';'may';'may';'june';'june';'june';'june'};

>> p = anovan(y,{g1 g2 g3},'model','interaction')

p =

    0.0347

    0.0048

    0.2578

    0.0158

    0.1444

    0.5000

這裡有一個使用的小竅門,如果你想做非平衡雙因素一元方差分析那麼也可以採用多因素一元方差分析函式。

④單因素多元方差分析的方法和案例:

[d, p] = manova1(X, Group);

p,X和Group與之前相同。該方差分析的原假設是“各組的組均值是相同的多元向量”這裡對d做出解釋:

d=0,接受原假設

d=1,拒絕原假設,認為各組的組均值不完全相同,但是不能拒絕它們共線的假設。

d=2,拒絕原假設,各組的組均值向量可能共面,但是不共線。

四種商品(x1,x2,x3,x4)按照不同的兩種銷售方式進行銷售,資料如下:

編號   x1     x2     x3     x4     銷售方式

1      125    60     338     210     1

2     119     80     233     330     1

3       63     51     260     203     1

4       65     51     429     150     1

5     130     65     403     205     1

6       65     33     480     260     1

7     100     34     468     295     2

8       65     63     416     265     2

9     110     69     377     260     2

10     88     78     299     360     2

11     73     63     390     320     2

12   103     54     416     310     2

13     64     51     507     320     2

>> X =

   125    60   338   210

   119    80   233   330

    63    51   260   203

    65    51   429   150

   130    65   403   205

    65    33   480   260

   100    34   468   295

    65    63   416   265

   110    69   377   260

    88    78   299   360

    73    63   390   320

   103    54   416   310

    64    51   507   320

>> Groups =

     1

     1

     1

     1

     1

     1

     2

     2

     2

     2

     2

     2

     2

>> [d, p] = manova1(X, Groups);

d =

     0

p =

    0.0695

因此,拒絕原假設,各組的組均值不是相同的多元向量。

非引數檢驗:

到這類,引數檢驗部分就算是說完了。我們可以回顧一下,引數檢驗的四種函式分為anova1,anova2,anovan,manova1。他們都基於共同的兩個假設:正態性假定和方差齊性假定 ,分別對應著函式lillietest 和vartestn。但是,我們在實際工作中,不可能總是遇到滿足這兩個假定的統計資料,這時候,如果強行採用引數檢驗就會造成錯誤。此時,可以採用基於秩和的非引數檢驗。這裡我們介紹兩種非引數檢驗:Kruskal-Wallis檢驗,Friedman檢驗。通過引數檢驗的部分介紹,想必讀者已經對顯著性檢驗入門,有些細節這裡不再詳細介紹,留作有興趣讀者自行查詢。這裡對分引數檢驗只做必要介紹。

①Kruskal-Wallis檢驗

Kruskal-Wallis檢驗又被稱之為單因素非引數方差分析,是非引數版的anova1。該檢驗的原假設是:k個獨立樣本來自於相同的正態總體。其MATLAB函式如下:

p = kruskalwallis(X,Group)

X,Group,p和引數檢驗裡的完全相同。不再詳細介紹。

②Friedman檢驗

Friedman檢驗又被稱之為雙因素秩方差分析,是非引數版的anova2。同anova2一樣,待檢驗的資料也必須是均衡的。但是需要特別注意的是,Friedman檢驗和anova2檢驗不完全相同,anova2同時注意兩個因素對待檢驗資料的影響,但是,Friedman檢驗只注重2個因素中的其中一個對待檢驗資料的影響,而另一個因素則是用來區分割槽組用的。

如上圖所示矩陣X,Friedman檢驗只關注X的各個列(因素A)水平之間有無顯著差異,他對各行之間(因素B,也被稱之為區組因素)完全不感興趣。因此,Friedman檢驗的原假設是k個獨立樣本(X的各列)來自於相同的正態總體。至於為何Friedman檢驗對因素B不感興趣,這裡通過一個例子說明。該例子來源於《MATLAB統計分析與應用40個案例分析》

有4名美食評委1234對來自於四個地區ABCD的名廚的名菜水煮魚做出評價打分,資料如下:

               地區       A       B       C      D

美食評委 

     1                    85     82     82     79

     2                    87     75     86     82

     3                    90     81     80     76

     4                    80     75     81     75

現在我們想知道,這四個地方的水煮魚品質是否相同。

資料分析:我們的目標是四個地方水煮魚的品質是否相同。那麼同一個評委對四個地區廚師的打分就具有可參考性,而不同地區評委之間對同一個廚師的打分參考性幾乎沒有(受評委自己的主觀意識影響太強)。因此,我們認為四個地區是因素A,而評委是因素B(區組因素),不同區組之間的資料沒有可比較性。

>> X =

    85    82    82    79

    87    75    86    82

    90    81    80    76

    80    75    81    75

>> p = friedman(X,1)

p = 0.0434

因此可以認為,四個地區製作水煮魚的水平有顯著性差別。至於是那兩個之間有顯著性差別還需要一一比較。

結語:講到這裡,常見的顯著性檢驗方法就算是講完了。希望通過這篇博文可以使顯著性檢驗不再成為各位看官的心頭大患,不必再談“檢”色變。如果真的可以做到這樣,於願足矣。