我经常使用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。
to find out what share of the overall variance in the data matrix is explained by a given classification
如果只想知道这一点,则不需要PCA。只需计算组间平方和与总平方和的比例即可:(SStotal-SSwithin)/SStotal
其中SSwithin是池内组平方和。
Is there anything better?
。