克莱姆V(克莱姆相关系数、克莱姆关联系数、独立系数)的MATLAB计算
? ? ? ? 前些時間需要衡量多個分類數據之間兩兩相關程度,想找出最相關的一對分類數據;于是想到了曾經看過的克萊姆相關系數,但在網上搜了好久之后,即沒發現Matlab現成的built-in函數,也沒找到別人分享的Matlab代碼,于是決定自己動手寫一個~
? ? ? ? 克萊姆V(Cramer’s V),又稱為克萊姆相關系數、克萊姆關聯系數、獨立系數等,是雙變量相關分析的一種方法,專門用于衡量分類數據與分類數據之間相關程度。該系數取值范圍為0到1,0表示兩個變量無關,1表示完全相關。
? ? ? ? 這里主要參考【高橋 信/著, 陳剛/譯. 漫畫統計學. 科學出版社, 2009: 127-142.】中的內容,基于matlab實現計算克萊姆V的函數。首先給出函數代碼:
function [ cramer_V ] = CramersV( x1,x2 ) %Author: https://blog.csdn.net/jbb0523 %Version: 1.0@2019-05-27 %Description: compute variable Cramer's V between x1&x2 %Reference: 高橋 信/著, 陳剛/譯. 漫畫統計學. 科學出版社, 2009: 127-142.%Step 1: Observed frequency(contigency table )sym_x1 = unique(x1);sym_x2 = unique(x2);contigency_tab = zeros(length(sym_x1),length(sym_x2));for i=1:length(sym_x1)for j=1:length(sym_x2)ind_x1 = (x1==sym_x1(i));ind_x2 = (x2==sym_x2(j));contigency_tab(i,j) = sum(ind_x1&ind_x2);endend%Step 2: Expected frequencycontigency_mean = zeros(length(sym_x1),length(sym_x2));for i=1:length(sym_x1)for j=1:length(sym_x2)contigency_mean(i,j) = sum(contigency_tab(i,:))*sum(contigency_tab(:,j))/sum(contigency_tab(:));endend%Step 3&4: Pearson chi-square statisticchi_square = sum(sum(((contigency_tab - contigency_mean).^2)./contigency_mean));%Step 5: Cramer's Vcramer_V = sqrt(chi_square/sum(contigency_tab(:))/(min(length(sym_x1),length(sym_x2))-1)); end整個計算過程其實很簡單,這里簡要解釋一下:
? ? ? ? Step1對應于Reference中的步驟1(P130),即計算列聯表(contingency table),也就是下圖中框內的數據:
? ? ? ? Step2對應于Reference中的步驟2(P130),計算期望次數,方框內的每個元素實際上就是第1步列聯表對應的該行元素之和乘以該列元素之和再除以所有元素之和(例如女性行、打電話列為148*72/300,148為女性行元素之和(34+61+53),72為打電話列元素之和(34+38),300為所有元素之和(34+61+53+38+40+74)):
? ? ? ? 接下來計算皮爾森卡方統計量之值,在Reference中分兩步完成,這里合二為一:
其中((contigency_tab - contigency_mean).^2)./contigency_mean對應于Reference中的步驟3(P131):
? ? ? ? 然后用兩層sum求和實現計算矩陣元素之和,即Reference步驟4(P132):
? ? ? ? 最后一行計算Cramer’s V,這里計算列聯表元素之和用sum(contigency_tab(:))實現,其中(:)表示將矩陣變為一個向量,即步驟5(P133):
有了以上函數之后,可以執行以下三行代碼計算Reference中第127~133頁的例子:
x1 = [ones(148,1);2*ones(152,1)]; x2 = [ones(34,1);2*ones(61,1);3*ones(53,1);ones(38,1);2*ones(40,1);3*ones(74,1)]; cramer_V= CramersV(x1,x2)程序輸出為0.1634,說明程序是正確的。
?
? ? ? ? Reference的第138頁還有一個例題,列聯表如下:
執行以下三行代碼:
x1=[ones(43,1);2*ones(51,1);3*ones(29,1);ones(33,1);2*ones(53,1);3*ones(41,1)]; x2=[ones(123,1);2*ones(127,1)]; cramer_V= CramersV(x1,x2)程序輸出為0.1157,與Reference第141頁給出的結果相同。
?
? ? ? ? 注意:以上均使用1、2、3等表示分類數據中的類別,具體問題隨意,只要輸入的x1和x2是兩個包含有限類別個數的向量即可,至于用哪個數據表示哪個類別并沒有限制,因為在最開始給出的CramersV函數里使用了Matlab的built-in函數unique來識別包含哪些類別。
?
補充@20200215:若想在論文中引用Cramer's V,可參考如下文獻:
直接搜索Cramer's V可以搜到以下文獻:
[1] Michael W. Kearney, Cramér's V, In book: Sage Encyclopedia of Communication Research Methods, Publisher: Sage (https://www.researchgate.net/publication/307963787_Cramer's_V)?
以上文獻影響似乎不是很有影響,在wikipedia (http://en.volupedia.org/wiki/Cram%C3%A9r%27s_V?或 https://en.academic.ru/dic.nsf/enwiki/11586155),包括以上文獻中,都提到了Cramer本人所著的專著:
[2] Cramér, Harald. 1946. Mathematical Methods of Statistics. Princeton: Princeton University Press, page 282 (Chapter 21. The two-dimensional case).
這本書是1946年的,也有人引用為1999年,是第N次印刷的時間,沒有找到好的資源,以下鏈接可供參考:http://www.doc88.com/p-6059182784178.html
總結
以上是生活随笔為你收集整理的克莱姆V(克莱姆相关系数、克莱姆关联系数、独立系数)的MATLAB计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 门窗计算机公式,门窗天使软件怎么编辑公式
- 下一篇: 计算机云平台架构,基于虚拟化技术的云计算