10

以下の編集を参照してください 。R を使用して、(遺伝子発現データの) マトリックスをフィルター処理し、分散の高い値を持つ行 (遺伝子/プローブ) のみを保持したいと思います。たとえば、下位パーセンタイルと上位パーセンタイル (たとえば、20% 未満で 80% を超える) の値を持つ行のみを保持したいと思います。ダウンストリーム分析のために、分散の大きい遺伝子のみに研究を限定したいと考えています。Rでの遺伝子フィルタリングの一般的な方法はありますか?

私のマトリックスには、18 個のサンプル (列) と 47000 個のプローブ (行) があり、値は log2 変換され、正規化されています。quantile()関数が各サンプル列内の 20% と 80% のカットオフを識別できることはわかっています。マトリックス全体でこれらの値を見つけてから、元のマトリックスをサブセット化してすべての「変化しない」行を削除する方法がわかりません。

平均が 5.97 の行列の例。最後の 3 行は、カットオフ 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 はこれらの行を保持します。行に (すべてのサンプルの) 平均値に近い値が含まれている場合、これらの行は除外されます。

4

3 に答える 3

9

わかりました、マトリックスがあると仮定すると (したがって、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

関数のany( x < qt[1] | x > qt[2] )一部apply(行列のマージン全体に関数を適用するように設計されています) は、その行のいずれかの値が標本行列の 20% および 80% の分位数の外側にあるTRUE場合に返されます。定義により、これらの境界外に値がない場合、次の行でその行を削除することを示します。FALSE

于 2013-06-08T21:49:39.723 に答える
5

Biocondcutor 遺伝子フィルター パッケージは、マイクロ アレイ解析に関連する一般的なフィルターを提供します。行ごとの可変性に基づく典型的なフィルターは次のようになります。

m = matrix(rnorm(47000 * 6), 47000)
varFilter(m)

パッケージのランディング ページでは、基本的な操作を説明し、フィルタリングを使用するための診断ガイダンスを提供するビネットを参照しています。

マイクロ アレイの分析の基本原則は、行内の値は比較できますが、行間の値は比較できないということです。これは、各行に関連付けられたプローブが、行固有のバイアスを導入する明確な特性を持っているためです。最初の行の値は、2 番目の行の同じサンプルの値と比較して、遺伝子発現が多い、少ない、または等しいことを合理的に示す可能性があります。これは、@Todd が行間比較 (マトリックス全体の最大値と最小値) に基づいて正規化することは推奨されないことを意味します。代わりに、varFilter は各行の変動性の尺度 (行の四分位範囲) を計算し、変動性が最も高い割合 (var.cutoff 引数) を選択します。

の定義でのクイック ピークはvarFilter、一般に、行ごとの変動性var.funcと (単一の) 分位数の尺度については、これはそれほどトリッキーではないことを示しています。var.cutoff

vars <- apply(m, 1, var.func)
m[vars > quantile(vars, var.cutoff), ]
于 2013-06-08T22:15:53.323 に答える
1

私は統計学者ではないので、これを解決する一般的な方法があるかどうかはわかりません。私にとって、データを長い形式で再形成すると、問題はより簡単になります。

library(reshape2)
dat.m <- melt(dat)
dat.m$value <- as.numeric(dat.m$value)
head(dat.m)
            ID variable value
1 ILMN_1762337  sample1  7.86
2 ILMN_2055271  sample1  5.72
3 ILMN_1736007  sample1  3.82
4 ILMN_2383229  sample1  6.34
5 ILMN_1806310  sample1  6.15
6 ILMN_1653355  sample1  7.01

次に、変数ごとに次の操作を行います。

  1. 分位数を使用して制限を計算する
  2. 条件を満たさない遺伝子を削除します。

たとえば、 ddplyfromを使用してこれを行うことができplyrます。

res <- ddply(dat.m,.(variable),function(x){
  ## compute limits for each sample
  z <- x$value
  qq <- quantile(z, probs = c(0.2,0.8))
  ## keep only genes with high or low variance
  dd <- x[z < qq[1] | z > qq[2],]
})
## return to the wide format
acast(res,ID~variable)

            sample1 sample2 sample3 sample4 sample5 sample6
ILMN_1653355    7.01      NA    6.62      NA    4.77      NA
ILMN_1705025      NA    6.68    6.80    6.85    8.35    4.15
ILMN_1736007    3.82    6.48      NA    7.13    8.20    4.06
ILMN_1762337    7.86      NA    4.89      NA      NA      NA
ILMN_1806310      NA      NA      NA    5.22    4.59      NA
ILMN_1814316      NA      NA      NA      NA      NA    7.20
ILMN_2055271    5.72    4.29    4.64    5.00      NA    8.02
ILMN_2383229      NA    4.34      NA      NA      NA      NA

OP の明確化後に編集します。個々のサンプルだけでなく、マトリックス全体の 20% と 80% のカットオフ値が必要な場合は、外で qq を計算しますddply

   qq <- quantile(dat.m$value, probs = c(0.2,0.8))

次に、次のように対応する行にコメントを付けます。

res <- ddply(dat.m,.(variable),function(x){
  z <- x$value
  ## keep only genes with high or low variance
  dd <- x[z < qq[1] | z > qq[2],]
})

PS ここでのデータは次のとおりです。

dat <- read.table(text='         ID    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',header=TRUE)
于 2013-06-08T22:01:48.023 に答える