書名: R語言醫學多元統計分析作者名: 趙軍 戴靜毅編著本章字數: 3109字更新時間: 2023-11-29 19:29:21
1.3 距離、相異系數、相似系數和列聯系數
在分類問題中,一般會把特征接近的事物歸為一類,把特征不同的事物歸為不同的類。因此,首先需要建立定量指標來刻畫事物之間的相近程度或相似程度。這類指標就是距離、相異系數、相似程度和列聯系數。它們是學習多元統計分析方法的基礎。
1.3.1 基于數值型變量的距離
一個研究對象常常需要用多個變量來刻畫其特征。如果n個對象需要用p個數值型變量描述,那么可以把這n個對象看成p維空間中的n個點。很自然地,兩個對象之間的相似程度可用p維空間中兩點之間的距離來度量。令dij表示對象Xi與Xj的距離,常用的距離定義有以下幾種。
(1)歐氏距離
(1.3)
(2)絕對值距離(曼哈頓距離)
(1.4)
(3)切比雪夫距離(棋盤距離)
(1.5)
(4)閔氏距離
(1.6)
(5)蘭氏距離(堪培拉距離)
(1.7)
其中,歐氏距離是人們較為熟悉的,也是使用最多的距離。stats包里的函數dist()可以用于計算上述各種距離,函數中的參數method用于設定計算距離的方法。歐氏距離、絕對值距離、切比雪夫距離、閔氏距離、蘭氏距離的參數method的取值分別為euclidean、manhattan、maximum、minkowski、canberra,默認為“euclidean”,即歐氏距離。例如,使用表1-2中的4項臨床檢測指標計算前5個研究對象的距離:
>dist(bio[1:5,]) 1234 27.014421 39.0372402.108886 429.03126922.02427120.009190 525.01511918.00734616.0382644.196737
上面的命令選取了數據框bio的前5行,用函數dist()計算了5個對象兩兩之間的歐氏距離。
距離矩陣是一個對稱矩陣,函數dist()的默認輸出只顯示距離矩陣的下三角,我們可以通過設置參數diag和upper為TRUE顯示完整的距離矩陣:
>dist(bio[1:5,],diag=TRUE,upper=TRUE) 12345 10.0000007.0144219.03724029.03126925.015119 27.0144210.0000002.10888622.02427118.007346 39.0372402.1088860.00000020.00919016.038264 429.03126922.02427120.0091900.0000004.196737 525.01511918.00734616.0382644.1967370.000000
需要注意的是,在使用歐氏距離時,變量的量綱不能相差太大。當變量的量綱不同,測量值的變異相差懸殊時,需要先對數據進行標準化處理,然后用標準化后的數據計算距離。
由1.2.1節中算得的均值向量可以看出,各指標之間由于測量單位的不同導致數值的差異較大。如果直接計算行與行之間的距離,會出現“大數吃小數”現象,即PTA所在列的權重遠大于其他各列。因此,這里需要用函數scale()將數據標準化后再計算距離矩陣:
>bio.scale<-scale(bio) >dist(bio.scale[1:5,]) 1234 20.8735292 31.54278680.9613100 42.85990022.10209321.4349353 51.78659711.10155741.61753182.0507346
由于兩個變量的量綱不同,數據的變異也相差較大,上面得到的兩個距離矩陣有很大的不同。此外,在計算距離矩陣時,還應盡可能地避免變量間的多重相關。多重相關所造成的信息重疊,會片面強調某些變量的重要性。
鑒于上述距離的不足,一種改進的距離就是馬氏距離:
(1.8)
其中,為總體的協方差矩陣,實際中常用樣本協方差矩陣估計。馬氏距離不受量綱的影響。當變量之間彼此完全不相關時,
為單位矩陣,此時馬氏距離就是歐氏距離。
在R中,stats包的函數mahalanobis()可用于計算樣本點到某個中心點的馬氏距離。需要注意的是,該函數的返回值是上面定義的馬氏距離的平方。
StatMatch包的函數mahalanobis.dist()可以用來計算數據框中各樣品之間的馬氏距離。使用該包之前需要先安裝。
>library(StatMatch) >mahalanobis.dist(bio)[1:5,1:5] 12345 10.0000001.1460371.7174573.9725193.052284 21.1460370.0000001.2748363.0594832.248249 31.7174571.2748360.0000002.8843753.273679 43.9725193.0594832.8843750.0000002.992607 53.0522842.2482493.2736792.9926070.000000
上面計算對象之間的馬氏距離,其中的總體協方差矩陣用樣本協方差矩陣估計。用戶也可以使用函數中的參數vc自定義協方差矩陣。
1.3.2 基于分類變量的相異系數
如果研究對象的特征是用分類變量來刻畫的,我們可以用相異系數(dissimilarity coefficient)度量對象之間的相異性。兩個對象i和j之間的相異系數根據對象之間的不匹配率來衡量,計算公式為
(1.9)
其中,k是匹配的數目(即對象i和j取值相同的屬性數),p是刻畫對象的屬性總數。
將研究對象彼此之間的相異系數用矩陣的形式表示就得到相異系數矩陣(dissimilarity coefficient matrix)。StatMatch包的函數gower.dist()可以用來計算對象之間的相異系數矩陣。例如,在數據集cirr中,如果只用性別描述對象的特征(此時p = 1,k為0或者1),那么對象之間的相異系數矩陣為:
>g1<-gower.dist(cirr[,1])
與距離矩陣類似,相異系數矩陣也是一個對角線上全為0的方陣。
>dim(g1) [1]3636 >diag(g1) [1]000000000000000000000000000000000000
由于該矩陣較大,下面僅顯示前5個對象的相異系數矩陣:
>g1[1:5,1:5] [,1][,2][,3][,4][,5] [1,]00100 [2,]00100 [3,]11011 [4,]00100 [5,]00100
可以看出,性別相同的對象之間的相異系數為0,而性別不同的對象之間的相異系數為1。
進一步地,用兩個分類變量(性別、年齡組)描述對象的特征(此時p = 2),相異系數矩陣為:
>g2<-gower.dist(cirr[,1:2]) >g2[1:5,1:5] [,1][,2][,3][,4][,5] [1,]0.00.51.00.50.5 [2,]0.50.00.50.00.0 [3,]1.00.50.00.50.5 [4,]0.50.00.50.00.0 [5,]0.50.00.50.00.0
從上面的相異系數矩陣可以看出,性別和年齡組都相同的對象之間的相異系數為0(如對象2與對象4),性別和年齡組有其中一個相同的對象之間的相異系數為0.5(如對象1與對象2),而性別和年齡組均不同的對象之間的相異系數為1(如對象1與對象3)。
1.3.3 基于混合類型變量的相異系數
實際上,函數gower.dist()不僅可以用于計算基于分類變量的相異系數,還可以依據Gower相異系數的定義(Gower,1971)擴展到混合類型(包括邏輯型、因子型、字符型、有序因子型、數值型)的數據。Gower相異系數也稱Gower距離,它依據不同類型的變量給出了不同的計算方法,并將計算結果映射到共同的值域區間[0, 1]上,值越大表示相異程度越大。例如:
>g3<-gower.dist(cirr) >g3[1:5,1:5] [,1][,2][,3][,4][,5] [1,]0.00000000.23156840.43877400.35545760.3086653 [2,]0.23156840.00000000.22418090.14086450.0770969 [3,]0.43877400.22418090.00000000.26081940.2796814 [4,]0.35545760.14086450.26081940.00000000.1408094 [5,]0.30866530.07709690.27968140.14080940.0000000
從上面的輸出結果可以看到,在前5個研究對象中,第1個和第3個對象之間的差異最大,而第2個和第5個對象之間的差異最小。
在相異系數矩陣g3中,最大的值為:
>max(g3) [1]0.7910371
除去對角線上的0,最小的值為:
>min(g3[g3!=0]) [1]0.0349978
如果想找到整個數據集cirr中差異最大和最小的對象,可以使用下面的命令:
>which(g3==max(g3),arr.ind=TRUE) rowcol [1,]2916 [2,]1629 >cirr[c(16,29),] sexagegrpFIBlnPTPTAlnCHE 16male40-590.783.05327.55 29female60+2.402.391138.79 >which(g3==min(g3[g3!=0]),arr.ind=TRUE) rowcol [1,]3426 [2,]2634 >cirr[c(26,34),] sexagegrpFIBlnPTPTAlnCHE 26male60+2.482.73747.72 34male60+2.592.70787.53
cluster包的函數daisy()也可以用來計算Gower相異系數,在聚類分析中經常用到。
1.3.4 相似系數
樣品間的親疏關系用距離度量,而變量間的相似程度用相似系數度量。常用的相似系數有相關系數和夾角余弦。
Pearson相關系數是最常用的一種相關系數,其計算公式見式(1.2)。函數cor()可用于計算Pearson樣本相關系數,例如:
>cor(bio$FIB,bio$PTA) [1]0.7460267
需要注意的是,計算Pearson相關系數時,要求變量服從二元正態分布。函數cor()中的參數method默認為“pearson”,即默認計算Pearson相關系數。如果變量不服從正態分布,可以將method設為“spearman”計算Spearman秩相關系數。
夾角余弦使用向量空間中兩個向量的夾角的余弦值來衡量它們之間的相似程度。兩變量與
的夾角余弦定義為
(1.10)
R的基本包中沒有計算夾角余弦的函數,不過我們很容易根據上面的公式計算。例如,表1-2中FIB與PTA兩個變量的夾角余弦為:
>x<-bio$FIB >y<-bio$PTA >sum(x*y)/sqrt(sum(x^2)*sum(y^2)) [1]0.9770776
實際上,就是向量
與
的夾角余弦。若將原始數據標準化,則夾角余弦與Pearson樣本相關系數等價。
>x.scale<-scale(x) >y.scale<-scale(y) >sum(x.scale*y.scale)/sqrt(sum(x.scale^2)*sum(y.scale^2)) [1]0.7460267
Philentropy包實現了46種不同的距離算法、相似性度量以及信息熵的度量。它為分類問題、信息理論和機器學習算法等提供了核心的計算框架。使用該包之前需要先安裝。
>library(philentropy)
使用函數getDistMethods()查看可以使用的距離算法:
>getDistMethods() [1]"euclidean""manhattan""minkowski" [4]"chebyshev""sorensen""gower" [7]"soergel""kulczynski_d""canberra" [10]"lorentzian""intersection""non-intersection" [13]"wavehedges""czekanowski""motyka" [16]"kulczynski_s""tanimoto""ruzicka" [19]"inner_product""harmonic_mean""cosine" [22]"hassebrook""jaccard""dice" [25]"fidelity""bhattacharyya""hellinger" [28]"matusita""squared_chord""squared_euclidean" [31]"pearson""neyman""squared_chi" [34]"prob_symm""divergence""clark" [37]"additive_symm""kullback-leibler""jeffreys" [40]"k_divergence""topsoe""jensen-shannon" [43]"jensen_difference""taneja""kumar-johnson" [46]"avg"
函數distance()是philentropy包中的核心函數,用于計算各種距離。其中的參數method可以設置為上面46種算法之一。參數method的默認值為“euclidean”,即計算歐氏距離。例如,1.3.1節中計算的歐氏距離也可以用下面的命令實現:
>distance(bio[1:5,]) Metric:'euclidean';comparing:5vectors. v1v2v3v4v5 v10.0000007.0144219.03724029.03126925.015119 v27.0144210.0000002.10888622.02427118.007346 v39.0372402.1088860.00000020.00919016.038264 v429.03126922.02427120.0091900.0000004.196737 v525.01511918.00734616.0382644.1967370.000000
再如,本小節前面兩個變量的夾角余弦也可以用下面的命令實現:
>distance(rbind(x,y),method='cosine') Metric:'cosine';comparing:2vectors. cosine 0.9770776
上面的命令用函數rbind()將兩個變量x和y按行排列。這是因為函數distance()計算的是行與行之間的距離或相關系數。在通常情況下,矩陣或者數據框的行表示記錄、列表示變量。因此,在計算變量之間的相關系數時,需要將矩陣或者數據框用函數t()作行與列的轉置。
>distance(t(scale(bio)),method='cosine') Metric:'cosine';comparing:4vectors. v1v2v3v4 v11.0000000-0.63727590.74602670.5176411 v2-0.63727591.0000000-0.9206450-0.6577195 v30.7460267-0.92064501.00000000.7014260 v40.5176411-0.65771950.70142601.0000000
上面的命令將數據框bio標準化后計算了各個變量之間的夾角余弦,此時的夾角余弦等價于Pearson相關系數。
>cor(bio) FIBlnPTPTAlnCHE FIB1.0000000-0.63727590.74602670.5176411 lnPT-0.63727591.0000000-0.9206450-0.6577195 PTA0.7460267-0.92064501.00000000.7014260 lnCHE0.5176411-0.65771950.70142601.0000000
1.3.5 列聯系數
對于分類變量,常用列聯系數(contingency coefficient)表示列聯表資料的關聯強度。常用的列聯系數有Phi系數、Pearson列聯系數和克萊姆V系數。
Phi系數只適用于四格表資料,其計算公式為
(1.11)
Pearson列聯系數是Phi系數的校正和推廣,可以用于多維列聯表資料,其計算公式為
(1.12)
克萊姆V系數是在列聯表行列數不同時對Pearson列聯系數的修正方法,其計算公式為
(1.13)
式(1.11)、式(1.12)和式(1.13)中,為列聯表的
值,n為樣本量,r和c分別是列聯表的行數和列數。
上面3種列聯系數的取值范圍都在0和1之間。值越接近0,行變量和列變量關系越不密切;值越接近1,行變量和列變量關系越密切。vcd包里的函數assocstats()可以用來計算上述3種列聯系數,例如:
>mytable<-table(cirr$sex,cirr$agegrp) >mytable <4040-5960+ female274 male3164 >library(vcd) >assocstats(mytable) X^2dfP(>X^2) LikelihoodRatio1.004320.60522 Pearson1.022920.59963 Phi-Coefficient:NA ContingencyCoeff.:0.166 Cramer'sV:0.169
結果顯示,值為1.0229,Pearson列聯系數和克萊姆V系數分別為0.166和0.169。這表明在該數據集里,性別和年齡組之間的關聯比較弱。由于上面的列聯表是2行3列的,Phi系數在這里不適用,所以給出的結果是NA。
- Python金融大數據分析(第2版)
- 工業大數據分析算法實戰
- Hadoop大數據實戰權威指南(第2版)
- MATLAB Graphics and Data Visualization Cookbook
- 云數據中心網絡與SDN:技術架構與實現
- 智慧的云計算
- MySQL DBA修煉之道
- 聯動Oracle:設計思想、架構實現與AWR報告
- 智慧城市中的大數據分析技術
- Gideros Mobile Game Development
- 企業大數據處理:Spark、Druid、Flume與Kafka應用實踐
- Python 3爬蟲、數據清洗與可視化實戰
- PostgreSQL高可用實戰
- NoSQL數據庫原理(第2版·微課版)
- Hive性能調優實戰