楼主在学习过程中梳理并且记录了自己的知识点,只用作学习,这篇文章会引用网上的图片和文字,若有侵权,及时告知,本人会马上修改。这篇文章中的案例若有错误,也请及时指出,大家相互学习,共同进步。
如果看本篇文章有点小小困惑和不解的话,去了解一下下矩阵的线性关系和求特征根等知识就会豁然开朗啦
主成分分析:通过原来变量的线性组合来解释原来变量的大部分信息,达到降维的目的,从而简化问题的复杂性。
主成分分析方法适用于原始变量之间有较强的相关性,若原始数据相关性较弱,晕晕主成分分析不能很好的起到降维作用(即所得到的各个主成分浓缩原始变量信息的能力差别不大)。一般认为,当原始数据大部分变量的相关系数都小于0.3时,运用主成分分析不会取得很好的效果。
重叠信息:最小特征根接近0时,意味着原始变量之间存在着多重共线性。此时可以考虑对最初纳入分析的指标进行筛选。
降维:用较少的指标代替原来较多的指标,但依然能反映原有的大部分信息,这种统计方法称为降维。最常用的降维方法,主成分分析,因子分析(是主成分分析的推广)。
1.几何意义:
以二维空间为例,
1>设有N个样品,每个样品有两个观察变量X1、X2,N个样品散步在由X1、X2构成的坐标系中;
考虑用变量Y1、Y2(X1、X2的线性组合【将坐标轴按逆时针方向旋转Θ角度得到 新的坐标轴】形成的新综合变量)刻画。
2>由图可以看出:N个样品无论沿X1还是X2轴方向,均有较大的离散性,但是只考虑这两个中 的 任 何一个,原始数据的信息均会有较大的损失。
N个样品在Y1轴方向 有最大的离散程度,变量Y1代表了原始数据的绝大部分。
的信息,N个样品在Y2轴方向 有较大的离散程度,但与Y1相比较保留了较小的
的原始数据信息。
在研究实际问题时,即使不考虑Y2也无损大局。
3>目的:找出变化矩阵U
4> 意义:主成分分析的过程无非就是坐标系旋转的过程,各主成分表达式就是新坐标系与原坐标系的转换关系,在新坐标系中,各坐标轴的方向就是原始数据变差最大的方向。
主成分与原始变量的基本关系:
(1)每一个主成分都是各原始变量的线性组合
(2)主成分的数目大大少于原始变量的数目
(3)主成分保留了原始变量的绝大多数信息
(4)各主成分之间互不相关
性质:我们所说的保留原始变量尽可能多的信息,也就是指生成较少的综合变量(主成分)的方差尽可能接近原始变量方差的总和。协方差矩阵(或相关矩阵)正是对各变量离散程度的信息的反应,【相关矩阵是将原始变量标准化后的协方差矩阵】。
碎石图:又称为山体滑坡图,山坡上越高的点,其势能越大。对于研究而言就越重要每一个主成分为一个点,通过“坡度趋于平缓”的未知判断提取主成分的数量。
贡献率:这个值越大,表明Y1这个虚拟变量综合X1~Xp的能力越强,由Y1的差异来解释随机向量X 的差异的能力越强(以第一主成分的贡献率阐述贡献率)。
因子负荷量:第k个主成分Yk与原始变量Xi的相关系数,它的绝对值大小刻画了该主成分的主要意义及其成因。
鼠标写字太难啦,如果有认不出来的和有错误的请练习博主及时纠正。
主成分分析步骤:
(1)根据研究问题选取初始分析变量
(2)根据初始变量特性判断由协方差阵求主成分还是由相关阵求主成分
(3)求协方差阵或相关阵的特征根与相应标准特征向量
(4)判断是否存在明显的多重共线性,若存在则回到第(1)步
(5)得到主成分的表达式并确定主成分个数,选取主成分
(6)结合主成分对研究问题进行分析并深入研究
案例:为掌握我国各地区主要行业的城镇私营企业就业人员的平均工资水平,选取下图所示数据,用主成分分析方法处理数据,以期用较少的变量描述这些行业各地区就业人员的工资水平。
X1 农、林、牧、渔业 X2 制造业 X3 电力、热力、燃气、水的生产和供应业 X4 建筑业
X5 住宿和餐饮业 X6 金融业 X7房地产业 X8 教育业 X9文化、体育、娱乐业
代码:
ex5.1<-read.table("E:\\class_date\\data\\例5-1(1).txt",head=TRUE,fileEncoding="utf8")
mode(ex5.1)#列表类型
这里是在处理文本数据,用第一列地名代替IP编号
dat51<-ex5.1[,-1]#除去表头算起,取第几行第几列,负数表示除去这一列的所有此行数据
#ex5.1[2,-3]
#地区 X1 X3 X4 X5 X6 X7 X8 X9
#2 天津 36007 47103 50372 43400 68436 58365 44999 51602
rownames(dat51)<-ex5.1[,1]
dat51
协方差矩阵
sigm<-cov(dat51)
sigm
help(eigen)#此函数是用来将协方差进行特征根和特征向量提取出来的
my51<-eigen(sigm)
提取特征根
lam<-my51$values
lam
p<-length(lam)
提取特征向量
gam<-my51$vectors
colnames(gam)<-paste("ves",sep = "",1:p)
#提取第一、第二主成分的特征向量
gam[,1:2]
方差贡献率
lam/sum(lam)
累积贡献率
cumlam<-cumsum(lam)/sum(lam)
#制作数据表包含"特征根","贡献率","累积贡献率"
VE<-data.frame(lam,lam/sum(lam),cumlam)
colnames(VE)<-c("特征根","贡献率","累积贡献率")
VE
碎石图
plot(lam,type="o",xlab="主成分序号",ylab="特征值")
我们可以看出第一主成分的方差贡献率为百分之82.3,解释原始变量总差异的效果比较好,从碎石图上我门可以看到从2以后逐渐平稳,显示两个主成分比较好.
写出第一、第二主成分的表达式:
Y1 = -0.119x1-0.232x2-0.169x3-0.145x4-0.130x5-0.744x6-0.409x7-0.253x8-0.283x9
Y2 = -0.320x1-0.357x2-0.353x3-0.0.384x4-0.275x5-0.511x6-0.074x7-0.123x8-0.375x9
求因子负荷量
#data:包含了矩阵的元素,一般是个向量,默认情况下是NA
#nrow和ncol:设定矩阵的行、列数目;一般这两个值只需设定一个,另外一个值可根据元素个数自动给出
#byrow:设定矩阵是按行(byrow=TRUE)填充还是按 列(byrow=FALSE)填充,默认情况下按列填充
lam_ma<-matrix(lam,p,p,byrow = TRUE)
#diag函数可以用来提取矩阵的对角元素,并将它保存成向量的格式。值得注意的是,如果所要提取的矩阵不是方阵的话,diag函数仍然可以调用。
sigmai<-(diag(sigm))^0.5
#特征向量*特征根的算术平方根
gamsla<-gam*sqrt(lam_ma)
load<-gamsla/sigmai#因子负荷量
colnames(load)<-paste("load",sep = "",1:p)# paste函数将其参数转换为字符串并连接他们,字符串之间用seq间隔分开。
load[,1:2]
从因子负荷量可以看出,X6、X7、X8、X9在第一主成分中占较大的比重,说明第一主成分主要综合了第三产业的就业人员的工资水平。第二主成分对于的因子符合两除X7、X8,其他相差不多。
得分
#将dat51转化为矩阵
dat51<-scale(dat51,center=TRUE,scale = TRUE)
y1<-dat51%*%as.matrix(gam[,1],p,1) 构造p行1列的特征向量被gam[,1]的数据填满
y2<-dat51%*%as.matrix(gam[,2],p,1)
data.frame(y1,y2)
plot(y1,y2,pch="*",xlab="第一主成分",ylab = "第二主成分")
abline(h=0,lty=2)
abline(v=0,lty=2)
text(y1,y2,ex5.1[,1],adj=-0.5)
参考来源:
多元统计分析--何晓群 马学俊编著
特征根与特征向量 - 百度文库https://wenku.baidu.com/view/31946da8b5daa58da0116c175f0e7cd18525186f.html?_wkts_=1683700090407&bdQuery=%E7%89%B9%E5%BE%81%E5%90%91%E9%87%8F%E5%92%8C%E7%89%B9%E5%BE%81%E6%A0%B9%E7%9A%84%E5%85%B3%E7%B3%BB数据降维大法——主成分分析https://zhuanlan.zhihu.com/p/454447043