sas:主成分分析

来源:互联网 发布:数据黑产吧 编辑:程序博客网 时间:2024/05/17 22:43

最近和同学讨论他们要做的电子医疗系统的时候,聊到单因素分析和主成分分析,一想自己对这方面也不是很懂,就用sas做了一套标准的流程,记录如下:

个人总结:如果遇到多因素分析,想要很多很多个自变量与因变量进行线性回归分析必须进行降维,一种很好的解决方案就是主成分分析。

引言

主成分分析,举了这么个例子:就像你选女人,有身材、相貌两个指标,如果身材、相貌都很突出,那当然很好选择;但如果两个女人,一个身材突出,一个相貌出众,看着都很喜欢,那可如何是好!这个时候通过主成分分析,汇总出一个指标,这个指标可以一定程度上代替原来的身材、相貌,这时就可以排序做出选择了。

这例子当然有很多缺陷,但至少指出了主成分分析的目的之一:减少决策变量数,也就是降维。主成分分析的另一个目的是防范多重共线性。实际问题往往涉及很多变量,但某些变量之间会有一定的相关性,我们希望构造较少的几个互不相关的新指标来代替原始变量,去除多重共线性,减少所需分析的变量,同时尽可能减少这一过程的信息损失。主成分分析正是基于这样的目的而产生的有效方法。

主成分分析流程

1、原始数据标准化。

2、计算标准化变量间的相关系数矩阵。

3、计算相关系数矩阵的特征值和特征向量。

4、计算主成分变量值。

5、统计结果分析,提取所需的主成分。

实例(个人觉得说了再多,其实一个实例就懂了)

下表列出了1999年全国31个省、直辖市和自治区(港、澳、台不在其中)的城镇居民家庭平均每人全年消费性支出的八个主要变量数据,请从八个变量中识别出主成分。

变量说明(随便从网上找的数据)

x1:食品                        x2:交通和通讯

x3:衣着                        x4:娱乐教育文化服务

x5:家庭设备用品及服务   x6:居住

x7:医疗保健                  x8:杂项商品和服务

1.对照省份可用sas做表

data comp;input name $ x1-x8;cards;北京2959.19730.79749.41513.34467.871141.82478.42457.64天津2459.77495.47697.33302.87284.19735.97570.84305.08河北1495.63515.90362.37285.32272.95540.58364.91188.63山西1406.33477.77290.15208.57201.50414.72281.84212.10内蒙古1303.97524.29254.83192.17249.81463.09287.87192.96辽宁1730.84553.90246.91279.81239.18445.20330.24163.86吉林1561.86492.42200.49218.36220.69459.62360.48147.76黑龙江1410.11510.71211.88277.11224.65376.82317.61152.85上海3712.31550.74893.37346.93527.001034.98720.33462.03江苏2207.58449.37572.40211.92302.09585.23429.77252.54浙江2629.16557.32689.73435.69514.66795.87575.76323.36安徽1844.78430.29271.28126.33250.56513.18314.00151.39福建2709.46428.11334.12160.77405.14461.67535.13232.29江西1563.78303.65233.81107.90209.70393.99509.39160.12山东1675.75613.32550.71219.79272.59599.43371.62211.84河南1427.65431.79288.55208.14217.00337.76421.31165.32湖北1783.43511.88282.84201.01237.60617.74523.52182.52湖南1942.23512.27401.39206.06321.29697.22492.60226.45广东3055.17353.23564.56356.27811.88873.061082.82420.81广西2033.87300.82338.65157.78329.06621.74587.02218.27海南2057.86186.44202.72171.79329.65477.17312.93279.19重庆2303.29589.99516.21236.55403.92730.05438.41225.80四川1974.28507.76344.79203.21240.24575.10430.36223.46贵州1673.82437.75461.61153.32254.66445.59346.11191.48云南2194.25537.01369.07249.54290.84561.91407.70330.95西藏2646.61839.70204.44209.11379.30371.04269.59389.33陕西1472.95390.89447.95259.51230.61490.90469.10191.34甘肃1525.57472.98328.90219.86206.65449.69249.66228.19青海1654.69437.77258.78303.00244.93479.53288.56236.51宁夏1375.46480.89273.84317.32251.08424.75228.73195.93新疆1608.82536.05432.46235.82250.28541.30344.85214.40;run;2.假定相互独立,得到特征向量proc princompdata = mylib.compout = mylib.changecompprefix = comp /*(具体数据分析过程只需要看数据,避免其他的干扰,改成代号名称)*/outstat = mylib.result;var x1-x8;run ;


会得到以下结果:






除此之外,得到的changecomp表为:


得到的result表为:


3.快速得到主成分

首先我们需要知道主成分分析希望能够达到什么样的目的:

将多个指标转换为少数几个相互独立的且包含原来指标大部分信息(一般是80%或85%)的综合指标

假如你并不想知道各种结果的含义,只想知道那些是主成分,那其实只需要用到上面的“相关矩阵的特征值”表的最后两列:比例和累积

累积从哪一行大于85%就行了;本实例是从第三行,因为这3个变量合起来解释了原来8个变量87.81%的信息,能够满足要求。

4.详细解读各种表

表1:PRINCOMP 过程

31个观测代表数据中的31个省份/直辖市;

8个变量代表最开始的8个成分

表2:简单统计量

这个表也很简单,均值x不用说,StD是标准差,即方差开个正根

表3:相关矩阵

相关系数又称皮氏积矩相关系数(Pearson product-moment correlation coefficient,PPCC),就是我们高中统计学独立检验时候的r值;

当r>0时,表示两变量正相关,当r<0时,表示两变量为负相关。当|r|=1时,表示两变量为完全线性相关即函数关系。当r=1时,称为完全正相关,而当r=-1时,称为完全负相关。当r=0时,表示两变量间无线性相关关系。

当︱r︱≥0.8时,可视为高度相关;当0.5≤︱r︱<0.8时,可视为中度相关;当0.3≤︱r︱<0.5时,视为低度相关;当︱r︱<0.3时,说明两个变量之间的相关程度极弱。


本表里的x1与x5、x1与x8、x3与x6高度相关;x2与x7负相关

表4:相关矩阵的特征值

列1.特征值越大,表示对应的主成分变量包含的信息越多,对原始变量的解释力度越强。

列2.相邻两行特征值之间的差值

列3.改行特征值/总特征值的和

列4.前面几行的列3的和

(误区:变量不是越多越好,否则不能达到降维的目的,一般等sqrt(num))

表5:特征向量

这个和特征值都是线性代数的内容,幸亏还是学过这门课。


表3是A,表5的每一列是V,表4的特征值是lmt

5.除此之外的一些东西


1.以comp1与comp2分布散点图:(载荷图)

proc plot

data=mylib.changecomp vpct=100;/*vpct后的数值表示图所占页面的长度*/

plot comp1*comp2 ='*'$ name/

/* ='*'表明图中的散点用*表示,还可用#等*/

/*美元符号后写标签变量 name 代表每个点根据name变量命名*/

haxis=-3.5 to 3 by 0.5

HREF=-2,0,2      vaxis=-3 to 6 by 0.5

VREF=-2,0,2;    /*HREF代表垂直于水平轴-2,0,2处画参考线,VREF同理*/

title '主成分散点图'

;  /*title为结果命名。Plot:主成分散点图,否则Plot:SAS系统*/

run;


2.changecomp表的comp变量是怎么来的


主成分变量是原始变量的线性表示,用公式表示如下:;

X表示原始变量对应数据组成的矩阵(以下称为原始数据矩阵),U是特征向量以列向量形式依次排列组成的矩阵(以下称为特征向量矩阵)。

但是这样做有问题,原始数据还未标准化;

proc standarddata = mylib.compout = mylib.standardmean = 0std=1;var x1-x8;run ;




正确的公式应该是;

3.变量是否线性相关

proc corrdata = mylib.changecompout = mylib.compcorr;var comp1-comp8;with comp1-comp8;run ;




可以看出,主成分变量之间的相关系数都为零。

1 0