我的数据框有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)
会在输出图上打印一些基因,但这显然不是获得基因名称的正确方法。
答案 0 :(得分:4)
虽然大部分内容已在评论中说明,但我将其转化为答案。
主要成分分析的组成部分是原始变量的线性组合。因此,组件和基因之间没有一对一的映射。除特殊情况外,每个组件都描述了多个基因。其中一些有积极的,一些有负面贡献。有些是大的,有些是绝对值小的。您可以从加载矩阵中看到这些贡献:输入loadings(res)
,您将看到每个组件的组成。
您可以在加载矩阵中的特定组件的列中找到具有最大绝对值的基因。这样你就可以识别出每个组件的“主要贡献者”。但除非该贡献非常接近1,否则将该组分视为该基因的同义词最多会产生误导。如果您想根据个体基因进行分析,PCA不是正确的工具。
如果你确定你想要“主要贡献者”,尽管有上述警告,下面的代码就是这样做的:
l <- loadings(res)
rownames(l)[apply(l, 2, function(x) which.max(abs(x)))]