请参见下面的编辑
使用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
我将不胜感激任何建议或功能。
谢谢!
编辑
抱歉,在OP中我不太清楚。 (1)我想知道整个矩阵的20%和80%截止值(而不仅仅是每个单独的样本)。 (2)然后,如果有任何行在较高或较低的百分位数中包含值,则R将保留这些行。如果一行包含(所有样本)接近平均值的值,则这些行将被丢弃。
最佳答案
好的,假设您有一个矩阵(因此,我假设您的ID列实际上是行名),那么此操作非常简单。
# 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
如果该行中的任何值在样本矩阵的20%和80%分位数之外,则
any( x < qt[1] | x > qt[2] )
函数的apply
部分(旨在在矩阵的边界上应用函数)将返回TRUE
。根据定义,如果没有值在这些范围之内,它将返回FALSE
,指示我们将在下一行中删除该行。
关于R,基于方差截止的滤波器矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17003928/