1. 程式人生 > >【通俗向】方差分析--T檢驗和F檢驗的異同

【通俗向】方差分析--T檢驗和F檢驗的異同

最近在圖書館借了本《R和ASReml-R統計分析教程》,林元震和陳曉陽主編的關於R的書籍,當時看上這本書的原因在於裡面以統計學知識為主,作為R語言實戰的良好補充,雖然R語言實戰是一本相當詳實的介紹R語言的書,但是其中的統計學原理往往一筆帶過(雖然本書也不是很詳盡),但是作為一個數據分析從業人員,我感覺對於很多統計理論,達到可以講明白原理和邏輯就可以,具體的計算過程和推導反而在其次,而最重要的是在什麼情況下應用什麼演算法和模型,這才是最關鍵的。

這篇部落格分享下對方差分析的理解。

其實在之前的文章中,對t檢驗相關說明比較多,而方差分析和t檢驗方法的功效和作用非常相近,網上對此也不是很詳盡,下面首先說說我的理解。

這裡說的t檢驗是雙樣本t,也就是兩組數,看這兩組資料對應的總體差異;方差檢驗也是看兩組(及以上)的資料見有沒有差異,那麼其實二者是不是一樣呢?

其實在某種程度是一樣的。下面的情況分為兩個維度:檢驗的組數和組內方差

情況1:僅有兩組,且組內方差相等

在這種情況下,t檢驗和F檢驗相等

我們看下F檢驗的原理,F檢驗是看F分佈,而F value是SSB/SSW,關於SSB和SSW可以參考可汗學院有一節專門講組間平方和(SSB)和組內平方和(SSW),如果我們把組間平方和理解為兩組之間的差異,組內平方和理解為兩組內部不同資料的差異的話,那麼簡單點說,兩個資料在有差異的前提下,究竟是組間的差異大,還是組內的差異大呢?如果是組間的差異大,那麼這兩組資料本身不一致的概率就非常大了,對應F值比較大;

那麼看看兩組的t檢驗,t檢驗的前提是兩組資料都是從不同樣本抽出的資料,而樣本都符合正態分佈,然後用這兩個樣本推斷這兩個總體存不存在差異;舉個例子,我有一缸黑米,和一缸白米,為了看這兩缸米的密度有沒有差異,用小勺各盛了十次,觀察密度,然後用小勺的十次,去判定總體的差異;如果想用t檢驗,前提假設是由於隨機誤差,兩缸米在抽取的時候密度會有隨機誤差,那麼每次抽取的密度都呈現正態分佈,還有一個假設,就是兩個勺子盛的米離散程度是相等的,也就是方差相等。所以,在方差相等,或者說方差齊的前提是t檢驗的必要前提。而F檢驗不要求方差齊,或者說本身就是檢查方差的差異的。

按照之前的定義,如果兩組方差齊,由於F檢驗的F值是SSB/SSW,組內方差相等,如果兩組有變異,那麼全部都是由於組間差異造成的,F檢驗自然成了t檢驗,下面附上F檢驗和t檢驗的程式碼和結果(資料參考了《R和ASReml-R統計分析教程》中的資料):

weight<-scan()
16.68 20.67 18.42 18 17.44 15.95 18.68 23.22 21.42 19 18.92 NA

V<-rep(c('LY1','DXY'),rep(6,2))
df<-data.frame(V,weight)
a<-subset(df$weight,V=='LY1')
b<-subset(df$weight,V=='DXY')
var.test(a,b)
t.test(a,b,var.equal=T,paired = F)

t檢驗的結果是:

Two Sample t-test

data:  a and b
t = -2.1808, df = 9, p-value = 0.0571
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -4.86513222  0.08913222
sample estimates:
mean of x mean of y 
   17.860    20.248 

F檢驗:

fit<-aov(weight~V,data=df)
summary(fit)

結果:

  Df Sum Sq Mean Sq F value Pr(>F)  
V            1  15.55   15.55   4.756 0.0571 .
Residuals    9  29.43    3.27                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
1 observation deleted due to missingness

可以看到p值都是0.0571,相等,因為前提是在t檢驗中加入了var.test,然後設定引數var.equal=T。下面看看方差不等的情況:

情況2,兩組資料,方差不齊

在這種情況下,如果忽略了方差齊的前提,比如我重新做一組資料,先檢測防擦:

weight<-scan()
16.68 20.67 18.42 18 17.44 30 18.68 23.22 21.42 19 18.92 82

V<-rep(c('LY1','DXY'),rep(6,2))
df<-data.frame(V,weight)
a<-subset(df$weight,V=='LY1')
b<-subset(df$weight,V=='DXY')
var.test(a,b)

看到檢測結果:

F test to compare two variances

data:  a and b
F = 0.038913, num df = 5, denom df = 5, p-value = 0.002832
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.005445095 0.278085194
sample estimates:
ratio of variances 
        0.03891273 

p為0.002832,所以方差不齊;

但是然後我們進行方差齊的t檢驗:

t.test(a,b,var.equal=T,paired = F)
Two Sample t-test

data:  a and b
t = -0.98304, df = 10, p-value = 0.3488
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -33.77097  13.09431
sample estimates:
mean of x mean of y 
 20.20167  30.54000  

看到兩組均值相等的概率好大;

方差不齊調整後的t檢驗:

t.test(a,b,var.equal=F,paired = F)
Welch Two Sample t-test

data:  a and b
t = -0.98304, df = 5.3885, p-value = 0.3676
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -36.79643  16.11976
sample estimates:
mean of x mean of y 
 20.20167  30.54000 

P值是0.3676 稍微比之前大一些;

F檢驗:

fit<-aov(weight~V,data=df)
summary(fit)
  Df Sum Sq Mean Sq F value Pr(>F)
V            1    321   320.6   0.966  0.349
Residuals   10   3318   331.8       

p是0.349;這和t檢驗在方差齊的前提下是相等的。

我理解是這樣的:

t檢驗的前提是方差齊,只有方差齊了,t檢驗的結果才反應兩組資料的是否有差異,否則如果方差不齊的話,會把組內的差異也考慮進去,所以判定的概率就更寬鬆;而F檢驗其實就是看組間差異和組內差異的比較,所以本質上和t檢驗方差齊的概念相似。但是實際上在方差不齊的時候是無法進行t檢驗的,結果不具有統計學意義。

情況3&4:多組情況下,方差齊&多組方差不齊

t檢驗一般適用於兩組,所以在多維的情況下,不適用t檢驗,而F檢驗可以判定多組、一組多變數和多組間有互動(單因素、協方差、雙因素無重複、雙因素有重複等),然後在通過兩兩比較進行分析,用duncan和tukey等方法去判定。