2013-06-08 10 views
7

下記を参照 Rを使用して、(遺伝子発現データの)マトリックスをフィルタリングし、高い値を有する行(遺伝子/プローブ)のみを保持したい分散。たとえば、値の下限と上限パーセンタイル(たとえば、20%未満と80%未満)の行のみを保持したいとします。私は下流の分析のために高分散の遺伝子だけに研究を限定したいと思っています。 Rでの遺伝子フィルタリングの一般的な方法はありますか?R、分散カットオフに基づくフィルタマトリックス

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

例彼らは、20%と80%のカットオフ値の間の値が含まれているため、このようにして最後の3行が削除されるべきである5.97の平均と行列、:

> 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 

Iは、任意の提案を感謝し、又は機能します私は調べなければならない。 ありがとう!

EDIT

申し訳ありませんが、私はOPで非常に明確ではありませんでした。 (1)個々のサンプルだけでなく、マトリックス全体の20%と80%のカットオフ値を知りたい。 (2)次に、行に上限または下限パーセンタイルの値が含まれている場合、Rはこれらの行を保持します。行に平均値に近い値(すべてのサンプル)が含まれている場合、これらの行はスローされます。

+0

おかげ分位行方向の変動のいくつかの尺度var.func及び(単一)のために、何よりも厄介であることを示していません。私はあなたが達成することを望んでいたことを反映するために私の答えを更新しました。クイック質問 - 行列またはデータフレームを持っていますか(つまり、ID列は行列の名前またはデータフレームの最初の列ですか)。クラスを確認する簡単な方法は 'class(m)'です。 –

+0

これは行列(表現データのみ)であり、ID列は私の行列のrownamesです(私の例では "ID"という名前を残しておくべきです)。 – Todd

+0

よかった!それが私の例で考えたことです。 –

答えて

6

あなたが行列を持っていると仮定して(あなたのID列が実際にrownamesであると仮定しているので)、これは非常に簡単です。 (マトリクスの縁を横切って関数を適用するように設計されている)apply関数の

# 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])部分は、その行のTRUEもしあれば値はあなたの20%と80%分位数の外側にある返しサンプルマトリックス。定義上、これらの範囲外の値がない場合は、FALSEを返します。次の行にその行をドロップすることを示します。

+0

あなたの編集をありがとう!あなたのソリューションは非常に単純です。 – Todd

+1

@Todd素晴らしい!提示された3つの解決策のいずれかがあなたの問題を適切に解決した場合は、そのうちの1つを受け入れられた回答としてマークして、この質問に答えられないように見えるようにすることができます。 SOの仕組みについてさらに詳しい情報が必要な場合は、[** about **](http://stackoverflow.com/about)ページをご覧ください。乾杯! –

+0

この解決策は、私が自分の仕事で尋ねてきたこととまったく同じです!しかし、私はまた、Bioconductor genefilterパッケージを探求しています。私のRとstackoverflowに関する限られた知識で、皆様のご支援と忍耐をいただき、ありがとうございます。 – Todd

1

私は統計者ではないので、これを解決する一般的な方法があるかどうかはわかりません。長いフォーマットでデータを作り直すと、私にとって問題はより簡単になります。クォン

  • が条件を満たしていない遺伝子を削除使用して

    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 
      

      次に、各変数のためにあなたは、次の操作を行います。

    2. あなたが plyrから ddplyを使用して、例えばこれを行うことができ

    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 
    

    EDIT OPの明確化の後に、あなたが全体のマトリックスのためだけではなく、20%と80%のカットオフ値をしたい場合個々のサンプルが、あなたは、あなたがこのように、対応する行をコメントddply

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

    外QQを計算:

    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は次のとおりです。

    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) 
    
  • +0

    +1私たちは両方ともOPを誤解しているかもしれないと思う。私は彼らが行列全体の20%と80%のカットオフを計算し、これらの値をサブセット化したいと考えています。 –

    +1

    はい、「マトリックス全体でこれらの値を見つける方法を理解できません」*「最後の3つの行は20%と80%の間の値を含むため削除する必要があります」*私の元々の仮定を疑わせるものです。おそらくOPが明確になるでしょうか? –

    +0

    申し訳ありませんが、私はOPで非常に明確ではありませんでした。 (1)個々のサンプルだけでなく、マトリックス全体の20%と80%のカットオフ値を知りたい。次に、行に上限または下限パーセンタイルの値が含まれている場合、Rはこれらの行を保持します。行に平均値に近い値(すべてのサンプル)が含まれている場合、これらの行はスローされます。それは役に立ちますか?あなたの提案に感謝します。私はRでかなり新しいです。 – Todd

    3

    Biocondcutorgenefilterパッケージには、マイクロアレイ解析に関連する共通のフィルタを提供します。行方向の変動に基づいて、典型的なフィルタは、基本的な動作を説明すると、フィルタリングの使用のための診断指針を提供ビネット

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

    パッケージランディングページ参照あろう。

    マイクロアレイの分析における基本的な原則は、行内の値は同等であるが、行間の値ではないことである。これは、各行に付随するプローブが、行特異的バイアスを導入する特徴を有するためである。第1の行の値は、第2の行の同じ試料の値と比較して、より多い、少ない、つまり、行間比較(マトリックス全体で最大値と最小値)に基づいて正規化する@Toddの希望は推奨されません。代わりに、varFilterは、各行(行四分位範囲の範囲)のばらつきの尺度を計算し、ほとんどの変動性を持つ小数部分(var.cutoff引数)を選択します。

    varFilterの定義に迅速ピークは、一般的に、これは明確化のためvar.cutoff

    vars <- apply(m, 1, var.func) 
    m[vars > quantile(vars, var.cutoff), ] 
    
    +0

    +1!いい感じ。私は次のようにしました: 'mm < - as.matrix(dat [、-1]); rownames(mm)< - dat [、1]; rr < - varFilter(mm、var.cutoff = c(0.2,0.8) ) '、しかし私は警告を得る、私は何かが恋しい? – agstudy

    +0

    チップをありがとう - これを行う標準的な方法があるかもしれないので、私はこれを直ちに見るでしょう。 – Todd

    +0

    遺伝子アレイフィルタリングの「ベストプラクティス」についてのご説明はありがとう@Martin。データセットにあなたのソリューションを使用する予定です。 – Todd

    関連する問題