实验过程中是用SPSS进行的分析,后用R和matlab写了一遍,发现由于前期对数据进行了标准化,在SPSS中操作时它默认会标准化,导致最后变量之间的差异减小,贡献差异不大。然而数据来源和数据结果都是正确的,已经过反复确认。具体的原R代码文件名称是PCA_R.R,具体的保存路径是G:\9-temp\data\docu\HSIandChrichton
library("FactoMineR")#import package library("factoextra") # read original data,620 number explore <- read.csv("G://9-temp//data//docu//HSIandChrichton//PCA_explore2.csv",header=TRUE) head(explore) # derive population categories explore.active1 <- explore[,c('Ecological.economic.worker','Young.children','Illiterate','The.disabled','Senior','Population.density')] head(explore.active1[,1:6],4) #PCA analysis, use standadiztion res.pca <-PCA(explore.active1, scale.unit =TRUE, ncp = 3, graph = FALSE) var <- get_pca_var(res.pca) var # create sceeplot fviz_screeplot(res.pca) #loading factor fviz_pca_var(res.pca, col.var = "black") #contribution fviz_pca_var(res.pca, alpha.var = "contrib") # Visualize variable with cos2 >= 0.99//quality ? did not use cos2 fviz_pca_var(res.pca, select.var = list(cos2 = 0.3), repel=T, col.var = "cos2", geom.var = c("arrow", "text") ) # Top 5 active variables with the highest cos2 fviz_pca_var(res.pca, select.var= list(cos2 = 5), repel=T, col.var = "contrib") # Select by names name <- list(name = c("Ecological.economic.worker", "Young.children", "Illiterate","The.disabled","Senior")) fviz_pca_var(res.pca, select.var = name) #以相关分析矩阵的形式绘制loading factor表格 library("corrplot") corrplot(var$cor, is.corr=FALSE,tl.cex=1,addCoef.col='grey',tl.srt = 45) #tl.cex:指定文本标签的大小 #tl.col:指定文本标签的颜色 #addCoef.col:为相关系数添加颜色 #读取另外一组变量 explore.active2 <- explore[,c('Proximity.to.water.bodies','fan_living_zscore','roadlength_zscore','evi_zscore','fan_terrain','Income')] #rename colnames(explore.active2)=c('proximity.to.water.bodies','living status','road density','proximity.to.vegetation','topography','income') head(explore.active2) #进行PCA分析,同样做标准化处理 res.pca2 <-PCA(explore.active2, scale.unit =TRUE, ncp = 2, graph = FALSE) #碎石图 fviz_screeplot(res.pca2) #loading factor fviz_pca_var(res.pca2, col.var = "black") ###plotting 尝试画组化图,下面的代码都能够跑出来,但是效果一般,最后用的是photoshop require(ggplot2) require(grid) chart1 <- fviz_screeplot(res.pca,title="population") chart2 <- fviz_pca_var(res.pca, col.var ="black") chart3 <- fviz_screeplot(res.pca2) chart4 <- fviz_pca_var(res.pca2, col.var="black") grid.newpage() grid.newpage() ###新建图表版面 pushViewport(viewport(layout = grid.layout(2,2))) ####将版面分成2*2矩阵 vplayout <- function(x,y){viewport(layout.pos.row = x, layout.pos.col = y)} ###定义图表的布局规则,也就是指定画布的行显示图表的X轴,列显示图表的Y轴。 print(chart1, vp = vplayout(1,1)) ###将(1,1)的位置画图chart1 print(chart2, vp = vplayout(1,2)) ###将(2,1)的位置画图chart2 print(chart3 , vp = vplayout(2,1)) ###将(2,2)的位置画图chart3 print(chart4 , vp = vplayout(2,2)) ###将(2,2)的位置画图chart4
按代码中的绘图顺序,得到的图片结果如下(保留视觉印象)
主要的参考来源:https://mp.weixin.qq.com/s/raQpNx4RwlzozWt_wRArqA
另外 知乎提供的R语言教程中会提供主成分旋转相关的代码,但用到的包不同,自己在实验内就不涉及了。https://zhuanlan.zhihu.com/p/26305845
图表排版的来源代码之一:https://zhuanlan.zhihu.com/p/27238703 该教程中的第二种方法multiplot函数中涉及到的Rmisc包安装不了,因此第二种方法看似更为简单,实际用不上。
Phtoshop上的图片组合有自带的教程