读《R语言统计分析与应用》笔记
聚类分析简介
1.基本思想
聚类分析是将样本个体或指标变量按其具有的特性进行分类的一种统计分析方法。我们所研究的样品或指标(变量)之间存在着程度不同的相似性(亲疏关系),于是可根据一批样品的多个观测指标,具体找出一些能够度量样品或指标之间相似程度的统计量,以这些统计量为划分类型的依据,把一些相似程度较大的样品(或指标)聚合为一类,把另外一些彼此之间相似程度较大的样品(或指标)又聚合为另一类,关系密切的聚合到一个小的分类单位,关系疏远的聚合到一个大的分类单位,直到把所有的样品(或指标)聚合完毕,这就是分类的基本思想。
2.聚类分析的类型
在聚类分析中、通常根据分要对象的不同,分为Q型聚类分析和R型聚类分析两大类。Q型聚类分许是对样本进行分类处理,又称为样本聚关分析:R型聚类分析是对指标进行分类处理,又称为指标聚类分析。
对样品进行聚类的目的是将分类不明确的样品按性质相似程度分为若干组,从而发现同类样品的共性和不同样品间的差异。对指标进行聚类的目的是将分类不明确的指标按性质相似程度分成若干组,从而在尽量不损失信息的条件下,用一组少量的指标来代替原来的多个指标。
- R型聚类分析的主要作用
- 了解个别变量之间的关系的亲疏程度
- 了解各个指标组合之间的亲疏程度
- 根据变量的分类结果以及它们之间的关系,可以选择主要变量进行回归分析或Q型聚类分析
- Q型聚类分析的作用如下
- 可以综合利用多个变量的信息对样本进行分类。
- 分类结果是直观的,聚类谱系图可以非希清楚地表现其数值分类结果,结果比传统分类方法更细致、全面、合理。
3.聚类分析统计量
无论是R型聚类还是Q型聚类,关键是如何定义相似性。即如何把相似性数量化。聚类的第一步需要给出两个指标或两个样本间相似性度量的统计量。
聚类分析中用来衡量样本个体之间属性相似程度的统计量以及指标变量之间属性相似度的统计量是不同的,前者用的统计量是距离系数,后者用的统计量是相似系款。
距离系数的定义有很多,如欧式距离、极端距离、绝对距离等。
相似系数的定义也很多,如相关系数、列联系数等。
它们具体的计算方法可百度
4.聚类分析的方法
聚类分析的方法很多,这里仅介绍常用的系统聚类法和逐步聚类法。系统聚类法适用于小样本的样本聚类或指标聚类,逐步聚类法适用于大样本的样本聚类。对于小样本的样本聚类,如果采用逐步聚类法,聚类结果将与样本的顺序有关。
(1)聚类指标
一般用系统聚类法来聚类指标,它的基本思想是先把k个指标看成一类,然后用主成分分析法把它们分为解成若干类,分类的原则是使得每一类的类内指标总变异尽可能多地被该类的类成分所解释:如果每一类的类内指标总变异被类成分所解释的比例满足事先给出的要求,则聚类停止:否制,对比例小的类再继续进行分解,直到所有类的类内指标总变异被类成分所解释的比例都满足事先给出的要求为止。
系统聚类法对 k 个指标进行聚类的具体步骤如下
- 确定每一类的类内指标总变异被类成分所解释的最低比例P
- 把所有的指标看成一类,计算类内指标总变异被类成分所解释的比例,如果所解释的比例大于或等于P,则聚类停止,否则进行 3。
- 将这个类分解成两个类,分类的原则是使得每一类内的指标总变异尽可能地被该类的类成分所解释,且类间相关系数达到最小,计算每一类的类内指标总变异被类成分所解释的比例,如果所解释的比例大于或等于P,则聚类停止,否则进行4
- 最后解释比例最小的一类,再继续进行分解。
- 每重复以上步骤,直到所有类的类内指标总变异被类成分所解释的比例都大于或等于P为止。
(2)聚类样本
要聚类样本,可以用系统聚类法,也可以用逐步聚类法。
1) 用系统乘类法聚类样本。
用系统聚类法聚类样本的基本思想是先把n个聚类样本看成n类,然后按类间距离将相似程度最大的两个类合并为一类,再将所有的类(包括合并形成的新类)中相似程度最大的两个类合并为一类。重复此过程,直到所有的类间距离达到一定的要求为止,或直至所有的样本被合并为一类为止,然后根据类间距离的要求以及实际意义选择一个适当的分类。
用系统聚类法对样本进行聚类的具体方法步骤如下。
- 把n个样本看成n类,类的个数g=n
- 计算两两类间距离,并将类间距离最小的两个合并为一类,则g=n-1
- 继续计算两两类间距离,并将类间距离最小的两个合并为一类,则g=n-2
- 重复上述步骤,直到类间距离达到一定的要求为止,或所有的样本被合并为一类为止
- 根据类间距高的要求以及实际意义,选择一个适当的分类。
2) 用逐步聚类法聚类样本。
用逐步聚类法聚类样本的基本思想是先选择若干个初始凝聚点,这些凝聚点可以是所有样本中的任意几个样本,也可以是随意确定的几个新样本观察值。然后把每一个样本按距离大小归入到与该样本最近的凝聚点所代表的初始类中,再以这些初始类的“重心”(类为各样本观察值的平均值)作内新的凝聚点重新将样本归类。重复以上步骤,直到分成的类再没有什么变化为止。
用逐步聚类法对样本进行聚类的具体步骤如下。
- 确定初始凝聚点。
- 计算样本与每一个初始凝聚点的距离,并将每一个样本归入与该样本最近的凝聚点所代表的初始类中。
- 计算上述初始类的新凝聚点,等于类内各样本观察值的平均值。
- 计算样本与上述新凝聚点的距离,并将每一个样本归入与该样本最近的新凝聚点所代表的类中。
- 重复上述步骤,直到新分成的类再没有什么变化为止。
注意:对于样本的聚类,系统聚类法和逐步聚类法的区别是:系统聚类法不必事先知道聚类的类数,而逐步聚类法则必须事先知道聚类的类数,系统聚类法适用于小样本,逐步聚类法适用于大样本。
聚类分析及R实例
R中用于指标聚类的函数有varclus()函数,用于样本聚类分析的函数有 kmean() 函数和 hclust () 函数。其中,kmean() 函数使用的是动态聚类法,用于小样本聚类;hclust() 函数使用的是系统聚类法,用于大样本聚类。
varclus()函数
varclus(x, similarity=c("spearman","pearson","hoeffding","bothpos","ccbothpos"),
type=c("data.matrix","similarity.matrix"),
method="complete",
data=NULL, subset=NULL, na.action=na.retain,
trans=c("square", "abs", "none"), ...)
-
x:可以是模型公式、自变量数值型矩阵或相似性矩阵。
-
similarity:相似指标,默认为斯皮尔曼相关系数平方,用来检验单向非线性关系;也可为线性相关或Hoefding’s D统计量;“botlpos”用于二分类数据观测比例的相似性评估。
-
type:当x不是模型公式时,其可以设置为数据矩阵或相似性矩阵,默认为数据矩阵。
-
method:定义距离评价指标。
-
data:指定数据集。
-
subset:指定数据子集。
1.指标聚类实例
城镇居民消费水平通常用8项指标来描述:
人均粮食支出X1(元/人)
人均f副食支出X2(元/人)
人均烟、酒、茶支出X3(元/人)
人均其他副食支出X4(元/人)
人均衣着商品支出X5(元/人)
人均日用品支出X6(元/人)
人均燃料支出X7(元/人).
人均非商品支出X8(元/人)
这8项指标间存在带一定的相关性。为了研究城镇居民的消费结构,需要将相关性强的指标归并到一起,这实际上就是对指标聚类。
install.packages("Hmisc")
library(Hmisc)
library(readxl)
a <- read_excel("C:\\a.xlsx")
# A tibble: 30 x 8
# x1 x2 x3 x4 x5 x6 x7 x8
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 7.78 48.4 8 20.5 22.1 15.7 1.15 16.6
# 2 10.8 44.7 7.32 14.5 17.1 12.1 1.26 11.6
# 3 9.09 28.1 7.4 9.62 17.3 11.1 2.49 12.6
# 4 8.35 23.5 7.51 8.62 17.4 10 1.04 11.2
# 5 9.25 23.8 6.61 9.19 17.8 10.5 1.72 10.5
# 6 7.9 39.8 8.49 12.9 19.3 11.0 2.04 13.3
# 7 8.19 30.5 4.72 9.78 16.3 7.6 2.52 10.3
# 8 7.73 29.2 5.42 9.43 19.3 8.49 2.52 10
# 9 8.28 64.3 8 22.2 20.1 15.5 0.72 22.9
# 10 7.21 45.8 7.66 10.4 16.6 12.9 2.25 11.7
# … with 20 more rows
str(a)
# Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 30 obs. of 8 variables:
# $ x1: num 7.78 10.85 9.09 8.35 9.25 ...
# $ x2: num 48.4 44.7 28.1 23.5 23.8 ...
# $ x3: num 8 7.32 7.4 7.51 6.61 8.49 4.72 5.42 8 7.66 ...
# $ x4: num 20.51 14.51 9.62 8.62 9.19 ...
# $ x5: num 22.1 17.1 17.3 17.4 17.8 ...
# $ x6: num 15.7 12.1 11.1 10 10.5 ...
# $ x7: num 1.15 1.26 2.49 1.04 1.72 2.04 2.52 2.52 0.72 2.25 ...
# $ x8: num 16.6 11.6 12.6 11.2 10.5 ...
plot(a)
a<-as.matrix(a)
v <- varclus(a,similarity = "spearman")
# Similarity matrix (Spearman rho^2)
#
# x1 x2 x3 x4 x5 x6 x7 x8
# x1 1.00 0.01 0.01 0.01 0.03 0.00 0.00 0.00
# x2 0.01 1.00 0.00 0.10 0.02 0.33 0.02 0.47
# x3 0.01 0.00 1.00 0.10 0.09 0.01 0.04 0.01
# x4 0.01 0.10 0.10 1.00 0.38 0.38 0.00 0.03
# x5 0.03 0.02 0.09 0.38 1.00 0.15 0.03 0.01
# x6 0.00 0.33 0.01 0.38 0.15 1.00 0.00 0.29
# x7 0.00 0.02 0.04 0.00 0.03 0.00 1.00 0.00
# x8 0.00 0.47 0.01 0.03 0.01 0.29 0.00 1.00
#
# No. of observations used for each pair:
#
# x1 x2 x3 x4 x5 x6 x7 x8
# x1 30 30 30 30 30 30 30 30
# x2 30 30 30 30 30 30 30 30
# x3 30 30 30 30 30 30 30 30
# x4 30 30 30 30 30 30 30 30
# x5 30 30 30 30 30 30 30 30
# x6 30 30 30 30 30 30 30 30
# x7 30 30 30 30 30 30 30 30
# x8 30 30 30 30 30 30 30 30
#
# hclust results (method=complete)
#
#
# Call:
# hclust(d = as.dist(1 - x), method = method)
#
# Cluster method : complete
# Number of objects: 8
print(round(v$sim,2))
# x1 x2 x3 x4 x5 x6 x7 x8
# x1 1.00 0.01 0.01 0.01 0.03 0.00 0.00 0.00
# x2 0.01 1.00 0.00 0.10 0.02 0.33 0.02 0.47
# x3 0.01 0.00 1.00 0.10 0.09 0.01 0.04 0.01
# x4 0.01 0.10 0.10 1.00 0.38 0.38 0.00 0.03
# x5 0.03 0.02 0.09 0.38 1.00 0.15 0.03 0.01
# x6 0.00 0.33 0.01 0.38 0.15 1.00 0.00 0.29
# x7 0.00 0.02 0.04 0.00 0.03 0.00 1.00 0.00
# x8 0.00 0.47 0.01 0.03 0.01 0.29 0.00 1.00
plot(v)