一、关键词:
主成分分析思想:降维
信息量:第一主成分,第二主成分,.....
模型:矩阵方程或线性方程组
方程条件:主成分系数平方和为1,主成分间独立,主成分的方差递减
几何意义:坐标系旋转,以达到浓缩并覆盖原始信息避免信息重叠。
基于协方差阵求主成分:1.特征根,2.特征向量.3.第 i 主成分系数对应第 i 特征根的特征向量。
4.累积贡献率,5.k个主成分的得分,6.主成分载荷
基于相关系数阵求主成分:1.相关系数矩阵,2.特征根,3.特征向量,......
二、语法
主成份分析过程为princomp,可以从原始变量分析,也可直接从协方差矩阵、相关系数矩阵或叉积阵(SSCP)分析。分析结果可以存储到数据集中,供其他过程调用。
princomp过程一般由下列语句控制:
proc princomp data=数据集 </选项列表> ; |
var 变量列表; |
partial 变量列表; |
weight 变量; |
freq 变量; |
by 变量; |
run ; |
princomp过程的结果表包括每一变量的简单统计数、相关系数或方差-协方差矩阵、特征值和特征向量等。
l type=cov或type=corr——指明数据集类型,例如:data=new type=corr:表明new为一相关系数corr数据集。
l out=数据集名——规定存储原始数据和主分量得分的输出数据集。
l outstat=数据集名——生成一个包括变量的平均数、标准差、相关系数、特征值、特征向量的输出数据集。另外,如果规定cov选项,还包括由协方差矩阵进行的计算(一般由相关系数矩阵进行计算);
l n=个数——指定主分量个数。
l std——要求在out=的数据集里把主成份得分标准化为单位方差。如果没有规定此项,主成份得分的方差等于相应的特征值。
l noint——要求在模型中不含截距。
l noprint——不打印输出分析结果。
l var语句——指明分析的数值变量。如果省略var语句,则对所有数值变量进行分析。
partial语句——指明对偏相关阵或偏协方差矩阵进行分析时,被偏出去的这些数值变量的名字。
三、例子
from <<sas/stat User's guide>>
/*-----------------------------------------------------------*/ /* */ /* Pre-season 1985 College Basketball Rankings */ /* (rankings of 35 teams by 10 news services) */ /* */ /* Note: (a) news services rank varying numbers of teams; */ /* (b) not all teams are ranked by all news services; */ /* (c) each team is ranked by at least one service; */ /* (d) rank 20 is missing for UPI. */ /* */ /*-----------------------------------------------------------*/ data HoopsRanks; input School $13. CSN DurSun DurHer WashPost USAToday Sport InSports UPI AP SI; label CSN = 'Community Sports News (Chapel Hill, NC)' DurSun = 'Durham Sun' DurHer = 'Durham Morning Herald' WashPost = 'Washington Post' USAToday = 'USA Today' Sport = 'Sport Magazine' InSports = 'Inside Sports' UPI = 'United Press International' AP = 'Associated Press' SI = 'Sports Illustrated' ; format CSN--SI 5.1; datalines; Louisville 1 8 1 9 8 9 6 10 9 9 Georgia Tech 2 2 4 3 1 1 1 2 1 1 Kansas 3 4 5 1 5 11 8 4 5 7 Michigan 4 5 9 4 2 5 3 1 3 2 Duke 5 6 7 5 4 10 4 5 6 5 UNC 6 1 2 2 3 4 2 3 2 3 Syracuse 7 10 6 11 6 6 5 6 4 10 Notre Dame 8 14 15 13 11 20 18 13 12 . Kentucky 9 15 16 14 14 19 11 12 11 13 LSU 10 9 13 . 13 15 16 9 14 8 DePaul 11 . 21 15 20 . 19 . . 19 Georgetown 12 7 8 6 9 2 9 8 8 4 Navy 13 20 23 10 18 13 15 . 20 . Illinois 14 3 3 7 7 3 10 7 7 6 Iowa 15 16 . . 23 . . 14 . 20 Arkansas 16 . . . 25 . . . . 16 Memphis State 17 . 11 . 16 8 20 . 15 12 Washington 18 . . . . . . 17 . . UAB 19 13 10 . 12 17 . 16 16 15 UNLV 20 18 18 19 22 . 14 18 18 . NC State 21 17 14 16 15 . 12 15 17 18 Maryland 22 . . . 19 . . . 19 14 Pittsburgh 23 . . . . . . . . . Oklahoma 24 19 17 17 17 12 17 . 13 17 Indiana 25 12 20 18 21 . . . . . Virginia 26 . 22 . . 18 . . . . Old Dominion 27 . . . . . . . . . Auburn 28 11 12 8 10 7 7 11 10 11 St. Johns 29 . . . . 14 . . . . UCLA 30 . . . . . . 19 . . St. Joseph's . . 19 . . . . . . . Tennessee . . 24 . . 16 . . . . Montana . . . 20 . . . . . . Houston . . . . 24 . . . . . Virginia Tech . . . . . . 13 . . . ; ;/* PROC MEANS is used to output a data set containing the */ /* maximum value of each of the newspaper and magazine */ /* rankings. The output data set, maxrank, is then used */ /* to set the missing values to the next highest rank plus */ /* thirty-six, divided by two (that is, the mean of the */ /* missing ranks). This ad hoc method of replacing missing */ /* values is based more on intuition than on rigorous */ /* statistical theory. Observations are weighted by the */ /* number of nonmissing values. */ /* */ title 'Pre-Season 1985 College Basketball Rankings'; proc means data=HoopsRanks; output out=MaxRank max=CSNMax DurSunMax DurHerMax WashPostMax USATodayMax SportMax InSportsMax UPIMax APMax SIMax; run; data Basketball; set HoopsRanks; if _n_=1 then set MaxRank; array Services{10} CSN--SI; array MaxRanks{10} CSNMax--SIMax; keep School CSN--SI Weight; Weight=0; do i=1 to 10; if Services{i}=. then Services{i}=(MaxRanks{i}+36)/2; else Weight=Weight+1; end; run; ods graphics on; proc princomp data=Basketball n=1 out=PCBasketball standard plots=patternprofile; var CSN--SI; weight Weight; run; ods graphics off; proc sort data=PCBasketball; by Prin1; run; proc print; var School Prin1; title 'Pre-Season 1985 College Basketball Rankings'; title2 'College Teams as Ordered by PROC PRINCOMP'; run;