如何在R中仅以相关矩阵为数据源进行PCA与PCF分析
基于相关矩阵在R中实现PCA与主因子分析的问题解决
作为R语言新手,你误以为R只能用原始变量数据做PCA和主因子分析(PCF),而SAS可以直接用相关矩阵——这绝对是个误解!R完全支持直接基于相关矩阵开展这两种分析,下面就针对你遇到的问题一步步解决:
你的现有操作回顾
先把你已经完成的读取并整理相关矩阵的代码整理出来:
setwd("D:/BlueHDD/MAQAB/RStudio/R/PCA/Intelligence") mydata <- read.csv("Intelligence.csv", na.strings = ".") # 提取相关矩阵部分并设置行名列名 ii <- as.matrix(mydata[,2:7]) rownames(ii) <- c("M","P","C","E","H","F") colnames(ii) <- c("M","P","C","E","H","F")
你已经正确得到了对称的相关矩阵,这一步没问题。
之后你尝试用eigen(ii)计算特征值和特征向量,却遇到两个问题:
- 特征向量的正负和预期相反
- 用
princomp(ii)尝试获取载荷矩阵失败
问题1:特征向量正负的解释
这个完全不用纠结!特征向量的正负是任意的——如果v是某个特征值对应的特征向量,那么-v必然也是同一个特征值的特征向量,二者只是方向相反,但代表的是同一个方差最大化的方向。解释主成分的时候,只要保持逻辑一致就行,比如你可以把整个特征向量取反,完全不影响主成分的方差解释能力和实际意义。
问题2:基于相关矩阵做PCA的正确姿势(获取载荷矩阵)
你之前用fit <- princomp(ii)是错误的,因为princomp默认会把输入的矩阵当成原始变量数据来处理,而不是相关/协方差矩阵。正确的做法是用covmat参数指定你的相关矩阵:
# 基于相关矩阵执行PCA fit_pca <- princomp(covmat = ii, cor = FALSE) # 因为ii已经是相关矩阵,cor=FALSE即可;如果是协方差矩阵也可以用这个参数 # 查看主成分的方差解释情况 summary(fit_pca) # 获取载荷矩阵 loadings(fit_pca) # 绘制碎石图 plot(fit_pca, type = "lines")
这样你就能正常得到载荷矩阵了!另外,如果你需要主成分得分,因为没有原始数据,得分其实是变量在主成分上的投影,你可以手动计算:
# 计算变量的主成分得分(基于相关矩阵) pc_scores <- ii %*% fit_pca$loadings
基于相关矩阵做主因子分析(PCF)
如果你要做主因子分析,推荐使用psych包的fa函数,它可以直接接收相关矩阵作为输入:
# 先安装并加载psych包(如果没安装过的话) # install.packages("psych") library(psych) # 基于相关矩阵执行主因子分析,这里指定提取2个因子,方法为主轴因子法(fm="pa") fit_pcf <- fa(r = ii, nfactors = 2, fm = "pa") # 查看结果,保留3位小数 print(fit_pcf, digits = 3)
fm="pa"就是主因子分析的主轴因子法,你可以根据需求调整nfactors的数量,或者通过碎石图来确定合适的因子数。
内容的提问来源于stack exchange,提问作者Wilks
相关产品推荐
相关产品推荐

