下面给出主成分法的R程序(factor.analy1.R)
factor.analy1<-function(S, m){
p<-nrow(S)diag_S<-diag(S)sum_rank<-sum(diag_S)
rowname<-paste("X", 1:p, sep="")
colname<-paste("Factor", 1:m, sep="")
A<-matrix(0, nrow=p, ncol=m,
dimnames=list(rowname, colname))
eig<-eigen(S)
for (i in 1:m)
A[,i]<-sqrt(eig$values[i])*eig$vectors[,i]
h<-diag(A%*%t(A))
rowname<-c("SS loadings", "Proportion Var", "Cumulative Var")
B<-matrix(0, nrow=3, ncol=m,
dimnames=list(rowname, colname))
for (i in 1:m){
B[1,i]<-sum(A[,i]^2)
B[2,i]<-B[1,i]/sum_rank
B[3,i]<-sum(B[1,1:i])/sum_rank
}
method<-c("Principal Component Method")
list(method=method, loadings=A,
var=cbind(common=h, spcific=diag_S-h), B=B)
}
函数输入值S是样本方差阵或相关矩阵,m是主因子的个数,函数的输出值是列表形式,其内容有估计参数的办法(主成分法),因子载荷(loadings),共性方差和特殊方差,以及因子F对变量X的贡献、贡献率和累积贡献率。
#调用因子分析主成分法的函数
source("factor.analy1.R")
#显示结果.估计参数的方法为主成分法,loadings-因子载荷,var-共性方差和特殊方差
例:1 2 3
3 1 2
2 3 1
>>[d,v]=eig([1 2 33 1 22 3 1])
d =
-0.5774 -0.2887 + 0.5000i -0.2887 - 0.5000i
-0.5774 0.5774 0.5774
-0.5774 -0.2887 - 0.5000i -0.2887 + 0.5000i
v =
6.0000 0 0
0 -1.5000 + 0.8660i 0
0 0 -1.5000 - 0.8660i
v 的对角线上元素是矩阵的特征值
d 中的列向量是对应的特征向量
PCA(Principal Component Analysis),即主成分分析方法,是一种使用广泛的数据降维算法。详细的概念可以参照 https://zhuanlan.zhihu.com/p/37777074一般将多个样本降维就可以得到二维的分布,相似的样本成为一群,但有时候我们想知道哪些特征导致了这样的分群。
这里我们主要讨论怎么样用R实现以及提取我们需要的特征:
用R实现PCA有多个方法:
prcomp() and princomp() [built-in R stats package],
PCA() [FactoMineR package],
dudi.pca() [ade4 package],
and epPCA() [ExPosition package]
decathlon2是一个27行,13列的data.frame,分析之前需要用scale()函数进行标准化,消除不同量纲之间的差距。在计算PCA的时候也有很多内置的scale参数,如:FactoMineR包里函数PCA(X, scale.unit = TRUE, ncp = 5, graph = TRUE)里面的 scale.unit = TRUE,则进行标准化,或者
降维的分群图(这个没有明显的分群)
作为分群依据的特征值和特征向量
我们可以通过这些函数提取需要的数据:
get_eigenvalue(res.pca): 提取特征值
fviz_eig(res.pca): 可视化特征值
从中我们看到前两个PC可以涵盖59.6%variance,一般用涵盖百分之八十以上的variance就够了,也可以用碎石图展示。
cos2cos2 (square cosine, squared coordinates) 能够代表某个PC的代表性的特征值:
欢迎关注~
参考: http://www.sthda.com/english/articles/31-principal-component-methods-in-r-practical-guide/118-principal-component-analysis-in-r-prcomp-vs-princomp/