R,基于方差截止的滤波器矩阵

Tod*_*odd 10 r subset variance quantile

请参阅下面的编辑 使用R,我想过滤矩阵(基因表达数据)并仅保留具有高方差值的行(基因/探针).例如,我只想保留具有底部和顶部百分位数值的行(例如,低于20%且高于80%).我想将我的研究仅限于下游分析的高变异基因.R中有基因过滤的常用方法吗?

我的矩阵有18个样本(列)和47000个探针(行),其值为log2变换和标准化.我知道该quantile()功能可以识别每个样品列中的20%和80%截止值.我无法弄清楚如何为整个矩阵找到这些值,然后将原始矩阵子集化以删除所有"非变化"行.

示例矩阵的平均值为5.97,因此最后三行应该被删除,因为它们包含20%和80%截止值之间的值:

> m

                sample1 sample2 sample3 sample4 sample5 sample6
ILMN_1762337    7.86    5.05    4.89    5.74    6.78    6.41
ILMN_2055271    5.72    4.29    4.64    5.00    6.30    8.02
ILMN_1736007    3.82    6.48    6.06    7.13    8.20    4.06
ILMN_2383229    6.34    4.34    6.12    6.83    4.82    5.57
ILMN_1806310    6.15    6.37    5.54    5.22    4.59    6.28
ILMN_1653355    7.01    4.73    6.62    6.27    4.77    6.12
ILMN_1705025    6.09    6.68    6.80    6.85    8.35    4.15
ILMN_1814316    5.77    5.17    5.94    6.51    7.12    7.20
ILMN_1814317    5.97    5.97    5.97    5.97    5.97    5.97
ILMN_1814318    5.97    5.97    5.97    5.97    5.97    5.97
ILMN_1814319    5.97    5.97    5.97    5.97    5.97    5.97
Run Code Online (Sandbox Code Playgroud)

我很感激我应该研究的任何建议或功能.谢谢!

编辑

对不起,我在OP中不太清楚.(1)我想知道整个矩阵的20%和80%截止值(不仅仅是每个样本).(2)然后,如果任何行包含上百分位数或下百分位数的值,则R将保留这些行.如果一行包含接近均值的值(对于所有样本),则抛出这些行.

Sim*_*lon 9

好吧,假设你有一个矩阵(所以我假设你的ID列实际上是rownames)那么这很简单.

#  First find the desired quantile breaks for the entire matrix
qt <- quantile( m , probs = c(0.2,0.8) )
# 20%  80% 
#5.17 6.62 
#  Next get a logical vector of the rows that have any values outside these breaks
rows <- apply( m , 1 , function(x) any( x < qt[1] | x > qt[2] ) )
#  Subset on this vector
m[ rows , ]
#            sample1 sample2 sample3 sample4 sample5 sample6
#ILMN_1762337    7.86    5.05    4.89    5.74    6.78    6.41
#ILMN_2055271    5.72    4.29    4.64    5.00    6.30    8.02
#ILMN_1736007    3.82    6.48    6.06    7.13    8.20    4.06
#ILMN_2383229    6.34    4.34    6.12    6.83    4.82    5.57
#ILMN_1806310    6.15    6.37    5.54    5.22    4.59    6.28
#ILMN_1653355    7.01    4.73    6.62    6.27    4.77    6.12
#ILMN_1705025    6.09    6.68    6.80    6.85    8.35    4.15
#ILMN_1814316    5.77    5.17    5.94    6.51    7.12    7.20
Run Code Online (Sandbox Code Playgroud)

any( x < qt[1] | x > qt[2] )所述的部分apply功能(其被设计成跨矩阵的边缘应用一个函数)返回TRUE如果任何该行中值是您的样品基体的20%和80%分位数之外.根据定义,如果没有值超出这些边界,则返回FALSE指示我们将在下一行中删除该行.


Mar*_*gan 5

Biocondcutor genefilter包提供相关的微阵列分析常用的过滤器。基于行可变性的典型过滤器为

m = matrix(rnorm(47000 * 6), 47000)
varFilter(m)
Run Code Online (Sandbox Code Playgroud)

程序包的着陆页参考插图说明了基本操作并提供了使用过滤的诊断指导。

分析微阵列的基本原理是,一行中的值是可比较的,但行之间的值不可比较。这是因为与每一行关联的探针具有不同的特征,这些特征会引入特定于行的偏差-与第二行中相同样本的值相比,第一行中的值可以合理地指示更多,更少或相等的基因表达。这意味着不建议@Todd基于行间比较(整个矩阵中的最大值和最小值)进行归一化的愿望。取而代之的是,varFilter计算每行(四分位数间距行)的可变性的度量,并选择可变性最大的分数(var.cutoff参数)。

快速定义的峰值varFilter表明,对于行可变性var.func和(单个)分位数的某种度量,一般而言,这并不棘手。var.cutoff

vars <- apply(m, 1, var.func)
m[vars > quantile(vars, var.cutoff), ]
Run Code Online (Sandbox Code Playgroud)