[R]Chi-square 卡方檢定

by wenwu
0 comment

[R]Chi-square 卡方檢定

若要分析類別型資料的話,最入門的就是卡方檢定
今天要介紹如何用R來使用卡方檢定


三種卡方檢定

卡方適合度檢定
卡方同質性檢定
卡方獨立性檢定


卡方適合度檢定

主要使用於抽樣一組(次)的樣本

H0 : 資料分配符合期望值
H1 : 資料分配不符合期望值

我們想知道這顆骰子是不是公正的,那我們檢查骰子出現1到6的機率是不是都是1/6
首先我們紀錄每次投骰子的結果,總共六百次(使用sample.int產生投骰子的資料)
使用table就可以看到每個數字出現的次數
接下來使用卡方檢定 
可以看到圖中的卡方值是7.12 而 p-value = 0.2119 
因為 p-value >0.05 所以不拒絕 H0,表示這顆骰子是公正的

若我們想要知道特定的機率,也可以在chisq.test函數裡面調整
在裡面使用 p=c(2/6,0/6,1/6,1/6,1/6,1/6)
表示我們想要知道投骰子的機率是否為 : 數字1出現的機率為 2/6,而出現的機率為 0 , 而其他的機率同樣為 1/6 
可以看到圖中的卡方值是Inf 而 p-value = <0.0001
因為 p-value <0.05 所以拒絕 H0

set.seed(53) #使用 set.seed可以 設定產生隨機樹的初始值
x <- factor(sample.int(6,size = 600,replace = T))
table(x)
chisq.test(table(x))
chisq.test(table(x),p = c(2/6,0/6,1/6,1/6,1/6,1/6))

卡方獨立性檢定

主要使用於抽樣兩組(次)與兩組(次)以上的樣本

H0 : 研究資料彼此獨立
H1 : 研究資料彼此獨立

假設我們想知道學生餐廳中,同學選擇主餐是否與湯品的選擇是否有關係
同樣,生200個1到3的隨機變數,使用兩個ifelse 將 1 = ”chicken” , 2 = ”pork” , 3 = ”beef”
湯品的地方也是,湯品則是兩種

使用table就可以看到每個類別出現的次數
接下來使用卡方檢定 
可以看到圖中的卡方值是0.57005 而 p-value = 0.752
因為 p-value >0.05 所以不拒絕 H0,表示同學選擇主餐與湯品是獨立的

set.seed(35)
yy = sample.int(3,size = 200,replace = T)
meat = ifelse(yy==1,”chicken”,ifelse(yy==2,”pork”,”beef”)) #分類
#使用兩個 ifelse 將 1 = ”chicken” , 2 = ”pork” , 3 = ”beef”
set.seed(23)
soup = ifelse(sample.int(2,size = 200,replace = T)==1,”tomato”,”mushroom”)
table(meat,soup)
chisq.test(table(meat,soup))

卡方同質性檢定

主要使用於抽樣兩組(次)與兩組(次)以上的樣本

H0 : 檢定資料是否來自同一個母體,或母體分配相同
H1 : 檢定資料是否來自不同母體,或母體分配不同

其實「卡方獨立性檢定」跟「卡方同質性檢定」的方法是一樣的,然而兩個切入的角度完全不一樣
兩者的差別是「卡方獨立性檢定」主要探討的是「資料關聯性」,而「卡方同質性檢定」探討的則是「各類別比例是否相同」

我們直接來看例子

假設想知道不同性別,眼睛的狀況是否有同樣的分配,我們使用卡方同質性檢定
同樣,生200組樣本,分別是性別以及眼睛的狀況(近視和遠視)

使用table就可以看到每個類別出現的次數
接下來使用卡方檢定 
可以看到圖中的卡方值是4.461 而 p-value = 0.03468
因為 p-value < 0.05 所以拒絕 H0,表示不同的性別,眼睛的狀況分布是不同的

set.seed(22)
sex = ifelse(sample.int(2,size = 200,replace = T)==1,”male”,”female”)
set.seed(556)
status = ifelse(sample.int(2,size = 200,replace = T)==1,
 “shortsighted”,”longsighted”) #近視和遠視
table(sex,status)
chisq.test(table(sex,status))

如果遇到儲存格內的觀測次數小於五 可以用卡方檢定嗎 ?

最後,介紹一下使用卡方時會遇到的狀況
我們常常看到 使用卡方檢定時每一格子的觀測次數不得小於五
所以遇到小於五的話該怎麼辦呢?

首先,可以判斷一下是否可以繼續使用卡方檢定或是使用別的方法

當df>1 時,如果不超過20%的格子的觀測次數小於五(或是有80%以上的格子都大於五,就可以使用卡方檢定,! 注意不許有儲存格出現0的情況 !

另一種方法,可以合併小於五的儲存格
這個方法可以解決問題,但是我們損失的資訊越多,檢定的結果就越有偏差

如果以上的情況都沒有幫助,可以使用葉式連續校正,或是使用費雪精確檢定(Fisher’s Exact Test)

Related Articles

發表迴響