2

我有一个包含 17 列(每列一个基因)和 34 行(每行一个患者)的数据框

Patient EXO1 MLH1 MSH2 MSH3 MSH6 PCNA PMS1 PMS2 POLE POLE2 POLE3 POLH RFC2 
1651109    0    0    1    1    1    1    1    1    1     0     1    0    0      
1651648    0    1    1    1    1    0    1    0    1     0     0    1    1  
........

例如,数据框的名称是testdb. 然后我跑

res=princomp(testdb);  
summary(res);

这表明

Importance of components:  
                          Comp.1    Comp.2    Comp.3     Comp.4     Comp.5  
Standard deviation     0.6577676 0.4757815 0.4138278 0.39002636 0.37679135  
Proportion of Variance 0.2822533 0.1476757 0.1117206 0.09923892 0.09261812  
Cumulative Proportion  0.2822533 0.4299290 0.5416497 0.64088859 0.73350672  
....

名字是愚蠢的comp.1 comp.2 comp.3......我怎样才能将名字映射回基因名称?我知道biplot(res)会在输出图上打印一些基因,但这显然不是获取基因名称的正确方法。

4

1 回答 1

4

尽管大部分内容已在评论中说明,但我将其转变为答案。

主成分分析的成分是原始变量的线性组合。所以成分和基因之间没有一对一的映射关系。除特殊情况外,每个组成部分都描述了多个基因。其中一些具有积极的贡献,而一些具有消极的贡献。有些绝对值大,有些绝对值小。您可以从加载矩阵中看到这些贡献:输入loadings(res),您将看到每个组件的组成。

您可以在负载矩阵中的特定组件的列中找到具有最大绝对值的基因。这样,您就可以确定每个组件的“主要贡献者”之类的东西。但除非该贡献非常接近于 1,否则将该组件视为该基因的同义词充其量只会产生误导。如果您想根据单个基因进行分析,PCA 不是正确的工具。

如果你确定你想要“主要贡献者”尽管有上述警告,下面的代码可以做到这一点:

l <- loadings(res)
rownames(l)[apply(l, 2, function(x) which.max(abs(x)))]
于 2013-02-05T22:56:52.567 回答