首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多因素PCA分析提取最大载荷值

多因素PCA分析提取最大载荷值
EN

Stack Overflow用户
提问于 2013-09-14 07:23:41
回答 2查看 611关注 0票数 0

我有一个多物种的数据集,大约400个变量。我希望对每个物种执行Princpal分量分析(Princpal Component Analysis,PCA),并返回每个物种负载值最高的变量。

若要对数据进行复制虚拟集,请执行以下操作:

代码语言:javascript
复制
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中,我首先必须对数据进行子集:

代码语言:javascript
复制
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

我希望,不必每次都分样本,获取每个物种组的列名,例如:

代码语言:javascript
复制
Species  PC1     PC2      PC3      PC4      PC5
 spA      V3     V100     V287     V2       V65
 spB      V78    V197     V310     V23      V333 
........

刚刚意识到:我需要选择我感兴趣的组件,最好是95%的解释方差,也许我会尝试99%的also...but,我将必须包括代码。

如有任何建议,将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-14 09:53:50

如果将物种名称保留为数据框架中的变量,则可以在ddply包中使用plyr

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2013-09-14 07:54:01

如果我正确理解您的问题,您希望将prcomp函数应用于您的数据子集。就我所知,没有处理这件事的原生方法。

你可以尝试一些这样的方法:

代码语言:javascript
复制
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对该物种的返回结果。您可以更改循环或格式化返回列表,以只获取所需的数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18799389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档