我有一个包含多个物种和大约 400 个变量的数据集。我想对每个物种执行主成分分析 (PCA),并返回每个物种具有最高负载值的变量。
制作我的数据的复制虚拟集:
set.seed(45)
pcadata <- data.frame(matrix(sample(10, 26746*400, TRUE), ncol=400))
cbind(pcadata,"Species")
我遇到的一个问题是给定物种的样本量不同。例如,我可能有 250 个物种 A 的样本和 520 个物种 B 的样本。因此我必须使用该prcomp
函数,因为我的变量比样本多。因此,如果 Species A (spA) 在 data.frame 中,我首先必须对数据进行子集化:
pcadata.s<-pcadata[,2:401]
pca<-prcomp(pcadata.s,cor=T,scale=T)
al<-abs(pca$rotation) #Absolute value of the loading value
loads<-sweep(al,2,colSums(al),"/") #Percentage contribution
loads.mtx<-as.data.frame(loads)
rownames(loads.mtx)[apply(loads.mtx,2,which.max)] #Return the Column-name with the max value
我想,不必每次都进行子采样,而是获取每个 Species 分组的列名,例如:
Species PC1 PC2 PC3 PC4 PC5
spA V3 V100 V287 V2 V65
spB V78 V197 V310 V23 V333
........
刚刚意识到:我需要选择我感兴趣的组件,最好是解释方差的 95%,也许我也会尝试 99% ......但我必须包含代码。
任何建议将不胜感激。