R語言卡方檢驗與結果可視化
1,卡方分析簡介與實例
2,R語言chisq.test()
3,基於ggstatsplot包的可視化分析
卡方分析簡介與實例:
卡方檢驗是生物學中應用很廣的一種假設檢驗,可以通過對構成比,率進行檢驗,進而判斷分類資料間的偏差程度。若卡方值越大,二者偏差程度越大;反之,二者偏差越小。其中卡方分析的原假設是觀察頻數與期望頻數無差別,所以說當p值顯著時,則拒絕原假設,認爲二者之間有明顯差異。總而言之,卡方分析即是用來判斷兩個樣本間的差異程度,從而推斷兩個變量之間有沒有關係。
一般常見的卡方分析是2x2列聯表形式,例如服用某種藥物是否對死亡率有影響:(自己編的數據)
簡單統計之後,得到總數和死亡率:
原假設是:服藥組和未服藥組之間頻數無顯著差異(服藥對死亡率無影響)
先計算自由度:(行數-1)*(列數-1)=1
這個是卡方的計算公式,R代表實際值,T代表理論值,理論值需要進一步計算纔可以知道。
此處理論的死亡率就是20.69%,根據該數值計算出各個值的理論值:未服藥組【治癒:328x(1-0.2069),死亡:328x0.2069】服藥組同理也可以計算出結果,得到:
根據公式計算出卡方的值:
x2=(231-260.1368)2/260.1368+(97-67.8632)2/67.8632+(298-268.8609)2/268.8609+(41-70.1391)2/70.1391=31.03711
查表可知在自由度爲1的情況下,臨界概率是:3.84(95%),顯然31.03711>3.84,遠超卡方分佈的臨界值,同時31.03711>10.83(99.9%),對此我們便能得到結論,服藥組和未服藥組間有顯著差異。
R語言chisq.test()
在R語言中進行卡方檢驗還是十分方便的,只需要使用chisq.test即可實現,可以返回卡方值和對應的p值,同時還可以計算自由度。但是其對數據集的格式有一定的要求,如圖所示爲實際的操作步驟:
>治癒<-c(231,298)
>死亡<-c(97,41)
>data<-data.frame(治癒,死亡,row.names = c("未服藥組","服藥組"))
>chisq.test(data)
Pearson's Chi-squared test with Yates' continuity correction
data: data
X-squared = 29.981, df = 1, p-value = 4.362e-08
>data
治癒 死亡
未服藥組 231 97
服藥組 298 41
此處爲2X2列鏈表的實例,在實際生活中,往往需要將結果反應到圖像上,一般採用prism8或AI來製圖,在R語言中ggstatsplot包也可以實現在這方面的功能。
基於ggstatsplot包的可視化分析
ggstatsplot包常用於各種檢驗的可視化製圖中,在這裏只簡單介紹關於卡方分析的可視化。此處需要使用到ggbarstats函數,其參數可謂是非常的多,詳細的參數表我放在另一個博客中了,有興趣的朋友可以去看看(https://blog.csdn.net/m0_45248682/article/details/104086729)。務必記住ggbarstats函數對數據集的要求不同於chisq.test,它只能接受比率或者原始的統計數據,詳細的將舉例說明:
> head(mtcars) #原始數據集
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
> table(mtcars$vs) #頻數統計(chisq.test使用)
0 1
18 14
在此處若只有下圖的原始的數據則需要轉換一下(不知道有沒有更簡單的方法,向大家請教一下)
數據處理:
> status<-c(rep("治癒",231),rep("治癒",298),rep("死亡",97),rep("死亡",41))
> group<-c(rep("未服藥組",231),rep("服藥組",298),rep("未服藥組",97),rep("服藥組",41))
> data<-data.frame(status,group)
調用ggstatsplot包:(計算出95%置信區間並標記p值)
> ggstatsplot::ggbarstats(
+ data = data,
+ main = status,
+ nboot = 10,condition = group,
+ legend.title = "Group"
+ )
Note: 95% CI for effect size estimate was computed with 10 bootstrap samples.
# A tibble: 2 x 11
group counts perc N 死亡 治癒 statistic p.value parameter method significance
<fct> <int> <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl> <chr> <chr>
1 未服藥組 328 49.2 (n = 328) 29.57% 70.43% 54.7 1.37e-13 1 Chi-squared test for given probabilities ***
2 服藥組 339 50.8 (n = 339) 12.09% 87.91% 195. 2.80e-44 1 Chi-squared test for given probabilities ***
可以看見p值以及卡方值都被標註出來了,同時還可以通過title參數來加入標題,還可以轉化繪圖類型(從堆砌直方圖轉化爲餅圖)。
詳細的參數以及說明已經放到另一篇博文中了,有興趣的朋友可以打開看看。
https://blog.csdn.net/m0_45248682/article/details/104086729
參考文獻:
https://www.jianshu.com/p/6547fa7e97c1
https://www.meiwen.com.cn/subject/qfmmvftx.html