【发布时间】:2020-10-03 13:17:18
【问题描述】:
我的数据结构如下:
set.seed(123)
dat1 <- data.frame(State = rep(c("NY","MA","FL","GA"), each = 10),
Loc = rep(c("a","b","c","d","e","f","g","h"),each = 5),
ID = rep(c(1:10), each = 2),
var1 = rnorm(200),
var2 = rnorm(200),
var3 = rnorm(200),
var4 = rnorm(200),
var5 = rnorm(200))
我正在为 PCA 使用 FactoMineR 和 factoextra 包。我正在编写以下函数来为 PCA 生成摘要输出和绘图:
pfun <- function(dat, cols, ncp){
res <- PCA(dat[,cols], scale.unit = T, ncp = ncp, graph = F)
eigs<-round(res$eig, 2)
scree <- fviz_eig(res, addlabels = T)
contribplot<-corrplot(get_pca_var(res)$contrib, is.corr = F)#variable contributions to each pc
cos2plot<-corrplot(pca.vars$cos2, is.corr=F)#quality of var representation in each pc
output<- list(eigs, scree, contribplot, cos2plot)
return(output)
}
pfun(dat = cdatsq, cols = 7:13, ncp = 7)
到目前为止,该函数工作正常,但我还希望它为函数确定特征值小于或等于 1 的每个主成分的数量/组合生成双图和变量贡献图。例如,我尝试在函数中使用 num <- sum(eigs[,1]>=1, na.rm = TRUE)#for the number of pcs to keep and plot 和 for 循环:
for(i in 1:sum(eigs[,1]>=1, na.rm = TRUE)){
fviz_contrib(res, choice = "var", axes = i, top = 10)
}
这不起作用,我怎样才能使这些与其余输出一起打印?此外,我想使用fviz_pca_biplot() 为sum(eigs[,1]>=1, na.rm = TRUE) 范围内的每个主成分组合生成双图。在函数之外,一个绘图调用如下所示:
#example shown for PC2:PC3 with points labeled by `Loc`
fviz_pca_biplot(res, axes = c(2,3), geom.ind = "point", pointsize=0, repel = T)+
ggtitle("plot for PC2:PC3")+
geom_text(aes(label = paste0(dat1$Loc)), alpha = 0.5, size = 3, nudge_y = 0.1, show.legend = FALSE)
但是在函数中,我如何在sum(eigs[,1]>=1, na.rm = TRUE) 的范围内指定主成分的“所有组合”(即,PC1:PC2、PC2:PC3 等会有一个图)?
理想情况下,我想为每个分组变量将双标图分成单独的网格(例如,双标点由State 着色的页面和它们由Loc 着色的页面)。
【问题讨论】:
标签: r ggplot2 functional-programming data-visualization pca