我经常使用 PCA(具有数十万个变量和数十或数百个样本的组学数据)来诊断我的多变量数据。数据通常来自具有定义某些组的几个分类自变量的实验,并且我经常必须通过一些组件才能找到显示感兴趣组之间分离的组件。我想出了一种相当原始的方法来找到这种区分组件,我想知道
- 这在多大程度上是合理/合理的,以及
- 是否有更好的方法来实现相同的目标。
请注意,这是探索性的。在说服别人之前,我想说服自己。如果我看到有一些组件可以清楚地区分感兴趣的组(例如控制组与治疗组),即使它们对响应的一小部分方差负责,我相信它比监督机器的结果更重要学习。
这是我的方法。我将使用 R 中 pca3d 的“metabo”示例数据集。
这个想法是评估每个组件的方差可以由自变量解释多少。为此,我为每个组件计算了一个简单模型,并使用作为度量,将组件从“最有趣”排序到“最不有趣”。
require( pca3d )
# data on metabolic profiles of TB patients and controls
data( metabo )
# first column is the independent variable
pca <- prcomp( metabo[,-1], scale.= T )
# create a model for each component
lm.m <- lm( pca$x ~ metabo[,1] )
lm.s <- summary( lm.m )
lm.r2 <- sapply( lm.s, function( x ) x$r.squared )
plot( lm.r2, type= "l" )
text( 1:length( lm.r2 ), lm.r2, 1:length( lm.r2 ), pos= 3 )
这是结果。该图显示了由 中的自变量解释的每个分量的方差百分比metabo[,1]
。
我们可以通过对组件进行排序,以找出要显示的组件; 前三个组件是 2、1 和 7。order( lm.r2, decreasing= TRUE )
pca3d( pca, components= c( 1, 2, 7 ), group= metabo[,1] )
这是情节:
(红色和绿色类别是两组非患者的受试者,预计无法区分。)
重新提出我的问题,
- 这种方法对您有意义吗?我的问题是它看起来太像数据挖掘了。另外,直觉上我认为也许我应该转过头来问每个变量解释了自变量中方差的哪一部分?最后,我(几乎)确定我正在重新发明轮子,很糟糕,所以我的第二个问题是
- 有更好的吗?
请注意,在这个阶段我不想切换到偏最小二乘法或类似的东西;我只想根据我的分类来诊断 PCA。