这篇笔记是MOOC《多元统计分析及R使用》课程的第7章第三节。
系统剧类法的基本思想
先将个样品分成类,每个样品自成一类,然后每次将具有最小距离的两类合并,合并后重新计算类与类之间的距离,这个过程一直继续到所有的样品归为一类为止,并把这个过程做成一张系统聚类图。
类间距离计算方法
那么如何计算类间距离呢?方法有很多种:
-
最短距离法(single):,通俗来讲,就是把两个类间离的最近的两个样本之间的距离当作两个类之间的距离,能够避免极大值的影响;
-
最长距离法(complete):,把两个类间离的最远的两个样本之间的距离当作两个类之间的距离,可能被极大值扭曲,需删除这些值;
-
中间距离法(median):,顾名思义。就是取最长到最短之间的距离
-
类平均法(average):,就是所有样本对间的平均距离
重心法(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法的改进版,效果挺好