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

标签 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

我将不胜感激任何建议或功能。
谢谢!

编辑

抱歉,在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/

相关文章:

r - 如何在 R 中进行部分替换?

r - dplyr 中是否有 "unfilter"用于将更改与原始数据集合并?

module - 可以在 Raku 中导出子集吗?

r - 排除没有方差的列

r - travis 构建失败,因为缺少 devtools

r - 从数据框中提取一系列观察结果以获得完整的数据集

r - 多个范围的子集

r - 用固定的 r2 模拟逻辑回归的数据

r - 如何在不手工计算标准误差的情况下打印R中lm的方差?

r - 如何使用来自 csv 文件的实际观测值正确注释堆栈条形图?