【数据分析 R语言实战】学习笔记 第十章(上) 主成分分析与R实现

2019-04-10 10:55:15 浏览数 (1)

10.1主成分分析

10.1.1理论基础

主成分分析试图在保证数据信息丢失最少的原则下,将多变量的截面数据集进行最佳综合简化,简单地说就是根据多个指标之间的联系,选出它们的某种线性组合,从而化为少数几个综合指标。

贡献率指某个主成分的方差占全部方差的比重,也就是某个特征值占全部特征值合计的比重。贡献率越大,说明该主成分所包含的原始变量的信息越强。主成分个数k的选取,主要根据主成分的累计方差贡献率来决定,一般要求累计贡献率达到80%-85%以上,这样才能保证新的综合变量能包括原始变量的绝大多数信息。

碎石图(Scree plot)也可以作为判断主成分个数的标准,它以成分数为横坐标,特征值为纵坐标。碎石图相当于特征值变化趋势图,特征值由陡峭变为平坦的转折点即为选择主成分的最佳个数。

主成分与原始变量之间的关系为:

①主成分保留了原始变量绝大多数信息:

②主成分个数远远少于原始变量的个数:

③各个主成分之间互不相关;

④每个主成分都是原始变量的线性组合。

主成分分析的步骤

①计算相关系数矩阵;

②计算相关系数矩阵的特征根及对应的特征向量;

③选出最大的特征根,对应的特征向量等于第一主成分的系数:选出第二大的特征根,对应的特征向量等于第二主成分的系数;

④计算累积贡献率,选择恰当的主成分个数;

⑤写出前k个主成分的表达式。

10.1.2 R语言实现

R语言中,有两个进行主成分分析的函数,首先是pricomp(),其调用格式有两种:

princomp(formula, data = NULL, subset,na.action, ...)

其中,formula类似于lm( )中的参数,用于指定模型表达式,但主成分分析中没有响应变量;

data指定数据框;subset用于选择数据矩阵的行,选出数据的一个子集进行分析;a. action表示

数据包含缺失值时应该采取什么措施。

代码语言:javascript复制
princomp(x, cor = FALSE, scores = TRUE, covmat = NULL,
代码语言:javascript复制
         subset = rep_len(TRUE, nrow(as.matrix(x))), ...)

x是用于主成分分析的数据集:cor默认为FALSE,表示使用样本的协方差阵作主成分分析,

若cot=TRUE则使用相关系数矩阵R求主成分;

> agri=read.table("D:/ProgramFiles/RStudio/agriculture.txt",header=TRUE) > agri=agri[,-1] #剔除第一列序号 > agri.pr=princomp(agri,cor=TRUE) #用相关阵计算 > options(digits=4) #结果显示4位有效数字 > summary(agri.pr,loadings=TRUE) #loadings=TURE选项列出主成分对应原始变量的系数 Importance of components: Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 Comp.8 Comp.9 Standard deviation 2.1590 1.4455 1.0213 0.71234 0.56140 0.4389 0.33821 0.212900 0.177407 Proportion of Variance 0.5179 0.2322 0.1159 0.056380.03502 0.0214 0.01271 0.005036 0.003497 Cumulative Proportion 0.5179 0.7501 0.8660 0.92234 0.95736 0.9788 0.99147 0.996503 1.000000 Loadings: Comp.1 Comp.2Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 Comp.8 Comp.9 x1 0.342-0.368 -0.375 -0.355 0.312 0.559 0.113 0.233 x2 0.614 0.155 -0.761-0.110 x3 -0.446 0.206 0.467 -0.203 -0.692 x4 0.601 -0.598 0.310 0.395 0.139 x5 0.376 0.307 0.396 -0.508 0.580 x6 0.379 0.124 0.122 0.620 0.154 0.638 x7 0.432 -0.246 -0.148 -0.241 -0.777 -0.235 x8 0.950 -0.231 x9 0.446 -0.224 -0.136 -0.246 0.532 -0.613

分析结果的Standard deviation表示主成分的标准差,即相应特征值(等于方差)的平方根;Proportion of Variance表示方差贡献率,CumulativeProportion表示累计方差贡献率。第一主成分F1的贡献率为51.79%,第二主成分F2的贡献率为23.22%,第三主成分F3的贡献率为11.59%.前三个主成分的累计方差页献率达到86.6%,因此最终选取3个主成分即可,其余6个舍去。写出主成分与原变量的线性关系式为

有时,主成分分析也辅以图像帮助理解。首先,判断主成分个数时可以绘制主成分的碎石图,以成分数为横坐标,特征值即成分的方差为纵坐标,碎石图由陡峭变为平坦的转折点即为主成分选择的最佳个数。在R中使用函数screeplot()绘制,调用格式为:

screeplot(x, npcs = min(10, length(x$sdev)),

type = c("barplot", "lines"),

main = deparse(substitute(x)), ...)

>screeplot(agri.pr,type=”line”,main=”碎石图”)

图中第三个主成分对应的方差由陡峭开始变得平坦,说明后几个主成分的方差贡献率很

低,所以最终选择3个主成分即可。

另外,函数biplot()可以绘制数据关于主成分的散点图,并自动标明原坐标在主成分下的方向。

其调用格式为bipIot(x,choices=1:2), x同样是princomp()返回的对象,参数choices选择主成分,

默认为前两个。

> biplot(agri.pr)

例2:

利用R程序包labdsv中的方法pca()进行主成分分析

> food=read.table("D:/ProgramFiles/RStudio/food.txt",header=T) #读入数据

> food=food[,-1]

> library(labdsv)

> food.pca=pca(food,dim=4,cor=TRUE) #利用相关系数矩阵计算

> summary(food.pca)

Importance ofcomponents:

[,1] [,2] [,3] [,4]

Standard deviation 1.7108 1.4901 1.1594 0.89521

Proportion of Variance0.3252 0.2467 0.1494 0.08905

CumulativeProportion 0.3252 0.5719 0.7213 0.81033

> loadings.pca(food.pca)

Loadings:

PC1 PC2 PC3 PC4

X1 -0.550 -0.242

X2 -0.320 -0.616 0.457

X3 0.186 -0.697 -0.470

X4 0.456 -0.168 0.505

X5 0.509 -0.142 -0.263

X6 -0.329 0.408 -0.270

X7 0.501 0.119 -0.112 -0.367

X8 0.388 0.333 0.130 0.113

X9 0.141 0.493 0.201

使用函数varplot.pca()绘制4个因子的碎石图以及累计方差图

> op=par(mfrow=c(1,2)) #分割图形区域

> varplot.pca(food.pca)

Hit Return to Continue

layout(1)

第一主成分对X4~ X8的载荷系数较大,说明第一主成分主要反映猪牛羊肉、家禽和水产品等方面,可以归为肉制品类:第二主成分对X1, X8, X9的载荷系数较大,分别对应粮食、食糠和酒,归为粮食类;第三主成分与关、X;的相关性较高,载荷系数均超过0.6,反映蔬菜、食油类;第四主成分与各原始变量的相关性分配比较平均,因此我们认为第四主成分反映的是所有食品的综合情况。

0 人点赞