本讲将介绍主成分分析(Principal Component Analysis,PCA),它能将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且彼此之间互不相关。一般来说,当研究的问题涉及到多变量且变量之间存在很强的相关性时,我们可考虑使用主成分分析的方法来对数据进行简化。
- 一、问题提出
- 二、主成分分析思想
- 三、PCA的计算步骤
- 1.标准化处理
- 2.计算标准化样本的协方差矩阵
- 3.将前两步骤合为一步————计算相关系数矩阵
- 4.计算R的特征值和特征向量
- 5.计算主成分贡献率以及累计贡献率
- 6.写出主成分
- 7.根据系数分析主成分代表的意义(困难且关键)
- 8.利用主成分的结果进行后续的分析
- 9.主成分分析的说明
- 三、主成分分析matlab代码详解
- 1.计算样本相关系数矩阵
- 2.计算R的特征值和特征向量
- 3.计算主成分贡献率和累计贡献率
- 4.处理特征向量矩阵
- 5.计算我们所需要的主成分的值
- 四、主成分聚类
- 1.进行系统聚类
- 2.图表构建器创造聚类图
- 五、主成分回归
一、问题提出
某人要做一件上衣要测量很多尺寸,如身长、袖长、胸围、腰围、肩宽、肩厚等十几项指标,但某服装厂要生产一批新型服装绝不可能把尺寸的型号分得过多?而是从多种指标中综合成几个少数的综合指标,做为分类的型号,利用主成分分析将十几项指标综合成3项指标,一项是反映长度的指标,一项是反映胖瘦的指标,一项是反映特殊体型的指标
主成分分析是把原来多个变量划为少数几个综合指标的一种统计分析方法。
二、主成分分析思想
将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且主成分之间无相关性
三、PCA的计算步骤
1.标准化处理
2.计算标准化样本的协方差矩阵
3.将前两步骤合为一步————计算相关系数矩阵
4.计算R的特征值和特征向量
5.计算主成分贡献率以及累计贡献率
6.写出主成分
7.根据系数分析主成分代表的意义(困难且关键)
对于某个主成分而言,指标前面的系数越大,代表该指标对于该主成分的影响越大。通过这一原则,我们需要分析出我们得到的主成分到底代表着什么,不然将毫无意义
8.利用主成分的结果进行后续的分析
主成分分析可以用于聚类,其最大的好处就是能够将多个指标转化成两个指标,画出聚类图。
而主成分分析用于回归则是可以有效避免多重共线性的问题,毕竟提取主成分的前提就是主成分之间无相关性
9.主成分分析的说明
主成分的解释其含义一般多少带有点模糊性,不像原始变量的含义那么清楚、确切,这是变量降维过程中不得不付出的代价。
主成分分析的困难之处主要在于要能够给出主成分的较好解释,所提取的主成分中如有一个主成分解释不了,整个主成分分析也就失败了。
三、主成分分析matlab代码详解
我们以31个省份在各个领域内的平均消费数据为例,此处有31个个案,8个指标
1.计算样本相关系数矩阵
x是一个31行,8列的数据,计算相关系数矩阵后得到一个8行8列的矩阵
R = corrcoef(x)
2.计算R的特征值和特征向量
得到特征向量vector与一个特征值在对角线上的对角矩阵
[V,D] = eig(R)
3.计算主成分贡献率和累计贡献率
lambda = diag(D); % diag函数用于得到一个矩阵的主对角线元素值(返回的是列向量)
lambda = lambda(end:-1:1); % 因为lambda向量是从小大到排序的,我们将其调个头
contribution_rate = lambda / sum(lambda); % 计算贡献率
cum_contribution_rate = cumsum(lambda)/ sum(lambda); % 计算累计贡献率 cumsum是求累加值的函数
disp('特征值为:')
disp(lambda') % 转置为行向量,方便展示
disp('贡献率为:')
disp(contribution_rate')
disp('累计贡献率为:')
disp(cum_contribution_rate')
4.处理特征向量矩阵
由于matlab内置的计算特征值与特征向量的函数返回的值是从小到大排序的,这里我们需要将特征值与特征向量从大到小排序(优先选用贡献率大的主成分)
disp('与特征值对应的特征向量矩阵为:')
% 注意:这里的特征向量要和特征值一一对应,之前特征值相当于颠倒过来了,因此特征向量的各列需要颠倒过来
% rot90函数可以使一个矩阵逆时针旋转90度,然后再转置,就可以实现将矩阵的列颠倒的效果
V=rot90(V)';
disp(V)
5.计算我们所需要的主成分的值
在上一步我们已经计算出了累积贡献率,那么在这可以由用户从累积贡献率判断选取m个主成分,然后进行一个m次的循环,得出主成分的值
返回的F矩阵是一个31行,2列的矩阵。其意义是31个个案对应的两个主成分的指标
m =input('请输入需要保存的主成分的个数: ');
F = zeros(n,m); %初始化保存主成分的矩阵(每一列是一个主成分)
for i = 1:mai = V(:,i)'; % 将第i个特征向量取出,并转置为行向量Ai = repmat(ai,n,1); % 将这个行向量重复n次,构成一个n*p的矩阵F(:, i) = sum(Ai .* X, 2); % 注意,对标准化的数据求了权重后要计算每一行的和
end
四、主成分聚类
我们得到了由31个个案,2个指标组成的矩阵,这样我们可以根据这两个指标对这31个个案进行聚类,并且能够方便画出其聚类图
1.进行系统聚类
这里我们使用系统聚类,通过谱系图判断聚三类,把聚三类的结果保存到我们的数据集中
2.图表构建器创造聚类图
这里我们利用图表构建器创造聚类图,设置如图所示,把颜色依据设置为聚类结果,点ID标签设置为省份,这样图上就会显示出省份的名称
五、主成分回归
主成分回归:将x使用主成分得到主成分指标,并将y标准化,接着导出到Excel,然后再使用spss回归
Y = zscore(y); % 一定要将y进行标准化哦~
在Excel第一行输入指标名称(Y,F1, F2, ..., Fm)
分别双击Matlab工作区的Y和F,进入变量编辑中,然后复制里面的数据到Excel表格
导出数据之后,我们后续的分析就可以在Stata中进行。