R语言 主成分分析

(1)主成分分析的基本思想和性质:

···主成分分析(Principal Component Analysis,PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。在保留原始变量尽可能多的信息的前提下达到降维的目的,从而简化问题的复杂性并抓住问题的主要矛盾。

一般来说,利用主成分分析得到的主成分与原始变量之间有如下基本关系
①每一个主成分都是各原始变量的线性组合
②主成分的数目大大少于原始变量的数目
③主成分保留了原始变量的绝大多数信息
④各主成分之间互不相关

···主成分贡献率(contributing rate of principalcomponent),主成分的方差在所考察的随机变量的总方差中所占的比例,主要用以度量主成分对于原变量变异性的解释能力。第一主成分的贡献率越大,该值用来解释其他变量的能力就越强。主成分累积贡献率是选择有效主成分的重要依据,一般使得累积贡献率在85%以上为宜。

···因子负荷量 是指第k个主成分Y与原始变量X之间的相关系数ρ,因子负荷量的绝对值大小刻画了该主成分的主要意义和成因。

(2)案例分析1

搜集各国运动员如下八项男子径赛运动记录:
x1:100米(秒) x5:1500米(分)
x2:200米(秒) x6:5000米(分)
x3:400米(秒) x7:10000米(分)
x4:800米(秒) x8:马拉松(分)
R语言 主成分分析
数据:
R语言 主成分分析
………………

library(psych)
data=read.table(“clipboard”,header=T)
head(data)
#提取主成分的书面
fa.parallel(data,fa=“pc”,n.iter=100,show.legend=FALSE) #碎石图

R语言 主成分分析

#主成分分析
pc=principal(data,nfactors=2,rotate=“none”,score=TRUE)
pc$weights #求主成分系数

R语言 主成分分析
可得主成分系数表达式
R语言 主成分分析
将标准化的x代入以上式子,可得每个个案的主成分得分。

pc$scores #求主成分得分

R语言 主成分分析

#判断提取公因子数目
fa.parallel(data,fa=“fa”,n.iter=100,main=“Scree plots with parallel analysis”)
#提供主成分和因子分析的碎石图

R语言 主成分分析

#提取公因子
fa=fa(data,nfactors=2,rotate=“none”,fm=“pa”)
#因子旋转
fa.varimax=fa(data,nfactors=2,rotate=“varimax”,fm=“pa”) #正交旋转:方差最大化
fa.promax=fa(data,nfactors=2,rotate=“promax”,fm=“pa”) #斜交旋转
#斜交旋转计算因子载荷矩阵
fsm=function(oblique){
if(class(oblique)[2]==“fa”&is.null(oblique$Phi)){

warning(“object doesn’t look like EFA”)
}else{
P=unclass(obliqueloading)F=Ploading) F=P%*%obliquePhi
colnames(F)=c(“PA1”,“PA2”)
return(F)
}
}
fa.varimax #因子模型
fsm(fa.promax)

R语言 主成分分析
R语言 主成分分析
综合碎石图、特征值、平行分析图,可提取2个公因子。
采用主轴因子法获得初始解,第一、二公因子的方差贡献率分别为82%、10%,累计贡献达到92%,xi的共同度均在86%以上,绝大部分在90%以上,提取两个公因子恰当。
采用方差最大法对因子载荷矩阵进行正交旋转,得到因子模型
R语言 主成分分析

#画图
factor.plot(fa.varimax,labels=rownames(fa.varimax$loadings))
fa.diagram(fa.varimax,simple=FALSE)

R语言 主成分分析
R语言 主成分分析

#因子得分
fa.varimax$weights

R语言 主成分分析

根据旋转后的载荷矩阵,给公因子一命名耐力因子,公因子二命名速度因子。
计算因子得分
R语言 主成分分析

plot(fa.varimax$weights)
R语言 主成分分析

(3)案例分析2

“基本建设投资.xlsx”数据搜集了各地区投资基本建设的资金来源。进行因子分析。要求:
(1)利用主成分法,提取合适的因子个数,对提取效果进行分析;
(2)采用方差最大法进行因子旋转,根据因子载荷矩阵写出因子分析模型,并根据旋转后的因子载荷矩阵为各因子命名;
(3)保存因子得分,据此画散点图,分析各地区投资资金来源特点。
R语言 主成分分析

data=read.table(“clipboard”,header=T)
library(psych)
#提取主成分的书面
fa.parallel(data,fa=“pc”,n.iter=100,show.legend=FALSE)

#主成分分析
pc=principal(data,nfactors=2,rotate=“none”,score=TRUE)
pc$weights #求主成分系数

pc$scores #求主成分得分

#判断提取公因子数目
fa.parallel(data,fa=“fa”,n.iter=100,main=“Scree plots with parallel analysis”)
#提供主成分和因子分析的碎石图
#提取公因子
fa=fa(data,nfactors=2,rotate=“none”,fm=“pa”)
R语言 主成分分析

#因子旋转
fa.varimax=fa(data,nfactors=2,rotate=“varimax”,fm=“pa”) #正交旋转:方差最大化
fa.promax=fa(data,nfactors=2,rotate=“promax”,fm=“pa”) #斜交旋转
#斜交旋转计算因子载荷矩阵
fsm=function(oblique){
if(class(oblique)[2]==“fa”&is.null(oblique$Phi)){
warning(“object doesn’t look like EFA”)
}else{

P=unclass(obliqueloading)F=Ploading) F=P%*%obliquePhi
colnames(F)=c(“PA1”,“PA2”)
return(F)
}
}
fa.varimax
fsm(fa.promax)

R语言 主成分分析
R语言 主成分分析
观察碎石图,提取两个公因子,方差累计贡献率89%,两个公因子能解释原始变量89%的方差,变量共同度除了国内贷款为79%,其余均在85%以上,大部分变量信息留存较好,整体提取效果较好。

因子模型:
国家预算内基金:x1=0.12f1+0.62f2
国内贷款:X2=0.64f1+0.62f2
利用外款:X3=0.83f1+0.27f2
自筹资金:X4=0.94f1+0.3f2
其他投资:X5=0.91f1+0.17f2

#画图
factor.plot(fa.varimax,labels=rownames(fa.varimax$loadings))
fa.diagram(fa.varimax,simple=FALSE)

R语言 主成分分析
R语言 主成分分析

#因子得分
fa.varimax$weights

R语言 主成分分析