主成分分析的2种应用和SAS分析全流程+结果解读
理论介绍:
l主成分分析法是一组相关性强的变量通过线性变换转化为另一组不相关的变量,这些新的变量按照方差从大到小的顺序排列,在数学变换中保持变量的总方差不变,第1变量具有最大的方差,称为第1主成分;第2变量具有第2大的方差,称为第2主成分;依次类推,一直有N个主成分。且1-N个主成分之间不相关,同时,有几个变量就有几个主成分。
l主成分分析法的应用:适用于自变量存在多重共线性,且各自变量为连续变量
(1)原始指标构建为1个综合指标:即将几个共线性较强的变量,通过生成多个主成分,并提取相应的主成分来构建一个综合指标。
主成分提取的原则:a.该主成分的特征值>=1; b.累积方差贡献率>=0.8,即提取的这几个主成分可以解释原始变量至少80%的变异或信息。
例:假设x1、x2、x3存在较强的共线性,现在需要采用主成分分析方法去将x1、x2、x3合并为综合指标x,具体步骤如下:
A.x1、x2、x3进行主成分分析:可以得到3个主成分的特征值、单个指标的方差贡献率和累积方差贡献率,假设特征值和累积方差贡献率如下:
主成分 | 特征值 | 方差贡献率 | 累积方差贡献率 |
Prin1 | 1.2 | 0.62 | 0.62 |
Prin2 | 1.1 | 0.30 | 0.92 |
Prin3 | 0.8 | | 1 |
B.提取主成分:按照“a.该主成分的特征值>=1; b.累积方差贡献率>=0.8”两个原则我们提取prin1和prin2两个主成分。
C.综合指标计算:prin1、prin2的方差贡献率分别是0.62和0.30,前两个主成分累积方差贡献率是0.92,即这两个主成分解释了92%的变异。因此综合指标计算公式如下:
X=(0.62*prin1+0.30*prin2)/0.92
(2)探索多个原始指标对因变量的影响:当多个自变量存在共线性时,我们直接分析多个自变量与因变量的关系时,可能模型无法拟合,即使模型拟合成功,参数结果也不准。因此,需要将多个原始自变量变为多个主成分之后,再拟合多个主成分与因变量的模型,从而得到各原始变量对因变量的正确的回归系数。
例:假设分析x1、x2、x3对y的影响,但x1、x2、x3之间存在严重共线性,导致无法得到x1、x2、x3对y的估计值。现采用主成分分析方法去拟合,具体步骤如下:
A.x1、x2、x3进行主成分分析:可以得到3个主成分,并将这3个主成分输出到原始数据中,分别是prin1、prin2、prin3。主成分结果会给出3个主成分的特征向量(又称得分系数),根据得分系数,可建立3个主成分与3个自变量的表达式。假设,3个主成分的特征向量如下:
自变量/主成分 | Prin1 | Prin2 | Prin3 |
X1 | 0.5 | 0.4 | 0.3 |
X2 | 0.3 | 0.2 | 0.2 |
X3 | 0.2 | 0.4 | 0.1 |
那么第1主成分的表达式为:prin1=0.5*x1+0.3*x2+0.2*x3
第2主成分的表达式为:prin2=0.4*x1+0.2*x2+0.4*x3
第3主成分的表达式为:prin3=0.3*x1+0.2*x2+0.1*x3
B.建立prin1、prin2、prin3与y的模型,如下:
y=b1*prin1+b2*prin2+b3*prin3+残差
建立模型后,我们得到b1=0.2; b2=0.3; b3=0.4; 残差=0.1,因此主成分与y的模型如下:y=0.2*prin1+0.3*prin2+0.4*prin3+0.1
C.将主成分的表达式套入上述模型公式中:结果如下:
y=0.2*(0.5*x1+0.3*x2+0.2*x3)+
0.3*(0.4*x1+0.2*x2+0.4*x3)+
0.4*(0.3*x1+0.2*x2+0.1*x3)
+0.1
结果如下:
y=0.34*x1+0.2*x2+0.2*x3+0.1 方程1
由于是将主成分的表达式代入得到的x1-x3的回归系数,此时的x1-x3是标准化变量,其回归系数为标准化回归系数,而非原变量回归系数,因此需要将标准化变量还原为原始变量:
标准化变量=(原始变量-均值/标准差),这里假设x1-x3的均值和标准差如下:
变量 | 均值 | 标准差 |
X1 | 0.6 | 0.1 |
X2 | 0.5 | 0.2 |
X3 | 0.4 | 0.1 |
那么将上述均值和标准差带入方程1得到:
y=0.34*[(x1-0.6)/0.1]
+0.2*[(x2-0.5)/0.2]
+0.2*[(x3-0.4)/0.1]
+0.1
得到的结果如下:
y=0.034*x1+0.02*x2+0.02*x3-3.34 方程2
方程2是最终的结果,即代表x1-x3的原始值对y的影响
实践操作:
(1)原始指标构建为1个综合指标
例子:收集了一群人的基本人口学信息,现在依据“文化程度、家庭年收入、职业、”3个指标构建综合指标社会经济地位。
变量赋值表
文化程度 | 0=小学及以下/不详 1=初中 2=高中/中专 3=大专及以上 |
家庭年收入 | 0=不详 1= <10 000 2=10 000- 3= >50 000 |
职业 | 3=管理/专业人员 2=技术工人 1=退休 0=失业/家务/不详 |
/*导入数据*/
proc import out=data
datafile="E:\02学习\经验\02SAS代码实现\04主成分分析构建综合指标\20240811.xlsx"
replace;
quit;
A.x1、x2、x3进行主成分分析
proc princomp data=data out=out1 std outstat=stat1 prefix=z;
/*std:代表生成的主成分变量方差被标准化为1*/
var 文化程度1 家庭年收入1 职业1;
quit;
/*在out1数据集将生成留个主成分变量Z1-Z3,如下:*/
B.提取主成分
/*一般来说:根据特征值>=1,累积方差贡献率>=0.8提取主成分*/
这里我们发现虽然1-2主成分特征值>=1,,且前2个主成分的累积方差贡献率达77.86%,因此我们提取前2个主成分
/*下面结果是每个主成分在六个变量上的因子载荷,也叫特征向量,因子载荷越大,代表该主成分主要解释这几个变量*/
C.综合指标计算
/*最后:构建综合指标SES:我们以每一个主成分的方差贡献率为权重构建指标*/
/*1:0.4447*/
/*2:0.3339*/
/*zong :0.7786*/
data out1;
set out1;
主成分SES=(prin1*0.4447+prin2*0.3339)/0.7786;
run;
(2)探索多个原始指标对因变量的影响:
例子:收集了一群人的基本人口学信息,现在依据“文化程度、家庭年收入、职业”,假定3个指标存在较强相关性,现在采用主成分分析的方法得到文化程度、家庭年收入、职业对bmi的影响。
A.主成分分析:
根据实践1的主成分得到的因子载荷可以得到提取的两个主成分的表达式:
z1=0.707507*文化程度1+0.706370*家庭年收入1
Z2=0.036367*文化程度1-0.067182*家庭年收入1
B.建立prin1、prin2与bmi的模型:
proc genmod data=out1;
model bmi=z1 z2;
quit;
因此:bmi=24.5610-0.0611*z1-0.0575*z2
C.将主成分的表达式套入上述模型公式中:
Bmi=24.5610-0.0611*(0.707507*文化程度1+0.706370*家庭年收入1)
-0.0575*(0.036367*文化程度1-0.067182*家庭年收入1)
Bmi=24.5610-0.04531978文化程度1-0.03929624*家庭年收入1 方程1
此时的回归系数是标准化回归系数,非原始回归系数,因此将此处的文化程度1和家庭年收入1这两个标准化的变量转变为原始的变量:主成分的结果给出了均值和标准差:
将文化程度1和家庭年收入1的均值标准差按照【标准化变量=(原始变量-均值)/标准差】代入方程1得到:
Bmi=24.5610-0.04531978[(文化程度1-0.9480756470)/0.9068757943]
-0.03929624*[(家庭年收入1-1.621930989)/0.799388011]
最后计算结果如下:
Bmi=-0.04997352*文化程度1-0.04915791*家庭年收入1+24.68811
结果解读:文化程度1每增加1个单位,bmi下降0.04997352;
家庭年收入1每增加1个单位,bmi下降0.04915791。
参考书籍:
SAS统计分析与应用从入门到精通
医学案例统计分析与SAS应用(第2版)
全部代码:
/*导入数据*/
proc import out=data
datafile="E:\02学习\经验\02SAS代码实现\04主成分分析构建综合指标\20240811.xlsx"
replace;
quit;
/*(1)原始指标构建为1个综合指标*/
/*主成分分析*/
proc princomp data=data out=out1 std outstat=stat1 prefix=z;
/*std:代表生成的主成分变量方差被标准化为1*/
var 文化程度1 家庭年收入1 职业1;
quit;
/*在out1数据集将生成留个主成分变量Z1-Z3*/
/*一般来说:根据特征值>=1,累积方差贡献率>=0.8提取主成分*/
/*这里我们发现虽然1-2主成分特征值>=1,,且前2个主成分的累积方差贡献率达77.86%,因此我们提取前2个主成分*/
/*最后:构建综合指标SES:我们以每一个主成分的方差贡献率为权重构建指标*/
/*1:0.4447*/
/*2:0.3339*/
/*zong :0.7786*/
data out1;
set out1;
主成分SES=(prin1*0.4447+prin2*0.3339)/0.7786;
run;
/*(2)探索多个原始指标对因变量的影响:*/
/*B.建立z1、z2与bmi的模型:*/
proc genmod data=out1;
model bmi=z1 z2;
quit;
最重要的原始练习数据:喜欢的点个关注呗