這篇筆記是MOOC《多元統計分析及R使用》課程的第7章第三節。
系統劇類法的基本思想
先將個樣品分成類,每個樣品自成一類,然后每次將具有最小距離的兩類合并,合并后重新計算類與類之間的距離,這個過程一直繼續到所有的樣品歸為一類為止,并把這個過程做成一張系統聚類圖。
類間距離計算方法
那么如何計算類間距離呢?方法有很多種:
-
最短距離法(single):
,通俗來講,就是把兩個類間離的最近的兩個樣本之間的距離當作兩個類之間的距離,能夠避免極大值的影響;
single.png -
最長距離法(complete):
,把兩個類間離的最遠的兩個樣本之間的距離當作兩個類之間的距離,可能被極大值扭曲,需刪除這些值;
complete.png -
中間距離法(median):
,顧名思義。就是取最長到最短之間的距離
median.png -
類平均法(average):
,就是所有樣本對間的平均距離
average.png 重心法(centroid):
,重心距離就是兩個重心之間的距離,重心通常用類中樣本的均值代替。對異常值不敏感,結果更穩定。
離差平方和法(Ward):
以上公式可用同一個公式統一,需要做的就是把系數變一變:
系統聚類法過程
(1)計算n個樣品兩兩間的距離;
(2)構造n個類,每類包含1個樣品;
(3)合并距離最近兩類為新類;
(4)計算新類與各類距離,若類個數為1,轉到第5步,否則回到第3步;
(5)繪制系統聚類圖;
(6)確定類的個數和樣品名稱
系統聚類函數用法
在R語言中,可使用函數hclust()
:
hclust(D,method="complete",...)
D 相似矩陣,通常為距離矩陣;
method 包括“single”,“complete”,“average”,“mcquitty”,“median” or “centriod”,“ward”,默認為"complete"。
畫分類框可使用rect.hclust()
函數,確認分類結果可使用cutree()
函數。
舉例說明
研究全國31個省、市、自治區2007年城鎮居民生活消費的分布規律,根據調查資料做區域消費類型劃分。
>library(openxlsx)
>msa.X<-function(df){
> X=df[,-1];
> rownames(X)=df[,1];
> X
>}
>d7.2 <- read.xlsx("mvstats5.xlsx","d3.1")
>X7.2 <- msa.X(d7.2)
>head(X7.2)
食品 衣著 設備 醫療 交通 教育 居住 雜項
北京 4934 1512.9 981.1 1294.1 2329 2384.0 1246.2 649.7
天津 4249 1024.2 760.6 1164.0 1310 1639.8 1417.5 463.6
河北 2790 975.9 546.8 833.5 1011 895.1 917.2 266.2
山西 2600 1064.6 477.7 640.2 1028 1054.0 991.8 245.1
內蒙古 2825 1396.9 561.7 719.1 1124 1245.1 941.8 468.2
遼寧 3560 1017.6 439.3 879.1 1033 1052.9 1047.0 400.2
>D<- dist(X7.2)
>plot(hclust(D,'ward.D2'))##ward.D2法是ward法的改進版,效果挺好