我有一个多物种的数据集,大约400个变量。我希望对每个物种执行Princpal分量分析(Princpal Component Analysis,PCA),并返回每个物种负载值最高的变量。
若要对数据进行复制虚拟集,请执行以下操作:
set.seed(45)
pcadata <- data.frame(matrix(sample(10, 26746*400, TRUE), ncol=400))
cbind(pcadata,"Species")我遇到的一个问题是,对于给定的物种,有不同的样本大小。例如,我可能有250个物种A样本和520个物种B样本。因此,我必须使用prcomp函数,因为我的变量比样本多。因此,如果物种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 PC1 PC2 PC3 PC4 PC5
spA V3 V100 V287 V2 V65
spB V78 V197 V310 V23 V333
........刚刚意识到:我需要选择我感兴趣的组件,最好是95%的解释方差,也许我会尝试99%的also...but,我将必须包括代码。
如有任何建议,将不胜感激。
发布于 2013-09-14 09:53:50
如果将物种名称保留为数据框架中的变量,则可以在ddply包中使用plyr。
library(plyr)
# create data with a species variable
set.seed(45)
df <- data.frame(matrix(sample(1:10, size = 50, replace = TRUE), ncol = 5))
df$species <- rep(1:2, each = 5)
# run pca and massage data per species
df2 <- ddply(.data = df, .variables = .(species), function(x){
pca <- prcomp(x[ , 1:5], cor = TRUE, scale = TRUE)
load <- abs(pca$rotation)
prop_load <- apply(load, 2, function(x) x/sum(x))
max_load <- rownames(prop_load)[apply(prop_load, 2, function(x) which.max(x))]
max_load2 <- data.frame(t(max_load))
names(max_load2) <- colnames(load)
return(max_load2)
}
)
df2
# species PC1 PC2 PC3 PC4 PC5
# 1 1 X1 X2 X4 X3 X5
# 2 2 X2 X1 X3 X2 X5发布于 2013-09-14 07:54:01
如果我正确理解您的问题,您希望将prcomp函数应用于您的数据子集。就我所知,没有处理这件事的原生方法。
你可以尝试一些这样的方法:
species <- unique(colnames(pcadata))
pcaresults <- list()
for (sp in species) {
spIndices <- which(colnames(pcadata) == sp)
pcaresults[sp] <- prcomp(pcadata[,spIndices], cor=T,scale=T)
}这将给出一个列表,其中每个元素都是PCA对该物种的返回结果。您可以更改循环或格式化返回列表,以只获取所需的数据。
https://stackoverflow.com/questions/18799389
复制相似问题