(Rで)塩基配列解析 ~NGS、RNA-seq、ゲノム、トランスクリプトーム、正規化、発現変動、統計、モデル、バイオインフォマティクス~
  (last modified 2014/05/09, since 2010)

What's new?

はじめに

このページは、次世代シーケンサー(Next-Generation Sequencer; NGS)などから得られた短い塩基配列(short read)データ解析をRで行うための一連の手続きをまとめているものであり、 特にアグリバイオインフォマティクス教育研究プログラムの被養成者がわかる程度のレベルで作成した(しつつある)ものです。

Maintainerは門田幸二(東京大学大学院農学生命科学研究科)が永らく一人でやっていましたが、 2013年7月のリニューアル以降は私の出身研究室(東京大学・大学院農学生命科学研究科・応用生命工学専攻・生物情報工学研究室: 清水謙多郎教授)大学院生の孫建強氏が W3C validation、美しいコーディング、TCCパッケージ開発および有用関数のTCCへの追加など重要な役割を担っています。

また、私がこの仕事にこれだけの時間を費やせるのは、ボスである清水謙多郎教授の全面的なサポートのおかげです。

アグリバイオの分野は、ヒトやマウスといったゲノム配列既知のモデル生物ではなくアノテーション情報が乏しい非モデル生物を主に取り扱います。 例えば、主に次世代シーケンサー(NGS)から得られるRNA-seqデータを用いて、「de novo (genome or transcriptome) assemblyを行い、発現変動領域を同定する」 といった解析が第一段階として行われます。アセンブル周辺は未だにLinux上でのみ動作するプログラムを利用するしかありませんが、 2013年頃から本格的にWindows OS上でマッピングやカウントデータ取得が行えるようになり、(マイクロアレイ解析を行うためにRに慣れたWindowsユーザの)実験系研究者にとっての敷居が低くなってきました。 もともと私は「徹底的にR」派ではありませんでしたが、50-100人規模のハンズオン(PCを用いて生物系の学生が手を動かす)講義を講義として成立させうるのは経験上、 「Rでコピペ」を基本とする以外はあり得ません。Linux(やWindowsのコマンドプロンプト系)の場合、基本コマンドの部分で多くの学生がつまづきます。 「スペース」、「特殊文字」、「コマンドの打ち間違い」、「ファイルが存在しない」など、講義を中断せざるを得ない様々な局面に遭遇し、 学生の側も手を動かしてついていくだけで精一杯で「作業」に忙殺される傾向にあります。結果として、「本質的な全体像の理解」もままならずストレス、という愚痴や感想に至りがちです。 このページの記述形式(必要な部分のみ変更してコピペ)は、私が心穏やかにハンズオン講義を行うためのほぼ最終形です。しかし、私にとってのメリットだけでなく 「今手元にあるデータを心穏やかに最小限の労力で解析したい人」にとっても有意義なページであろうと思っています。

ここでは、アグリバイオインフォマティクス教育研究プログラム の教育研究用資料として、また、一部新学術領域研究「複合適応形質進化の遺伝子基盤解明」 の研究を遂行する上で私が用いたテクニックや知識を項目別にまとめてあります。本当に正しいやり方かどうかなど一切の保証はできませんので予めご承知おきください。 このページの中身自体は、所属機関とは一切関係ない一個人の備忘録のようなものです。リンクは自由にしていただいて構いませんし、講義資料として使うのもご自由になさってください、 前もっての連絡なども一切必要ありません。個別の項目へのリンクはときどき切れると思いますがご容赦ください。必要に応じて随時変更していますので...。 間違いや修正点、また「このような解析をやりたいがどうすればいいか?」などのリクエストがあればメール()をいただければ... (実際問題として相当様々なことにトラップされてますので対応は難しいですが...)前向きに検討させていただきます。 もちろん、アグリバイオインフォマティクス教育研究プログラム被養成者からのリクエストは優先的に対応します。

なお、よく(例えばDドライブの)外付けHDに大きなサイズのファイル(4GB以上)を保存できない、ということがあったりしますが、その対処法はおまじない的にコマンドプロンプト上で「convert D: /fs:ntfs」とやっておくことです。

このページ内で用いる色についての説明:

コメント
特にやらなくてもいいコマンド
プログラム実行時に目的に応じて変更すべき箇所

...

  • rm(list = ls())
  • 「"...\Rgui.exe" LANGUAGE=en」で英語環境にできる
  • 2013年7月以降のリニューアルで、コードのコピーがやりずらくなっています。「CTRL」キーと「ALT」キーを押しながらコードの枠内で左クリックすると、全選択できます。

参考資料(講義、講習会、本など)

基本的に私門田の個人ページに記載してあるものです。 かなり古い講演資料などの情報をもとに勉強されている方もいらっしゃるようですので、 ここでは2013年夏以降の情報を載せておくとともに、大まかな内容についても述べておきます。講演予定のものについては、資料のアップは講演当日が基本です。 50-100MB程度ありますがオリジナルのPowerPointファイルがほしい方はお気軽にリクエストしてください。 講義資料としての利用などは事前連絡や謝辞も気にせず、改変なども本当にご自由にお使いください。

書籍

  • 門田幸二著(金明哲 編), シリーズ Useful R 第7巻 トランスクリプトーム解析, 共立出版, 2014. ISBN: 978-4-320-12370-0
  • 内容:マイクロアレイとRNA-seq解析を例としてRを用いてトランスクリプトーム解析を行うための体系的な本としてまとめました。 数式が苦手なヒト向けに、重みつき平均の具体的な計算例などを挙げてオプションの意味などがわかるような中身の理解に重点を置いた構成にしてあります。 書籍中のRコードは「書籍 | トランスクリプトーム解析 | ...」をご覧ください。

  • 門田幸二,「トランスクリプトミクスの推奨データ解析ガイドライン」, ニュートリゲノミクスを基盤としたバイオマーカーの開発, シーエムシー出版, 45-52, 2013. ISBN: 978-4-7813-0820-3
  • 内容:マイクロアレイ解析の話がメインです。実験デザインの重要性を述べています。 Affymetrix GeneChipデータの数値化と発現変動遺伝子(DEG)検出法の組合せの重要性の話や、サンプル間クラスタリングである程度DEGに関する情報がわかることを述べています。 MAS5データを用いる場合は特に倍率変化で議論することも無意味であること、RMAのようなマルチアレイ正規化法を用いて得られたマイクロアレイデータの場合には なぜ倍率変化でうまくいく傾向にあるかなどの理由をM-A plotを用いて説明しています。

講習会、講義、講演資料

  • 門田幸二,「講義資料」, アグリバイオインフォマティクス教育研究プログラムの大学院講義科目:ゲノム情報解析基礎, 東京大学(東京), 2014.04.30
  • 内容:Rで塩基配列解析を行うための基本的なところ。例題としてシロイヌナズナゲノムのCpG出現頻度を解析し考察。 Rパッケージのインストール、エラーメッセージへの対処法、利用可能な関数の概観。 sequence logosを主な講義内容とし、エントロピー計算や、なぜエントロピーをそのまま利用せずに情報量に変換するかの意義。 subseq関数のオプションをうまく利用して効率的に目的のプロモーター配列領域を切り出して計算するやり方など。 課題4はプログラムの一部を任意に変更する基礎的な能力を問うもの。他の例題の中に回答が存在するので、それを効率的に見つける能力を見ている。 講義自体はスライド39までで、スライド40以降はうまくいかないこともあるという事例やRのバージョンの違いに気をつけろ的な話。「農学生命情報科学特論I」で改めて話す予定。 1コマ(90 min)分。

  • 門田幸二,「講義資料」, アグリバイオインフォマティクス教育研究プログラムの大学院講義科目:ゲノム情報解析基礎, 東京大学(東京), 2014.04.23
  • 内容:Rで塩基配列解析を行うための基本的なところ。初心者が犯しがちなミス、プログラムの中身の説明、アノテーションファイルやmulti-FASTAファイルからの情報抽出、 意図的にエラーを出させてエラーへの対処能力向上、GC含量計算やそのプログラム内部の説明、ヒトゲノムのCpG出現頻度を解析するための連続塩基出現頻度解析、BSgenomeパッケージとか。 課題は、自分が解析したい入力ファイルの全体像を把握し、適切な列およびキーワードで効率よく情報収集するための練習問題レベルのものにしている。 Rがいかに簡単であるかをわかってもらうことに重点を置いている。ただし、ヘッダー行でひっかけを作っており、 目で見て明らかに回答がわかっている状況下でそれを正しく判断し適切なテンプレートプログラムを利用できるかを問うている。 また、課題2では、ゲノム配列にもバージョンがあるということを認識してもらう。 2コマ(90×2 min)分。

  • 門田幸二,「ウェブページ講義資料」, アグリバイオインフォマティクス教育研究プログラムの大学院講義科目:ゲノム情報解析基礎, 東京大学(東京), 2014.04.09
  • 内容:初心者向けバイオインフォマティクス全般およびゲノム情報解析系のイントロダクションの話。Rのイントロダクションやこのウェブページの簡単な使い方を含む。1コマ(90 min)分。

  • 門田幸二,「比較トランスクリプトーム解析とその周辺:モデル、正規化、発現変動検出など」, よく分かる次世代シークエンサー解析 ワークショップ, 九州大学(福岡), 2014.03.19
  • 内容:初心者向けRNA-seqの話。主にカウントデータ取得以降の話。シリーズ最終日の統計部分担当ということで、 「パイプライン | ゲノム | 発現変動 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013)」の実データ解析をメインにしつつ、 実際のDEG同定結果の発現データとM-A plot上の位置の対応関係を徹底的に示して、解析結果の正しい解釈や理解を導くような構成にしている。 多重比較とFDRの話も実データ解析結果と対応づけている。 FDR閾値を変化させたときのM-A plot上での見栄えの違いのイメージを示しつつ、2倍以上発現変動などの倍率変化で解析を行うことが危険だということが感覚的にわかるように、 同一グループ内の複製実験データのM-A plotを示している。統計的手法の感覚についても。「データの正規化は何のためか?」という初歩的な疑問に対する回答もこの中で述べている。 TCCを用いた発現変動解析の利用法を例として、このウェブページのオプションの意味についてのかなり詳細かつ丁寧な説明を含む。平均-分散プロットは時間の関係上省略している。

  • 門田幸二,「Rでゲノム・トランスクリプトーム解析」, HPCI チュートリアル・バイオインフォマティクス実習コース, 生命情報工学研究センター(東京), 2014.03.07
  • 内容:主にNGS解析の話。Rでmulti-FASTAファイルを自在に解析するやり方として、ヒトゲノム中のCpG出現確率が低いことを確かめる解析などを示しています。 主要な生物種のゲノムはRパッケージとして提供されていること。トランスクリプトーム発現解析時の注意点として、サンプル内比較とサンプル間比較の違いを述べています。 RPKMなどの話は少しだけで、基本的に比較トランスクリプトーム解析系の話。QuasRパッケージを用いたマッピング実習。 内部的に用いるbowtieのマッピングオプションを変えて挙動確認。カウントデータとは?サンプル間クラスタリング時の低発現遺伝子または転写物のフィルタリングの重要性およびその実演。 M-A plotの解釈やTCCパッケージのゼロカウント対策。理想的な実験デザイン。M-A plotでのtechnical replicatesとbiological replicatesデータの見栄えの違い。 分布やモデルというのは、同一グループに属する複製実験データの分布のこと。その分布を眺めれば2倍以上発現変動したものをDEGと判定することの危険性がわかる。 ばらつきを見積もるより直接的な指標は、log比に相当するM-A plotのM値ではなく分散。それゆえ平均-分散プロットがよく利用される。 TCCを用いたDEG同定結果と平均-分散プロット上でのDEGの位置づけ。多重比較問題とFDR。

  • 門田幸二,「トランスクリプトーム解析の現況2013(詳細版)」, 東京大学大学院農学生命科学研究科第123回アグリバイオインフォマティクスセミナー, 東京大学(東京), 2013.11.01
  • 内容:アレイ正規化の最近の話、重みつき平均の話。「パイプライン | ゲノム | 発現変動 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013)」の話。 SonesonらのRNA-seq手法比較論文中でいいと結論づけられたSAMseq法よりもTCCのほうが精度が高い実例。 「パイプライン | ゲノム | small RNA | SRP016842(Nie_2013)」の話で、カイコsmall RNAデータの解析実演。アダプター配列除去やカイコゲノムへのマッピングなど。

  • 門田幸二,「トランスクリプトーム解析の現況:マイクロアレイ vs. RNA-seq」, 生命医薬情報学連合大会 「オミックス・計算 そして創薬」オミックス解析における実務者意見交換会, タワーホール船堀(東京), 2013.10.30
  • 内容:主にマイクロアレイの話。RNA-seqのほうがマイクロアレイよりもダイナミックレンジが広いといっているが、 アレイのほうもラングミュアの吸脱着モデル、非特異的結合、4G signatureなどの理解が進んでその対策などもとられています、という話。 RMAのmulti-arrayベースの方法の問題点として、サンプル数の増減による影響を受けることや、3'発現解析用アレイ以降もトランスクリプトームアレイが出現していますよ、という話。

過去のお知らせ

  • 機能解析の遺伝子オントロジー(GO)解析とパスウェイ(Pathway)解析周辺を更新し、SeqGSEAパッケージを用いた解析のみですが一通りできるようにしました。(2014/03/30)
  • 私の所属するアグリバイオインフォマティクス教育研究プログラムでは、平成26年度も(東大生に限らず)バイオインフォ関連講義を行います。 4/9に私の第一回目の講義がありましたが、過去最高の123名の出席がありました。例年東大以外の企業の方、研究員、学生が二割程度は受講しております。 このウェブページと直接関連する講義は「ゲノム情報解析基礎」と 「農学生命情報科学特論I」ですが、背景理論の説明などは「機能ゲノム学」でも行います。 興味ある科目のみの受講も可能ですので、お気軽にどうぞ。(2014/04/10)
  • 一連の解析パイプライン(RNA-seqデータ取得 -> マッピング -> カウントデータやRPKMデータ取得 -> サンプル間クラスタリングや発現変動解析およびM-A plot描画まで)のクラスタリング部分をアップデートしました。項目名の一番下のほうです。(2014/02/26)
  • 2014年3月17-19日に九州大学にて、ワークショップ(よく分かる次世代シークエンサー解析 ~最先端トランスクリプトーム解析~)が開催されます。 私は3日目(3/19, 13:00-16:30)を担当します。興味ある方はどうぞ。締切は確か2/21です。(2014/02/17)
  • 項目名の整理を行っています。3C (Hi-C)やBS-seq周辺についても少し言及してあります。(2014/02/08)
  • 発現変動解析用RパッケージTCC (ver. 1.2.0; Sun et al., BMC Bioinformatics, 2013)がBioconductorよりリリースされました。 最新版を利用したい方は、R (ver. 3.0.2)をインストールしたのち、Bioconductor (ver. 2.13)をインストールしてください。(2013/10/17)
  • どのブラウザからでもエラーなく見られる(W3C validation)ように((Rで)マイクロアレイデータ解析も含めて)リニューアルしました。(2013/07/30)
  • 2013年7月29日まで公開していた以前の「(Rで)塩基配列解析」のウェブページや関連ファイルはRdeennki.zipからダウンロード可能です(110MB程度)。(2013/07/30)
  • 平成26年3月7日に東京お台場にて、HPCIチュートリアルの一部としてRでゲノム・トランスクリプトーム解析を行います。情報はかなりアップデート予定ですが、既にキャンセル待ちなようですいませんm(_ _)m(2013/11/25)
  • 2013年6月6日に開催されたNAIST植物グローバル教育プロジェクト・平成25年度ワークショップ のときに利用した、R(ver. 3.0.1)とTCC(ver. 1.1.99)などのインストール方法はこちら(Windows用のみ;hoge.zipはおまけ)です。
  • 平成25年6月27日、7月3, 4日にこのウェブページ関連の実習を含む講義(農学生命情報科学特論I)を行います。 東大生以外の外部の方も受講可能です。詳しくは事務局までお問い合わせください。(2013/06/08)
  • 廃止予定の関数名(read.DNAStringSet -> readDNAStringSetなど)や「前処理 | 正規化...」周辺の項目名の変更をしました。(2013/01/16)
  • htmlのタグに問題があるらしくfirefoxでエラーという指摘をTbT論文共著者の西山さんから受けましたのでその周辺を修正しました。(2012/11/15)
  • R2.15.2がリリースされていたのでこれに変更しました。(2012/11/15)
  • 若干項目名を(あまりにも場違いだったものを)変更しました、直接リンクを張ってたかた、すいませんm(_ _)m。(2012/07/12)

Rのインストールと起動

基本的にはこちらまたはこちらをご覧ください。

よく分からない人でWindowsユーザーの方は以下を参考にしてください。2014年4月22日に作成したより詳細なインストール手順のPDFはこちら

1. Windows release版のインストールの場合:

  1. Rのインストーラを「実行」
  2. 聞かれるがままに「次へ」などを押してとにかくインストールを完了させる
  3. Windows Vistaの人は(パッケージのインストール中に書き込み権限に関するエラーが出るのを避けるために)「コントロールパネル」−「ユーザーアカウント」−「ユーザーアカウント制御の有効化または無効化」で、「ユーザーアカウント制御(UAC)を使ってコンピュータの保護に役立たせる」のチェックをあらかじめ外しておくことを強くお勧めします。
  4. インストールが無事完了したら、デスクトップに出現する「R3.X.Y (32 bitの場合; XY中の数値はバージョンによって異なります)」または「R x64 3.X.Y (64 bitの場合)」アイコンをダブルクリックして起動
  5. 以下を、「R コンソール画面上」でコピー&ペーストする。10GB程度のディスク容量を要しますが一番お手軽です。(どこからダウンロードするか?と聞かれるので、その場合は自分のいる場所から近いサイトを指定)
    install.packages(available.packages()[,1], dependencies=TRUE)#CRAN中にある全てのパッケージをインストール
    source("http://www.bioconductor.org/biocLite.R")#おまじない
    biocLite(all_group())                  #Bioconductor中にある全てのパッケージをインストール
    biocLite("BSgenome.Athaliana.TAIR.TAIR9")#Bioconductor中にあるBSgenome.Athaliana.TAIR.TAIR9パッケージをインストール
    n
    		
  6. 「コントロールパネル」−「デスクトップのカスタマイズ」−「フォルダオプション」−「表示(タブ)」−「詳細設定」のところで、「登録されている拡張子は表示しない」のチェックを外してください。

2. Windows devel版(R-devel)のインストールの場合(advanced userのみ):

孫建強氏作のネットワークが不安定な場合でも一つずつ確実にインストールしていくやり方。現在お試し中。

  1. Rのインストーラを「実行」
  2. 聞かれるがままに「次へ」などを押してとにかくインストールを完了させる
  3. R-develを起動し、以下を、「R コンソール画面上」でコピー&ペーストする。
    #CRAN中にある全パッケージをインストール
    x <- c("UNINSTALLED_PKG_NAME")         #インストールされなかったパッケージ名をxに格納
    available <- available.packages()      #利用可能なパッケージ名をavailableに格納
    installed <- installed.packages()      #インストールされているパッケージ名をinstalledに格納
    for (i in available[,1]){              #availableの要素数分だけループを回す
      idx <- grep(paste("^", i, "$", sep=""), installed[, 1])#available中のパッケージ名iがinstalled中にあるかどうかを判定
      if(length(idx) > 0) {                #available中のパッケージ名がinstalled中にあるかどうかを判定(あればTRUE)
        if(installed[idx,3] == available[i,2]){#バージョンも同じかどうかを判定(同じならTRUE)
          next                             #nextは、次のパッケージ名へ、という意味
        }
      }
      e <- try(install.packages(i, dependencies=TRUE))#まだインストールされていないか、インストールされていても古いバージョンのパッケージをインストール
      if(class(e) == "try-error") x <- c(x, i)#インストールに失敗したパッケージ情報をxにどんどん追加
    }
    uninstalled_cran <- x                  #インストールに失敗したパッケージ情報をuninstalled_cranに格納
    
    #Bioconductor中にある全パッケージをインストール
    x <- c("UNINSTALLED_PKG_NAME")         #インストールされなかったパッケージ名をxに格納
    source("http://www.bioconductor.org/biocLite.R")#おまじない
    for (i in all_group()){                #all_group()でみられる要素数分だけループを回す
      e <- try(biocLite(i, suppressUpdates=TRUE))#パッケージiをインストール
      if(class(e) == "try-error") x <- c(x, i)#インストールに失敗したパッケージ情報をxにどんどん追加
    }
    uninstalled_bioc <- x                  #インストールに失敗したパッケージ情報をuninstalled_biocに格納
    		

サンプルデータ

  1. Marioni et al., Genome Res., 2008のSupplementary table 2のデータ。
    「Kidney 7 samples vs Liver 7 samples」のRNA-seqの遺伝子発現行列データ(SupplementaryTable2.txt)です。
    サンプルは二つの濃度(1.5 pM and 3 pM)でシーケンスされており、「3 pMのものが5 samples vs. 5 samples」、「1.5 pMのものが2 samples vs. 2 samples」という構成です。 SupplementaryTable2.txtをエクセルで開くと、7列目以降に発現データがあることがわかります。詳細な情報は以下の通りです(原著論文中のFigure 1からもわかります):
    7列目:R1L1Kidney (3 pM)
    8列目:R1L2Liver (3 pM)
    9列目:R1L3Kidney (3 pM)
    10列目:R1L4Liver (3 pM)
    11列目:R1L6Liver (3 pM)
    12列目:R1L7Kidney (3 pM)
    13列目:R1L8Liver (3 pM)
    14列目:R2L1Liver (1.5 pM)
    15列目:R2L2Kidney (3 pM)
    16列目:R2L3Liver (3 pM)
    17列目:R2L4Kidney (1.5 pM)
    18列目:R2L6Kidney (3 pM)
    19列目:R2L7Liver (1.5 pM)
    20列目:R2L8Kidney (1.5 pM)
    
  2. Marioni et al., Genome Res., 2008のSupplementary table 2のデータを取り扱いやすく加工したデータ
    オリジナルのものは最初の6列が発現データ以外のものだったり、7列目以降も二種類のサンプルが交互に出てくるなど若干R上で表現しずらかったため、以下のようにわかりやすくしたものです。
    つまり、サンプルを3pMのものだけにして、「1列目:Genename, 2-6列目:Kidney群, 7-11列目:Liver群」と変更したSupplementaryTable2_changed.txtです:
    2列目:R1L1Kidney (3 pM)
    3列目:R1L3Kidney (3 pM)
    4列目:R1L7Kidney (3 pM)
    5列目:R2L2Kidney (3 pM)
    6列目:R2L6Kidney (3 pM)
    7列目:R1L2Liver (3 pM)
    8列目:R1L4Liver (3 pM)
    9列目:R1L6Liver (3 pM)
    10列目:R1L8Liver (3 pM)
    11列目:R2L3Liver (3 pM)
    
  3. 上記SupplementaryTable2_changed.txtをさらに加工したデータ:
    NGSデータは(マイクロアレイの黎明期と同じく)金がかかりますので(technical and/or biological) replicatesを簡単には増やせませんので、「1サンプル vs. 1サンプル」比較の局面がまだまだあろうかと思います。 そこで、上記ファイルの2-6列目と7-11列目をそれぞれまとめた(総和をとった)ものSupplementaryTable2_changed2.txtです。
  4. カウントデータ(SupplementaryTable2_changed.txt)と長さ情報ファイル(ens_gene_46_length.txt)を読み込んで、以下を実行して、「配列長情報を含み、カウント数の和が0より大きい行のみ抽出した結果」です。カウントデータファイル(data_marioni.txt)と配列長情報ファイル(length_marioni.txt)。
    in_f1 <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_f1に格納(カウントーデータファイル)
    in_f2 <- "ens_gene_46_length.txt"      #入力ファイル名を指定してin_f2に格納(長さ情報ファイル)
    out_f1 <- "data_marioni.txt"           #出力ファイル名を指定してout_f1に格納
    out_f2 <- "length_marioni.txt"         #出力ファイル名を指定してout_f2に格納
    
    #入力ファイルの読み込み
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
    len <- read.table(in_f2, header=TRUE, sep="\t", quote="")#in_f2で指定したファイルの読み込み
    dim(data)                              #行数と列数を表示
    dim(len)                               #行数と列数を表示
    
    #本番(共通IDのもののみ抽出)
    rownames(len) <- len[,1]               #行の名前としてIDを与えている
    common <- intersect(rownames(len), rownames(data))#共通IDをcommonに格納
    data <- data[common,]                  #共通IDのもののみ抽出
    len <- len[common,]                    #共通IDのもののみ抽出
    dim(data)                              #行数と列数を表示
    dim(len)                               #行数と列数を表示
    head(data)                             #確認してるだけです
    head(len)                              #確認してるだけです
    
    #本番(ゼロカウントデータのフィルタリング)
    obj <- (rowSums(data) > 0)             #条件を満たすかどうかを判定した結果をobjに格納
    data <- data[obj,]                     #objがTRUEとなる要素のみ抽出した結果をdataに格納
    len <- len[obj,]                       #objがTRUEとなる要素のみ抽出した結果をlenに格納
    dim(data)                              #行数と列数を表示
    dim(len)                               #行数と列数を表示
    head(data)                             #確認してるだけです
    head(len)                              #確認してるだけです
    
    #ファイルに保存
    tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
    write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    write.table(len, out_f2, sep="\t", append=F, quote=F, row.names=F)#lenの中身を指定したファイル名で保存
    	
  5. ABI_SOLiD/25-35bp/single-end/mouse (SRA000306; EB vs. ES) data (Cloonan et al., Nature Methods, 2008)
  6. Illumina/50bp/paired-end/mouse (SRA012213; liver) data (Robertson et al., Nature Methods, 2010)
  7. Illumina/35bp/single-end/human (SRA010153; MAQC) data (Bullard et al., BMC Bioinformatics, 2010)
  8. SRR037439から得られるFASTQファイルの最初の2000行分を抽出したMAQC2 brainデータ:SRR037439.fastq

  9. NBPSeqパッケージ(Di et al., SAGMB, 10:art24, 2011)中の ArabidopsisのBiological replicatesデータ(G1群3サンプル vs. G2群3サンプル; Cumbie et al., PLoS One, 2011)です。
  10. 26,221 genes×6 samplesの「複製あり」タグカウントデータ(data_arab.txt)

    オリジナルは"AT4G32850"というIDのものが重複して存在していたため、19520行目のデータを除去してタブ区切りテキストファイルにしています。

  11. ReCountデータベース(Frazee et al., BMC Bioinformatics, 2011)
  12. マッピング済みの遺伝子発現行列形式のデータセットを多数提供しています。

  13. Yeastの二群間比較用データ(2 mutant strains vs. 2 wild-types; technical replicates)
  14. 7065行 × 4列のyeast RNA-seqデータ(data_yeast_7065.txt)

    R Console画面上で「library(yeastRNASeq)」と打ち込んでエラーが出る場合は、a.をコピペで実行してパッケージをインストールしましょう。 このパッケージ中には他に、fastq形式ファイル(500,000 reads)と、bowtieでマッピング(unique mapping and allowing up to two mismatches)したBowtie形式ファイルがそれぞれ4ファイルずつあります。

    a. yeastRNASeqパッケージのインストール:

    source("http://www.bioconductor.org/biocLite.R")#おまじない
    biocLite("yeastRNASeq")                #yeastRNASeqパッケージのインストール
    	

    b. yeastRNASeqパッケージがインストールされていれば以下のコピペでも取得可能:

    library(yeastRNASeq)                   #パッケージの読み込み
    data(geneLevelData)                    #yeastRNASeqパッケージ中で提供されているデータをロード
    dim(geneLevelData)                     #行数と列数を表示
    head(geneLevelData)                    #最初の数行を表示
    
    #ファイルに保存
    tmp <- cbind(rownames(geneLevelData), geneLevelData)#geneLevelDataの「rownames情報(i.e., 遺伝子名)」と「カウントデータ」の行列を列方向で結合した結果をtmpに格納
    write.table(tmp, "data_yeast_7065.txt", sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  15. 上記Yeastの二群間比較用データを用いてGC-content normalizationなどを行う場合に必要な情報
    yeast genes (SGD ver. r64)のGC含量(yeastGC_6717.txt)やlength情報(yeastLength_6717.txt)。
    R Console画面上で「library(EDASeq)」と打ち込んでエラーが出る場合は、a.をコピペで実行してパッケージをインストールしましょう。

    a. EDASeqパッケージのインストール:

    source("http://www.bioconductor.org/biocLite.R")#おまじない
    biocLite("EDASeq")                     #EDASeqパッケージのインストール
    	

    b. EDASeqパッケージがインストールされていれば以下のコピペでも取得可能:

    library(EDASeq)                        #パッケージの読み込み
    data(yeastGC)                          #yeastRNASeqパッケージ中で提供されているyeastのGC含量情報をロード
    length(yeastGC)                        #要素数を表示
    head(yeastGC)                          #最初の数個を表示
    
    data(yeastLength)                      #yeastRNASeqパッケージ中で提供されているyeastの配列長情報をロード
    length(yeastLength)                    #要素数を表示
    head(yeastLength)                      #最初の数個を表示
    
    #それぞれ別々のファイルに保存
    tmp <- cbind(names(yeastGC), yeastGC)  #yeastGCの「names属性情報」と「GC含量」のベクトルを列方向で結合した結果をtmpに格納
    write.table(tmp, "yeastGC_6717.txt", sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    tmp <- cbind(names(yeastLength), yeastLength)#yeastLengthの「names属性情報」と「配列長」のベクトルを列方向で結合した結果をtmpに格納
    write.table(tmp, "yeastLength_6717.txt", sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  16. 「10.」と「11.」のファイルをもとに共通遺伝子(6685個)のみからなるのサブセットにしたファイル:
    (data_yeast_common_6685.txt; yeastGC_common_6685.txt; yeastLength_common_6685.txt)
    以下のコピペでも上記ファイルを得ることができます。
    #必要なパッケージをロード
    library(yeastRNASeq)                   #パッケージの読み込み
    library(EDASeq)                        #パッケージの読み込み
    
    #count dataやGC含量情報(SGD ver. r64)の読み込みとラベル情報の作成
    data(geneLevelData)                    #yeastRNASeqパッケージ中で提供されているカウントデータ(geneLevelData)をロード
    data(yeastGC)                          #EDASeqパッケージ中で提供されているyeastのGC含量情報(yeastGC)をロード
    data(yeastLength)                      #EDASeqパッケージ中で提供されているyeastの配列長情報(yeastLength)をロード
    
    #カウントデータ情報(geneLevelData)とGC含量情報(yeastGC)から共通して存在するサブセットを(同じ遺伝子名の並びで)取得
    common <- intersect(rownames(geneLevelData), names(yeastGC))#yeastRNASeqパッケージ中で提供されているデータをロード
    data <- as.data.frame(geneLevelData[common, ])#6685個の共通遺伝子分のカウントデータ行列をデータフレーム形式でdataに格納
    GC <- data.frame(GC = yeastGC[common]) #6685個の共通遺伝子分のGC含量ベクトルをデータフレーム形式でGCに格納
    length <- data.frame(Length = yeastLength[common])#6685個の共通遺伝子分の配列長ベクトルをデータフレーム形式でlengthに格納
    head(rownames(data))                   #行列dataの行名(rownames)情報の最初の数個を表示
    head(rownames(GC))                     #行列GCの行名(rownames)情報の最初の数個を表示
    head(rownames(length))                 #行列lengthの行名(rownames)情報の最初の数個を表示
    
    #ファイルに保存
    tmp <- cbind(rownames(data), data)     #「rownames情報」と「カウントデータ」を列方向で結合した結果をtmpに格納
    write.table(tmp, "data_yeast_common_6685.txt", sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    tmp <- cbind(rownames(GC), GC)         #「rownames情報」と「GC含量情報」を列方向で結合した結果をtmpに格納
    write.table(tmp, "yeastGC_common_6685.txt", sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    tmp <- cbind(rownames(length), length) #「rownames情報」と「配列長情報」を列方向で結合した結果をtmpに格納
    write.table(tmp, "yeastLength_common_6685.txt", sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  17. TCCパッケージ中のBiological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。
    10,000 genes×6 samplesの「複製あり」タグカウントデータ(data_hypodata_3vs3.txt)
    「G1_rep1, G1_rep2, G1_rep3, G2_rep1, G2_rep2, G2_rep3」の計6サンプル分からなります。
    全10,000遺伝子中の最初の2,000個(gene_1〜gene_2000まで)が発現変動遺伝子(DEG)です。
    全2,000 DEGsの内訳:最初の90%分(gene_1〜gene_1800)がG1群で4倍高発現、残りの10%分(gene_1801〜gene_2000)がG2群で4倍高発現
    以下のコピペでも(数値は違ってきますが)同じ条件のシミュレーションデータを作成可能です。:
    library(TCC)                           #パッケージの読み込み
    set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
    tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.2,#シミュレーションデータの作成
                 DEG.assign = c(0.9, 0.1), #シミュレーションデータの作成
                 DEG.foldchange = c(4, 4), #シミュレーションデータの作成
                 replicates = c(3, 3))     #シミュレーションデータの作成
    plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
    
    #ファイルに保存
    tmp <- cbind(rownames(tcc$count), tcc$count)#「rownames情報」と「カウントデータ」を列方向で結合した結果をtmpに格納
    write.table(tmp, "data_hypodata_3vs3.txt", sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  18. 上記のTCCパッケージ中のBiological replicatesを模倣した 「G1_rep1, G1_rep2, G1_rep3, G2_rep1, G2_rep2, G2_rep3」の計6サンプルからなるシミュレーションデータから、1列目と4列目のデータを抽出した「複製なし」タグカウントデータ(data_hypodata_1vs1.txt)
    よって、「G1_rep1, G2_rep1」の計2サンプル分のみからなります。
    以下のコピペでも(数値は違ってきますが)同じ条件のシミュレーションデータを作成可能です。:
    library(TCC)                           #パッケージの読み込み
    set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
    tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.2,#シミュレーションデータの作成
                 DEG.assign = c(0.9, 0.1), #シミュレーションデータの作成
                 DEG.foldchange = c(4, 4), #シミュレーションデータの作成
                 replicates = c(1, 1))     #シミュレーションデータの作成
    plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
    
    #ファイルに保存
    tmp <- cbind(rownames(tcc$count), tcc$count)#「rownames情報」と「カウントデータ」を列方向で結合した結果をtmpに格納
    write.table(tmp, "data_hypodata_1vs1.txt", sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  19. TCCパッケージ中のBiological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。
    10,000 genes×9 samplesの「複製あり」タグカウントデータ(data_hypodata_3vs3vs3.txt)
    「G1_rep1, G1_rep2, G1_rep3, G2_rep1, G2_rep2, G2_rep3, G3_rep1, G3_rep2, G3_rep3」の計9サンプル分からなります。
    全10,000遺伝子中の最初の3,000個(gene_1〜gene_3000まで)が発現変動遺伝子(DEG)です。
    全3,000 DEGsの内訳:(1)最初の70%分(gene_1〜gene_2100)がG1群で3倍高発現、(2)次の20%分(gene_2101〜gene_2700)がG2群で10倍高発現、(3)残りの10%分(gene_2701〜gene_3000)がG3群で6倍高発現
    以下のコピペでも取得可能です。:
    library(TCC)                           #パッケージの読み込み
    set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
    tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
                 DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
                 DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
                 replicates = c(3, 3, 3))  #各群のサンプル数を指定
    plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
    
    #ファイルに保存
    tmp <- cbind(rownames(tcc$count), tcc$count)#「rownames情報」と「カウントデータ」を列方向で結合した結果をtmpに格納
    write.table(tmp, "data_hypodata_3vs3vs3.txt", sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  20. TCCパッケージ中のBiological replicatesを模倣したシミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。
    10,000 genes×9 samplesの「複製あり」タグカウントデータ(data_hypodata_2vs4vs3.txt)
    「G1_rep1, G1_rep2, G2_rep1, G2_rep2, G2_rep3, G2_rep4, G3_rep1, G3_rep2, G3_rep3」の計9サンプル分からなります。
    全10,000遺伝子中の最初の3,000個(gene_1〜gene_3000まで)が発現変動遺伝子(DEG)です。
    全3,000 DEGsの内訳:(1)最初の70%分(gene_1〜gene_2100)がG1群で3倍高発現、(2)次の20%分(gene_2101〜gene_2700)がG2群で10倍高発現、(3)残りの10%分(gene_2701〜gene_3000)がG3群で6倍高発現
    以下のコピペでも取得可能です。:
    library(TCC)                           #パッケージの読み込み
    set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
    tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
                 DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
                 DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
                 replicates = c(2, 4, 3))  #各群のサンプル数を指定
    plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
    
    #ファイルに保存
    tmp <- cbind(rownames(tcc$count), tcc$count)#「rownames情報」と「カウントデータ」を列方向で結合した結果をtmpに格納
    write.table(tmp, "data_hypodata_2vs4vs3.txt", sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  21. Illumina/35bp/single-end/human (SRA000299; kidney vs. liver) data (Marioni et al., Genome Res., 2008)
  22. ランダムな塩基配列から生成したリファレンスゲノム配列データ(ref_genome.fa)。

    48, 160, 100, 123, , 100の配列長をもつ、計5つの塩基配列を生成しています。 description行は"contig"という記述を基本としています。

    塩基の存在比はAが28%, Cが22%, Gが26%, Tが24%にしています。

    set.seed関数を利用し、chr3の配列と同じものをchr5としてコピーして作成したのち、2番目と7番目の塩基置換を行っています。 そのため、実際に指定するのは最初の4つ分の配列長のみです。

    out_f <- "ref_genome.fa"               #出力ファイル名を指定してout_fに格納
    param1 <- c(48, 160, 100, 123)         #配列長を指定
    narabi <- c("A","C","G","T")           #以下の数値指定時にACGTの並びを間違えないようにするために記述している(内部的にも使用してます)
    param2 <- c(28, 22, 26, 24)            #(A,C,G,Tの並びで)各塩基の存在比率を指定
    param3 <- "chr"                        #FASTA形式ファイルのdescription行に記述する内容
    param4 <- 3                            #コピーを作成したい配列番号を指定
    
    #必要なパッケージをロード
    library(Biostrings)                    #パッケージの読み込み
    
    #塩基置換関数の作成
    enkichikan <- function(fa, p) {        #関数名や引数の作成
      t <- substring(fa, p, p)             #置換したい位置の塩基を取りだす
      t_c <- chartr("CGAT", "GCTA", t)     #置換後の塩基を作成
      substring(fa, p, p) <- t_c           #置換
      return(fa)                           #置換後のデータを返す
    }
    
    #本番(配列生成)
    set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
    ACGTset <- rep(narabi, param2)         #narabi中の塩基がparam2で指定した数だけ存在する文字列ベクトルACGTsetを作成
    hoge <- NULL                           #hogeというプレースホルダの作成
    for(i in 1:length(param1)){            #length(param1)で表現される配列数分だけループを回す
        hoge <- c(hoge, paste(sample(ACGTset, param1[i], replace=T), collapse=""))#ACGTsetの文字型ベクトルからparam1[i]回分だけ復元抽出して得られた塩基配列をhogeに格納
    }
    
    #本番(chr3の配列をchr5としてコピーし、2番目と7番目の塩基をそれぞれ置換)
    hoge <- c(hoge, hoge[param4])          #param4で指定した配列を追加している
    hoge[length(param1)+1] <- enkichikan(hoge[length(param1)+1], 2)#hoge[5]の2番目の塩基を置換
    hoge[length(param1)+1] <- enkichikan(hoge[length(param1)+1], 7)#hoge[5]の7番目の塩基を置換
    
    #本番(FASTA形式に変換)
    fasta <- DNAStringSet(hoge)            #DNA塩基配列だと認識させるDNAStringSet関数を適用した結果をfastaに格納
    names(fasta) <- paste(param3, 1:length(hoge), sep="")#description行に相当する記述を追加している
    fasta                                  #確認してるだけです
    
    #ファイルに保存
    writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
    	
  23. 上記リファレンスゲノム配列データ(ref_genome.fa)に対してbasic alignerでマッピングする際の動作確認用RNA-seqデータ(sample_RNAseq1.fa)とそのgzip圧縮ファイル(sample_RNAseq1.fa.gz)。

    リファレンス配列を読み込んで、list_sub3.txtで与えた部分配列を抽出したものです。 どこに置換を入れているかがわかっているので、basic alignerで許容するミスマッチ数を変えてマップされる or されないの確認ができます。

    DNAStringSetオブジェクトを入力として塩基置換を行うDNAString_chartr関数を用いて、最後のリードのみ4番目の塩基にミスマッチを入れています。

    in_f1 <- "ref_genome.fa"               #入力ファイル名(multi-FASTAファイル)を指定してin_f1に格納
    in_f2 <- "list_sub3.txt"               #入力ファイル名(リストファイル)を指定してin_f2に格納
    out_f <- "sample_RNAseq1.fa"           #出力ファイル名を指定してout_fに格納
    param <- 4                             #塩基置換したい位置を指定
    
    #必要なパッケージをロード
    library(Biostrings)                    #パッケージの読み込み
    
    #塩基置換関数の作成
    DNAString_chartr <- function(fa, p) {  #関数名や引数の作成
      str_list <- as.character(fa)         #文字列に変更
      t <- substring(str_list, p, p)       #置換したい位置の塩基を取りだす
      t_c <- chartr("CGAT", "GCTA", t)     #置換後の塩基を作成
      substring(str_list, p, p) <- t_c     #置換
      fa_r <- DNAStringSet(str_list)       #DNAStringSetオブジェクトに戻す
      names(fa_r) <- names(fa)             #description部分の情報を追加
      return(fa_r)                         #置換後のデータを返す
    }
    
    #入力ファイルの読み込み
    fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
    posi <- read.table(in_f2)              #in_f2で指定したファイルの読み込み
    fasta                                  #確認してるだけです
    
    #本番
    hoge <- NULL                           #最終的に得る結果を格納するためのプレースホルダhogeを作成しているだけ
    for(i in 1:nrow(posi)){                #length(posi)回だけループを回す
        obj <- names(fasta) == posi[i,1]   #条件を満たすかどうかを判定した結果をobjに格納
        hoge <- append(hoge, subseq(fasta[obj], start=posi[i,2], end=posi[i,3]))#subseq関数を用いてobjがTRUEとなるもののみに対して、posi[i,2]とposi[i,3]で与えた範囲に対応する部分配列を抽出した結果をhogeに格納
    }
    fasta <- hoge                          #hogeの中身をfastaに格納
    fasta                                  #確認してるだけです
    
    #後処理(最後のリードのparam番目の塩基に置換を入れている)
    fasta[nrow(posi)] <- DNAString_chartr(fasta[nrow(posi)], param)#指定した位置の塩基置換を実行した結果をfastaに格納
    fasta                                  #確認してるだけです
    
    #後処理(description部分の作成)
    description <- paste(posi[,1], posi[,2], posi[,3], sep="_")#行列posiの各列を"_"で結合したものをdescriptionに格納
    names(fasta) <- description            #description行に相当する記述を追加している
    fasta                                  #確認してるだけです
    
    #ファイルに保存
    writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
    	
  24. 上記リファレンスゲノム配列データ(ref_genome.fa)に対してbasic alignerでマッピングする際の動作確認用RNA-seqデータ(sample_RNAseq2.fa)とそのgzip圧縮ファイル(sample_RNAseq2.fa.gz)。

    リファレンス配列を読み込んで、list_sub4.txtで与えた部分配列を抽出したものです。 基本的にジャンクションリードがbasic alignerでマップされず、splice-aware alignerでマップされることを示すために作成したものです。

    in_f1 <- "ref_genome.fa"               #入力ファイル名(multi-FASTAファイル)を指定してin_f1に格納
    in_f2 <- "list_sub4.txt"               #入力ファイル名(リストファイル)を指定してin_f2に格納
    out_f <- "sample_RNAseq2.fa"           #出力ファイル名を指定してout_fに格納
    
    #必要なパッケージをロード
    library(Biostrings)                    #パッケージの読み込み
    
    #入力ファイルの読み込み
    fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
    posi <- read.table(in_f2)              #in_f2で指定したファイルの読み込み
    fasta                                  #確認してるだけです
    
    #本番
    hoge <- NULL                           #塩基配列用プレースホルダhogeを作成
    hoge_d <- NULL                         #description用プレースホルダhoge_dを作成
    for(i in 1:nrow(posi)){                #nrow(posi)回だけループを回す
      uge <- NULL                          #ugeを初期化
      for(j in 1:(length(posi[i,])/3)){    #ncol(posi)/3回だけループを回す
        obj <- names(fasta)==posi[i,3*(j-1)+1]#条件を満たすかどうかを判定した結果をobjに格納
        uge <- paste(uge, subseq(fasta[obj],  #subseq関数を用いてobjがTRUEとなるもののみに対して、
                      start=posi[i,3*(j-1)+2],#「3*(j-1)+2」列目で指定したstart位置から、
                       end=posi[i,3*(j-1)+3]),#「3*(j-1)+3」列目で指定したend位置で与えた範囲の部分配列を取得し
                       sep="")                #それをugeに連結
      }
      hoge <- append(hoge, uge)            #hogeにugeを連結
      
      uge_d <- as.character(posi[i,1])     #uge_dの初期値を与えている
      for(j in 2:(length(posi[i,]))){      #length(posi[i,])回数分だけループを回す
        uge_d <- paste(uge_d, as.character(posi[i,j]), sep="_")#description情報の作成
      }
      hoge_d <- append(hoge_d, uge_d)      #hoge_dにuge_dを連結
    }
    
    #後処理(DNAStringSet形式に変換)
    fasta <- DNAStringSet(hoge)            #行列posiの各列を"_"で結合したものをdescriptionに格納
    names(fasta) <- hoge_d                 #description行に相当する記述を追加している
    fasta                                  #確認してるだけです
    
    #ファイルに保存
    writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
    	
  25. GTF (General Transfer Format)形式のヒトサンプルファイル(human_annotation_sub.gtf)です。

    EnsemblのFTPサイトから得たヒトの遺伝子アノテーションファイル("Homo_sapiens.GRCh37.73.gtf.gz")を ここからダウンロードして得て解凍("Homo_sapiens.GRCh37.73.gtf")したのち、 (解凍後のファイルサイズは500MB、2,268,089行×9列のファイルなので)以下のコピペで、ランダムに50,000行分を非復元抽出して得たファイルです。

    in_f <- "Homo_sapiens.GRCh37.73.gtf"   #入力ファイル名(目的のタブ区切りテキストファイル)を指定してin_fに格納
    out_f <- "human_annotation_sub.gtf"    #出力ファイル名を指定してout_fに格納
    param <- 50000                         #(入力ファイルの行数以下の)得たい行数を指定
    
    #入力ファイルの読み込み
    data <- read.table(in_f, header=FALSE, sep="\t", quote="")#in_fで指定したファイルの読み込み
    dim(data)                              #オブジェクトdataの行数と列数を表示
    
    #本番
    hoge <- sample(1:nrow(data), param)    #入力ファイルの行数までの整数の中からparamで指定した数だけ非復元抽出した結果をhogeに格納
    out <- data[sort(hoge),]               #hogeで指定した行のみ抽出した結果をoutに格納
    dim(out)                               #オブジェクトoutの行数と列数を表示
    
    #ファイルに保存
    write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#outの中身を指定したファイル名で保存
    	
  26. GTF (General Transfer Format)形式のヒトサンプルファイル(human_annotation_sub2.gtf)です。

    GTFファイル(human_annotation_sub.gtf)の各行の左端に"chr"を挿入したファイルです。

    in_f <- "human_annotation_sub.gtf"     #入力ファイル名(目的のタブ区切りテキストファイル)を指定してin_fに格納
    out_f <- "human_annotation_sub2.gtf"   #出力ファイル名を指定してout_fに格納
    param <- "chr"                         #挿入したい文字列を指定
    
    #入力ファイルの読み込み
    data <- read.table(in_f, header=FALSE, sep="\t", quote="")#in_fで指定したファイルの読み込み
    
    #本番(文字列挿入)
    data[,1] <- paste(param, data[,1], sep="")#入力ファイルの行数までの整数の中からparamで指定した数だけ非復元抽出した結果をobjに格納
    
    #ファイルに保存
    write.table(data, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#dataの中身を指定したファイル名で保存
    	
  27. GTF (General Transfer Format)形式のヒトサンプルファイル(human_annotation_sub3.gtf)です。

    ヒトゲノム配列("BSgenome.Hsapiens.UCSC.hg19")中の染色体名と一致する遺伝子アノテーション情報のみhuman_annotation_sub2.gtfから抽出したファイルです。

    in_f1 <- "human_annotation_sub2.gtf"   #入力ファイル名を指定してin_f1に格納(GFF/GTFファイル)
    in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
    out_f <- "human_annotation_sub3.gtf"   #出力ファイル名を指定してout_fに格納
    
    #入力ファイルの読み込み(GFF/GTFファイル)
    data <- read.table(in_f1, header=FALSE, sep="\t", quote="")#in_f1で指定したファイルの読み込み
    dim(data)                              #オブジェクトdataの行数と列数を表示
    
    #前処理(リファレンス配列の染色体名を抽出)
    param <- in_f2                         #paramという名前で取り扱いたいだけです
    library(param, character.only=T)       #paramで指定したパッケージの読み込み
    tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
    hoge <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてhogeに格納
    keywords <- seqnames(hoge)             #染色体名情報を抽出した結果をkeywordsに格納
    keywords                               #確認してるだけです
    
    #本番
    obj <- is.element(as.character(data[,1]), keywords)#in_f1で読み込んだファイル中の1列目の文字列ベクトル中の各要素がベクトルkeywords中に含まれるか含まれないか(TRUE or FALSE)の情報をobjに格納(集合演算をしている)
    out <- data[obj,]                      #objがTRUEとなる行のみ抽出した結果をoutに格納
    dim(out)                               #オブジェクトoutの行数と列数を表示
    
    #ファイルに保存
    write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身をout_fで指定したファイル名で保存
    	
  28. Illumina/75bp/single-end/human (SRA061145) data (Wang et al., Nucleic Acids Res., 2013)

    ヒト肺の3群間比較用データ:normal human bronchial epithelial (HBE) cells, human lung cancer A549, and H1299 cells

  29. Illumina HiSeq 2000/200bp?!/single-end/human (SRA062939) data (Chan et al., Hum. Mol. Genet., 2013)
  30. Illumina Genome Analyzer II/54bp/single-end/human (SRP017142; GSE42212) data (Neyret-Kahn et al., Genome Res., 2013)

    ヒトfibroblastsの2群間比較用データ:3 proliferative samples vs. 3 Ras samples

  31. Illumina HiSeq 2000 (GPL14844)/50bp/single-end/Rat (SRP037986; GSE53960) data (Yu et al., Nat Commun., 2014)

    ラットの10組織×雌雄(2種類)×4種類の週齢(2, 6, 21, 104 weeks)×4 biological replicatesの計320サンプルからなるデータ。

  32. Illumina GAIIx/76bp/paired-end/Drosophila or Illumina HiSeq 2000/100bp/paired-end/Drosophila (SRP009459; GSE33905) data (Graveley et al., Nature, 2011; Brown et al., Nature, 2014)

    ショウジョウバエの様々な組織のデータ(modENCODE)。29 dissected tissue samplesのstrand-specific, paired-endのbiological replicates (duplicates)だそうです。

  33. Illumina HiSeq 2000/36bp/single-end/Arabidopsis (SRP011435; GSE36469) data (Huang et al., Development, 2012)

    シロイヌナズナの2群間比較用データ:4 DEX-treated vs. 4 mock-treated

書籍 | について

2014年4月に(Rで)塩基配列解析および(Rで)マイクロアレイデータ解析 を体系的にまとめた以下の書籍が出版されました。ここでは(Rで)塩基配列解析に関連したRNA-seq部分の書籍中のRコードを章・節・項ごとに示します。

なるべく書籍中の記述形式に準拠しますが、例えばp72中の最初のsetwd("C:/Users/kadota/Desktop")というコマンドを忠実に実行してもエラーが出るだけです。 これはkadotaというヒトのPC上でのみ成立するコマンドだからです。 ここで利用しているsetwd関数は作業ディレクトリの変更に相当し、「ファイル」−「ディレクトリの変更」でデスクトップに移動することと同義です。 したがって、このページ全体で統一的に使っているように、ディレクトリの変更作業自体はR Gui画面左上の「ファイル」メニューを利用した作業を行うこととし、 setwd関数部分の記述は省略します。

いくつかの数値の違いは、Rのバージョンの違いもあるでしょうし、取得先のデータベース側のバージョンの違いにもよると思います。 したがって、「得られるファイル」や「入力ファイルのリンク先のもの」と「手持ちの入力ファイル」が多少異なっていても気にする必要はありません。

  • 門田幸二著(金明哲 編), シリーズ Useful R 第7巻 トランスクリプトーム解析, 共立出版, 2014年4月. ISBN: 978-4-320-12370-0

書籍 | トランスクリプトーム解析 | 2.3.1 RNA-seqデータ(FASTQファイル)

シリーズ Useful R 第7巻 トランスクリプトーム解析のp71-73のRコードです。

「ファイル」−「ディレクトリの変更」でデスクトップに移動し以下をコピペ。

p72の網掛け部分:

作業ディレクトリがデスクトップという前提です。有線LANで数十分程度はかかりますのでご注意ください。

param <- "SRA000299"                   #取得したいSRA IDを指定

#必要なパッケージをロード
library(SRAdb)                         #パッケージの読み込み

sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロード
sra_con <- dbConnect(SQLite(), sqlfile)#DBMSへの接続(ファイルの読み込み)
hoge <- sraConvert(param, sra_con=sra_con)#メタデータ取得
hoge                                   #hogeの中身を表示
	

p72下:

作業ディレクトリがデスクトップで、デスクトップ上に"SRAmetadb.sqlite"というファイルが存在するという前提です。

hoge$run実行後の表示順(SRR002324, SRR002325, SRR002320, SRR002322, SRR002323, SRR002321)が書籍中の順番と異なっている場合もあるようです。

param <- "SRA000299"
library(SRAdb)
sqlfile <- "SRAmetadb.sqlite"
sra_con <- dbConnect(SQLite(), sqlfile)
hoge <- sraConvert(param, sra_con=sra_con)
hoge
hoge$run
k <- getFASTQinfo(hoge$run)
dim(k)
colnames(k)
	

p73:

私が行ったときのhoge$run実行後の表示順は(SRR002324, SRR002325, SRR002320, SRR002322, SRR002323, SRR002321)でした。 この場合、SRR002324 (腎臓1.5pM)とSRR002322 (肝臓1.5pM)は1番目と4番目 の要素に相当するので、書籍中のc(2,4)ではなく c(1,4)を指定しています。

k[,c(9,14,16,17)]
getFASTQfile(hoge$run[c(1,4)], srcType='ftp')
list.files(pattern=".gz")
	

書籍 | トランスクリプトーム解析 | 2.3.2 リファレンス配列

シリーズ Useful R 第7巻 トランスクリプトーム解析のp73-78のRコードです。

「ファイル」−「ディレクトリの変更」でデスクトップに移動し以下をコピペ。

p74の網掛け部分:

2014年4月15日以降にRとBioconductorのインストールを行ったヒトは、 書籍中の記述と若干の違いがあるかもしれませんが単純にバージョンの違いによるものなので気にしなくて良い。

library(BSgenome)                      #パッケージの読み込み
available.genomes()                    #利用可能なゲノムをリストアップ
	

p74下:

head(available.genomes()) 
hoge <- available.genomes(splitNameParts=T)
dim(hoge)
colnames(hoge)
hoge$organism
	

p75上:

table(hoge$organism)
installed.genomes()
	

p75の網掛け部分:

以下のコピペ実行後に「Update all/some/none? [a/s/n]: 」というメッセージが出ます。私はnにします。

param <- "BSgenome.Tgondii.ToxoDB.7.0" #インストールしたいパッケージ名を指定
source("http://bioconductor.org/biocLite.R")
biocLite(param)
	

p75下:

installed.genomes()
	

p76の網掛け部分:

out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "hsapiens_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- "refseq_mrna"       #配列を取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
param_seqtype <- "cdna"                #配列のタイプを指定(cdna, peptide, 3utr, 5utr, genomicのいずれかが指定可能です)

library(biomaRt)                       #パッケージの読み込み
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
hoge <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#指定したIDリスト取得結果をhogeに格納
out <- getSequence(id=hoge, type=param_attribute,#指定したパラメータで配列取得した結果をoutに格納
                seqType=param_seqtype, mart=mart)#指定したパラメータで配列取得した結果をoutに格納
exportFASTA(out, file=out_f)           #FASTA形式で保存
	

p76下:

2014年4月15日、R ver. 3.0.3で実行したときにはdim(out)の結果が「31690 2」でした。 また、hoge実行結果も「66 3」でした。

dim(out)
library(biomaRt)
hoge <- listDatasets(useMart("ensembl"))
dim(hoge)
head(hoge)
	

p77上:

2014年4月15日、R ver. 3.0.3でのhoge実行結果は「1149 2」でした。

param_dataset <- "hsapiens_gene_ensembl"
mart <- useMart("ensembl",dataset=param_dataset)
hoge <- listAttributes(mart)
dim(hoge)
head(hoge)
	

p77の網掛け部分:

有線LANで10分程度かかりますのでご注意ください。

out_f <- "hoge8.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "cporcellus_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- "embl"              #配列を取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
param_seqtype <- "5utr"                #配列のタイプを指定(cdna, peptide, 3utr, 5utr, genomicのいずれかが指定可能です)

library(biomaRt)                       #パッケージの読み込み
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
hoge <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#指定したIDリスト取得結果をhogeに格納
out <- getSequence(id=hoge, type=param_attribute,#指定したパラメータで配列取得した結果をoutに格納
                seqType=param_seqtype, mart=mart)#指定したパラメータで配列取得した結果をoutに格納
exportFASTA(out, file=out_f)           #FASTA形式で保存
	

p77下:

2014年4月15日、R ver. 3.0.3でのdim(out)実行結果は「12987 2」でした。

dim(out)
head(out, n=3)
?getBM
	

書籍 | トランスクリプトーム解析 | 2.3.3 アノテーション情報

シリーズ Useful R 第7巻 トランスクリプトーム解析のp78-80のRコードです。

「ファイル」−「ディレクトリの変更」でデスクトップに移動し以下をコピペ。

p78の網掛け部分:

作業ディレクトリがデスクトップという前提です。有線LANで数十分程度はかかりますのでご注意ください。 細かいところですが、書籍中では最後から2行目でちゃんとぶら下げができてないですねm(_ _)m

out_f <- "hoge9.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "hsapiens_gene_ensembl"#データセット名を指定
param_attribute <- c("refseq_mrna","hgnc_symbol","go_id")#属性名を指定
param_filter <- "with_ox_refseq_mrna"  #フィルタリング条件を指定

library(biomaRt)                       #パッケージの読み込み
mart <- useMart("ensembl",dataset=param_dataset)
out <- getBM(attributes=param_attribute, filters=param_filter,
              values=list(TRUE), mart=mart)
write.table(out, out_f, sep="", append=F, quote=F, row.names=F)
	

p78下:

2014年4月16日、R ver. 3.0.3でのdim(out)実行結果は「450576 2」でした。

dim(out)
param_dataset <- "hsapiens_gene_ensembl"
param_attribute <- c("refseq_mrna","hgnc_symbol","go_id")
library(biomaRt)
mart <- useMart("ensembl",dataset=param_dataset)
	

p79:

2014年4月16日、R ver. 3.0.3でのdim(out)実行結果は「585078 2」、dim(listFilters(mart))の実行結果は「301 2」でした。 また、書籍中ではc(97,137)となっていますが、 バージョンによって頻繁に位置情報が変わるようなので、以下ではc("with_ox_refseq_mrna", "refseq_mrna") の位置情報objを自動取得するように変更しています。

out <- getBM(attributes=param_attribute, mart=mart)
dim(out)
out[1:15,]
dim(listFilters(mart))
head(listFilters(mart))
obj <- is.element(listFilters(mart)$name, c("with_ox_refseq_mrna", "refseq_mrna"))#書籍と違っているところ
listFilters(mart)[obj,]                #書籍と違っているところ
param_filter <- "refseq_mrna"
	

p80:

2014年4月16日、R ver. 3.0.3では585078から450576となっていました。

out <- getBM(attributes=param_attribute, filters=param_filter, values=list(TRUE), mart=mart)
dim(out)
out <- getBM(attributes=param_attribute, filters=param_filter, mart=mart)

out <- getBM(attributes=param_attribute, mart=mart)
dim(out)
out <- subset(out, refseq_mrna != "")
dim(out)
out[1:10,]

out <- getBM(attributes=param_attribute, mart=mart)
dim(out)
obj <- out[,1] != ""
out <- out[obj,]
dim(out)
	

書籍 | トランスクリプトーム解析 | 2.3.4 マッピング(準備)

シリーズ Useful R 第7巻 トランスクリプトーム解析のp81-85のRコードです。 ここではデスクトップ上にmappingというフォルダを作成し、そこで作業を行うという前提です。

「ファイル」−「ディレクトリの変更」でデスクトップ上のmappingに移動し以下をコピペ。

p81:

enkichikan <- function(fa, p) {        #関数名や引数の作成
    t <- substring(fa, p, p)           #置換したい位置の塩基を取りだす
    t_c <- chartr("CGAT", "GCTA", t)   #置換後の塩基を作成
    substring(fa, p, p) <- t_c         #置換
    return(fa)                         #置換後のデータを返す
}
enkichikan("CCGTACG", 2)
	

p81-82の網掛け部分:

サンプルデータ18とほぼ同じです。ref_genome.faと同じものができていると思います。

out_f <- "ref_genome.fa"               #出力ファイル名を指定してout_fに格納
param1 <- c(48, 160, 100, 123)         #配列長を指定
narabi <- c("A","C","G","T")           #ACGTの並びを指定
param2 <- c(28, 22, 26, 24)            #(A,C,G,Tの並びで)各塩基の存在比率を指定
param3 <- "chr"                        #FASTA形式ファイルのdescription部分を指定
param4 <- 3                            #コピーを作成したい配列番号を指定
param5 <- c(2, 7)                      #コピー先配列の塩基置換したい位置を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#chr1-4の生成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
ACGTset <- rep(narabi, param2)         #文字列ベクトルACGTsetを作成
hoge <- NULL                           #hogeというプレースホルダの作成
for(i in 1:length(param1)){            #length(param1)で表現される配列数分だけループを回す
    hoge <- c(hoge, paste(sample(ACGTset, param1[i], replace=T), collapse=""))#ACGTsetの文字型ベクトルからparam1[i]回分だけ復元抽出して得られた塩基配列をhogeに格納
}

#chr5の生成と塩基置換導入
hoge <- c(hoge, hoge[param4])          #(param4)番目の配列をコピーして追加
hoge[length(param1)+1] <- enkichikan(hoge[length(param1)+1], param5[1])#塩基置換
hoge[length(param1)+1] <- enkichikan(hoge[length(param1)+1], param5[2])#塩基置換

#ファイルに保存
fasta <- DNAStringSet(hoge)            #DNAStringSetオブジェクトに変更
names(fasta) <- paste(param3, 1:length(hoge), sep="")#description行を追加
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

p82:

list.files()
fasta
width(fasta)
names(fasta)
fasta[5]
	

p83:

DNAString_chartr <- function(fa, p) {  #関数名や引数の作成
  str_list <- as.character(fa)         #文字列に変更
  t <- substring(str_list, p, p)       #置換したい位置の塩基を取りだす
  t_c <- chartr("CGAT", "GCTA", t)     #置換後の塩基を作成
  substring(str_list, p, p) <- t_c     #置換
  fa_r <- DNAStringSet(str_list)       #DNAStringSetオブジェクトに戻す
  names(fa_r) <- names(fa)             #description部分の情報を追加
  return(fa_r)                         #置換後のデータを返す
}
	

p83の網掛け部分:

作業ディレクトリ中にref_genome.falist_sub3.txtが存在するという前提です。 sample_RNAseq1.faと同じものができていると思います。

in_f1 <- "ref_genome.fa"               #入力ファイル名を指定してin_f1に格納(multi-FASTAファイル)
in_f2 <- "list_sub3.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "sample_RNAseq1.fa"           #出力ファイル名を指定してout_fに格納
param <- 4                             #最後のリードの塩基置換したい位置を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
posi <- read.table(in_f2)              #in_f2で指定したファイルの読み込み

#部分配列の抽出および最後のリードの塩基置換
hoge <- NULL                           #最終的に得る結果を格納するためのプレースホルダhogeを作成しているだけ
for(i in 1:nrow(posi)){                #length(posi)回だけループを回す
    obj <- names(fasta) == posi[i,1]   #条件を満たすかどうかを判定した結果をobjに格納
    hoge <- append(hoge, subseq(fasta[obj], start=posi[i,2], end=posi[i,3]))#subseq関数を用いてobjがTRUEとなるもののみに対して、posi[i,2]とposi[i,3]で与えた範囲に対応する部分配列を抽出した結果をhogeに格納
}
fasta <- hoge                          #hogeの中身をfastaに格納
fasta[nrow(posi)] <- DNAString_chartr(fasta[nrow(posi)], param)#指定した位置の塩基置換を実行した結果をfastaに格納

#ファイルに保存
description <- paste(posi[,1], posi[,2], posi[,3], sep="_")#行列posiの各列を"_"で結合したものをdescriptionに格納
names(fasta) <- description            #description行に相当する記述を追加している
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

p83下:

dim(posi)
posi
	

p84:

list.files()
fasta
	

p85の網掛け部分(上):

single-endデータファイルの基本形です。mapping_single1.txtと同じものができていると思います。

out_f <- "mapping_single1.txt"         #出力ファイル名を指定してout_fに格納
param_FN <- "sample_RNAseq1.fa"        #マップしたいファイル名を指定
param_SN <- "hoge1"                    #任意のサンプル名を指定
out <- cbind(param_FN, param_SN)
colnames(out) <- c("FileName", "SampleName")
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)
	

p85の網掛け部分(中):

複数のsingle-endデータファイルの場合です。mapping_single2.txtと同じものができていると思います。

out_f <- "mapping_single2.txt"         #出力ファイル名を指定してout_fに格納
param_FN <- c("sample_RNAseq1.fa", "sample_RNAseq2.fa")#マップしたいファイル名を指定
param_SN <- c("sample1", "sample2")    #任意のサンプル名を指定
out <- cbind(param_FN, param_SN)
colnames(out) <- c("FileName", "SampleName")
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)
	

p85の網掛け部分(下):

paired-endデータファイルの基本形です。mapping_paired.txtと同じものができていると思います。

out_f <- "mapping_paired.txt"          #出力ファイル名を指定してout_fに格納
param_FN1 <- "sample_paired1.fq.gz"
param_FN2 <- "sample_paired2.fq.gz"
param_SN <- "uge"
out <- cbind(param_FN1, param_FN2, param_SN)
colnames(out) <- c("FileName1", "FileName2", "SampleName")
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)
	

書籍 | トランスクリプトーム解析 | 2.3.5 マッピング(本番)

シリーズ Useful R 第7巻 トランスクリプトーム解析のp86-90のRコードです。 ここではデスクトップ上にmappingというフォルダを作成し、そこで作業を行うという前提です。

「ファイル」−「ディレクトリの変更」でデスクトップ上のmappingに移動し以下をコピペ。

p86の網掛け部分:

作業ディレクトリ中にmapping_single1.txtref_genome.fa、およびsample_RNAseq1.faのみ存在するという前提です。

in_f1 <- "mapping_single1.txt"         #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)

library(QuasR)                         #パッケージの読み込み
out <- qAlign(in_f1, in_f2, splicedAlignment=F)#マッピングを行うqAlign関数を実行した結果をoutに格納
	

p86下:

list.files()
out
	

p87上:

out@alignments[,1]
	

p87の網掛け部分:

library(GenomicRanges)
tmpfname <- out@alignments[,1]
for(i in 1:length(tmpfname)){
  hoge <- readGAlignments(tmpfname[i])
  hoge <- as.data.frame(hoge)
  tmp <- hoge[, c("seqnames","start","end")]
  out_f <- sub(".bam", ".bed", tmpfname[i])
  write.table(tmp,out_f,sep="\t",append=F,quote=F,row.names=F,col.names=F)
}
	

p87下:

list.files()
	

p88上:

tmp
	

p88の網掛け部分:

作業ディレクトリ中にmapping_single1.txtref_genome.fa、およびsample_RNAseq1.faのみ存在するという前提です。

in_f1 <- "mapping_single1.txt"         #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param <- "-m 1 --best --strata -v 0"   #マッピング時のオプションを指定

library(QuasR)                         #パッケージの読み込み
out <- qAlign(in_f1, in_f2, splicedAlignment=F, alignmentParameter=param)
	

p88下:

hoge <- readGAlignments(out@alignments[,1])
as.data.frame(hoge)
out@alignmentParameter
	

p89上:

alignmentStats(out)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])
qQCReport(out, pdfFilename=out_f)
	

p89の網掛け部分:

ここではデスクトップ上にhumanというフォルダを作成し、そこで作業を行うという前提です。

「ファイル」−「ディレクトリの変更」でデスクトップ上のhumanに移動し以下をコピペ。

mapping_single3.txtと同じものができていると思います。

out_f <- "mapping_single3.txt"         #出力ファイル名を指定してout_fに格納
param_FN <- c("SRR002324.fastq.gz", "SRR002322.fastq.gz")#マップしたいファイル名を指定
param_SN <- c("Kidney", "Liver")       #任意のサンプル名を指定
out <- cbind(param_FN, param_SN)
colnames(out) <- c("FileName", "SampleName")
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)
	

p89下:

getwd()
	

p90上:

list.files()
	

p90の網掛け部分:

作業ディレクトリ中にp89で作成したmapping_single3.txt、p73で取得した SRR002324.fastq.gzとSRR002322.fastq.gzの計3つのファイルが デスクトップ上のhumanフォルダ中に存在するという前提です。

"BSgenome.Hsapiens.UCSC.hg19"の代わりに2013年12月にリリースされたGenome Reference Consortium GRCh38 ("BSgenome.Hsapiens.NCBI.GRCh38")を指定することもできます。 ただし、2014年4月16日以降にR ver. 3.1.0とBioconductor ver. 2.14をインストールしてあればの話です。

in_f1 <- "mapping_single3.txt"         #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param <- "-m 1 --best --strata -v 2"   #マッピング時のオプションを指定
### マッピング ###
library(QuasR)
library(Rsamtools)
time_s <- proc.time()                  #計算時間計測用(マッピング開始時間の記録)
out <- qAlign(in_f1, in_f2, splicedAlignment=F, alignmentParameter=param)
time_e <- proc.time()                  #計算時間計測用(マッピング終了時間の記録)
### QCレポート ###
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])
qQCReport(out, pdfFilename=out_f)
	

p90下:

alignmentStats(out)
time_e - time_s
	

書籍 | トランスクリプトーム解析 | 2.3.6 カウントデータ取得

シリーズ Useful R 第7巻 トランスクリプトーム解析のp91-97のRコードです。 ここでは2.3.5に引き続いてデスクトップ上のhumanというフォルダ上で作業を行うという前提です。 いくつかコメントしてありますが、2014年4月17日にR ver. 3.1.0とBioconductor ver. 2.14をインストールしたノートPCで確認した結果です。 インストールの仕方についてはRのインストールと起動をごらんください。 いくつかの数値の違いは、Rのバージョンというのもあるでしょうし、取得先のデータベース側のバージョンにもよると思います。

「ファイル」−「ディレクトリの変更」でデスクトップ上のhumanに移動し以下をコピペ。

p91の網掛け部分(上):

library(GenomicFeatures)
supportedUCSCtables()
	

p91の網掛け部分(中):

2014年4月18日に表示結果を確認したところ、ヒトゲノムの最新版は Genome Reference Consortium GRCh38で"hg38"として利用可能なようですね。

library(rtracklayer)
ucscGenomes()
	

p91の網掛け部分(下):

p90の網掛け部分で"BSgenome.Hsapiens.UCSC.hg19"の代わりに2013年12月にリリースされたGenome Reference Consortium GRCh38 ("BSgenome.Hsapiens.NCBI.GRCh38")を指定した場合は、"hg19"のところを"hg38"とすべきです。 5分程度かかります。

param1 <- "hg19"
param2 <- "ensGene"
library(GenomicFeatures)
txdb <- makeTranscriptDbFromUCSC(genome=param1, tablename=param2)
	

p91下:

2014年4月18日、R ver. 3.1.0での転写物は204,940種類、exonは584,914領域となっていました。

txdb
	

p92:

2014年4月18日、R ver. 3.1.0でのdim(count)実行結果は「60234 3」でした。7分程度かかります。

count <- qCount(out, txdb, reportLevel="gene")
head(count)
dim(count)
	

p92の網掛け部分:

SRA000299_ensgene.txt(約1.5MB)と同じか似たものができていると思います。

out_f <- "SRA000299_ensgene.txt"
tmp <- cbind(rownames(count), count)
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)
	

p93の網掛け部分:

R ver. 3.1.0とBioconductor ver. 2.14では、「エラー: 関数 "readGAlignments" を見つけることができませんでした」となりました。 readGAlignments関数はGenomicAlignmentsから提供されているので、 このライブラリも読み込むようにしてあります。2分程度かかります。

library(GenomicAlignments)             #書籍と違っているところ
library(GenomicRanges)
tmpfname <- out@alignments[,1]
kidney <- readGAlignments(tmpfname[1])
liver <- readGAlignments(tmpfname[2])
merge <- c(kidney, liver)
m <- reduce(granges(merge))
	

p93下:

書籍中では最後の列の列名が"ngap"となっていましたが、R ver. 3.1.0とBioconductor ver. 2.14では"njunc"に変わっていますね。

head(as.data.frame(kidney))
head(as.data.frame(liver))
	

p94上:

dim(as.data.frame(kidney))
dim(as.data.frame(liver))
dim(as.data.frame(m))
head(as.data.frame(m))
	

p94の網掛け部分:

1分強かかります。

tmpsname <- out@alignments[,2]
tmp <- as.data.frame(m)
for(i in 1:length(tmpfname)){
  tmpcount <- summarizeOverlaps(m, tmpfname[i])
  count <- assays(tmpcount)$counts
  colnames(count) <- tmpsname[i]
  tmp <- cbind(tmp, count)
}
	

p94下:

tmpsname
	

p95上:

head(tmp)
dim(tmp)
	

p95の網掛け部分:

SRA000299_granges.txt(約100MB)と同じか似たものができていると思います。3分程度かかります。

out_f <- "SRA000299_granges.txt"
tmpsname <- out@alignments[,2]
h <- as.data.frame(m)
tmp <- paste(h[,1],h[,2],h[,3],h[,4],h[,5], sep="_")
for(i in 1:length(tmpfname)){
  tmpcount <- summarizeOverlaps(m, tmpfname[i])
  count <- assays(tmpcount)$counts
  colnames(count) <- tmpsname[i]
  tmp <- cbind(tmp, count)
}
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)
	

p95下:

head(tmp)
dim(tmp)
	

p96の網掛け部分:

書籍中のコード内では50の色が灰色になっていませんでしたm(_ _)m

p90の網掛け部分で"BSgenome.Hsapiens.UCSC.hg19"の代わりに2013年12月にリリースされたGenome Reference Consortium GRCh38 ("BSgenome.Hsapiens.NCBI.GRCh38")を指定した場合は、ここも"BSgenome.Hsapiens.NCBI.GRCh38"とすべきです。

SRA000299_seq.fa(約240MB)と同じか似たものができていると思います。2分弱かかります。

out_f <- "SRA000299_seq.fa"
param <- "BSgenome.Hsapiens.UCSC.hg19"
library(param, character.only=T)
tmp <- ls(paste("package", param, sep=":"))
genome <- eval(parse(text=tmp))
### 配列取得およびファイル保存 ###
fasta <- getSeq(genome, m)
h <- as.data.frame(m)
names(fasta) <- paste(h[,1],h[,2],h[,3],h[,4],h[,5], sep="_")
writeXStringSet(fasta, file=out_f, format="fasta", width=50)
	

p96下:

head(fasta)
head(names(fasta))
head(width(fasta))
	

p97の網掛け部分:

p96で作成したSRA000299_seq.faが存在するという前提です。 Rのバージョンなどによって得られる配列が異なるのでリンク先のファイルは参考程度です。 SRA000299_GC.txt(約165MB)と同じか似たものができていると思います。1分弱で終わります。

in_f <- "SRA000299_seq.fa"
out_f <- "SRA000299_GC.txt"
library(Biostrings)
fasta <- readDNAStringSet(in_f, format="fasta")
### GC含量計算本番 ###
hoge <- alphabetFrequency(fasta)
CG <- rowSums(hoge[,2:3])
ACGT <- rowSums(hoge[,1:4])
GC_content <- CG/ACGT
tmp <- cbind(names(fasta), CG, ACGT, width(fasta), GC_content)
colnames(tmp) <- c("description", "CG", "ACGT", "Length", "GC_content")
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)
	

p97下:

head(tmp)
	

書籍 | トランスクリプトーム解析 | 3.3.1 解析目的別留意点

シリーズ Useful R 第7巻 トランスクリプトーム解析のp129-132のRコードです。 ここでは2.3.6に引き続いてデスクトップ上のhumanというフォルダ上で作業を行うという前提です。 いくつかコメントしてありますが、2014年4月17日にR ver. 3.1.0とBioconductor ver. 2.14をインストールしたノートPCで確認した結果です。 インストールの仕方についてはRのインストールと起動をごらんください。 いくつかの数値の違いは、Rのバージョンというのもあるでしょうし、取得先のデータベース側のバージョンにもよると思います。 したがって、「得られるファイル」や「入力ファイルのリンク先のもの」と「手持ちの入力ファイル」が多少異なっていても気にする必要はありません。

「ファイル」−「ディレクトリの変更」でデスクトップ上のhumanに移動し以下をコピペ。

p130の網掛け部分:

書籍中では作業ディレクトリがデスクトップ上の"human"という前提になっていますが、 p92で作成した配列長を含むカウントデータファイル(SRA000299_ensgene.txt; 約1.5MB)を置いてあるディレクトリであればどこでも構いません。

in_f <- "SRA000299_ensgene.txt"
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
### 配列長 vs. リード数の両対数プロット ###
plot(data[,1:2], log="xy", xlab="Length", ylab="Count")
grid(col="gray", lty="dotted")
	

p130:

head(data, n=4)
data <- data[data[,2] > 0, ]
head(data, n=4)
out <- lm(Kidney ~ width, data=log10(data))
abline(out, col="gray", lwd=2, lty="solid")
lines(lowess(data, f=0.2), col="gray", lwd=2, lty="dashed")
	

書籍 | トランスクリプトーム解析 | 3.3.2 データの正規化(基礎編)

シリーズ Useful R 第7巻 トランスクリプトーム解析のp132-137のRコードです。

「ファイル」−「ディレクトリの変更」でデスクトップ上のhumanに移動し以下をコピペ。

p132の網掛け部分:

書籍中では作業ディレクトリがデスクトップ上の"human"という前提になっていますが、 p92で作成した配列長を含むカウントデータファイル(SRA000299_ensgene.txt; 約1.5MB)を置いてあるディレクトリであればどこでも構いません。

in_f <- "SRA000299_ensgene.txt"
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
### 配列長lenとカウント情報countへの分割 ###
len <- data[,1]
count <- data[,-1]
### RPK補正のための遺伝子ごとの正規化係数nfの算出およびRPK正規化 ###
nf <- 1000/len
rpk <- sweep(count, 1, nf, "*")
	

p133:

head(count, n=3)
head(rpk, n=3)
	

p133の網掛け部分:

fig3-22.pngと同じか似たものができていると思います。

tmp <- cbind(len, rpk)
plot(tmp[,1:2], log="xy", xlab="Length", ylab="RPK")# 図3-22作成部分
grid(col="gray", lty="dotted")         # 図3-22作成部分(グリッド線を追加)
tmp <- tmp[tmp[,2] > 0, ]
out <- lm(Kidney ~ len, data=log10(tmp))
abline(out, col="gray", lwd=2, lty="solid")
lines(lowess(tmp[,1:2], f=0.2), col="gray", lwd=2, lty="dashed")
	

p134上:

head(count)
colSums(count)
	

p134の網掛け部分:

### RPM補正のためのサンプルごとの正規化係数nfの算出およびRPM正規化 ###
nf <- 1000000/colSums(count)
rpm <- sweep(count, 2, nf, "*")
	

p134下:

nf
head(rpm)
	

p135上:

library(edgeR)
rpm2 <- cpm(count)
head(rpm2, n=3)
	

p135の網掛け部分:

### (3-2)式の定数を総リード数の平均で与える総リード数補正 ###
nf <- mean(colSums(count))/colSums(count)
normalized <- sweep(count, 2, nf, "*")
	

p135下:

nf
head(normalized, n=4)
colSums(normalized)
	

p136の網掛け部分:

書籍中では作業ディレクトリがデスクトップ上の"human"という前提になっていますが、 p92で作成した配列長を含むカウントデータファイル(SRA000299_ensgene.txt; 約1.5MB)を置いてあるディレクトリであればどこでも構いません。

in_f <- "SRA000299_ensgene.txt"
out_f <- "SRA000299_rpkm.txt"
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
### 配列長lenとカウント情報countへの分割 ###
len <- data[,1]
count <- data[,-1]
### 遺伝子ごとの正規化係数nf_rpkの算出およびRPK正規化 ###
nf_rpk <- 1000/len
rpk <- sweep(count, 1, nf_rpk, "*")
### サンプルごとの正規化係数nf_rpmの算出およびrpkに対するRPM正規化 ###
nf_rpm <- 1000000/colSums(count)
rpkm <- sweep(rpk, 2, nf_rpm, "*")
### ファイルに保存 ###
tmp <- cbind(rownames(rpkm), rpkm)
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)
	

p136下:

head(rpkm, n=4)
	

書籍 | トランスクリプトーム解析 | 3.3.3 クラスタリング

シリーズ Useful R 第7巻 トランスクリプトーム解析のp137-145のRコードです。 ここではデスクトップ上にrecountというフォルダを作成し、そこで作業を行うという前提です。

「ファイル」−「ディレクトリの変更」でデスクトップ上のrecountに移動し以下をコピペ。

p138:

書籍中では作業ディレクトリがデスクトップ上の"recount"という前提になっていますが、 ReCountデータベース(Frazee et al., BMC Bioinformatics, 2011) から得られたbodymapのカウントデータファイル(bodymap_count_table.txt) およびラベル情報ファイル(bodymap_phenodata.txt)を置いてあるディレクトリであればどこでも構いません。

getwd()
list.files()
	

p138の網掛け部分:

in_f <- "bodymap_count_table.txt"
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
data.dist <- as.dist(1 - cor(data, method = "spearman"))
out <- hclust(data.dist, method = "average")
plot(out)                              # 図3-23作成部分
	

p138-139の網掛け部分:

書籍中では作業ディレクトリがデスクトップ上の"recount"という前提になっていますが、 ReCountデータベース(Frazee et al., BMC Bioinformatics, 2011) から得られたbodymapのカウントデータファイル(bodymap_count_table.txt; 約3.2MB) およびラベル情報ファイル(bodymap_phenodata.txt)を置いてあるディレクトリであればどこでも構いません。

in_f1 <- "bodymap_count_table.txt"
in_f2 <- "bodymap_phenodata.txt"
### ファイルの読み込み ###
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")
phenotype <- read.table(in_f2, header=TRUE, row.names=1, sep=" ", quote="")
### dataオブジェクトの列名を変更 ###
colnames(data) <- phenotype$tissue.type
### サンプル間クラスタリング ###
data.dist <- as.dist(1 - cor(data, method = "spearman"))
out <- hclust(data.dist, method = "average")
plot(out)                              # 図3-24作成部分
	

p139下:

log2(0)
dim(data)
sum(data == 0)
sum(data == 0)/(52580*19)
	

p140上:

obj <- rowSums(data) != 0
dim(data[obj,])

sum(data[obj,] == 0)
sum(data[obj,] == 0)/(13131*19)
	

p140の網掛け部分:

data.dist <- as.dist(1 - cor(data[obj,], method = "spearman"))
out <- hclust(data.dist, method = "average")
plot(out)                              # 図3-25作成部分
	

p140下:

hoge <- data == 0
apply(hoge, 2, sum)
	

p141:

hoge <- apply(data, 2, rank)
apply(hoge, 2, min)

hoge <- apply(data[obj,], 2, rank)
apply(hoge, 2, min)
	

p142上:

sum(rowSums(data) == 0)
sum(rowSums(data) == 1)
sum(rowSums(data) == 2)
	

p142の網掛け部分:

### RPM補正のためのサンプルごとの正規化係数nfの算出およびRPM正規化 ###
nf <- 1000000/colSums(data)
rpm <- sweep(data, 2, nf, "*")
### RPM補正値の総和が1以下の遺伝子を除去(1よりも大きいものを残す) ###
obj <- rowSums(data) > 1
dim(rpm[obj,])
	

p143:

colSums(data)
nf*19
	

p143-144の網掛け部分:

in_f1 <- "bodymap_count_table.txt"
in_f2 <- "bodymap_phenodata.txt"
### ファイルの読み込み ###
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")
phenotype <- read.table(in_f2, header=TRUE, row.names=1, sep=" ", quote="")
### dataオブジェクトの列名を変更 ###
colnames(data) <- phenotype$tissue.type
### フィルタリング(総カウント数が0でなく、ユニークな発現パターンをもつもののみ) ###
obj <- rowSums(data) != 0
hoge <- unique(data[obj,])
### クラスタリング ###
data.dist <- as.dist(1 - cor(hoge, method = "spearman"))
out <- hclust(data.dist, method = "average")
plot(out)
	

p144下:

dim(data[obj,])
dim(unique(data[obj,]))
dim(hoge)
dim(unique(data))

dim(unique(rpm))
length(intersect(rownames(unique(rpm)), rownames(unique(data))))
setequal(rownames(unique(rpm)), rownames(unique(data)))
length(setdiff(rownames(unique(rpm)), rownames(unique(data))))
length(union(rownames(unique(rpm)), rownames(unique(data))))
	

書籍 | トランスクリプトーム解析 | 3.3.4 各種プロット

シリーズ Useful R 第7巻 トランスクリプトーム解析のp145-165のRコードです。 ここではデスクトップ上にrecountというフォルダを作成し、そこで作業を行うという前提です。

「ファイル」−「ディレクトリの変更」でデスクトップ上のrecountに移動し以下をコピペ。

p145-146の網掛け部分:

書籍中では作業ディレクトリがデスクトップ上の"recount"という前提になっていますが、 ReCountデータベース(Frazee et al., BMC Bioinformatics, 2011) から得られたbodymapのカウントデータファイル(bodymap_count_table.txt; 約3.2MB) を置いてあるディレクトリであればどこでも構いません。

なお、灰色の水平線はM = 0.08で限りなく0に近い値なので、見えづらくなっています。

in_f <- "bodymap_count_table.txt"
### ファイルの読み込みと列名変更 ###
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
colnames(data)[11:13] <- c("mixture1", "mixture2", "mixture3")
### RPM正規化およびlog2変換 ###
nf <- 1000000/colSums(data)
rpm <- sweep(data, 2, nf, "*")
logged <- log(rpm, base=2)
### M-A plot ###
M <- logged$mixture2 - logged$mixture1
A <- (logged$mixture2 + logged$mixture1)/2
plot(A, M)                             # 図3-26作成部分
grid(col="gray", lty="dotted")         # 図3-26作成部分(グリッド線を追加)
abline(h=median(M, na.rm=TRUE), col="gray", lwd=1)
	

p146下:

行列dataの11列目と12列目がmixture1とmixture2だということがわかっているという前提です。

hoge <- data[,11:12]
head(hoge, n=4)
obj <- (hoge[,1] == 1) & (hoge[,2] >= 1)
sum(obj)
head(hoge[obj,], n=3)
	

p147:

書籍中ではcol="gray"となっていますが、図3-27は塗りつぶし黒三角になっていますので、正しくはcol="black"ですm(_ _)m

points(A[obj], M[obj], col="black", pch=17)# 図3-27作成部分。書籍と違っているところ
head(rpm[obj,11:12])
head(log2(rpm[obj,11:12]))
head(cbind(A[obj], M[obj]))
	

p148:

median(M, na.rm=TRUE)
2^median(M, na.rm=TRUE)
median(rpm$mixture2/rpm$mixture1, na.rm=TRUE)
median(data$mixture2/data$mixture1, na.rm=TRUE)

colSums(data[,11:13])
sum(data[,12])/sum(data[,11])
	

p149の網掛け部分:

in_f <- "bodymap_count_table.txt"
### ファイルの読み込みと列名変更 ###
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
colnames(data)[11:13] <- c("mixture1", "mixture2", "mixture3")
### log2変換 ###
logged <- log(data, base=2)
### M-A plot ###
M <- logged$mixture2 - logged$mixture1
A <- (logged$mixture2 + logged$mixture1)/2
plot(A, M)                             # 図3-28作成部分
grid(col="gray", lty="dotted")         # 図3-28作成部分(グリッド線を追加)
abline(h=median(M, na.rm=TRUE), col="gray", lwd=1)
	

p150:

median(M, na.rm=TRUE)
log2(median(data$mixture2/data$mixture1, na.rm=TRUE))
log2(1.96)
	

p150の網掛け部分:

in_f <- "bodymap_count_table.txt"
### ファイルの読み込みおよび列名変更 ###
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
colnames(data)[11:13] <- c("mixture1", "mixture2", "mixture3")
### サブセットの抽出、G1群を1、G2群を2としたベクトルの作成 ###
data <- data[,11:12]
data.cl <- c(1,2)
### TCCパッケージを用いたM-A plot ###
library(TCC)
tcc <- new("TCC", data, data.cl)
plot(tcc, normalize=T)                 # 図3-29作成部分
	

p151:

tcc
normalized <- getNormalizedData(tcc)
head(normalized, n=4)
summary(normalized)
	

p152:

colSums(normalized)

obj <- (normalized[,1] == 0) & (normalized[,2] > 0)
head(normalized[obj,], n=4)
dim(normalized[obj,])
nrow(normalized[obj,])
M <- log2(normalized[,2]) - log2(normalized[,1])
summary(M[obj])

obj1 <- normalized[,1] != 0
min(normalized[obj1,1])
normalized[!obj1,1] <- 1.426567
head(normalized[obj,], n=4)
	

p153:

「...必要性はない。」ではなく「...必要はない。」ですねm(_ _)m

M <- log2(normalized[,2]) - log2(normalized[,1])
summary(M[obj])
max(M[obj])
	

p154の網掛け部分:

書籍中では作業ディレクトリがデスクトップ上の"recount"という前提になっていますが、 ReCountデータベース(Frazee et al., BMC Bioinformatics, 2011) から得られたmaqcのカウントデータファイル(maqc_count_table.txt; 約2.3MB) を置いてあるディレクトリであればどこでも構いません。

in_f <- "maqc_count_table.txt"
### ファイルの読み込みとラベル情報の作成 ###
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
data.cl <- c(1,2)
### TCCパッケージを用いたM-A plot ###
library(TCC)
tcc <- new("TCC", data[,c(4,7)], data.cl)
plot(tcc, normalize=T, median.lines=T) # 図3-30作成部分
legend("bottomright",c("G1:brain4","G2:brain7"))# 図3-30作成部分
	

p155の網掛け部分:

in_f <- "maqc_count_table.txt"
### ファイルの読み込みとラベル情報の作成 ###
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
data.cl <- c(1,1,1,2,2,2)
### TCCパッケージを用いたM-A plot ###
library(TCC)
tcc <- new("TCC", data[,9:14], data.cl)
plot(tcc, normalize=T, median.lines=T, ylim=c(-3.2, 3.2))# 図3-31作成部分
legend("bottomright",c("G1:UHR2-4","G2:UHR5-7"))# 図3-31作成部分
	

p156の網掛け部分:

in_f <- "maqc_count_table.txt"
### ファイルの読み込みとラベル情報の作成 ###
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
data.cl <- c(1,1,1,2,2,2)
### TCCパッケージを用いたM-A plot ###
library(TCC)
tcc <- new("TCC", data[,c(1,2,3,8,9,10)], data.cl)
plot(tcc, normalize=T, median.lines=T, ylim=c(-11, 11))# 図3-32作成部分
legend("bottomright",c("G1:brain1-3","G2:UHR1-3"))# 図3-32作成部分
	

p157の網掛け部分:

in_f <- "maqc_count_table.txt"
### ファイルの読み込みとラベル情報の作成 ###
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
library(TCC) 
### M-A plot (brain1-7 対 UHR1-7) ###
tcc <- new("TCC", data, c(rep(1, 7), rep(2, 7)))
plot(tcc,normalize=T,ylim=c(-11,11),xlim=c(-4,15),col="black",ann=F)
### M-A plot (brain1-3 対 brain4-6) ###
par(new=T)
tcc <- new("TCC", data[,1:6], c(rep(1, 3), rep(2, 3)))
plot(tcc,normalize=T,ylim=c(-11,11),xlim=c(-4,15),col="gray",ann=F)
### M-A plot (UHR1-3 対 UHR4-6) ###
par(new=T)
tcc <- new("TCC", data[,8:13], c(rep(1, 3), rep(2, 3)))
plot(tcc,normalize=T,ylim=c(-11,11),xlim=c(-4,15),col="gray")
### Legend ###
legend("topright",c("b1-7 vs U1-7", "b1-3 vs b4-6", "U1-3 vs U4-6"), col=c("black", "gray", "gray"), pch=20)
	

p157-158の網掛け部分:

in_f <- "maqc_count_table.txt"
### ファイルの読み込みとラベル情報の変更 ###
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
colnames(data) <- c(rep("brain",7), rep("UHR",7))
### フィルタリング(総カウント数が0でなく、ユニークな発現パターンをもつもののみ) ###
obj <- rowSums(data) != 0
hoge <- unique(data[obj,])
### サンプル間クラスタリング ###
data.dist <- as.dist(1 - cor(hoge, method = "spearman"))
out <- hclust(data.dist, method = "average")
plot(out)                              # 図3-34作成部分
	

p157-158の網掛け部分を実行する別の手段(おまけ):

以下に示すように、TCC ver. 1.4.0以降で clusterSample関数を用いて実行することもできます。
in_f <- "maqc_count_table.txt"
### ファイルの読み込みとラベル情報の変更 ###
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
colnames(data) <- c(rep("brain",7), rep("UHR",7))
### TCCパッケージを用いたサンプル間クラスタリング ###
library(TCC)
out <- clusterSample(data, dist.method="spearman",
                        hclust.method="average", unique.pattern=TRUE)
plot(out)                              # 図3-34作成部分
	

p158の網掛け部分(下):

plot関数中のcex=.1は拡大率に関するものであり、大きさを標準の0.1倍にするという意味です。

in_f <- "maqc_count_table.txt"
### ファイルの読み込み、サブセットの抽出、総リード数補正 ###
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
data <- data[,1:7]
nf <- mean(colSums(data))/colSums(data)
hoge <- sweep(data, 2, nf, "*")
### 平均-分散プロット ###
MEAN <- apply(hoge, 1, mean)
VARIANCE <- apply(hoge, 1, var)
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,# 図3-35作成部分
     xlim=c(1e-01, 1e+05), ylim=c(1e-01, 1e+05), col="black")# 図3-35作成部分
grid(col="gray", lty="dotted")         # 図3-35作成部分
abline(a=0, b=1, col="gray")           # 図3-35作成部分
	

p159:

set.seed(1000)
ransuu <- rpois(n=8, lambda=100)
ransuu
mean(ransuu)
var(ransuu)
ransuu <- rpois(n=10000, lambda=100)
mean(ransuu)
	

p160:

rpois関数実行結果の数値が若干異なっていますが、 基本的に乱数生成結果なので気にする必要はありません。

var(ransuu)
head(MEAN)
length(MEAN)
rpois(n=7, lambda=MEAN[1])
rpois(n=7, lambda=MEAN[2])
rpois(n=7, lambda=MEAN[3])
	

p160-161の網掛け部分:

plot関数中のlog="xy"は、x軸y軸ともに対数でプロットするという指令です。

### 乱数行列の作成 ###
simulated <- NULL
for(i in 1:length(MEAN)){
    simulated <- rbind(simulated, rpois(n=7, lambda=MEAN[i]))
}
### 平均-分散プロット ###
MEAN <- apply(simulated, 1, mean)
VARIANCE <- apply(simulated, 1, var)
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,# 図3-36作成部分
     xlim=c(1e-01, 1e+05), ylim=c(1e-01, 1e+05), col="black")# 図3-36作成部分
grid(col="gray", lty="dotted")         # 図3-36作成部分
abline(a=0, b=1, col="gray")           # 図3-36作成部分
	

p161-162の網掛け部分:

plot関数中のlog="xy"は、x軸y軸ともに対数でプロットするという指令です。図3-37です。

in_f <- "maqc_count_table.txt"
### ファイルの読み込み、総リード数補正 ###
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
nf <- mean(colSums(data))/colSums(data)
hoge <- sweep(data, 2, nf, "*")
### 平均-分散プロット(brain群とUHR群のデータを一緒にして計算) ###
MEAN <- apply(hoge, 1, mean)
VARIANCE <- apply(hoge, 1, var)
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,
     xlim=c(1e-01, 1e+07), ylim=c(1e-01, 1e+07), col="black")
### 平均-分散プロット(brain群のみのデータで計算) ###
par(new=T)
MEAN <- apply(hoge[,1:7], 1, mean)
VARIANCE <- apply(hoge[,1:7], 1, var)
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,
     xlim=c(1e-01, 1e+07), ylim=c(1e-01, 1e+07), col="gray")
### Legendなど ###
grid(col="gray", lty="dotted")
abline(a=0, b=1, col="gray")
legend("bottomright",c("brain+UHR", "brain only"), 
col=c("black", "gray"), pch=20)
	

p162-163の網掛け部分:

書籍中では作業ディレクトリがデスクトップ上の"recount"という前提になっていますが、 ReCountデータベース(Frazee et al., BMC Bioinformatics, 2011) から得られたgiladのカウントデータファイル(gilad_count_table.txt; 約1.5MB) を置いてあるディレクトリであればどこでも構いません。図3-38です。

in_f <- "gilad_count_table.txt"
### ファイルの読み込み、サブセットの抽出、総リード数補正 ###
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
data <- data[,1:3]
nf <- mean(colSums(data))/colSums(data)
hoge <- sweep(data, 2, nf, "*")
### 平均-分散プロット ###
MEAN <- apply(hoge, 1, mean)
VARIANCE <- apply(hoge, 1, var)
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,
     xlim=c(1e-01, 1e+07), ylim=c(1e-01, 1e+07), col="black")
grid(col="gray", lty="dotted")
abline(a=0, b=1, col="gray")
	

p165の網掛け部分:

図3-39です。

in_f <- "gilad_count_table.txt"
### ファイルの読み込み、総リード数補正 ###
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
nf <- mean(colSums(data))/colSums(data)
hoge <- sweep(data, 2, nf, "*")
### 平均-分散プロット(male群とfemale群のデータを一緒にして計算) ###
MEAN <- apply(hoge, 1, mean)
VARIANCE <- apply(hoge, 1, var)
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,
     xlim=c(1e-01, 1e+07), ylim=c(1e-01, 1e+07), col="black")
### 平均-分散プロット(female群のみのデータで計算) ###
par(new=T)
MEAN <- apply(hoge[,4:6], 1, mean)
VARIANCE <- apply(hoge[,4:6], 1, var)
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,
     xlim=c(1e-01, 1e+07), ylim=c(1e-01, 1e+07), col="gray")
### Legendなど ###
grid(col="gray", lty="dotted")
abline(a=0, b=1, col="gray")
legend("bottomright",c("male+female", "female only"), col=c("black", "gray"), pch=20)
	

書籍 | トランスクリプトーム解析 | 4.3.1 シミュレーションデータ(負の二項分布)

シリーズ Useful R 第7巻 トランスクリプトーム解析のp188-196のRコードです。

「ファイル」−「ディレクトリの変更」でデスクトップに移動し以下をコピペ。

p189:

「1setwd("C:/Users/kadota/Desktop/")」とsetwd関数の前に1が入っていますが間違いですm(_ _)m。 原稿校正時に混入したものと思われます。

set.seed(100)
	

p189-190の網掛け部分:

out_f <- "hypoData1.txt"               #出力ファイル名を指定してout_fに格納
### シミュレーションデータの作成 ###
library(TCC)
tcc <- simulateReadCounts(Ngene = 12500, PDEG = 0.32, 
                   DEG.assign=c(0.5, 0.5), replicates=c(5, 5))
data <- tcc$count
### ファイルに保存 ###
tmp <- cbind(rownames(data), data)
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)
	

p190:

dim(data)

head(data, n=3)

set.seed(100)
	

p190-191の網掛け部分:

図4-7です。

out_f <- "fig4-7.png"                  #出力ファイル名を指定してout_fに格納
param_fig <- c(400, 350)               #ファイル出力時の横幅と縦幅を指定
### シミュレーションデータの作成 ###
library(TCC)
tcc <- simulateReadCounts(Ngene = 12500, PDEG = 0.32, DEG.assign=c(0.5, 0.5),
                   DEG.foldchange=c(4, 4), replicates=c(5, 5))
### ファイルに保存 ###
png(out_f, width=param_fig[1], height=param_fig[2])
plotFCPseudocolor(tcc)
dev.off()
	

p191:

str(tcc$simulation)
dim(tcc$simulation$DEG.foldchange)
head(tcc$simulation$DEG.foldchange, n=3)
	

p192:

set.seed(100)
	

p192の網掛け部分:

図4-8です。

out_f <- "fig4-8.png"                  #出力ファイル名を指定してout_fに格納
param_fig <- c(450, 350)               #ファイル出力時の横幅と縦幅を指定
### シミュレーションデータの作成 ###
library(TCC)
tcc <- simulateReadCounts(Ngene = 12500, PDEG = 0.32, DEG.assign=c(0.5, 0.5),
                   DEG.foldchange=c(4, 4), replicates=c(5, 5))
### ファイルに保存 ###
png(out_f, width=param_fig[1], height=param_fig[2])
plot(tcc, normalize=TRUE, median.lines=TRUE)
### Legend ###
legend("bottomright",c("nonDEG","DEG(G1)","DEG(G2)"), pch=c(20,20,20),
      col=c("black","blue","red"))
dev.off()
	

p193:

colSums(tcc$count)
mean(colSums(tcc$count))
normalized <- getNormalizedData(tcc)
colSums(normalized)

data.cl <- tcc$group$group
logged <- log2(normalized[1:2000,])
mean_G1 <- apply(as.matrix(logged[,data.cl==1]), 1, mean)
mean_G2 <- apply(as.matrix(logged[,data.cl==2]), 1, mean)
M <- mean_G2 - mean_G1
length(M)
M <- M[is.finite(M)]
length(M)
median(M)

set.seed(100)
	

p194の網掛け部分(上):

図4-9です。

out_f <- "fig4-9.png"                  #出力ファイル名を指定してout_fに格納
param_fig <- c(400, 350)               #ファイル出力時の横幅と縦幅を指定
### シミュレーションデータの作成 ###
library(TCC)
tcc <- simulateReadCounts(Ngene = 12500, PDEG = 0.32, DEG.assign=c(1.0, 0.0),
                   DEG.foldchange=c(4, 4), replicates=c(5, 5))
### ファイルに保存 ###
png(out_f, width=param_fig[1], height=param_fig[2])
plotFCPseudocolor(tcc)
dev.off()
	

p194(中):

set.seed(100)
	

p194の網掛け部分(下):

図4-10です。

out_f <- "fig4-10.png"                 #出力ファイル名を指定してout_fに格納
param_fig <- c(450, 350)               #ファイル出力時の横幅と縦幅を指定
### シミュレーションデータの作成 ###
library(TCC)
tcc <- simulateReadCounts(Ngene = 12500, PDEG = 0.32, DEG.assign=c(1.0, 0.0),
                   DEG.foldchange=c(4, 4), replicates=c(5, 5))
### ファイルに保存 ###
png(out_f, width=param_fig[1], height=param_fig[2])
plot(tcc, normalize=TRUE, median.lines=TRUE)
### Legend ###
legend("bottomright",c("nonDEG","DEG(G1)","DEG(G2)"), pch=c(20,20,20), col=c("black","blue","red"))
dev.off()
	

p195:

書籍中のtcc実行結果では、Count:のところは表示させていません。

colSums(tcc$count)
tcc
	

書籍 | トランスクリプトーム解析 | 4.3.2 データの正規化(応用編)

シリーズ Useful R 第7巻 トランスクリプトーム解析のp196-201のRコードです。

「ファイル」−「ディレクトリの変更」でデスクトップに移動し以下をコピペ。

p196:

set.seed(100)
	

p196-197の網掛け部分:

図4-11です。

out_f <- "fig4-11.png"                 #出力ファイル名を指定してout_fに格納
param_fig <- c(450, 350)               #ファイル出力時の横幅と縦幅を指定
### シミュレーションデータの作成 ###
library(TCC)
tcc <- simulateReadCounts(Ngene = 12500, PDEG = 0.32, DEG.assign=c(1.0, 0.0),
                    DEG.foldchange=c(4, 4), replicates=c(5, 5))
### TMM正規化 ###
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)
### ファイルに保存 ###
png(out_f, width=param_fig[1], height=param_fig[2])
plot(tcc, normalize=TRUE, median.lines=TRUE)
### Legend ###
legend("bottomright",c("nonDEG","DEG(G1)","DEG(G2)"), pch=c(20,20,20),
      col=c("black","blue","red"))
dev.off()
	

p197:

tcc
	

p198:

2092584 * 0.8391182

data.cl <- tcc$group$group
data <- tcc$count
	

p198の網掛け部分:

図4-12です。

out_f <- "fig4-12.png"                 #出力ファイル名を指定してout_fに格納
param_fig <- c(450, 350)               #ファイル出力時の横幅と縦幅を指定
### TMM正規化 ###
library(edgeR)
d <- DGEList(counts=data, group=data.cl)
d <- calcNormFactors(d)
### ファイルに保存 ###
png(out_f, width=param_fig[1], height=param_fig[2])
plotSmear(d)
dev.off()
	

p200:

set.seed(100)
	

p200の網掛け部分:

図4-13です。

out_f <- "fig4-13.png"                 #出力ファイル名を指定してout_fに格納
param_fig <- c(450, 350)               #ファイル出力時の横幅と縦幅を指定
### シミュレーションデータの作成 ###
library(TCC)
tcc <- simulateReadCounts(Ngene = 12500, PDEG = 0.32, DEG.assign=c(1.0, 0.0),
DEG.foldchange=c(4, 4), replicates=c(5, 5))
### iDEGES/edgeR正規化 ###
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",
                       iteration=3, FDR=0.1, floorPDEG=0.05)
### ファイルに保存 ###
png(out_f, width=param_fig[1], height=param_fig[2])
plot(tcc, normalize=TRUE, median.lines=TRUE)
### Legend ###
legend("bottomright",c("nonDEG","DEG(G1)","DEG(G2)"), pch=c(20,20,20),
       col=c("black","blue","red"))
dev.off()
	

書籍 | トランスクリプトーム解析 | 4.3.3 2群間比較

シリーズ Useful R 第7巻 トランスクリプトーム解析のp201-208のRコードです。

「ファイル」−「ディレクトリの変更」でデスクトップに移動し以下をコピペ。

p201:

set.seed(100)
	

p201-202の網掛け部分:

out_f <- "res_biased_TCC_DEG.txt"      #出力ファイル名を指定してout_fに格納
param_FDR <- 0.05                      #DEG検出時のFDR閾値を指定
### シミュレーションデータの作成 ###
library(TCC)
tcc <- simulateReadCounts(Ngene = 12500, PDEG = 0.32, DEG.assign=c(1.0, 0.0),
                   DEG.foldchange=c(4, 4), replicates=c(5, 5))
### DEG検出(iDEGES/edgeR-edgeR) ###
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",
                       iteration=3, FDR=0.1, floorPDEG=0.05)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)
result <- getResult(tcc, sort=FALSE)
### ファイルに保存 ###
tmp <- cbind(rownames(tcc$count), tcc$count, result)
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)
	

p202:

2014年4月27日、R ver. 3.1.0で実行したときには入力データが同じ場合でも若干得られる結果が変わっていました(2864個から2865個など)が、 内部的に利用しているedgeRのデフォルトオプションの変更など結果が異なりうる様々な要因が存在しますので、 あまり気にする必要はありません。

head(result)
sum(result$q.value < 0.05)
sum(result$estimatedDEG)
head(p.adjust(result$p.value, method="BH"), n=4)

tcc$count["gene_96",]
	

p203:

result[96,]
	

p203の網掛け部分:

図4-14です。p201の結果を保持しているという前提です。

out_f <- "fig4-14.png"                 #出力ファイル名を指定してout_fに格納
param_FDR <- 0.05                      #DEG検出時のFDR閾値を指定
param_fig <- c(450, 350)               #ファイル出力時の横幅と縦幅を指定
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])
plot(tcc, FDR=param_FDR, col=c("black","gray"))
### Legend ###
legend("topright", c("non-DEG",paste("DEG(FDR<", param_FDR, ")", sep="")),
       col=c("black", "gray"), pch=16)
dev.off()
	

p204:

head(tcc$simulation$trueDEG)
table(tcc$simulation$trueDEG)
head(rank(tcc$stat$p.value))
	

p204の網掛け部分:

図4-15です。p201の結果を保持しているという前提です。 ROC パッケージで提供されているrocdemo.sca関数をlibrary(TCC)のみで利用できているのは、 TCCパッケージ読み込み時に内部的に用いる他のパッケージも同時に読み込んでいるからです。 これがTCCリンク先のDetailsのところの 「Depends: ..., DESeq, DESeq2, edgeR, baySeq, ROC」の意味です。

out_f <- "fig4-15.png"                 #出力ファイル名を指定してout_fに格納
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])
roc <- rocdemo.sca(truth = as.numeric(tcc$simulation$trueDEG != 0),
           data = -rank(tcc$stat$p.value))
plot(roc, xlab="1-specificity", ylab="sensitivity", cex.lab=1.4)
grid(col="gray", lty="dotted")
dev.off()
	

p205:

calcAUCValue(tcc)
AUC(roc)

set.seed(100)
	

p205-206の網掛け部分:

書籍中のコードのままでは、estimateDE関数実行部分で存在しないparam_FDRを与えているためエラーが出ます。 そのため、以下ではFDR=param_FDRというオプション部分を削除しています。 なお、該当部分は結果にはなんら影響しません。理由はFDRはDEGと判定する閾値を与えているだけであり、 ここで行っているのは閾値とは関係ない発現変動順にランキングした結果のAUC値で評価しているからです。

### シミュレーションデータ生成 ###
library(TCC)
tcc <- simulateReadCounts(Ngene = 12500, PDEG = 0.32, DEG.assign=c(1.0, 0.0),
DEG.foldchange=c(4, 4), replicates=c(5, 5))
### TCC中のiDEGES/edgeR-edgeRによる解析 ###
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",
                       iteration=3, FDR=0.1, floorPDEG=0.05)
tcc <- estimateDE(tcc, test.method="edger")#書籍と違っているところ
AUC_TCC <- calcAUCValue(tcc)
### samr中のSAMseq法による解析 ###
library(samr)
data <- tcc$count
data.cl <- tcc$group$group
out <- SAMseq(data, data.cl, resp.type="Two class unpaired")
p.value <- samr.pvalues.from.perms(out$samr.obj$tt, out$samr.obj$ttstar)
roc <- rocdemo.sca(truth = as.numeric(tcc$simulation$trueDEG != 0),
           data = -rank(p.value))
AUC_SAMseq <- AUC(roc)
	

p206:

AUC_TCC
AUC_SAMseq

set.seed(100)
	

p206の網掛け部分(下):

out_f <- "hypoData2.txt"               #出力ファイル名を指定してout_fに格納
### シミュレーションデータ生成 ###
library(TCC)
tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.20, DEG.foldchange=c(5, 3),
                   DEG.assign=c(0.8, 0.2), replicates=c(1, 1))
data <- tcc$count
### ファイルに保存 ###
tmp <- cbind(rownames(data), data)
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)
	

p206下:

dim(data)
head(data, n=3)
	

p207上:

1行ずつ独立に実行しましょう。plotFCPseudocolor(tcc)実行時に 「 以下にエラー plot.new() : figure margins too large」 となってしまったら、R Graphics画面の横幅を広げてからもう一度トライしましょう。

plot(tcc, normalize=TRUE)

plotFCPseudocolor(tcc)
	

p207の網掛け部分:

p206で作成したhypoData2.txtが入力です。

in_f <- "hypoData2.txt"                #入力ファイル名を指定してin_fに格納
out_f <- "res_hypoData2.txt"           #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のFDR閾値を指定
### 入力ファイルの読み込み、TCCクラスオブジェクトの作成 ###
library(TCC)
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
data.cl <- c(rep(1, param_G1), rep(2, param_G2))
tcc <- new("TCC", data, data.cl)
### DEG検出(iDEGES/DESeq-DESeq) ###
tcc <- calcNormFactors(tcc, norm.method="deseq", test.method="deseq",
                       iteration=3, FDR=0.1, floorPDEG=0.05)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR)
result <- getResult(tcc, sort=FALSE)
### ファイルに保存 ###
tmp <- cbind(rownames(tcc$count), tcc$count, result)
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)
	

p207下:

head(result)
	

p208:

sum(result$estimatedDEG == 1)
sum(result$q.value < 0.05)
sum(result$q.value < 0.50)
	

p208の網掛け部分:

p207に引き続きて行うことを前提としています。図4-16です。

out_f <- "fig4-16.png"                 #出力ファイル名を指定してout_fに格納
param_DEG <- 500                       #上位遺伝子数を指定
param_fig <- c(450, 350)               #ファイル出力時の横幅と縦幅を指定
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])
obj <- as.numeric(tcc$stat$rank <= param_DEG) + 1
plot(tcc, col.tag=obj, col=c("black","gray"))
legend("topright", c("non-DEG",paste("DEG(Top", param_DEG, ")", sep="")),
       col=c("black", "gray"), pch=16)
dev.off()
	

書籍 | トランスクリプトーム解析 | 4.3.4 他の実験デザイン(3群間)

シリーズ Useful R 第7巻 トランスクリプトーム解析のp209-213のRコードです。

「ファイル」−「ディレクトリの変更」でデスクトップに移動し以下をコピペ。

p209:

set.seed(100)と網掛け部分の間に「dim(data)とhead(data, n=3)」が混入しています。 これは本来網掛け部分実行後に得られるものなので間違いですm(_ _)m

set.seed(100)
	

p209の網掛け部分:

図4-17です。hypoData3.txtfig4-17.png が作成されます。

out_f1 <- "hypoData3.txt"              #出力ファイル名を指定してout_f1に格納
out_f2 <- "fig4-17.png"                #出力ファイル名を指定してout_f2に格納
### シミュレーションデータ生成 ###
library(TCC)
tcc <- simulateReadCounts(Ngene = 10012, PDEG = 0.28, replicates=c(2,3,2),
              DEG.assign=c(0.6,0.15,0.25), DEG.foldchange=c(5,3,0.4))
data <- tcc$count
### ファイルに保存(カウントデータ) ###
tmp <- cbind(rownames(data), data)
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)
### ファイルに保存(pseudo-colorイメージ) ###
png(out_f2, width=450, height=350)
plotFCPseudocolor(tcc)
dev.off()
	

p209下:

dim(data)
	

p210上:

head(data, n=3)
	

p210の網掛け部分:

p209で作成したhypoData3.txtが入力です。

in_f <- "hypoData3.txt"                #入力ファイル名を指定してin_fに格納
out_f <- "res_hypoData3.txt"           #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 2                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のFDR閾値を指定
### 入力ファイルの読み込み、TCCクラスオブジェクトの作成 ###
library(TCC)
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")
data.cl <- c(rep(1, param_G1), rep(2, param_G2) , rep(3, param_G3))
tcc <- new("TCC", data, data.cl)
### DEG検出(iDEGES/edgeR-edgeR) ###
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",
                       iteration=3, FDR=0.1, floorPDEG=0.05)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)
result <- getResult(tcc, sort=FALSE)
### ファイルに保存 ###
tmp <- cbind(rownames(tcc$count), tcc$count, result)
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)
	

p211:

2014年4月28日、R ver. 3.1.0で実行したときには入力データが同じ場合でも若干得られる結果が変わっていましたが、 内部的に利用しているedgeRのデフォルトオプションの変更など結果が異なりうる様々な要因が存在しますので、 あまり気にする必要はありません。

head(result)

sum(tcc$stat$q.value < 0.05)
sum(tcc$stat$q.value < 0.10)

set.seed(100)
	

p211-212の網掛け部分:

### シミュレーションデータ生成 ###
library(TCC)
tcc <- simulateReadCounts(Ngene = 10012, PDEG = 0.28, replicates=c(2,3,2),
              DEG.assign=c(0.6,0.15,0.25), DEG.foldchange=c(5,3,0.4))
### TCC中のiDEGES/edgeR-edgeRによる解析 ###
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",
                      iteration=3, FDR=0.1, floorPDEG=0.05)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)
roc_tcc <- rocdemo.sca(truth = as.numeric(tcc$simulation$trueDEG != 0),
                      data = -tcc$stat$rank)
AUC_tcc <- calcAUCValue(tcc)
### edgeRによる解析(TCC中の関数利用) ###
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",
                      iteration=0, FDR=0.1, floorPDEG=0.05)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)
roc_edger <- rocdemo.sca(truth = as.numeric(tcc$simulation$trueDEG != 0),
                      data = -tcc$stat$rank)
AUC_edger <- calcAUCValue(tcc)
	

p212:

AUC_tcc
AUC_edger
	

p212の網掛け部分(下):

図4-18です。先にedgeRのROC曲線を描いたのち、TCCの結果を描いています。

out_f <- "fig4-18.png"                 #出力ファイル名を指定してout_fに格納
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])
plot(roc_edger, col="gray", ann=F)
par(new=T)
plot(roc_tcc, col="black", xlab="1-specificity", ylab="sensitivity", cex.lab=1.3)
grid(col="gray", lty="dotted")
legend("bottomright", c("TCC","edgeR"),col=c("black","gray"), lty="solid")
dev.off()
	

書籍 | 日本乳酸菌学会誌 | 第一回イントロダクション

日本乳酸菌学会誌の第一回分です。

要約:

情報収集先:

データ解析環境(Linux):

データ解析環境(R):

イントロ | 一般 | ランダムに行を抽出

例えばタブ区切りテキストファイルのannotation.txtが手元にあり、指定した数の行を(非復元抽出で)ランダムに抽出するやり方を示します。

Linux (UNIX)のgrepコマンドのようなものです。perlのハッシュのようなものです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. タブ区切りテキストファイル(annotation.txt)からランダムに5行分を抽出したい場合:

ヘッダー行はヘッダー行として残す場合のやり方です。

in_f <- "annotation.txt"               #入力ファイル名(目的のタブ区切りテキストファイル)を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param <- 5                             #in_f1で読み込む目的のファイルの何列目のデータに対してサーチしたいかを指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
hoge <- sample(1:nrow(data), param)    #入力ファイルの行数までの整数の中からparamで指定した数だけ非復元抽出した結果をhogeに格納
out <- data[sort(hoge),]               #hogeで指定した行のみ抽出した結果をoutに格納
dim(out)                               #オブジェクトoutの行数と列数を表示

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

2. タブ区切りテキストファイル(annotation.txt)からランダムに5行分を抽出したい場合:

ヘッダー行がない場合のやり方です。

in_f <- "annotation.txt"               #入力ファイル名(目的のタブ区切りテキストファイル)を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param <- 5                             #in_f1で読み込む目的のファイルの何列目のデータに対してサーチしたいかを指定

#入力ファイルの読み込み
data <- read.table(in_f, header=FALSE, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
hoge <- sample(1:nrow(data), param)    #入力ファイルの行数までの整数の中からparamで指定した数だけ非復元抽出した結果をhogeに格納
out <- data[sort(hoge),]               #hogeで指定した行のみ抽出した結果をoutに格納
dim(out)                               #オブジェクトoutの行数と列数を表示

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#outの中身を指定したファイル名で保存
	

イントロ | 一般 | 任意の文字列を行の最初に挿入

タブ区切りのヒト遺伝子アノテーションファイル(human_annotation_sub.gtf)が手元にあり、 これを入力としてQuasRパッケージを用いてマッピング結果ファイルをもとにカウントデータを得ようと思ってもエラーに遭遇することが多いです。 この原因の一つとして、GFF/GTF形式のアノテーションファイル中の文字列がゲノム情報中の文字列と異なっていることが挙げられます。 例えば、ゲノム配列中の染色体名は"chr1", "chr2", ...などという記述がほとんどですが、これに対応するGFF/GTFの一列目の文字列が"1", "2", ...となっています。

そこでここでは、文字列を一致させるべく、タブ区切りのヒト遺伝子アノテーションファイルの左端に"chr"を挿入するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. GTFファイル(human_annotation_sub.gtf)の各行の左端に"chr"を挿入したい場合:

ヘッダー行がない場合のやり方です。

in_f <- "human_annotation_sub.gtf"     #入力ファイル名(目的のタブ区切りテキストファイル)を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param <- "chr"                         #挿入したい文字列を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=FALSE, sep="\t", quote="")#in_fで指定したファイルの読み込み

#本番(文字列挿入)
data[,1] <- paste(param, data[,1], sep="")#入力ファイルの行数までの整数の中からparamで指定した数だけ非復元抽出した結果をobjに格納

#ファイルに保存
write.table(data, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#dataの中身を指定したファイル名で保存
	

イントロ | 一般 | 任意のキーワードを含む行を抽出(基礎)

例えばタブ区切りテキストファイルが手元にあり、この中からリストファイル中の文字列を含む行を抽出するやり方を示します。 Linux (UNIX)のgrepコマンドのようなものであり、perlのハッシュのようなものです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 目的のタブ区切りテキストファイル(annotation.txt)中の第1列目をキーとして、リストファイル(genelist1.txt)中のものが含まれる行全体を出力したい場合:

in_f1 <- "annotation.txt"              #入力ファイル名を指定してin_f1に格納(アノテーションファイル)
in_f2 <- "genelist1.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param <- 1                             #アノテーションファイル中の検索したい列番号を指定

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, sep="\t", quote="")#in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
obj <- is.element(as.character(data[,param]), keywords)#条件を満たすかどうかを判定した結果をobjに格納
out <- data[obj,]                      #objがTRUEとなる行のみ抽出した結果をoutに格納
dim(out)                               #オブジェクトoutの行数と列数を表示

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

2. 目的のタブ区切りテキストファイル(annotation.txt)中の第1列目をキーとして、リストファイル(genelist2.txt)中のものが含まれる行全体を出力したい場合:

in_f1 <- "annotation.txt"              #入力ファイル名を指定してin_f1に格納(アノテーションファイル)
in_f2 <- "genelist2.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param <- 1                             #アノテーションファイル中の検索したい列番号を指定

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, sep="\t", quote="")#in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み

#本番
obj <- is.element(as.character(data[,param]), keywords)#条件を満たすかどうかを判定した結果をobjに格納
out <- data[obj,]                      #objがTRUEとなる行のみ抽出した結果をoutに格納

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

3. 目的のタブ区切りテキストファイル(annotation.txt)中の第3列目をキーとして、リストファイル(genelist2.txt)中のものが含まれる行全体を出力したい場合:

in_f1 <- "annotation.txt"              #入力ファイル名を指定してin_f1に格納(アノテーションファイル)
in_f2 <- "genelist2.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param <- 3                             #アノテーションファイル中の検索したい列番号を指定

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, sep="\t", quote="")#in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み

#本番
obj <- is.element(as.character(data[,param]), keywords)#条件を満たすかどうかを判定した結果をobjに格納
out <- data[obj,]                      #objがTRUEとなる行のみ抽出した結果をoutに格納

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

4. 目的のタブ区切りテキストファイル(annotation.txt)に対して、リストファイル(genelist1.txt)中のものが含まれる行全体を出力したい場合:

in_f1 <- "annotation.txt"              #入力ファイル名を指定してin_f1に格納(アノテーションファイル)
in_f2 <- "genelist1.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- readLines(in_f1)               #in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み

#本番(リストファイル中の要素数分だけループを回して、要素中の文字列と一致する行番号情報を得て、その行のみ出力)
keywords <- unique(keywords)           #リストファイル中の要素が重複している可能性があるので、重複なしの状態にしている
hoge <- NULL                           #最終的に欲しい行番号情報を格納するためのプレースホルダ
for(i in 1:length(keywords)){          #length(keywords)で表現される要素数分だけループを回す
    hoge <- c(hoge, c(grep(keywords[i], data)))#リストファイル中の要素ごとに検索をかけて要素中の文字列と一致する行番号情報をhogeにどんどん格納している
    if(i%%10 == 0) cat(i, "/", length(keywords), "finished\n")#進行状況を表示させてるだけ
}
hoge <- unique(hoge)                   #得られるhogeベクトルは重複している可能性があるので重複を除いている
out <- data[hoge]                      #hogeで指定したもののみ抽出した結果をoutに格納(dataオブジェクトは行列ではないことに注意!)

#ファイルに保存
writeLines(out, out_f)                 #outの中身を指定したファイル名で保存

#以下は(こんなこともできますという)おまけ
#リストファイル中にあるキーワードごとに、それが見つかった行番号情報を出力
out_f2 <- "hoge4_hoge.txt"             #出力ファイル名を指定してout_fに格納
hoge2 <- NULL                          #欲しい行番号情報をリスト形式で格納するためのプレースホルダ
for(i in 1:length(keywords)){          #length(keywords)で表現される要素数分だけループを回す
    hoge2 <- c(hoge2, list(grep(keywords[i], data)))#リストファイル中の要素ごとに検索をかけて要素中の文字列と一致する行番号情報を(キーワードごとに取り扱うため)リスト形式でhoge2にどんどん格納している
}
hoge3 <- sapply(hoge2, paste, collapse="\t")#hoge2はリスト形式になっているので、リストの各成分中の要素を"\t"で結合し、成分数が要素数になるようなベクトルhoge3を作成している(出力に用いるwriteLines関数がベクトル中の一要素を一行で出力する仕様になっている。それに合わせるための小細工です)
hoge4 <- paste(keywords, hoge3, sep="\t")#一番左側が検索に用いたリストファイル中のキーワードになるようなベクトルhoge4を作成
writeLines(hoge4, out_f2)              #hoge4の中身を指定したファイル名で保存
	

5. 目的のタブ区切りテキストファイル(annotation.txt)中の第1列目をキーとして、リストファイル(genelist1.txt)中のものに対応するannotation.txt中の第4列目(subcellular_location列)のみを出力する場合:

in_f1 <- "annotation.txt"              #入力ファイル名を指定してin_f1に格納(アノテーションファイル)
in_f2 <- "genelist1.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 1                            #アノテーションファイル中の検索したい列番号を指定
param2 <- 4                            #出力したい列番号を指定

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, sep="\t", quote="")#in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み

#本番
obj <- is.element(as.character(data[,param1]), keywords)#条件を満たすかどうかを判定した結果をobjに格納
out <- data[obj,param2]                #objがTRUEとなる行の(param2)列目の情報のみ抽出した結果をoutに格納

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

6. 4と同じことをsapply関数を用いてやる場合:

in_f1 <- "annotation.txt"              #入力ファイル名を指定してin_f1に格納(アノテーションファイル)
in_f2 <- "genelist1.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- readLines(in_f1)               #in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み

#本番(リストファイル中の要素一つ一つに対して、要素中の文字列と一致する行番号情報を得て、その行のみ出力)
keywords <- unique(keywords)           #リストファイル中の要素が重複している可能性があるので、重複なしの状態にしている
hoge <- sapply(keywords, grep, x=data) #リストファイル中の要素一つ一つに対して、要素中の文字列と一致する行番号情報を得ている
hoge <- unique(hoge)                   #得られるhogeベクトルは重複している可能性があるので重複を除いている
out <- data[hoge]                      #hogeで指定したもののみ抽出した結果をoutに格納(dataオブジェクトは行列ではないことに注意!)

#ファイルに保存
writeLines(out, out_f)                 #outの中身を指定したファイル名で保存
	

7. 6と同じことを別のファイルを用いてやる場合:

ラットのアノテーション情報ファイル(GPL1355-14795.txt), 2群間比較で発現変動が確認された遺伝子IDリストファイル(result_rankprod_BAT_id.txt)

in_f1 <- "GPL1355-14795.txt"           #入力ファイル名を指定してin_f1に格納(アノテーションファイル)
in_f2 <- "result_rankprod_BAT_id.txt"  #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- readLines(in_f1)               #in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み

#本番(リストファイル中の要素一つ一つに対して、要素中の文字列と一致する行番号情報を得て、その行のみ出力)
keywords <- unique(keywords)           #リストファイル中の要素が重複している可能性があるので、重複なしの状態にしている
hoge <- sapply(keywords, grep, x=data) #リストファイル中の要素一つ一つに対して、要素中の文字列と一致する行番号情報を得ている
hoge <- unique(hoge)                   #得られるhogeベクトルは重複している可能性があるので重複を除いている
out <- data[hoge]                      #hogeで指定したもののみ抽出した結果をoutに格納(dataオブジェクトは行列ではないことに注意!)

#ファイルに保存
writeLines(out, out_f)                 #outの中身を指定したファイル名で保存
	

8. 7と基本的には同じだが、「遺伝子IDリストファイル中の文字列」が「アノテーション情報ファイル中の一番左側」にしか存在しないという前提で高速に探索したい場合:

ラットのアノテーション情報ファイル(GPL1355-14795.txt), 二群間比較で発現変動が確認された遺伝子IDリストファイル(result_rankprod_BAT_id.txt)

in_f1 <- "GPL1355-14795.txt"           #入力ファイル名を指定してin_f1に格納(アノテーションファイル)
in_f2 <- "result_rankprod_BAT_id.txt"  #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge8.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- readLines(in_f1)               #in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み

#本番(リストファイル中の要素一つ一つに対して、要素中の文字列と一致する行番号情報を得て、その行のみ出力)
keywords <- unique(keywords)           #リストファイル中の要素が重複している可能性があるので、重複なしの状態にしている
hoge <- sapply(paste("^", keywords, sep=""), grep, x=data)#リストファイル中の要素一つ一つに対して、要素中の文字列と一致する行番号情報を得ている
hoge <- unique(hoge)                   #得られるhogeベクトルは重複している可能性があるので重複を除いている
out <- data[hoge]                      #hogeで指定したもののみ抽出した結果をoutに格納(dataオブジェクトは行列ではないことに注意!)

#ファイルに保存
writeLines(out, out_f)                 #outの中身を指定したファイル名で保存
	

9. 8を基本として、8の出力ファイルは対象の行の情報全てを出力するものであったが、13列目のRefSeq Transcript IDに相当するもののみ抽出したい場合:

ラットのアノテーション情報ファイル(GPL1355-14795.txt), 二群間比較で発現変動が確認された遺伝子IDリストファイル(result_rankprod_BAT_id.txt)

in_f1 <- "GPL1355-14795.txt"           #入力ファイル名を指定してin_f1に格納(アノテーションファイル)
in_f2 <- "result_rankprod_BAT_id.txt"  #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge9.txt"                   #出力ファイル名を指定してout_fに格納
param <- 13                            #出力したい列番号を指定

#入力ファイルの読み込み
data <- readLines(in_f1)               #in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み

#本番(リストファイル中の要素一つ一つに対して、要素中の文字列と一致する行番号情報を得て、その行のみ出力)
keywords <- unique(keywords)           #リストファイル中の要素が重複している可能性があるので、重複なしの状態にしている
hoge <- sapply(paste("^", keywords, sep=""), grep, x=data)#リストファイル中の要素一つ一つに対して、要素中の文字列と一致する行番号情報を得ている
hoge <- unique(hoge)                   #得られるhogeベクトルは重複している可能性があるので重複を除いている
hoge2 <- data[hoge]                    #ベクトルdataからobjがTRUEとなる要素のみを抽出した結果をhoge2に格納(dataオブジェクトは行列ではないことに注意!)
hoge3 <- strsplit(hoge2, "\t")         #hoge2ベクトル中の各要素を「タブ(\t)」で区切って分割した結果をhoge3に格納
out <- unlist(lapply(hoge3, "[[", param))#hoge3のリスト中の(param)番目の要素のみ抽出した結果outに格納

#ファイルに保存
writeLines(out, out_f)                 #outの中身を指定したファイル名で保存
	

10. 9を基本として、8の出力ファイルは対象の行の情報全てを出力するものであったが、13列目のRefSeq Transcript IDに相当するもののみ抽出したい場合:

ラットのアノテーション情報ファイル(GPL1355-14795.txt), 二群間比較で発現変動が確認された遺伝子IDリストファイル(result_rankprod_BAT_id.txt)

アノテーション情報ファイルの形式は"#"から始まる行以外は同じ列数なので、行列形式などにすることが可能なことを利用している(9に比べて一般性は劣るがより劇的に早い計算が可能)

in_f1 <- "GPL1355-14795.txt"           #入力ファイル名を指定してin_f1に格納(アノテーションファイル)
in_f2 <- "result_rankprod_BAT_id.txt"  #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge10.txt"                  #出力ファイル名を指定してout_fに格納
param <- 13                            #出力したい列番号を指定

#入力ファイルの読み込み
data <- readLines(in_f1)               #in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み
keywords <- unique(keywords)           #リストファイル中の要素が重複している可能性があるので、重複なしの状態にしている

#アノテーション情報ファイル中で"#"から始まる行を除いて(param)列目の情報を抽出している
hoge <- grep("^#", data)               #正規表現で"#"から始まる行の位置情報を抽出してhogeに格納
data <- data[-hoge]                    #ベクトルdataからhoge中の数値に対応する要素の除いた結果をdataに格納
hoge1 <- strsplit(data, "\t")          #dataベクトル中の各要素を「タブ(\t)」で区切って分割した結果をhoge1に格納
hoge2 <- unlist(lapply(hoge1, "[[", param))#hoge1のリスト中の(param)番目の要素のみ抽出してhoge2に格納
names(hoge2) <- unlist(lapply(hoge1, "[[", 1))#hoge1のリスト中の1番目の要素が遺伝子IDと対応するので、これをhoge2のnames属性として割り当てる

#本番(keywords中の要素に対応するRefSeq IDを取得)
hoge3 <- hoge2[keywords]               #hoge2ベクトルの中から、names(hoge2)がkeywordsと一致するものを抽出してhoge3に格納
out <- unique(hoge3)                   #重複を除去している

#ファイルに保存
writeLines(out, out_f)                 #outの中身を指定したファイル名で保存
	

11. 10を基本として、遺伝子IDリストに対応するRefSeq Transcript IDを抽出ところまでは同じだが、RefSeq IDが同じで遺伝子IDリストにないもの(common)も存在するのでその分を考慮:

ラットのアノテーション情報ファイル(GPL1355-14795.txt), 二群間比較で発現変動が確認された遺伝子IDリストファイル(result_rankprod_BAT_id.txt)

アノテーション情報ファイルの形式は"#"から始まる行以外は同じ列数なので、行列形式などにすることが可能なことを利用している(9に比べて一般性は劣るがより劇的に早い計算が可能)

in_f1 <- "GPL1355-14795.txt"           #入力ファイル名を指定してin_f1に格納(アノテーションファイル)
in_f2 <- "result_rankprod_BAT_id.txt"  #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f1 <- "result_rankprod_BAT_RefSeq_DEG.txt"#出力ファイル名1を指定
out_f2 <- "result_rankprod_BAT_RefSeq_nonDEG.txt"#出力ファイル名2を指定
param <- 13                            #出力したい列番号を指定

#入力ファイルの読み込み
data <- readLines(in_f1)               #in_f1で指定したファイルの読み込み
geneid_DEG <- readLines(in_f2)         #in_f2で指定したファイルの読み込み

#アノテーション情報ファイル中で"#"から始まる行を除いて(param)列目の情報を抽出している
hoge <- grep("^#", data)               #正規表現で"#"から始まる行の位置情報を抽出してhogeに格納
data <- data[-hoge]                    #ベクトルdataからhoge中の数値に対応する要素の除いた結果をdataに格納
hoge1 <- strsplit(data, "\t")          #dataベクトル中の各要素を「タブ(\t)」で区切って分割した結果をhoge1に格納
hoge2 <- unlist(lapply(hoge1, "[[", param))#hoge1のリスト中の(param)番目の要素のみ抽出してhoge2に格納
names(hoge2) <- unlist(lapply(hoge1, "[[", 1))#hoge1のリスト中の1番目の要素が遺伝子IDと対応するので、これをhoge2のnames属性として割り当てる

#本番
tmp_DEG <- unique(hoge2[geneid_DEG])   #hoge2ベクトルの中から、names(hoge2)がgeneid_DEGと一致するものを抽出し、重複を除いてtmp_DEGに格納
geneid_nonDEG <- setdiff(names(hoge2), geneid_DEG)#読み込んだ遺伝子IDリストファイル中のID以外のものをgeneid_nonDEGに格納
tmp_nonDEG <- unique(hoge2[geneid_nonDEG])#hoge2ベクトルの中から、names(hoge2)がgeneid_nonDEGと一致するものを抽出し、重複を除いてtmp_nonDEGに格納

common <- intersect(tmp_DEG, tmp_nonDEG)#tmp_DEGとtmp_nonDEGベクトル間の積集合をcommonに格納
out_DEG <- setdiff(tmp_DEG, common)    #tmp_DEGとcommon間の差集合をout_DEGに格納
out_nonDEG <- setdiff(tmp_nonDEG, common)#tmp_nonDEGとcommon間の差集合をout_nonDEGに格納

#ファイルに保存
writeLines(out_DEG, out_f1)            #out_DEGの中身を指定したファイル名で保存
writeLines(out_nonDEG, out_f2)         #out_nonDEGの中身を指定したファイル名で保存
	

12. 目的のタブ区切りテキストファイル(annotation.txt)中の第1列目をキーとして、param2で指定した文字列が含まれる行全体を出力したい場合:

in_f <- "annotation.txt"               #入力ファイル名を指定してin_fに格納(アノテーションファイル)
out_f <- "hoge12.txt"                  #出力ファイル名を指定してout_fに格納
param1 <- 1                            #アノテーションファイル中の検索したい列番号を指定
param2 <- c("gene1", "gene7", "gene9") #検索したい文字列を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
obj <- is.element(as.character(data[,param1]), param2)#条件を満たすかどうかを判定した結果をobjに格納
out <- data[obj,]                      #objがTRUEとなる行のみ抽出した結果をoutに格納
dim(out)                               #オブジェクトoutの行数と列数を表示

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

13. 目的のタブ区切りテキストファイル(annotation2.txt)中の第1列目をキーとして、param2で指定した文字列が含まれる行全体を出力したい場合:

入力ファイル中にヘッダー行がない場合の読み込み例です。

in_f <- "annotation2.txt"              #入力ファイル名を指定してin_fに格納(アノテーションファイル)
out_f <- "hoge13.txt"                  #出力ファイル名を指定してout_fに格納
param1 <- 1                            #アノテーションファイル中の検索したい列番号を指定
param2 <- c("gene1", "gene7", "gene9") #検索したい文字列を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=F, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
obj <- is.element(as.character(data[,param1]), param2)#条件を満たすかどうかを判定した結果をobjに格納
out <- data[obj,]                      #objがTRUEとなる行のみ抽出した結果をoutに格納
dim(out)                               #オブジェクトoutの行数と列数を表示

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#outの中身を指定したファイル名で保存
	

イントロ | 一般 | ランダムな塩基配列を生成

タイトル通り、「任意の長さ」で「任意の塩基組成」からなるつランダムな塩基配列を生成するやり方を示します。 A,C,G,Tの数値を指定することで任意の塩基組成にできるようになっています。指定する数値の合計は別に100にならなくてもかまいません。 例えば「全てを1にしておけば、四種類の塩基の出現確率の期待値が25%」になりますし、「A=0, C=705, G=89, T=206みたいな指定法だと、 (数値の合計が1000なので)塩基Cの出現確率が70.5%」みたいなこともできます。

1. 塩基配列を生成させるだけの場合:

50塩基の長さのランダムな塩基配列を生成するやり方です。 塩基の存在比はAが20%, Cが30%, Gが30%, Tが20%にしています。

param1 <- 50                           #配列長を指定
narabi <- c("A","C","G","T")           #以下の数値指定時にACGTの並びを間違えないようにするために記述している(内部的にも使用してます)
param2 <- c(20, 30, 30, 20)            #(A,C,G,Tの並びで)各塩基の存在比率を指定

#param2で指定したACGTの比率で配列を生成しoutに格納するところ
ACGTset <- rep(narabi, param2)         #narabi中の塩基がparam2で指定した数だけ存在する文字列ベクトルACGTsetを作成
out <- paste(sample(ACGTset, param1, replace=T), collapse="")#ACGTsetの文字型ベクトルからparam1回分だけ復元抽出して得られた塩基配列をoutに格納
out                                    #確認してるだけです
	

2. 塩基配列を生成させて任意のdescription("kkk")を追加して(single-)FASTA形式ファイルで保存したい場合:

70塩基の長さのランダムな塩基配列を生成するやり方です。 塩基の存在比はAが23%, Cが27%, Gが28%, Tが22%にしています。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 70                           #配列長を指定
narabi <- c("A","C","G","T")           #以下の数値指定時にACGTの並びを間違えないようにするために記述している(内部的にも使用してます)
param2 <- c(23, 27, 28, 22)            #(A,C,G,Tの並びで)各塩基の存在比率を指定
param3 <- "kkk"                        #FASTA形式ファイルのdescription行に記述する内容

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#本番(配列生成)
ACGTset <- rep(narabi, param2)         #narabi中の塩基がparam2で指定した数だけ存在する文字列ベクトルACGTsetを作成
hoge <- paste(sample(ACGTset, param1, replace=T), collapse="")#ACGTsetの文字型ベクトルからparam1回分だけ復元抽出して得られた塩基配列をhogeに格納

#本番(FASTA形式に変換)
fasta <- DNAStringSet(hoge)            #DNA塩基配列だと認識させるDNAStringSet関数を適用した結果をfastaに格納
names(fasta) <- param3                 #description行に相当する記述を追加している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. 任意の配列長をもつものを複数個作ってmulti-FASTAファイルとして保存したい場合:

24, 103, 65の配列長をもつ、計3つの塩基配列を生成しています。 description行は"contig"という記述を基本としています。

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- c(24, 103, 65)               #配列長を指定
narabi <- c("A","C","G","T")           #以下の数値指定時にACGTの並びを間違えないようにするために記述している(内部的にも使用してます)
param2 <- c(20, 30, 30, 20)            #(A,C,G,Tの並びで)各塩基の存在比率を指定
param3 <- "contig"                     #FASTA形式ファイルのdescription行に記述する内容

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#本番(配列生成)
ACGTset <- rep(narabi, param2)         #narabi中の塩基がparam2で指定した数だけ存在する文字列ベクトルACGTsetを作成
hoge <- NULL                           #hogeというプレースホルダの作成
for(i in 1:length(param1)){            #length(param1)で表現される配列数分だけループを回す
    hoge <- c(hoge, paste(sample(ACGTset, param1[i], replace=T), collapse=""))#ACGTsetの文字型ベクトルからparam1[i]回分だけ復元抽出して得られた塩基配列をhogeに格納
}

#本番(FASTA形式に変換)
fasta <- DNAStringSet(hoge)            #DNA塩基配列だと認識させるDNAStringSet関数を適用した結果をfastaに格納
names(fasta) <- paste(param3, 1:length(hoge), sep="_")#description行に相当する記述を追加している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. 配列長情報を含むファイル(seq_length.txt; 中身は「24, 103, 65, 49」という四行からなる数値情報)を読み込む場合:

塩基の存在比はAが26%, Cが27%, Gが24%, Tが23%にしています。

in_f <- "seq_length.txt"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
narabi <- c("A","C","G","T")           #以下の数値指定時にACGTの並びを間違えないようにするために記述している(内部的にも使用してます)
param2 <- c(26, 27, 24, 23)            #(A,C,G,Tの並びで)各塩基の存在比率を指定
param3 <- "contig"                     #FASTA形式ファイルのdescription行に記述する内容

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
param1 <- readLines(in_f)              #in_fで指定したファイルの読み込み

#本番(配列生成)
ACGTset <- rep(narabi, param2)         #narabi中の塩基がparam2で指定した数だけ存在する文字列ベクトルACGTsetを作成
hoge <- NULL                           #hogeというプレースホルダの作成
for(i in 1:length(param1)){            #length(param1)で表現される配列数分だけループを回す
    hoge <- c(hoge, paste(sample(ACGTset, param1[i], replace=T), collapse=""))#ACGTsetの文字型ベクトルからparam1[i]回分だけ復元抽出して得られた塩基配列をhogeに格納
}

#本番(FASTA形式に変換)
fasta <- DNAStringSet(hoge)            #DNA塩基配列だと認識させるDNAStringSet関数を適用した結果をfastaに格納
names(fasta) <- paste(param3, 1:length(hoge), sep="_")#description行に相当する記述を追加している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

5. 同一パラメータを与えたときには常に同じ塩基配列が生成されるようにしたい場合:

48, 160, 100, 123の配列長をもつ、計4つの塩基配列を生成しています。 description行は"contig"という記述を基本としています。

塩基の存在比はAが28%, Cが22%, Gが26%, Tが24%にしています。

set.seed関数を追加しているだけです。

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- c(48, 160, 100, 123)         #配列長を指定
narabi <- c("A","C","G","T")           #以下の数値指定時にACGTの並びを間違えないようにするために記述している(内部的にも使用してます)
param2 <- c(28, 22, 26, 24)            #(A,C,G,Tの並びで)各塩基の存在比率を指定
param3 <- "chr"                        #FASTA形式ファイルのdescription行に記述する内容

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#本番(配列生成)
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
ACGTset <- rep(narabi, param2)         #narabi中の塩基がparam2で指定した数だけ存在する文字列ベクトルACGTsetを作成
hoge <- NULL                           #hogeというプレースホルダの作成
for(i in 1:length(param1)){            #length(param1)で表現される配列数分だけループを回す
    hoge <- c(hoge, paste(sample(ACGTset, param1[i], replace=T), collapse=""))#ACGTsetの文字型ベクトルからparam1[i]回分だけ復元抽出して得られた塩基配列をhogeに格納
}

#本番(FASTA形式に変換)
fasta <- DNAStringSet(hoge)            #DNA塩基配列だと認識させるDNAStringSet関数を適用した結果をfastaに格納
names(fasta) <- paste(param3, 1:length(hoge), sep="_")#description行に相当する記述を追加している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

6. 同一パラメータを与えたときには常に同じ塩基配列が生成されるようにしたい場合2:

48, 160, 100, 123の配列長をもつ、計4つの塩基配列を生成しています。 description行は"contig"という記述を基本としています。

塩基の存在比はAが28%, Cが22%, Gが26%, Tが24%にしています。

set.seed関数を追加し、chr3の配列と同じものをchr5としてコピーして作成したのち、一部の塩基置換を行っています。

out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- c(48, 160, 100, 123)         #配列長を指定
narabi <- c("A","C","G","T")           #以下の数値指定時にACGTの並びを間違えないようにするために記述している(内部的にも使用してます)
param2 <- c(28, 22, 26, 24)            #(A,C,G,Tの並びで)各塩基の存在比率を指定
param3 <- "chr"                        #FASTA形式ファイルのdescription行に記述する内容

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#塩基置換関数の作成
enkichikan <- function(fa, p) {        #関数名や引数の作成
  t <- substring(fa, p, p)             #置換したい位置の塩基を取りだす
  t_c <- chartr("CGAT", "GCTA", t)     #置換後の塩基を作成
  substring(fa, p, p) <- t_c           #置換
  return(fa)                           #置換後のデータを返す
}

#本番(配列生成)
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
ACGTset <- rep(narabi, param2)         #narabi中の塩基がparam2で指定した数だけ存在する文字列ベクトルACGTsetを作成
hoge <- NULL                           #hogeというプレースホルダの作成
for(i in 1:length(param1)){            #length(param1)で表現される配列数分だけループを回す
    hoge <- c(hoge, paste(sample(ACGTset, param1[i], replace=T), collapse=""))#ACGTsetの文字型ベクトルからparam1[i]回分だけ復元抽出して得られた塩基配列をhogeに格納
}

#本番(chr3の配列をchr5としてコピーし、2番目と7番目の塩基をそれぞれ置換)
hoge <- c(hoge, hoge[3])               #chr3に相当する配列を追加している
hoge[5] <- enkichikan(hoge[5], 2)      #hoge[5]の2番目の塩基を置換
hoge[5] <- enkichikan(hoge[5], 7)      #hoge[5]の7番目の塩基を置換

#本番(FASTA形式に変換)
fasta <- DNAStringSet(hoge)            #DNA塩基配列だと認識させるDNAStringSet関数を適用した結果をfastaに格納
names(fasta) <- paste(param3, 1:length(hoge), sep="_")#description行に相当する記述を追加している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | 一般 | 任意の長さの可能な全ての塩基配列を作成

"A", "C", "G", "T"からなる任意の長さのn塩基からなる全ての塩基配列を作成するやり方を示します。

「ファイル」−「ディレクトリの変更」で出力結果ファイルを保存したいディレクトリに移動し以下をコピペ。

1. n=3として、4n = 43 = 64通りの3塩基からなる可能な配列を作成したい場合:

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param <- 3                             #欲しい連続塩基の長さ情報を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#本番
out <- mkAllStrings(c("A", "C", "G", "T"), param)#(param)連続塩基の全ての可能な配列情報をoutに格納

#ファイルに保存
writeLines(out, out_f)                 #outの中身を指定したファイル名で保存
	

2. n=5として、4n = 45 = 1024通りの5塩基からなる可能な配列を作成したい場合:

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param <- 5                             #欲しい連続塩基の長さ情報を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#本番
out <- mkAllStrings(c("A", "C", "G", "T"), param)#(param)連続塩基の全ての可能な配列情報をoutに格納

#ファイルに保存
writeLines(out, out_f)                 #outの中身を指定したファイル名で保存
	

イントロ | 一般 | 任意の位置の塩基を置換

任意の位置の塩基を置換するやり方を示します。ベタな書き方ですがとりあえず。。。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample1.fasta)の場合:

in_f <- "sample1.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 5                            #置換したい塩基の位置を指定
param2 <- "G"                          #置換後の塩基を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです
hoge <- as.character(fasta)            #文字列に置換

#本番
substring(hoge, param1, param1) <- param2#param1で指定した位置の塩基をparam2で指定した塩基に置換
hoge <- DNAStringSet(hoge)             #DNAStringSetオブジェクトに変換した結果をhogeに格納
names(hoge) <- names(fasta)            #description部分の情報に相当するnames(fasta)をnames(hoge)に格納している
fasta <- hoge                          #hogeの中身をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. FASTA形式ファイル(sample2.fasta)の場合:

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 5                            #置換したい塩基の位置を指定
param2 <- "G"                          #置換後の塩基を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです
hoge <- as.character(fasta)            #文字列に置換

#本番
substring(hoge, param1, param1) <- param2#param1で指定した位置の塩基をparam2で指定した塩基に置換
hoge <- DNAStringSet(hoge)             #DNAStringSetオブジェクトに変換した結果をhogeに格納
names(hoge) <- names(fasta)            #description部分の情報に相当するnames(fasta)をnames(hoge)に格納している
fasta <- hoge                          #hogeの中身をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. FASTA形式ファイル(sample2.fasta)の場合:

param1で指定した位置の塩基を相補鎖(C --> G, G --> C, A --> T, T --> A)に置換するやり方です。そのような関数を作成して実行しています。

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 5                            #置換したい塩基の位置を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#塩基置換関数の作成
DNAString_chartr <- function(fa, p) {  #関数名や引数の作成
  str_list <- as.character(fa)         #文字列に変更
  t <- substring(str_list, p, p)       #置換したい位置の塩基を取りだす
  t_c <- chartr("CGAT", "GCTA", t)     #置換後の塩基を作成
  substring(str_list, p, p) <- t_c     #置換
  fa_r <- DNAStringSet(str_list)       #DNAStringSetオブジェクトに戻す
  names(fa_r) <- names(fa)             #description部分の情報を追加
  return(fa_r)                         #置換後のデータを返す
}

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- DNAString_chartr(fasta, param1)#param1で指定した位置の塩基置換を実行した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | 一般 | 指定した範囲の配列を取得

single-FASTA形式やmulti-FASTA形式ファイルから様々な部分配列を取得するやり方を示します。 この項目は、「この染色体の、ここから、ここまで」という指定の仕方になります。 例えば入力ファイルがヒトゲノムだった場合に、chr3の20000から500000の座標の配列取得を行いたい場合などに利用します。 したがって、chr4とchr8の配列のみ抽出といったやり方には対応していませんのでご注意ください。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. (single-)FASTA形式ファイル(sample1.fasta)の場合:

任意の範囲 (始点が3, 終点が9)の配列を抽出し、得られた部分配列をFASTA形式ファイル(hoge1.txt)に出力するやり方です。

ファイルダウンロード時に、*.fastaという拡張子が*.txtに勝手に変更されることがありますのでご注意ください。

in_f <- "sample1.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param <- c(3, 9)                       #抽出したい範囲の始点と終点を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- subseq(fasta, param[1], param[2])#paramで指定した始点と終点の範囲の配列を抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. RefSeqのhuman mRNAのmulti-FASTA形式のファイル (h_rna.fasta)の場合:

任意のRefSeq ID (例:NM_203348.1)の任意の範囲 (例:始点が2, 終点が5)の配列の抽出を行うやり方です。

in_f <- "h_rna.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "NM_203348.1"                #取得したい配列のアクセッション番号を指定
param2 <- c(2, 5)                      #抽出したい範囲の始点と終点を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- as.logical(names(fasta) == param1)        #条件を満たすかどうかを判定した結果をobjに格納
fasta <- subseq(fasta[obj], param2[1], param2[2])#objがTRUEとなる配列のみに対して、param2で指定した始点と終点の範囲の配列を抽出した結果をfasta格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. RefSeqのhuman mRNAのmulti-FASTA形式のファイル (h_rna.fasta)の場合:

目的のaccession番号が複数ある場合に対応したものです。 予め用意しておいた「1列目:accession, 2列目:start位置, 3列目:end位置」からなるリストファイル (list_sub1.txt) を読み込ませて、目的の配列のmulti-FASTAファイルをゲットするやり方です。

in_f1 <- "h_rna.fasta"                 #入力ファイル名を指定してin_f1に格納(multi-FASTAファイル)
in_f2 <- "list_sub1.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
posi <- read.table(in_f2)              #in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- NULL                           #最終的に得る結果を格納するためのプレースホルダhogeを作成しているだけ
for(i in 1:nrow(posi)){                #length(posi)回だけループを回す
    obj <- names(fasta) == posi[i,1]   #条件を満たすかどうかを判定した結果をobjに格納
    hoge <- append(hoge, subseq(fasta[obj], start=posi[i,2], end=posi[i,3]))#subseq関数を用いてobjがTRUEとなるもののみに対して、posi[i,2]とposi[i,3]で与えた範囲に対応する部分配列を抽出した結果をhogeにどんどん格納している
}
fasta <- hoge                          #hogeの中身をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

目的のaccession番号が複数ある場合に対応したものです。 予め用意しておいた「1列目:accession, 2列目:start位置, 3列目:end位置」からなるリストファイル (list_sub2.txt) を読み込ませて、目的の配列のmulti-FASTAファイルをゲットするやり方です。

in_f1 <- "hoge4.fa"                    #入力ファイル名を指定してin_f1に格納(multi-FASTAファイル)
in_f2 <- "list_sub2.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
posi <- read.table(in_f2)              #in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- NULL                           #最終的に得る結果を格納するためのプレースホルダhogeを作成しているだけ
for(i in 1:nrow(posi)){                #length(posi)回だけループを回す
    obj <- names(fasta) == posi[i,1]   #条件を満たすかどうかを判定した結果をobjに格納
    hoge <- append(hoge, subseq(fasta[obj], start=posi[i,2], end=posi[i,3]))#subseq関数を用いてobjがTRUEとなるもののみに対して、posi[i,2]とposi[i,3]で与えた範囲に対応する部分配列を抽出した結果をhogeにどんどん格納している
}
fasta <- hoge                          #hogeの中身をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

5. multi-FASTA形式のファイル (ref_genome.fa)ファイルの場合:

目的のaccession番号が複数ある場合に対応したものです。 予め用意しておいた「1列目:accession, 2列目:start位置, 3列目:end位置」からなるリストファイル (list_sub3.txt) を読み込ませて、目的の部分配列のmulti-FASTAファイルをゲットするやり方です。

in_f1 <- "ref_genome.fa"               #入力ファイル名を指定してin_f1に格納(multi-FASTAファイル)
in_f2 <- "list_sub3.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
posi <- read.table(in_f2)              #in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- NULL                           #最終的に得る結果を格納するためのプレースホルダhogeを作成しているだけ
for(i in 1:nrow(posi)){                #length(posi)回だけループを回す
    obj <- names(fasta) == posi[i,1]   #条件を満たすかどうかを判定した結果をobjに格納
    hoge <- append(hoge, subseq(fasta[obj], start=posi[i,2], end=posi[i,3]))#subseq関数を用いてobjがTRUEとなるもののみに対して、posi[i,2]とposi[i,3]で与えた範囲に対応する部分配列を抽出した結果をhogeにどんどん格納している
}
fasta <- hoge                          #hogeの中身をfastaに格納
fasta                                  #確認してるだけです

#後処理(description部分の作成)
description <- paste(posi[,1], posi[,2], posi[,3], sep="_")#行列posiの各列を"_"で結合したものをdescriptionに格納
names(fasta) <- description            #description行に相当する記述を追加している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | 一般 | 指定したID(染色体やdescription)の配列を取得

multi-FASTA形式ファイルからリストファイルで指定したID (description行の記載内容と全く同じ染色体名などの配列ID)の配列を取得するやり方を示します。 例えば入力ファイルがヒトゲノムだった場合に、chr4とchr8の配列のみ抽出したい場合などに利用します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. RefSeqのhuman mRNAのmulti-FASTA形式のファイル (h_rna.fasta)の場合:

任意のRefSeq ID NM_203348.1の配列抽出を行うやり方です。 ファイルダウンロード時に、*.fastaという拡張子が*.txtに勝手に変更されることがありますのでご注意ください。

in_f <- "h_rna.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "NM_203348.1"                #取得したい配列のアクセッション番号を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- as.logical(names(fasta) == param1)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる配列のみを抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. RefSeqのhuman mRNAのmulti-FASTA形式のファイル (h_rna.fasta)の場合:

うまくいかない例です。NM_203348.1は確かに入力ファイル中に存在するが、 バージョン情報を除いたNM_203348だとうまくいきません。 理由は、両者の文字列は完全に同じというわけではないからです。

in_f <- "h_rna.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "NM_203348"                  #取得したい配列のアクセッション番号を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- as.logical(names(fasta) == param1)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる配列のみを抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. RefSeqのhuman mRNAのmulti-FASTA形式のファイル (h_rna.fasta)の場合:

うまくいかない例です。"NM_203348.1"は確かに入力ファイル中に存在するが、 スペースが余分に含まれる"NM_203348.1 "だとうまくいきません。 理由は、両者の文字列は完全に同じというわけではないからです。

in_f <- "h_rna.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "NM_203348.1 "               #取得したい配列のアクセッション番号を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- as.logical(names(fasta) == param1)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる配列のみを抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. RefSeqのhuman mRNAのmulti-FASTA形式のファイル (h_rna.fasta)の場合:

目的のIDが複数ある場合に対応したものです。予め用意しておいたリストファイル (list_sub5.txt) を読み込ませて、目的の配列のmulti-FASTAファイルをゲットするやり方です。

in_f1 <- "h_rna.fasta"                 #入力ファイル名を指定してin_f1に格納(multi-FASTAファイル)
in_f2 <- "list_sub5.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- is.element(names(fasta), keywords)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる配列のみを抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

5. RefSeqのhuman mRNAのmulti-FASTA形式のファイル (h_rna.fasta)の場合:

目的のIDが複数ある場合に対応したものです。予め用意しておいたリストファイル (list_sub6.txt) を読み込ませて、目的の配列のmulti-FASTAファイルをゲットするやり方です。

バージョン番号やスペースを含むIDは抽出できないという例です。リスト中の3つのうち、最後のIDの配列のみ抽出できていることがわかります。

in_f1 <- "h_rna.fasta"                 #入力ファイル名を指定してin_f1に格納(multi-FASTAファイル)
in_f2 <- "list_sub6.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- is.element(names(fasta), keywords)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる配列のみを抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

6. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

目的のIDが複数ある場合に対応したものです。予め用意しておいたリストファイル (list_sub7.txt) を読み込ませて、目的の配列のmulti-FASTAファイルをゲットするやり方です。

"contig_2"の配列は取得できていますが、"contig_4"の配列は取得できていないことがわかります。理由は、"contig_4 "とスペースが入っているためです。

in_f1 <- "hoge4.fa"                    #入力ファイル名を指定してin_f1に格納(multi-FASTAファイル)
in_f2 <- "list_sub7.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- is.element(names(fasta), keywords)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる配列のみを抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

7. multi-FASTA形式のファイル (ref_genome.fa)ファイルの場合:

目的のIDが複数ある場合に対応したものです。予め用意しておいたリストファイル (list_sub8.txt) を読み込ませて、目的の配列のmulti-FASTAファイルをゲットするやり方です。

指定したつもりの4つの染色体番号のうち、"chr1 "はスペースのため、そして"chr_5"は余分な文字の挿入のため抽出できていないことがわかります。

in_f1 <- "ref_genome.fa"               #入力ファイル名を指定してin_f1に格納(multi-FASTAファイル)
in_f2 <- "list_sub8.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- is.element(names(fasta), keywords)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる配列のみを抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

8. multi-FASTA形式のファイル (ref_genome_redun.fa)ファイルの場合:

目的のIDが複数ある場合に対応したものです。予め用意しておいたリストファイル (list_sub8.txt) を読み込ませて、目的の配列のmulti-FASTAファイルをゲットするやり方です。

指定したつもりの4つの染色体番号のうち、"chr1 "はスペースのため、そして"chr_5"は余分な文字の挿入のため抽出できていないことがわかります。

multi-FASTAの入力ファイルは、chr4という全く同じ配列が重複して存在しますが、それがそのまま反映されていることが分かります。

in_f1 <- "ref_genome_redun.fa"         #入力ファイル名を指定してin_f1に格納(multi-FASTAファイル)
in_f2 <- "list_sub8.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge8.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- is.element(names(fasta), keywords)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる配列のみを抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

9. multi-FASTA形式のファイル (ref_genome_redun.fa)ファイルの場合:

目的のIDが複数ある場合に対応したものです。予め用意しておいたリストファイル (list_sub8.txt) を読み込ませて、目的の配列のmulti-FASTAファイルをゲットするやり方です。

指定したつもりの4つの染色体番号のうち、"chr1 "はスペースのため、そして"chr_5"は余分な文字の挿入のため抽出できていないことがわかります。

multi-FASTAの入力ファイルは、chr4という全く同じ配列が重複して存在します。 それがそのまま反映されるのが嫌で、重複を除きたい(non-redundantにしたい)場合があります。それに対応したやり方です。

in_f1 <- "ref_genome_redun.fa"         #入力ファイル名を指定してin_f1に格納(multi-FASTAファイル)
in_f2 <- "list_sub8.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge9.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- is.element(names(fasta), keywords)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる配列のみを抽出した結果をfastaに格納
fasta                                  #確認してるだけです
fasta <- unique(fasta)                 #重複を除いてnon-redundantにした結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

9. multi-FASTA形式のファイル (ref_genome_redun.fa)ファイルの場合:

目的のIDが複数ある場合に対応したものです。予め用意しておいたリストファイル (list_sub8.txt) を読み込ませて、目的の配列のmulti-FASTAファイルをゲットするやり方です。

指定したつもりの4つの染色体番号のうち、"chr1 "はスペースのため、そして"chr_5"は余分な文字の挿入のため抽出できていないことがわかります。

multi-FASTAの入力ファイルは、chr4という全く同じ配列が重複して存在します。 それがそのまま反映されるのが嫌で、重複を除きたい(non-redundantにしたい)場合があります。それに対応したやり方です。

FASTA形式ファイルの読み込み部分で、Biostringsパッケージ中のreadDNAStringSet関数ではなく、seqinrパッケージ中のread.fasta関数を用いるやり方です。

in_f1 <- "ref_genome_redun.fa"         #入力ファイル名を指定してin_f1に格納(multi-FASTAファイル)
in_f2 <- "list_sub8.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
out_f <- "hoge10.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqinr)                        #パッケージの読み込み

#入力ファイルの読み込みとDNAStringSet形式への変換
hoge <- read.fasta(in_f, seqtype="DNA", as.string=TRUE)#in_fで指定したファイルの読み込み
fasta <- DNAStringSet(as.character(hoge))#型変換
names(fasta) <- names(hoge)            #型変換
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- is.element(names(fasta), keywords)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる配列のみを抽出した結果をfastaに格納
fasta                                  #確認してるだけです
fasta <- unique(fasta)                 #重複を除いてnon-redundantにした結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | 一般 | 翻訳配列(translate)を取得

塩基配列を読み込んでアミノ酸配列に翻訳するやり方をしめします。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample1.fasta)の場合:

in_f <- "sample1.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番
hoge <- translate(fasta)               #fastaをアミノ酸配列に翻訳した結果をhogeに格納
names(hoge) <- names(fasta)            #現状では翻訳した結果のオブジェクトhogeのdescription行が消えてしまうようなので、description部分の情報に相当するnames(fasta)をnames(hoge)に格納している
fasta <- hoge                          #hogeの中身をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. multi-FASTA形式ファイル(h_rna.fasta)の場合:

(配列中にNを含むものが出現したところでエラーがでて止まります)

in_f <- "h_rna.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番
hoge <- translate(fasta)               #fastaをアミノ酸配列に翻訳した結果をhogeに格納
names(hoge) <- names(fasta)            #現状では翻訳した結果のオブジェクトhogeのdescription行が消えてしまうようなので、description部分の情報に相当するnames(fasta)をnames(hoge)に格納している
fasta <- hoge                          #hogeの中身をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. multi-FASTA形式ファイル(h_rna.fasta)の場合:

(ACGTのみからなる配列を抽出したサブセットに対して翻訳を行っているのでエラーは出ない)

in_f <- "h_rna.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#前処理(ACGTのみからなる配列を抽出)
hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
obj <- (width(fasta) == hoge)          #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#本番
hoge <- translate(fasta)               #fastaをアミノ酸配列に翻訳した結果をhogeに格納
names(hoge) <- names(fasta)            #現状では翻訳した結果のオブジェクトhogeのdescription行が消えてしまうようなので、description部分の情報に相当するnames(fasta)をnames(hoge)に格納している
fasta <- hoge                          #hogeの中身をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | 一般 | 相補鎖(complement)を取得

FASTA形式ファイルを読み込んで相補鎖を得るやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample1.fasta)の場合:

in_f <- "sample1.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- complement(fasta)             #fastaオブジェクトの相補鎖をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. multi-FASTA形式ファイル(h_rna.fasta)の場合:

in_f <- "h_rna.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- complement(fasta)             #fastaオブジェクトの相補鎖をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | 一般 | 逆相補鎖(reverse complement)を取得

FASTA形式ファイルを読み込んで逆相補鎖を得るやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample1.fasta)の場合:

in_f <- "sample1.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- reverseComplement(fasta)      #fastaオブジェクトの逆相補鎖をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. multi-FASTA形式ファイル(h_rna.fasta)の場合:

in_f <- "h_rna.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- reverseComplement(fasta)      #fastaオブジェクトの逆相補鎖をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | 一般 | 逆鎖(reverse)を取得

FASTA形式ファイルを読み込んで逆鎖を得るやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample1.fasta)の場合:

in_f <- "sample1.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- reverse(fasta)                #fastaオブジェクトの逆鎖をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. multi-FASTA形式ファイル(h_rna.fasta)の場合:

in_f <- "h_rna.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- reverse(fasta)                #fastaオブジェクトの逆鎖をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | 一般 | 2連続塩基の出現頻度情報を取得

multi-FASTA形式ファイルを読み込んで、"AA", "AC", "AG", "AT", "CA", "CC", "CG", "CT", "GA", "GC", "GG", "GT", "TA", "TC", "TG", "TT"の計42 = 16通りの2連続塩基の出現頻度を調べるやり方を示します。

ヒトゲノムで"CG"の割合が期待値よりも低い(Lander et al., 2001; Saxonov et al., 2006)ですが、それを簡単に検証できます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

タイトル通りの出現頻度です。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番
out <- dinucleotideFrequency(fasta)    #2連続塩基の出現頻度情報をoutに格納

#ファイルに保存
tmp <- cbind(names(fasta), out)        #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

出現頻度ではなく、出現確率を得るやり方です。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番
out <- dinucleotideFrequency(fasta, as.prob=T)#2連続塩基の出現確率情報をoutに格納

#ファイルに保存
tmp <- cbind(names(fasta), out)        #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. multi-FASTA形式ファイル(h_rna.fasta)の場合:

406番目のID (NR_002762.1)の塩基配列の498番目の文字が"N"なはずなのですが、これはどのように計算されているのでしょうか。。。

in_f <- "h_rna.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番
out <- dinucleotideFrequency(fasta)    #2連続塩基の出現頻度情報をoutに格納

#ファイルに保存
tmp <- cbind(names(fasta), out)        #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. BSgenomeパッケージ中のヒトゲノム配列("BSgenome.Hsapiens.UCSC.hg19")の場合:

タイトル通りの出現頻度です。イントロ | 一般 | 配列取得 | ゲノム配列 | BSgenome中のゲノム配列取得手順を含んでいます。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param <- "BSgenome.Hsapiens.UCSC.hg19" #パッケージ名を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(param, character.only=T)       #paramで指定したパッケージの読み込み

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にオブジェクトが一つしかないという前提です)
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している
fasta                                  #確認してるだけです

#本番
out <- dinucleotideFrequency(fasta)    #2連続塩基の出現頻度情報をoutに格納

#ファイルに保存
tmp <- cbind(names(fasta), out)        #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. BSgenomeパッケージ中のヒトゲノム配列("BSgenome.Hsapiens.UCSC.hg19")の場合:

出現頻度ではなく、出現確率を得るやり方です。

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param <- "BSgenome.Hsapiens.UCSC.hg19" #パッケージ名を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(param, character.only=T)       #paramで指定したパッケージの読み込み

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にオブジェクトが一つしかないという前提です)
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している
fasta                                  #確認してるだけです

#本番
out <- dinucleotideFrequency(fasta, as.prob=T)#2連続塩基の出現確率情報をoutに格納

#ファイルに保存
tmp <- cbind(names(fasta), out)        #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

6. BSgenomeパッケージ中のシロイヌナズナゲノム配列("BSgenome.Athaliana.TAIR.TAIR9")の場合:

出現頻度ではなく、出現確率を得るやり方です。パッケージがインストールされていない場合は、 イントロ | 一般 | 配列取得 | ゲノム配列 | BSgenomeを参考にしてインストールしてから再度チャレンジ。

out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param <- "BSgenome.Athaliana.TAIR.TAIR9"#パッケージ名を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(param, character.only=T)       #paramで指定したパッケージの読み込み

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にオブジェクトが一つしかないという前提です)
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している
fasta                                  #確認してるだけです

#本番
out <- dinucleotideFrequency(fasta, as.prob=T)#2連続塩基の出現確率情報をoutに格納

#ファイルに保存
tmp <- cbind(names(fasta), out)        #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

イントロ | 一般 | 3連続塩基の出現頻度情報を取得

43 = 64 通りの3連続塩基の出現頻度を調べるやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番
out <- trinucleotideFrequency(fasta)   #3連続塩基の出現頻度情報をoutに格納

#ファイルに保存
tmp <- cbind(names(fasta), out)        #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. 130MB程度のRefSeqのhuman mRNAのmulti-FASTAファイル(h_rna.fasta)の場合:

406番目のID (NR_002762.1)の塩基配列の498番目の文字が"N"なはずなのですが、これはどのように計算されているのでしょうか。。。

in_f <- "h_rna.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番
out <- trinucleotideFrequency(fasta)   #3連続塩基の出現頻度情報をoutに格納

#ファイルに保存
tmp <- cbind(names(fasta), out)        #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

イントロ | 一般 | 任意の長さの連続塩基の出現頻度情報を取得

4n通りの任意のn連続塩基の出現頻度を調べるやり方を示します。

例えば2連続塩基の場合はn=2, 3連続塩基の場合はn=3と指定します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

4連続塩基(n=4)の出現頻度情報を得るやり方です。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param <- 4                             #欲しい連続塩基の長さ情報を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番
out <- oligonucleotideFrequency(fasta, width=param)#(param)連続塩基の出現頻度情報をoutに格納

#ファイルに保存
tmp <- cbind(names(fasta), out)        #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

2連続塩基(n=2)の出現頻度情報を得るやり方です。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param <- 2                             #欲しい連続塩基の長さ情報を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番
out <- oligonucleotideFrequency(fasta, width=param)#(param)連続塩基の出現頻度情報をoutに格納

#ファイルに保存
tmp <- cbind(names(fasta), out)        #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

2連続塩基(n=2)の全コンティグをまとめた出現頻度情報を得るやり方です。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param <- 2                             #欲しい連続塩基の長さ情報を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番
out <- oligonucleotideFrequency(fasta, width=param, simplify.as="collapsed")#(param)連続塩基の全コンティグをまとめた出現頻度情報をoutに格納

#ファイルに保存
tmp <- cbind(names(out), out)          #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

2連続塩基(n=2)の全コンティグをまとめた出現確率情報を得るやり方です。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param <- 2                             #欲しい連続塩基の長さ情報を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番
out <- oligonucleotideFrequency(fasta, width=param, simplify.as="collapsed", as.prob=TRUE)#(param)連続塩基の全コンティグをまとめた出現確率情報をoutに格納

#ファイルに保存
tmp <- cbind(names(out), out)          #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

イントロ | 一般 | Tips | 任意の拡張子名でファイルを保存

出力ファイル名をわざわざ指定せずに、拡張子名のみ変えるやり方を示します。。(例:XXX.txtを読み込んでXXX.inuという拡張子で保存したい)

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

*.ugeというファイル名で保存するやり方です。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
param <- "uge"                         #拡張子名を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番(拡張子を変えた出力ファイル名を作成)
out_f <- paste(unlist(strsplit(in_f, ".", fixed=TRUE))[1], param, sep=".")#出力ファイル名を作成してout_fに格納

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | 一般 | Tips | 拡張子は同じで任意の文字を追加して保存

ファイル保存時に、拡張子名は変えずに、拡張子の手前に任意の文字(例:"_processed")を追加するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

*_processed.faというファイル名で保存するやり方です。

ファイル名中に"."(ドット)が一つしかないという前提です

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
param <- "_processed"                  #追加したい文字列を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番()
hoge1 <- paste(".", unlist(strsplit(in_f, ".", fixed=TRUE))[2], sep="")#"."を含む拡張子部分をhoge1に格納
hoge2 <- paste(param, hoge1, sep="")   #置換後の文字列をhoge2に格納
out_f <- sub(hoge1, hoge2, in_f)       #出力ファイル名を作成してout_fに格納

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | 一般 | 配列取得 | ゲノム配列 | BSgenome

BSgenomeパッケージを用いて様々な生物種のゲノム配列を取得するやり方を示します。 ミヤマハタザオ (A. lyrata)、セイヨウミツバチ (A. mellifera)、 シロイヌナズナ(A.thaliana)、ウシ(B.taurus)、線虫(C.elegans)、犬(C.familiaris)、キイロショウジョウバエ(D.melanogaster)、 ゼブラフィッシュ(D.rerio)、大腸菌(E.coli)、イトヨ(G.aculeatus)、セキショクヤケイ(G.gallus)、ヒト(H.sapiens)、 アカゲザル(M.mulatta)、マウス(M.musculus)、チンパンジー(P.troglodytes)、ラット(R.norvegicus)、出芽酵母(S.cerevisiae)、 トキソプラズマ(T.gondii)と実に様々な生物種が利用可能であることがわかります。

getSeq関数はBSgenomeオブジェクト中の「single sequences」というあたりにリストアップされているchr...というものを全て抽出しています。したがって、例えばマウスゲノムは「chr1」以外に「chr1_random」や「chrUn_random」なども等価に取扱っている点に注意してください。

「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。

1. 利用可能な生物種とRにインストール済みの生物種をリストアップしたい場合:

#必要なパッケージをロード
library(BSgenome)                      #パッケージの読み込み

#本番(利用可能なリストアップ;インストール済みとは限らない)
available.genomes()                    #このパッケージ中で利用可能なゲノムをリストアップ

#本番(インストール済みの生物種をリストアップ)
installed.genomes()                    #インストール済みの生物種をリストアップ

#後処理(パッケージ名でだいたいわかるがproviderやversionを分割して表示したい場合)
installed.genomes(splitNameParts=TRUE) #インストール済みの生物種をリストアップ
	

2. ゼブラフィッシュ("BSgenome.Drerio.UCSC.danRer7")のゲノム情報をRにインストールしたい場合:

400MB程度あります...

param <- "BSgenome.Drerio.UCSC.danRer7"#パッケージ名を指定

#本番
source("http://bioconductor.org/biocLite.R")#おまじない
biocLite(param)                        #おまじない

#後処理(インストール済みの生物種をリストアップ)
installed.genomes()                    #インストール済みの生物種をリストアップ
	

3. インストール済みのゼブラフィッシュのゲノム配列をmulti-FASTAファイルで保存したい場合:

1.4GB程度のファイルが生成されます...

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param <- "BSgenome.Drerio.UCSC.danRer7"#パッケージ名を指定

#必要なパッケージをロード
library(param, character.only=T)       #paramで指定したパッケージの読み込み

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
genome                                 #確認してるだけです

#本番
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. インストール済みのマウス("BSgenome.Mmusculus.UCSC.mm9")のゲノム配列をmulti-FASTAファイルで保存したい場合:

2.8GB程度のファイルが生成されます...

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param <- "BSgenome.Mmusculus.UCSC.mm9" #パッケージ名を指定

#必要なパッケージをロード
library(param, character.only=T)       #paramで指定したパッケージの読み込み

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
genome                                 #確認してるだけです

#本番
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

5. インストール済みのヒト("BSgenome.Hsapiens.UCSC.hg19")のゲノム配列をmulti-FASTAファイルで保存したい場合:

3.0GB程度のファイルが生成されます...。ヒトゲノムは、まだ完全に22本の常染色体とX, Y染色体の計24本になっているわけではないことがわかります。

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param <- "BSgenome.Hsapiens.UCSC.hg19" #パッケージ名を指定

#必要なパッケージをロード
library(param, character.only=T)       #paramで指定したパッケージの読み込み

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
genome                                 #確認してるだけです

#本番
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

6. インストール済みのヒト("BSgenome.Hsapiens.UCSC.hg19")のゲノム配列をmulti-FASTAファイルで保存したい場合:

ヒトゲノムは、まだ完全に22本の常染色体とX, Y染色体の計24本になっているわけではないので、最初の主要な24本分のみにするやり方です。

out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "BSgenome.Hsapiens.UCSC.hg19"#パッケージ名を指定
param2 <- 24                           #取り出したい染色体数を指定(主要なものから順番に並んでいるので最初の24本に相当)

#必要なパッケージをロード
library(param1, character.only=T)      #paramで指定したパッケージの読み込み

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
#tmp <- unlist(strsplit(param1, ".", fixed=TRUE))[2]#指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param1, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
genome                                 #確認してるだけです

#本番
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している
fasta <- fasta[1:param2]               #染色体のフィルタリング

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

7. シロイヌナズナ("BSgenome.Athaliana.TAIR.TAIR9")のゲノム情報をRにインストールしたい場合:

Rのパッケージをインストール後、ゲノム配列をmulti-FASTAファイルで保存する一連の手順です。 The Arabidopsis Information Resource (TAIR)(Lamesch et al., Nucleic Acids Res., 2012) から得られる最新バージョンはTAIR10ですが、アセンブリ結果自体はTAIR9と同じと明記されています (README_whole_chromosomes.txt)。

param <- "BSgenome.Athaliana.TAIR.TAIR9"#パッケージ名を指定

#本番
source("http://bioconductor.org/biocLite.R")#おまじない
biocLite(param)                        #おまじない

#後処理(インストール済みの生物種をリストアップ)
installed.genomes()                    #インストール済みの生物種をリストアップ
	

8. インストール済みのシロイヌナズナ("BSgenome.Athaliana.TAIR.TAIR9")のゲノム配列をmulti-FASTAファイルで保存したい場合:

The Arabidopsis Information Resource (TAIR)(Lamesch et al., Nucleic Acids Res., 2012) から得られる最新バージョンはTAIR10ですが、アセンブリ結果自体はTAIR9と同じと明記されています (README_whole_chromosomes.txt)。120MB程度のファイルが生成されます...

out_f <- "hoge8.txt"                   #出力ファイル名を指定してout_fに格納
param <- "BSgenome.Athaliana.TAIR.TAIR9"#パッケージ名を指定

#必要なパッケージをロード
library(param, character.only=T)       #paramで指定したパッケージの読み込み

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
genome                                 #確認してるだけです

#本番
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

9. インストール済みのヒト("BSgenome.Hsapiens.NCBI.GRCh38")のゲノム配列をmulti-FASTAファイルで保存したい場合:

2013年12月にリリースされたGenome Reference Consortium GRCh38です。 R ver. 3.1.0とBioconductor ver. 2.14以上の環境で実行可能です。

out_f <- "hoge9.txt"                   #出力ファイル名を指定してout_fに格納
param <- "BSgenome.Hsapiens.NCBI.GRCh38"#パッケージ名を指定

#必要なパッケージをロード
library(param, character.only=T)       #paramで指定したパッケージの読み込み

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
genome                                 #確認してるだけです

#本番
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | 一般 | 配列取得 | プロモーター配列 | 公共DBから

イントロ | 一般 | 配列取得 | プロモーター配列 | BSgenome

BSgenomeパッケージを用いて様々な生物種のプロモーター配列(転写開始点近傍配列;上流配列)を取得するやり方を示します。 シロイヌナズナ(A.thaliana)、ウシ(B.taurus)、線虫(C.elegans)、犬(C.familiaris)、キイロショウジョウバエ(D.melanogaster)、 ゼブラフィッシュ(D.rerio)、大腸菌(E.coli)、イトヨ(G.aculeatus)、セキショクヤケイ(G.gallus)、ヒト(H.sapiens)、 アカゲザル(M.mulatta)、マウス(M.musculus)、チンパンジー(P.troglodytes)、ラット(R.norvegicus)、出芽酵母(S.cerevisiae)、 トキソプラズマ(T.gondii)と実に様々な生物種が利用可能であることがわかりますが、生物種によって、上流配列情報がないものもあります(例:シロイヌナズナ)。

「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。

1. 利用可能な生物種とRにインストール済みの生物種をリストアップしたい場合:

#必要なパッケージをロード
library(BSgenome)                      #パッケージの読み込み

#本番(利用可能なリストアップ;インストール済みとは限らない)
available.genomes()                    #このパッケージ中で利用可能なゲノムをリストアップ

#本番(インストール済みの生物種をリストアップ)
installed.genomes()                    #インストール済みの生物種をリストアップ

#後処理(パッケージ名でだいたいわかるがproviderやversionを分割して表示したい場合)
installed.genomes(splitNameParts=TRUE) #インストール済みの生物種をリストアップ
	

2. ゼブラフィッシュ("BSgenome.Drerio.UCSC.danRer7")のゲノム情報をRにインストールしたい場合:

400MB程度あります...

param <- "BSgenome.Drerio.UCSC.danRer7"#パッケージ名を指定

#本番
source("http://bioconductor.org/biocLite.R")#おまじない
biocLite(param)                        #おまじない

#後処理(インストール済みの生物種をリストアップ)
installed.genomes()                    #インストール済みの生物種をリストアップ
	

3. インストール済みのゼブラフィッシュ("BSgenome.Drerio.UCSC.danRer7")の転写開始点上流配列(1000bp)をmulti-FASTAファイルで保存したい場合:

上流1000bp以外に2000bp, 5000bpもあります...

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "BSgenome.Drerio.UCSC.danRer7"#パッケージ名を指定
param2 <- "upstream1000"               #上流1000bpを指定

#必要なパッケージをロード
library(param1, character.only=T)      #param1で指定したパッケージの読み込み

#前処理(param1で指定したパッケージ中のオブジェクト名をhogeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#param1で指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param1, sep=":"))#param1で指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
hoge <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてhogeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
hoge                                   #確認してるだけです(ここで、multiple sequencesのところにparam2で指定した文字列が存在するのでparam2が有効なんです)

#本番
tmp <- paste("hoge$", param2, sep="")  #param2で指定した文字列を含むオブジェクト名を作成した結果をtmpに格納
fasta <- eval(parse(text=tmp))         #文字列tmpをRオブジェクトとしてfastaに格納

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. インストール済みのマウス("BSgenome.Mmusculus.UCSC.mm9")の転写開始点上流配列(2000bp)をmulti-FASTAファイルで保存したい場合:

上流2000bp以外に1000bp, 5000bpもあります...

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "BSgenome.Mmusculus.UCSC.mm9"#パッケージ名を指定
param2 <- "upstream2000"               #上流2000bpを指定

#必要なパッケージをロード
library(param1, character.only=T)      #param1で指定したパッケージの読み込み

#前処理(param1で指定したパッケージ中のオブジェクト名をhogeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#param1で指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param1, sep=":"))#param1で指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
hoge <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてhogeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
hoge                                   #確認してるだけです(ここで、multiple sequencesのところにparam2で指定した文字列が存在するのでparam2が有効なんです)

#本番
tmp <- paste("hoge$", param2, sep="")  #param2で指定した文字列を含むオブジェクト名を作成した結果をtmpに格納
fasta <- eval(parse(text=tmp))         #文字列tmpをRオブジェクトとしてfastaに格納

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

5. インストール済みのヒト("BSgenome.Hsapiens.UCSC.hg19")の転写開始点上流配列(1000bp)をmulti-FASTAファイルで保存したい場合:

上流1000bp以外に2000bp, 5000bpもあります...

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "BSgenome.Hsapiens.UCSC.hg19"#パッケージ名を指定
param2 <- "upstream1000"               #上流1000bpを指定

#必要なパッケージをロード
library(param1, character.only=T)      #param1で指定したパッケージの読み込み

#前処理(param1で指定したパッケージ中のオブジェクト名をhogeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#param1で指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param1, sep=":"))#param1で指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
hoge <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてhogeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
hoge                                   #確認してるだけです(ここで、multiple sequencesのところにparam2で指定した文字列が存在するのでparam2が有効なんです)

#本番
tmp <- paste("hoge$", param2, sep="")  #param2で指定した文字列を含むオブジェクト名を作成した結果をtmpに格納
fasta <- eval(parse(text=tmp))         #文字列tmpをRオブジェクトとしてfastaに格納

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

6. インストール済みのヒト("BSgenome.Hsapiens.NCBI.GRCh38")の転写開始点上流配列(1000bp)をmulti-FASTAファイルで保存したい場合:

2013年12月にリリースされたGenome Reference Consortium GRCh38のRパッケージです。上流配列情報を含まないのでエラーがでます。

out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "BSgenome.Hsapiens.NCBI.GRCh38"#パッケージ名を指定
param2 <- "upstream1000"               #上流1000bpを指定

#必要なパッケージをロード
library(param1, character.only=T)      #param1で指定したパッケージの読み込み

#前処理(param1で指定したパッケージ中のオブジェクト名をhogeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#param1で指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param1, sep=":"))#param1で指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
hoge <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてhogeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
hoge                                   #確認してるだけです(ここで、multiple sequencesのところにparam2で指定した文字列が存在するのでparam2が有効なんです)

#本番
tmp <- paste("hoge$", param2, sep="")  #param2で指定した文字列を含むオブジェクト名を作成した結果をtmpに格納
fasta <- eval(parse(text=tmp))         #文字列tmpをRオブジェクトとしてfastaに格納

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

7. インストール済みのシロイヌナズナ("BSgenome.Athaliana.TAIR.TAIR9")の転写開始点上流配列(2000bp)をmulti-FASTAファイルで保存したい場合:

最後のほうのfastaオブジェクト作成のところでエラーが出ます。理由はmultiple sequencesのところがないためにhoge$upstream2000の情報を取得できないためです。

out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "BSgenome.Athaliana.TAIR.TAIR9"#パッケージ名を指定
param2 <- "upstream2000"               #上流2000bpを指定

#必要なパッケージをロード
library(param1, character.only=T)      #param1で指定したパッケージの読み込み

#前処理(param1で指定したパッケージ中のオブジェクト名をhogeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#param1で指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param1, sep=":"))#param1で指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
hoge <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてhogeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
hoge                                   #確認してるだけです(ここで、multiple sequencesのところにparam2で指定した文字列が存在するのでparam2が有効なんです)

#本番
tmp <- paste("hoge$", param2, sep="")  #param2で指定した文字列を含むオブジェクト名を作成した結果をtmpに格納
fasta <- eval(parse(text=tmp))         #文字列tmpをRオブジェクトとしてfastaに格納

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

8. インストール済みのヒト("BSgenome.Hsapiens.UCSC.hg19")の転写開始点上流配列(1000bp)をmulti-FASTAファイルで保存したい場合:

2014年4月リリースのBioconductor 2.14での推奨手順です。ゲノムのパッケージ(例:BSgenome.Hsapiens.UCSC.hg19)と 対応するアノテーションパッケージ(例:TxDb.Hsapiens.UCSC.hg19.knownGene)を読み込んで実行しています。

out_f <- "hoge8.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "BSgenome.Hsapiens.UCSC.hg19"#パッケージ名を指定(BSgenome系のゲノムパッケージ)
param2 <- "TxDb.Hsapiens.UCSC.hg19.knownGene"#パッケージ名を指定(Transcript DBオブジェクト系のアノテーションパッケージ)
param3 <- 1000                         #上流 x bpを指定

#前処理(指定したパッケージ中のオブジェクト名をgenomeおよびtxdbに統一)
library(param1, character.only=T)      #指定したパッケージの読み込み
tmp <- ls(paste("package", param1, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納

library(param2, character.only=T)      #指定したパッケージの読み込み
tmp <- ls(paste("package", param2, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納

#本番
gn <- sort(genes(txdb))                #遺伝子の座標情報を取得
hoge <- flank(gn, width=param3)        #指定した範囲の座標情報を取得
fasta <- getSeq(genome, hoge)          #指定した範囲の塩基配列情報を取得

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | 一般 | 配列取得 | プロモーター配列 | GenomicFeatures(Lawrence_2013)

GenomicFeaturesパッケージを主に用いてプロモーター配列(転写開始点近傍配列)を得るやり方を示します。

ここでは、イントロ | 一般 | 配列取得 | ゲノム配列(BSgenomeから)で指定可能なゲノムと イントロ | NGS | アノテーション情報取得 | TranscriptDb | GenomicFeatures(Lawrence_2013)で作成可能なTranscriptDbオブジェクトを入力として、 getPromoterSeqという関数を用いて、転写開始点から任意の[上流xxx塩基, 下流yyy塩基]分の塩基配列を取得して、 FASTA形式ファイルで保存するやり方を示しています。

1. ヒト("BSgenome.Hsapiens.UCSC.hg19")の[上流200塩基, 下流30塩基]のプロモーター配列を取得する場合:

ヒトゲノム ver. 19 ("hg19"; Genome Reference Consortium GRCh37のことらしい)のUCSC Genes ("knownGene")のTranscriptDbオブジェクトを利用しています。

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "BSgenome.Hsapiens.UCSC.hg19"#ゲノムのパッケージ名を指定
param2 <- "hg19"                       #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param3 <- "knownGene"                  #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param4 <- 200                          #転写開始点上流の塩基配列数を指定
param5 <- 30                           #転写開始点下流の塩基配列数を指定

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#前処理(ゲノム情報を取得)
library(param1, character.only=T)      #param1で指定したパッケージの読み込み
tmp <- ls(paste("package", param1, sep=":"))#param1で指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納
genome                                 #確認してるだけです

#前処理(アノテーション情報を取得)
txdb <- makeTranscriptDbFromUCSC(genome=param2, tablename=param3)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです

#本番(配列取得)
out <- getPromoterSeq(transcriptsBy(txdb, by="gene"), genome, upstream=param4, downstream=param5)#指定した範囲のプロモーター配列を取得してoutに格納
out                                    #確認してるだけです

#ファイルに保存
fasta <- unlist(out)        #XStringSetListオブジェクトからXStringSetオブジェクトに変換した結果をfastaに格納
fasta                                  #確認してるだけです
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. ヒト("BSgenome.Hsapiens.UCSC.hg19")の[上流200塩基, 下流30塩基]のプロモーター配列を取得する場合:

ヒトゲノム ver. 19 ("hg19"; Genome Reference Consortium GRCh37のことらしい)のEnsembl Genes ("ensGene")のTranscriptDbオブジェクトを利用しています。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "BSgenome.Hsapiens.UCSC.hg19"#ゲノムのパッケージ名を指定
param2 <- "hg19"                       #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param3 <- "ensGene"                    #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param4 <- 200                          #転写開始点上流の塩基配列数を指定
param5 <- 30                           #転写開始点下流の塩基配列数を指定

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#前処理(ゲノム情報を取得)
library(param1, character.only=T)      #param1で指定したパッケージの読み込み
tmp <- ls(paste("package", param1, sep=":"))#param1で指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納
genome                                 #確認してるだけです

#前処理(アノテーション情報を取得)
txdb <- makeTranscriptDbFromUCSC(genome=param2, tablename=param3)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです

#本番(配列取得)
out <- getPromoterSeq(transcriptsBy(txdb, by="gene"), genome, upstream=param4, downstream=param5)#指定した範囲のプロモーター配列を取得してoutに格納
out                                    #確認してるだけです

#ファイルに保存
fasta <- unlist(out)        #XStringSetListオブジェクトからXStringSetオブジェクトに変換した結果をfastaに格納
fasta                                  #確認してるだけです
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. シロイヌナズナ("BSgenome.Athaliana.TAIR.TAIR9")の[上流500塩基, 下流0塩基]のプロモーター配列を取得する場合:

UCSCからはArabidopsisの遺伝子アノテーション情報が提供されていないため、 TAIR10_GFF3_genes.gffを予めダウンロードしておき、 makeTranscriptDbFromGFF関数を用いてTranscriptDbオブジェクトを作成しています。

現状では、getPromoterSeq関数実行部分で「...sequence ChrC has incompatible circularity flags:」という類のエラーが出ます。 以下は、seqinfo(genome)とseqinfo(txdb)で確かにChrCの情報のみ矛盾していることを示しています。どっちが正しいのでしょう?

in_f1 <- "BSgenome.Athaliana.TAIR.TAIR9"#入力ファイル名を指定してin_f1に格納(リファレンス配列)
in_f2 <- "TAIR10_GFF3_genes.gff"       #入力ファイル名を指定してin_f2に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 500                          #転写開始点上流の塩基配列数を指定
param2 <- 0                            #転写開始点下流の塩基配列数を指定

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#前処理(ゲノム情報を取得)
library(in_f1, character.only=T)       #in_f1で指定したパッケージの読み込み
tmp <- ls(paste("package", in_f1, sep=":"))#in_f1で指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納
genome                                 #確認してるだけです
seqinfo(genome)                        #確認してるだけです

#前処理(アノテーション情報を取得)
txdb <- makeTranscriptDbFromGFF(in_f2, format="gff3")#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです
seqinfo(txdb)                          #確認してるだけです

#本番(配列取得)
out <- getPromoterSeq(transcriptsBy(txdb, by="gene"), genome, upstream=param1, downstream=param2)#指定した範囲のプロモーター配列を取得してoutに格納
out                                    #確認してるだけです

#ファイルに保存
fasta <- unlist(out)        #XStringSetListオブジェクトからXStringSetオブジェクトに変換した結果をfastaに格納
fasta                                  #確認してるだけです
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. シロイヌナズナ("BSgenome.Athaliana.TAIR.TAIR9")の[上流500塩基, 下流0塩基]のプロモーター配列を取得する場合:

UCSCからはArabidopsisの遺伝子アノテーション情報が提供されていないため、 TAIR10_GFF3_genes.gffを予めダウンロードしておき、 makeTranscriptDbFromGFF関数を用いてTranscriptDbオブジェクトを作成しています。

現状では、getPromoterSeq関数実行部分で「...sequence ChrC has incompatible circularity flags:」という類のエラーが出ます。 以下は、seqinfo(genome)とseqinfo(txdb)で確かにChrCの情報のみ矛盾していることを示しています。 ここでは、ChrCが環状かどうかの真偽はさておき、ゲノムファイルのほうのChrCが環状ではないというふうに変更して対処していますが、 それでも「以下にエラー loadFUN(x, seqname, ranges) : trying to load regions beyond the boundaries of non-circular sequence "Chr3"」 というエラーに遭遇してしまいます...orz

in_f1 <- "BSgenome.Athaliana.TAIR.TAIR9"#入力ファイル名を指定してin_f1に格納(リファレンス配列)
in_f2 <- "TAIR10_GFF3_genes.gff"       #入力ファイル名を指定してin_f2に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 500                          #転写開始点上流の塩基配列数を指定
param2 <- 0                            #転写開始点下流の塩基配列数を指定

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#前処理(ゲノム情報を取得)
library(in_f1, character.only=T)       #in_f1で指定したパッケージの読み込み
tmp <- ls(paste("package", in_f1, sep=":"))#in_f1で指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納
genome                                 #確認してるだけです
seqinfo(genome)                        #確認してるだけです
genome@seqinfo@is_circular <- c(F, F, F, F, F, T, F)#確認してるだけです
genome@seqinfo@is_circular             #確認してるだけです

#前処理(アノテーション情報を取得)
txdb <- makeTranscriptDbFromGFF(in_f2, format="gff3")#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです
seqinfo(txdb)                          #確認してるだけです

#本番(配列取得)
out <- getPromoterSeq(transcriptsBy(txdb, by="gene"), genome, upstream=param1, downstream=param2)#指定した範囲のプロモーター配列を取得してoutに格納
out                                    #確認してるだけです

#ファイルに保存
fasta <- unlist(out)        #XStringSetListオブジェクトからXStringSetオブジェクトに変換した結果をfastaに格納
fasta                                  #確認してるだけです
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

5. シロイヌナズナ(TAIR10_chr_all.fas)の[上流500塩基, 下流0塩基]のプロモーター配列を取得する場合:

UCSCからはArabidopsisの遺伝子アノテーション情報が提供されていないため、 TAIR10_GFF3_genes.gffを予めダウンロードしておき、 makeTranscriptDbFromGFF関数を用いてTranscriptDbオブジェクトを作成しています。

イントロ | NGS | 読み込み | FASTA形式 | description行の記述を整形を参考にして、 description行の文字列をgffファイルと対応がとれるように変更しています。それでもまだ 「以下にエラー value[[3L]](cond) : record 16760 (Chr3:23459805-23460304) was truncated」というエラーに遭遇します。 Chr3は23459830 bpしかないこと、gffファイルでも23460304のような存在しない領域を指定しているわけでもないので、理解不能です。

in_f1 <- "TAIR10_chr_all.fas"          #入力ファイル名を指定してin_f1に格納(リファレンス配列)
in_f2 <- "TAIR10_GFF3_genes.gff"       #入力ファイル名を指定してin_f2に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 500                          #転写開始点上流の塩基配列数を指定
param2 <- 0                            #転写開始点下流の塩基配列数を指定
param3 <- c("Chr1","Chr2","Chr3","Chr4","Chr5","ChrM","ChrC")#置換したい文字列を指定

#必要なパッケージをロード
library(Rsamtools)                     #パッケージの読み込み
library(Biostrings)                    #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#前処理(ゲノム情報を取得)
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
fasta                                  #確認してるだけです
names(fasta) <- param3                  #names(fasta)の中身をparam3で置換
fasta                                  #確認してるだけです
writeXStringSet(fasta, file="hogegege.fa", format="fasta", width=50)#fastaの中身を指定したファイル名で保存

#前処理(アノテーション情報を取得)
txdb <- makeTranscriptDbFromGFF(in_f2, format="gff3")#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです

#本番(配列取得)
#本番
gn <- sort(genes(txdb))                #遺伝子の座標情報を取得
hoge <- flank(gn, width=param1)        #指定した範囲の座標情報を取得
out <- getSeq(FaFile("hogegege.fa"), hoge)#指定した範囲の塩基配列情報を取得
#out <- getPromoterSeq(transcriptsBy(txdb, by="gene"), FaFile("hogegege.fa"), upstream=param1, downstream=param2)#指定した範囲のプロモーター配列を取得してoutに格納
out                                    #確認してるだけです

#ファイルに保存
fasta <- unlist(out)        #XStringSetListオブジェクトからXStringSetオブジェクトに変換した結果をfastaに格納
fasta                                  #確認してるだけです
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

6. ヒト("BSgenome.Hsapiens.NCBI.GRCh38")の[上流200塩基, 下流30塩基]のプロモーター配列を取得する場合:

ヒトゲノム ("hg38"; 2013年12月にリリースされたGenome Reference Consortium GRCh38)です。 現状では、RefSeq Genes ("refGene")を指定するとTranscriptDbオブジェクト作成まではできますがgetPromoterSeq関数実行時にエラーが出ます。 また、Ensembl Genes ("ensGene")を指定するとTranscriptDbオブジェクト作成段階でエラーが出ます...orz

out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "BSgenome.Hsapiens.NCBI.GRCh38"#ゲノムのパッケージ名を指定
param2 <- "hg38"                       #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param3 <- "refGene"                    #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param4 <- 200                          #転写開始点上流の塩基配列数を指定
param5 <- 30                           #転写開始点下流の塩基配列数を指定

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#前処理(ゲノム情報を取得)
library(param1, character.only=T)      #param1で指定したパッケージの読み込み
tmp <- ls(paste("package", param1, sep=":"))#param1で指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納
genome                                 #確認してるだけです

#前処理(アノテーション情報を取得)
txdb <- makeTranscriptDbFromUCSC(genome=param2, tablename=param3)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです

#本番(配列取得)
out <- getPromoterSeq(transcriptsBy(txdb, by="gene"), genome, upstream=param4, downstream=param5)#指定した範囲のプロモーター配列を取得してoutに格納
out                                    #確認してるだけです

#ファイルに保存
fasta <- unlist(out)        #XStringSetListオブジェクトからXStringSetオブジェクトに変換した結果をfastaに格納
fasta                                  #確認してるだけです
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | 一般 | 配列取得 | トランスクリプトーム配列 | biomaRt(Durinck_2009)

biomaRtパッケージ (Durinck et al., Nat Protoc., 2009)を用いて様々なIDに対応する転写物(トランスクリプトーム)配列を取得するやり方を示します。

BioMart (Kasprzyk A., Database, 2011)本体のウェブサービスへのアクセスをR経由で行うもの、という理解でいいです。

「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。

1. RefSeq mRNAをキーとしてヒトのcDNA配列を取得したい場合:

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "hsapiens_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- "refseq_mrna"       #配列を取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
param_seqtype <- "cdna"                #配列のタイプを指定(cdna, peptide, 3utr, 5utr, genomicのいずれかが指定可能です)

#必要なパッケージをロード
library(biomaRt)                       #パッケージの読み込み

#前処理(IDリスト情報を取得)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
hoge <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#指定したIDリスト取得結果をhogeに格納
head(hoge)                             #確認してるだけです
length(hoge)                           #ID数を表示

#本番(配列取得)
out <- getSequence(id=hoge, type=param_attribute,#指定したパラメータで配列取得した結果をoutに格納
                seqType=param_seqtype, mart=mart)#指定したパラメータで配列取得した結果をoutに格納
dim(out)                               #配列数を表示

#ファイルに保存
exportFASTA(out, file=out_f)           #outの中身を指定したファイル名で保存
	

2. Ensembl Gene IDをキーとしてヒトのcDNA配列を取得したい場合:

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "hsapiens_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- "ensembl_gene_id"   #配列を取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
param_seqtype <- "cdna"                #配列のタイプを指定(cdna, peptide, 3utr, 5utr, genomicのいずれかが指定可能です)

#必要なパッケージをロード
library(biomaRt)                       #パッケージの読み込み

#前処理(IDリスト情報を取得)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
hoge <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#指定したIDリスト取得結果をhogeに格納
head(hoge)                             #確認してるだけです
length(hoge)                           #ID数を表示

#本番(配列取得)
out <- getSequence(id=hoge, type=param_attribute,#指定したパラメータで配列取得した結果をoutに格納
                seqType=param_seqtype, mart=mart)#指定したパラメータで配列取得した結果をoutに格納
dim(out)                               #配列数を表示

#ファイルに保存
exportFASTA(out, file=out_f)           #outの中身を指定したファイル名で保存
	

3. Ensembl Gene IDをキーとしてヒトのgene_exon_intron配列を取得したい場合:

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "hsapiens_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- "ensembl_gene_id"   #配列を取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
param_seqtype <- "gene_exon_intron"    #配列のタイプを指定(cdna, peptide, 3utr, 5utr, genomicのいずれかが指定可能です)

#必要なパッケージをロード
library(biomaRt)                       #パッケージの読み込み

#前処理(IDリスト情報を取得)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
hoge <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#指定したIDリスト取得結果をhogeに格納
head(hoge)                             #確認してるだけです
length(hoge)                           #ID数を表示

#本番(配列取得)
out <- getSequence(id=hoge, type=param_attribute,#指定したパラメータで配列取得した結果をoutに格納
                seqType=param_seqtype, mart=mart)#指定したパラメータで配列取得した結果をoutに格納
dim(out)                               #配列数を表示

#ファイルに保存
exportFASTA(out, file=out_f)           #outの中身を指定したファイル名で保存
	

4. RefSeq mRNAをキーとしてラットのcDNA配列を取得したい場合:

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "rnorvegicus_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- "refseq_mrna"       #配列を取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
param_seqtype <- "cdna"                #配列のタイプを指定(cdna, peptide, 3utr, 5utr, genomicのいずれかが指定可能です)

#必要なパッケージをロード
library(biomaRt)                       #パッケージの読み込み

#前処理(IDリスト情報を取得)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
hoge <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#指定したIDリスト取得結果をhogeに格納
head(hoge)                             #確認してるだけです
length(hoge)                           #ID数を表示

#本番(配列取得)
out <- getSequence(id=hoge, type=param_attribute,#指定したパラメータで配列取得した結果をoutに格納
                seqType=param_seqtype, mart=mart)#指定したパラメータで配列取得した結果をoutに格納
dim(out)                               #配列数を表示

#ファイルに保存
exportFASTA(out, file=out_f)           #outの中身を指定したファイル名で保存
	

5. EMBL (Genbank) IDをキーとしてモルモット(C. porcellus)の5' UTR配列を取得したい場合:

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "cporcellus_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- "embl"              #配列を取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
param_seqtype <- "5utr"                #配列のタイプを指定(cdna, peptide, 3utr, 5utr, genomicのいずれかが指定可能です)

#必要なパッケージをロード
library(biomaRt)                       #パッケージの読み込み

#前処理(IDリスト情報を取得)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
hoge <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#指定したIDリスト取得結果をhogeに格納
head(hoge)                             #確認してるだけです
length(hoge)                           #ID数を表示

#本番(配列取得)
out <- getSequence(id=hoge, type=param_attribute,#指定したパラメータで配列取得した結果をoutに格納
                seqType=param_seqtype, mart=mart)#指定したパラメータで配列取得した結果をoutに格納
dim(out)                               #配列数を表示

#ファイルに保存
exportFASTA(out, file=out_f)           #outの中身を指定したファイル名で保存
	

イントロ | NGS | 様々なプラットフォーム

配列データを生み出す装置はいくつかあります。最近では、いろんな分野でオープンソースという言葉を聞いたことがあると思いますが、POLONATORというのが、シーケンサーのオープンソース版みたいです。かずさDNA研究所が導入しているようです。

配列長に関するあたりの旧世代との比較:

生み出す配列長の特徴としては、いわゆる第一世代のApplied Biosystems Prism 3730 (ABI3730)やGEヘルスケア社のMegaBACEなどが500-1000bp程度読めるのに対して、NGSデータはRoche 454が400bp程度(最新のGS FLX+という機種は700bpくらい読めるらしい)、Illumina Genome AnalyzerIIxが最近片側150bpのpaired-end(ペアードエンド;合計300bp)を読めるようになった程度です。PacBio RS Systemは20,000bp以上読めるようですが配列のqualityが若干(85%程度)劣るようです。

そのため、染色体サイズの配列のアセンブリ時に"のりしろ"部分が絶対的に短くなるため混乱(confounding;交絡のほうが適切か?!)しがちです。これを回避する(あるいはアセンブリ精度向上の)ためにはhigh coverage(とにかく沢山読んでおく必要がある、ということ)であることが大事ですが、high coverageであることは複雑性(complexity)が増すということを意味するとともに、高い処理能力をもったコンピュータを利用しなければいけない、ということも意味します。

これと関連して、全てのシーケンサー(塩基配列を読む機械)は、「ACGTといった一塩基につき一文字表記(single-letter base calls)の塩基配列」と「その塩基だと判断した結果がどの程度正しいかを示すクオリティ値(quality value; QV)」を出力します。もちろんQV値の使用はアセンブリ精度向上に寄与することは確かでしょうが、その情報を取り込む分だけコンピュータのメモリを使用しますので、実際にQV値を考慮してアセンブルを行うプログラムのほうが少数派のようです。

NGSプラットフォームに特徴的なエラーについて(Error profile):

三点あるようです。

  1. 「3'末端(terminal ends)に進むほどbase call errorが増大」
  2. 「読まれる配列がGC含量の高いものに偏っている(compositional bias for high-GC reads)」
  3. 「単純なリピート配列をsequenceするのが不得手(inaccurate determination of repeat sequences)」

このエラープロファイルについての論文はRoche 454 GS20(参考文献1)、Illumina 1G Analyzer(参考文献2)、プラットフォーム間の比較(参考文献3)あたりがとりあえず参考になるでしょう。

ABI SOLiDについて:

このプラットフォームのbase call (塩基配列の読み方)は特殊です。0,1,2,3の四つの数字で表現され、これらは"color"といわれるようです。 で、この各colorは一つ前の塩基と関連して塩基を表現しているようです。 となると本当の最初の塩基はどうやって表現するのだろう?と思いますが、アダプター配列のような感じでランごとに決まった塩基が付加?!されているようです(The reads's first base is a constant per run)。 というわけで、実験によって得られたこの"color space"を"base space"に変換するといったことをやる必要があるようですね。 このような特殊性のために、SOLiDデータのためのプログラムはそれほど多くないのでしょう(参考文献4)。

イントロ | NGS | qPCRやmicroarrayなどとの比較

一言でいえば、3者の再現性は高いようです。NGS (RNA-seq)データも(マイクロアレイのときと同様に)

  1. 発現レベルをどのようにして見積もるか(定量化するか)
  2. サンプル間比較をするためにどのように正規化するか

という論文が出ています。

まず、1についてですが、様々な定量化の方法が提案されており、数十個程度の遺伝子についてRT-PCR (qPCR?! or (半)定量PCR?! <-このあたりの用語に違いがあるのかといったあたりについては無知です) の結果との比較を行い、定量化法の良しあしを評価しています。

イントロ | NGS | 配列取得 | FASTQ or SRALite | 公共DBから

次世代シーケンサーから得られる塩基配列データを公共データベースから取得します。

データの形式は基本的にSanger typeのFASTQ形式です。

FASTA形式はリードあたり二行(idの行と配列の行)で表現します。

FASTQ形式はリードあたり4行(@から始まるidの行と配列の行、および+から始まるidの行とbase callの際のqualityの行)で表現します。

FASTQ形式は、Sangerのものがオリジナルで、Illuminaのプラットフォームから得られるのはFASTQ-like formatという表現がなされるようです。

NCBI SRAはSanger typeのデータです。

イントロ | NGS | 配列取得 | FASTQ or SRALite | SRAdb(Zhu_2013)

SRAdbパッケージを用いてRNA-seq配列を取得するやり方を示します。 SRALite形式などでも取得可能なようですが、ここではFASTQファイルをダウンロードするやり方を示します。

重要:2014/03/27にgetFASTQinfo関数実行部分以降で、「以下にエラー read.table(file = file, header = header, sep = sep, quote = quote, : no lines available in input」というエラーに遭遇しましたが、2014/04/01には正常になっていました。

「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。

1. RNA-seqデータ("SRA000299":Marioni et al., Genome Res., 2008)の実験デザインの全体像やファイルサイズを眺める場合:

論文中の記述から腎臓(kidney: SRS000561)と肝臓(liver: SRS000562)サンプルの二群間比較であることがわかったうえで下記情報を眺めるとより理解が深まります。

この2のサンプルはさらに濃度別に2つに分類されています:腎臓3.0pM (SRX000605), 肝臓3.0pM (SRX000571), 腎臓1.5pM (SRX000606), 肝臓1.5pM (SRX000604)。

param <- "SRA000299"                   #取得したいSRA IDを指定

#必要なパッケージをロード
library(SRAdb)                         #パッケージの読み込み

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(300Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#本番(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。

#本番(FASTQファイルサイズを表示)
k <- getFASTQinfo(hoge$run)            #「hoge$run」で指定したSRRから始まるIDのFASTQファイルサイズ情報などを取得してkに格納
k                                      #kの中身を表示
hoge2 <- cbind(k$library.name,         #ライブラリ名と、
                  k$run.read.count,    #総リード数と、
                  k$file.name,         #ファイル名と、
                  k$file.size)         #ファイルサイズ、の順番で列方向で結合した結果をhoge2に格納
hoge2                                  #hoge2の中身を表示(表示される情報を限定しているだけです)
	

2. ヒトRNA-seqデータ("SRA000299":Marioni et al., Genome Res., 2008)のgzip圧縮済みのFASTQファイルをダウンロードする場合:

計6ファイル、合計7.3Gb程度の容量のファイルがダウンロードされます。東大の有線LANで一時間弱程度かかります。 早く終わらせたい場合は、最後のgetFASTQfile関数のオプションを'ftp'から'fasp'に変更すると時間短縮可能です。

param <- "SRA000299"                   #取得したいSRA IDを指定

#必要なパッケージをロード
library(SRAdb)                         #パッケージの読み込み

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(300Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#前処理(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。

#前処理(FASTQファイルサイズを表示)
k <- getFASTQinfo(hoge$run)            #「hoge$run」で指定したSRRから始まるIDのFASTQファイルサイズ情報などを取得してkに格納
k                                      #kの中身を表示
hoge2 <- cbind(k$library.name,         #ライブラリ名と、
                  k$run.read.count,    #総リード数と、
                  k$file.name,         #ファイル名と、
                  k$file.size)         #ファイルサイズ、の順番で列方向で結合した結果をhoge2に格納
hoge2                                  #hoge2の中身を表示(表示される情報を限定しているだけです)

#本番(FASTQファイルのダウンロード)
getFASTQfile(hoge$run, srcType='ftp')  #「hoge$run」で指定したSRRから始まるIDのFASTQファイルのダウンロード
	

3. RNA-seqデータ("SRP017142":Neyret-Kahn et al., Genome Res., 2013)のgzip圧縮済みのFASTQファイルをダウンロードする場合:

論文中の記述からGSE42213を頼りに、 RNA-seqデータがGSE42212として収められていることを見出し、 その情報からSRP017142にたどり着いています。

計6ファイル、合計6Gb程度の容量のファイルがダウンロードされます。東大の有線LANで一時間弱程度かかります。 早く終わらせたい場合は、最後のgetFASTQfile関数のオプションを'ftp'から'fasp'に変更すると時間短縮可能です。

param <- "SRP017142"                   #取得したいSRA IDを指定

#必要なパッケージをロード
library(SRAdb)                         #パッケージの読み込み

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(圧縮状態で300Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#前処理(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。

#前処理(FASTQファイルサイズを表示)
k <- getFASTQinfo(hoge$run)            #「hoge$run」で指定したSRRから始まるIDのFASTQファイルサイズ情報などを取得してkに格納
k                                      #kの中身を表示
hoge2 <- cbind(k$library.name,         #ライブラリ名と、
                  k$run.read.count,    #総リード数と、
                  k$file.name,         #ファイル名と、
                  k$file.size)         #ファイルサイズ、の順番で列方向で結合した結果をhoge2に格納
hoge2                                  #hoge2の中身を表示(表示される情報を限定しているだけです)

#本番(FASTQファイルのダウンロード)
getFASTQfile(hoge$run, srcType='ftp')  #「hoge$run」で指定したSRRから始まるIDのFASTQファイルのダウンロード
	

4. シロイヌナズナのRNA-seqデータ("SRP011435":Huang et al., Development, 2012)のgzip圧縮済みのFASTQファイルをダウンロードする場合:

論文中の記述からGSE36469を頼りに、 RNA-seqデータがGSE36469として収められていることを見出し、 その情報からSRP011435にたどり着いています。

計8ファイル、合計10Gb程度の容量のファイルがダウンロードされます。東大の有線LANで2時間程度かかります。

param <- "SRP011435"                   #取得したいSRA IDを指定

#必要なパッケージをロード
library(SRAdb)                         #パッケージの読み込み

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(圧縮状態で300Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#前処理(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。

#前処理(FASTQファイルサイズを表示)
k <- getFASTQinfo(hoge$run)            #「hoge$run」で指定したSRRから始まるIDのFASTQファイルサイズ情報などを取得してkに格納
k                                      #kの中身を表示
hoge2 <- cbind(k$library.name,         #ライブラリ名と、
                  k$run.read.count,    #総リード数と、
                  k$file.name,         #ファイル名と、
                  k$file.size)         #ファイルサイズ、の順番で列方向で結合した結果をhoge2に格納
hoge2                                  #hoge2の中身を表示(表示される情報を限定しているだけです)

#本番(FASTQファイルのダウンロード)
getFASTQfile(hoge$run, srcType='ftp')  #「hoge$run」で指定したSRRから始まるIDのFASTQファイルのダウンロード
	

イントロ | NGS | アノテーション情報取得 | について

アノテーション情報の取り扱いやGFF形式のアノテーションファイルの読み込みなどは下記パッケージで利用可能です。例えば、 genomeIntervals中のreadGff3関数や、 GenomicFeatures中のmakeTranscriptDbFromGFF関数などです。

イントロ | NGS | アノテーション情報取得 | GFF/GTF形式ファイル

多くの生物種についてEnsembl (Flicek et al., Nucleic Acids Res., 2013) のFTPサイトからGTF形式(GFF ver. 2)の遺伝子アノテーションファイルを得ることができます。 GTFはGeneral Transfer FormatまたはGene Transfer Formatの略で、GTFの派生版としてGTF2というフォーマットもあるようです。 また、General Feature Format ver. 3 (GFF3)という形式も存在するなど、 GFF/GTF形式として総称されている中で様々なバリエーションがあります。いずれもrefFlat形式同様、どの領域にどの遺伝子があるのかという座標(Coordinates)情報を含みます。 ゲノム配列のバージョンと同じであることを確認した上で用いましょう。

イントロ | NGS | アノテーション情報取得 | refFlat形式ファイル

数多くの生物種についてはUCSCのSequence and Annotation Downloadsから辿っていけばrefFlat形式の遺伝子アノテーションファイルを得ることができます。

このrefFlat形式のアノテーションファイルは、どの領域にどの遺伝子があるのかという座標(Coordinates)情報を含みます。

具体的な使途としては、例えばゲノム配列に対してマッピングした結果から既知遺伝子の発現レベルを見積もるところ(正規化 | 基礎 | RPKM | ゲノム)で必要となります。

マイクロアレイ解析に慣れた人への説明としては、NGS(RNA-seqリード)のゲノムマッピング結果から遺伝子発現行列をお手軽に得るために必要なおまじないのファイル、のようなものだと解釈していただければいいと思います。

例として、ヒトとラットのrefFlatファイルを取得する手順を示します。

Humanの場合:

  1. UCSCのSequence and Annotation Downloadsの"Human"をクリック
  2. Annotation databaseをクリック
  3. (アルファベット順に並んでいるので)refFlat.txt.gzをクリック

得られた圧縮ファイルを解凍するとrefFlat.txtが得られます。

Ratの場合:

  1. UCSCのSequence and Annotation Downloadsの"Rat"をクリック
  2. Annotation databaseをクリック
  3. (アルファベット順に並んでいるので)refFlat.txt.gzをクリック

得られた圧縮ファイルを解凍するとRatのrefFlat.txtが得られます。

UCSC以外にもRefSeq, Ensembl, AceViewなどからも似たような情報を取得可能なようです。

イントロ | NGS | アノテーション情報取得 | biomaRt(Durinck_2009)

biomaRtというRパッケージ(Durinck et al., Nat Protoc., 2009)を用いて、 様々な生物種のアノテーション情報を取得するやり方を示します。一般的にはBioMart (Kasprzyk A., Database, 2011)本体のウェブページ上でやるのでしょうが、私はGUIの変遷についていけませんorz...

ここでは、Ensembl Geneにデータセットを固定した状態で様々な生物種のアノテーション情報を取得するやり方を示します。

尚、Ensembl (Flicek et al., 2013)の遺伝子モデル(gene model)はリファレンスゲノムから直接アノテーションされたものであるのに対して、RefSeqはmRNA配列からアノテーションされたものです。 当然、リファレンスゲノムと個々のmRNA配列は異なりますので、RefSeq mRNA配列の一部はリファレンスゲノム配列にマップされません。

「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。

1. ラット(Rattus norvegicus; rnorvegicus_gene_ensembl)の場合:

取得する情報を4つ指定しています: (1) "ensembl_gene_id", (2) "ensembl_transcript_id", (3) "affy_rat230_2" (Affymetrix Rat Genome 230 2.0 Array; GPL1355のプローブセットID), (4) "go_id"。

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "rnorvegicus_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- c(                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "ensembl_gene_id",      #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "ensembl_transcript_id",#取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "affy_rat230_2",        #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "go_id"                 #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
                    )                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)

#必要なパッケージをロード
library(biomaRt)                       #パッケージの読み込み

#前処理(取得可能なアノテーション情報をリストアップ)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
listAttributes(mart)                   #指定可能な属性名(Attributes)をリストアップ

#本番(アノテーション情報取得)
out <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#アノテーション情報取得結果をhogeに格納
head(out)                              #確認してるだけです
dim(out)                               #行数と列数を表示

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

2. ヒト(Homo Sapiens; hsapiens_gene_ensembl)の場合:

取得する情報を3つ指定しています: (1) "ensembl_transcript_id", (2) "affy_hg_u133_plus_2" (Affymetrix Human Genome U133 Plus 2.0 Array; GPL570のプローブセットID), (3) "refseq_mrna"。

27万行程度のファイルが得られます。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "hsapiens_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- c(                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "ensembl_transcript_id",#取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "affy_hg_u133_plus_2",  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "refseq_mrna"           #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
                    )                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)

#必要なパッケージをロード
library(biomaRt)                       #パッケージの読み込み

#前処理(取得可能なアノテーション情報をリストアップ)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
listAttributes(mart)                   #指定可能な属性名(Attributes)をリストアップ

#本番(アノテーション情報取得)
out <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#アノテーション情報取得結果をhogeに格納
head(out)                              #確認してるだけです
dim(out)                               #行数と列数を表示

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

3. ヒト(Homo Sapiens; hsapiens_gene_ensembl)の場合:

取得する情報を3つ指定しています: (1) "refseq_mrna", (2) "hgnc_symbol", (3) "go_id"。

56万行程度のファイルが得られます。

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "hsapiens_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- c(                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "refseq_mrna",          #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "hgnc_symbol",          #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "go_id"                 #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
                    )                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)

#必要なパッケージをロード
library(biomaRt)                       #パッケージの読み込み

#前処理(取得可能なアノテーション情報をリストアップ)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
listAttributes(mart)                   #指定可能な属性名(Attributes)をリストアップ

#本番(アノテーション情報取得)
out <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#アノテーション情報取得結果をhogeに格納
head(out)                              #確認してるだけです
dim(out)                               #行数と列数を表示

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

4. ヒト(Homo Sapiens; hsapiens_gene_ensembl)の場合:

取得する情報を3つ指定しています: (1) "refseq_mrna", (2) "hgnc_symbol", (3) "go_id"。

3.と基本的には同じですが、refseq_mrna IDが存在するもののみフィルタリングした結果を出力しています。 42.6万行程度のファイルが得られます。以下では"with_ox_refseq_mrna"をオプションとして与えていますが、 なぜかlistFilters(mart)でリストアップされているので指定可能なはずの"refseq_mrna"でやるとエラーが出てしまいます。。。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "hsapiens_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- c(                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "refseq_mrna",          #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "hgnc_symbol",          #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "go_id"                 #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
                    )                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
param_filter <- "with_ox_refseq_mrna"  #フィルタリング条件を指定(「listFilters(mart)」にリストアップされているものを指定可能)

#必要なパッケージをロード
library(biomaRt)                       #パッケージの読み込み

#前処理(取得可能なアノテーション情報をリストアップ)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
listAttributes(mart)                   #指定可能な属性名(Attributes)をリストアップ

#本番(アノテーション情報取得)
out <- getBM(attributes=param_attribute, filters=param_filter, values=list(TRUE), mart=mart)#アノテーション情報取得結果をhogeに格納
head(out)                              #確認してるだけです
dim(out)                               #行数と列数を表示

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

5. ヒト(Homo Sapiens; hsapiens_gene_ensembl)の場合:

取得する情報を3つ指定しています: (1) "refseq_mrna", (2) "hgnc_symbol", (3) "go_id"。

4.と同じ結果を得るべく、「refseq_mrna IDが存在するもののみフィルタリング」のところをgetBM関数のfiltersオプション使用以外の手段で行っています。

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "hsapiens_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- c(                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "refseq_mrna",          #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "hgnc_symbol",          #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "go_id"                 #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
                    )                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)

#必要なパッケージをロード
library(biomaRt)                       #パッケージの読み込み

#前処理(取得可能なアノテーション情報をリストアップ)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
listAttributes(mart)                   #指定可能な属性名(Attributes)をリストアップ

#本番(アノテーション情報取得)
out <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#アノテーション情報取得結果をhogeに格納
head(out)                              #確認してるだけです
dim(out)                               #行数と列数を表示

#後処理(行列outの1列目の情報が存在するもののみフィルタリング:「out <- subset(out, refseq_mrna != "")」でもよい)
obj <- out[,1] != ""                   #条件を満たすかどうかを判定した結果をobjに格納
out <- out[obj,]                       #objがTRUEとなる行のみ抽出した結果をoutに格納
dim(out)                               #行数と列数を表示

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

イントロ | NGS | アノテーション情報取得 | TranscriptDb | について

アノテーション情報を取り扱うためにRでよく利用されるオブジェクトは、TranscriptDb以外に、RangedData、GRangesListなどなどが挙げられますが、 このウェブページでは、TranscriptDbというオブジェクトをアノテーション情報の基本オブジェクトとし、txdbというオブジェクト名で統一して取り扱っています。

このtxdbに対して、GenomicFeaturesで利用可能な transcripts, exons, cds, genes, promoters, disjointExons, microRNAs, tRNAsなどの関数を適用して、GRanges形式のオブジェクトを得ることができます。 出力情報を制限したい場合には、 transcriptsByOverlaps, exonsByOverlaps, cdsByOverlapsなどの関数が利用可能です。

GRanges形式やGRangesList形式オブジェクトの取り扱いはGenomicRangesに記載されています。

イントロ | NGS | アノテーション情報取得 | TranscriptDb | TxDb.*から

QuasRパッケージを用いてゲノムへのマッピング結果からカウント情報を得たいときに、 "TranscriptDb"という形式のオブジェクトを利用する必要があります。TranscriptDbオブジェクトは、makeTranscriptDbFromGFF関数を用いてGTF形式ファイルを入力として作成することも可能ですが、 最も手っ取り早いやり方はTranscriptDbオブジェクト形式で格納されている"TxDb.*"という名前のパッケージを利用することです。 利用可能なTxDb.*パッケージはここにリストアップされているものたちです。

(1)「全パッケージリスト(All Packages)」中の、
(2)「AnnotationDataの左側のさんかく」、
(3)「PackageTypeの左側のさんかく」、
(4)「TranscriptDb」からも辿れます。

ここでは、いくつかのパッケージの読み込みまでを示します。

1. TxDb.Hsapiens.UCSC.hg19.knownGene(ヒト)の場合:

param <- "TxDb.Hsapiens.UCSC.hg19.knownGene"#パッケージ名を指定

#必要なパッケージをロード
library(param, character.only=T)       #paramで指定したパッケージの読み込み

#前処理
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
txdb                                   #確認してるだけです
	

2. TxDb.Rnorvegicus.UCSC.rn5.refGene(ラット)の場合:

param <- "TxDb.Rnorvegicus.UCSC.rn5.refGene"#パッケージ名を指定

#必要なパッケージをロード
library(param, character.only=T)       #paramで指定したパッケージの読み込み

#前処理
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
txdb                                   #確認してるだけです
	

3. TxDb.Rnorvegicus.UCSC.rn5.refGeneパッケージのインストールをしたい場合:

パッケージのインストールができていなかった場合の対処法の例です。

param <- "TxDb.Rnorvegicus.UCSC.rn5.refGene"#パッケージ名を指定

#本番
source("http://bioconductor.org/biocLite.R")#おまじない
biocLite(param)                        #おまじない
	

イントロ | NGS | アノテーション情報取得 | TranscriptDb | GenomicFeatures(Lawrence_2013)

QuasRパッケージを用いてゲノムへのマッピング結果からカウント情報を得たいときに、 "TranscriptDb"という形式のオブジェクトを利用する必要があります。ここでは、GenomicFeatures パッケージを用いてTranscriptDbオブジェクトを得るやり方を示します。

得られるTranscriptDbオブジェクトの元データのバージョンは、当然ここで作成されたもののほうが新しいです。 したがって、慣れてきたら、予め作成された"TxDb.*"パッケージのものを使うよりもここで直接作成してしまうほうがいいでしょう。 しかし、逆に言えば作成するたびに転写物数("transcript_nrow"のところの数値など)が異なってきますので、"RSQLite version at creation time"のところの情報は気にしたほうがいいでしょう。

1. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

どういうものを取得可能かリストアップしているだけです。

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み
library(rtracklayer)                   #パッケージの読み込み

#前処理(UCSCから取得可能なゲノム情報をリストアップ)
ucscGenomes()                          #ゲノム情報をリストアップ

#前処理(makeTranscriptDbFromUCSC関数で取得可能なtable情報をリストアップ)
supportedUCSCtables()                  #table情報をリストアップ
	

2. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

ヒトゲノム ver. 19 ("hg19"; Genome Reference Consortium GRCh37のことらしい)のUCSC Genes ("knownGene")のTranscriptDbオブジェクトを取得するやり方です。

実質的に、"TxDb.Hsapiens.UCSC.hg19.knownGene"パッケージから取得可能なものと同じ(はず)です。

param1 <- "hg19"                       #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "knownGene"                  #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#前処理
txdb <- makeTranscriptDbFromUCSC(genome=param1, tablename=param2)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです
	

3. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

ヒトゲノム ver. 19 ("hg19")のEnsembl Genes ("ensGene")のTranscriptDbオブジェクトを取得するやり方です。

IDはEntrez Gene IDのままで、配列長情報などがEnsembl Genesのものになるだけのようです。

param1 <- "hg19"                       #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#前処理
txdb <- makeTranscriptDbFromUCSC(genome=param1, tablename=param2)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです
transcripts(txdb)                      #確認してるだけです
	

4. Ensemblから遺伝子アノテーション情報を取得する場合:

ヒト("hsapiens_gene_ensembl")のTranscriptDbオブジェクトを取得するやり方です。

param <- "hsapiens_gene_ensembl"       #データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#前処理
txdb <- makeTranscriptDbFromBiomart(dataset=param)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです
transcripts(txdb)                      #確認してるだけです
	

5. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

マウスゲノム ("mm10"; Genome Reference Consortium GRCm38)のEnsembl Genes ("ensGene")のTranscriptDbオブジェクトを取得するやり方です。

param1 <- "mm10"                       #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#前処理
txdb <- makeTranscriptDbFromUCSC(genome=param1, tablename=param2)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです
transcripts(txdb)                      #確認してるだけです
	

6. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

ラットゲノム ("rn5"; RGSC Rnor_5.0)のEnsembl Genes ("ensGene")のTranscriptDbオブジェクトを取得するやり方です。

param1 <- "rn5"                        #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#前処理
txdb <- makeTranscriptDbFromUCSC(genome=param1, tablename=param2)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです
transcripts(txdb)                      #確認してるだけです
	

7. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

ヒツジゲノム ("oviAri3"; ISGC Oar_v3.1)のEnsembl Genes ("ensGene")のTranscriptDbオブジェクトを取得するやり方です。

param1 <- "oviAri3"                    #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#前処理
txdb <- makeTranscriptDbFromUCSC(genome=param1, tablename=param2)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです
transcripts(txdb)                      #確認してるだけです
	

8. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

ニワトリゲノム ("galGal4"; ICGC Gallus-gallus-4.0)のEnsembl Genes ("ensGene")のTranscriptDbオブジェクトを取得するやり方です。

param1 <- "galGal4"                    #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#前処理
txdb <- makeTranscriptDbFromUCSC(genome=param1, tablename=param2)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです
transcripts(txdb)                      #確認してるだけです
	

イントロ | NGS | アノテーション情報取得 | TranscriptDb | GFF/GTF形式ファイルから

QuasRパッケージを用いてゲノムへのマッピング結果からカウント情報を得たいときに、 "TranscriptDb"という形式のオブジェクトを利用する必要があります。ここでは、GenomicFeatures パッケージを用いて手元にあるGFF/GTF形式ファイルを入力としてTranscriptDbオブジェクトを得るやり方を示します。

基本的にはGenomicFeaturesパッケージ中のmakeTranscriptDbFromGFF関数を用いてGFF/GTF形式ファイルを読み込むことで TranscriptDbオブジェクトをエラーなく読み込むこと自体は簡単にできます。しかし、得られたTranscriptDbオブジェクトとゲノムマッピング結果ファイルを用いてカウント情報を得る場合に、 ゲノム配列提供元とアノテーション情報提供元が異なっているとエラーとなります。具体的には、GFF/GTFファイル中にゲノム配列中にない染色体名があるとエラーが出る場合があります。

1. TAIR(Lamesch et al., Nucleic Acids Res., 2012) から提供されているArabidopsisのGFF3形式ファイル(TAIR10_GFF3_genes.gff)の場合:

基本形です。

in_f <- "TAIR10_GFF3_genes.gff"        #入力ファイル名を指定してin_fに格納(GFF/GTFファイル)

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#本番(TranscriptDbオブジェクトの作成)
txdb <- makeTranscriptDbFromGFF(in_f)  #txdbオブジェクトの作成
txdb                                   #確認してるだけです
	

2. サンプルデータ23のヒトGTFファイル(human_annotation_sub3.gtf)の場合:

基本形です。

in_f <- "human_annotation_sub3.gtf"    #入力ファイル名を指定してin_fに格納(GFF/GTFファイル)

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#本番(TranscriptDbオブジェクトの作成)
txdb <- makeTranscriptDbFromGFF(in_f, format="gtf")#txdbオブジェクトの作成
txdb                                   #確認してるだけです
	

3. サンプルデータ23のヒトGTFファイル(human_annotation_sub3.gtf)の場合:

うまくいく例です。

in_f1 <- "human_annotation_sub3.gtf"   #入力ファイル名を指定してin_f1に格納(GFF/GTFファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#前処理(リファレンス配列の染色体名を抽出)
param <- in_f2                         #paramという名前で取り扱いたいだけです
library(param, character.only=T)       #paramで指定したパッケージの読み込み
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
hoge <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてhogeに格納
chrominfo <- data.frame(chrom=as.character(seqnames(hoge)),#染色体情報をchrominfoに格納
                        length=as.vector(seqlengths(hoge)),#染色体情報をchrominfoに格納
                      is_circular=hoge@seqinfo@is_circular)#染色体情報をchrominfoに格納

#本番(TranscriptDbオブジェクトの作成)
txdb <- makeTranscriptDbFromGFF(file=in_f1, format="gtf",#txdbオブジェクトの作成
                     exonRankAttributeName="exon_number",#txdbオブジェクトの作成
                      gffGeneIdAttributeName="gene_name",#txdbオブジェクトの作成
                   chrominfo=chrominfo,#txdbオブジェクトの作成
                species=organism(hoge))#txdbオブジェクトの作成
txdb                                   #確認してるだけです
	

4. サンプルデータ22のヒトGTFファイル(human_annotation_sub2.gtf)の場合:

うまくいかない例です。

in_f1 <- "human_annotation_sub2.gtf"   #入力ファイル名を指定してin_f1に格納(GFF/GTFファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#前処理(リファレンス配列の染色体名を抽出)
param <- in_f2                         #paramという名前で取り扱いたいだけです
library(param, character.only=T)       #paramで指定したパッケージの読み込み
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
hoge <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてhogeに格納
chrominfo <- data.frame(chrom=as.character(seqnames(hoge)),#染色体情報をchrominfoに格納
                        length=as.vector(seqlengths(hoge)),#染色体情報をchrominfoに格納
                      is_circular=hoge@seqinfo@is_circular)#染色体情報をchrominfoに格納

#本番(TranscriptDbオブジェクトの作成)
txdb <- makeTranscriptDbFromGFF(file=in_f1, format="gtf",#txdbオブジェクトの作成
                     exonRankAttributeName="exon_number",#txdbオブジェクトの作成
                      gffGeneIdAttributeName="gene_name",#txdbオブジェクトの作成
                   chrominfo=chrominfo,#txdbオブジェクトの作成
                species=organism(hoge))#txdbオブジェクトの作成
txdb                                   #確認してるだけです
	

5. サンプルデータ21のヒトGTFファイル(human_annotation_sub1.gtf)の場合:

うまくいかない例です。

in_f1 <- "human_annotation_sub1.gtf"   #入力ファイル名を指定してin_f1に格納(GFF/GTFファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(GenomicFeatures)               #パッケージの読み込み

#前処理(リファレンス配列の染色体名を抽出)
param <- in_f2                         #paramという名前で取り扱いたいだけです
library(param, character.only=T)       #paramで指定したパッケージの読み込み
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
hoge <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてhogeに格納
chrominfo <- data.frame(chrom=as.character(seqnames(hoge)),#染色体情報をchrominfoに格納
                        length=as.vector(seqlengths(hoge)),#染色体情報をchrominfoに格納
                      is_circular=hoge@seqinfo@is_circular)#染色体情報をchrominfoに格納

#本番(TranscriptDbオブジェクトの作成)
txdb <- makeTranscriptDbFromGFF(file=in_f1, format="gtf",#txdbオブジェクトの作成
                     exonRankAttributeName="exon_number",#txdbオブジェクトの作成
                      gffGeneIdAttributeName="gene_name",#txdbオブジェクトの作成
                   chrominfo=chrominfo,#txdbオブジェクトの作成
                species=organism(hoge))#txdbオブジェクトの作成
txdb                                   #確認してるだけです
	

イントロ | NGS | 読み込み | FASTA形式 | 基本情報を取得

multi-FASTAファイルを読み込んで、Total lengthやaverage lengthなどの各種情報取得を行うためのやり方を示します。

「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。

1. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番(基本情報取得)
Total_len <- sum(width(fasta))         #コンティグの「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「コンティグ数」を取得
Average_len <- mean(width(fasta))      #コンティグの「平均長」を取得
Median_len <- median(width(fasta))     #コンティグの「中央値」を取得
Max_len <- max(width(fasta))           #コンティグの長さの「最大値」を取得
Min_len <- min(width(fasta))           #コンティグの長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(width(fasta)))      #長さ情報を降順にソートした結果をsortedに格納
N50 <- sorted[cumsum(sorted) >= Total_len/2][1]#「N50」(Total_lenの50%に達したときのコンティグ長)を取得

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
CG <- rowSums(hoge[,2:3])              #C,Gの総数を計算してCGに格納
ACGT <- rowSums(hoge[,1:4])            #A,C,G,Tの総数を計算してACGTに格納
GC_content <- sum(CG)/sum(ACGT)        #トータルのGC含量の情報を取得

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. 130MB程度のRefSeqのhuman mRNAのmulti-FASTAファイル(h_rna.fasta)の場合:

in_f <- "h_rna.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番(基本情報取得)
Total_len <- sum(width(fasta))         #コンティグの「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「コンティグ数」を取得
Average_len <- mean(width(fasta))      #コンティグの「平均長」を取得
Median_len <- median(width(fasta))     #コンティグの「中央値」を取得
Max_len <- max(width(fasta))           #コンティグの長さの「最大値」を取得
Min_len <- min(width(fasta))           #コンティグの長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(width(fasta)))      #長さ情報を降順にソートした結果をsortedに格納
N50 <- sorted[cumsum(sorted) >= Total_len/2][1]#「N50」(Total_lenの50%に達したときのコンティグ長)を取得

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
CG <- rowSums(hoge[,2:3])              #C,Gの総数を計算してCGに格納
ACGT <- rowSums(hoge[,1:4])            #A,C,G,Tの総数を計算してACGTに格納
GC_content <- sum(CG)/sum(ACGT)        #トータルのGC含量の情報を取得

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

FASTA形式ファイルの読み込み部分で、Biostringsパッケージ中のreadDNAStringSet関数ではなく、seqinrパッケージ中のread.fasta関数を用いるやり方です。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqinr)                        #パッケージの読み込み

#入力ファイルの読み込みとDNAStringSet形式への変換
hoge <- read.fasta(in_f, seqtype="DNA", as.string=TRUE)#in_fで指定したファイルの読み込み
fasta <- DNAStringSet(as.character(hoge))#型変換
names(fasta) <- names(hoge)            #型変換

#本番(基本情報取得)
Total_len <- sum(width(fasta))         #コンティグの「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「コンティグ数」を取得
Average_len <- mean(width(fasta))      #コンティグの「平均長」を取得
Median_len <- median(width(fasta))     #コンティグの「中央値」を取得
Max_len <- max(width(fasta))           #コンティグの長さの「最大値」を取得
Min_len <- min(width(fasta))           #コンティグの長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(width(fasta)))      #長さ情報を降順にソートした結果をsortedに格納
N50 <- sorted[cumsum(sorted) >= Total_len/2][1]#「N50」(Total_lenの50%に達したときのコンティグ長)を取得

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
CG <- rowSums(hoge[,2:3])              #C,Gの総数を計算してCGに格納
ACGT <- rowSums(hoge[,1:4])            #A,C,G,Tの総数を計算してACGTに格納
GC_content <- sum(CG)/sum(ACGT)        #トータルのGC含量の情報を取得

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. 120MB程度のシロイヌナズナゲノムのmulti-FASTAファイル(TAIR10_chr_all.fas)の場合:

in_f <- "TAIR10_chr_all.fas"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番(基本情報取得)
Total_len <- sum(width(fasta))         #コンティグの「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「コンティグ数」を取得
Average_len <- mean(width(fasta))      #コンティグの「平均長」を取得
Median_len <- median(width(fasta))     #コンティグの「中央値」を取得
Max_len <- max(width(fasta))           #コンティグの長さの「最大値」を取得
Min_len <- min(width(fasta))           #コンティグの長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(width(fasta)))      #長さ情報を降順にソートした結果をsortedに格納
N50 <- sorted[cumsum(sorted) >= Total_len/2][1]#「N50」(Total_lenの50%に達したときのコンティグ長)を取得

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
CG <- rowSums(hoge[,2:3])              #C,Gの総数を計算してCGに格納
ACGT <- rowSums(hoge[,1:4])            #A,C,G,Tの総数を計算してACGTに格納
GC_content <- sum(CG)/sum(ACGT)        #トータルのGC含量の情報を取得

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

イントロ | NGS | 読み込み | FASTA形式 | description行の記述を整形

multi-FASTAファイルのdescription行の記述はものによってまちまちです。ここでは何種類かのmulti-FASTA形式ファイルに対して、 「目的の記述部分のみ抽出し、それを新たなdescription」とするやり方や、まるごと指定した文字列に置換するやり方などを示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ラットの上流配列(1000bp)ファイル(rat_upstream_1000.fa)からRefSeq IDの部分のみを抽出したい場合:

抽出例:「NM_022953_up_1000_chr1_268445091_r chr1:268445091-268446090」--> 「NM_022953」

戦略:"_up_"を区切り文字として分割("NM_022953"と"1000_chr1_268445091_r chr1:268445091-268446090")し、分割後の1つ目の要素を抽出

例題ファイルのダウンロード時に、なぜか拡張子の.faが.txtに勝手に変更されていたりする場合がありますのでご注意ください。

in_f <- "rat_upstream_1000.fa"         #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "_up_"                       #区切り文字を指定
param2 <- 1                            #分割後に抽出したい要素番号を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- strsplit(names(fasta), param1, fixed=TRUE)#names(fasta)中の文字列をparam1で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", param2))#hogeのリスト中の(param2)番目の要素(これがRefSeq IDに相当)を抽出してhoge2に格納
names(fasta) <- hoge2                  #names(fasta)の中身をhoge2で置換
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. Trinity.fastaから最初のスペースで区切られる前の文字列のみにしたい場合:

抽出例:「comp59_c0_seq1 len=537 ~FPKM=305.1 path=[0:0-536]」--> 「comp59_c0_seq1」

戦略:" "を区切り文字として分割("comp59_c0_seq1", "len=537", "~FPKM=305.1", "path=[0:0-536]")し、分割後の1つ目の要素を抽出

in_f <- "Trinity.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- " "                          #区切り文字を指定
param2 <- 1                            #分割後に抽出したい要素番号を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- strsplit(names(fasta), param1, fixed=TRUE)#names(fasta)中の文字列をparam1で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", param2))#hogeのリスト中の(param2)番目の要素を抽出してhoge2に格納
names(fasta) <- hoge2                  #names(fasta)の中身をhoge2で置換
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. DHFR.fastaからRefSeq ID部分のみ抽出したい場合:

抽出例:「gi|68303806|ref|NM_000791.3| Homo sapiens dihydrofolate reductase (DHFR), mRNA」--> 「NM_000791.3」

戦略:"|"を区切り文字として分割("gi", "68303806", "ref", "NM_000791.3", " Homo sapiens dihydrofolate reductase (DHFR), mRNA")し、分割後の4番目の要素を抽出

in_f <- "DHFR.fasta"                   #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "|"                          #区切り文字を指定
param2 <- 4                            #分割後に抽出したい要素番号を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- strsplit(names(fasta), param1, fixed=TRUE)#names(fasta)中の文字列をparam1で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", param2))#hogeのリスト中の(param2)番目の要素(これがRefSeq IDに相当)を抽出してhoge2に格納
names(fasta) <- hoge2                  #names(fasta)の中身をhoge2で置換
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. DHFR.fastaからバージョン番号を除いたRefSeq ID部分のみ抽出したい場合:

抽出例:「gi|68303806|ref|NM_000791.3| Homo sapiens dihydrofolate reductase (DHFR), mRNA」--> 「NM_000791」

戦略:"|"を区切り文字として分割("gi", "68303806", "ref", "NM_000791.3", " Homo sapiens dihydrofolate reductase (DHFR), mRNA")し、分割後の4番目の要素を抽出。 次に、"."を区切り文字として分割("NM_000791", "3")し、分割後の1番目の要素を抽出。

in_f <- "DHFR.fasta"                   #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "|"                          #区切り文字を指定
param2 <- 4                            #分割後に抽出したい要素番号を指定
param3 <- "."                          #区切り文字を指定
param4 <- 1                            #分割後に抽出したい要素番号を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- strsplit(names(fasta), param1, fixed=TRUE)#names(fasta)中の文字列をparam1で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", param2))#hogeのリスト中の(param2)番目の要素(これがバージョン番号つきのRefSeq IDに相当)を抽出してhoge2に格納
hoge3 <- strsplit(hoge2, param3, fixed=TRUE)#hoge2中の文字列をparam3で区切った結果をリスト形式でhoge3に格納
hoge4 <- unlist(lapply(hoge3, "[[", param4))#hoge3のリスト中の(param4)番目の要素(これがRefSeq IDのバージョン部分以外に相当)を抽出してhoge4に格納
names(fasta) <- hoge4                  #names(fasta)の中身をhoge4で置換
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

5. sample_100.fastaからバージョン番号を除いたRefSeq ID部分のみ抽出したい場合:

抽出例:「gi|239744030|ref|XR_017086.3| PREDICTED: Homo sapiens supervillin-like (LOC645954), miscRNA」--> 「XR_017086」

戦略:"|"を区切り文字として分割("gi", "239744030", "ref", "XR_017086.3", " PREDICTED: Homo sapiens supervillin-like (LOC645954), miscRNA")し、分割後の4番目の要素を抽出。 次に、"."を区切り文字として分割("XR_017086", "3")し、分割後の1番目の要素を抽出。

in_f <- "sample_100.fasta"             #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "|"                          #区切り文字を指定
param2 <- 4                            #分割後に抽出したい要素番号を指定
param3 <- "."                          #区切り文字を指定
param4 <- 1                            #分割後に抽出したい要素番号を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- strsplit(names(fasta), param1, fixed=TRUE)#names(fasta)中の文字列をparam1で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", param2))#hogeのリスト中の(param2)番目の要素(これがこれがバージョン番号つきのRefSeq IDに相当)を抽出してhoge2に格納
hoge3 <- strsplit(hoge2, param3, fixed=TRUE)#hoge2中の文字列をparam3で区切った結果をリスト形式でhoge3に格納
hoge4 <- unlist(lapply(hoge3, "[[", param4))#hoge3のリスト中の(param4)番目の要素(これがRefSeq IDのバージョン部分以外に相当)を抽出してhoge4に格納
names(fasta) <- hoge4                  #names(fasta)の中身をhoge4で置換
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

6. シロイヌナズナのゲノム配列ファイル(TAIR10_chr_all.fas; Lamesch et al., Nucleic Acids Res., 2012)のdescription部分をまるまる任意の文字列に置換したい場合:

染色体の並びがparamで指定したものと同じであることが既知という前提です。ゲノム配列ファイル自体は120MB程度あります。

in_f <- "TAIR10_chr_all.fas"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param <- c("Chr1","Chr2","Chr3","Chr4","Chr5","ChrM","ChrC")#置換したい文字列を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
names(fasta) <- param                  #names(fasta)の中身をparamで置換
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | NGS | 読み込み | FASTQ形式

Sanger FASTQ形式ファイルを読み込むやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. SRR037439.fastqの(quality情報を除く)塩基配列情報のみ読み込みたい場合:

配列長が同じ場合のみ読み込めます。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです
	

2. SRR037439.fastqのquality情報も読み込みたい場合:

配列長が異なっていても読み込めます。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
fastq                                  #確認してるだけです

showClass("ShortReadQ")                #ShortReadQ"というクラスのオブジェクトからどのように情報を取得するかを調べたい場合
sread(fastq)                           #塩基配列情報を表示
quality(fastq)                         #quality情報を表示
id(fastq)                              #description情報を表示
	

3. SRR037439.fastqのdescription行の" "以降の文字を削除して、またFASTQ形式で保存したい場合:

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
id(fastq)                              #description情報を表示

#前処理
hoge <- strsplit(as.character(id(fastq)), " ", fixed=TRUE)#id(fasta)中の文字列を" "で区切った結果をリスト形式でhogeに格納
description <- BStringSet(sapply(hoge,"[[", 1))#hogeのリスト中の一番目の要素のみ取り出してdescriptionに格納

#本番
fastq <- ShortReadQ(sread(fastq), quality(fastq), description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
id(fastq)                              #description情報を表示

#ファイルに保存
writeFastq(fastq, out_f)               #fastqの中身を指定したファイル名で保存
	

イントロ | NGS | 読み込み | FASTQ形式 | description行の記述を整形

FASTQ形式ファイルに対して、 「目的の記述部分のみ抽出し、それを新たなdescription」としてFASTQ形式で保存するやり方などを示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. SRR037439.fastqのdescription行の" "以降の文字を削除して、またFASTQ形式で保存したい場合:

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
id(fastq)                              #description情報を表示

#前処理
hoge <- strsplit(as.character(id(fastq)), " ", fixed=TRUE)#id(fastq)中の文字列を" "で区切った結果をリスト形式でhogeに格納
description <- BStringSet(sapply(hoge,"[[", 1))#hogeのリスト中の一番目の要素のみ取り出してdescriptionに格納

#本番
fastq <- ShortReadQ(sread(fastq), quality(fastq), description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
id(fastq)                              #description情報を表示

#ファイルに保存
writeFastq(fastq, out_f)               #fastqの中身を指定したファイル名で保存
	

イントロ | NGS | 読み込み | Illuminaの*_seq.txt

Illuminaの出力ファイルで、初期のものは*_seq.txtというものらしいです。実際の生の配列データファイルは数百程度に分割されています。ここでは、そのファイル群がおさめられているディレクトリ(例:tmp)を指定して、その中の「*_seq.txt」ファイル群について一気に行う方法を示します。ここでは、(s_1_0001_seq.txts_1_0007_seq.txtの二つのファイルを含む; それぞれ1394行および826行からなる)フォルダを指定して読み込み、multi-FASTA形式で出力するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 指定したディレクトリ中に*_seq.txtという形式のファイルしかないという前提のもとで行う場合:

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param <- "kkk"                         #FASTA形式ファイルのdescription行に記述する内容を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- c(rep(list(NULL), 4), "DNAString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。最初の4列には"NULL"を、最後の5列目には"DNAString"というベクトルを作成してcolClassesに格納している
fasta <- readXStringColumns(getwd(), pattern="", colClasses = colClasses)[[1]]#colClassesで指定した列(この場合5列目)をreadXStringColumns関数を用いて読み込むことでXStringSetオブジェクト(この場合"X"は"DNA"に相当)にした結果をfastaに格納
names(fasta) <- paste(param, 1:length(fasta), sep="_")#(multi-)FASTA形式のdescription部分を作成している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. param2で指定した"s_1_*_seq.txt"という感じのファイル名のもののみ読み込む場合:

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "kkk"                        #FASTA形式ファイルのdescription行に記述する内容
param2 <- "s_1_.*_seq.txt"             #"s_1_*_seq.txt"という感じのファイル名のものを読み込みたい場合("."の有無に注意!!)

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
files <- list.files(getwd(), pattern=param2)#param2で指定した正規表現にマッチする文字列を含むファイルのリストをfilesに格納
strsplit(readLines(files[[1]],1), "\t")#filesで読み込んだファイルのリストについて、最初のファイルの一行目をタブで区切って表示させているだけ。5列目のデータが塩基配列情報だということを確認しているにすぎない。
colClasses <- c(rep(list(NULL), 4), "DNAString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。最初の4列には"NULL"を、最後の5列目には"DNAString"というベクトルを作成してcolClassesに格納している
fasta <- readXStringColumns(getwd(), pattern=param2, colClasses=colClasses)[[1]]#colClassesで指定した列(この場合5列目)をreadXStringColumns関数を用いて読み込むことでXStringSetオブジェクト(この場合"X"は"DNA"に相当)にした結果をfastaに格納
names(fasta) <- paste(param1, 1:length(fasta), sep="_")#(multi-)FASTA形式のdescription部分を作成している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | NGS | 読み込み | Illuminaの*_qseq.txt

Illuminaの出力ファイルで、比較的最近のは*_qseq.txtというものらしいです。実際の生の配列データファイルは数百程度に分割されています。ここでは、そのファイル群がおさめられているディレクトリ(例:tmp)を指定して、その中の「*_qseq.txt」ファイル群について一気に行う方法を示します。ここでは、(s_1_1_0005_qseq.txts_1_1_0015_qseq.txtの二つのファイルを含む; それぞれ114行および73行からなる)フォルダを指定して読み込み、multi-FASTA形式で出力するやり方を示します。

*_qseq.txtファイルは全部で11列あり、9列目が塩基配列情報、10列目がquality情報を含んでいるので、その列の部分のみを抽出しているだけです。尚、指定したディレクトリ中に*_qseq.txtという形式のファイルしかなく、全てのファイルを取り扱いたいという前提となっています。

FASTQ形式といっても様々なバリエーション(Illumina FASTQやSanger FASTQなど)があります。Illumina *_qseq.txt中のquality scoreの値をそのまま用いてFASTQ形式で保存すればIllumina FASTQ形式ファイル上で取り扱うスコアとなります。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 配列情報のみ抽出したい場合:

param1 <- "kkk"                        #description行に記述する内容を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[9] <- c("DNAString")        #9列目が"DNAString"だという情報を与えている
fasta <- readXStringColumns(getwd(), pattern="", colClasses = colClasses)[[1]]#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をfastaに格納

#後処理(description部分を追加)
names(fasta) <- paste(param1, 1:length(fasta), sep="_")#description部分を作成している
fasta                                  #確認してるだけです
	

2. Illumina FASTQ形式でdescription行が"kkk_..."のようにしたい場合:

param1 <- "kkk"                        #description行に記述する内容

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[9:10] <- c("DNAString", "BString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。9, 10列目がそれぞれ"DNAString", "BString"だという情報を与えている
hoge <- readXStringColumns(getwd(), pattern="", colClasses = colClasses)#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をhogeに格納

#前処理(description部分を作成)
description <- paste(param1, 1:length(hoge[[1]]), sep="_")#description部分を作成している
description <- BStringSet(description) #型変換をしている

#本番(FASTQ形式のオブジェクトに変換)
fastq <- ShortReadQ(hoge[[1]], hoge[[2]], description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示
id(fastq)                              #description情報を表示
	

3. Illumina FASTQ形式で、descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしたい場合:

つまり、descriptionのところをqseq形式ファイルの「3列目(レーン番号)」:「4列目」:「5列目」:「6列目」:「11列目(pass filterフラグ情報)」で表すということ。

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[c(3:6,9:11)] <- c("BString","BString","BString","BString","DNAString", "BString", "BString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。例えば9列目が"DNAString"だという情報を与えている
hoge <- readXStringColumns(getwd(), pattern="", colClasses=colClasses)#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をhogeに格納

#前処理(description部分を作成)
description <- paste(hoge[[1]], hoge[[2]], hoge[[3]], hoge[[4]], hoge[[7]], sep=":")#description部分を作成している
description <- BStringSet(description) #型変換をしている

#本番(FASTQ形式のオブジェクトに変換)
fastq <- ShortReadQ(hoge[[5]], hoge[[6]], description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示
id(fastq)                              #description情報を表示
	

イントロ | ファイル形式の変換 | について

ごちゃませですがとりあえず...

  • BAM --> BED:BEDToolsbamToBedで可能(「イントロ | ファイル形式の変換 | BAM --> BED」)
  • SAM --> BAM:SAMtoolsで可能
  • SOAP --> SAM:soap2sam.plというperlプログラムで可能
  • SAM --> BED:sam2bed.plというperlプログラムで可能
  • lite.sra --> FASTQ:SRA Toolkit中のfastq-dumpというコマンドで可能
  • qseq --> FASTA:「イントロ | ファイル形式の変換 | qseq --> FASTA」で可能
  • qseq --> FASTQ:qseq2fastq.plというperlプログラムで可能(「イントロ | ファイル形式の変換 | qseq --> Sanger FASTQ」)
  • FASTQ --> FASTA:「イントロ | ファイル形式の変換 | FASTQ --> FASTA」で可能
  • GenBank --> FASTA:「イントロ | ファイル形式の変換 | GenBank --> FASTA」で可能

イントロ | ファイル形式の変換 | BAM --> BED

BAM形式のマッピング結果ファイル(拡張子が"bam"という前提です)を読み込んでBED形式に変換するやり方を示します。拡張子が"bed"の出力ファイルが自動生成されます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. sample_RNAseq1.bamの場合(GenomicRangesパッケージ利用):

in_f <- "sample_RNAseq1.bam"           #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(GenomicRanges)                 #パッケージの読み込み

#入力ファイルの読み込み
hoge <- readGAlignments(in_f)          #BAM形式ファイルを読み込んだ結果をhogeに格納
hoge <- as.data.frame(hoge)            #データフレーム形式に変換

#本番(BED形式ファイルの最初の3列分に相当する情報を抽出)
tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納

#ファイルに保存
out_f <- sub(".bam", ".bed", in_f)     #BED形式ファイル名を作成した結果をout_fに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
	

2. sample_RNAseq1.bamの場合(Rsamtoolsパッケージ利用):

in_f <- "sample_RNAseq1.bam"           #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(Rsamtools)                     #パッケージの読み込み

#入力ファイルの読み込み
param_what <- c("rname", "pos", "qwidth", "strand")#左記の情報のみ読み込むという指令をparam_whatに格納
param_flag <- scanBamFlag(isUnmappedQuery=FALSE)#mappedされたもののみ読み込むという指令をparam_flagに格納
param_bam <- ScanBamParam(what=param_what, flag=param_flag)#BAM形式ファイルを読み込んだ結果をhogeに格納
hoge <- scanBam(in_f, param=param_bam)[[1]]#BAM形式ファイルを読み込んだ結果をhogeに格納

#ファイルに保存
tmp <- cbind(as.character(hoge$rname), #BED形式ファイルの1列目に相当する情報と
            hoge$pos,                  #BED形式ファイルの2列目に相当する情報と
            (hoge$qwidth+hoge$pos-1))  #BED形式ファイルの3列目に相当する情報を列方向で結合した結果をtmpに格納
out_f <- sub(".bam", ".bed", in_f)     #BED形式ファイル名を作成した結果をout_fに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
	

イントロ | ファイル形式の変換 | FASTQ --> FASTA

Sanger FASTQ形式ファイル(配列長が同じSRR037439.fastqと配列長が異なるsample2.fastq)を読み込んでFASTA形式で出力するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 配列長が同じSRR037439.fastqの場合:

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. 配列長が異なるsample2.fastqの場合:

(うまくいかない例です)
in_f <- "sample2.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. 配列長が異なるsample2.fastqの場合:

(うまくいく例です)

in_f <- "sample2.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
fasta <- sread(fastq)                  #fastqの配列情報部分をfastaに格納
names(fasta) <- id(fastq)              #description情報部分をfastaに追加
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | ファイル形式の変換 | Genbank --> FASTA

Genbank形式ファイルを読み込んでFASTA形式で出力するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. NM_138957.gbkの場合:

NM_138957のページからGenbank形式で保存したものですが、 デフォルトの拡張子が.gbではうまく保存できなかったので*.gbkと変更しています。

in_f <- "NM_138957.gbk"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(seqinr)                        #パッケージの読み込み

#本番
gb2fasta(source.file=in_f, destination.file=out_f)#in_fで指定したファイルを読み込んでout_fで指定したファイルで出力
	

イントロ | ファイル形式の変換 | qseq --> FASTA

Illuminaの*_qseq.txtファイル群がおさめられている(例:s_1_1_0005_qseq.txts_1_1_0015_qseq.txtの二つのファイルを含む; それぞれ114行および73行からなる)フォルダを指定して読み込むやり方を示します。

*_qseq.txtファイルは全部で11列あり、9列目が塩基配列情報、10列目がquality情報を含んでいます。尚、指定したディレクトリ中に*_qseq.txtという形式のファイルしかなく、全てのファイルを取り扱いたいという前提となっています。また、descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしています。

FASTQ形式といっても様々なバリエーション(Illumina FASTQやSanger FASTQなど)があります。Illumina *_qseq.txt中のquality scoreの値をそのまま用いてFASTQ形式で保存すればIllumina FASTQ形式ファイルとなります。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. description行が"kkk_..."のようにしたい場合:

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "kkk"                        #description行に記述する内容

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[9] <- c("DNAString")        #9列目が"DNAString"だという情報を与えている
fasta <- readXStringColumns(getwd(), pattern="", colClasses = colClasses)[[1]]#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をfastaに格納
names(fasta) <- paste(param1, 1:length(fasta), sep="_")#description部分を作成している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしたい場合:

つまり、descriptionのところをqseq形式ファイルの「3列目(レーン番号)」:「4列目」:「5列目」:「6列目」:「11列目(pass filterフラグ情報)」で表すということ。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[c(3:6,9:11)] <- c("BString","BString","BString","BString","DNAString", "BString", "BString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。例えば9列目が"DNAString"だという情報を与えている
hoge <- readXStringColumns(getwd(), pattern="", colClasses=colClasses)#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をhogeに格納

#前処理(description部分を作成)
description <- paste(hoge[[1]], hoge[[2]], hoge[[3]], hoge[[4]], hoge[[7]], sep=":")#description部分を作成している
description <- BStringSet(description) #型変換をしている

#本番(FASTA形式のオブジェクトに変換)
fasta <- hoge[[5]]                     #配列情報部分をfastaに格納
names(fasta) <- description            #description情報部分をfastaに追加
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | ファイル形式の変換 | qseq --> Illumina FASTQ

Illuminaの*_qseq.txtファイル群がおさめられている(例:s_1_1_0005_qseq.txts_1_1_0015_qseq.txtの二つのファイルを含む; それぞれ114行および73行からなる)フォルダを指定して読み込むやり方を示します。

*_qseq.txtファイルは全部で11列あり、9列目が塩基配列情報、10列目がquality情報を含んでいます。尚、指定したディレクトリ中に*_qseq.txtという形式のファイルしかなく、全てのファイルを取り扱いたいという前提となっています。また、descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしています。FASTQ形式といっても様々なバリエーション(Illumina FASTQやSanger FASTQなど)があります。Illumina *_qseq.txt中のquality scoreの値をそのまま用いてFASTQ形式で保存すればIllumina FASTQ形式ファイルとなります。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしたい場合:

つまり、descriptionのところをqseq形式ファイルの「3列目(レーン番号)」:「4列目」:「5列目」:「6列目」:「11列目(pass filterフラグ情報)」で表すということ。

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[c(3:6,9:11)] <- c("BString","BString","BString","BString","DNAString", "BString", "BString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。例えば9列目が"DNAString"だという情報を与えている
hoge <- readXStringColumns(getwd(), pattern="", colClasses=colClasses)#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をhogeに格納

#前処理(description部分を作成)
description <- paste(hoge[[1]], hoge[[2]], hoge[[3]], hoge[[4]], hoge[[7]], sep=":")#description部分を作成している
description <- BStringSet(description) #型変換をしている

#本番(FASTQ形式のオブジェクトに変換)
fastq <- ShortReadQ(hoge[[5]], hoge[[6]], description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示
id(fastq)                              #description情報を表示

#ファイルに保存
writeFastq(fastq, out_f)               #fastqの中身を指定したファイル名で保存
	

2. descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にし、

且つ一番右側に"/2"の記述を追加したい場合:

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param <- "/2"                          #description行に追加したい情報を格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[c(3:6,9:11)] <- c("BString","BString","BString","BString","DNAString", "BString", "BString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。例えば9列目が"DNAString"だという情報を与えている
hoge <- readXStringColumns(getwd(), pattern="", colClasses=colClasses)#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をhogeに格納

#前処理(description部分を作成)
description <- paste(hoge[[1]], hoge[[2]], hoge[[3]], hoge[[4]], hoge[[7]], sep=":")#description部分を作成している
description <- BStringSet(paste(description, param, sep=""))#paramで指定した記述内容を追加している

#本番(FASTQ形式のオブジェクトに変換)
fastq <- ShortReadQ(hoge[[5]], hoge[[6]], description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示
id(fastq)                              #description情報を表示

#ファイルに保存
writeFastq(fastq, out_f)               #fastqの中身を指定したファイル名で保存
	

イントロ | ファイル形式の変換 | qseq --> Sanger FASTQ

Illuminaの*_qseq.txtファイル群がおさめられている(例:s_1_1_0005_qseq.txts_1_1_0015_qseq.txtの二つのファイルを含む; それぞれ114行および73行からなる)フォルダを指定して読み込むやり方を示します。

*_qseq.txtファイルは全部で11列あり、9列目が塩基配列情報、10列目がquality情報を含んでいます。 尚、指定したディレクトリ中に*_qseq.txtという形式のファイルしかなく、全てのファイルを取り扱いたいという前提となっています。また、descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしています。

2013/08/18までは、例えば「Illumina ASCII 64」に相当する"@"を「Sanger ASCII 33」に相当する"!"などと一文字づつ変換していましたが、forループを用いて一度に変換する美しいスクリプトに変更しました。

基本的にはIllumina ASCIIコードに「-31」することでSanger ASCIIコードに変換できるので、Phred score = 0に相当する「Illumina ASCII 64」から、Phred score = 61に相当する「Illumina ASCII 126」までの範囲をSanger ASCIIコードに変換しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしたい場合:

つまり、descriptionのところをqseq形式ファイルの「3列目(レーン番号)」:「4列目」:「5列目」:「6列目」:「11列目(pass filterフラグ情報)」で表すということ。

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[c(3:6,9:11)] <- c("BString","BString","BString","BString","DNAString", "BString", "BString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。例えば9列目が"DNAString"だという情報を与えている
hoge <- readXStringColumns(getwd(), pattern="", colClasses=colClasses)#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をhogeに格納

#前処理(description部分を作成)
description <- paste(hoge[[1]], hoge[[2]], hoge[[3]], hoge[[4]], hoge[[7]], sep=":")#description部分を作成している
description <- BStringSet(description) #型変換をしている

#本番(Illumina qualityスコアをSanger qualityスコアに変換)
qscore <- hoge[[6]]                    #readのquality情報部分をqscoreに格納
for(i in 64:126){                      #Illumina ASCIIコードの64-126の範囲をSanger ASCIIコードの33-95に変換するループ
   qscore <- chartr(rawToChar(as.raw(i)), rawToChar(as.raw(i - 31)), qscore)#qscore中の文字列を置換(as.raw関数で整数をASCIIコードに変換し、rawToChar関数でASCIIコードをASCII文字に変換しています)
}

#後処理(FASTQ形式のオブジェクトに変換)
fastq <- ShortReadQ(hoge[[5]], qscore, description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示
id(fastq)                              #description情報を表示

#ファイルに保存
writeFastq(fastq, out_f)               #fastqの中身を指定したファイル名で保存
	

2. descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にし、

且つ一番右側に"/2"の記述を追加したい場合:

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param <- "/2"                          #description行に追加したい情報を格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[c(3:6,9:11)] <- c("BString","BString","BString","BString","DNAString", "BString", "BString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。例えば9列目が"DNAString"だという情報を与えている
hoge <- readXStringColumns(getwd(), pattern="", colClasses=colClasses)#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をhogeに格納

#前処理(description部分を作成)
description <- paste(hoge[[1]], hoge[[2]], hoge[[3]], hoge[[4]], hoge[[7]], sep=":")#description部分を作成している
description <- BStringSet(paste(description, param, sep=""))#paramで指定した記述内容を追加している

#本番(Illumina qualityスコアをSanger qualityスコアに変換)
qscore <- hoge[[6]]                    #readのquality情報部分をqscoreに格納
for(i in 64:126){                      #Illumina ASCIIコードの64-126の範囲をSanger ASCIIコードの33-95に変換するループ
   qscore <- chartr(rawToChar(as.raw(i)), rawToChar(as.raw(i - 31)), qscore)#qscore中の文字列を置換(as.raw関数で整数をASCIIコードに変換し、rawToChar関数でASCIIコードをASCII文字に変換しています)
}

#後処理(FASTQ形式のオブジェクトに変換)
fastq <- ShortReadQ(hoge[[5]], qscore, description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示
id(fastq)                              #description情報を表示

#ファイルに保存
writeFastq(fastq, out_f)               #fastqの中身を指定したファイル名で保存
	

前処理 | クオリティチェック | qrqc

FastQCのR版のようなものです。 Sanger FASTQ形式ファイルを読み込んで、positionごとの「クオリティスコア(quality score)」、「どんな塩基が使われているのか(base frequency and base proportion)」、「リード長の分布」、「GC含量」、「htmlレポート」などを出力してくれます。

ここではSRR037439.fastqファイルに対して解析を行う例を示します。

下記を実行すると「SRR037439-report」という名前のフォルダが作成されます。中にあるreport.htmlをダブルクリックするとhtmlレポートを見ることができます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(qrqc)                          #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readSeqFile(in_f)             #in_fで指定したファイルの読み込み

makeReport(fastq)                      #htmlレポートの作成
	

前処理 | クオリティチェック | PHREDスコアに変換

ここでは、NCBI Sequence Read Archive (SRA)から得られる(従ってSanger FASTQ形式)FASTQ形式ファイルを読み込んでPHREDスコアに変換したり、そのboxplotを描画するやり方を示します。

PHREDスコアは、ベースコール(A, C, G, Tの四種類の塩基のうちのどの塩基かを決めること)のクオリティを示すp値(低ければ低いほどそのベースコールの信頼性が高いことを意味する)を二桁の整数値に変換したものであり、PHRED score = -10 * log10(p)で計算されます。

例えば、

  • p=0.001の場合は、PHRED score = -10 * log10(0.001) = 30
  • p=0.01の場合は、PHRED score = -10 * log10(0.01) = 20
  • p=0.1の場合は、PHRED score = -10 * log10(0.1) = 10
  • p=1の場合は、PHRED score = -10 * log10(1) = 0

のように計算されますので、PHREDスコアが高いほどそのベースコールの信頼性が高いことを意味します。

例題で解析しているファイルは全リードのほんの一部なので、ばらつきはありますが、5'側のベースコールのクオリティは高く、3'側に読み進んでいくほどPHREDスコアが低くなる傾向にあることが読み取れます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTQファイル(SRR037439.fastq)を読み込んでPHREDスコア変換後、その数値情報をタブ区切りテキストファイルで保存したい場合:

(計算時間短縮のため)入力ファイルはSRR037439の最初の2000行分のみのサブセットにしてあります。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み

#本番(PHREDスコアに変換)
out <- as(quality(fastq), "matrix")    #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をoutに格納
dim(out)                               #行数と列数を確認しているだけ
colnames(out) <- 1:ncol(out)           #列名を付与
rownames(out) <- as.character(id(fastq))#行名を付与

#ファイルに保存
tmp <- cbind(rownames(out), out)       #outの左側に行名を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. FASTQファイル(SRR037439.fastq)を読み込んでPHREDスコア変換後、スコア分布をboxplotで描きたい場合:

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み

#本番(PHREDスコアに変換)
out <- as(quality(fastq), "matrix")    #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をoutに格納
dim(out)                               #行数と列数を確認しているだけ
colnames(out) <- 1:ncol(out)           #列名を付与
rownames(out) <- as.character(id(fastq))#行名を付与

#本番(boxplot)
boxplot(as.data.frame(out), outline=FALSE, xlab="cycle number", ylab="PHRED score")#outをdata.frame形式にしてboxplotを描画(outline=FALSEの意味は、外れ値を描画しない、です。)
	

3. FASTQファイル(SRR037439.fastq)を読み込んでPHREDスコア変換後、スコア分布のboxplotをpngファイルに保存したい場合:

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み

#本番(PHREDスコアに変換)
out <- as(quality(fastq), "matrix")    #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をoutに格納
dim(out)                               #行数と列数を確認しているだけ
colnames(out) <- 1:ncol(out)           #列名を付与
rownames(out) <- as.character(id(fastq))#行名を付与

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
boxplot(as.data.frame(out), outline=FALSE, xlab="cycle number", ylab="PHRED score")#outをdata.frame形式にしてboxplotを描画(outline=FALSEの意味は、外れ値を描画しない、です。)
dev.off()                              #おまじない
	

前処理 | クオリティチェック | 配列長分布を調べる

FASTAまたはFASTQ形式ファイルを読み込んで配列長分布を得るやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample2.fasta)の場合:

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
out <- table(width(fasta))             #長さごとの出現頻度情報を得た結果をoutに格納
out                                    #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

2. FASTQ形式ファイル(sample2.fastq)の場合:

in_f <- "sample2.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
out <- table(width(fastq))             #長さごとの出現頻度情報を得た結果をoutに格納
out                                    #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

前処理 | フィルタリング | PHREDスコアが低い塩基をNに置換

Sanger FASTQ形式ファイル(SRR037439.fastq)を読み込んで、PHREDスコアが任意の閾値未満の塩基を"N"に置換するやり方を紹介します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
param1 <- 20                           #PHREDスコアの閾値を指定
param2 <- "N"                          #置換後の文字を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
hoge1 <- as(quality(fastq), "matrix")  #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をhoge1に格納
obj <- hoge1 < param1                  #条件を満たすかどうかを判定した結果をobjに格納
hoge2 <- DNAString(paste(rep(param2, max(width(fastq))), collapse=""))#「最長配列の長さ」で「全ての塩基がparam2で指定した文字」からなるDNAStringオブジェクトを作成してhoge2に格納
hoge3 <- as(Views(hoge2, start=1, end=rowSums(obj)), "DNAStringSet")#rowSums(at)で各リードごとのPHREDスコアが閾値未満の塩基数がわかるので、その塩基数分からなるparam2の文字のDNAStringSetオブジェクトを作成してhoge3に格納
fasta <- replaceLetterAt(sread(fastq), obj, hoge3)#objがTRUEの位置の塩基をhoge3中の塩基で置換した結果をfastaに格納
fastq <- ShortReadQ(fasta, quality(fastq), id(fastq))#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示

#ファイルに保存
writeFastq(fastq, out_f)               #fastqの中身を指定したファイル名で保存
	

前処理 | フィルタリング | PHREDスコアが低い配列(リード)を除去

Sanger FASTQ形式ファイルを読み込んで、PHREDスコアが低いリードを除去するやり方を紹介します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

PHREDスコアが20未満のものがリード長に占める割合が0.1以上のリードを除去するやり方です。

(例題のファイル中のリードは全て35bpのリードである。その10%以上ということで実質的にPHREDスコアが閾値未満のものが4塩基以上あるリードはダメということ)

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 20                           #PHREDスコアの閾値を指定
param2 <- 0.1                          #指定した閾値未満のものが配列長に占める割合を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
hoge <- as(quality(fastq), "matrix")   #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をhogeに格納
obj <- (rowSums(hoge < param1) <= width(fastq)*param2)#条件を満たすかどうかを判定した結果をobjに格納
fastq <- fastq[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastqに格納
sread(fastq)                           #配列情報を表示

#ファイルに保存
writeFastq(fastq, out_f)               #fastqの中身を指定したファイル名で保存
	

2. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

PHREDスコアが20以上の塩基数が0.9より多いリードのみ抽出するやり方です。

(1と同じことを別の言葉で表現しているだけです。)

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 20                           #PHREDスコアの閾値を指定
param2 <- 0.9                          #指定した閾値以上の塩基数の配列長に占める割合を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
hoge <- as(quality(fastq), "matrix")   #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をhogeに格納
obj <- (rowSums(hoge >= param1) > width(fastq)*param2)#条件を満たすかどうかを判定した結果をobjに格納
fastq <- fastq[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastqに格納
sread(fastq)                           #配列情報を表示

#ファイルに保存
writeFastq(fastq, out_f)               #fastqの中身を指定したファイル名で保存
	

3. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

PHREDスコアが20以上の塩基数と配列長に占める割合(%)を出力させるやり方です。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 20                           #PHREDスコアの閾値を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み

#本番
hoge <- as(quality(fastq), "matrix")   #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をhogeに格納
obj_num <- rowSums(hoge >= param1)     #param1で指定した条件を満たすリードごとの塩基数をobj_numに格納
obj_percent <- 100*obj_num/width(fastq)#obj_num中の塩基数をパーセンテージに変換したものをobj_percentに格納

#後処理(description行をシンプルにしている)
hoge <- strsplit(as.character(id(fastq)), " ", fixed=TRUE)#id(reads)中の文字列を" "で区切った結果をリスト形式でhogeに格納
description <- sapply(hoge,"[[", 1)    #hogeのリスト中の一番目の要素のみ取り出してdescriptionに格納

#ファイルに保存
tmp <- cbind(description, width(fastq), obj_num, obj_percent)#「description」、「配列長」、「閾値を満たす塩基数」、「その割合」を列方向に結合したものをtmpに格納
colnames(tmp) <- c("description", "read_length", "nucleotide_number", "percentage")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

PHREDスコアが20未満のものがリード長に占める割合が0.8以上のリードを除去するやり方です。

あるチュートリアル(Short Reads Quality Control and Preprocessingの6ページ目)に書いてあったフィルタリング条件(less than 20 over the 80%)です。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 20                           #PHREDスコアの閾値を指定
param2 <- 0.8                          #指定した閾値未満のものが配列長に占める割合を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
hoge <- as(quality(fastq), "matrix")   #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をhogeに格納
obj <- (rowSums(hoge < param1) <= width(fastq)*param2)#条件を満たすかどうかを判定した結果をobjに格納
fastq <- fastq[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastqに格納
sread(fastq)                           #配列情報を表示

#ファイルに保存
writeFastq(fastq, out_f)               #fastqの中身を指定したファイル名で保存
	

前処理 | フィルタリング | ACGTのみからなる配列を抽出

FASTQファイルやFASTAファイルを読み込んで"N"などの文字を含まず、ACGTのみからなる配列を含むコンティグのみ抽出して、(multi-)FASTA形式ファイルに出力するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#ACGTの総数をカウントした結果をhogeに格納
obj <- (width(fasta) == hoge)          #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

出力ファイルのdescription行を「kkk_...」に変更するやり方です。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "kkk"                        #(multi-)FASTA形式のdescription部分(の一部)を指定してparam1に格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#ACGTの総数をカウントした結果をhogeに格納
obj <- (width(fasta) == hoge)          #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
names(fasta) <- paste(param1, 1:length(fasta), sep="_")#description部分を作成している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

配列中にNを含まないので、入力ファイルと同じ結果が返されることがわかります。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#ACGTの総数をカウントした結果をhogeに格納
obj <- (width(fasta) == hoge)          #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. FASTA形式ファイル(sample2.fasta)の場合:

配列中に"-"を含むcontig_1と配列中に"N"を含むcontig_8, ..., 12が消えていることがわかります。

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#ACGTの総数をカウントした結果をhogeに格納
obj <- (width(fasta) == hoge)          #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

5. FASTA形式ファイル(sample2.fasta)の場合:

4.と同じ結果になりますが、やり方を変えています。

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param <- 0                             #許容するACGT以外の文字数(実質的にはNの許容数に相当)を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#ACGTの総数をカウントした結果をhogeに格納
obj <- (width(fasta) - hoge) <= param  #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | フィルタリング | ACGT以外のcharacter"-"をNに変換

sample2.fastaファイル中のcontig_1のように、なぜか文字列以外のcharacter(例:"-")が含まれることがたまにあります。ここでは、"-"を"N"に変換するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
param <- "-"                           #Nに変換したいcharacterを指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- chartr(param, "N", fasta)     #paramで指定したcharacterを"N"に変換した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | フィルタリング | ACGT以外の文字数が閾値以下の配列を抽出

(multi-)FASTAファイルを読み込んでACGT以外の文字(実質的にNに相当)数がparam1で指定した閾値以下の配列のみ抽出するやり方を示します。この値を0にすれば、ACGTのみからなる配列の抽出を行うのと同じ意味になります。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample2.fasta)を読み込んでACGTのみからなる配列を抽出したい(Nが0個に相当)場合:

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 0                            #許容するACGT以外の文字数(実質的にはNの許容数に相当)を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#ACGTの総数をカウントした結果をhogeに格納
obj <- (width(fasta) - hoge) <= param1 #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. FASTA形式ファイル(sample2.fasta)を読み込んでNが1個含むものまで許容してフィルタリングしたい場合:

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 1                            #許容するACGT以外の文字数(実質的にはNの許容数に相当)を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#ACGTの総数をカウントした結果をhogeに格納
obj <- (width(fasta) - hoge) <= param1 #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. FASTA形式ファイル(sample2.fasta)を読み込んでNが1個含むものまで許容してフィルタリングしたい場合:

QuasRパッケージ中のpreprocessReads関数を用いるやり方です。

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 1                            #許容するACGT以外の文字数(実質的にはNの許容数に相当)を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番
out <- preprocessReads(filename=in_f,  #フィルタリングの実行
                       outputFilename=out_f,#フィルタリングの実行
                       minLength=0,    #フィルタリングの実行
                       nBases=param1)  #フィルタリングの実行
out                                    #確認してるだけです
	

前処理 | フィルタリング | 重複のない配列セットを作成

ユニークな配列からなるセットにするやり方を紹介します。ちなみに、ユニークとはいっても例えば"AACGTTGCA"と"AACGTTGCAG"は独立な配列として取り扱われます。

出力ファイルのdescription行は「kkk_X_Y」に変更しています。重複配列同士のdescription行が異なっていた場合に、どれを使うかという問題があることと、description行部分の記述をすっきりさせて、Xに相当する部分に配列のシリアル番号、そしてYに相当する部分にその配列の出現回数を示すようにしています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample2.fasta)の場合:

(contig_8, 11, 12の三つの配列がまとめられていることなどがわかります)

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "kkk"                        #(multi-)FASTA形式のdescription部分(の一部)を指定してparam1に格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- tables(fasta, n=length(unique(fasta)))#読まれた頻度順にsequenceをソートして結果をhogeに格納
fasta <- DNAStringSet(names(hoge$top)) #sequenceの配列情報(「names(hoge$top)」)をDNAStringSetオブジェクトとしてreadsに格納
fasta                                  #確認してるだけです

#後処理(description部分を作成)
names(fasta) <- paste(param1, 1:length(fasta), hoge$top, sep="_")#description部分を作成している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. FASTQ形式ファイル(SRR037439.fastq)の場合:

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "kkk"                        #(multi-)FASTA形式のdescription部分(の一部)を指定してparam1に格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- tables(fasta, n=length(unique(fasta)))#読まれた頻度順にsequenceをソートして結果をhogeに格納
fasta <- DNAStringSet(names(hoge$top)) #sequenceの配列情報(「names(hoge$top)」)をDNAStringSetオブジェクトとしてreadsに格納
fasta                                  #確認してるだけです

#後処理(description部分を作成)
names(fasta) <- paste(param1, 1:length(fasta), hoge$top, sep="_")#description部分を作成している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

配列中にNを含まず重複配列も存在しないので、順番のみ入れ替わった結果が返されていることがわかります。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "kkk"                        #(multi-)FASTA形式のdescription部分(の一部)を指定してparam1に格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- tables(fasta, n=length(unique(fasta)))#読まれた頻度順にsequenceをソートして結果をhogeに格納
fasta <- DNAStringSet(names(hoge$top)) #sequenceの配列情報(「names(hoge$top)」)をDNAStringSetオブジェクトとしてreadsに格納
fasta                                  #確認してるだけです

#後処理(description部分を作成)
names(fasta) <- paste(param1, 1:length(fasta), hoge$top, sep="_")#description部分を作成している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | フィルタリング | 指定した長さ以上の配列を抽出

FASTA形式やFASTQ形式ファイルを入力として、指定した配列長以上の配列を抽出するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param <- 50                            #配列長の閾値を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- as.logical(width(fasta) >= param)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. FASTA形式ファイル(sample2.fasta)の場合:

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param <- 16                            #配列長の閾値を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです
table(width(fasta))                    #配列長分布を表示

#本番
obj <- as.logical(width(fasta) >= param)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです
table(width(fasta))                    #配列長分布を表示

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. FASTQ形式ファイル(sample2.fastq)を読み込んでFASTQ形式で保存する場合:

in_f <- "sample2.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param <- 26                            #配列長の閾値を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長分布を表示

#本番
obj <- as.logical(width(fastq) >= param)#条件を満たすかどうかを判定した結果をobjに格納
fastq <- fastq[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastqに格納
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長分布を表示

#ファイルに保存
writeFastq(fastq, out_f)               #fastqの中身を指定したファイル名で保存
	

4. FASTQ形式ファイル(sample2.fastq)を読み込んでFASTA形式で保存する場合:

in_f <- "sample2.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param <- 26                            #配列長の閾値を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
fasta <- sread(fastq)                  #塩基配列情報をfastaに格納
fasta                                  #確認してるだけです
table(width(fasta))                    #配列長分布を表示

#本番
obj <- as.logical(width(fasta) >= param)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです
table(width(fasta))                    #配列長分布を表示

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | フィルタリング | 指定した長さの範囲の配列を抽出

FASTA形式やFASTQ形式ファイルを入力として、指定した長さの範囲(例:40-70bp)の配列を抽出するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param <- 40:70                         #配列長の範囲を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- (width(fasta) >= min(param)) & (width(fasta) <= max(param))#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. FASTQ形式ファイル(sample2.fastq)を読み込んでFASTQ形式で保存する場合:

in_f <- "sample2.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param <- 26:30                         #配列長の範囲を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長分布を表示

#本番
obj <- (width(fastq) >= min(param)) & (width(fastq) <= max(param))#条件を満たすかどうかを判定した結果をobjに格納
fastq <- fastq[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastqに格納
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長分布を表示

#ファイルに保存
writeFastq(fastq, out_f)               #fastqの中身を指定したファイル名で保存
	

3. FASTQ形式ファイル(sample2.fastq)を読み込んでFASTA形式で保存する場合:

in_f <- "sample2.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param <- 26:30                         #配列長の範囲を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
fasta <- sread(fastq)                  #塩基配列情報をfastaに格納
fasta                                  #確認してるだけです
table(width(fasta))                    #配列長分布を表示

#本番
obj <- (width(fasta) >= min(param)) & (width(fasta) <= max(param))#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです
table(width(fasta))                    #配列長分布を表示

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | フィルタリング | 任意のIDを含む配列を抽出

二つのファイル(multi-FASTA形式ファイルとIDリストファイル)を読み込んで、IDリストファイル中のRefSeq IDに対応する配列のサブセットを抽出するやり方を示します。 multi-FASTAファイルのdescription行の記述中にIDリストファイル中の文字列が存在することが大前提であることはいうまでもありませんが一応言っときます。 また、同一文字列としてうまく認識させるために、(description行の記述の中からIDリスト中の文字列と完全一致させるべく) description部分の記述をうまく分割(例:"_up_"など)してIDと一致する部分のみにする必要があり、このあたりは、自分でdescription行を眺めて適宜改変しなければなりません。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. multi-FASTAファイル(rat_upstream_1000.fa)の中からIDリスト(sample_IDlist1.txt)を含む配列を抽出したい場合:

(multi-FASTAファイルのほうのdescription行を"_up_"を区切り文字として分割し、分割後の1番目の要素を抽出することでIDリストとの対応付けを可能としている)

in_f1 <- "rat_upstream_1000.fa"        #入力ファイル名(multi-FASTAファイル)を指定してin_f1に格納
in_f2 <- "sample_IDlist1.txt"          #入力ファイル名(IDリストファイル)を指定してin_f2に格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです

#前処理(reads中のdescription部分を改変)
hoge <- strsplit(names(fasta), "_up_", fixed=TRUE)#names(fasta)中の文字列を"_up_"で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", 1)) #hogeのリスト中の1番目の要素(これがRefSeq IDに相当)を抽出してhoge2に格納
names(fasta) <- hoge2                  #names(fasta)の中身をhoge2で置換
fasta                                  #確認してるだけです

#本番
obj <- is.element(names(fasta), keywords)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. multi-FASTAファイル(sample_100.fastaの中からIDリスト(sample_IDlist2.txt)を含む配列を抽出したい場合:

(multi-FASTAファイルのほうのdescription行を"|"を区切り文字として分割し、分割後の4番目の要素を抽出することでIDリストとの対応付けを可能としているつもりだが、バージョン番号が残っているのでうまくいかない例)

in_f1 <- "sample_100.fasta"            #入力ファイル名(multi-FASTAファイル)を指定してin_f1に格納
in_f2 <- "sample_IDlist2.txt"          #入力ファイル名(IDリストファイル)を指定してin_f2に格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです

#前処理(reads中のdescription部分を改変して対応付け可能にしたつもり...)
hoge <- strsplit(names(fasta), "|", fixed=TRUE)#names(fasta)中の文字列を"|"で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", 4)) #hogeのリスト中の4番目の要素(これがRefSeq IDに相当)を抽出してhoge2に格納
names(fasta) <- hoge2                  #names(fasta)の中身をhoge2で置換
fasta                                  #確認してるだけです

#本番
obj <- is.element(names(fasta), keywords)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. multi-FASTAファイル(sample_100.fastaの中からIDリスト(sample_IDlist2.txt)を含む配列を抽出したい場合:

(バージョン番号つきRefSeq IDをさらに"."を区切り文字として分割し、分割後の1番目の要素を抽出することでIDリストとの対応付けを可能としている)

in_f1 <- "sample_100.fasta"            #入力ファイル名(multi-FASTAファイル)を指定してin_f1に格納
in_f2 <- "sample_IDlist2.txt"          #入力ファイル名(IDリストファイル)を指定してin_f2に格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです

#前処理(fasta中のdescription部分を改変して対応付け)
hoge <- strsplit(names(fasta), "|", fixed=TRUE)#names(fasta)中の文字列を"|"で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", 4)) #hogeのリスト中の4番目の要素(これがRefSeq IDに相当)を抽出してhoge2に格納
hoge3 <- strsplit(hoge2, ".", fixed=TRUE)#hoge2中の文字列を"."で区切った結果をリスト形式でhoge3に格納
hoge4 <- unlist(lapply(hoge3, "[[", 1))#hoge3のリスト中の1番目の要素(これがRefSeq IDのバージョン部分以外に相当)を抽出してhoge4に格納
names(fasta) <- hoge4                  #names(fasta)の中身をhoge4で置換
fasta                                  #確認してるだけです

#本番
obj <- is.element(names(fasta), keywords)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | フィルタリング | Illuminaのpass filtering

ここはまだ未完成です。。。

二つのpaired-endファイル(read1.fqread2.fq)があるという前提で二つのファイル中で両方ともpass filteringフラグが1となっているものを抽出するやり方を示します。ここで読み込む二つのファイルは同一行に同一IDが位置するファイルであるという前提で行います。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

in_f1 <- "read1.fq"                    #読み込みたいFASTQ形式のファイル名を指定してin_f1に格納
in_f2 <- "read2.fq"                    #読み込みたいFASTQ形式のファイル名を指定してin_f2に格納
out_f1 <- "read1_pf.fq"                #出力ファイル名を指定してout_f1に格納
out_f2 <- "read2_pf.fq"                #出力ファイル名を指定してout_f2に格納

library(ShortRead)                     #パッケージの読み込み

#read1について基本情報取得
reads1 <- readFastq(in_f1)             #in_f1で指定したファイルの読み込み
hoge <- strsplit(as.character(id(reads1)), "/", fixed=TRUE)#id(reads1)中の文字列を"/"で区切った結果をリスト形式でhogeに格納
hoge2 <- sapply(hoge,"[[", 1)          #hogeのリスト中の一番目の要素のみ取り出してhoge2に格納
hoge3 <- strsplit(hoge2, ":", fixed=TRUE)#hoge2中の文字列を":"で区切った結果をリスト形式でhoge3に格納
pass_filter1 <- sapply(hoge3,"[[", length(hoge3[[1]]))#hoge3のリスト中の最後の要素のみ取り出してpass_filter1に格納
tmp_serial1 <- hoge2                   #入力ファイルのIDの順番がファイル間で同じかどうかを確かめるためにhoge2情報をtmp_serial1に格納

#read2について基本情報取得
reads2 <- readFastq(in_f2)             #in_f2で指定したファイルの読み込み
hoge <- strsplit(as.character(id(reads2)), "/", fixed=TRUE)#id(reads2)中の文字列を"/"で区切った結果をリスト形式でhogeに格納
hoge2 <- sapply(hoge,"[[", 1)          #hogeのリスト中の一番目の要素のみ取り出してhoge2に格納
hoge3 <- strsplit(hoge2, ":", fixed=TRUE)#hoge2中の文字列を":"で区切った結果をリスト形式でhoge3に格納
pass_filter2 <- sapply(hoge3,"[[", length(hoge3[[1]]))#hoge3のリスト中の最後の要素のみ取り出してpass_filter2に格納
tmp_serial2 <- hoge2                   #入力ファイルのIDの順番がファイル間で同じかどうかを確かめるためにhoge2情報をtmp_serial2に格納

#入力ファイルの状態を念のため確認している
#Step1:二つのファイル間でIDの総数が同じかどうかをチェック
#Step2:二つのファイル間でID情報のpass filterの部分より左側のところのみが同じかどうかをチェック
flag <- 0
if(length(tmp_serial1) == length(tmp_serial2)){
    print("Step1:OK")
    flag <- 1
    if(length(tmp_serial1) == sum(tmp_serial1 == tmp_serial2)){
        print("Step2:OK")
        flag <- 2
    }else{
        print("Step2:IDs between two paired-end files are not ideltical!")
    }
}else{
    print("Step1:The two files are not paired-end!")
}

#本番:二つのファイル間でpass filteringフラグが1のもののみ抽出する
if(flag == 2){
    hoge_flag <- as.integer(pass_filter1) + as.integer(pass_filter2)#IDごとにpass filteringフラグの和を計算した結果をhoge_flagに格納(両方で1のものは2になる)
    length(hoge_flag)                  #フィルタリング前のリード数を表示
    sum(hoge_flag == 2)                #フィルタリング後のリード数を表示
    writeFastq(reads1[hoge_flag == 2], out_f1)#reads1の中からhoge_flagの値が2となるもののみ指定したファイル名で保存
    writeFastq(reads2[hoge_flag == 2], out_f2)#reads2の中からhoge_flagの値が2となるもののみ指定したファイル名で保存
}
	

前処理 | フィルタリング | GFF/GTF形式ファイル

QuasRパッケージを用いてゲノムへのマッピング結果からカウント情報を得たいときに、 "TranscriptDb"という形式のオブジェクトを利用する必要があります。 この形式のオブジェクトは、Rで提供されていない生物種の遺伝子アノテーションパッケージ以外のものについても、GFF/GTF形式のファイルがあれば、 それを入力としてTranscriptDbオブジェクトを作成するための関数(GenomicFeaturesパッケージ中のmakeTranscriptDbFromGFF関数)が提供されています。 しかし現実には、GFF/GTF形式ファイルは提供元によって微妙に異なるため、エラーを吐いてmakeTranscriptDbFromGFF関数を実行できない場合が多いです。 それゆえイントロ | 一般 | 任意の文字列を行の最初に挿入のような小細工をして、 染色体名を同じ文字列として認識できるようにしたファイル(human_annotation_sub2.gtf)を用意する必要があるのですが、それでもまだだめな場合があります。 それは、EnsemblのFTPサイトから提供されているGFF/GTFファイル中には、 例えばヒトの場合「chr1, chr2, ...chr22, chrX, chrY, chrMT」以外に"HSCHR6_MHC_APD"や"HSCHR6_MHC_COX"などの記述があるためです。 例えばリファレンス配列を"BSgenome.Hsapiens.UCSC.hg19"に指定して行った場合には、"HSCHR6_MHC_APD"がリファレンス配列中に存在しないため、 GTFファイルに存在する"HSCHR6_MHC_APD"コンティグ?!上の特定の領域にマップされたリード数をカウントできるはずもなく、結果的に「そんなものはない!」とmakeTranscriptDbFromGFF関数実行中に怒られるわけです。

この問題への最も合理的な対処法は、GFF/GTFファイルの中から、自分がマッピングに用いたリファレンス配列中の染色体名と同じ文字列の行だけを抽出した新たなGFF/GTFファイルを作成することです。 したがって、ここではGFF/GTFファイルとリファレンス配列を読み込んで、リファレンス配列中に存在する染色体名を含む行だけを抽出するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ヒトゲノム配列("BSgenome.Hsapiens.UCSC.hg19")中の染色体名と一致する遺伝子アノテーション情報のみGTFファイル(human_annotation_sub2.gtf)から抽出したい場合:

in_f1 <- "human_annotation_sub2.gtf"   #入力ファイル名を指定してin_f1に格納(GFF/GTFファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み(GFF/GTFファイル)
data <- read.table(in_f1, header=FALSE, sep="\t", quote="")#in_f1で指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(リファレンス配列の染色体名を抽出)
param <- in_f2                         #paramという名前で取り扱いたいだけです
library(param, character.only=T)       #paramで指定したパッケージの読み込み
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
hoge <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてhogeに格納
keywords <- seqnames(hoge)             #染色体名情報を抽出した結果をkeywordsに格納
keywords                               #確認してるだけです

#本番
obj <- is.element(as.character(data[,1]), keywords)#条件を満たすかどうかを判定した結果をobjに格納
out <- data[obj,]                      #objがTRUEとなる行のみ抽出した結果をoutに格納
dim(out)                               #オブジェクトoutの行数と列数を表示

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

前処理 | フィルタリング | 組合せ | ACGTのみ & 指定した長さの範囲の配列

multi-FASTAファイルを入力として、ACGTのみからなる配列を抽出したのち、さらに指定した長さの範囲(20-30bp)の配列を抽出するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample2.fasta)の場合:

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
param1 <- 0                            #許容するACGT以外の文字数(実質的にはNの許容数に相当)を指定
param2 <- 20:30                        #配列長の範囲を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番1(ACGTのみの配列を抽出)
hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#ACGTの総数をカウントした結果をhogeに格納
obj <- (width(fasta) - hoge) <= param1 #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#本番2(指定した長さの範囲の配列を抽出)
obj <- (width(fasta) >= min(param2)) & (width(fasta) <= max(param2))#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | トリミング | ポリA配列除去

multi-FASTA形式ファイル(sample3.fasta)を読み込んでmRNAの3'末端に存在するpoly A配列部分をトリムするやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 許容するミスマッチ数が0の場合:

in_f <- "sample3.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"#トリムしたい配列情報を指定してparam1に格納
param2 <- 0                            #許容するミスマッチの数を指定してparam2に格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- trimLRPatterns(Rpattern=param1, subject=fasta, max.Rmismatch=rep(param2, nchar(param1)))#アダプター配列除去を行った結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. 許容するミスマッチ数が1の場合:

in_f <- "sample3.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"#トリムしたい配列情報を指定してparam1に格納
param2 <- 1                            #許容するミスマッチの数を指定してparam2に格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- trimLRPatterns(Rpattern=param1, subject=fasta, max.Rmismatch=rep(param2, nchar(param1)))#アダプター配列除去を行った結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | トリミング | アダプター配列除去(基礎)

smallRNA-seqから得られる配列データにはアダプター配列(例:CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG; Oligonucleotide sequences (c) 2007-2009 Illumina, Inc. All rights reserved.)が含まれ、アダプター配列を含んだままの状態でゲノムなどのリファレンス配列にマッピングすることはできません。 ここでは、許容するミスマッチ数を指定して、RNA-seqデータの右側にアダプター配列(例:"ACGTACGTAA")があるという前提で、 アダプター配列除去後の配列を保存するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイルの場合(sample3.fasta):

in_f <- "sample3.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "ACGTACGTAA"                 #アダプター配列情報を指定してparam1に格納
param2 <- 0                            #許容するミスマッチの数を指定してparam2に格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- trimLRPatterns(Rpattern=param1, subject=fasta, max.Rmismatch=rep(param2, nchar(param1)))#アダプター配列除去を行った結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. FASTQ形式ファイル(sample1.fastq)を読み込んでFASTA形式で保存する場合:

in_f <- "sample1.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam1に格納
param2 <- 2                            #許容するミスマッチの数を指定してparam2に格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- trimLRPatterns(Rpattern=param1, subject=fasta, max.Rmismatch=rep(param2, nchar(param1)))#アダプター配列除去を行った結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. FASTQ形式ファイル(sample1.fastq)を読み込んでFASTQ形式で保存する場合:

in_f <- "sample1.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam1に格納
param2 <- 2                            #許容するミスマッチの数を指定してparam2に格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み

#本番
hoge1 <- trimLRPatterns(Rpattern=param1, subject=sread(fastq), max.Rmismatch=rep(param2, nchar(param1)))#アダプター配列除去を行った結果をhoge1に格納
hoge2 <- BStringSet(quality(quality(fastq)), start=1, end=width(hoge1))#quality(fastq)オブジェクトの中から(param1)塩基だけトリムした結果をDNAStringSet形式にしてhoge2に格納
fastq <- ShortReadQ(hoge1, hoge2, id(fastq))#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示

#ファイルに保存
writeFastq(fastq, out_f)               #fastqの中身を指定したファイル名で保存
	

前処理 | トリミング | アダプター配列除去(組合せ)

アダプター配列除去後に、ACGTのみからなる配列を抽出したのち、さらに指定した長さの範囲(20-30bp)の配列を抽出するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイルの場合(sample3.fasta):

in_f <- "sample3.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "ACGTACGTAA"                 #アダプター配列情報を指定してparam1に格納
param2 <- 0                            #許容するミスマッチの数を指定してparam2に格納
param3 <- 0                            #許容するACGT以外の文字数(実質的にはNの許容数に相当)を指定
param4 <- 20:30                        #配列長の範囲を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番1(アダプター配列除去)
fasta <- trimLRPatterns(Rpattern=param1, subject=fasta, max.Rmismatch=rep(param2, nchar(param1)))#アダプター配列除去を行った結果をfastaに格納
fasta                                  #確認してるだけです

#本番2(ACGTのみの配列を抽出)
hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#ACGTの総数をカウントした結果をhogeに格納
obj <- (width(fasta) - hoge) <= param3 #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#本番3(指定した長さの範囲の配列を抽出)
obj <- (width(fasta) >= min(param4)) & (width(fasta) <= max(param4))#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. FASTQ形式ファイルの場合(sample1.fastq):

in_f <- "sample1.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam1に格納
param2 <- 2                            #許容するミスマッチの数を指定してparam2に格納
param3 <- 0                            #許容するACGT以外の文字数(実質的にはNの許容数に相当)を指定
param4 <- 20:30                        #配列長の範囲を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番1(アダプター配列除去)
fasta <- trimLRPatterns(Rpattern=param1, subject=fasta, max.Rmismatch=rep(param2, nchar(param1)))#アダプター配列除去を行った結果をfastaに格納
fasta                                  #確認してるだけです

#本番2(ACGTのみの配列を抽出)
hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#ACGTの総数をカウントした結果をhogeに格納
obj <- (width(fasta) - hoge) <= param3 #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#本番3(指定した長さの範囲の配列を抽出)
obj <- (width(fasta) >= min(param4)) & (width(fasta) <= max(param4))#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | トリミング | アダプター配列除去(girafeパッケージ)

3'側にアダプター配列を含む塩基配列からなるFASTQ形式ファイル(SRR037439.fastq)を読み込んでアダプター配列除去を行うやり方を示します。

注意点1としては、実際に塩基配列長が短くなっていてもdescription行の記述(特に配列長情報の記述)は変わりませんので、「なんかおかしい」と気にしなくて大丈夫です。

注意点2としては、例えば、アダプター配列の5'側が「CATCG...」となっているにも関わらずなぜ二番目の配列の3'側「...CATAG」の最後の5塩基がトリムされているのだろう?と疑問に思われる方がいらっしゃるかもしれませんが、これは。R Console上で「?trimAdapter」と打ち込んでデフォルトのオプションを眺めることで理由がわかります。つまり、アラインメントスコア計算時に、この関数はデフォルトで一致に1点、不一致に-1点を与えて一塩基づつオーバーラップの度合いを上げていく、という操作をしているからです。 したがって、もし完全一致のみに限定したい場合は、trimAdapter関数のところで、不一致に対して大幅に減点するようなパラメータを与えればいいんです。例えば「mismatch.score = -1000」とか。。。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. デフォルトのパラメータ(一致に1点、不一致に-1点)でトリムし、FASTQ形式で保存する場合:

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam1に格納

#必要なパッケージをロード
library(girafe)                        #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長ごとの出現頻度情報を表示

#本番
fastq <- trimAdapter(fastq, param1)    #trimAdapter関数を用いてアダプター配列除去した結果をfastqに格納
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長ごとの出現頻度情報を表示

#ファイルに保存
writeFastq(fastq, out_f)               #fastqの中身を指定したファイル名で保存
	

2. アダプター配列と完全一致のみで2塩基以上一致するものだけをトリムし、FASTQ形式で保存する場合:

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam1に格納
param2 <- 2                            #アダプター配列との最低一致塩基数をparam2に格納

#必要なパッケージをロード
library(girafe)                        #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長ごとの出現頻度情報を表示

#本番
mismatch <- nchar(param1) + 100        #不一致に対して大幅に減点するための値を「アダプター配列長 + 100」としている(100を余分に足しているのは念のためです)
fastq <- trimAdapter(fastq, param1, mismatch.score = -mismatch, score.threshold = param2)#trimAdapter関数を用いてアダプター配列除去した結果をfastqに格納
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長ごとの出現頻度情報を表示

#ファイルに保存
writeFastq(fastq, out_f)               #fastqの中身を指定したファイル名で保存
	

3. アダプター配列と完全一致のみで2塩基以上一致するものだけをトリムし、FASTA形式で保存する場合:

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam1に格納
param2 <- 2                            #アダプター配列との最低一致塩基数をparam2に格納

#必要なパッケージをロード
library(girafe)                        #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長ごとの出現頻度情報を表示

#本番
mismatch <- nchar(param1) + 100        #不一致に対して大幅に減点するための値を「アダプター配列長 + 100」としている(100を余分に足しているのは念のためです)
fastq <- trimAdapter(fastq, param1, mismatch.score = -mismatch, score.threshold = param2)#trimAdapter関数を用いてアダプター配列除去した結果をfastqに格納
fasta <- sread(fastq)                  #fastqの配列情報部分をfastaに格納
names(fasta) <- id(fastq)              #description情報部分をfastaに追加
fasta                                  #確認してるだけです
table(width(fasta))                    #配列長ごとの出現頻度情報を表示

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | トリミング | 指定した末端塩基数だけ除去

3'末端を指定塩基数分だけトリムするやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 5                            #3'末端のトリムしたい塩基数

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- DNAStringSet(fasta, start=1, end=(width(fasta)-param1))#(param1)塩基だけトリムした結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. FASTQ形式ファイル(SRR037439.fastq)を読み込んでFASTQ形式で保存する場合:

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 2                            #3'末端のトリムしたい塩基数

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
hoge1 <- DNAStringSet(sread(fastq), start=1, end=width(sread(fastq))-param1)#sread(fastq)オブジェクトの中から(param1)塩基だけトリムした結果をDNAStringSet形式にしてhoge1に格納
hoge2 <- BStringSet(quality(quality(fastq)), start=1, end=width(quality(quality(fastq)))-param1)#quality(fastq)オブジェクトの中から(param1)塩基だけトリムした結果をDNAStringSet形式にしてhoge2に格納
fastq <- ShortReadQ(hoge1, hoge2, id(fastq))#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示

#ファイルに保存
writeFastq(fastq, out_f)               #fastqの中身を指定したファイル名で保存
	

3. FASTQ形式ファイル(SRR037439.fastq)を読み込んでFASTA形式で保存する場合:

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 4                            #3'末端のトリムしたい塩基数

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- DNAStringSet(fasta, start=1, end=(width(fasta)-param1))#(param1)塩基だけトリムした結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

アセンブル | について

アセンブルという言葉がなかなか理解しずらい人は、単純に「多重配列アラインメント(multiple sequence alignment)を行って一本一本の配列だけからでは到底到達できないような長い配列(これをコンセンサス配列という)を作成すること」だと解釈することで差し支えないと思います。

出力ファイル形式はFASTAがデファクトスタンダードです。

アセンブルによって、まず一本一本のリードをコンティグ(contigs)にまとめます。そしてコンティグの並び(order or orientation)やコンティグ間のギャップサイズ("N"の数で表現)をスカッフォールド(scaffolds)で表します。(別の言葉でいうと、scaffoldsは複数のコンティグの並びがどうなっているかを表したもの or まとめたもの、です。)

一般にFASTA形式のアセンブルされた配列のファイルとともに、コンティグに関するいくつかの統計値も得られます。最大コンティグ長(maximum length)、平均コンティグ長(average length)、全コンティグを結合して得られる長さ(combined total length)、N50などです。

ちなみにこのN50というのは、「最も長いコンティグから順番に連結していったときにcombined total lengthの50%になったときのコンティグの長さ」です。「combined total lengthが50%となるような最小数のコンティグ集合のうち最も小さいコンティグの長さ」という言い方もできます。length-weighted medianという表現もなされるようです。

アセンブリの精度評価(確からしさの見積もり)は一般に難しいようですが、メイトペア(mate pair)による制約(constraint)を一般に利用してアセンブルしますので、 それを満たしている(satisfaction)のがどの程度あるかやその制約に反した(vaiolation)結果がどの程度あったかということを精度評価に用いるというやり方も提案されています(参考文献1)。 もちろんリファレンスとなるゲノム配列が既知の場合にはそれとの比較が有用であることは言うまでもありません。

アセンブリを行う際に問題となるのは「リピート配列の取り扱い」や「アセンブルの際に設定する閾値」です。 前者については、ペアードエンド(paired-end)の一部がリピート配列の末端部分だったり、ペアードエンドの片方がリピート配列そのものであればリピート配列の素性がかなりわかります。

後者については、いわゆる感度・特異度の議論と本質的に同じで、combined total lengthをより長くする(つまり感度を上げたい)ためには多少ミスアセンブル(特異度が下がること; chimeric assembly)を許容する必要があります。

実際のアセンブルプログラムは(おそらく全て)「グラフ理論(Graph theory)」を用いています。「一筆書き」の問題をグラフ化して解くような学問です。それらはさらに三つのアプローチに大別できます:

一つめは「Overlap-Layout-Consensus (OLC)」に基づくもので、いわゆる配列のオーバーラップをたよりにアセンブルしていくやり方です。Roche 454など比較的長い配列(数百塩基程度)のアセンブルを目的としたものが多いようです。

二つめは「de Bruijn graph (DBG)中のオイラーパス探索(DBG approach or Eulerian (or Euler or Eulerian path) approach)」に基づくもので、グラフは頂点(ノード; nodes or vertices; 一つ一つの配列に相当)と辺(エッジ; edges or arcs)で表されますが、リードを一塩基づつずらして全ての可能なK-mer (all possible fixed K length strings; K個の連続塩基のことでKは任意の正の整数)を生成し各K-merをノードとした有向グラフ(K-merグラフ)を作成します。 全リードに対して同様の作業を行い、完全一致ノードをマージして得られるグラフがDBGです。 そしてこのグラフは各エッジを一度だけ通るオイラーパス(Eulerian path)をもつことが分かっているので、あとは既知のオイラーパス問題専用アルゴリズムを適用するというアプローチです。 IlluminaやABI SOLiDから得られるデータのアセンブリはこのやり方が(今のところ)デファクトスタンダードだといってもいいでしょう。 なぜ今のところ、か?それはこのアプローチはSanger-type dataに適用してみた、という論文(参考文献2)が2001年にでているほどの昔から提案されていましたが、Sanger法で得られる配列決定プロジェクトに適用するには非現実的だったようです。 その後、Illumina (当時はSolexa)プラットフォームから得られる「(当時は)非常に短いsingle-end (or unpaired)で同じ長さの塩基配列」をアセンブルする目的においては非常によい方法であるということから、 まずはSanger法よりは少し短めのRoche 454の数百塩基のデータ(454 G20 reads)解析用に改良され(参考文献3)、 Illumina (当時はSolexa)のunpaired reads用(参考文献4)、そしてpaired-end reads用(参考文献5; 以下のEULER-SR法の論文)と発展を遂げているわけですが、 もともと長い配列への適用は非現実的という評価が下っていた方法で読める配列がどんどん長くなっているという状況ですので、ある程度長くなった段階で、また「OLCアプローチ」に移行していくという可能性もあるのではないかと思っています。

三つめは「貪欲法(Greedy algorithm)」に基づくもので、

などがこのアプローチに含まれます。

どのアセンブラがいいかについての評価を行うGenome Assembly Gold-standard Evaluation (GAGE)というウェブサイトもあるようです。

次にトランスクリプトームアセンブリ用についてです。

どの方法も基本的にアセンブルする(配列同士を連結する)かどうかの判断基準として、k-mer (k個の連続塩基が)一致しているかどうかで判断しますが、 このkについて複数の値を利用するという戦略(de novo transcriptome assembly with multiple k-mer values)をとっているようです。

この背景としては、ゲノム配列のアセンブリはゲノム全体でcoverageが一般に一定である(or 一定であることを仮定している)のに対して、 トランスクリプトームは転写物によってかなりcoverageが異なります(つまり遺伝子ごとに発現レベルが違うということを述べているだけです)。 一般に、kの値を大きくすると高発現遺伝子(高発現転写物)からなるより長い"contig"が得られ、 他方kを小さくすると低発現遺伝子がちゃんと"contig"として得られる、といった感じになります。 もう少し別な言い方をすると、「kを大きくするとより長いcontig (transcript fragment; 転写物断片)が得られ、kを小さくすると転写物断片がさらに断片化されたようなものが得られる」というイメージです。 kの範囲についてですが、例えばTrans-ABySSはリードの長さがLだとするとL/2からL-1の範囲にしています。

ちなみにkは奇数(odd number)しかないのはなぜでしょう?それはパリンドローム(palindrome)を回避するためです。 例えば5'-ACGTTGCA-3'という配列でk=8を考えてみるとこの相補鎖も全く同じ(そういう配列がパリンドロームだから)で混乱してしまいますが、kが例えば7や9のような奇数なら相補鎖にマッチすることはないのでパリンドローム問題にぶち当たることはないわけです。

アセンブル | ゲノム用

2014年5月に調べた結果をPubMed ID順にリストアップします:

以下は、2012年6月ごろに書いたプラットフォーム別のリストです:

多少間違っている可能性もありますし、バージョンアップで別のプラットフォームに対応可能になっていることもありますので、予めご容赦ください。

SEQanswers中にはプラットフォームごとのではなく、プログラムごとの説明もあります(例えばABySS)。

ABI SOLiD用:

Illumina用:

Roche 454用:

アセンブル | ゲノム既知で転写物構造推定用

reference-based methodsというカテゴリに含まれるものたちです。ゲノム配列にRNA-seqデータのマッピングを行ってどこに遺伝子領域があるかなどの座標(アノテーション)情報を取得する遺伝子構造推定用です。 GeneScissorsというのは、TopHat/Cufflinks系の有名なプログラムの出力結果をもとに間違いを修正するなどして精度を高めるもののようです。

マッピング | 備忘録 | について

Rでマッピングやカウント計測を行うパッケージが出始めました。

RsubreadLiao et al., Nucleic Acids Res., 2013。Windows版なし

QuasR原著論文はまだみたいです。Windows版あり

HTSeqGenie原著論文はまだみたいです。Windows版なし

その関係上、それ以外のLinux版を中心としたプログラムたちは、「マッピング | 備忘録 | 」のところに押し込めています。

マッピング | 備忘録 | basic aligner

ここで紹介するのは、主にトランスクリプトーム配列へのマッピングを行うためのプログラムたちです。「マッピング | 備忘録 | splice-aware aligner」で紹介するプログラムたちはいわゆるgapped alignmentが可能なプログラムなので複数のエクソンをまたぐリード(i.e., spliced reads)のマッピングも可能なので、ゲノム配列へのマッピング用に使われます。が、splice-aware aligner (or spliced alignmer)は内部的にここで紹介するbasic aligner (or unspliced aligner)を使っています。 basic alignerはアルゴリズム的な観点から大きく二種類に大別可能ですが、そのアルゴリズムの特性によって得手不得手がありますのでご注意ください。また、論文自体は古くても、プログラムを頻繁にバージョンアップさせてよりよくなっている場合もありますので、出版年にこだわる必要はあまりないのではと思っています。

2013年10月に調べた結果をPubMed ID順にリストアップします:

以下、分類別:

(BLASTやFASTA的な昔からある)Seed-and-extend methods

このカテゴリに含まれる方法は、マップするshort readよりもさらに短い配列(これがいわゆる"seed"; 種)の完全一致(perfect match)領域をリファレンス配列から探し、このseed領域を拡張(extend)させてアラインメントするというスタンスのものたちです。特徴としては、マップするリファレンス配列(ゲノム配列 or トランスクリプトーム配列)のクオリティが低い場合にも対応可能です。したがって、近縁種のゲノムにマップしたいような場合には、内部的にこのカテゴリに含まれるプログラムを採用しているほうがより多くマップさせることができることが期待されます。また、polymorphism (or sequence variation)の割合が高いようなものについても、こちらのカテゴリの方法のほうがよりよい結果を得られると期待されます。

以下のプログラムたちがこのカテゴリに含まれます:

Burrows-Wheeler transform (BWT) methods

このカテゴリに含まれる方法は、文字通りBWTというアルゴリズムを用いて効率的にマップしたいshort readsと完全一致(perfect match)する領域を探すものたちです。基本的にperfect matchを探すのに向いているため、ミスマッチを許容すると劇的に計算が遅くなります。したがって、比較的きれいなトランスクリプトーム配列に対してマップさせたい場合には、このカテゴリに含まれるプログラムを用いるほうが計算時間的に有利だと思います。short readのころには、このアルゴリズムを実装したプログラムがどんどんpublishされていたような印象がありますが、最近はどうなんでしょうね。こっち方面はあまりサーベイしていないのですが、プログラムのバージョンアップで多少のindelsに対しても頑健なものになっているのかもしれません。。。

以下のプログラムたちがこのカテゴリに含まれます:

比較的最近(2012年)のベンチマークデータでの比較解析論文

以下備忘録:

  • Bowtie (Langmead et al., Genome Biol., 2009)
    • OS:Linux, Windows(32bit), and Mac
    • 入力ファイル:FASTA and FASTQ
    • オプション例1:「--offrate 3 -p 8 -v 0 -k 10000 --sam」
    • オプション例1の説明:"--offrate 3"とすることでdefaultの5よりもメモリをより多く消費するが高速化させている。"-p 8"で8コア使え。"-v 0"でミスマッチ数は0。"-k 10000"でreadあたり最大10000 valid alignmentsまで出力せよ。("-v 0"としてあるので、"--best"をわざわざ与えなくてもいいはず)
    • オプション例2:「--offrate 3 -p 8 -v 2 --best -k 100 --sam」
    • オプション例2の説明:"-v 2"でミスマッチ数は2。"--best"で最もミスマッチ数が少なかったものだけを出力せよ。"-k 100"でreadあたり最大100 valid alignmentsまで出力せよ。"--sam"でSAM formatで出力せよ。
    • オプション例3:「--offrate 3 -p 8 -v 2 -k 1 --sam」
    • オプション例3の説明:"-v 2"でミスマッチ数は2個まで許容し、"-k 1"でreadあたり上位1つだけのvalid alignmentsを出力せよ。
    • オプション例4:「--offrate 3 -p 8 -a --best --strata -v 2 -m 1」
    • オプション例4の説明:"-v 2"でミスマッチ数は2個まで許容する、としつつも"-a --best --strata"で最小のミスマッチ数でヒットした結果のみ全て出力せよ、としつつも"-m 1"で1か所にしかヒットしないものだけを出力せよ。おそらくこれは「SOAP2のオプション例3」あたりに相当します。
    • オプション例5:「--offrate 3 -p 8 -a -v 2 -m 1」
    • オプション例5の説明:例4との違いは"--best --strata"があるかないか。これがない場合は、readあたりのreportable alignments数が増えるので結果的に"-m 1"の条件で落とされるものが増える。したがって例4のほうが例5よりもレポートするread数が多くなる。
    • オプション例6:「-v 0 -a -maxins 250」
    • オプション例6の説明:"-v 0"でミスマッチ数は0 (つまりperfect matchのみ)。"-a"で全てのマップされた座標情報を出力せよ。"-maxins 250"でcDNAフラグメントサイズが250 bpまでの可能性を考えろ(これは36-bp pair-end dataの場合;ちなみに50-bp pair-end dataの場合は"-maxins 400"と指定、するのがいい?!)。
    • 出力形式:Bowtie and SAM format
  • BWA (Li and Durbin, Bioinformatics, 2009(BWA-shortの論文))
    • OS:Linux and Mac
    • 入力ファイル:FASTQ (少なくとも)
    • オプション例:「-n 10000」
    • 出力形式:SAM format
    • その他:現在では、こちらはBWA-shortというものに相当します。200bp塩基以下の長さのreadをqueryにするときは、BWA-shortを使うようです。上記の2009年の論文のときはBWAという名前でしたが、2010年にBWA-SWというlong-read用のものが出たので、これら二つの総称がBWAで、2009年のものをBWA-short, 2010年のものをBWA-SWとしたようですね。
  • BWA (Li and Durbin, Bioinformatics, 2010(BWA-SWの論文))
    • OS:
    • 入力ファイル:
    • オプション例:
    • 出力形式:
    • その他:BWA-SWのSWはSmith-Watermanの略です。BWA-shortと対比させて、queryが200bpよりも長く100kbp程度以下の長さのアラインメントの際に用いるようです。競合するプログラムとしては、BLAT (Kent WJ, Genome Res., 2002)やSSAHA2 (Ning et al., Genome Res., 2001)があります。精度的な面では、BLATよりも高精度でSSHAと同程度とabstractには書いてありますね。
  • ELAND (Illumina's commercial alignment program)
  • MAQ (Li et al., Genome Res., 2008)
    • OS:Linux
  • MOM (Eaves and Gao, Bioinformatics, 2009)
    • OS:Linux
  • Novoalign (Krawitz et al., Bioinformatics, 2010)
    • OS:Linux and Mac
    • 出力形式:SAM format
  • PASS (Campagna et al., Bioinformatics, 2009)
    • OS:Linux and Windows (X86 and AMD64; 意味不明)
    • 入力ファイル:FASTA (FASTQもOKと書いてあるがだめでした...)
    • アダプター配列除去:No
    • オプション例:「-fid 100 -max_best_hits 10000 -pst ~/pass_v1.01/PST/W5M1m0G0X0.pst 9 -b -gff -info_gff」
    • 出力形式:GFF3 format
  • PatMaN (Prufer et al., Bioinformatics, 2008)
    • OS:Linux
  • RazerS (Weese et al., Genome Res., 2009)
    • OS:Linux
  • RMAP (Smith et al., BMC Bioinformatics, 2008)
    • OS:Linux
    • 入力ファイル:FASTA and FASTQ
  • SHRiMP (Rumble et al., PLoS Comput. Biol., 2009)
    • OS:Linux and Mac
  • SOAP1 (Li et al., Bioinformatics, 2008)
    • OS:Linux
    • 入力ファイル:FASTA and FASTQ
    • アダプター配列除去:Yes
    • 出力形式:SOAP format
  • SOAP2 (Li et al., Bioinformatics, 2009)
    • OS:Linux and Mac
    • 入力ファイル:FASTA and FASTQ
    • アダプター配列除去:No
    • オプション例1:「-M 0 -r 2 -n 0」
    • オプション例1の説明:ミスマッチが0個で、multiple best hitsのものに対しては全部出力(最大10000)で、Nを全く含まない配列のみ
    • オプション例2:「-M 4 -r 0 -n 0」
    • オプション例2の説明:"-M 4"は、ミスマッチが2個以下という条件の中でベストヒットを探せ。"-r 0"はmultiple best hitsのものは出力しない(つまり、一か所にしかヒットしないものだけを出力せよ)。
    • オプション例3:「-M 4 -r 0 -n 2」
    • オプション例3の説明:"-M 4"は、ミスマッチが2個以下という条件の中でベストヒットを探せ。"-r 0"はmultiple best hitsのものは出力しない(つまり、一か所にしかヒットしないものだけを出力せよ)。"-n 2"はread中にNを2個含むものまで許容。おそらくこれは「Bowtieのオプション例4」あたりに相当します。
    • 出力形式:SOAP format (SOAP --> SAMへの変換プログラムあり;soap2sam.pl)
  • ZOOM (Lin et al., Bioinformatics, 2008)
  • ZOOM Lite (Zhang et al., Nucleic Acids Res., 2010)
    • OS:Linux and Windows
    • 入力ファイル:FASTA, FASTQ, Illuminaの*_seq.txtと*_prb.txt, SOLiDの*.csfastaと*_QV.qualと*.csfastq
    • Platform:Illumina and ABI
    • 出力形式:ZOOM, SAM, BED, and GFF format

マッピング | 備忘録 | splice-aware aligner

basic alignerを用いてゲノムマップする場合には、既知のsplice junctionの位置情報を用いて対処するため、未知のものには対応できません。

未知のsplice junctionに対応する方法もいくつか提案されています。

TopHatは以下のような戦略でspliced readsをうまくマップする方法を提案しています:

  1. リードを(Bowtieを使って)ゲノム配列にマップ
  2. ゲノムにマップすることで仮想エクソン(putative exons)領域がわかるので、その近傍のsplice junction候補領域配列を抽出
  3. 「1でマップされなかったリード」を「2で作成した配列群」にマップさせることで、マップされたものはspliced readsであり、元々のゲノム上の座標(coordinates)情報もわかる

さらに、最近では割と長い配列が読めるようになってきた(>=50bp程度)ので、SpliceMapという方法は、リードの半分の長さをマップさせておいてそのアラインメントを拡張(extend)させる戦略を採用しています。(TopHatの最新版もこれに近い方法にバージョンアップしたようです)

RNA-MATEという方法は、「リードをちょっと短くして、ゲノムにマップ(するかどうか?)」を繰り返して(それゆえrecursive mapping strategyという)spliced readsを取り扱う、という方法を提案しています。(計算時間はかかりそうですね。このバージョンアップ版としてX-MATEというものがあるようです。)

Review:

マッピング | 備忘録 | Bisulfite sequencing用

Bisulfite sequencingデータ専用のマッピングプログラムも結構あります。 手法比較論文(Kunde-Ramamoorthy et al., Nucleic Acids Res., 2014)もありますね。 quality control系の論文(MethyQA; Sun et al., BMC Bioinformatics, 2013)も出ていますね。

マッピング | 備忘録 | (ESTレベルの長さの) contig

いくつか挙げておきます:

Trans-ABySSの論文中では、exonerate(のest2genomeというモード)でcontigをマウスゲノムにマップしています(Robertson et al., Nature Methods, 2010)。 また、SPALNはcDNA配列をゲノムにマップするものですが、私自身がEST配列をゲノムにマップする目的で使用した経験があります。

マッピング | 基礎

マッピングの基本形を示します。出力はBED形式と似ています(理解しやすいので...)。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. hoge4.faをリファレンス配列(マップされる側)として、data_reads.txt中の4リードのマッピングを行う場合:

イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)です。

in_f1 <- "hoge4.fa"                    #入力ファイル名を指定してin_f1に格納(マップされる側)
in_f2 <- "data_reads.txt"              #入力ファイル名を指定してin_f2に格納(マップする側)
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
reads <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み

#本番
out <- c("in_f2", "in_f1", "start", "end")#最終的に得る出力ファイルのヘッダー情報を指定してoutに格納(4列のデータを得る)
for(i in 1:length(reads)){             #リード数分だけループを回す
    hoge <- vmatchPattern(pattern=as.character(reads[i]), subject=fasta)#オブジェクトreads中の各塩基配列と100%マッチの領域を探索して結果をhogeに格納
    hoge1 <- cbind(start(unlist(hoge)), end(unlist(hoge)))#一致領域の(start, end)の位置情報をhoge1に格納
    hoge2 <- names(unlist(hoge))       #ヒットしたリファレンス配列中のIDをhoge2に格納
    hoge3 <- rep(as.character(reads[i]), length(hoge2))#hoge2の要素数分だけ、マップする側の配列(in_f2で指定するものに相当)のIDをhoge3に格納
    out <- rbind(out, cbind(hoge3, hoge2, hoge1))#cbind(hoge3, hoge2, hoge1)で表される欲しい情報をどんどんオブジェクトoutの下に追加している(ループが回るたびにどんどん行数が増えていっているイメージ)
}
head(out)                              #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#outの中身を指定したファイル名で保存
	

マッピング | single-end | ゲノム | basic aligner(基礎) | QuasR(Lerch_XXX)

QuasRパッケージを用いてsingle-end RNA-seqデータのリファレンスゲノム配列へのマッピングを行うやり方を示します。 basic alignerの一つであるBowtie (Langmead et al., Genome Biol., 2009)を実装した Rbowtieパッケージを内部的に使っています。

入力として与えるRNA-seqデータファイルはFASTA形式でもFASTQ形式でも構いません。ただし、拡張子が".fa", ".fna", ".fasta", ".fq", ".fastq"のいずれかでないといけないようです。 例えば".txt"だとエラーになります。また、圧縮ファイルでも構わないようです。".gz", ".bz2", ".xz"を認識できるようです。

リファレンスゲノムは、BSgenomeパッケージで利用可能なものをそのまま指定することができるようです。 つまり、available.genomes()でみられるパッケージ名を指定可能だということです。もし指定したパッケージがインストールされていなかった場合でも、自動でインストールしてくれるようです。

マッピングプログラム(aligner)のデフォルトは、ジャンクションリードのマッピングができないが高速なBowtie (Langmead et al., Genome Biol., 2009)です。 Bowtieプログラム自体は、複数個所にマップされるリードの取り扱い(uniquely mapped reads or multi-mapped reads)を"-m"オプションで指定したり、 許容するミスマッチ数を指定する"-v"などの様々なオプションを利用可能ですが、QuasR中では、"-m 1 -–best -–strata"オプションを基本として、内部的に自動選択するらしいです。 実際に用いられたオプションは下記スクリプト中のoutオブジェクトの出力結果から知ることができます。 この項目では、マッピングのオプションについては変更を加えずに、一つのRNA-seqファイルのマッピングを行う基本的なやり方を示しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1.サンプルデータ18,19のRNA-seqデータ(sample_RNAseq1.fa)のref_genome.faへのマッピングの場合:

mapping_single_genome1.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(sample_RNAseq1.fa)、 そして2行目の2列目に「任意のサンプル名」(例:namae)を記載したタブ区切りテキストファイルを用意した上で行います。 1行目の文字列は変えてはいけません(つまり"FileName"と"SampleName"のままにしておくということです)

マッピング後に得られるBAM形式ファイルは、"sample_RNAseq1_XXXXXXXXXX.bam"というファイル名で作業ディレクトリ上に自動で生成されます。 ここで、XXXXXXXXXXはランダムな文字列からなります。 理由は、同じRNA-seqファイルを異なるパラメータやリファレンス配列にマッピングしたときに、同じ名前だと上書きしてしまう恐れがあるためです。 また、Quality Controlレポートも"sample_RNAseq1_XXXXXXXXXX_QC.pdf"というファイル名で作業ディレクトリ上に自動で生成されます。

マッピングに用いたパラメータは"-m 1 --best --strata -v 2"であったことがわかります。

in_f1 <- "mapping_single_genome1.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです
	

2.サンプルデータ18,19のRNA-seqのgzip圧縮ファイル(sample_RNAseq1.fa.gz)のref_genome.faへのマッピングの場合:

mapping_single_genome2.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(sample_RNAseq1.fa.gz)、 そして2行目の2列目に「任意のサンプル名」(例:asshuku)を記載したタブ区切りテキストファイルを用意した上で行います。 1行目の文字列は変えてはいけません(つまり"FileName"と"SampleName"のままにしておくということです)

圧縮ファイルをそのまま読み込ませることもできる例です。

in_f1 <- "mapping_single_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです
	

3.サンプルデータ18,19のRNA-seqのgzip圧縮ファイル(sample_RNAseq1.fa.gz)のref_genome.faへのマッピングの場合:

mapping_single_genome2.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(sample_RNAseq1.fa.gz)、 そして2行目の2列目に「任意のサンプル名」(例:asshuku)を記載したタブ区切りテキストファイルを用意した上で行います。 1行目の文字列は変えてはいけません(つまり"FileName"と"SampleName"のままにしておくということです)

マッピング結果をBED形式ファイルとして保存するやり方です。GenomicRangesパッケージを用いて内部的にBAM形式ファイルを読み込み、 BED形式に変換してから保存しています。

in_f1 <- "mapping_single_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

4.サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)のhoge4.faへのマッピングの場合:

mapping_single_genome3.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(SRR037439.fastq)、 そして2行目の2列目に「任意のサンプル名」(例:human_brain)を記載したタブ区切りテキストファイルを用意した上で行います。 1行目の文字列は変えてはいけません(つまり"FileName"と"SampleName"のままにしておくということです)

一つもマップされるものがない例であり、FASTQを入力ファイルとして読み込めるという例でもあります。もちろん圧縮ファイル形式でもOKです。

in_f1 <- "mapping_single_genome3.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "hoge4.fa"                    #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

5.サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)のトキソプラズマゲノムBSgenome.Tgondii.ToxoDB.7.0へのマッピングの場合:

mapping_single_genome3.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(SRR037439.fastq)、 そして2行目の2列目に「任意のサンプル名」(例:human_brain)を記載したタブ区切りテキストファイルを用意した上で行います。 1行目の文字列は変えてはいけません(つまり"FileName"と"SampleName"のままにしておくということです)

ヒトRNA-seqデータをBSgenomeパッケージで利用可能な生物種のリファレンスゲノム配列にマッピングするやり方の一例です。 計算時間短縮のためゲノムサイズの小さいトキソプラズマゲノムBSgenome.Tgondii.ToxoDB.7.0を指定しています。 BSgenome.Hsapiens.UCSC.hg19を指定すると(おそらく数時間程度かかるかもしれませんが...)マップされる確率は当然上がります(同じ生物種なので)。

in_f1 <- "mapping_single_genome3.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Tgondii.ToxoDB.7.0" #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

マッピング | single-end | ゲノム | basic aligner(応用) | QuasR(Lerch_XXX)

QuasRパッケージを用いてsingle-end RNA-seqデータのリファレンスゲノム配列へのマッピングを行うやり方を示します。 basic alignerの一つであるBowtie (Langmead et al., Genome Biol., 2009)を実装した Rbowtieパッケージを内部的に使っています。

Bowtie自体は、複数個所にマップされるリードの取り扱い(uniquely mapped reads or multi-mapped reads)を"-m"オプションで指定したり、 許容するミスマッチ数を指定する"-v"などの様々なオプションを利用可能ですが、「基礎」のところではやり方を示しませんでした。 ここでは、マッピングのオプションをいくつか変更して挙動を確認したり、複数のRNA-seqファイルを一度にマッピングするやり方を示します。

尚、出力ファイルは、"*.bam", "*_QC.pdf", "*.bed"の3つです。それ以外のファイルは基本無視で大丈夫です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1.サンプルデータ18,19のRNA-seqデータ(sample_RNAseq1.fa)のref_genome.faへのマッピングの場合(mapping_single_genome1.txt):

オプションを"-m 1 --best --strata -v 0"とした例です。

sample_RNAseq1.faでマップされないのは計3リードです。 2リード("chr3_11_45"と"chr3_15_49")はchr5にもマップされるので、"-m 1"オプションで落とされます。 1リード("chr5_1_35")は該当箇所と完全一致ではない(4番目の塩基にミスマッチをいれている)ので落とされます。

in_f1 <- "mapping_single_genome1.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 0"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

2.サンプルデータ18,19のRNA-seqデータ(sample_RNAseq1.fa)のref_genome.faへのマッピングの場合(mapping_single_genome1.txt):

オプションを"-m 1 --best --strata -v 1"とした例です。

sample_RNAseq1.faでマップされないのは計2リードです。 chr5にもマップされる2リード("chr3_11_45"と"chr3_15_49")が"-m 1"オプションで落とされます。

in_f1 <- "mapping_single_genome1.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 1"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

3.サンプルデータ18,19のRNA-seqデータ(sample_RNAseq1.fa)のref_genome.faへのマッピングの場合(mapping_single_genome1.txt):

オプションを"-m 1 -v 1"とした例です。

sample_RNAseq1.faでマップされないのは計3リードです。 2リード("chr3_11_45"と"chr3_15_49")はchr5にもマップされるので、"-m 1"オプションで落とされます。 1リード("chr3_3_37")は該当箇所と完全一致ですが、chr5_3_37とは1塩基ミスマッチでマップ可能です。 "--best --strata"は最小のミスマッチ数でヒットした結果のみ出力するオプションなので、これをつけておかないと"chr3_3_37"は2か所にマップされるリードということで"-m 1"オプションで落とされる、という例です。

in_f1 <- "mapping_single_genome1.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 -v 1"           #マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

4.サンプルデータ18-20の複数のRNA-seqデータ(sample_RNAseq1.fasample_RNAseq2.fa)をref_genome.faにマッピングする場合(mapping_single_genome4.txt):

複数のRNA-seqデータファイルを一度にマッピングするときに用意するファイルの記述例です。 下の行にどんどんマップしたいファイルを追加していくだけです。 リード長が異なっていても大丈夫なようです。

sample_RNAseq1.faでマップされないのは計2リードです。 chr5にもマップされる2リード("chr3_11_45"と"chr3_15_49")が"-m 1"オプションで落とされます。 sample_RNAseq2.faでマップされないのは、2-4番目のジャンクションリードです。

in_f1 <- "mapping_single_genome4.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 1"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

マッピング | single-end | ゲノム | splice-aware aligner | QuasR(Lerch_XXX)

QuasRパッケージを用いてsingle-end RNA-seqデータのリファレンスゲノム配列へのマッピングを行うやり方を示します。 splice-aware alignerの一つであるSpliceMap (Au et al., Nucleic Acids Res., 2010)を実装した Rbowtieパッケージを内部的に使っています。

(QuasRパッケージ中の)SpliceMap利用時は、リード長が50bp以上あることが条件のようです。 したがって、35bpのsample_RNAseq1.faを入力ファイルに含めるとエラーが出ます。

尚、出力ファイルは、"*.bam", "*_QC.pdf", "*.bed"の3つです。それ以外のファイルは基本無視で大丈夫です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1.サンプルデータ18と20のRNA-seqデータ(sample_RNAseq2.fa)をref_genome.faにマッピングする場合(mapping_single_genome5.txt):

デフォルトのオプションで実行する例です。

リード長が50bp以上ありますが、なぜか「failed while generating 25mers」という類のエラーが出ます。

in_f1 <- "mapping_single_genome5.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2,            #マッピングを行うqAlign関数を実行した結果をoutに格納
              splicedAlignment=T)      #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

2.サンプルデータ18と20のRNA-seqデータ(sample_RNAseq2.fa)をref_genome.faにマッピングする場合(mapping_single_genome5.txt):

オプションを"-max_intron 200 -min_intron 5 -max_multi_hit 5 -selectSingleHit TRUE -seed_mismatch 1 -read_mismatch 2 -try_hard yes"とした例です。

リード長が50bp以上ありますが、なぜか「failed while generating 25mers」という類のエラーが出ます。

in_f1 <- "mapping_single_genome5.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-max_intron 200 -min_intron 5 -max_multi_hit 5 -selectSingleHit TRUE -seed_mismatch 1 -read_mismatch 2 -try_hard yes"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2,            #マッピングを行うqAlign関数を実行した結果をoutに格納
              alignmentParameter=param_mapping,#マッピングを行うqAlign関数を実行した結果をoutに格納
              splicedAlignment=T)      #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

3.QuasRパッケージ中のサンプルRNA-seqデータ(rna_1_1.fq)の最初の5リードからなるファイル(sample_RNAseq3.fa)をref_genome.faにマッピングする場合(mapping_single_genome6.txt):

オプションを"-max_intron 200 -min_intron 5 -max_multi_hit 5 -selectSingleHit TRUE -seed_mismatch 1 -read_mismatch 2 -try_hard yes"とした例です。

リード長が50bp以上ありますが、なぜか「failed while generating 25mers」という類のエラーが出ます。

in_f1 <- "mapping_single_genome6.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-max_intron 200 -min_intron 5 -max_multi_hit 5 -selectSingleHit TRUE -seed_mismatch 1 -read_mismatch 2 -try_hard yes"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2,            #マッピングを行うqAlign関数を実行した結果をoutに格納
              alignmentParameter=param_mapping,#マッピングを行うqAlign関数を実行した結果をoutに格納
              splicedAlignment=T)      #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

4.QuasRパッケージ中のサンプルRNA-seqデータ(rna_1_1.fq)の最初の5リードからなるファイル(sample_RNAseq3.fa)をref_genome.faにマッピングする場合(mapping_single_genome6.txt):

デフォルトのオプションで実行する例です。 実際に用いられたオプションが"-max_intron 400000 -min_intron 20000 -max_multi_hit 10 -selectSingleHit TRUE -seed_mismatch 1 -read_mismatch 2 -try_hard yes"となっているのがわかります。

エラーが出なくなりますが当然?!マップされません。

in_f1 <- "mapping_single_genome6.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2,            #マッピングを行うqAlign関数を実行した結果をoutに格納
              splicedAlignment=T)      #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

5.QuasRパッケージ中のサンプルRNA-seqデータ(rna_1_1.fq)の最初の5リードからなるファイル(sample_RNAseq3.fa)をref_genome.faにマッピングする場合(mapping_single_genome6.txt):

オプションを"-max_intron 400000 -min_intron 20000 -max_multi_hit 10 -selectSingleHit TRUE -seed_mismatch 1 -read_mismatch 2 -try_hard yes"とした例です。

4.と同じ結果(エラーは出ないがマップされない)になります。

in_f1 <- "mapping_single_genome6.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-max_intron 400000 -min_intron 20000 -max_multi_hit 10 -selectSingleHit TRUE -seed_mismatch 1 -read_mismatch 2 -try_hard yes"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2,            #マッピングを行うqAlign関数を実行した結果をoutに格納
              alignmentParameter=param_mapping,#マッピングを行うqAlign関数を実行した結果をoutに格納
              splicedAlignment=T)      #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

マップ後 | について

(ゲノムやトランスクリプトーム配列へのマッピング時には問題にならないと思いますが、おそらく)RNA-seqのアセンブルを行う場合には、sequencing errorの除去以外にも「アダプター配列」や「low-complexity reads (低複雑性のリード;繰り返し配列)」や「PCR duplicates(ロングインサートライブラリによくあるらしい...)」の除去を行うのが普通なようです。(私がTrinityでアセンブルを行う場合にはそんなことやったこともないのですが、やったら大分違うのでしょうか。。。)ここではこれらのerror除去を行うプログラムを列挙しておきます:

入力ファイルがリファレンス配列へのマップ後のファイル(SAM/BAM, BED, GFF形式など)(Rパッケージ):

入力ファイルがリファレンス配列へのマップ後のファイル(SAM/BAM, BED, GFF形式など)(R以外):

(おそらく)454 platform用:

その他:

マップ後 | 出力ファイル形式について

様々ないろいろな出力ファイル形式があることがわかります。

注目すべきは、Sequence Alignment/Map (SAM) formatです。この形式は国際共同研究の1000人のゲノムを解析するという1000 Genomes Projectで採用された(開発された)フォーマットで、("@"から始まる)header sectionと(そうでない)alignment sectionから構成されています。このヒトの目で解読可能な形式がSAMフォーマットで、このバイナリ版がBinary Alignment/Map (BAM)フォーマットというものです。今後SAM/BAM formatという記述をよく見かけるようになることでしょう。

代表的な出力ファイル形式:

マップ後 | 出力ファイルの読み込み | BAM形式

GenomicRangesパッケージを用いてBAM形式ファイルを読み込むやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. sample_RNAseq1.bamの場合:

in_f <- "sample_RNAseq1.bam"           #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(GenomicRanges)                 #パッケージの読み込み

#入力ファイルの読み込み
hoge <- readGAlignments(in_f)          #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
hoge                                   #確認してるだけです
	

マップ後 | 出力ファイルの読み込み | Bowtie形式

Bowtie形式出力ファイルを読み込むやり方を、yeastRNASeqパッケージ中にある(このパッケージがインストールされていることが前提です)wt_1_f.bowtie.gzファイルを例として解説します。yeastRNASeqというパッケージがインストールされていれば、(例えば私のWindows 7, 64bitマシン環境だと)「コンピュータ - OS(C:) - Program Files - R - R-3.0.1 - library - yeastRNASeq - reads」から目的のファイルにたどり着きます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ディレクトリの変更をちゃんとやった場合:

in_f <- "wt_1_f.bowtie.gz"             #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
aligned <- readAligned(in_f, type="Bowtie")#in_fで指定したファイルの読み込み
aligned                                #確認してるだけです
	

2. yeastRNASeqパッケージ中のreadsフォルダ中に目的のファイルがあることが既知の場合:

in_f <- "wt_1_f.bowtie.gz"             #入力ファイル名を指定してin_fに格納
param1 <- "yeastRNASeq"                #パッケージ名を指定
param2 <- "reads"                      #フォルダ名を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
path <- file.path(system.file(package=param1, param2))#ファイルパスの指定
aligned <- readAligned(path, in_f, type="Bowtie")#in_fで指定したファイルの読み込み
aligned                                #確認してるだけです
	

マップ後 | 出力ファイルの読み込み | SOAP形式

basic alignerの一つであるSOAP (Li et al., Bioinformatics., 2009)を実行して得られた、885 readsからなるoutput.soapファイルの読み込みから、「8番染色体上の+鎖のみにマップされたもののみ」など、いくつか例示します。

SOAP以外のフォーマットも「マッピング | 出力ファイルの読み込み |」を参考にして、必要な情報さえ読み込んでおけば、それ以降は同じです。SOAP形式ファイルの場合、param1に相当するのは入力ファイルの8列目の記述に、そしてparam2に相当するのは7列目の記述に相当します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 「8番染色体上の+鎖のみにマップされたリードのみFASTAファイルで保存」の場合1:

in_f <- "output.soap"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "chr08"                      #染色体の条件を指定
param2 <- "+"                          #strandの条件を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
aligned <- readAligned(in_f, type="SOAP")#in_fで指定したファイルの読み込み
aligned                                #確認してるだけです

#本番(フィルタリング)
aligned <- aligned[aligned@chromosome == param1]#param1で指定した染色体の情報のみ抽出して、alignedに格納
aligned                                #確認してるだけです
aligned <- aligned[aligned@strand == "+"]#param2で指定したstrandのもののみ抽出して、alignedに格納
aligned                                #確認してるだけです

#後処理(FASTA形式に変換)
fasta <- sread(aligned)                #alignedで得られたオブジェクトから塩基配列情報をDNAStringSetオブジェクトとして得たい場合
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. 「8番染色体上の+鎖のみにマップされたリードのみFASTAファイルで保存」の場合2:

in_f <- "output.soap"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "chr08"                      #染色体の条件を指定
param2 <- "+"                          #strandの条件を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
aligned <- readAligned(in_f, type="SOAP")#in_fで指定したファイルの読み込み
aligned                                #確認してるだけです

#本番(フィルタリング)
hoge <- compose(chromosomeFilter(param1), strandFilter(param2))#param1 and param2で指定したフィルタリング条件をまとめてhogeに格納
aligned <- aligned[hoge(aligned)]      #フィルタリングを実行して、その結果をalignedに格納

#後処理(FASTA形式に変換)
fasta <- sread(aligned)                #alignedで得られたオブジェクトから塩基配列情報をDNAStringSetオブジェクトとして得たい場合
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. 「strandは気にせずに10番染色体上にマップされたリードのみFASTAファイルで保存」の場合:

in_f <- "output.soap"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "chr10"                      #染色体の条件を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
aligned <- readAligned(in_f, type="SOAP")#in_fで指定したファイルの読み込み
aligned                                #確認してるだけです

#本番(フィルタリング)
hoge <- compose(chromosomeFilter(param1))#param1で指定したフィルタリング条件をまとめてhogeに格納
aligned <- aligned[hoge(aligned)]      #フィルタリングを実行して、その結果をalignedに格納

#後処理(FASTA形式に変換)
fasta <- sread(aligned)                #alignedで得られたオブジェクトから塩基配列情報をDNAStringSetオブジェクトとして得たい場合
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. 染色体ごとにマップされたリード数情報を取得したい場合:

in_f <- "output.soap"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
aligned <- readAligned(in_f, type="SOAP")#in_fで指定したファイルの読み込み
aligned                                #確認してるだけです

#本番
out <- as.data.frame(table(aligned@chromosome))#頻度情報をカウントした結果をoutに格納
colnames(out) <- c("chromosome", "frequency")#列名を付与
head(out)                              #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

5. 染色体およびstrandごとにマップされたリード数情報を取得したい場合:

in_f <- "output.soap"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
aligned <- readAligned(in_f, type="SOAP")#in_fで指定したファイルの読み込み

#本番
hoge <- paste(aligned@chromosome, aligned@strand, sep="___")#染色体名とstrand情報を(区切り文字を"___"として)一時的に連結させた結果をhogeに格納
out <- as.data.frame(table(hoge))      #頻度情報をカウントした結果をoutに格納
colnames(out) <- c("chromosome___strand", "frequency")#列名を付与
head(out)                              #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

マップ後 | 出力ファイルの読み込み | htSeqTools (Planet_2012)

比較解析などの場合に「複数のサンプル間のクラスタリングをまず行う」ことをトランスクリプトーム解析の基本手順として行ったほうがよい、ということを私の講義でも述べていますが、このパッケージでも1) サンプル間の類似度をMDSプロットで表現する機能があるようですね。

また、2) PCR biasに起因する一部のリードが大量にシークエンスされてしまったようなものも、BIC (Bayesian Information Criterion)を用いたリピート数のモデル化ややFDR (False Discovery Rate)の閾値を設けて取り除くようなこともできるようです。

ChIP-seq (or MeDIP, DNase-seq)などの場合には、controlに対してimmuno-precipitation (IP)サンプルにおける特定の領域中のリード数(coverage)が増大します。このcoverageの標準偏差(standard deviation; SD)はリード数nのルートに比例するらしいです。なのでもしIPサンプルのSDn (=SD/sqrt(n))がcontrolサンプルのSDnと同程度であればIPがうまくいっていないことを意味します。このパッケージでは、この3) enrichment efficiencyの評価もできるようです。

その他には、ゲノムにマップされた領域のスクリーニングや、領域ごとにマップされたリード数をカウントしたり、複数サンプル間でのリード数の比較をlikelihod ratioやpermutationカイ二乗検定で行ってくれるようです。

ちなみに、入力ファイルの形式はBAM形式ファイル(Rsamtools or ShortReadパッケージで読み込み可能)かBED, GFF, WIG形式ファイル(rtracklayerパッケージで読み込み可能)で、マップ後のファイルということになります。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

in_f <- ""                             #読み込みたいファイル名を指定してin_fに格納

#必要なパッケージをロード
library(htSeqTools)                    #パッケージの読み込み
	

マップ後 | カウント情報取得 | について

BAM形式などのマッピング結果ファイルからカウントデータを取得するためのパッケージや関数もいくつかあります。 htSeqToolsのislandCounts関数、 Rsubread(Windows版はなし)のfeatureCounts関数、 GenomicRangesのsummarizeOverlaps関数などです。 QuasRは、内部的にGenomicRangesのsummarizeOverlaps関数を利用しています。

マップ後 | カウント情報取得 | ゲノム | アノテーション有 | QuasR(Lerch_XXX)

QuasRパッケージを用いたsingle-end RNA-seqデータのリファレンスゲノム配列へのBowtieによるマッピングから、 カウントデータ取得までの一連の流れを示します。アノテーション情報は、GenomicFeaturesパッケージ中の 関数を利用してTranscriptDbオブジェクト形式にしたものを利用しています。 マッピングのやり方やオプションの詳細については マッピング | single-end | ゲノム | basic aligner(応用) | QuasR(Lerch_XXX)などを参考にしてください。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1.サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の BSgenomeパッケージで利用可能なBSgenome.Hsapiens.UCSC.hg19 へのマッピング結果の場合:

mapping_single_genome3.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(SRR037439.fastq)、 そして2行目の2列目に「任意のサンプル名」(例:human_brain)を記載したタブ区切りテキストファイルを用意した上で(オプションを"-m 1 --best --strata -v 2"として)行っています。

hg19にマップした結果なので、TranscriptDbオブジェクト取得時のゲノム情報もそれを基本として、 UCSC Genes ("knownGene")を指定しているので、Entrez Gene IDに対するカウントデータ取得になっています。

in_f1 <- "mapping_single_genome3.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param1 <- "hg19"                       #TranscriptDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "knownGene"                  #TranscriptDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param3 <- "gene"                       #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#前処理(マッピング)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#前処理(TranscriptDbオブジェクト作成)
txdb <- makeTranscriptDbFromUCSC(genome=param1, tablename=param2)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param3)#カウントデータ行列を取得してcountに格納
dim(count)                             #行数と列数を表示
head(count)                            #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(count), count)   #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2.サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の BSgenomeパッケージで利用可能なBSgenome.Hsapiens.UCSC.hg19 へのマッピング結果の場合:

mapping_single_genome3.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(SRR037439.fastq)、 そして2行目の2列目に「任意のサンプル名」(例:human_brain)を記載したタブ区切りテキストファイルを用意した上で(オプションを"-m 1 --best --strata -v 2"として)行っています。

hg19にマップした結果なので、TranscriptDbオブジェクト取得時のゲノム情報もそれを基本として、 RefSeq Genes ("refGene")を指定しているのでRefSeq Gene IDに対するカウントデータ取得になっていますはずですが、そうはなっていません。

この理由は(バグか開発者のポリシーかは不明ですが)おそらくRefSeqが転写物単位のIDなためゲノムマッピング結果の取り扱いとは相性が悪いためでしょう。 ちなみに長さ情報は変わっているので、なんらかの形でRefSeqの情報が反映されているのでしょう。

in_f1 <- "mapping_single_genome3.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param1 <- "hg19"                       #TranscriptDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "refGene"                    #TranscriptDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param3 <- "gene"                       #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#前処理(マッピング)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#前処理(TranscriptDbオブジェクト作成)
txdb <- makeTranscriptDbFromUCSC(genome=param1, tablename=param2)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param3)#カウントデータ行列を取得してcountに格納
dim(count)                             #行数と列数を表示
head(count)                            #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(count), count)   #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3.サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の BSgenomeパッケージで利用可能なBSgenome.Hsapiens.UCSC.hg19へのマッピング結果の場合:

mapping_single_genome3.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(SRR037439.fastq)、 そして2行目の2列目に「任意のサンプル名」(例:human_brain)を記載したタブ区切りテキストファイルを用意した上で(オプションを"-m 1 --best --strata -v 2"として)行っています。

hg19にマップした結果なので、TranscriptDbオブジェクト取得時のゲノム情報もそれを基本として Ensembl Genes ("ensGene")を指定しているので、Ensembl Gene IDに対するカウントデータ取得になっています。

in_f1 <- "mapping_single_genome3.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param1 <- "hg19"                       #TranscriptDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #TranscriptDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param3 <- "gene"                       #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#前処理(マッピング)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#前処理(TranscriptDbオブジェクト作成)
txdb <- makeTranscriptDbFromUCSC(genome=param1, tablename=param2)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param3)#カウントデータ行列を取得してcountに格納
dim(count)                             #行数と列数を表示
head(count)                            #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(count), count)   #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4.サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の BSgenomeパッケージで利用可能なBSgenome.Hsapiens.UCSC.hg19へのマッピング結果の場合:

mapping_single_genome3.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(SRR037439.fastq)、 そして2行目の2列目に「任意のサンプル名」(例:human_brain)を記載したタブ区切りテキストファイルを用意した上で(オプションを"-m 1 --best --strata -v 2"として)行っています。

hg19にマップした結果なので、TranscriptDbオブジェクト取得時のゲノム情報もそれを基本として Ensembl Genes ("ensGene")を指定しているので、Ensembl Gene IDに対するカウントデータ取得になっています。

基本は3と同じですが、一般的なカウントデータ行列の形式(2列目以降がカウント情報)にし、配列長情報と別々のファイルにして保存するやり方です。

in_f1 <- "mapping_single_genome3.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f1 <- "hoge4_count.txt"            #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge4_genelength.txt"       #出力ファイル名を指定してout_f2に格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param1 <- "hg19"                       #TranscriptDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #TranscriptDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param3 <- "gene"                       #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#前処理(マッピング)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#前処理(TranscriptDbオブジェクト作成)
txdb <- makeTranscriptDbFromUCSC(genome=param1, tablename=param2)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param3)#カウントデータ行列を取得してcountに格納
dim(count)                             #行数と列数を表示
head(count)                            #確認してるだけです

#ファイルに保存(カウント情報)
data <- count[,-1]                     #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(遺伝子配列長情報)
genelength <- count[,1]                #遺伝子配列長情報をgenelengthに格納
tmp <- cbind(names(genelength), genelength)#保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5.サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の BSgenomeパッケージで利用可能なBSgenome.Hsapiens.UCSC.hg19へのマッピング結果の場合:

mapping_single_genome3.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(SRR037439.fastq)、 そして2行目の2列目に「任意のサンプル名」(例:human_brain)を記載したタブ区切りテキストファイルを用意した上で(オプションを"-m 1 --best --strata -v 2"として)行っています。

3.と違って、TranscriptDbオブジェクト取得時に、Ensemblにアクセスしてhsapiens_gene_ensembl をデータベース名として指定しています。

ちなみにこれは、txdbオブジェクトの作成まではうまくいきますが、最後のqCount関数の実行のところでエラーが出ます。 理由は、Ensemblで提供されている染色体名seqnames(transcripts(txdb))の中にBSgenome.Hsapiens.UCSC.hg19で提供されている染色体名以外の名前のものが含まれているためです。 データ提供元が異なるとうまくいかない例です。

in_f1 <- "mapping_single_genome3.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param2 <- "hsapiens_gene_ensembl"      #データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param3 <- "gene"                       #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#前処理(マッピング)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#前処理(TranscriptDbオブジェクト作成)
txdb <- makeTranscriptDbFromBiomart(dataset=param2)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb                                   #確認してるだけです

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param3)#カウントデータ行列を取得してcountに格納
dim(count)                             #行数と列数を表示
head(count)                            #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(count), count)   #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

マップ後 | カウント情報取得 | ゲノム | アノテーション無 | QuasR(Lerch_XXX)

QuasRパッケージを用いたsingle-end RNA-seqデータのリファレンスゲノム配列へのBowtieによるマッピングから、 カウントデータ取得までの一連の流れを示します。アノテーション情報がない場合を想定しているので、GenomicRanges パッケージを利用して、マップされたリードの和集合領域(union range)を得たのち、領域ごとにマップされたリード数をカウントしています。

RNA-seqデータのほうのリード数は少ないですが、リファレンス配列の前処理でかなり時間がかかるようです(2時間とか...)。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1.サンプルデータ18-20の複数のRNA-seqデータ(sample_RNAseq1.fa)をref_genome.faにマッピングする場合(mapping_single_genome1.txt):

複数サンプルのマッピング結果をまとめて和集合領域を定め、カウント情報を得るやり方です。サンプル間比較の際に便利。

in_f1 <- "mapping_single_genome1.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 0"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#前処理(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(マップされたリードの和集合領域同定)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
tmpsname <- out@alignments[,2]         #サンプル名(in_f1の2列目に相当)をtmpsnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  if(i == 1){
    k <- readGAlignments(tmpfname[i])  #BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  } else{
    k <- c(k, readGAlignments(tmpfname[i]))#BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  }
}
m <- reduce(granges(k))                #GRangesオブジェクトへの変換および和集合領域情報を得た結果のGRangesオブジェクトをmに格納

#本番(カウント情報取得)
tmp <- as.data.frame(m)                #出力ファイルのカウントデータ以外の情報をtmpに格納
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  tmpcount <- summarizeOverlaps(m, tmpfname[i])#GRangesオブジェクトmに対するBAMファイルのマップ結果のカウント情報取得結果をtmpcountに格納
  count <- assays(tmpcount)$counts     #SummarizedExperimentクラスオブジェクトのtmpcountからカウントデータ行列部分を抽出した結果をcountに格納
  colnames(count) <- tmpsname[i]       #行列countの列名を変更
  tmp <- cbind(tmp, count)             #保存したい情報を連結してtmpに格納(和集合領域とカウント)
}

#ファイルに保存
out_f <- sub(".bam", "_range.txt", tmpfname[i])#変更したファイル名を作成した結果をout_fに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

2.サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の BSgenomeパッケージで利用可能なBSgenome.Hsapiens.UCSC.hg19 へのマッピング結果の場合:

mapping_single_genome3.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(SRR037439.fastq)、 そして2行目の2列目に「任意のサンプル名」(例:human_brain)を記載したタブ区切りテキストファイルを用意した上で(オプションを"-m 1 --best --strata -v 2"として)行っています。

in_f1 <- "mapping_single_genome3.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#前処理(マッピング)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(マップされたリードの和集合領域およびその領域に対するカウント情報取得)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
tmpsname <- out@alignments[,2]         #サンプル名(in_f1の2列目に相当)をtmpsnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  k <- readGAlignments(tmpfname[i])    #BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  m <- reduce(granges(k))              #GRangesオブジェクトへの変換および和集合領域情報を得た結果のGRangesオブジェクトをmに格納
  tmpcount <- summarizeOverlaps(m, tmpfname[i])#GRangesオブジェクトmに対するBAMファイルのマップ結果のカウント情報取得結果をtmpcountに格納
  count <- assays(tmpcount)$counts     #SummarizedExperimentクラスオブジェクトのtmpcountからカウントデータ行列部分を抽出した結果をcountに格納
  colnames(count) <- tmpsname[i]       #行列countの列名を変更
  tmp <- cbind(as.data.frame(m), count)#和集合領域情報とカウント情報を結合した結果をtmpに格納
  out_f <- sub(".bam", "_range.txt", tmpfname[i])#変更したファイル名を作成した結果をout_fに格納
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
}
	

3.サンプルデータ18-20の複数のRNA-seqデータ(sample_RNAseq1.fasample_RNAseq2.fa)をref_genome.faにマッピングする場合(mapping_single_genome4.txt):

複数のRNA-seqデータファイルごとに和集合領域を定めてカウント情報を得るやり方です。"*_range.txt"という2つの出力ファイルが生成されます。

in_f1 <- "mapping_single_genome4.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 1"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#前処理(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(マップされたリードの和集合領域およびその領域に対するカウント情報取得)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
tmpsname <- out@alignments[,2]         #サンプル名(in_f1の2列目に相当)をtmpsnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  k <- readGAlignments(tmpfname[i])    #BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  m <- reduce(granges(k))              #GRangesオブジェクトへの変換および和集合領域情報を得た結果のGRangesオブジェクトをmに格納
  tmpcount <- summarizeOverlaps(m, tmpfname[i])#GRangesオブジェクトmに対するBAMファイルのマップ結果のカウント情報取得結果をtmpcountに格納
  count <- assays(tmpcount)$counts     #SummarizedExperimentクラスオブジェクトのtmpcountからカウントデータ行列部分を抽出した結果をcountに格納
  colnames(count) <- tmpsname[i]       #行列countの列名を変更
  tmp <- cbind(as.data.frame(m), count)#和集合領域情報とカウント情報を結合した結果をtmpに格納
  out_f <- sub(".bam", "_range.txt", tmpfname[i])#変更したファイル名を作成した結果をout_fに格納
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
}
	

4.サンプルデータ18-20の複数のRNA-seqデータ(sample_RNAseq1.fasample_RNAseq2.fa)をref_genome.faにマッピングする場合(mapping_single_genome4.txt):

全部のマッピング結果をまとめて和集合領域を定め、カウント情報を得るやり方です。サンプル間比較の際に便利。

in_f1 <- "mapping_single_genome4.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_mapping <- "-m 1 --best --strata -v 1"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#前処理(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(マップされたリードの和集合領域同定)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
tmpsname <- out@alignments[,2]         #サンプル名(in_f1の2列目に相当)をtmpsnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  if(i == 1){
    k <- readGAlignments(tmpfname[i])  #BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  } else{
    k <- c(k, readGAlignments(tmpfname[i]))#BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  }
}
m <- reduce(granges(k))                #GRangesオブジェクトへの変換および和集合領域情報を得た結果のGRangesオブジェクトをmに格納

#本番(カウント情報取得)
tmp <- as.data.frame(m)                #出力ファイルのカウントデータ以外の情報をtmpに格納
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  tmpcount <- summarizeOverlaps(m, tmpfname[i])#GRangesオブジェクトmに対するBAMファイルのマップ結果のカウント情報取得結果をtmpcountに格納
  count <- assays(tmpcount)$counts     #SummarizedExperimentクラスオブジェクトのtmpcountからカウントデータ行列部分を抽出した結果をcountに格納
  colnames(count) <- tmpsname[i]       #行列countの列名を変更
  tmp <- cbind(tmp, count)             #和集合領域情報とカウント情報を結合した結果をtmpに格納
}

#ファイルに保存
out_f <- sub(".bam", "_range.txt", tmpfname[i])#変更したファイル名を作成した結果をout_fに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

5.サンプルデータ18-20の複数のRNA-seqデータ(sample_RNAseq1.fasample_RNAseq2.fa)をref_genome.faにマッピングする場合(mapping_single_genome4.txt):

全部のマッピング結果をまとめて和集合領域を定め、カウント情報を得るやり方です。一般的なカウントデータ行列の形式(2列目以降がカウント情報)にし、配列長情報と別々のファイルにして保存するやり方です。

in_f1 <- "mapping_single_genome4.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f1 <- "hoge4_count.txt"            #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge4_genelength.txt"       #出力ファイル名を指定してout_f2に格納
param_mapping <- "-m 1 --best --strata -v 1"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み

#前処理(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(マップされたリードの和集合領域同定)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
tmpsname <- out@alignments[,2]         #サンプル名(in_f1の2列目に相当)をtmpsnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  if(i == 1){
    k <- readGAlignments(tmpfname[i])  #BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  } else{
    k <- c(k, readGAlignments(tmpfname[i]))#BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  }
}
m <- reduce(granges(k))                #GRangesオブジェクトへの変換および和集合領域情報を得た結果のGRangesオブジェクトをmに格納

#本番(カウント情報取得)
h <- as.data.frame(m)                  #出力ファイルのカウントデータ以外の情報をhに格納(この情報を結合して行名を作成している)
tmp <- paste(h[,1],h[,2],h[,3],h[,4],h[,5], sep="_")#出力ファイルの行名部分を作成
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  tmpcount <- summarizeOverlaps(m, tmpfname[i])#GRangesオブジェクトmに対するBAMファイルのマップ結果のカウント情報取得結果をtmpcountに格納
  count <- assays(tmpcount)$counts     #SummarizedExperimentクラスオブジェクトのtmpcountからカウントデータ行列部分を抽出した結果をcountに格納
  colnames(count) <- tmpsname[i]       #行列countの列名を変更
  tmp <- cbind(tmp, count)             #列名とカウント情報を結合した結果をtmpに格納
}

#ファイルに保存(カウント情報および配列長情報)
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
tmp <- paste(h[,1],h[,2],h[,3],h[,4],h[,5], sep="_")#出力ファイルの行名部分を作成
tmp <- cbind(tmp, h$width)             #和集合領域情報とカウント情報を結合した結果をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

マップ後 | カウント情報取得 | トランスクリプトーム | BED形式ファイルから

BED形式のマップ後のファイルと(マップされる側の)リファレンス配列ファイルを読み込んでリファレンス配列の並びで配列長とカウント情報を取得するやり方を示します。 出力ファイルの並びは「リファレンス配列のdescription行」「配列長」「カウント情報」です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. マップされる側の配列(hoge4.fa)中のIDの並びでBED形式ファイル(sample_1.bed)中の出現回数をカウントする場合:

in_f1 <- "sample_1.bed"                #入力ファイル名を指定してin_f1に格納(BED形式ファイル)
in_f2 <- "hoge4.fa"                    #入力ファイル名を指定してin_f2に格納(リファレンス配列ファイル)
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, sep="\t")    #in_f1で指定したファイルの読み込み
fasta <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです
head(data)                             #確認してるだけです

#本番
hoge <- table(data[,1])                #出現頻度をカウントした結果をhogeに格納
head(hoge)                             #確認してるだけです
out <- rep(0, length(fasta))           #最終的に欲しいカウント情報の初期値を0にしておく
names(out) <- names(fasta)             #names(fasta)をnames(out)に格納
out[names(hoge)] <- hoge               #生リードカウントを代入
head(out)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(names(out), width(fasta), out)#「ID, 配列長, カウント情報」の並びにしたものをtmpに格納
colnames(tmp) <- c("ID", "Length", "Count")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

2. マップされる側の配列(hoge4.fa)中のIDをソートした並びでBED形式ファイル(sample_1.bed)中の出現回数をカウントする場合:

in_f1 <- "sample_1.bed"                #入力ファイル名を指定してin_f1に格納(BED形式ファイル)
in_f2 <- "hoge4.fa"                    #入力ファイル名を指定してin_f2に格納(リファレンス配列ファイル)
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, sep="\t")    #in_f1で指定したファイルの読み込み
fasta <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです
head(data)                             #確認してるだけです

#本番
hoge <- table(data[,1])                #出現頻度をカウントした結果をhogeに格納
head(hoge)                             #確認してるだけです
out <- rep(0, length(fasta))           #最終的に欲しいカウント情報の初期値を0にしておく
names(out) <- sort(names(fasta))       #アルファベット順にソートしたnames(fasta)をnames(out)に格納
out[names(hoge)] <- hoge               #生リードカウントを代入
head(out)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(names(out), width(fasta[names(out)]), out)#「ID, 配列長, カウント情報」の並びにしたものをtmpに格納
colnames(tmp) <- c("ID", "Length", "Count")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

3. マップされる側の配列(h_rna.fasta)中のIDの並びでBED形式ファイル(SRR002324_t.bed)中の出現回数をカウントする場合:

in_f1 <- "SRR002324_t.bed"             #入力ファイル名を指定してin_f1に格納(BED形式ファイル)
in_f2 <- "h_rna.fasta"                 #入力ファイル名を指定してin_f2に格納(リファレンス配列ファイル)
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, sep="\t")    #in_f1で指定したファイルの読み込み
fasta <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです
head(data)                             #確認してるだけです

#本番
hoge <- table(data[,1])                #出現頻度をカウントした結果をhogeに格納
head(hoge)                             #確認してるだけです
out <- rep(0, length(fasta))           #最終的に欲しいカウント情報の初期値を0にしておく
names(out) <- names(fasta)             #names(fasta)をnames(out)に格納
out[names(hoge)] <- hoge               #生リードカウントを代入
head(out)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(names(out), width(fasta), out)#「ID, 配列長, カウント情報」の並びにしたものをtmpに格納
colnames(tmp) <- c("ID", "Length", "Count")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

4. マップされる側の配列(h_rna.fasta)中のIDをソートした並びでBED形式ファイル(SRR002324_t.bed)中の出現回数をカウントする場合:

in_f1 <- "SRR002324_t.bed"             #入力ファイル名を指定してin_f1に格納(BED形式ファイル)
in_f2 <- "h_rna.fasta"                 #入力ファイル名を指定してin_f2に格納(リファレンス配列ファイル)
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, sep="\t")    #in_f1で指定したファイルの読み込み
fasta <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです
head(data)                             #確認してるだけです

#本番
hoge <- table(data[,1])                #出現頻度をカウントした結果をhogeに格納
head(hoge)                             #確認してるだけです
out <- rep(0, length(fasta))           #最終的に欲しいカウント情報の初期値を0にしておく
names(out) <- sort(names(fasta))       #アルファベット順にソートしたnames(fasta)をnames(out)に格納
out[names(hoge)] <- hoge               #生リードカウントを代入
head(out)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(names(out), width(fasta[names(out)]), out)#「ID, 配列長, カウント情報」の並びにしたものをtmpに格納
colnames(tmp) <- c("ID", "Length", "Count")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

マップ後 | 配列長とカウント数の関係

ここでは、から、Oshlack and Wakefield, Biology Direct, 2009で報告されているような「転写物の配列長由来の偏り(transcript length bias)」があるかどうかを調べます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 配列長とカウント情報を含むファイル(sample_length_count.txt)の場合:

マップ後 | カウント情報取得 | トランスクリプトーム | BED形式ファイルから」の出力ファイルです。

横軸:配列長、縦軸:カウント数のシンプルな散布図を作成したい場合です。

(ダイナミックレンジが広いので両軸ともにlog10にしています。したがって、ゼロカウントになるところはlogを計算できないのでプロットされませんよ、という警告が出ます)

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです

#本番(散布図)
plot(data, log="xy")                   #両対数プロット
#plot(Count ~ Length, data=data, log="xy")#表現方法が異なるだけ
#plot(Count ~ Length, data=log10(data), xlab="log10(Length)", ylab="log10(Count)")#表現方法が異なるだけ
	

2. 配列長とカウント情報を含むファイル(sample_length_count.txt)の場合:

マップ後 | カウント情報取得 | トランスクリプトーム | BED形式ファイルから」の出力ファイルです。

横軸:配列長、縦軸:カウント数のシンプルな散布図を作成したい場合です。線形回帰も行っています。

(ダイナミックレンジが広いので両軸ともにlog10にしています。したがって、ゼロカウントになるところはlogを計算できないのでプロットされませんよ、という警告が出ます)

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#本番(両対数プロット図)
plot(data, log="xy")                   #両対数プロット

#線形回帰(Linear Regression Model)
out <- lm(Count ~ Length, data=log10(data))#線形回帰を行っている
abline(out, col="red")                 #回帰直線を赤色で引いている
	

3. 配列長とカウント情報を含むファイル(sample_length_count.txt)の場合:

マップ後 | カウント情報取得 | トランスクリプトーム | BED形式ファイルから」の出力ファイルです。

横軸:配列長、縦軸:カウント数のシンプルな散布図を作成したい場合です。平滑化曲線を追加しています。

(ダイナミックレンジが広いので両軸ともにlog10にしています。したがって、ゼロカウントになるところはlogを計算できないのでプロットされませんよ、という警告が出ます)

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納
param <- 0.2                           #lowess曲線を描くときのwindow幅(0-1の範囲をとり、デフォルトは2/3)を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#本番(両対数プロット図)
plot(data, log="xy")                   #両対数プロット

#平滑化曲線
lines(lowess(data, f=param), col="red")#lowess曲線を赤色で引いている
	

4. 配列長とカウント情報を含むファイル(sample_length_count.txt)の場合:

マップ後 | カウント情報取得 | トランスクリプトーム | BED形式ファイルから」の出力ファイルです。

横軸:配列長、縦軸:カウント数のboxplot(箱ひげ図)を作成したい場合です。

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納
param <- 20                            #boxplotを描くときの水準数(配列長順でソートした結果の分割数に相当)を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#前処理(配列長の短い順にソート)
data <- data[order(data[,1]),]         #ソート
head(data)                             #確認してるだけです
tail(data)                             #確認してるだけです

#前処理(paramで指定した数にdataを分割するためのグループラベル情報作成)
f <- gl(param, floor(nrow(data)/param)+1, nrow(data))#nrow(data)で表される要素数からなるベクトルをparam個の水準数に分割した因子ベクトルfを作成
head(f)                                #確認してるだけです

#本番(boxplot)
plot(f, log10(data[,2]), xlab="Length", ylab="log10(Count)")#boxplot

#解説(配列長が短い上位5%について)
data_shortest <- data[f==1,]           #ラベルが1の要素のみ抽出(配列長が短い最初の5%に相当)
summary(data_shortest)                 #要約統計量を表示
summary(log10(data_shortest))          #要約統計量を表示

#解説(配列長が長い上位5%について)
data_longest <- data[f==param,]        #ラベルがparamの要素のみ抽出(配列長が短い最後の5%に相当;つまり配列長が長い上位5%)
summary(data_longest)                  #要約統計量を表示
summary(log10(data_longest))           #要約統計量を表示
	

5. 配列長とカウント情報を含むファイル(sample_length_count.txt)の場合:

マップ後 | カウント情報取得 | トランスクリプトーム | BED形式ファイルから」の出力ファイルです。

横軸:配列長、縦軸:カウント数のboxplot(箱ひげ図)をpng形式ファイルで保存したい場合です。

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param1 <- 20                           #boxplotを描くときの水準数(配列長順でソートした結果の分割数に相当)を指定
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納

#前処理(配列長の短い順にソート)
data <- data[order(data[,1]),]         #ソート

#前処理(param1で指定した数にdataを分割するためのグループラベル情報作成)
f <- gl(param1, floor(nrow(data)/param1)+1, nrow(data))#nrow(data)で表される要素数からなるベクトルをparam1個の水準数に分割した因子ベクトルfを作成

#本番(ファイルに保存)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(f, log10(data[,2]), xlab="Length", ylab="log10(Count)")#boxplot
dev.off()                              #おまじない
	

6. カウントデータファイル(srp017142_count_bowtie.txt)と長さ情報ファイル(srp017142_genelength.txt)が別々の場合:

パイプライン | ゲノム | 発現変動 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013)」の出力ファイルです。

カウントデータファイルは全部で6サンプル分のデータが含まれていますが、ここでは(Ensembl Gene ID列を除く)3列目の"Pro_rep3"のカウントデータと配列長との関係を調べています。

横軸:配列長、縦軸:カウント数のboxplot(箱ひげ図)をpng形式ファイルで保存したい場合です。

in_f1 <- "srp017142_count_bowtie.txt"  #入力ファイル名を指定してin_f1に格納(カウント情報ファイル)
in_f2 <- "srp017142_genelength.txt"    #入力ファイル名を指定してin_f2に格納(配列長情報ファイル)
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param1 <- 20                           #boxplotを描くときの水準数(配列長順でソートした結果の分割数に相当)を指定
param2 <- 3                            #配列長との関係を調べたいサンプルの列番号を指定
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
hoge <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
len <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#in_f2で指定したファイルの読み込み
hoge <- hoge[, param2]                 #指定した列のカウント情報を抽出
data <- cbind(len, hoge)               #配列長ベクトルとカウントベクトルを列方向で結合した結果をdataに格納

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納

#前処理(配列長の短い順にソート)
data <- data[order(data[,1]),]         #ソート

#前処理(param1で指定した数にdataを分割するためのグループラベル情報作成)
f <- gl(param1, floor(nrow(data)/param1)+1, nrow(data))#nrow(data)で表される要素数からなるベクトルをparam1個の水準数に分割した因子ベクトルfを作成

#本番(ファイルに保存)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(f, log10(data[,2]), xlab="Length", ylab="log10(Count)")#boxplot
dev.off()                              #おまじない
	

7. RPKM補正後のファイル(srp017142_RPKM_bowtie.txt)と長さ情報ファイル(srp017142_genelength.txt)が別々の場合:

パイプライン | ゲノム | 発現変動 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013)」の出力ファイルです。

RPKMデータファイルは全部で6サンプル分のデータが含まれていますが、ここでは(Ensembl Gene ID列を除く)3列目の"Pro_rep3"のカウントデータと配列長との関係を調べています。

横軸:配列長、縦軸:カウント数のboxplot(箱ひげ図)をpng形式ファイルで保存したい場合です。配列長補正によって、偏りが軽減されていることがわかります。

in_f1 <- "srp017142_RPKM_bowtie.txt"   #入力ファイル名を指定してin_f1に格納(カウント情報ファイル)
in_f2 <- "srp017142_genelength.txt"    #入力ファイル名を指定してin_f2に格納(配列長情報ファイル)
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param1 <- 20                           #boxplotを描くときの水準数(配列長順でソートした結果の分割数に相当)を指定
param2 <- 3                            #配列長との関係を調べたいサンプルの列番号を指定
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
hoge <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
len <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#in_f2で指定したファイルの読み込み
hoge <- hoge[, param2]                 #指定した列のカウント情報を抽出
data <- cbind(len, hoge)               #配列長ベクトルとカウントベクトルを列方向で結合した結果をdataに格納

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納

#前処理(配列長の短い順にソート)
data <- data[order(data[,1]),]         #ソート

#前処理(param1で指定した数にdataを分割するためのグループラベル情報作成)
f <- gl(param1, floor(nrow(data)/param1)+1, nrow(data))#nrow(data)で表される要素数からなるベクトルをparam1個の水準数に分割した因子ベクトルfを作成

#本番(ファイルに保存)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(f, log10(data[,2]), xlab="Length", ylab="log10(Count)")#boxplot
dev.off()                              #おまじない
	

正規化 | について

まだ未完成です。。。

サンプル内正規化周辺:

一つ上の項目(前処理 | 発現レベルの定量化について)は主にリファレンス配列(ゲノムやトランスクリプトーム)に対してRNA-seqによって得られたリードをマップし、 既知の遺伝子構造に対して転写物ごとの発現レベルに応じたspliced readsの割り当て方や遺伝子レベルの発現量をどのように見積もるか?といった問題に対処するプログラムを紹介しています。 そのため、サンプル内での異なる遺伝子間の発現レベルの大小を比較可能にしたうえでqPCR結果とのlinearityなどの評価を行うことになりますので、「(gene lengthなどの)サンプル内の正規化」は内包していると考えても基本的に差し支えはありません。

「長い遺伝子ほどマップされるリード数が多くなる」ことは2008年頃の時点ですでにわかっていたので、gene lengthの補正は基本的に組み込まれていました。 しかし、その後gene length補正後でも「配列長が長いほど(発現レベルが高いほど)有意に発現変動していると検出される傾向にある(Oshlack and Wakefield, 2009)」という報告や、 「GC含量が高くても低くてもリードカウント数が少なくなり、中程度のGC含量のところがリードカウント数が多い傾向にある(unimodal; Risso et al., 2011)」といったことがわかってきており、リードカウント数(or 発現変動解析結果)とGC含量(or gene length)のbiasをなくす方法が提案されてきました。

どの順番(またはタイミング)で正規化を行うかについてはまだよくわかっていません。Young(2010)らはGene Ontology解析時に発現変動解析後にgene lengthの補正を行っていますが、Risso(2011)らは発現変動解析前にGC-related bias補正を行うほうがよいと述べています。

尚、ここでの主な評価基準は下記のa.およびb.です。

サンプル間正規化周辺:

sequence depth関連のサンプル間正規化の主な目的の一つとして、異なるサンプル(グループ)間で発現の異なる遺伝子(Differentially Expressed Genes; DEGs)を検出することが挙げられます。 したがって、特にサンプル間正規化を目的とした正規化法の評価は下記のよく用いられる評価基準のうち、「c.」が重要視されます。 「どの正規化法を使うか?」ということが「どの発現変動遺伝子検出法を使うか?」ということよりも結果に与える影響が大きい(Bullard et al., 2010; Kadota et al., 2012; Garmire and Subramaniam, 2012)ことがわかりつつあります。

正規化 | サンプル間 | 複製あり | TbT正規化(Kadota_2012)でも述べていますが、従来のサンプル間正規化法(RPMやTMM法)は比較する二群間(G1群 vs. G2群)でDEG数に大きな偏りがないことを前提にしています。 つまり、「(G1群 >> G2群)のDEG数と(G1群 << G2群)のDEG数が同程度」という前提条件がありますが、実際には大きく偏りがある場合も想定すべきで、偏りがあるなしにかかわらずロバストに正規化を行ってくれるのがTbT正規化法(Kadota et al., 2012)です。 偏りがあるなしの主な原因はDEGの分布にあるわけです。よって、TbT論文では、「正規化中にDEG検出を行い、DEGを除き、non-DEGのみで再度正規化係数を決める」というDEG elimination strategyに基づく正規化法を提案しています。 そして、TbT法を含むDEG elimination strategyに基づくいくつかの正規化法をTCCというRパッケージ中に実装しています(TCC論文中ではこの戦略をDEGES「でげす」と呼んでいます; Sun et al., 2013)。TCCパッケージ中に実装されている主な方法および入力データは以下の通りです:

  1. DEGES/TbT:オリジナルのTbT法そのもの。TMM-baySeq-TMMという3ステップで正規化を行う方法。step 2のDEG同定のところで計算時間のかかるbaySeqを採用しているため、他のパッケージでは数秒で終わる正規化ステップが数十分程度はかかるのがネック。また、biological replicatesがあることを前提としている。(A1, A2, ...) vs. (B1, B2, ...)のようなデータという意味。
  2. iDEGES/edgeR:DEGES/TbT法の超高速版(100倍程度高速)。TMM-(edgeR-TMM)nというステップで正規化を行う方法(デフォルトはn = 3)。step 2のDEG同定のところでedgeRパッケージ中のexact test (Robinson and Smyth, 2008)を採用しているためDEG同定の高速化が可能。
    したがって、(step2 - step3)のサイクルをiterative (それゆえDEGESの頭にiterativeの意味を示すiがついたiDEGESとなっている)に行ってよりロバストな正規化係数を得ることが理論的に可能な方法です。それゆえreplicatesのある二群間比較を行いたい場合にはDEGES/TbTよりもiDEGES/edgeRのほうがおすすめ。
  3. iDEGES/DESeq:一連のmulti-stepの正規化手順をすべてDESeqパッケージ中の関数のみで実装したパイプライン。複製実験のない二群間比較時(i.e., A1 vs. B1など)にはこちらを利用します。

ここでは、主に生のリードカウント(整数値;integer)データを入力として(異なる遺伝子間の発現レベルの大小比較のため)サンプル内で行うGC含量補正やgene length補正を行う方法や、 (サンプル間で同一遺伝子の発現変動比較のため)サンプル間で行うsequence depth関連の補正を行う方法についてリストアップしておきます。なぜ前処理 | 発現レベルの定量化についてで得られた数値データを使わないのか?についてですが、 よく言われることとしては「モデル(Poisson model, generalized Poisson model, negative binomial modelなど)に従わなくなるから取り扱いずらくなる」ということもあるんでしょうね。このあたりはedgeRのマニュアルなどで明記されていたりもします。 spliced read情報を含んだ発現情報を用いた正規化法の開発についてもディスカッションではよく述べられています(Dillies et al., in press)が、、、対応版は近い将来publishされる論文で出てくるでしょう。

また、現在の方法は主に転写物レベルではなく遺伝子レベルの解析です。一歩踏み込んだエクソンレベルの解析用Rパッケージ(正規化法含む)も出てきています(Anders et al., 2012)。

一般によく用いられるカウントデータは「2塩基ミスマッチまで許容して一か所にのみマップされるリードの数(uniquely mapped reads allowing up to two mismatches)」です(Frazee et al., 2011; Risso et al., 2011; Sun and Zhu, 2012)。 どの正規化法がいいかを評価する基準としてよく用いられているのは下記のものなどが挙げられます。 二番目については、gold standardの結果自体も測定誤差(measurement error; ME)を含むのでgold standard非依存のME modelを利用した評価法(Sun and Zhu, 2012)も提案されています:

  1. 複製実験データの再現性が高いかどうか?(reproducibilityとかprecisionという用語が対応します)
  2. qRT-PCRやmicroarrayなどの他の実験技術由来のデータをgold standardとしてそれとの相関係数が高いかどうか?(accuracy; Garmire and Subramaniam, 2012)
  3. シミュレーションデータなど、既知の発現変動遺伝子(DEGs)を発現変動遺伝子として上位にランキングできる正規化法かどうか?(AUC; Kadota et al., 2012)

「方法名」:「Rパッケージ名」:「原著論文」の順番です。(あれば)

また、必ずしも正規化法の原著論文とは対応付いていませんのであしからず。この方法を使いたいがどのパッケージで利用可能?、という視点でご覧になってください。

正規化(サンプル内; GC含量補正):
正規化(サンプル内; GC contents and gene length同時補正):
正規化(サンプル内; 全般;分布系):
正規化(サンプル内; 全般;その他(自分の前後の塩基の使用頻度を考慮, sequencing preference)):
正規化(サンプル間):

他の参考文献:

備忘録

RNA-seqデータ取得後に、spliced reads(複数のエクソンにまたがってマップされるべきリードのこと;junction readなどともいう)をどうにかしてマップし、 それらの情報をもとに遺伝子レベルおよび転写物レベルの発現量推定(expression quantification)を行うプログラムをいくつかリストアップしておきます。 ゲノムがわかっている場合とそうでない場合に大別されます。 (ヒトやマウスなど)既知の遺伝子構造情報がわかっている場合にはその情報を用いたほうが一般に精度が上がります(精度比較は既知のものと行われるからです)ので、 プログラムによっては(refFlat形式やGFF形式の)遺伝子アノテーション情報ファイルをオプションとして要求するものもあるかと思います。

ゲノム用:

トランスクリプトーム用:

正規化 | 基礎 | RPK or CPK (配列長補正)

ここでは、「マップ後 | カウント情報取得 | トランスクリプトーム | BED形式ファイルから」で得られた配列長とカウント情報を含むファイル(sample_length_count.txt)から、 転写物ごとのリード数を「配列長が1000 bp (kilobase)だったときのリード数; Reads per kilobase (RPK)」に変換するやり方を示します。 「リード数 = カウント数」なのでReadsのところをCountsに置き換えた表現(Counts per kilobase; CPK)もときどき見受けられます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 配列長とカウント情報を含むファイル(sample_length_count.txt)を読み込んで変換結果をファイルに保存する場合:

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 1000                         #「Reads per X」のXの値を指定(デフォルトはRPKなので1000)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです

#本番(正規化)
nf <- param1/data[,1]                  #正規化係数を計算した結果をnfに格納
out <- data[,2] * nf                   #正規化係数を各行に掛けた結果をoutに格納

#ファイルに保存
tmp <- cbind(rownames(data), data[,1], out)#「ID, 配列長, カウント情報」の並びにしたものをtmpに格納
colnames(tmp) <- c("ID", "Length", "Count")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. 配列長とカウント情報を含むファイル(sample_length_count.txt)を読み込んで変換し、横軸:配列長、縦軸:RPK値のboxplot(箱ひげ図)をpng形式ファイルで保存したい場合:

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param1 <- 20                           #boxplotを描くときの水準数(配列長順でソートした結果の分割数に相当)を指定
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納
head(data)                             #確認してるだけです

#前処理(boxplot用;配列長の短い順にソート)
data <- data[order(data[,1]),]         #ソート
head(data)                             #確認してるだけです

#前処理(boxplot用;param1で指定した数にdataを分割するためのグループラベル情報作成)
f <- gl(param1, floor(nrow(data)/param1)+1, nrow(data))#nrow(data)で表される要素数からなるベクトルをparam1個の水準数に分割した因子ベクトルfを作成

#本番(正規化)
nf <- 1000/data[,1]                    #正規化係数を計算した結果をnfに格納
data[,2] <- data[,2] * nf              #正規化係数を各行に掛けた結果を元の位置に代入
head(data)                             #確認してるだけです

#ファイルに保存(boxplot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(f, log10(data[,2]), xlab="Length", ylab="log10(Count)")#boxplot
abline(h=1, col="red")                 #縦軸が1のところに水平線を引いている
dev.off()                              #おまじない
	

3. サンプルデータ4の18,110 genes×10 samplesのカウントデータ(data_marioni.txt)と長さ情報ファイル(length_marioni.txt)を読み込んで行う場合:

in_f1 <- "data_marioni.txt"            #入力ファイル名を指定してin_f1に格納(カウントーデータファイル)
in_f2 <- "length_marioni.txt"          #入力ファイル名を指定してin_f2に格納(長さ情報ファイル)
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
len <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#in_f2で指定したファイルの読み込み
dim(data)                              #行数と列数を表示
dim(len)                               #行数と列数を表示
head(data)                             #確認してるだけです
head(len)                              #確認してるだけです
colSums(data)                          #列ごとの総リード数を表示

#本番(RPK正規化)
nf <- 1000/len[,1]                     #正規化係数(RPK補正用)を計算した結果をnfに格納
data <- sweep(data, 1, nf, "*")        #正規化係数を各行に掛けた結果をdataに格納
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

正規化 | 基礎 | RPM or CPM (総リード数補正)

カウントデータファイルを読み込んで、転写物ごとのリード数を「総リード数が100万 (million)だったときのリード数; Reads per million (RPM)」に変換するやり方を示します。 「リード数 = カウント数」なのでReadsのところをCountsに置き換えた表現(Counts per million; CPM)もときどき見受けられます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 3列目にカウント情報を含むファイル(sample_length_count.txt)からRPM変換した結果をファイルに保存したい場合:

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 1000000                      #補正後の総リード数を指定(RPMにしたい場合はここの数値はそのまま)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです
sum(data[,2])                          #総リード数を表示

#本番(正規化)
nf <- param1/sum(data[,2])             #正規化係数を計算した結果をnfに格納
out <- data[,2] * nf                   #正規化係数を各行に掛けた結果をoutに格納
head(out)                              #RPM変換後の数値を表示
sum(out)                               #総リード数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data[,1], out)#「ID, 配列長, カウント情報」の並びにしたものをtmpに格納
colnames(tmp) <- c("ID", "Length", "Count")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 1000000                      #補正後の総リード数を指定(RPMにしたい場合はここの数値はそのまま)
param_nonDEG <- 2001:10000             #non-DEGの位置を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです
dim(data)                              #確認してるだけです
colSums(data)                          #総リード数を表示

#前処理(non-DEGデータのみ抽出)
data <- data[param_nonDEG,]            #param_nonDEGで指定した行の情報のみ抽出
head(data)                             #確認してるだけです
dim(data)                              #確認してるだけです
colSums(data)                          #総リード数を表示

#本番(正規化)
nf <- param1/colSums(data)             #正規化係数を計算した結果をnfに格納
data <- sweep(data, 2, nf, "*")        #正規化係数を各列に掛けた結果をdataに格納
head(data)                             #確認してるだけです
colSums(data)                          #総リード数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

non-DEGデータのみを正規化してM-A plotを作成しています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 1000000                      #補正後の総リード数を指定(RPMにしたい場合はここの数値はそのまま)
param_nonDEG <- 2001:10000             #non-DEGの位置を指定
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(non-DEGデータのみ抽出)
data <- data[param_nonDEG,]            #param_nonDEGで指定した行の情報のみ抽出

#本番(正規化)
nf <- param1/colSums(data)             #正規化係数を計算した結果をnfに格納
data <- sweep(data, 2, nf, "*")        #正規化係数を各列に掛けた結果をdataに格納

#本番(M-A plot)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
G1 <- apply(as.matrix(data[,data.cl==1]), 1, mean)#遺伝子ごとにG1群の平均を計算した結果をG1に格納
G2 <- apply(as.matrix(data[,data.cl==2]), 1, mean)#遺伝子ごとにG2群の平均を計算した結果をG2に格納
M <- log2(G2) - log2(G1)               #M-A plotのM(y軸の値)に相当するものをMに格納)
A <- (log2(G1) + log2(G2))/2           #M-A plotのA(x軸の値)に相当するものをAに格納)
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
median(M, na.rm=TRUE)                  #M値(=log2(G2/G1))の中央値(Inf and -Infを含む)を表示
abline(h=median(M, na.rm=TRUE), col="black")#M値(=log2(G2/G1))の中央値を指定した色で表示

#ファイルに保存
tmp <- cbind(rownames(data), data, G1, G2, log2(G1), log2(G2), M, A)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

non-DEGデータのみを正規化してM-A plotを作成していろいろとハイライトさせるやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
param1 <- 1000000                      #補正後の総リード数を指定(RPMにしたい場合はここの数値はそのまま)
param_nonDEG <- 2001:10000             #non-DEGの位置を指定
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(non-DEGデータのみ抽出)
data <- data[param_nonDEG,]            #param_nonDEGで指定した行の情報のみ抽出

#本番(正規化)
nf <- param1/colSums(data)             #正規化係数を計算した結果をnfに格納
data <- sweep(data, 2, nf, "*")        #正規化係数を各列に掛けた結果をdataに格納

#本番(M-A plot)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
G1 <- apply(as.matrix(data[,data.cl==1]), 1, mean)#遺伝子ごとにG1群の平均を計算した結果をG1に格納
G2 <- apply(as.matrix(data[,data.cl==2]), 1, mean)#遺伝子ごとにG2群の平均を計算した結果をG2に格納
M <- log2(G2) - log2(G1)               #M-A plotのM(y軸の値)に相当するものをMに格納)
A <- (log2(G1) + log2(G2))/2           #M-A plotのA(x軸の値)に相当するものをAに格納)
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示

#後処理(いろいろな条件を満たすものを描画している)
obj <- "gene_2002"                     #ハイライトさせたい遺伝子名"gene_2002"を指定
points(A[obj], M[obj], col="red", cex=1.0, pch=20)#objがTRUEとなる要素のみ指定した色で描画

obj <- (M >= log2(4))                  #条件を満たすかどうかを判定した結果をobjに格納(4倍以上G2群で高発現な遺伝子)
points(A[obj], M[obj], col="blue", cex=0.8, pch=6)#objがTRUEとなる要素のみ指定した色で描画
sum(obj, na.rm=TRUE)                   #objがTRUEとなる要素数を表示させている

obj <- (A > 10)                        #条件を満たすかどうかを判定した結果をobjに格納(Aの値が10より大きい遺伝子)
points(A[obj], M[obj], col="lightblue", cex=0.8, pch=17)#objがTRUEとなる要素のみ指定した色で描画
sum(obj, na.rm=TRUE)                   #objがTRUEとなる要素数を表示させている
	

5. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

上記DEGを色分けするやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
param1 <- 1000000                      #補正後の総リード数を指定(RPMにしたい場合はここの数値はそのまま)
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_DEG_G1 <- 1:1800                 #G1群で高発現のDEGの位置を指定
param_DEG_G2 <- 1801:2000              #G2群で高発現のDEGの位置を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#本番(正規化)
nf <- param1/colSums(data)             #正規化係数を計算した結果をnfに格納
data <- sweep(data, 2, nf, "*")        #正規化係数を各列に掛けた結果をdataに格納

#本番(M-A plot)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
G1 <- apply(as.matrix(data[,data.cl==1]), 1, mean)#遺伝子ごとにG1群の平均を計算した結果をG1に格納
G2 <- apply(as.matrix(data[,data.cl==2]), 1, mean)#遺伝子ごとにG2群の平均を計算した結果をG2に格納
M <- log2(G2) - log2(G1)               #M-A plotのM(y軸の値)に相当するものをMに格納)
A <- (log2(G1) + log2(G2))/2           #M-A plotのA(x軸の値)に相当するものをAに格納)
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
median(M[param_nonDEG], na.rm=TRUE)    #non-DEGデータのM値(=log2(G2/G1))の中央値(Inf and -Infを含む)を表示
abline(h=median(M[param_nonDEG], na.rm=TRUE), col="black")#non-DEGデータのM値(=log2(G2/G1))の中央値を指定した色で表示

#後処理(いろいろな条件を満たすものを描画している)
obj <- param_DEG_G1                    #「G1群で高発現のDEG」という条件を指定
points(A[obj], M[obj], col="blue", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画

obj <- param_DEG_G2                    #「G2群で高発現のDEG」という条件を指定
points(A[obj], M[obj], col="red", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
	

6. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

上記DEGを色分けしてPNG形式ファイルとして保存するやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param1 <- 1000000                      #補正後の総リード数を指定(RPMにしたい場合はここの数値はそのまま)
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_DEG_G1 <- 1:1800                 #G1群で高発現のDEGの位置を指定
param_DEG_G2 <- 1801:2000              #G2群で高発現のDEGの位置を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#本番(正規化)
nf <- param1/colSums(data)             #正規化係数を計算した結果をnfに格納
data <- sweep(data, 2, nf, "*")        #正規化係数を各列に掛けた結果をdataに格納

#後処理(M-A plotのための基礎情報取得)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
G1 <- apply(as.matrix(data[,data.cl==1]), 1, mean)#遺伝子ごとにG1群の平均を計算した結果をG1に格納
G2 <- apply(as.matrix(data[,data.cl==2]), 1, mean)#遺伝子ごとにG2群の平均を計算した結果をG2に格納
M <- log2(G2) - log2(G1)               #M-A plotのM(y軸の値)に相当するものをMに格納)
A <- (log2(G1) + log2(G2))/2           #M-A plotのA(x軸の値)に相当するものをAに格納)

#ファイルに保存(M-A plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)",#M-A plotを描画
     ylim=c(-8, 6), pch=20, cex=.1)    #M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
median(M[param_nonDEG], na.rm=TRUE)    #non-DEGデータのM値(=log2(G2/G1))の中央値(Inf and -Infを含む)を表示
abline(h=median(M[param_nonDEG], na.rm=TRUE), col="black")#non-DEGデータのM値(=log2(G2/G1))の中央値を指定した色で表示
obj <- param_DEG_G1                    #「G1群で高発現のDEG」という条件を指定
points(A[obj], M[obj], col="blue", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
obj <- param_DEG_G2                    #「G2群で高発現のDEG」という条件を指定
points(A[obj], M[obj], col="red", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
legend("topright", c("DEG(G1)", "DEG(G2)", "non-DEG"), col=c("blue", "red", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

7. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

edgeRパッケージ中のcpm関数を用いるやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです
colSums(data)                          #総リード数を表示

#本番(正規化)
data <- cpm(data)                      #RPM正規化を実行した結果をdataに格納
head(data)                             #確認してるだけです
colSums(data)                          #総リード数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#おまけとして、RPM正規化後のデータでM-A plotを描画
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
	

8. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

6.をTCCパッケージを利用して行うやり方です。 各サンプルのリード数を100万ではなく平均リード数に揃えています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge8.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge8.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_DEG_G1 <- 1:1800                 #G1群で高発現のDEGの位置を指定
param_DEG_G2 <- 1801:2000              #G2群で高発現のDEGの位置を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)


#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#ファイルに保存(テキストファイル)
data <- getNormalizedData(tcc)         #正規化後のデータを取り出してdataに格納
tmp <- cbind(rownames(data), data)     #「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
obj <- c(rep(1, length(param_DEG_G1)), #DEG or non-DEGの位置情報ベクトルをobjに格納
         rep(2, length(param_DEG_G2)),                           #DEG or non-DEGの位置情報ベクトルをobjに格納 
         rep(3, length(param_nonDEG))) #DEG or non-DEGの位置情報ベクトルをobjに格納
cols <- c("blue", "red", "black")      #色情報を指定してcolsに格納
plot(tcc, col=cols, col.tag=obj, normalize=T)#M-A plot
legend("topright", c("DEG(G1)", "DEG(G2)", "non-DEG"), col=c("blue", "red", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

9. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

2.をTCCパッケージを利用して行うやり方です。 各サンプルのリード数を100万ではなく平均リード数に揃えています。

non-DEGデータのみを正規化してM-A plotを作成するやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge9.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge9.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)


#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[param_nonDEG,]            #param_nonDEGで指定した行の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#ファイルに保存(テキストファイル)
data <- getNormalizedData(tcc)         #正規化後のデータを取り出してdataに格納
tmp <- cbind(rownames(data), data)     #「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, normalize=T)#M-A plot
dev.off()                              #おまじない
	

正規化 | 基礎 | RPKM | トランスクリプトーム

ここでは、「マップ後 | カウント情報取得 | トランスクリプトーム | BED形式ファイルから」で得られた配列長とカウント情報を含むファイル(sample_length_count.txt)から、 転写物ごとのリード数を「配列長が1000 bp (kilobase)で総リード数が100万だったときのリード数; Reads per kilobase per million (RPKM)」に変換するやり方を示します。

また、18,110 genes×10 samplesサンプルデータのカウントデータ(data_marioni.txt; G1群5サンプル vs. G2群5サンプル) についても、長さ情報を含む別ファイル(length_marioni.txt)を同時に読み込んでRPKM値に変換するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. sample_length_count.txtの場合:

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです
sum(data[,2])                          #総リード数を表示

#本番(正規化)
nf_RPM <- 1000000/sum(data[,2])        #正規化係数(RPM補正用)を計算した結果をnf_RPMに格納
nf_RPK <- 1000/data[,1]                #正規化係数(RPK補正用)を計算した結果をnf_RPKに格納
data[,2] <- data[,2] * nf_RPM * nf_RPK #正規化係数を各行に掛けた結果を元の位置に代入
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. カウントデータ(data_marioni.txt)と長さ情報ファイル(length_marioni.txt)を読み込んで行う場合:

in_f1 <- "data_marioni.txt"            #入力ファイル名を指定してin_f1に格納(カウントーデータファイル)
in_f2 <- "length_marioni.txt"          #入力ファイル名を指定してin_f2に格納(長さ情報ファイル)
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
len <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#in_f2で指定したファイルの読み込み
dim(data)                              #行数と列数を表示
dim(len)                               #行数と列数を表示
head(data)                             #確認してるだけです
head(len)                              #確認してるだけです
colSums(data)                          #列ごとの総リード数を表示

#本番(RPM正規化)
nf_RPM <- 1000000/colSums(data)        #正規化係数(RPM補正用)を計算した結果をnf_RPMに格納
data <- sweep(data, 2, nf_RPM, "*")    #正規化係数を各列に掛けた結果をdataに格納
head(data)                             #確認してるだけです
colSums(data)                          #列ごとの総リード数を表示

#本番(RPK正規化)
nf_RPK <- 1000/len[,1]                 #正規化係数(RPK補正用)を計算した結果をnf_RPKに格納
data <- sweep(data, 1, nf_RPK, "*")    #正規化係数を各行に掛けた結果をdataに格納
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

正規化 | 基礎 | RPKM | ゲノム

ゲノムへのマッピング結果ファイル(BED format)をもとにして、(既知)遺伝子の発現レベルを計算してくれます。

そのためには、マッピング結果ファイルだけでなく、どの領域にどの遺伝子があるのかという座標(Coordinates)情報を含むrefFlatという形式のファイル(アノテーション情報取得 | refFlatファイルを参照)も同時に必要ですので予め入手しておいてください。

ここでは、以下を行って得られたBED formatファイル(SRR002323.bowtiebed; 140MB程度あります)とヒトのrefFlat.txtの二つのファイルを入力として遺伝子発現レベルを見積もるやり方を示します。

ちなみにこのSRR002323.bowtiebedファイルは、NCBI SRAから得られたSRR002323.fastqファイルをfastq_process2.plで前処理(マッピング | 入力ファイル形式についてを参照)して得られたSRR002323.fastq2ファイルをマッピングプログラムBowtie ver. 0.12.5 (オプションは"--offrate 3 -p 8 -a --best --strata -v 2 -m 1 --sam")を用いて、 ヒトゲノム配列(chr1-22, X, Y, and M;配列取得 | リファレンス配列(マップされる側)を参照)に対して実行して得られたSAM formatファイルをBED formatに変換(イントロ | NGS | ファイル形式の変換を参照)したものです。

以下を実行して得られるファイル(SRR002323.bowtieexp)は、5列から構成されます:

  • 1列目:「Gene symbol」
  • 2列目:「生のsequenceされた回数(raw counts)」
  • 3列目:「正規化後の発現レベル(RPKM)」
  • 4列目:「入力BED formatファイル中の行数(マップされた総リード数に相当;all reads)」
  • 5列目:「配列長(そのgene symbolを構成するエクソン領域の和集合)」

この3列目のRPKM値がいわゆるglobal normalization後のデータということになります。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. SRR002323.bowtiebedの場合:

in_f1 <- "SRR002323.bowtiebed"         #BED formatファイルを指定してin_f1に格納
in_f2 <- "refFlat.txt"                 #refFlat formatファイルを指定してin_f2に格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(DEGseq)                        #パッケージの読み込み

#本番
out <- getGeneExp(in_f1, refFlat=in_f2, output=out_f)#in_f1とin_f2で指定したファイルを読み込んで計算した結果をout_fで指定したファイルに出力

#以下は(こんなこともできますという)おまけ
out[,3]                                #3列目のRPKMの情報のみ抽出したいとき
	

正規化 | サンプル内 | EDASeq(Risso_2011)

Risso et al., BMC Bioinformatics, 2011Fig.1を見ればわかりますが、 遺伝子のカウント数(発現量に相当;縦軸)をGC含量で横軸に展開してやるとunimodal(山が一つ、の意味)な分布になる傾向にあります。 つまり、GC含量が低すぎても高すぎてもカウント数が低くなり、中程度のときにタグカウント数が多くなる傾向にある、ということを言っているわけです。 彼らはこの傾向をYeastのRNA-seqデータ(同じgrowth conditionで得られた4つのcultures。これらはbiological replicatesとみなせるそうです。 そしてcultureごとに2 technical replicatesがある。計8列分のデータ; Y1, Y1, Y2, Y2, Y7, Y7, Y4, Y4; SRA048710)で示しています。 このデータから4 replicates vs. 4 replicatesの"null pseudo-dateset"を計choose(8,4)/2 = 35セットの「発現変動遺伝子(DEG)のないデータセット」を作成可能ですが、 GC含量が高いほどDEGとcallされる傾向にある(Fig.6)ことも示しています。 マイクロアレイではこのようなGC biasは見られませんので、library preparation時にこのようなbiasが導入されているんだろう(Benjamini and Speed, Nucleic Acids Res., 2012)と言われています。 Rissoらは、このGC biasを補正するための方法として、EDASeqパッケージ中でloess, median, FQ (full quantile)の三つの正規化法を提案し実装していますが、ここでは彼らの論文中で最もGC biasを補正できたというFQ正規化法のやり方を示します。 もちろんGC biasを補正するわけですから、入力データはいわゆる「遺伝子発現行列データ(count matrix)」以外に「遺伝子ごとのGC含量情報を含むベクトル情報」が必要です。

ここではサンプルデータ10のyeastRNASeqパッケージから取得可能な「2 samples vs 2 samples」のyeast RNA-seq dataset (7065 genes×4列; Lee et al., 2008)、 およびEDASeqパッケージから取得可能なSGD ver. r64に基づくyeast遺伝子のGC含量情報(6717 genes)を用いて一連の解析を行います。 発現情報とGC含量情報の対応付けが若干ややこしいですが、このあたりのテクニックは結構重要です。

尚、以下ではparam1のところで、"full"を指定することでfull quantile正規化(GCのbinごとにカウントの順位が同じものは同じカウントになるような正規化)を実現していますが、ここを以下のように変えることで他に三種類の異なる正規化を実行することができます:

  • "loess"の場合:loess正規化(non-linearな局所的な回帰を行ってくれる)
  • "median"の場合:median正規化(GCのbinごとのmedianが同じになるような正規化を行う)
  • "upper"の場合:upper quartile正規化(GCのbinごとのupper quartile (75 percentile rankのこと)が同じになるような正規化を行う)

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてある(or 出力ファイルを置きたい)ディレクトリに移動し以下をコピペ。

1. GC含量とカウント情報を含むファイル(sample_gc_count.txt)の場合:

in_f <- "sample_gc_count.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "full"                       #正規化法(full quantile正規化の場合はこのまま)を指定
param2 <- 10                           #binの数を指定(デフォルトは10。何等分して正規化するかという意味)

#必要なパッケージをロード
library(EDASeq)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理
count <- as.matrix(data[,2])           #カウント情報部分を抽出
rownames(count) <- rownames(data)      #行名を付加
GC <- data.frame(GC=data[,1]/100)      #1/100してGC含量情報部分を抽出
rownames(GC) <- rownames(data)         #行名を付加
head(count)                            #確認してるだけです
head(GC)                               #確認してるだけです
data.cl <- c(rep(1, ncol(count)))      #行名を付加
es <- newSeqExpressionSet(exprs=count, #SeqExpressionSetというクラスにデータを格納
                   featureData=GC,     #SeqExpressionSetというクラスにデータを格納
                   phenoData=data.frame(conditions=data.cl))#SeqExpressionSetというクラスにデータを格納
es                                     #確認してるだけです

#本番(正規化)
out <- withinLaneNormalization(es, "GC", which=param1, num.bins=param2, round=FALSE)#正規化を実行した結果をoutに格納

#ファイルに保存
tmp <- cbind(rownames(data), GC, exprs(out))#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. GC含量とカウント情報を含むファイル(sample_gc_count.txt)の場合:

(どういう正規化係数がかかっているのかについて詳細な情報を出力している)

in_f <- "sample_gc_count.txt"          #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge2_before.png"           #出力ファイル名を指定してout_f1に格納(正規化前のbias plot)
out_f2 <- "hoge2_after.png"            #出力ファイル名を指定してout_f2に格納(正規化後のbias plot)
out_f3 <- "hoge2.txt"                  #出力ファイル名を指定してout_f3に格納
param1 <- "full"                       #正規化法(full quantile正規化の場合はこのまま)を指定
param2 <- 10                           #binの数を指定(デフォルトは10。何等分して正規化するかという意味)
param_fig <- c(500, 450)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(EDASeq)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理
count <- as.matrix(data[,2])           #カウント情報部分を抽出
rownames(count) <- rownames(data)      #行名を付加
GC <- data.frame(GC=data[,1]/100)      #1/100してGC含量情報部分を抽出
rownames(GC) <- rownames(data)         #行名を付加
head(count)                            #確認してるだけです
head(GC)                               #確認してるだけです
data.cl <- c(rep(1, ncol(count)))      #行名を付加
es <- newSeqExpressionSet(exprs=count, #SeqExpressionSetというクラスにデータを格納
                   featureData=GC,     #SeqExpressionSetというクラスにデータを格納
                   phenoData=data.frame(conditions=data.cl))#SeqExpressionSetというクラスにデータを格納
es                                     #確認してるだけです

#本番(正規化)
out <- withinLaneNormalization(es, "GC", which=param1, num.bins=param2, round=FALSE)#正規化を実行した結果をoutに格納
out2 <- withinLaneNormalization(es, "GC", which=param1, num.bins=param2, offset=TRUE)#正規化係数情報を取得した結果をout2に格納

#ファイルに保存
png(out_f1, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
biasPlot(es, "GC", log = T)            #正規化前のプロット(横軸:GC含量、縦軸:log(カウント))
dev.off()                              #おまじない

png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
biasPlot(out, "GC", log = T)           #正規化後のプロット(横軸:GC含量、縦軸:log(カウント))
dev.off()                              #おまじない

tmp <- cbind(rownames(data), data, exp(offst(out2)), exprs(out))#保存したい情報をtmpに格納
colnames(tmp) <- c("ID", "GC_contents", "Count(before)", "Norm_factor", "Count(after")#列名を付与
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. EDASeqパッケージ中の記述と似たやり方で示した場合:

param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param1 <- "full"                       #正規化法(full quantile正規化の場合は"full"のまま)を指定

#必要なパッケージをロード
library(yeastRNASeq)                   #パッケージの読み込み
library(EDASeq)                        #パッケージの読み込み

#count dataやGC含量情報(SGD ver. r64)の読み込みとラベル情報の作成
data(geneLevelData)                    #yeastRNASeqパッケージ中で提供されているデータをロード
data(yeastGC)                          #EDASeqパッケージ中で提供されているyeastのGC含量情報をロード
dim(geneLevelData)                     #行数と列数を表示
head(geneLevelData)                    #最初の数行を表示
length(yeastGC)                        #要素数を表示
head(yeastGC)                          #最初の数個を表示
head(rownames(geneLevelData))          #geneLevelData行列の行名(rownames)情報の最初の数個を表示
head(names(yeastGC))                   #yeastGCベクトルのnames属性情報の最初の数個を表示
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#カウントデータ情報(geneLevelData)とGC含量情報(yeastGC)から共通して存在するサブセットを(同じ遺伝子名の並びで)取得
common <- intersect(rownames(geneLevelData), names(yeastGC))#二つのベクトルから積集合(intersection)を抽出した結果をcommonに格納
length(common)                         #共通遺伝子数(正確にはcommonベクトルの要素数)を表示
data <- as.matrix(geneLevelData[common, ])#6685個の共通遺伝子分のカウントデータ行列を行列形式でdataに格納
GC <- data.frame(GC = yeastGC[common]) #6685個の共通遺伝子分のGC含量ベクトルをデータフレーム形式でGCに格納
head(rownames(data))                   #data行列の行名(rownames)情報の最初の数個を表示
head(rownames(GC))                     #GC行列の行名(rownames)情報の最初の数個を表示
es <- newSeqExpressionSet(exprs = data,#SeqExpressionSetというクラスにデータを格納
                   featureData = GC,   #SeqExpressionSetというクラスにデータを格納
                   phenoData = data.frame(conditions = data.cl,#SeqExpressionSetというクラスにデータを格納
                                     row.names = colnames(data)))#SeqExpressionSetというクラスにデータを格納
es                                     #esを表示

#横軸:GC含量、縦軸:log(count)のプロットを作成しbiasの有無をチェック
#(GC含量依存性があることがわかる。ちなみにbiasがない場合には水平線になる)
biasPlot(es, "GC", log = T, ylim = c(-1, 4))#プロット。G1群("mut_1" and "mut_2"に相当)のラベルが1, G2群("wt_1" and "wt_2"に相当)のラベルが2としてプロットされている。

#本番(full quantile(FQ)正規化)
out <- withinLaneNormalization(es, "GC", which = param1)#サンプル(列 or レーン)ごとに正規化を実行した結果をoutに格納

#横軸:GC含量、縦軸:log(count)のプロットを作成し正規化後の状態をチェック
#(GC含量依存性が緩和されていることがわかる。full quantileなのになぜ水平にならないんだろう。。。)
biasPlot(out, "GC", log = T, ylim = c(-1, 4))#プロット。G1群("mut_1" and "mut_2"に相当)のラベルが1, G2群("wt_1" and "wt_2"に相当)のラベルが2としてプロットされている。

#GC bias補正前後のカウントデータとGC含量の情報をファイルに出力したい場合
out_f1 <- "data_yeastGCbias_common_before.txt"#出力ファイル名1(補正前のカウントデータ)を指定
out_f2 <- "data_yeastGCbias_common_after.txt"#出力ファイル名2(補正後のカウントデータ)を指定
out_f3 <- "data_yeastGCbias_common_GCcontent.txt"#出力ファイル名3(GC含量のデータ)を指定
tmp <- cbind(rownames(exprs(es)), exprs(es))#補正前のカウント情報exprs(es)の左側にその行名(つまり遺伝子名)を結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
tmp <- cbind(rownames(exprs(out)), exprs(out))#補正前のカウント情報exprs(es)の左側にその行名(つまり遺伝子名)を結合した結果をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
tmp <- cbind(rownames(fData(es)), fData(es))#GC含量情報fData(es)の左側にその行名(つまり遺伝子名)を結合した結果をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#GC bias補正前後のoffset(logスケールでの補正前後の差、正規化係数のlog、に相当)ファイルに出力したい場合
out_f4 <- "data_yeastGCbias_common_offset.txt"#出力ファイル名4(offset情報)を指定
out2 <- withinLaneNormalization(es, "GC", which = param1, offset = TRUE)#サンプル(列 or レーン)ごとに正規化を実行した結果をoutに格納
head(offst(out2))                      #offset値(i.e., 正規化係数のlog)の最初の数行を表示
tmp <- cbind(rownames(offst(out2)), offst(out2))#offset情報offst(out2)の左側にその行名(つまり遺伝子名)を結合した結果をtmpに格納
write.table(tmp, out_f4, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#offsetと正規化前後の数値の関係を簡単に説明
head(exprs(out))                       #a. 正規化のカウントデータの最初の数行を表示
head(exprs(es))                        #b. 正規化のカウントデータの最初の数行を表示
head(exp(offst(out2)))                 #c. (logスケールのなので)オリジナルスケール上でのoffset値にした状態で最初の数行を表示
normalized <- exprs(es) * exp(offst(out2))#d. 「正規化前のカウントデータ」に「オリジナルスケールのoffset値」を掛けた結果をnormalizedに格納
head(normalized)                       #e. 掛け算(b * c)で得た正規化後のカウントデータnormalizedの最初の数行を表示(a.と微妙に異なっていることがわかる)
head(round(normalized))                #f. 「a.の正規化後のデータ」は、e.のnormalizedの実数の数値をround関数で最も近い整数値に丸めたものです。
	

4. 二つのタブ区切りテキストファイルの読み込みからやる場合:

7,065行×4列のyeast RNA-seqデータ(data_yeast_7065.txt; 2 wild-types vs. 2 mutant strains; technical replicates) 6,717 yeast genes (SGD ver. r64)のGC含量(yeastGC_6717.txt)

in_f1 <- "data_yeast_7065.txt"         #入力ファイル名(タグカウントファイル)を指定
in_f2 <- "yeastGC_6717.txt"            #入力ファイル名(GC含量情報を含むファイル)を指定
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param1 <- "full"                       #正規化法(full quantile正規化の場合は"full"のまま)を指定

#必要なパッケージをロード
library(EDASeq)                        #パッケージの読み込み

#count dataやGC含量情報の読み込みとラベル情報の作成
data.tmp <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
gc.tmp <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#in_f2で指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#カウントデータ情報(data.tmp)とGC含量情報(gc.tmp)から共通して存在するサブセットを(同じ遺伝子名の並びで)取得
common <- intersect(rownames(data.tmp), rownames(gc.tmp))#二つのベクトルから積集合(intersection)を抽出した結果をcommonに格納
length(common)                         #共通遺伝子数(正確にはcommonベクトルの要素数)を表示
data <- as.matrix(data.tmp[common, ])  #6685個の共通遺伝子分のカウントデータ行列を行列形式でdataに格納
GC <- data.frame(GC = gc.tmp[common, ])#6685個の共通遺伝子分のGC含量行列を行列形式でGCに格納
rownames(GC) <- common                 #行列GCにrownamesを代入している(消えてしまっているためです)
es <- newSeqExpressionSet(exprs = data,#SeqExpressionSetというクラスにデータを格納
                   featureData = GC,   #SeqExpressionSetというクラスにデータを格納
                   phenoData = data.frame(conditions = data.cl,#SeqExpressionSetというクラスにデータを格納
                                     row.names = colnames(data)))#SeqExpressionSetというクラスにデータを格納
es                                     #esを表示

#横軸:GC含量、縦軸:log(count)のプロットを作成しbiasの有無をチェック
#(GC含量依存性があることがわかる。ちなみにbiasがない場合には水平線になる)
biasPlot(es, "GC", log = T, ylim = c(-1, 4))#プロット。G1群("mut_1" and "mut_2"に相当)のラベルが1, G2群("wt_1" and "wt_2"に相当)のラベルが2としてプロットされている。

#本番(full quantile(FQ)正規化)
out <- withinLaneNormalization(es, "GC", which = param1)#サンプル(列 or レーン)ごとに正規化を実行した結果をoutに格納

#横軸:GC含量、縦軸:log(count)のプロットを作成し正規化後の状態をチェック
#(GC含量依存性が緩和されていることがわかる。full quantileなのになぜ水平にならないんだろう。。。)
biasPlot(out, "GC", log = T, ylim = c(-1, 4))#プロット。G1群("mut_1" and "mut_2"に相当)のラベルが1, G2群("wt_1" and "wt_2"に相当)のラベルが2としてプロットされている。

#GC bias補正前後のカウントデータとGC含量の情報をファイルに出力したい場合
out_f1 <- "data_yeastGCbias_common_before.txt"#出力ファイル名1(補正前のカウントデータ)を指定
out_f2 <- "data_yeastGCbias_common_after.txt"#出力ファイル名2(補正後のカウントデータ)を指定
out_f3 <- "data_yeastGCbias_common_GCcontent.txt"#出力ファイル名3(GC含量のデータ)を指定
tmp <- cbind(rownames(exprs(es)), exprs(es))#補正前のカウント情報exprs(es)の左側にその行名(つまり遺伝子名)を結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
tmp <- cbind(rownames(exprs(out)), exprs(out))#補正前のカウント情報exprs(es)の左側にその行名(つまり遺伝子名)を結合した結果をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
tmp <- cbind(rownames(fData(es)), fData(es))#GC含量情報fData(es)の左側にその行名(つまり遺伝子名)を結合した結果をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

正規化 | サンプル内 | RNASeqBias(Zheng_2011)

RNASeqBiasというRパッケージの正規化法の論文です。論文中では、GAM correction法と呼んでいます。 a simple generalized-additive-model based approachを用いてGC contentやgene lengthの補正を同時に行ってくれるようです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。


	

正規化 | サンプル間 | Upper-quartile(Bullard_2010)

Bullardら(2010)の各種統計的解析手法の評価論文で用いられた正規化法です。 マイクロアレイデータのときは「中央値(median)を揃える」などが行われたりしましたが、 「第3四分位数(upper-quartile or 75 percentile rank)の値を揃える」という操作を行うことに相当します。 EDASeqというパッケージを用いて正規化を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "data_hypodata_3vs3_UQ.txt"   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param1 <- "upper"                      #upper-quartile正規化法("upper")を指定

#必要なパッケージをロード
library(EDASeq)                        #パッケージの読み込み

#発現データの読み込みとSeqExpressionSetオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

es <- newSeqExpressionSet(exprs = as.matrix(data),#SeqExpressionSetというクラスにデータを格納
                   phenoData = data.frame(conditions = data.cl,#SeqExpressionSetというクラスにデータを格納
                                     row.names = colnames(data)))#SeqExpressionSetというクラスにデータを格納
es                                     #esを表示
summary(exprs(es))                     #発現データの要約統計量を表示(UQ値が揃っていないことがわかる; 3rd Qu.のところ)

#UQ正規化の実行
hoge <- betweenLaneNormalization(es, which=param1)#正規化を実行した結果をhogeに格納

#正規化後のデータをファイルに出力
normalized.count <- exprs(hoge)        #正規化後のデータを取り出してnormalized.countに格納
summary(normalized.count)              #正規化後のデータの要約統計量を表示(UQ値が75に揃っていることがわかる; 3rd Qu.のところ)
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみを用いて(logスケールで)boxplot
nonDEG <- 2001:10000                   #non-DEGの位置情報をnonDEGに格納
boxplot(log(normalized.count[nonDEG, ]))#boxplot (non-DEGなので分布が揃っているほどよい正規化法であることを意味する。一部0のlogをとろうとしているので警告が出る、、、が気にしない)

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみについて要約統計量を表示(サンプル間の数値が揃っているほどよい)
summary(normalized.count[nonDEG, ])    #各列(つまりサンプル)の要約統計量を表示
apply(normalized.count[nonDEG, ], 2, median)#各列(つまりサンプル)のmedian(中央値)を表示(16      16      16      20      19      19)
	

2. サンプルデータ10の7,065 genes×4 samplesの「複製あり」タグカウントデータ(data_yeast_7065.txt)

technical replicatesのデータ(mut群2サンプル vs. wt群2サンプル)です。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "data_yeast_7065_UQ.txt"      #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群(mut群)のサンプル数を指定
param_G2 <- 2                          #G2群(wt群)のサンプル数を指定
param1 <- "upper"                      #upper-quartile正規化法("upper")を指定

#必要なパッケージをロード
library(EDASeq)                        #パッケージの読み込み

#発現データの読み込みとSeqExpressionSetオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

es <- newSeqExpressionSet(exprs = as.matrix(data),#SeqExpressionSetというクラスにデータを格納
                   phenoData = data.frame(conditions = data.cl,#SeqExpressionSetというクラスにデータを格納
                                     row.names = colnames(data)))#SeqExpressionSetというクラスにデータを格納
es                                     #esを表示
summary(exprs(es))                     #発現データの要約統計量を表示(UQ値が揃っていないことがわかる; 3rd Qu.のところ; 51, 51, 42, 44)

#UQ正規化の実行
hoge <- betweenLaneNormalization(es, which=param1)#正規化を実行した結果をhogeに格納

#正規化後のデータをファイルに出力
normalized.count <- exprs(hoge)        #正規化後のデータを取り出してnormalized.countに格納
summary(normalized.count)              #正規化後のデータの要約統計量を表示(UQ値が47に揃っていることがわかる; 3rd Qu.のところ)
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

正規化 | サンプル間 | Quantile(Bullard_2010)

カウントデータの「サンプル(列)間でカウント数の順位が同じならばカウント数も同じ」になるような操作を行う正規化です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(limma)                         #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#本番
hoge <- normalizeBetweenArrays(as.matrix(data))#Quantile normalizationを実行し、結果をhogeに格納

#ファイルに保存
normalized.count <- exprs(hoge)        #正規化後のデータを取り出してnormalized.countに格納
summary(normalized.count)              #正規化後のデータの要約統計量を表示(分布が完全に揃っていることがわかる)
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

箱ひげ図(box plot)も作成しています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(EDASeq)                        #パッケージの読み込み

#発現データの読み込みとSeqExpressionSetオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

es <- newSeqExpressionSet(exprs=as.matrix(data),#SeqExpressionSetというクラスにデータを格納
              phenoData=data.frame(conditions=data.cl,#SeqExpressionSetというクラスにデータを格納
                             ow.names=colnames(data)))#SeqExpressionSetというクラスにデータを格納
es                                     #esを表示
summary(exprs(es))                     #発現データの要約統計量を表示(分布が揃っていないことがわかる)

#本番
hoge <- betweenLaneNormalization(es, which="full")#正規化を実行した結果をhogeに格納

#ファイルに保存
normalized.count <- exprs(hoge)        #正規化後のデータを取り出してnormalized.countに格納
summary(normalized.count)              #正規化後のデータの要約統計量を表示(分布が完全に揃っていることがわかる)
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#以下は(こんなこともできますという)おまけ
#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみを用いて(logスケールで)boxplot
nonDEG <- 2001:10000                   #non-DEGの位置情報をnonDEGに格納
boxplot(log(normalized.count[nonDEG, ]))#boxplot (non-DEGなので分布が揃っているほどよい正規化法であることを意味する。一部0のlogをとろうとしているので警告が出る、、、が気にしない)

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみについて要約統計量を表示(サンプル間の数値が揃っているほどよい)
summary(normalized.count[nonDEG, ])    #各列(つまりサンプル)の要約統計量を表示
apply(normalized.count[nonDEG, ], 2, median)#各列(つまりサンプル)のmedian(中央値)を表示(16      16      16      20      19      19)
	

3. サンプルデータ10の7,065 genes×4 samplesのカウントデータ(data_yeast_7065.txt)

technical replicatesのデータ(mut群2サンプル vs. wt群2サンプル)です。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(EDASeq)                        #パッケージの読み込み

#発現データの読み込みとSeqExpressionSetオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

es <- newSeqExpressionSet(exprs=as.matrix(data),#SeqExpressionSetというクラスにデータを格納
              phenoData=data.frame(conditions=data.cl,#SeqExpressionSetというクラスにデータを格納
                             ow.names=colnames(data)))#SeqExpressionSetというクラスにデータを格納
es                                     #esを表示
summary(exprs(es))                     #発現データの要約統計量を表示(分布が揃っていないことがわかる)

#本番
hoge <- betweenLaneNormalization(es, which="full")#正規化を実行した結果をhogeに格納

#ファイルに保存
normalized.count <- exprs(hoge)        #正規化後のデータを取り出してnormalized.countに格納
summary(normalized.count)              #正規化後のデータの要約統計量を表示(分布が完全に揃っていることがわかる)
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

正規化 | サンプル間 | 2群間 | 複製あり | iDEGES/edgeR(Sun_2013)

TCCパッケージ(Sun et al., BMC Bioinformatics, 2013)から利用可能なiDEGES/edgeR正規化法の実行手順を示します。 iDEGES/edgeRは、TbT正規化法(Kadota et al., Algorithms Mol. Biol., 2012) 以上の理論性能かつ100倍程度高速(デフォルトの場合)化を実現したお勧めの正規化法です。

ここでは、iDEGES/edgeR法の実体である「TMM-(edgeR-TMM)n」パイプラインのnの値(iterationの回数)を3として実行します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
data <- getNormalizedData(tcc)         #正規化後のデータを取り出してdataに格納

#ファイルに保存
tmp <- cbind(rownames(data), data)     #「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

M-A plotを作成したり、non-DEGの分布についても確認しています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_DEG_G1 <- 1:1800                 #G1群で高発現のDEGの位置を指定
param_DEG_G2 <- 1801:2000              #G2群で高発現のDEGの位置を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
data <- getNormalizedData(tcc)         #正規化後のデータを取り出してdataに格納

#本番(M-A plot)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
G1 <- apply(as.matrix(data[,data.cl==1]), 1, mean)#遺伝子ごとにG1群の平均を計算した結果をG1に格納
G2 <- apply(as.matrix(data[,data.cl==2]), 1, mean)#遺伝子ごとにG2群の平均を計算した結果をG2に格納
M <- log2(G2) - log2(G1)               #M-A plotのM(y軸の値)に相当するものをMに格納)
A <- (log2(G1) + log2(G2))/2           #M-A plotのA(x軸の値)に相当するものをAに格納)
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
median(M[param_nonDEG], na.rm=TRUE)    #non-DEGデータのM値(=log2(G2/G1))の中央値(Inf and -Infを含む)を表示
abline(h=median(M[param_nonDEG], na.rm=TRUE), col="black")#non-DEGデータのM値(=log2(G2/G1))の中央値を指定した色で表示

#後処理(いろいろな条件を満たすものを描画している)
obj <- param_DEG_G1                    #「G1群で高発現のDEG」という条件を指定
points(A[obj], M[obj], col="blue", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画

obj <- param_DEG_G2                    #「G2群で高発現のDEG」という条件を指定
points(A[obj], M[obj], col="red", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画

legend("topright", c("DEG(G1)", "DEG(G2)", "non-DEG"), col=c("blue", "red", "black"), pch=20)#凡例を作成している

#non-DEGの分布を確認している
summary(data[param_nonDEG,])           #正規化後のnon-DEGデータの要約統計量を表示
apply(data[param_nonDEG,], 2, median)  #正規化後のnon-DEGデータの中央値を表示

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

M-A plotをpng形式ファイルで保存するやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_DEG_G1 <- 1:1800                 #G1群で高発現のDEGの位置を指定
param_DEG_G2 <- 1801:2000              #G2群で高発現のDEGの位置を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
data <- getNormalizedData(tcc)         #正規化後のデータを取り出してdataに格納

#後処理(M-A plotのための基礎情報取得)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
G1 <- apply(as.matrix(data[,data.cl==1]), 1, mean)#遺伝子ごとにG1群の平均を計算した結果をG1に格納
G2 <- apply(as.matrix(data[,data.cl==2]), 1, mean)#遺伝子ごとにG2群の平均を計算した結果をG2に格納
M <- log2(G2) - log2(G1)               #M-A plotのM(y軸の値)に相当するものをMに格納)
A <- (log2(G1) + log2(G2))/2           #M-A plotのA(x軸の値)に相当するものをAに格納)

#ファイルに保存(M-A plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)",#M-A plotを描画
     ylim=c(-8, 6), pch=20, cex=.1)    #M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
median(M[param_nonDEG], na.rm=TRUE)    #non-DEGデータのM値(=log2(G2/G1))の中央値(Inf and -Infを含む)を表示
abline(h=median(M[param_nonDEG], na.rm=TRUE), col="black")#non-DEGデータのM値(=log2(G2/G1))の中央値を指定した色で表示
obj <- param_DEG_G1                    #「G1群で高発現のDEG」という条件を指定
points(A[obj], M[obj], col="blue", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
obj <- param_DEG_G2                    #「G2群で高発現のDEG」という条件を指定
points(A[obj], M[obj], col="red", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
legend("topright", c("DEG(G1)", "DEG(G2)", "non-DEG"), col=c("blue", "red", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

4. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

TCCパッケージ中のplot関数を使ってシンプルにM-A plotをpng形式ファイルで保存するやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_DEG_G1 <- 1:1800                 #G1群で高発現のDEGの位置を指定
param_DEG_G2 <- 1801:2000              #G2群で高発現のDEGの位置を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#ファイルに保存(M-A plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
obj <- c(rep(1, length(param_DEG_G1)), #DEG or non-DEGの位置情報ベクトルをobjに格納
         rep(2, length(param_DEG_G2)),                           #DEG or non-DEGの位置情報ベクトルをobjに格納 
         rep(3, length(param_nonDEG))) #DEG or non-DEGの位置情報ベクトルをobjに格納
cols <- c("blue", "red", "black")      #色情報を指定してcolsに格納
plot(tcc, col=cols, col.tag=obj, ylim=c(-8, 6), median.lines=TRUE)#M-A plot
legend("topright", c("DEG(G1)", "DEG(G2)", "non-DEG"), col=c("blue", "red", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

正規化 | サンプル間 | 2群間 | 複製あり | TbT(Kadota_2012)

TbT法の正規化における基本戦略は「正規化時に悪さをするDEGを正規化前に除いてしまえ (DEG elimination strategy; DEGES; でげす)」です。 通常のDEG検出手順は「1.データ正規化( → 2.DEG検出)」の2ステップで完結するため、上記コンセプトを実現することができません。そこで通常の手順を二回繰返す解析パイプラインを提案しています。 つまり「1.データ正規化 → 2.DEG検出 → 3.データ正規化( → 4.DEG検出)」です。この手順で行えばStep3のデータ正規化時にStep2で検出されたDEG候補を除いたデータで正規化を行うことができるのです。 TbT法の実体は、「1.TMM法(Robinson and Oshlack, 2010) → 2.baySeq (Hardcastle and Kelly, 2010) → 3.TMM法」の解析パイプラインです。Step1で既存正規化法の中で高性能なTMM法を採用し、 Step2で(Step1で得られたTMM正規化係数と総リード数(library sizes)を掛けて得られた)effective library sizesを与えてbaySeqを実行してDEG候補を取得し、 Step3でnon-DEGsのみで再度TMM正規化を実行して得られたものがTbT正規化係数です。従って、TbT正規化法を利用する場合は、内部的に用いられた文献も引用するようにお願いします。

以下のスクリプトを実行すると概ね数十分程度はかかります(*_*)...。これは、TbT法の内部で計算時間のかかるbaySeqを利用しているためです。 動作確認のみしたい、という人はparam_samplesizeのところで指定する数値を500とかにして実行してください。おそらく数分で結果を得られると思われます。 ここでは、TbT正規化係数の算出法とTbT正規化後のデータを得る手順などを示しています。 が、基本的に正規化だけで終わることはありませんので、ここの項目のみでは何の役にも立ちませんのであしからず。。。

また、サンプルデータ14 (data_hypodata_1vs1.txt)の1 sample vs. 1 sampleのような「複製なし」データの正規化は実行できません(理由はstep2で用いるbaySeqが複製ありを前提としているためです)のでご注意ください。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_samplesize <- 10000              #TbT法のstep2中で行うブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とか1000とかでやってみてください。)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm",#正規化を実行した結果をtccに格納
               test.method="bayseq", samplesize=param_samplesize)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized.count <- getNormalizedData(tcc)#正規化後のデータを取り出してnormalized.countに格納
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみを用いて(logスケールで)boxplot
nonDEG <- 2001:10000                   #non-DEGの位置情報をnonDEGに格納
boxplot(log(normalized.count[nonDEG, ]))#boxplot (non-DEGなので分布が揃っているほどよい正規化法であることを意味する。一部0のlogをとろうとしているので警告が出る、、、が気にしない)

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみについて要約統計量を表示(サンプル間の数値が揃っているほどよい)
summary(normalized.count[nonDEG, ])    #各列(つまりサンプル)の要約統計量を表示
apply(normalized.count[nonDEG, ], 2, median)#各列(つまりサンプル)のmedian(中央値)を表示(17.70699, 17.78708, 17.60127, 18.20635, 17.41963, 17.27200)

#TbT正規化のstep2で検出されたpotential DEGの結果(step3で使われないものたち)を表示
table(tcc$private$DEGES.potentialDEG)  #0 (nonDEGに相当)が8,494個、1 (G1で高発現のDEGに相当)が1,134個、2 (G2で高発現のDEGに相当)が372個と判定されていたことがわかる

#TbT正規化係数を表示
tcc$norm.factors                       #正規化係数を表示(0.7494026 0.8421160 0.7308061 1.2549357 1.1788312 1.2439084)

#このデータは「答え」がわかっているものなので、答え(DEG or non-DEG)の情報込みで正規化後のデータのM-A plotを描画
tcc$private$simulation <- TRUE         #おまじない
tcc$simulation$trueDEG <- c(rep(1, 1800), rep(2, 200), rep(0, 8000))#真の情報からなるベクトルをtccクラスオブジェクトに格納
plot(tcc, median.lines=TRUE)           #log-ratio(縦軸の値)のmedian値をそれぞれの色で表示:non-DEG(黒; 0.049), G1で高発現のDEG(青; -1.942), G2で高発現のDEG(赤; 2.061)
	

2. サンプルデータ10の7,065 genes×4 samplesのカウントデータ(data_yeast_7065.txt)

technical replicatesのデータ(mut群2サンプル vs. wt群2サンプル)です。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 2                          #G2群のサンプル数を指定
param_samplesize <- 10000              #TbT法のstep2中で行うブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とか1000とかでやってみてください。)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm",#正規化を実行した結果をtccに格納
               test.method="bayseq", samplesize=param_samplesize)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized.count <- getNormalizedData(tcc)#正規化後のデータを取り出してnormalized.countに格納
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#TbT正規化のstep2で検出されたpotential DEGの結果(step3で使われないものたち)を表示
table(tcc$private$DEGES.potentialDEG)  #0 (nonDEGに相当)が3,927個、1 (G1で高発現のDEGに相当)が1,604個、2 (G2で高発現のDEGに相当)が1,534個と判定されていたことがわかる。実に100*(1604+1534)/7065=44.416%がDEGと判定されていることになるがtechnical replicatesのデータなので妥当といえば妥当。

#TbT正規化係数を表示
tcc$norm.factors                       #正規化係数を表示(1.1456801 1.1463897 0.8556477 0.8522824)
	

3. サンプルデータ10の7,065 genes×4 samplesの「複製あり」タグカウントデータ(data_yeast_7065.txt)

このデータはどのサンプルでも発現していない(zero count; ゼロカウント)ものが多いので、 どこかのサンプルで0より大きいカウントのもののみからなるサブセットを抽出して2.と同様の計算を行っています。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 2                          #G2群のサンプル数を指定
param_samplesize <- 10000              #TbT法のstep2中で行うブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とか1000とかでやってみてください。)
param_lowcount <- 0                    #低発現遺伝子のフィルタリングを行う際の閾値。遺伝子(行)ごとにカウントの総和を計算し、ここで指定した値よりも大きいものだけがその後の解析に用いられる

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
dim(tcc$count)                         #カウント行列の行数と列数を表示(7065行4列)

#フィルタリングの実行(低発現のものを除去)
tcc <- filterLowCountGenes(tcc, low.count = param_lowcount)#param_lowcountで指定した閾値より大きい総カウント数をもつ遺伝子のみを抽出している
dim(tcc$count)                         #カウント行列の行数と列数を表示(6508行4列になっていることがわかる)

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm",#正規化を実行した結果をtccに格納
               test.method="bayseq", samplesize=param_samplesize)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized.count <- getNormalizedData(tcc)#正規化後のデータを取り出してnormalized.countに格納
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#TbT正規化のstep2で検出されたpotential DEGの結果(step3で使われないものたち)を表示
table(tcc$private$DEGES.potentialDEG)  #0 (nonDEGに相当)が3,285個、1 (G1で高発現のDEGに相当)が1,656個、2 (G2で高発現のDEGに相当)が1,567個と判定されていたことがわかる

#TbT正規化係数を表示
tcc$norm.factors                       #正規化係数を表示(1.1448574 1.1433478 0.8578253 0.8539695)
	

正規化 | サンプル間 | 2群間 | 複製あり | TMM(Robinson_2010)

前処理 | についてでも述べていますがNGSデータはマイクロアレイに比べてダイナミックレンジが広いという利点はあるとは思いますが、 RPM(やRPKM)で実装されているいわゆるグローバル正規化に基づく方法はごく少数の高発現遺伝子の発現レベルの影響をもろに受けます。 そしてこれらが比較するサンプル間で発現変動している場合には結論が大きく変わってしまいます。なぜなら総リード数に占める高発現の発現変動遺伝子(Differentially Expressed Genes; DEGs)のリード数の割合が大きいからです。

RobinsonらはMarioniら(2008)の「腎臓 vs. 肝臓」データの比較において実際にこのような現象が起きていることを(housekeeping遺伝子の分布を真として)示し、 少数の高発現遺伝子の影響を排除するためにtrimmed mean of M values (TMM)という正規化法を提案しています(Robinson and Oshlack, 2010)。

この方法はRのedgeRというパッケージ中にcalcNormFactorsという名前の関数で存在します。 また、この方法はTCCパッケージ中の関数を用いても実行可能です。 TCCパッケージから得られる(TMM)正規化係数は「正規化係数の平均が1になるようにさらに正規化したもの」であるため、両者の正規化係数に若干の違いがありますが細かいことは気にする必要はありません。

ここでは、正規化係数の算出と正規化後のデータを得る手順などを示していますが、基本的に正規化だけで終わることはありませんので、ここの項目のみでは何の役にも立ちませんのであしからず。。。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized.count <- getNormalizedData(tcc)#正規化後のデータを取り出してnormalized.countに格納
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみを用いて(logスケールで)boxplot
nonDEG <- 2001:10000                   #non-DEGの位置情報をnonDEGに格納
boxplot(log(normalized.count[nonDEG, ]))#boxplot (non-DEGなので分布が揃っているほどよい正規化法であることを意味する。一部0のlogをとろうとしているので警告が出る、、、が気にしない)

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみについて要約統計量を表示(サンプル間の数値が揃っているほどよい)
summary(normalized.count[nonDEG, ])    #各列(つまりサンプル)の要約統計量を表示
apply(normalized.count[nonDEG, ], 2, median)#各列(つまりサンプル)のmedian(中央値)を表示(17.06540 17.15646 17.07707 18.90293 18.04854 17.93468)

#TMM正規化係数を表示
tcc$norm.factors                       #正規化係数を表示(0.7843388 0.8806613 0.7597886 1.2192004 1.1476476 1.2083632)

#このデータは「答え」がわかっているものなので、答え(DEG or non-DEG)の情報込みで正規化後のデータのM-A plotを描画
tcc$private$simulation <- TRUE         #おまじない
tcc$simulation$trueDEG <- c(rep(1, 1800), rep(2, 200), rep(0, 8000))#真の情報からなるベクトルをtccクラスオブジェクトに格納
plot(tcc, median.lines=TRUE)           #log-ratio(縦軸の値)のmedian値をそれぞれの色で表示:non-DEG(黒; 0.152), G1で高発現のDEG(青; -1.840), G2で高発現のDEG(赤; 2.164)
	

2. サンプルデータ10の7,065 genes×4 samplesの「複製あり」タグカウントデータ(data_yeast_7065.txt)

technical replicatesのデータ(mut群2サンプル vs. wt群2サンプル)です。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 2                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized.count <- getNormalizedData(tcc)#正規化後のデータを取り出してnormalized.countに格納
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#TMM正規化係数を表示
tcc$norm.factors                       #正規化係数を表示(1.1391738 1.1395812 0.8596891 0.8615559)
	

3. サンプルデータ10の7,065 genes×4 samplesの「複製あり」タグカウントデータ(data_yeast_7065.txt)

technical replicatesのデータ(mut群2サンプル vs. wt群2サンプル)です。 TCCを使わずにedgeRパッケージ内の関数を用いて2.と同じ結果を出すやり方です。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 2                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#TMM正規化本番
d <- DGEList(counts=data, group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #正規化係数を計算
d$samples$norm.factors                 #edgeRパッケージから得られる正規化係数そのものを表示(1.1504029 1.1508142 0.8681632 0.8700484)
mean(d$samples$norm.factors)           #正規化係数の平均が1でないことがわかる(1.009857)
norm.factors <- d$samples$norm.factors/mean(d$samples$norm.factors)#正規化係数の平均が1になるように正規化したものがTCCパッケージで得られるものと同じです
norm.factors                           #TCCパッケージから得られるTMM正規化係数と同じになっていることがわかる(1.1391738 1.1395812 0.8596891 0.8615559)

#正規化後のデータをファイルに出力
ef.libsizes <- colSums(data)*norm.factors#effective library sizesというのはlibrary sizesに正規化係数を掛けたものなのでそれを計算した結果をef.libsizesに格納
normalized.count <- sweep(data, 2, mean(ef.libsizes)/ef.libsizes, "*")#正規化後のデータを取り出してnormalized.countに格納
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

正規化 | サンプル間 | 2群間 | 複製あり | median(Anders_2010)

DESeqというRパッケージ中で採用されている正規化法を採用して得られた正規化後のデータを得るやり方を示します。

DESeqは正規化係数(normalization factor)という言葉を使わずにsize factorという言葉を使っています。 これはTbTやTMM正規化係数とは異なるものなので、ここでは「DESeqの正規化係数」を得ています。 また、この方法はTCCパッケージ中の関数を用いても実行可能です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1.サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized.count <- getNormalizedData(tcc)#正規化後のデータを取り出してnormalized.countに格納
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみを用いて(logスケールで)boxplot
nonDEG <- 2001:10000                   #non-DEGの位置情報をnonDEGに格納
boxplot(log(normalized.count[nonDEG, ]))#boxplot (non-DEGなので分布が揃っているほどよい正規化法であることを意味する。一部0のlogをとろうとしているので警告が出る、、、が気にしない)

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみについて要約統計量を表示(サンプル間の数値が揃っているほどよい)
summary(normalized.count[nonDEG, ])    #各列(つまりサンプル)の要約統計量を表示
apply(normalized.count[nonDEG, ], 2, median)#各列(つまりサンプル)のmedian(中央値)を表示(16.83471 17.03814 16.87943 19.26712 18.12903 18.16272)

#正規化係数を表示
tcc$norm.factors                       #正規化係数を表示(0.7974195 0.8893788 0.7709404 1.1996644 1.1459043 1.1966927)

#このデータは「答え」がわかっているものなので、答え(DEG or non-DEG)の情報込みで正規化後のデータのM-A plotを描画
tcc$private$simulation <- TRUE         #おまじない
tcc$simulation$trueDEG <- c(rep(1, 1800), rep(2, 200), rep(0, 8000))#真の情報からなるベクトルをtccクラスオブジェクトに格納
plot(tcc, median.lines=TRUE)           #log-ratio(縦軸の値)のmedian値をそれぞれの色で表示:non-DEG(黒; 0.186), G1で高発現のDEG(青; -1.809), G2で高発現のDEG(赤; 2.196)
	

2. サンプルデータ10の7,065 genes×4 samplesの「複製あり」タグカウントデータ(data_yeast_7065.txt)

technical replicatesのデータ(mut群2サンプル vs. wt群2サンプル)です。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 2                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized.count <- getNormalizedData(tcc)#正規化後のデータを取り出してnormalized.countに格納
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#正規化係数を表示
tcc$norm.factors                       #正規化係数を表示(1.1431946 1.1408795 0.8568723 0.8590536)

#正規化後のデータの列ごとの各種要約統計量を表示
summary(normalized.count)              #normalized.countの各列(つまりサンプル)の要約統計量を表示
	

3. サンプルデータ10の7,065 genes×4 samplesの「複製あり」タグカウントデータ(data_yeast_7065.txt)

technical replicatesのデータ(mut群2サンプル vs. wt群2サンプル)です。 TCCを使わずにDESeqパッケージ内の関数を用いて2.と同じ結果を出すやり方です。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 2                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(DESeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#Anders and Huberの(AH)正規化本番
cds <- newCountDataSet(data, data.cl)  #CountDataSetオブジェクトを作成してcdsに格納
cds <- estimateSizeFactors(cds)        #size factorを計算し、結果をcdsに格納
sizeFactors(cds)                       #これがDESeqのsize factorsです(1.1365363 1.1272941 0.8835836 0.9287529)
norm.factors <- sizeFactors(cds)/colSums(data)#DESeqのsize factorsから「DESeqの正規化係数(これの平均が1になるとは限らない)」をnorm.factorsに格納
norm.factors <- norm.factors/mean(norm.factors)#正規化係数の平均が1になるように正規化した「これ(norm.factors)」がTCCパッケージで得られる「DESeqの正規化係数」です
norm.factors                           #norm.factorsの中身を表示(1.1431946 1.1408795 0.8568723 0.8590536)。TCCパッケージから得られる「DESeqの正規化係数」と同じになっていることがわかる。

#正規化後のデータをファイルに出力
sizeFactors(cds) <- sizeFactors(cds)/mean(sizeFactors(cds))#正規化後のデータ取得自体は「DESeqの正規化係数」とは無関係に取得可能であるが、TCC経由で得られるものと同じにするためにsize factorsの平均が1になるように正規化している
normalized.count <- counts(cds, normalized=TRUE)#正規化後のデータを取り出してnormalized.countに格納
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータの列ごとの各種要約統計量を表示
summary(normalized.count)              #normalized.countの各列(つまりサンプル)の要約統計量を表示
	

4. サンプルデータ10の7,065 genes×4 samplesの「複製あり」タグカウントデータ(data_yeast_7065.txt)

technical replicatesのデータ(mut群2サンプル vs. wt群2サンプル)です。 DESeqパッケージ内の関数を用いてDESeqパッケージ内のマニュアル通りにやった場合。 若干数値が違ってきます(ということを示したいだけです)が正規化後の値の要約統計量をどこに揃えるか程度の違いなので気にする必要はないです。 実際、ここで得られるsize factorsの平均は1.019042ですが、この定数値を正規化後のデータに掛けるとTCCで得られるデータと同じになります。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 2                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(DESeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#Anders and Huberの(AH)正規化本番
cds <- newCountDataSet(data, data.cl)  #CountDataSetオブジェクトを作成してcdsに格納
cds <- estimateSizeFactors(cds)        #size factorを計算し、結果をcdsに格納

#正規化後のデータをファイルに出力
normalized.count <- counts(cds, normalized=TRUE)#正規化後のデータを取り出してnormalized.countに格納
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータの列ごとの各種要約統計量を表示
summary(normalized.count)              #normalized.countの各列(つまりサンプル)の要約統計量を表示
	

正規化 | サンプル間 | 2群間 | 複製なし | iDEGES/DESeq(Sun_2013)

iDEGES/edgeR法(Sun et al., BMC Bioinformatics, 2013)は、サンプルデータ14 (data_hypodata_1vs1.txt)の1 sample vs. 1 sampleのような「複製なし」データの正規化は実行できません。 理由はstep2で用いるexact test(iDEGES/edgeR法の場合)が複製ありを前提としているためです。 iDEGES/DESeq法(Sun et al., BMC Bioinformatics, 2013)は複製なしの二群間比較用データの正規化を「正規化時に悪さをするDEGを正規化前に除いてしまえ (DEG elimination strategy; DEGES; でげす)」というTbT法論文(Kadota et al., 2012)で提唱した戦略を DESeqパッケージ中の関数(正規化法やDEG検出法)のみで実現したDESeq-(DESeq-DESeq)n(デフォルトはn=3)からなるパイプラインです。 ここでは、iDEGES/DESeq正規化係数の算出法とiDEGES/DESeq正規化後のデータを得る手順などを示しています。 が、基本的に正規化だけで終わることはありませんので、ここの項目のみでは何の役にも立ちませんのであしからず。。。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定    
param_G2 <- 1                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, iteration=3)#正規化を実行した結果をtccに格納(iDEGES/edgeRのときと同じコマンドだが、内部的にカウント行列の列数で自動判定してiDEGES/DESeqを採用している)

#正規化後のデータをファイルに出力
normalized.count <- getNormalizedData(tcc)#正規化後のデータを取り出してnormalized.countに格納
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみを用いて(logスケールで)boxplot
nonDEG <- 2001:10000                   #non-DEGの位置情報をnonDEGに格納
boxplot(log(normalized.count[nonDEG, ]))#boxplot (non-DEGなので分布が揃っているほどよい正規化法であることを意味する。一部0のlogをとろうとしているので警告が出る、、、が気にしない)

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみについて要約統計量を表示(サンプル間の数値が揃っているほどよい)
summary(normalized.count[nonDEG, ])    #各列(つまりサンプル)の要約統計量を表示
apply(normalized.count[nonDEG, ], 2, median)#各列(つまりサンプル)のmedian(中央値)を表示(17.33728 18.71540)

#iDEGES/DESeq正規化のstep2で検出されたpotential DEGの結果(step3で使われないものたち)を表示
table(tcc$private$DEGES.potentialDEG)  #0 (nonDEGに相当)が9,500個、1 (G1で高発現のDEGに相当)が500個、2 (G2で高発現のDEGに相当)が0個と判定されていたことがわかるが、これはバグで実際にはG2で高発現のものもある。

#iDEGES/DESeq正規化係数を表示
tcc$norm.factors                       #正規化係数を表示(0.7707068 1.2292932)

#このデータは「答え」がわかっているものなので、答え(DEG or non-DEG)の情報込みで正規化後のデータのM-A plotを描画
tcc$private$simulation <- TRUE         #おまじない
tcc$simulation$trueDEG <- c(rep(1, 1800), rep(2, 200), rep(0, 8000))#真の情報からなるベクトルをtccクラスオブジェクトに格納
plot(tcc, median.lines=TRUE)           #log-ratio(縦軸の値)のmedian値をそれぞれの色で表示:non-DEG(黒; 0.110), G1で高発現のDEG(青; -1.890), G2で高発現のDEG(赤; 2.163)
	

正規化 | サンプル間 | 2群間 | 複製なし | TMM(Robinson_2010)

TMM正規化法をTCCパッケージを用いて行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定    
param_G2 <- 1                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized.count <- getNormalizedData(tcc)#正規化後のデータを取り出してnormalized.countに格納
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみを用いて(logスケールで)boxplot
nonDEG <- 2001:10000                   #non-DEGの位置情報をnonDEGに格納
boxplot(log(normalized.count[nonDEG, ]))#boxplot (non-DEGなので分布が揃っているほどよい正規化法であることを意味する。一部0のlogをとろうとしているので警告が出る、、、が気にしない)

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみについて要約統計量を表示(サンプル間の数値が揃っているほどよい)
summary(normalized.count[nonDEG, ])    #各列(つまりサンプル)の要約統計量を表示
apply(normalized.count[nonDEG, ], 2, median)#各列(つまりサンプル)のmedian(中央値)を表示(17.04961 19.06260)

#TMM正規化係数を表示
tcc$norm.factors                       #正規化係数を表示(0.7874063 1.2125937)

#このデータは「答え」がわかっているものなので、答え(DEG or non-DEG)の情報込みで正規化後のデータのM-A plotを描画
tcc$private$simulation <- TRUE         #おまじない
tcc$simulation$trueDEG <- c(rep(1, 1800), rep(2, 200), rep(0, 8000))#真の情報からなるベクトルをtccクラスオブジェクトに格納
plot(tcc, median.lines=TRUE)           #log-ratio(縦軸の値)のmedian値をそれぞれの色で表示:non-DEG(黒; 0.161), G1で高発現のDEG(青; -1.839), G2で高発現のDEG(赤; 2.213)
	

正規化 | サンプル間 | 2群間 | 複製なし | median(Anders_2010)

DESeqというRパッケージ中で採用されている正規化法を採用して得られた正規化後のデータを得るやり方を示します。

DESeqは正規化係数(normalization factor)という言葉を使わずにsize factorという言葉を使っています。 これはTbTやTMM正規化係数とは異なるものなので、ここでは「DESeqの正規化係数」を得ています。 また、この方法はTCCパッケージ中の関数を用いても実行可能です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定    
param_G2 <- 1                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized.count <- getNormalizedData(tcc)#正規化後のデータを取り出してnormalized.countに格納
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみを用いて(logスケールで)boxplot
nonDEG <- 2001:10000                   #non-DEGの位置情報をnonDEGに格納
boxplot(log(normalized.count[nonDEG, ]))#boxplot (non-DEGなので分布が揃っているほどよい正規化法であることを意味する。一部0のlogをとろうとしているので警告が出る、、、が気にしない)

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみについて要約統計量を表示(サンプル間の数値が揃っているほどよい)
summary(normalized.count[nonDEG, ])    #各列(つまりサンプル)の要約統計量を表示
apply(normalized.count[nonDEG, ], 2, median)#各列(つまりサンプル)のmedian(中央値)を表示(16.83471 17.03814 16.87943 19.26712 18.12903 18.16272)

#正規化係数を表示
tcc$norm.factors                       #正規化係数を表示(0.7974195 0.8893788 0.7709404 1.1996644 1.1459043 1.1966927)

#このデータは「答え」がわかっているものなので、答え(DEG or non-DEG)の情報込みで正規化後のデータのM-A plotを描画
tcc$private$simulation <- TRUE         #おまじない
tcc$simulation$trueDEG <- c(rep(1, 1800), rep(2, 200), rep(0, 8000))#真の情報からなるベクトルをtccクラスオブジェクトに格納
plot(tcc, median.lines=TRUE)           #log-ratio(縦軸の値)のmedian値をそれぞれの色で表示:non-DEG(黒; 0.186), G1で高発現のDEG(青; -1.809), G2で高発現のDEG(赤; 2.196)
	

正規化 | サンプル間 | 3群間 | 複製あり | iDEGES/edgeR(Sun_2013)

TCCパッケージ(Sun et al., BMC Bioinformatics, 2013)から利用可能なiDEGES/edgeR正規化法の実行手順を示します。

ここでは、iDEGES/edgeR法の実体である「TMM-(edgeR-TMM)n」パイプラインのnの値(iterationの回数)を3として実行します。RPKMのような長さ補正は行っていませんのでご注意ください。ここの出力結果はRPMに相当するものです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で高発現、gene_2101〜gene_2700がG2群で高発現、gene_2701〜gene_3000がG3群で高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
data <- getNormalizedData(tcc)         #正規化後のデータを取り出してdataに格納

#ファイルに保存
tmp <- cbind(rownames(data), data)     #「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で高発現、gene_2101〜gene_2700がG2群で高発現、gene_2701〜gene_3000がG3群で高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

non-DEGの分布について確認しています。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_nonDEG <- 3001:10000             #non-DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
data <- getNormalizedData(tcc)         #正規化後のデータを取り出してdataに格納

#non-DEGの分布を確認(揃っているほどよい正規化法)
summary(data[param_nonDEG,])           #正規化後のnon-DEGデータの要約統計量を表示
apply(data[param_nonDEG,], 2, median)  #正規化後のnon-DEGデータの中央値を表示
	

3. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
data <- getNormalizedData(tcc)         #正規化後のデータを取り出してdataに格納

#ファイルに保存
tmp <- cbind(rownames(data), data)     #「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

non-DEGの分布について確認しています。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_nonDEG <- 3001:10000             #non-DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
data <- getNormalizedData(tcc)         #正規化後のデータを取り出してdataに格納

#non-DEGの分布を確認(揃っているほどよい正規化法)
summary(data[param_nonDEG,])           #正規化後のnon-DEGデータの要約統計量を表示
apply(data[param_nonDEG,], 2, median)  #正規化後のnon-DEGデータの中央値を表示
	

正規化 | サンプル間 | 3群間 | 複製あり | TMM(Robinson_2010)

edgeRパッケージから利用可能なTMM正規化法(Robinson and Oshlack, Genome Biol., 2010)の実行手順を示します。RPKMのような長さ補正は行っていませんのでご注意ください。ここの出力結果はRPMに相当するものです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で高発現、gene_2101〜gene_2700がG2群で高発現、gene_2701〜gene_3000がG3群で高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納
data <- getNormalizedData(tcc)         #正規化後のデータを取り出してdataに格納

#ファイルに保存
tmp <- cbind(rownames(data), data)     #「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で高発現、gene_2101〜gene_2700がG2群で高発現、gene_2701〜gene_3000がG3群で高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

non-DEGの分布について確認しています。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_nonDEG <- 3001:10000             #non-DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納
data <- getNormalizedData(tcc)         #正規化後のデータを取り出してdataに格納

#non-DEGの分布を確認(揃っているほどよい正規化法)
summary(data[param_nonDEG,])           #正規化後のnon-DEGデータの要約統計量を表示
apply(data[param_nonDEG,], 2, median)  #正規化後のnon-DEGデータの中央値を表示
	

3. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納
data <- getNormalizedData(tcc)         #正規化後のデータを取り出してdataに格納

#ファイルに保存
tmp <- cbind(rownames(data), data)     #「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

non-DEGの分布について確認しています。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_nonDEG <- 3001:10000             #non-DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納
data <- getNormalizedData(tcc)         #正規化後のデータを取り出してdataに格納

#non-DEGの分布を確認(揃っているほどよい正規化法)
summary(data[param_nonDEG,])           #正規化後のnon-DEGデータの要約統計量を表示
apply(data[param_nonDEG,], 2, median)  #正規化後のnon-DEGデータの中央値を表示
	

解析 | 一般 | アラインメント(ペアワイズ;基本編1)

グローバルアラインメント(global alignment;EMBOSSのneedleに相当)や ローカルアラインメント(local alignment; EMBOSSのwaterに相当)をやってくれます。 ここでは、3つの塩基配列(seq1, seq2, and seq3)からなるmulti-FASTA形式のファイルtest2.fastaや、通常のfasta形式の二つのファイル(seq2.fasta, seq3.fasta)の比較を例題とします。

ちなみにこのページでは、「配列A vs. 配列B」という表記法で、配列Bに相当するほうが"subject"で配列Aに相当するほうが"pattern"です。

また、置換行列(nucleotideSubstitutionMatrix)を指定してやる必要がありますが、ここではEMBOSSの塩基配列比較時にデフォルトで用いている「EDNAFULL」という置換行列を用います。

local alignmentの結果は極めてEMBOSSのものと似ていますが(EMBOSSのスコア=34, Rのスコア=33)、global alignmentの結果は相当違っていることは認識しています(2010/6/8現在)。 おそらくギャップペナルティを計算する際の数式の違いによるものだろうと楽観していますが、もし間違っていればご指摘よろしくお願いします。

BLOSUM62やPAM250などの代表的な置換行列もftp://ftp.ncbi.nih.gov/blast/matrices/から取得することができます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 「seq2.fasta vs. seq3.fasta」のlocal alignmentの場合:

in_f1 <- "seq2.fasta"                  #読み込みたいファイル名を指定してin_f1に格納
in_f2 <- "seq3.fasta"                  #読み込みたいファイル名を指定してin_f2に格納
param1 <- "local"                      #アラインメントのタイプ(local, global, overlap, global-local, local-globalのいずれか)を指定
param2 <- -10                          #gap opening panalty(ギャップ開始ペナルティ)を指定(-10がデフォルト)
param3 <- -0.5                         #gap extension penalty(ギャップ伸長ペナルティ)を指定(-4がデフォルト)

file <- "ftp://ftp.ncbi.nih.gov/blast/matrices/NUC.4.4"#置換行列ファイル(EDNAFULLのものはNUC.4.4に相当)のURLをfileに格納
submat <- as.matrix(read.table(file, check.names=FALSE))#fileを読み込んでsubmatに格納
library(Biostrings)                    #パッケージの読み込み
read1 <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
read2 <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み
out <- pairwiseAlignment(pattern=read1,subject=read2,type=param1,#アラインメントを実行し、結果をoutに格納
           gapOpening=param2,gapExtension=param3,substitutionMatrix=submat)#アラインメントを実行し、結果をoutに格納

#以下は(こんなこともできますという)おまけ
#out中の情報抽出あれこれ:
out@pattern                            #in_f1で指定した配列中のアラインメントされた領域を表示
out@subject                            #in_f2で指定した配列中のアラインメントされた領域を表示
out@score                              #アラインメントスコアを表示

#二つの配列のIDとアラインメントスコアをファイルに出力:
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
tmp <- cbind(names(read1), names(read2), out@score)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
	

2. multi-FASTAファイル中の「seq3 vs. seq1」のglobal alignmentの場合:

in_f <- "test2.fasta"                  #読み込みたいmulti-FASTA形式のファイル名を指定してin_fに格納
param1 <- "global"                     #アラインメントのタイプ(local, global, overlap, global-local, local-globalのいずれか)を指定
param2 <- 3                            #multi-FASTA入力ファイルの何番目の配列かを指定
param3 <- 1                            #multi-FASTA入力ファイルの何番目の配列かを指定
param4 <- -10                          #gap opening panalty(ギャップ開始ペナルティ)を指定(-10がデフォルト)
param5 <- -0.5                         #gap extension penalty(ギャップ伸長ペナルティ)を指定(-4がデフォルト)

file <- "ftp://ftp.ncbi.nih.gov/blast/matrices/NUC.4.4"#置換行列ファイル(EDNAFULLのものはNUC.4.4に相当)のURLをfileに格納
submat <- as.matrix(read.table(file, check.names=FALSE))#fileを読み込んでsubmatに格納
library(Biostrings)                    #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
out <- pairwiseAlignment(pattern=reads[param2],subject=reads[param3],type=param1,#アラインメントを実行し、結果をoutに格納
           gapOpening=param4,gapExtension=param5,substitutionMatrix=submat)#アラインメントを実行し、結果をoutに格納

#以下は(こんなこともできますという)おまけ
#二つの配列のID,アラインメントスコア,%identidyをファイルに出力:
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
tmp <- cbind(names(reads[param2]), names(reads[param3]), score(out), pid(out))#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 一般 | アラインメント(ペアワイズ;基本編2)

アラインメント(ペアワイズ;基本編1)では、二つの配列間のアラインメントについて、その基本的な利用法とアラインメントスコアを抽出する方法について述べましたが、 他にも配列一致度など様々な情報を抽出することができます。そこで、ここでは「seq2 vs. seq3のlocal alignment結果」からどのような情報が取れるかなどを中心に手広く紹介します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

#まずはアラインメント結果outの取得
in_f1 <- "seq2.fasta"                  #読み込みたいファイル名を指定してin_f1に格納
in_f2 <- "seq3.fasta"                  #読み込みたいファイル名を指定してin_f2に格納
param1 <- "local"                      #アラインメントのタイプ(local, global, overlap, global-local, local-globalのいずれか)を指定
param2 <- -10                          #gap opening panalty(ギャップ開始ペナルティ)を指定(-10がデフォルト)
param3 <- -0.5                         #gap extension penalty(ギャップ伸長ペナルティ)を指定(-4がデフォルト)

file <- "ftp://ftp.ncbi.nih.gov/blast/matrices/NUC.4.4"#置換行列ファイル(EDNAFULLのものはNUC.4.4に相当)のURLをfileに格納
submat <- as.matrix(read.table(file, check.names=FALSE))#fileを読み込んでsubmatに格納
library(Biostrings)                    #パッケージの読み込み
read1 <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
read2 <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み
out <- pairwiseAlignment(pattern=read1,subject=read2,type=param1,#アラインメントを実行し、結果をoutに格納
           gapOpening=param2,gapExtension=param3,substitutionMatrix=submat)#アラインメントを実行し、結果をoutに格納

#ここからがいろいろな情報を取得するやり方
out                                    #まずはデフォルトのoutの中身を表示
score(out)                             #アラインメントスコアを表示
pattern(out)                           #左側の配列(この場合seq2に相当;pattern)のアラインメントされた領域を表示
subject(out)                           #右側の配列(この場合seq2に相当;subject)のアラインメントされた領域を表示
nchar(out)                             #アラインメントされた領域(gapを含む)の長さを表示
nmatch(out)                            #アラインメントされた領域の一致塩基数を表示
nmismatch(out)                         #アラインメントされた領域の不一致塩基数を表示
nedit(out)                             #アラインメントされた領域のレーベンシュタイン距離(Levenshtein distance)を表示(nedit(out) + nmatch(out) = nchar(out)です)
pid(out)                               #アラインメントされた領域の配列一致度(percent identity)を表示
	

解析 | 一般 | アラインメント(ペアワイズ;応用編)

グローバルアラインメント(global alignment;EMBOSSのneedleに相当)や ローカルアラインメント(local alignment; EMBOSSのwaterに相当)をやってくれます。 ここでは、3つの塩基配列(seq1, seq2, and seq3)からなるmulti-FASTA形式のファイルtest2.fastaを入力として、「それ以外 vs. 特定の配列」のペアワイズアラインメントを一気にやる方法を紹介します

ちなみにこのページでは、「配列A vs. 配列B」という表記法で、配列Bに相当するほうが"subject"で配列Aに相当するほうが"pattern"です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 特定の配列が入力multi-FASTAファイルの1番目にある場合:

in_f <- "test2.fasta"                  #読み込みたいmulti-FASTA形式のファイル名を指定してin_fに格納
param1 <- "local"                      #アラインメントのタイプ(local, global, overlap, global-local, local-globalのいずれか)を指定
param2 <- 1                            #multi-FASTA入力ファイルの何番目の配列かを指定
param3 <- -10                          #gap opening panalty(ギャップ開始ペナルティ)を指定(-10がデフォルト)
param4 <- -0.5                         #gap extension penalty(ギャップ伸長ペナルティ)を指定(-4がデフォルト)

file <- "ftp://ftp.ncbi.nih.gov/blast/matrices/NUC.4.4"#置換行列ファイル(EDNAFULLのものはNUC.4.4に相当)のURLをfileに格納
submat <- as.matrix(read.table(file, check.names=FALSE))#fileを読み込んでsubmatに格納
library(Biostrings)                    #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
out <- pairwiseAlignment(pattern=reads[-param2],subject=reads[param2],type=param1,#アラインメントを実行し、結果をoutに格納
           gapOpening=param3,gapExtension=param4,substitutionMatrix=submat)#アラインメントを実行し、結果をoutに格納

#以下は(こんなこともできますという)おまけ
#比較している配列の組み合わせ数などの情報を得たい:
names(reads[param2])                   #param2で指定した特定の配列のIDを表示("subject"に相当)
names(reads[-param2])                  #param2で指定した特定の配列"以外"のID(s)を表示("pattern"に相当)
length(reads[-param2])                 #ペアワイスアラインメント(pairwise alignment)をいくつやっているのか表示

#out中の情報抽出あれこれ:
out[1]                                 #1つ目のペアワイズアラインメント結果を表示
out[1]@score                           #1つ目のペアワイズアラインメント結果のスコアを表示
score(out[1])                          #1つ目のペアワイズアラインメント結果のスコアを表示
out[2]                                 #2つ目のペアワイズアラインメント結果を表示
out[2]@score                           #2つ目のペアワイズアラインメント結果のスコアを表示
score(out[2])                          #2つ目のペアワイズアラインメント結果のスコアを表示
score(out)                             #ペアワイズアラインメント結果のスコアを全て表示

#比較した二配列のIDとアラインメントスコアをファイルに出力:
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
tmp <- NULL
for(i in 1:length(reads[-param2])){
    tmp <- rbind(tmp, c(names(reads[-param2])[i], names(reads[param2]), out[i]@score))#保存したい情報をtmpに格納
}
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
	

2. 特定の配列が入力multi-FASTAファイルの3番目にある場合:

in_f <- "test2.fasta"                  #読み込みたいmulti-FASTA形式のファイル名を指定してin_fに格納
param1 <- "local"                      #アラインメントのタイプ(local, global, overlap, global-local, local-globalのいずれか)を指定
param2 <- 3                            #multi-FASTA入力ファイルの何番目の配列かを指定
param3 <- -10                          #gap opening panalty(ギャップ開始ペナルティ)を指定(-10がデフォルト)
param4 <- -0.5                         #gap extension penalty(ギャップ伸長ペナルティ)を指定(-4がデフォルト)

file <- "ftp://ftp.ncbi.nih.gov/blast/matrices/NUC.4.4"#置換行列ファイル(EDNAFULLのものはNUC.4.4に相当)のURLをfileに格納
submat <- as.matrix(read.table(file, check.names=FALSE))#fileを読み込んでsubmatに格納
library(Biostrings)                    #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
out <- pairwiseAlignment(pattern=reads[-param2],subject=reads[param2],type=param1,#アラインメントを実行し、結果をoutに格納
           gapOpening=param3,gapExtension=param4,substitutionMatrix=submat)#アラインメントを実行し、結果をoutに格納

#以下は(こんなこともできますという)おまけ
#比較している配列の組み合わせ数などの情報を得たい:
names(reads[param2])                   #param2で指定した特定の配列のIDを表示("subject"に相当)
names(reads[-param2])                  #param2で指定した特定の配列"以外"のID(s)を表示("pattern"に相当)
length(reads[-param2])                 #ペアワイスアラインメント(pairwise alignment)をいくつやっているのか表示

#out中の情報抽出あれこれ:
out[1]                                 #1つ目のペアワイズアラインメント結果を表示
out[1]@score                           #1つ目のペアワイズアラインメント結果のスコアを表示
score(out[1])                          #1つ目のペアワイズアラインメント結果のスコアを表示
out[2]                                 #2つ目のペアワイズアラインメント結果を表示
out[2]@score                           #2つ目のペアワイズアラインメント結果のスコアを表示
score(out[2])                          #2つ目のペアワイズアラインメント結果のスコアを表示
score(out)                             #ペアワイズアラインメント結果のスコアを全て表示

#比較した二配列のIDとアラインメントスコアをファイルに出力:
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
tmp <- NULL
for(i in 1:length(reads[-param2])){
    tmp <- rbind(tmp, c(names(reads[-param2])[i], names(reads[param2]), out[i]@score))#保存したい情報をtmpに格納
}
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 一般 | パターンマッチング

リファレンス配列(マップされる側)から文字列検索(マップする側)を行うやり方を示します。マッピングと同じです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. DHFR.fastaを入力として、"AATGCTCAGGTA"でキーワード探索を行う場合(No hitです...):

(Dihydrofolate reductase (DHFR)という塩基配列(NM_000791)のFASTA形式ファイルで、 Zinc Finger Nuclease (ZFN)認識配列(AATGCTCAGGTA)領域の探索の場合をイメージしています)

in_f <- "DHFR.fasta"                   #入力ファイル名を指定してin_fに格納
param <- "AATGCTCAGGTA"                #調べたい配列パターンを指定してparamに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
out <- vmatchPattern(pattern=param, subject=fasta)#paramで指定した配列と100%マッチの領域を探索して結果をoutに格納
out[[1]]                               #outの中身を表示(入力ファイル中には一致領域がないことがわかる)
	

2. DHFR.fastaを入力として、"CCTACTATGT"でキーワード探索を行う場合(存在することが分かっている断片配列):

in_f <- "DHFR.fasta"                   #入力ファイル名を指定してin_fに格納
param <- "CCTACTATGT"                  #調べたい配列パターンを指定してparamに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
out <- vmatchPattern(pattern=param, subject=fasta)#paramで指定した配列と100%マッチの領域を探索して結果をoutに格納
out[[1]]                               #outの中身を表示(入力ファイルの(13,22)の位置に一致領域があることを示している)
unlist(out)                            #outの中身を表示(入力ファイルの(13,22)の位置に一致領域があることを示している)
start(unlist(out))                     #一致領域のstart位置情報の抽出
	

3. DHFR.fastaを入力として、"CCTACTATGT"でキーワード探索を行った結果をファイルに保存する場合:

in_f <- "DHFR.fasta"                   #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param <- "CCTACTATGT"                  #調べたい配列パターンを指定してparamに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- vmatchPattern(pattern=param, subject=fasta)#paramで指定した配列と100%マッチの領域を探索した結果をhogeに格納
out <- cbind(start(unlist(hoge)), end(unlist(hoge)))#一致領域の位置情報をoutに格納
colnames(out) <- c("start", "end")     #列名を付与
out                                    #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

4. multi-FASTAファイルhoge4.faを入力として、"AGG"でキーワード探索を行う場合:

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param <- "AGG"                         #調べたい配列パターンを指定してparamに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- vmatchPattern(pattern=param, subject=fasta)#paramで指定した配列と100%マッチの領域を探索して結果をhogeに格納
out <- cbind(start(unlist(hoge)), end(unlist(hoge)))#一致領域の位置情報をoutに格納
colnames(out) <- c("start", "end")     #列名を付与
rownames(out) <- names(unlist(hoge))   #行名を付与
out                                    #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(out), out)       #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. multi-FASTAファイルhoge4.faをリファレンス配列(マップされる側)として、10リードからなるdata_seqlogo1.txtでマッピングを行う場合:

in_f1 <- "hoge4.fa"                    #入力ファイル名を指定してin_f1に格納(マップされる側)
in_f2 <- "data_seqlogo1.txt"           #入力ファイル名を指定してin_f2に格納(マップする側)
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
reads <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み

#本番
out <- c("in_f2", "in_f1", "start", "end")#最終的に得る出力ファイルのヘッダー情報を指定してoutに格納(4列のデータを得る)
for(i in 1:length(reads)){             #リード数分だけループを回す
    hoge <- vmatchPattern(pattern=as.character(reads[i]), subject=fasta)#オブジェクトreads中の各塩基配列と100%マッチの領域を探索して結果をhogeに格納
    hoge1 <- cbind(start(unlist(hoge)), end(unlist(hoge)))#一致領域の(start, end)の位置情報をhoge1に格納
    hoge2 <- names(unlist(hoge))       #ヒットしたリファレンス配列中のIDをhoge2に格納
    hoge3 <- rep(as.character(reads[i]), length(hoge2))#hoge2の要素数分だけ、マップする側の配列(in_f2で指定するものに相当)のIDをhoge3に格納
    out <- rbind(out, cbind(hoge3, hoge2, hoge1))#cbind(hoge3, hoge2, hoge1)で表される欲しい情報をどんどんオブジェクトoutの下に追加している(ループが回るたびにどんどん行数が増えていっているイメージ)
}
head(out)                              #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#outの中身を指定したファイル名で保存
	

6. multi-FASTAファイルhoge4.faをリファレンス配列(マップされる側)として、4リードからなるdata_reads.txtでマッピングを行う場合:

in_f1 <- "hoge4.fa"                    #入力ファイル名を指定してin_f1に格納(マップされる側)
in_f2 <- "data_reads.txt"              #入力ファイル名を指定してin_f2に格納(マップする側)
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
reads <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み

#本番
out <- c("in_f2", "in_f1", "start", "end")#最終的に得る出力ファイルのヘッダー情報を指定してoutに格納(4列のデータを得る)
for(i in 1:length(reads)){             #リード数分だけループを回す
    hoge <- vmatchPattern(pattern=as.character(reads[i]), subject=fasta)#オブジェクトreads中の各塩基配列と100%マッチの領域を探索して結果をhogeに格納
    hoge1 <- cbind(start(unlist(hoge)), end(unlist(hoge)))#一致領域の(start, end)の位置情報をhoge1に格納
    hoge2 <- names(unlist(hoge))       #ヒットしたリファレンス配列中のIDをhoge2に格納
    hoge3 <- rep(as.character(reads[i]), length(hoge2))#hoge2の要素数分だけ、マップする側の配列(in_f2で指定するものに相当)のIDをhoge3に格納
    out <- rbind(out, cbind(hoge3, hoge2, hoge1))#cbind(hoge3, hoge2, hoge1)で表される欲しい情報をどんどんオブジェクトoutの下に追加している(ループが回るたびにどんどん行数が増えていっているイメージ)
}
head(out)                              #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#outの中身を指定したファイル名で保存
	

7. multi-FASTAファイルhoge4.faをリファレンス配列(マップされる側)として、4リードからなるdata_reads.txtでマッピングを行う場合(hoge1オブジェクトの作成のところの記述の仕方が若干異なる):

in_f1 <- "hoge4.fa"                    #入力ファイル名を指定してin_f1に格納(マップされる側)
in_f2 <- "data_reads.txt"              #入力ファイル名を指定してin_f2に格納(マップする側)
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
reads <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み

#本番
out <- c("in_f2", "in_f1", "start", "end")#最終的に得る出力ファイルのヘッダー情報を指定してoutに格納(4列のデータを得る)
for(i in 1:length(fasta)){             #リファレンス配列数分だけループを回す
    hoge <- matchPDict(PDict(reads), fasta[[i]])#リファレンス配列中のi番目の配列に対してオブジェクトreads中の全配列をmatchPDict関数を用いてマッピングした結果をhogeに格納
    hoge1 <- cbind(start(unlist(hoge)), end(unlist(hoge)))#一致領域の(start, end)の位置情報をhoge1に格納
    hoge2 <- names(unlist(hoge))       #ヒットしたリードのIDをhoge2に格納
    hoge3 <- rep(names(fasta[i]), length(hoge2))#hoge2の要素数分だけ、マップされる側のリファレンス配列(in_f1で指定するものに相当)のIDをhoge3に格納
    out <- rbind(out, cbind(hoge3, hoge2, hoge1))#cbind(hoge3, hoge2, hoge1)で表される欲しい情報をどんどんオブジェクトoutの下に追加している(ループが回るたびにどんどん行数が増えていっているイメージ)
    #as.integer(coverage(hoge, 1, width(fasta[i])))
}
head(out)                              #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#outの中身を指定したファイル名で保存
	

解析 | 一般 | GC含量 (GC contents)

multi-FASTA形式ファイルを読み込んで配列ごとのGC含量 (GC contents)を出力するやり方を示します。 出力ファイルは、「description」「CGの総数」「ACGTの総数」「配列長」「%GC含量」としています。 尚、%GC含量は「CGの総数/ACGTの総数」で計算しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を各配列ごとにカウントした結果をhogeに格納
CG <- rowSums(hoge[,2:3])              #C,Gの総数を計算してCGに格納
ACGT <- rowSums(hoge[,1:4])            #A,C,G,Tの総数を計算してACGTに格納
GC_content <- CG/ACGT*100              #%GC含量を計算してGC_contentに格納

#ファイルに保存
tmp <- cbind(names(fasta), CG, ACGT, width(fasta), GC_content)#保存したい情報をtmpに格納
colnames(tmp) <- c("description", "CG", "ACGT", "Length", "%GC_contents")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

2. h_rna.fastaファイルの場合:

in_f <- "h_rna.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を各配列ごとにカウントした結果をhogeに格納
CG <- rowSums(hoge[,2:3])              #C,Gの総数を計算してCGに格納
ACGT <- rowSums(hoge[,1:4])            #A,C,G,Tの総数を計算してACGTに格納
GC_content <- CG/ACGT*100              #%GC含量を計算してGC_contentに格納

#ファイルに保存
tmp <- cbind(names(fasta), CG, ACGT, width(fasta), GC_content)#保存したい情報をtmpに格納
colnames(tmp) <- c("description", "CG", "ACGT", "Length", "%GC_contents")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

3. test1.fastaファイルの場合:

in_f <- "test1.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を各配列ごとにカウントした結果をhogeに格納
CG <- rowSums(hoge[,2:3])              #C,Gの総数を計算してCGに格納
ACGT <- rowSums(hoge[,1:4])            #A,C,G,Tの総数を計算してACGTに格納
GC_content <- CG/ACGT*100              #%GC含量を計算してGC_contentに格納

#ファイルに保存
tmp <- cbind(names(fasta), CG, ACGT, width(fasta), GC_content)#保存したい情報をtmpに格納
colnames(tmp) <- c("description", "CG", "ACGT", "Length", "%GC_contents")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

4. 120MB程度のシロイヌナズナゲノムのmulti-FASTAファイル(TAIR10_chr_all.fas)の場合:

in_f <- "TAIR10_chr_all.fas"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を各配列ごとにカウントした結果をhogeに格納
CG <- rowSums(hoge[,2:3])              #C,Gの総数を計算してCGに格納
ACGT <- rowSums(hoge[,1:4])            #A,C,G,Tの総数を計算してACGTに格納
GC_content <- CG/ACGT*100              #%GC含量を計算してGC_contentに格納

#ファイルに保存
tmp <- cbind(names(fasta), CG, ACGT, width(fasta), GC_content)#保存したい情報をtmpに格納
colnames(tmp) <- c("description", "CG", "ACGT", "Length", "%GC_contents")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

seqLogoパッケージを用いてsequence logos (Schneider and Stephens, 1990)を実行するやり方を示します。 ここでは、multi-FASTAファイルを読み込んでポジションごとの出現頻度を調べる目的で利用します。上流-35 bpにTATA boxがあることを示す目的などに利用されます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 入力ファイルがmulti-FASTA形式のファイル(test1.fasta)の場合:

in_f <- "test1.fasta"                  #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番(sequence logoを実行)
hoge <- consensusMatrix(fasta, as.prob=T, baseOnly=T)#各ポジションの塩基組成(probability)を計算してhogeに格納。as.prob=Fにすることで塩基の出現割合ではなく出現頻度にすることもできる
out <- makePWM(hoge[1:4,])             #hogeはACGT以外の塩基(例えばN)のprobabilityもotherという5番目の行に出力するが、makePWM関数はACGTの最初の4行分の行列データのみ許容して受け付け、情報量(information content; ic)などを計算してくれる
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
	

2. 入力ファイルがmulti-FASTA形式のファイル(data_seqlogo1.txt)の場合:

in_f <- "data_seqlogo1.txt"            #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番(sequence logoを実行)
hoge <- consensusMatrix(fasta, as.prob=T, baseOnly=T)#各ポジションの塩基組成(probability)を計算してhogeに格納。as.prob=Fにすることで塩基の出現割合ではなく出現頻度にすることもできる
out <- makePWM(hoge[1:4,])             #hogeはACGT以外の塩基(例えばN)のprobabilityもotherという5番目の行に出力するが、makePWM関数はACGTの最初の4行分の行列データのみ許容して受け付け、情報量(information content; ic)などを計算してくれる
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
	

3. 入力ファイルがmulti-FASTA形式のファイル(data_seqlogo1.txt)の場合:

得られた結果をPNG形式ファイルとして保存するやり方です。

in_f <- "data_seqlogo1.txt"            #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番(sequence logoを実行)
hoge <- consensusMatrix(fasta, as.prob=T, baseOnly=T)#各ポジションの塩基組成(probability)を計算してhogeに格納。as.prob=Fにすることで塩基の出現割合ではなく出現頻度にすることもできる
out <- makePWM(hoge[1:4,])             #hogeはACGT以外の塩基(例えばN)のprobabilityもotherという5番目の行に出力するが、makePWM関数はACGTの最初の4行分の行列データのみ許容して受け付け、情報量(information content; ic)などを計算してくれる

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
dev.off()                              #おまじない
	

4. 入力ファイルが塩基組成のファイル(data_seqlogo2.txt)の場合:

全部で4行からなり、1行目がA, 2行目がC, 3行目がG, そして4行目がTの並びになっているという前提です。 列数は塩基配列の長さ分だけ長くなってかまいません。

in_f <- "data_seqlogo2.txt"            #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
hoge <- read.table(in_f)               #in_fで指定したファイルの読み込み

#本番(sequence logoを実行)
out <- makePWM(hoge)                   #情報量(information content; ic)を計算している
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
	

5. 入力ファイルがmulti-FASTA形式のファイル(TAIR10_upstream_500_20101028)の場合:

Arabidopsisの上流500bpの配列セットです。500bpと長いため、461-500bpの範囲のみについて解析し、得られた図をファイルに保存するやり方です。 以下はダウンロードしたファイルの拡張子として、"fa"を付加しているという前提です。

in_f <- "TAIR10_upstream_500_20101028.fa"#入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param1 <- c(461, 500)                  #抽出したい範囲の始点と終点を指定
param2 <-  500                         #入力ファイルの配列長を指定
param_fig <- c(700, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#前処理(配列長が500bpのもののみフィルタリング後、解析したいサブセットを抽出)
obj <- as.logical(width(fasta) == param2)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなるもののみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです
fasta <- subseq(fasta, param1[1], param1[2])#解析したい範囲を切り出してfastaに格納
fasta                                  #確認してるだけです

#本番(sequence logoを実行)
hoge <- consensusMatrix(fasta, as.prob=T, baseOnly=T)#各ポジションの塩基組成(probability)を計算してhogeに格納。as.prob=Fにすることで塩基の出現割合ではなく出現頻度にすることもできる
out <- makePWM(hoge[1:4,])             #hogeはACGT以外の塩基(例えばN)のprobabilityもotherという5番目の行に出力するが、makePWM関数はACGTの最初の4行分の行列データのみ許容して受け付け、情報量(information content; ic)などを計算してくれる

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
dev.off()                              #おまじない
	

6. 入力ファイルがmulti-FASTA形式のファイル(TAIR10_upstream_1000_20101104)の場合:

Arabidopsisの上流1000bpの配列セットです。1000bpと長いため、951-1000bpの範囲のみについて解析し、得られた図をファイルに保存するやり方です。 ファイル中の1塩基目が転写開始点からもっとも遠く離れたところで、1000塩基目が転写開始点のすぐ隣ということになります。 以下はダウンロードしたファイルの拡張子として、"fasta"を付加しているという前提です。

in_f <- "TAIR10_upstream_1000_20101104.fasta"#入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param1 <- c(951, 1000)                 #抽出したい範囲の始点と終点を指定
param2 <-  1000                        #入力ファイルの配列長を指定
param_fig <- c(800, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#前処理(配列長が500bpのもののみフィルタリング後、解析したいサブセットを抽出)
obj <- as.logical(width(fasta) == param2)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなるもののみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです
fasta <- subseq(fasta, start=param1[1], end=param1[2])#解析したい範囲を切り出してfastaに格納
fasta                                  #確認してるだけです

#本番(sequence logoを実行)
hoge <- consensusMatrix(fasta, as.prob=T, baseOnly=T)#各ポジションの塩基組成(probability)を計算してhogeに格納。as.prob=Fにすることで塩基の出現割合ではなく出現頻度にすることもできる
out <- makePWM(hoge[1:4,])             #hogeはACGT以外の塩基(例えばN)のprobabilityもotherという5番目の行に出力するが、makePWM関数はACGTの最初の4行分の行列データのみ許容して受け付け、情報量(information content; ic)などを計算してくれる

png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
dev.off()                              #おまじない
	

7. 入力ファイルがmulti-FASTA形式のファイル(TAIR10_upstream_1000_20101104)の場合:

6.と同じ結果が得られますが、転写開始点上流50bpのみを切り出して解析するというオプションにしています。

in_f <- "TAIR10_upstream_1000_20101104.fasta"#入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param1 <- 50                           #切り出したい上流x bpを指定
param2 <-  1000                        #入力ファイルの配列長を指定
param_fig <- c(800, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#前処理(配列長が500bpのもののみフィルタリング後、解析したいサブセットを抽出)
obj <- as.logical(width(fasta) == param2)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなるもののみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです
fasta <- subseq(fasta, width=param1, end=param2)#解析したい範囲を切り出してfastaに格納
fasta                                  #確認してるだけです

#本番(sequence logoを実行)
hoge <- consensusMatrix(fasta, as.prob=T, baseOnly=T)#各ポジションの塩基組成(probability)を計算してhogeに格納。as.prob=Fにすることで塩基の出現割合ではなく出現頻度にすることもできる
out <- makePWM(hoge[1:4,])             #hogeはACGT以外の塩基(例えばN)のprobabilityもotherという5番目の行に出力するが、makePWM関数はACGTの最初の4行分の行列データのみ許容して受け付け、情報量(information content; ic)などを計算してくれる

png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
dev.off()                              #おまじない

#おまけ(配列長分布や配列長がparam2と異なるID情報を取得)
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
table(width(fasta))                    #配列長分布(ほとんどがparam2と同じであることがわかる)
obj <- as.logical(width(fasta) != param2)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなるもののみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです
	

解析 | 一般 | 上流配列解析 | LDSS(Yamamoto_2007)

Local Distribution of Short Sequence (LDSS)というのは、例えば手元に転写開始点上流1000塩基(upstream 1kb;下流3000塩基などでもよい)のFASTA形式の塩基配列セットがあったときに、 hexamer (6-mer)とかoctamer (8-mer)程度の短い塩基配列(short sequence)の分布を調べて、「Arabidopsis thalianaでは、"CTCTTC"というhexamerが転写開始点(Transcription Start Site; TSS)の近くにくるほどより多く出現する(参考文献1)」などの解析をしたい場合に行います。

入力データとして用いる上流 or 下流X塩基の配列セットは、配列取得 | 遺伝子の転写開始点近傍配列(上流配列など)を参考にして取得してください。

ここではArabidopsisの上流1000bpの配列セット(ファイル名:"TAIR10_upstream_1000_20101104.fasta")とラットの上流1000bpの配列セット(ファイル名:"rat_upstream_1000.fa")に対して、 pentamer (5-mer)の4^5(=1024)通りの配列一つ一つについて「上流1000bpのどこに出現したかを上流配列セット全体で出現頻度をカウントします。 この時、得られる情報はpentamerごとに「1bp目, 2bp目,...(1000 - 5 - 1)bp目の出現頻度」となるので、原著論文(参考文献1)と似た思想(全く同じというわけではありません!)でRPH, RPA, およびバックグラウンドレベルに比べて有意に局在化している短い配列(short sequences having localized distributions within upstream region)かどうかのフラグ情報を出力するやり方を示します。

  1. 1024通りのpentamer一つ一つについて、その「RPH, RPA, Local Distributionしているか否か」情報のみをファイル出力する場合:
  2. 上記に加え、全1024通りの配列のshort sequencesの実際の分布もpngファイルで出力したい場合:

尚、この方法(LDSS)はposition-sensitive typeには有効ですが、position-insensitive typeのものはアルゴリズム的に検出不可能です(参考文献6)。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. pentamer(5-mer; 4^5=1024通り)でプロモータ構成モチーフ候補リストを作成したい場合:

in_f <- "TAIR10_upstream_1000_20101104.fasta"#読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
param1 <- 5                            #調べたい連続塩基数(hexamerの場合は6, octamerの場合は8など)を指定してparam1に格納
param_fig <- c(1000, 500)              #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込みとフィルタリング
seq <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
seq                                    #seqの中身をざっとみてるだけ(33602個あることがわかる)
seq <- seq[width(seq) == median(width(seq))]#配列長はほとんどが一定長(この場合1000bp)だがときどき存在する異なるものを除去している
seq                                    #seqの中身をざっとみてるだけ(33600個となり、1000bpでなかったものが2個含まれていたことがわかる)

#(param1)-merの可能な全ての塩基配列を作成
reads <- mkAllStrings(c("A", "C", "G", "T"), param1)#(param1)連続塩基の全ての可能な配列情報をreadsに格納

#4^(param1)通りの塩基配列一つ一つについて上流配列セットseqに対するパターンマッチングを行う
out <- NULL
for(i in 1:length(reads)){             #readsの要素数分だけループを回す
    tmp <- vmatchPattern(pattern=as.character(reads[i]), subject=seq)#オブジェクトreads中の各塩基配列と100%マッチの領域を探索し、結果をtmpに格納
    s_posi_freq <- rle(sort(start(unlist(tmp))))#一致領域のstart positionごとの頻度情報を計算してs_posi_freqに格納
    hoge <- rep(0, (width(seq[1]) - param1 + 1))#1000bp長の配列から5連続塩基で一致領域を探索しそのstart positionのみ調査する場合には、可能なstart positionは1塩基目から(1000-5+1)塩基目までしかないため、取りうる範囲を限定してpositionごとの頻度の初期値を0として作成している
    hoge2 <- replace(hoge, s_posi_freq$values, s_posi_freq$lengths)#s_posi_freqベクトルはfrequencyの値が0のポジションの情報がないため、0個のfrequencyのポジションを確実に作成して要素数を揃えている
    out <- rbind(out, hoge2)           #全部で(width(seq[1]) - param1 + 1)個分の要素(この場合は1000-5+1=996個の要素)からなるstart positionごとの頻度情報ベクトルhoge2を調べたい連続塩基ごとに作成した結果を行方向でどんどん結合している
    if(i%%10 == 0) cat(i, "/", length(reads), "finished\n")      #進行状況を表示させてるだけ 
}
rownames(out) <- reads                 #行列outのどの行がどの連続塩基由来のものかを割り当てている

#有意な(param1)-merを探索
threshold <- apply(out,1,median) + 5*apply(out,1,mad)#出現頻度の(median+5*MAD)の値を計算してthresholdに格納
obj <- apply(out,1,max) > threshold    #条件を満たすかどうかを判定した結果をobjに格納(出現頻度の最大値がthresholdより大きいかどうか)
baseline <- apply(out,1,median)        #baselineを出現頻度の中央値として与えている
baseline[baseline < 1] <- 1            #baselineが1未満のものを1に置換している
RPH <- apply(out,1,max) / baseline     #出現頻度の最大値をbaselineで割ったものをRPHと定義している
RPA <- apply((out - baseline),1,sum) / apply(out,1,sum)#「(出現頻度 - baseline)の和 / 出現頻度の和」をRPAと定義している

#ファイルに保存
tmp <- cbind(rownames(out), RPH, RPA, obj)#保存したい情報をtmpに格納
colnames(tmp) <- c("(param1)-mer", "Relative Peak Height (RPH)", "Relative Peak Area (RPA)", "Local Distribution")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存

#既知のコアプロモーター領域の分布をチェック
plot(out["TATAA",])                    #TATA-boxのプロット
plot(out["GCCCA",])                    #PPDB中でGCCCA, PLACE(参考文献5)中でGGGCCというモチーフのやつ。転写開始点(右側)近傍にブロードにGCCCAという配列が濃縮して存在していることがわかる。
	

2. 上記を基本としつつ組合せ数分だけ原著論文(参考文献1)Fig.1と同じような図をpngファイルで生成したい場合:

(以下をコピペすると作業ディレクトリ上に1024個のpngファイルが生成されますので注意!!)

in_f <- "TAIR10_upstream_1000_20101104.fasta"#読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
param1 <- 5                            #調べたい連続塩基数(hexamerの場合は6, octamerの場合は8など)を指定してparam1に格納
param_fig <- c(1000, 500)              #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込みとフィルタリング
seq <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
seq                                    #seqの中身をざっとみてるだけ(33602個あることがわかる)
seq <- seq[width(seq) == median(width(seq))]#配列長はほとんどが一定長(この場合1000bp)だがときどき存在する異なるものを除去している
seq                                    #seqの中身をざっとみてるだけ(33600個となり、1000bpでなかったものが2個含まれていたことがわかる)

#(param1)-merの可能な全ての塩基配列を作成
reads <- mkAllStrings(c("A", "C", "G", "T"), param1)#(param1)連続塩基の全ての可能な配列情報をreadsに格納

#4^(param1)通りの塩基配列一つ一つについて上流配列セットseqに対するパターンマッチングを行う
out <- NULL
for(i in 1:length(reads)){             #readsの要素数分だけループを回す
    tmp <- vmatchPattern(pattern=as.character(reads[i]), subject=seq)#オブジェクトreads中の各塩基配列と100%マッチの領域を探索し、結果をtmpに格納
    s_posi_freq <- rle(sort(start(unlist(tmp))))#一致領域のstart positionごとの頻度情報を計算してs_posi_freqに格納
    hoge <- rep(0, (width(seq[1]) - param1 + 1))#1000bp長の配列から5連続塩基で一致領域を探索しそのstart positionのみ調査する場合には、可能なstart positionは1塩基目から(1000-5+1)塩基目までしかないため、取りうる範囲を限定してpositionごとの頻度の初期値を0として作成している
    hoge2 <- replace(hoge, s_posi_freq$values, s_posi_freq$lengths)#s_posi_freqベクトルはfrequencyの値が0のポジションの情報がないため、0個のfrequencyのポジションを確実に作成して要素数を揃えている
    out <- rbind(out, hoge2)           #全部で(width(seq[1]) - param1 + 1)個分の要素(この場合は1000-5+1=996個の要素)からなるstart positionごとの頻度情報ベクトルhoge2を調べたい連続塩基ごとに作成した結果を行方向でどんどん結合している
    if(i%%10 == 0) cat(i, "/", length(reads), "finished\n")      #進行状況を表示させてるだけ 
}
rownames(out) <- reads                 #行列outのどの行がどの連続塩基由来のものかを割り当てている

#有意な(param1)-merを探索
threshold <- apply(out,1,median) + 5*apply(out,1,mad)#出現頻度の(median+5*MAD)の値を計算してthresholdに格納
obj <- apply(out,1,max) > threshold    #条件を満たすかどうかを判定した結果をobjに格納(出現頻度の最大値がthresholdより大きいかどうか)
baseline <- apply(out,1,median)        #baselineを出現頻度の中央値として与えている
baseline[baseline < 1] <- 1            #baselineが1未満のものを1に置換している
PH <- apply(out,1,max)                 #出現頻度の最大値をPHに格納
RPH <- PH / baseline                   #出現頻度の最大値をbaselineで割ったものをRPHと定義している
RPA <- apply((out - baseline),1,sum) / apply(out,1,sum)#「(出現頻度 - baseline)の和 / 出現頻度の和」をRPAと定義している

#ファイルに保存
tmp <- cbind(rownames(out), RPH, RPA, obj)#保存したい情報をtmpに格納
colnames(tmp) <- c("(param1)-mer", "Relative Peak Height (RPH)", "Relative Peak Area (RPA)", "Local Distribution")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存

#pngファイルを一気に生成
for(i in 1:length(reads)){
    out_f <- paste("result_", rownames(out)[i], ".png", sep="")#ファイル名を作成
    png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
    plot(out[i,], ylim=c(0, max(c(PH[i], threshold[i]))),#行列outのi番目の行の数値をプロットしている
        ylab="Occurence", xlab="Position", type="p", pch=20, cex=0.8)#行列outのi番目の行の数値をプロットしている
    abline(h=baseline[i], col="red")   #baseline (出現頻度の中央値)を赤線で追加している
    text(0, baseline[i], "baseline", col="red", adj=c(0,0))#baselineを引いたところに"baseline"という文字を追加している
    abline(h=threshold[i], col="red")  #有意かどうかを判定するために採用した閾値(threshold = baseline+5*MAD)の値も赤線で追加している
    text(0, threshold[i], "threshold(= baseline + 5*MAD)", col="red", adj=c(0,0))#閾値を引いたところに"threshold"という文字を追加している
    dev.off()
}
	

3. 2と同じだが入力ファイルがラット上流配列セット(ファイル名:"rat_upstream_1000.fa")の場合:

in_f <- "rat_upstream_1000.fa"         #読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
param1 <- 5                            #調べたい連続塩基数(hexamerの場合は6, octamerの場合は8など)を指定してparam1に格納
param_fig <- c(1000, 500)              #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込みとフィルタリング
seq <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
seq                                    #seqの中身をざっとみてるだけ(33602個あることがわかる)
seq <- seq[width(seq) == median(width(seq))]#配列長はほとんどが一定長(この場合1000bp)だがときどき存在する異なるものを除去している
seq                                    #seqの中身をざっとみてるだけ(33600個となり、1000bpでなかったものが2個含まれていたことがわかる)

#(param1)-merの可能な全ての塩基配列を作成
reads <- mkAllStrings(c("A", "C", "G", "T"), param1)#(param1)連続塩基の全ての可能な配列情報をreadsに格納

#4^(param1)通りの塩基配列一つ一つについて上流配列セットseqに対するパターンマッチングを行う
out <- NULL
for(i in 1:length(reads)){             #readsの要素数分だけループを回す
    tmp <- vmatchPattern(pattern=as.character(reads[i]), subject=seq)#オブジェクトreads中の各塩基配列と100%マッチの領域を探索し、結果をtmpに格納
    s_posi_freq <- rle(sort(start(unlist(tmp))))#一致領域のstart positionごとの頻度情報を計算してs_posi_freqに格納
    hoge <- rep(0, (width(seq[1]) - param1 + 1))#1000bp長の配列から5連続塩基で一致領域を探索しそのstart positionのみ調査する場合には、可能なstart positionは1塩基目から(1000-5+1)塩基目までしかないため、取りうる範囲を限定してpositionごとの頻度の初期値を0として作成している
    hoge2 <- replace(hoge, s_posi_freq$values, s_posi_freq$lengths)#s_posi_freqベクトルはfrequencyの値が0のポジションの情報がないため、0個のfrequencyのポジションを確実に作成して要素数を揃えている
    out <- rbind(out, hoge2)           #全部で(width(seq[1]) - param1 + 1)個分の要素(この場合は1000-5+1=996個の要素)からなるstart positionごとの頻度情報ベクトルhoge2を調べたい連続塩基ごとに作成した結果を行方向でどんどん結合している
    if(i%%10 == 0) cat(i, "/", length(reads), "finished\n")      #進行状況を表示させてるだけ 
}
rownames(out) <- reads                 #行列outのどの行がどの連続塩基由来のものかを割り当てている

#有意な(param1)-merを探索
threshold <- apply(out,1,median) + 5*apply(out,1,mad)#出現頻度の(median+5*MAD)の値を計算してthresholdに格納
obj <- apply(out,1,max) > threshold    #条件を満たすかどうかを判定した結果をobjに格納(出現頻度の最大値がthresholdより大きいかどうか)
baseline <- apply(out,1,median)        #baselineを出現頻度の中央値として与えている
baseline[baseline < 1] <- 1            #baselineが1未満のものを1に置換している
PH <- apply(out,1,max)                 #出現頻度の最大値をPHに格納
RPH <- PH / baseline                   #出現頻度の最大値をbaselineで割ったものをRPHと定義している
RPA <- apply((out - baseline),1,sum) / apply(out,1,sum)#「(出現頻度 - baseline)の和 / 出現頻度の和」をRPAと定義している

#ファイルに保存
tmp <- cbind(rownames(out), RPH, RPA, obj)#保存したい情報をtmpに格納
colnames(tmp) <- c("(param1)-mer", "Relative Peak Height (RPH)", "Relative Peak Area (RPA)", "Local Distribution")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存

#pngファイルを一気に生成
for(i in 1:length(reads)){
    out_f <- paste("result_", rownames(out)[i], ".png", sep="")#ファイル名を作成している
    png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
    plot(out[i,], ylim=c(0, max(c(PH[i], threshold[i]))),#行列outのi番目の行の数値をプロットしている
        ylab="Occurence", xlab="Position", type="p", pch=20, cex=0.8)#行列outのi番目の行の数値をプロットしている
    abline(h=baseline[i], col="red")   #baseline (出現頻度の中央値)を赤線で追加している
    text(0, baseline[i], "baseline", col="red", adj=c(0,0))#baselineを引いたところに"baseline"という文字を追加している
    abline(h=threshold[i], col="red")  #有意かどうかを判定するために採用した閾値(threshold = baseline+5*MAD)の値も赤線で追加している
    text(0, threshold[i], "threshold(= baseline + 5*MAD)", col="red", adj=c(0,0))#閾値を引いたところに"threshold"という文字を追加している
    dev.off()
}
	

解析 | 一般 | 上流配列解析 | Relative Appearance Ratio(Yamamoto_2011)

手元に(Rで)マイクロアレイデータ解析サンプルマイクロアレイデータ21の「発現変動遺伝子(DEG)の転写開始点のFASTA形式の上流配列セット(ファイル名:"seq_BAT_DEG.fa")」と「それ以外(nonDEG)の上流配列セット(ファイル名:"seq_BAT_nonDEG.fa")」 の二つのファイルがあったときに、任意のk-mer(4k通り;k=6のときは4096通り)に対して、どのk-merが発現変動と関連しているかをFisher's Exact Testを用いてp値を計算する手順を示します。 尚、ここで用いている二つのファイルはいずれも「ACGTのみからなり、配列長は1000bp」です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. pentamer(5-mer; 45=1024通り)で各k-merごとにp値とFDR値をリストアップする場合:

in_f1 <- "seq_BAT_DEG.fa"              #読み込みたいFASTA形式のDEGのファイル名を指定してin_f1に格納
in_f2 <- "seq_BAT_nonDEG.fa"           #読み込みたいFASTA形式のnonDEGのファイル名を指定してin_f2に格納
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
param1 <- 5                            #調べたい連続塩基数(hexamerの場合は6, octamerの場合は8など)を指定してparam1に格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
seq_DEG <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
seq_DEG                                #オブジェクトの中身をざっとみてるだけ(563 sequencesであることがわかる)
seq_nonDEG <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み
seq_nonDEG                             #オブジェクトの中身をざっとみてるだけ(8898 sequencesであることがわかる)

#(param1)-merの可能な全ての塩基配列を作成
reads <- mkAllStrings(c("A", "C", "G", "T"), param1)#(param1)連続塩基の全ての可能な配列情報をreadsに格納

#4^(param1)通りの塩基配列一つ一つについて上流配列セットに対するパターンマッチングを行う
out <- NULL
for(i in 1:length(reads)){             #readsの要素数分だけループを回す
    tmp <- vmatchPattern(pattern=as.character(reads[i]), subject=seq_DEG)#オブジェクトreads中の各塩基配列と100%マッチの領域を探索し、結果をtmpに格納
    out_DEG <- length(start(unlist(tmp)))#一致領域のstart positionの情報を抽出してout_DEGに格納
    tmp <- vmatchPattern(pattern=as.character(reads[i]), subject=seq_nonDEG)#オブジェクトreads中の各塩基配列と100%マッチの領域を探索し、結果をtmpに格納
    out_nonDEG <- length(start(unlist(tmp)))#一致領域のstart positionの情報を抽出してout_nonDEGに格納
    x <- c(out_nonDEG, length(seq_nonDEG), out_DEG, length(seq_DEG))#Fisher's Exact Testを行うための2×2分割表の基礎情報を作成してxに格納
    data <- matrix(x, ncol=2, byrow=T) #ベクトルxを行列形式に変換した結果をdataに格納
    pvalue <- fisher.test(data)$p.value#Fisher's Exact Testを行って得られたp値をpvalueに格納
    out <- rbind(out, c(x, pvalue))    #必要な情報を行方向で結合することでまとめている
    if(i%%10 == 0) cat(i, "/", length(reads), "finished\n")      #進行状況を表示させてるだけ 
}
rownames(out) <- reads                 #行列outのどの行がどの連続塩基由来のものかを割り当てている(行名を与えている)
p.value <- out[,ncol(out)]             #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納

#ファイルに保存
tmp <- cbind(rownames(out), out, q.value)  #保存したい情報をtmpに格納
colnames(tmp) <- c("k-mer", "Occurence in nonDEG", "# of nonDEG sequences", "Occurence in DEG", "# of DEG sequences", "p.value", "q.value")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

解析 | 基礎 | 平均-分散プロット(Technical replicates)

MarioniらはTechnical replicatesのデータがポアソン分布(Poisson distribution)に従うことを報告しています(Marioni et al., Genome Res., 2008)。 つまり「各遺伝子のtechnical replicatesデータの平均と分散が全体として同じ」だと言っているわけです。ここでは、横軸:平均、縦軸:分散としたプロットを描画してその傾向を眺めます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ4の18,110 genes×10 samplesのリアルデータ(data_marioni.txt; kidney 5サンプル vs. liver 5サンプル)の場合:

総リード数補正を行って、群ごとにプロットしています。

in_f <- "data_marioni.txt"             #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge1_G1.txt"               #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1_G1.png"               #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge1_G2.txt"               #出力ファイル名を指定してout_f3に格納
out_f4 <- "hoge1_G2.png"               #出力ファイル名を指定してout_f4に格納
out_f5 <- "hoge1_all.png"              #出力ファイル名を指定してout_f5に格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定    
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)                          #総リード数を表示

#前処理(データ正規化; 群ごとに総リード数の平均値を揃えている)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
hoge <- data[,data.cl==1]              #G1群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G1群の正規化係数を計算した結果をnfに格納
G1 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG1に格納
colSums(G1)                            #総リード数を表示
hoge <- data[,data.cl==2]              #G2群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G2群の正規化係数を計算した結果をnfに格納
G2 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG2に格納
colSums(G2)                            #総リード数を表示

#本番(Mean-Variance plotなど; G1群)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), data[,data.cl==1], hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="blue")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G1", col="blue", pch=20)#凡例を作成している

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEならなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#独立変数(説明変数)をMEAN, 従属変数(目的変数)をVARIANCEとしてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が-0.001173, 傾き(MEAN)が1.349519であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.8149と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
dev.off()                              #おまじない

#本番(Mean-Variance plotなど; G2群)
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), data[,data.cl==1], hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f4, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G2", col="red", pch=20)#凡例を作成している

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEならなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#独立変数(説明変数)をMEAN, 従属変数(目的変数)をVARIANCEとしてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が-0.001173, 傾き(MEAN)が1.349519であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.8149と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
dev.off()                              #おまじない

#本番(Mean-Variance plot; G1 and G2両方)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
png(out_f5, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="blue")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", c("G1", "G2"), col=c("blue", "red"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

2. サンプルデータ4の18,110 genes×10 samplesのリアルデータ(data_marioni.txt; kidney 5サンプル vs. liver 5サンプル)の場合:

総リード数補正を行って、2つの群をまとめてプロットしています。

in_f <- "data_marioni.txt"             #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge2.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge2.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定    
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)                          #総リード数を表示

#前処理(総リード数補正)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
nf <- mean(colSums(data))/colSums(data)#G1群の正規化係数を計算した結果をnfに格納
normalized.count <- sweep(data, 2, nf, "*")#正規化係数を各列に掛けた結果をnormalized.countに格納
colSums(normalized.count)              #総リード数を表示

#ファイルに保存(テキストファイル)
hoge <- normalized.count               #hogeとして取り扱う
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(Mean-Variance plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="black")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G1+G2", col="black", pch=20)#凡例を作成している

#後処理(回帰分析など)
hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEならなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#独立変数(説明変数)をMEAN, 従属変数(目的変数)をVARIANCEとしてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が-0.001173, 傾き(MEAN)が1.349519であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.8149と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
dev.off()                              #おまじない
	

3. サンプルデータ4の18,110 genes×10 samplesのリアルデータ(data_marioni.txt; kidney 5サンプル vs. liver 5サンプル)の場合:

総リード数補正を行って、2つの群をまとめてプロットしています。また、G2群のみのプロットも重ね書きしています。

in_f <- "data_marioni.txt"             #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定    
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)                          #総リード数を表示

#前処理(総リード数補正)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
nf <- mean(colSums(data))/colSums(data)#正規化係数を計算した結果をnfに格納
normalized.count <- sweep(data, 2, nf, "*")#正規化係数を各列に掛けた結果をnormalized.countに格納
colSums(normalized.count)              #総リード数を表示

#ファイルに保存(Mean-Variance plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hoge <- normalized.count               #hogeとして取り扱う
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="black")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
MEAN <- apply(hoge[,data.cl==2], 1, mean)#各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge[,data.cl==2], 1, var)#各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("bottomright", c("G1+G2", "G2"), col=c("black", "red"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

4. サンプルデータ4の18,110 genes×10 samplesのリアルデータ(data_marioni.txt; kidney 5サンプル vs. liver 5サンプル)の場合:

TCCパッケージ中のiDEGES/edgeR正規化後のデータを用いて、2つの群をまとめてプロットしています。また、G2群のみのプロットも重ね書きしています。

in_f <- "data_marioni.txt"             #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized.count <- getNormalizedData(tcc)#正規化後のデータを取り出してnormalized.countに格納

#ファイルに保存(Mean-Variance plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hoge <- normalized.count               #hogeとして取り扱う
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="black")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
MEAN <- apply(hoge[,data.cl==2], 1, mean)#各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge[,data.cl==2], 1, var)#各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("bottomright", c("G1+G2", "G2"), col=c("black", "red"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

5. サンプルデータ4の18,110 genes×10 samplesのリアルデータ(data_marioni.txt; kidney 5サンプル vs. liver 5サンプル)の場合:

TCCパッケージ中のiDEGES/edgeR正規化後のデータを用いて、2つの群をまとめてプロットしています。

iDEGES/edgeR-edgeR解析パイプライン適用後のFDR < 0.05を満たす遺伝子をマゼンタで色づけしています。

in_f <- "data_marioni.txt"             #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized.count <- getNormalizedData(tcc)#正規化後のデータを取り出してnormalized.countに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
obj <- as.logical(tcc$stat$q.value < param_FDR)#条件を満たすかどうかを判定した結果をobjに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(Mean-Variance plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hoge <- normalized.count               #hogeとして取り扱う
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="black")#プロット
points(MEAN[obj], VARIANCE[obj], col="magenta", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("bottomright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

解析 | 基礎 | 平均-分散プロット(Biological replicates)

Biological replicatesのデータは負の二項分布(negative binomial distribution; 分散 > 平均)に従うことを検証します。 つまり、ポアソン分布(分散 = 平均)よりももっとばらつきが大きいということを言っています。 ここでは、横軸:平均、縦軸:分散としたプロットを描画してその傾向を眺めます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge1_G1.txt"               #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1_G1.png"               #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge1_G2.txt"               #出力ファイル名を指定してout_f3に格納
out_f4 <- "hoge1_G2.png"               #出力ファイル名を指定してout_f4に格納
out_f5 <- "hoge1_all.png"              #出力ファイル名を指定してout_f5に格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)                          #総リード数を表示

#前処理(データ正規化; 群ごとに総リード数の平均値を揃えている)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
hoge <- data[,data.cl==1]              #G1群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G1群の正規化係数を計算した結果をnfに格納
G1 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG1に格納
colSums(G1)                            #総リード数を表示
hoge <- data[,data.cl==2]              #G2群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G2群の正規化係数を計算した結果をnfに格納
G2 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG2に格納
colSums(G2)                            #総リード数を表示

#本番(Mean-Variance plotなど; G1群)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), data[,data.cl==1], hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G1", col="blue", pch=20)#凡例を作成している

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEならなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#独立変数(説明変数)をMEAN, 従属変数(目的変数)をVARIANCEとしてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が-0.001173, 傾き(MEAN)が1.349519であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.8149と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
dev.off()                              #おまじない

#本番(Mean-Variance plotなど; G2群)
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), data[,data.cl==1], hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f4, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G2", col="red", pch=20)#凡例を作成している

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEならなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#独立変数(説明変数)をMEAN, 従属変数(目的変数)をVARIANCEとしてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が-0.001173, 傾き(MEAN)が1.349519であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.8149と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
dev.off()                              #おまじない

#本番(Mean-Variance plot; G1 and G2両方)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
png(out_f5, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", c("G1", "G2"), col=c("blue", "red"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

non-DEGデータのみで総リード数を揃えてから計6サンプルを一緒にしてプロットしています。これが検定のイメージです。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge2.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge2.png"                  #出力ファイル名を指定してout_f2に格納
param_DEG_G1 <- 1:1800                 #G1群で高発現のDEGの位置を指定
param_DEG_G2 <- 1801:2000              #G2群で高発現のDEGの位置を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)                          #全データの総リード数を表示
colSums(data[param_nonDEG,])           #non-DEGのみの総リード数を表示

#前処理(データ正規化; non-DEGの総リード数の平均値を揃えている)
hoge <- data[param_nonDEG,]            #non-DEGのみのデータを抽出した結果をhogeに格納
nf <- mean(colSums(hoge))/colSums(hoge)#正規化係数を計算した結果をnfに格納
normalized <- sweep(data, 2, nf, "*")  #正規化係数を各列に掛けた結果をnormalizedに格納
colSums(normalized[param_nonDEG,])     #正規化後のデータでnon-DEGのみの総リード数を表示

#本番(平均-分散情報などを保存)
hoge <- normalized                     #正規化後のデータをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), data, hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#本番(平均-分散プロット)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
obj <- param_nonDEG                    #non-DEGの位置情報をobjに格納
plot(MEAN[obj], VARIANCE[obj], log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="black")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
obj <- param_DEG_G1                    #G1群で高発現のDEGの位置情報をobjに格納
plot(MEAN[obj], VARIANCE[obj], log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
obj <- param_DEG_G2                    #G2群で高発現のDEGの位置情報をobjに格納
plot(MEAN[obj], VARIANCE[obj], log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red",#プロット
     xlab="MEAN", ylab="VARIANCE")     #プロット

grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", c("DEG(G1)", "DEG(G2)", "non-DEG"), col=c("blue", "red", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

3. NBPSeqパッケージ中の26,222 genes×6 samplesの場合:

3 Mockサンプル vs. 3 treatedサンプルのデータです。

もう少し具体的には、バクテリアを感染させて防御応答をみたデータで、詳細はCumbie et al., PLoS One, 2011に書かれています。

out_f1 <- "hoge3_G1.txt"               #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge3_G1.png"               #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge3_G2.txt"               #出力ファイル名を指定してout_f3に格納
out_f4 <- "hoge3_G2.png"               #出力ファイル名を指定してout_f4に格納
out_f5 <- "hoge3_all.png"              #出力ファイル名を指定してout_f5に格納
param_G1 <- 3                          #G1群(mock群)のサンプル数を指定    
param_G2 <- 3                          #G2群(hrcc群)のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(NBPSeq)                        #パッケージの読み込み

#(パッケージ中に存在する)発現データのロード
data(arab)                             #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab                           #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
dim(data)                              #行数と列数を表示
head(data)                             #最初の数行分を表示(最初の3列がMockサンプルであることが分かる)
colSums(data)                          #総リード数を表示

#前処理(データ正規化; 群ごとに総リード数の平均値を揃えている)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
hoge <- data[,data.cl==1]              #G1群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G1群の正規化係数を計算した結果をnfに格納
G1 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG1に格納
colSums(G1)                            #総リード数を表示
hoge <- data[,data.cl==2]              #G2群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G2群の正規化係数を計算した結果をnfに格納
G2 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG2に格納
colSums(G2)                            #総リード数を表示

#本番(Mean-Variance plotなど; G1群)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), data[,data.cl==1], hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G1", col="blue", pch=20)#凡例を作成している

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEならなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#独立変数(説明変数)をMEAN, 従属変数(目的変数)をVARIANCEとしてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が-0.001173, 傾き(MEAN)が1.349519であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.8149と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
dev.off()                              #おまじない

#本番(Mean-Variance plotなど; G2群)
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), data[,data.cl==1], hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f4, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G2", col="red", pch=20)#凡例を作成している

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEならなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#独立変数(説明変数)をMEAN, 従属変数(目的変数)をVARIANCEとしてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が-0.001173, 傾き(MEAN)が1.349519であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.8149と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
dev.off()                              #おまじない

#本番(Mean-Variance plot; G1 and G2両方)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
png(out_f5, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", c("G1", "G2"), col=c("blue", "red"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

4. サンプルデータ8の26,221 genes×6 samplesのリアルデータ(data_arab.txt; mock 3サンプル vs. hrcc 3サンプル)の場合:

3.と基本的に同じデータですが、ファイルの読み込みから行う一般的なやり方です。

in_f <- "data_arab.txt"                #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge4_G1.txt"               #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge4_G1.png"               #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge4_G2.txt"               #出力ファイル名を指定してout_f3に格納
out_f4 <- "hoge4_G2.png"               #出力ファイル名を指定してout_f4に格納
out_f5 <- "hoge4_all.png"              #出力ファイル名を指定してout_f5に格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)                          #総リード数を表示

#前処理(データ正規化; 群ごとに総リード数の平均値を揃えている)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
hoge <- data[,data.cl==1]              #G1群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G1群の正規化係数を計算した結果をnfに格納
G1 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG1に格納
colSums(G1)                            #総リード数を表示
hoge <- data[,data.cl==2]              #G2群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G2群の正規化係数を計算した結果をnfに格納
G2 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG2に格納
colSums(G2)                            #総リード数を表示

#本番(Mean-Variance plotなど; G1群)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), data[,data.cl==1], hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G1", col="blue", pch=20)#凡例を作成している

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEならなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#独立変数(説明変数)をMEAN, 従属変数(目的変数)をVARIANCEとしてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が-0.001173, 傾き(MEAN)が1.349519であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.8149と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
dev.off()                              #おまじない

#本番(Mean-Variance plotなど; G2群)
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), data[,data.cl==1], hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f4, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G2", col="red", pch=20)#凡例を作成している

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEならなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#独立変数(説明変数)をMEAN, 従属変数(目的変数)をVARIANCEとしてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が-0.001173, 傾き(MEAN)が1.349519であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.8149と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
dev.off()                              #おまじない

#本番(Mean-Variance plot; G1 and G2両方)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
png(out_f5, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", c("G1", "G2"), col=c("blue", "red"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

5. サンプルデータ8の26,221 genes×6 samplesのリアルデータ(data_arab.txt; mock 3サンプル vs. hrcc 3サンプル)の場合:

G1とG2群を混ぜてプロットしています。

in_f <- "data_arab.txt"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)                          #総リード数を表示

#前処理(データ正規化; 群ごとに総リード数の平均値を揃えている)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
nf <- mean(colSums(data))/colSums(data)#正規化係数を計算した結果をnfに格納
normalized.count <- sweep(data, 2, nf, "*")#正規化係数を各列に掛けた結果をnormalized.countに格納
colSums(normalized.count)              #総リード数を表示

#本番(Mean-Variance plot; G1 and G2両方)
hoge <- normalized.count               #hogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="black")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
hoge <- normalized.count[,data.cl==1]  #hogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
hoge <- normalized.count[,data.cl==2]  #hogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red")#プロット
     
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", c("(G1+G2)", "G1", "G2"), col=c("black", "blue", "red"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

6. サンプルデータ8の26,221 genes×6 samplesのリアルデータ(data_arab.txt; mock 3サンプル vs. hrcc 3サンプル)の場合:

TCCパッケージ中のiDEGES/edgeR正規化後のデータを用いて、2つの群をまとめてプロットしています。

iDEGES/edgeR-edgeR解析パイプライン適用後のFDR < 0.05を満たす遺伝子をマゼンタで色づけしています。

in_f <- "data_arab.txt"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群(kidney)のサンプル数を指定
param_G2 <- 3                          #G2群(liver)のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized.count <- getNormalizedData(tcc)#正規化後のデータを取り出してnormalized.countに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
obj <- as.logical(tcc$stat$q.value < param_FDR)#条件を満たすかどうかを判定した結果をobjに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(Mean-Variance plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hoge <- normalized.count               #hogeとして取り扱う
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="black")#プロット
points(MEAN[obj], VARIANCE[obj], col="magenta", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("bottomright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

解析 | クラスタリング | について

ここで紹介するのは実質的にRNA-seqカウントデータ用ですが、ぽつぽつと出始めているようです。

解析 | クラスタリング | サンプル間 | hclust

RNA-seqカウントデータのクラスタリング結果は、特にゼロカウント(0カウント; zero count)を多く含む場合に(もちろん距離の定義の仕方によっても変わってきますが) 低発現データのフィルタリングの閾値次第で結果が変わる傾向にあります。 ここでは、上記閾値問題に悩まされることなく頑健なサンプル間クラスタリングを行うやり方を示します。 内部的に行っていることは、以下の通りです:

1. 全サンプルで0カウントとなる行(遺伝子)をフィルタリングした後、unique関数を用いて同一発現パターンのものを1つのパターンとしてまとめる、 2. 「1 - Spearman順位相関係数」でサンプル間距離を定義、3. Average-linkage clusteringの実行、です。

順位相関係数を用いてサンプルベクトル間の類似度として定義するので、サンプル間正規化の問題に悩まされません。 また、低発現遺伝子にありがちな同一発現パターンの遺伝子をまとめることで、(変動しやすい)同順位となる大量の遺伝子が集約されるため、 結果的に「総カウント数がx個以下のものをフィルタリング...」という閾値問題をクリアしたことになります。 近いうち(2014年中)にTCCパッケージ中でwrapper functionを提供する予定です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
data.dist <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdata.distに格納
out <- hclust(data.dist, method="average")#階層的クラスタリングを実行し、結果をoutに格納
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

non-DEGデータのみでクラスタリングを行っています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_nonDEG <- 2001:10000             #non-DEGの位置を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(サブセットの抽出)
data <- data[param_nonDEG,]            #指定した行のみ抽出した結果をdataに格納

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
data.dist <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdata.distに格納
out <- hclust(data.dist, method="average")#階層的クラスタリングを実行し、結果をoutに格納
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

3.サンプルデータ9のReCount (Frazee et al., BMC Bioinformatics, 2011)から提供されているカウントデータの場合:

Study列が"bodymap"データのクラスタリングを行います。"Count table"列のカウントデータファイル(bodymap_count_table.txt) のみではサンプル名がIDとして与えられているため、"Phenotype table"列のサンプル名情報ファイル(bodymap_phenodata.txt) も利用してbrain, liver, heartなどに変換した上でクラスタリング結果を表示させています。

in_f1 <- "bodymap_count_table.txt"     #入力ファイル名を指定してin_f1に格納(カウントデータファイル)
in_f2 <- "bodymap_phenodata.txt"       #入力ファイル名を指定してin_f2に格納(サンプル名情報ファイル)
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込みと列名変更
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
phenotype <- read.table(in_f2, header=TRUE, row.names=1, sep=" ", quote="")#in_f2で指定したファイルの読み込み
colnames(data) <- phenotype$tissue.type#列名を付与
dim(data)                              #確認してるだけです

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
data.dist <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdata.distに格納
out <- hclust(data.dist, method="average")#階層的クラスタリングを実行し、結果をoutに格納
png(out_f, pointsize=15, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

4. サンプルデータ8の26,221 genes×6 samplesのリアルデータ(data_arab.txt; mock 3サンプル vs. hrcc 3サンプル)の場合:

in_f <- "data_arab.txt"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
data.dist <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdata.distに格納
out <- hclust(data.dist, method="average")#階層的クラスタリングを実行し、結果をoutに格納
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

解析 | クラスタリング | 遺伝子間 | MBCluster.Seq (Si_2014)

MBCluster.Seqパッケージを用いたやり方を示します。 最適なクラスター数周辺までかなりいろいろとできるようなことを書いてあったような気がします。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:


#必要なパッケージをロード
library(MBCluster.Seq)                 #パッケージの読み込み
	

解析 | 発現変動 | ポアソン分布 | シミュレーションデータ(Technical replicates)

ポアソン分布(Poisson distribution)に従うデータとは、任意の値(λ)を与えたときに、分散がλとなるような分布になるようなデータのことです。

以下では、1.ポアソン分布の感覚をつかみながら、2.参考文献1の実際のデータを入力(empirical distribution of read countsに相当)として与えてシミュレーションデータの作成を行います。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1-1. ポアソン分布の感覚をつかむ(初級):

任意のλ(> 0)を与え、任意の数の乱数を発生させ、その分散がλに近い値になっているかどうか調べる。

param1 <- 8                            #λの値を指定
param2 <- 100                          #発生させる乱数の数を指定
out <- rpois(param2, lambda=param1)    #ポアソン分布に従う乱数を発生させた結果をoutに格納
out                                    #outの中身を表示
var(out)                               #outの分散を計算している
	

1-2. ポアソン分布の感覚をつかむ(中級):

λを1から100までにし、各λの値について発生させる乱数の数を増やし、λの値ごとの平均と分散を計算した結果をプロット

out <- NULL                            #最終的に平均と分散の計算結果を格納するためのプレースホルダを作成している
for(i in 1:100){                       #100回ループを回す
   x <- rpois(n=2000, lambda=i)        #λがiのときのポアソン分布に従う乱数を2000個発生させた結果をxに格納
   out <- rbind(out, c(mean(x), var(x)))#xの平均と分散を計算した結果をどんどんoutの下の行に追加
}                                      #ここまできたら、次のiの値でループの最初からやり直し
colnames(out) <- c("MEAN", "VARIANCE") #100行2列の行列outに列名を付与
plot(out)                              #平均と分散の関係をプロット(傾きが1の直線っぽくなっていることが分かる。つまり平均=分散ってこと)

#λを5, 60, 200の三つの要素からなるベクトルとして与えて各々1000個分の乱数を発生させる
param1 <- c(5, 60, 200)                #λの値を指定
param2 <- 10000                        #各λの値ごとの発生させる乱数の数を指定
out <- rpois(param2*length(param1), lambda=param1)#ポアソン分布に従う乱数を発生させた結果をoutに格納
hist(out)                              #ヒストグラムを描画
	

2. シミュレーションデータの作成本番(7サンプル分の行列データとして作成):

サンプルデータ2のSupplementaryTable2_changed.txtの「kidney 5サンプル vs. liver 5サンプル」のデータに相当しますが、このうちkidneyのデータを入力として与えることにします。

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 7                            #サンプル数を指定

#データファイルの読み込みとλベクトルの作成(kidneyのfive technical replicatesのデータを用いる)
tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
tmp <- rowSums(tmp[,1:5])              #kidneyの5 replicatesのデータの各行の和を計算している
RPM <- tmp*1000000/sum(tmp)            #リード数の総和を100万にしている
LAMBDA <- RPM[RPM > 0]                 #λが0だと意味がないのでそういうものを除いている

#ポアソン分布に従う乱数を生成してシミュレーションデータを得る
out <- NULL                            #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param1){                    #param1回ループを回す
    out <- cbind(out, rpois(n=length(LAMBDA), lambda=LAMBDA))#length(LAMBDA)個の乱数を発生させている(λベクトルはLAMBDAで与えている)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#得られた20921行×param1列からなる行列outがポアソン分布に従っているかを確認
obj <- rowSums(out) > 0                #条件を満たすかどうかを判定した結果をobjに格納(行の和が0より大きいkどうか)
out2 <- out[obj,]                      #objがTRUEのもののみ抽出してout2に格納
MEAN <- apply(out2, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(out2, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy")         #両対数(底は10)プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示

#行列outの中から分散が計算できたもののみ、検証用情報(LAMDA, MEAN, VARIANCE)とともにファイルに出力
tmp <- cbind(out2, LAMBDA[obj], MEAN, VARIANCE)#保存したい情報をtmpに格納(λ, 乱数の平均, 乱数の分散)
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. シミュレーションデータの作成本番(遺伝子数(行数)を任意に与える場合):

サンプルデータ2のSupplementaryTable2_changed.txtの「kidney 5サンプル vs. liver 5サンプル」のデータに相当しますが、このうちkidneyのデータを入力として与えることにします。

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 7                            #サンプル数を指定    
param_Ngene <- 5000                    #全遺伝子数を指定

#データファイルの読み込みとλベクトルの作成(kidneyのfive technical replicatesのデータを用いる)
tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
tmp <- rowSums(tmp[,1:5])              #kidneyの5 replicatesのデータの各行の和を計算している
LAMBDA <- tmp[tmp > 0]                 #λが0だと意味がないのでそういうものを除いている
LAMBDA <- sample(LAMBDA, param_Ngene, replace=TRUE)#param_Ngeneで指定した数だけサンプリングした結果をLAMBDAに格納
LAMBDA <- LAMBDA*1000000/sum(LAMBDA)   #リード数の総和を100万にしている

#ポアソン分布に従う乱数を生成してシミュレーションデータを得る
out <- NULL                            #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param1){                    #param1回ループを回す
    out <- cbind(out, rpois(n=length(LAMBDA), lambda=LAMBDA))#length(LAMBDA)個の乱数を発生させている(λベクトルはLAMBDAで与えている)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#得られたparam2行×param1列からなる行列outがポアソン分布に従っているかを確認
obj <- apply(out, 1, var) > 0          #条件を満たすかどうかを判定した結果をobjに格納(行列outの各行の分散が0より大きいかどうか)
out2 <- out[obj,]                      #objがTRUEのもののみ抽出してout2に格納
MEAN <- apply(out2, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(out2, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy")         #両対数(底は10)プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示

#行列outをファイルに出力
tmp <- cbind(LAMBDA, out)              #保存したい情報をtmpに格納(LAMBDAの数値情報, 行列out)
colnames(tmp) <- c("LAMBDA", paste("replicate",1:param1,sep=""))#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. シミュレーションデータの作成本番(G1群3サンプル vs. G2群3サンプルのデータで、全遺伝子の10%がG1群で2倍高発現というデータにしたい場合):

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_Ngene <- 10000                   #全遺伝子数を指定
param4 <- 0.1                          #発現変動遺伝子の割合を指定    
param5 <- 2                            #発現変動の度合い(fold-change)を指定    

#データファイルの読み込みとλベクトルの作成(kidneyのfive technical replicatesのデータを用いる)
tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
tmp <- rowSums(tmp[,1:5])              #kidneyの5 replicatesのデータの各行の和を計算している
LAMBDA <- tmp[tmp > 0]                 #λが0だと意味がないのでそういうものを除いている
LAMBDA <- sample(LAMBDA, param_Ngene, replace=TRUE)#param_Ngeneで指定した数だけサンプリングした結果をLAMBDAに格納
LAMBDA <- LAMBDA*1000000/sum(LAMBDA)   #リード数の総和を100万にしている

#発現変動遺伝子(DEG)に相当する位置情報の特定、およびG1群用にその部分のみ(param5)倍高発現となるようなλに変更
DEG_degree <- rep(1, param_Ngene)      #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree[1:(param_Ngene*param4)] <- param5#param_Ngene個の遺伝子ベクトル中最初の(param_Ngene*param4)個の発現変動の度合いをparam5としている
DEG_posi <- DEG_degree == param5       #DEGの位置情報を取得している
LAMBDA_A <- LAMBDA*DEG_degree          #G1群用のλ(つまりLAMBDA*DEG_degree)をLAMBDA_Aに格納
LAMBDA_B <- LAMBDA                     #G2群用のλ(つまりLAMBDA)をLAMBDA_Bに格納

#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(G1群用)
outA <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G1){                  #param_G1回ループを回す(つまりG1群のサンプル数分だけループを回している)
    outA <- cbind(outA, rpois(n=length(LAMBDA_A), lambda=LAMBDA_A))#length(LAMBDA_A)個の乱数を発生させている(λベクトルはLAMBDA_Aで与えている)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(G2群用)
outB <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G2){                  #param_G2回ループを回す(つまりG2群のサンプル数分だけループを回している)
    outB <- cbind(outB, rpois(n=length(LAMBDA_B), lambda=LAMBDA_B))#length(LAMBDA_B)個の乱数を発生させている(λベクトルはLAMBDA_Bで与えている)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#ファイルに保存
tmp <- cbind(outA, outB)               #保存したい情報をtmpに格納(G1群とG2群のデータ)
colnames(tmp) <- c(paste("G1_rep",1:param_G1,sep=""),paste("G2_rep",1:param_G2,sep=""))#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#M-A plotを描画して確認
data <- tmp                            #シミュレーションデータをdataとして取り扱う
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- mean_G2 - mean_G1            #M-A plotの縦軸に相当する情報(Minus)を計算した結果をy_axisに格納
param_xrange <- c(0.5, 10000)          #横軸の描画範囲を指定したものをparam_xrangeに格納
plot(x_axis, y_axis, pch=20, cex=0.1, xlim=log2(param_xrange), xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)")#M-A plotを描画
points(x_axis[DEG_posi], y_axis[DEG_posi], col="magenta", pch=20, cex=0.1)#DEGに相当するもの(つまりDEG_posiがTRUEの部分)の色をマゼンタにしている
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", c("DEG", "non-DEG"), col=c("magenta", "black"), pch=19)#legendを表示
	

5. シミュレーションデータの作成本番(G1群3サンプル vs. G2群3サンプルのデータで、全遺伝子の10%がDEG。DEGのうちの80%がG1群で高発現、残りの20%がG2群で高発現というデータにしたい場合):

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_Ngene <- 10000                   #全遺伝子数を指定
param4 <- 0.1                          #発現変動遺伝子の割合(PDEG)を指定    
param5 <- 2                            #発現変動の度合い(fold-change)を指定  
param6 <- 0.8                          #DEGのうちG1群で高発現なものの割合(PA)を指定   

#データファイルの読み込みとλベクトルの作成(kidneyのfive technical replicatesのデータを用いる)
tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
tmp <- rowSums(tmp[,1:5])              #kidneyの5 replicatesのデータの各行の和を計算している
LAMBDA <- tmp[tmp > 0]                 #λが0だと意味がないのでそういうものを除いている
LAMBDA <- sample(LAMBDA, param_Ngene, replace=TRUE)#param_Ngeneで指定した数だけサンプリングした結果をLAMBDAに格納
LAMBDA <- LAMBDA*1000000/sum(LAMBDA)   #リード数の総和を100万にしている

#発現変動遺伝子(DEG)に相当する位置情報の特定、およびその部分のみ(param5)倍高発現となるようなλに変更
DEG_degree_A <- rep(1, param_Ngene)    #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree_A[1:(param_Ngene*param4*param6)] <- param5#param_Ngene個の遺伝子ベクトル中最初の(param_Ngene*param4*param6)個の発現変動の度合いをparam5としている
LAMBDA_A <- LAMBDA*DEG_degree_A        #G1群用のλ(つまりLAMBDA*DEG_degree_A)をLAMBDA_Aに格納
DEG_degree_B <- rep(1, param_Ngene)    #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree_B[(param_Ngene*param4*param6+1):param_Ngene*param4)] <- param5#param_Ngene個の遺伝子ベクトル中「(param_Ngene*param4*param6+1):(param_Ngene*param4)」に相当する位置のの発現変動の度合いをparam5としている
LAMBDA_B <- LAMBDA*DEG_degree_B        #G2群用のλ(つまりLAMBDA*DEG_degree_B)をLAMBDA_Bに格納
DEG_posi <- (DEG_degree_A*DEG_degree_B) > 1#DEGの位置情報を取得している

#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(G1群用)
outA <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G1){                    #param_G1回ループを回す(つまりG1群のサンプル数分だけループを回している)
    outA <- cbind(outA, rpois(n=length(LAMBDA_A), lambda=LAMBDA_A))#length(LAMBDA_A)個の乱数を発生させている(λベクトルはLAMBDA_Aで与えている)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(G2群用)
outB <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G2){                    #param_G2回ループを回す(つまりG2群のサンプル数分だけループを回している)
    outB <- cbind(outB, rpois(n=length(LAMBDA_B), lambda=LAMBDA_B))#length(LAMBDA_B)個の乱数を発生させている(λベクトルはLAMBDA_Bで与えている)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#ファイルに保存
tmp <- cbind(outA, outB)               #保存したい情報をtmpに格納(G1群とG2群のデータ)
colnames(tmp) <- c(paste("G1_rep",1:param_G1,sep=""),paste("G2_rep",1:param_G2,sep=""))#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#M-A plotを描画して確認
data <- tmp                            #シミュレーションデータをdataとして取り扱う
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- mean_G2 - mean_G1            #M-A plotの縦軸に相当する情報(Minus)を計算した結果をy_axisに格納
param_xrange <- c(0.5, 10000)          #横軸の描画範囲を指定したものをparam_xrangeに格納
plot(x_axis, y_axis, pch=20, cex=0.1, xlim=log2(param_xrange), xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)")#M-A plotを描画
points(x_axis[DEG_posi], y_axis[DEG_posi], col="magenta", pch=20, cex=0.1)#DEGに相当するもの(つまりDEG_posiがTRUEの部分)の色をマゼンタにしている
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", c("DEG", "non-DEG"), col=c("magenta", "black"), pch=19)#legendを表示
	

6. シミュレーションデータの作成本番:

Robinson and Oshlack, 2010のFig. 2のデータとほとんど同じものを作りたい場合。違いはG1群およびG2群でuniqueに発現しているものを入れてないだけ

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_Ngene <- 20000                   #全遺伝子数を指定
param4 <- 0.1                          #発現変動遺伝子の割合(PDEG)を指定    
param5 <- 2                            #発現変動の度合い(fold-change)を指定  
param6 <- 0.8                          #DEGのうちG1群で高発現なものの割合(PA)を指定   

#データファイルの読み込みとλベクトルの作成(kidneyのfive technical replicatesのデータを用いる)
tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
tmp <- rowSums(tmp[,1:5])              #kidneyの5 replicatesのデータの各行の和を計算している
LAMBDA <- tmp[tmp > 0]                 #λが0だと意味がないのでそういうものを除いている
LAMBDA <- sample(LAMBDA, param_Ngene, replace=TRUE)#param_Ngeneで指定した数だけサンプリングした結果をLAMBDAに格納
LAMBDA <- LAMBDA*1000000/sum(LAMBDA)   #リード数の総和を100万にしている

#発現変動遺伝子(DEG)に相当する位置情報の特定、およびその部分のみ(param5)倍高発現となるようなλに変更
DEG_degree_A <- rep(1, param_Ngene)    #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree_A[1:(param_Ngene*param4*param6)] <- param5#param_Ngene個の遺伝子ベクトル中最初の(param3*param4*param6)個の発現変動の度合いをparam5としている
LAMBDA_A <- LAMBDA*DEG_degree_A        #G1群用のλ(つまりLAMBDA*DEG_degree_A)をLAMBDA_Aに格納
DEG_degree_B <- rep(1, param_Ngene)    #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree_B[(param_Ngene*param4*param6+1):(param_Ngene*param4)] <- param5#param_Ngene個の遺伝子ベクトル中「(param_Ngene*param4*param6+1):(param_Ngene*param4)」に相当する位置のの発現変動の度合いをparam5としている
LAMBDA_B <- LAMBDA*DEG_degree_B        #G2群用のλ(つまりLAMBDA*DEG_degree_B)をLAMBDA_Bに格納
DEG_posi <- (DEG_degree_A*DEG_degree_B) > 1#DEGの位置情報を取得している

#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(G1群用)
outA <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G1){                    #param_G1回ループを回す(つまりG1群のサンプル数分だけループを回している)
    outA <- cbind(outA, rpois(n=length(LAMBDA_A), lambda=LAMBDA_A))#length(LAMBDA_A)個の乱数を発生させている(λベクトルはLAMBDA_Aで与えている)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(G2群用)
outB <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G2){                    #param_G2回ループを回す(つまりG2群のサンプル数分だけループを回している)
    outB <- cbind(outB, rpois(n=length(LAMBDA_B), lambda=LAMBDA_B))#length(LAMBDA_B)個の乱数を発生させている(λベクトルはLAMBDA_Bで与えている)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#ファイルに保存
tmp <- cbind(outA, outB)               #保存したい情報をtmpに格納(G1群とG2群のデータ)
colnames(tmp) <- c(paste("G1_rep",1:param_G1,sep=""),paste("G2_rep",1:param_G2,sep=""))#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#M-A plotを描画して確認
data <- tmp                            #シミュレーションデータをdataとして取り扱う
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- mean_G2 - mean_G1            #M-A plotの縦軸に相当する情報(Minus)を計算した結果をy_axisに格納
param_xrange <- c(0.5, 10000)          #横軸の描画範囲を指定したものをparam_xrangeに格納
plot(x_axis, y_axis, pch=20, cex=0.1, xlim=log2(param_xrange), xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)")#M-A plotを描画
points(x_axis[DEG_posi], y_axis[DEG_posi], col="magenta", pch=20, cex=0.1)#DEGに相当するもの(つまりDEG_posiがTRUEの部分)の色をマゼンタにしている
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", c("DEG", "non-DEG"), col=c("magenta", "black"), pch=19)#legendを表示
	

解析 | 発現変動 | 負の二項分布 | シミュレーションデータ(Biological replicates)

誰が最初か今のところ把握していませんがBiological replicatesのデータが負の二項分布(negative binomial distribution; NB分布) に従うというのがこの業界のコンセンサスです。つまり、ポアソン分布よりももっとばらつき(dispersion)が大きいということを言っています。 ここではまず、NB modelの一般式としてVARIANCE = MEAN + φ×(MEAN)^2において、MEAN=10 and φ=0.1 のNBモデルに従う乱数を発生させて発現変動解析との関連のイメージをつかみます。 このときのVARIANCEの期待値はVARIANCE = 10 + 0.1×(10)^2 = 20となります。このほかにも様々な例を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. MEAN=10 and φ=0.1の場合(基本形):

(MEAN-VARIANCE plotをファイルpngファイルに保存しています)

out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_MEAN <- 10                       #平均カウント数(MEAN)を指定
param_dispersion <- 0.1                #dispersion parameterの値を指定
param_Ngene <- 1000                    #全遺伝子数を指定
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#NB分布に従う乱数を発生
rnbinom(n=100, mu=param_MEAN, size=1/param_dispersion)#100個の乱数を発生させている
hoge <- rnbinom(n=10000, mu=param_MEAN, size=1/param_dispersion)#10000個の乱数を発生させた結果をhogeに格納
var(hoge)                              #分散を計算した結果を表示(期待値通り)

#NB分布に従うシミュレーションデータを作成
hoge1 <-param_Ngene*(param_G1 + param_G2)#必要な乱数の数を計算している(行数×列数)
hoge2 <- rnbinom(n=hoge1, mu=param_MEAN, size=1/param_dispersion)#指定した数の乱数を発生させた結果をhoge2に格納
data <- matrix(hoge2, nrow=param_Ngene)#(param_Ngene)行からなる行列データに変換した結果をdataに格納
head(data)                             #確認してるだけです
dim(data)                              #行数と列数を表示

#MEAN-VARIANCE plot(ファイルに保存)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
MEAN <- apply(data, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(data, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="black")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1

#指定した平均カウント数における最大の発現変動遺伝子(DEG)を作成してプロット
DEG <- c(rep(0, param_G1), rep(param_MEAN*2, param_G2))#可能な最大のDEGの発現パターンを自作した結果をDEGに格納(G2で高発現にしている)
DEG                                    #発現パターンを表示
mean(DEG)                              #DEGの平均カウント数(MEAN)を表示
var(DEG)                               #DEGの分散(VARIANCE)を表示
points(mean(DEG), var(DEG), col="red", cex=1.0, pch=20)#DEGの点を指定した色で描画
legend("topright", c("DEG", "non-DEG"), col=c("red", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

2. G1群2サンプル vs. G2群2サンプルのデータで、全遺伝子の15%がDEG。DEGのうちの20%がG1群で4倍高発現、残りの80%がG2群で4倍高発現というデータにしたい場合:

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 4                            #発現変動の度合い(fold-change)を指定
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 2                          #G2群のサンプル数を指定
param_Ngene <- 20000                   #全遺伝子数を指定
param_PDEG <- 0.15                     #発現変動遺伝子の割合(PDEG)を指定
param_PA <- 0.2                        #DEGのうちG1群で高発現なものの割合(PA)を指定

#必要なパッケージをロード
library(NBPSeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data(arab)                             #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab                           #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
data.cl <- c(rep(1, 3), rep(2, 3))     #G1群を1、G2群を2としたベクトルdata.clを作成(ここのラベル情報は経験分布作成用のデータが3群 vs. 3群のデータだと分かっているため)

#RPM正規化して群ごとのMEANとφの経験分布情報を取得
RPM <- sweep(data, 2, 1000000/colSums(data), "*")#RPM正規化した結果をRPMに格納
RPM_A <- RPM[,data.cl == 1]            #G1群のデータのみ抽出してRPM_Aに格納
RPM_B <- RPM[,data.cl == 2]            #G2群のデータのみ抽出してRPM_Bに格納
RPM_A <- RPM_A[apply(RPM_A, 1, var) > 0,]#分散が0より大きいもののみ抽出
RPM_B <- RPM_B[apply(RPM_B, 1, var) > 0,]#分散が0より大きいもののみ抽出
MEAN <- c(apply(RPM_A, 1, mean), apply(RPM_B, 1, mean))#RPM補正後のread countsの遺伝子ごとの平均値を計算した結果をMEANに格納
VARIANCE <- c(apply(RPM_A, 1, var), apply(RPM_B, 1, var))#RPM補正後のread countsの遺伝子ごとの分散を計算した結果をVARIANCEに格納
DISPERSION <- (VARIANCE - MEAN)/(MEAN*MEAN)#RPM補正後のread countsの遺伝子ごとのφを計算した結果をDISPERSIONに格納
mean_disp_tmp <- cbind(MEAN, DISPERSION)#MEANとDISPERSIONを列方向に結合した結果をmean_disp_tmpに格納
mean_disp_tmp <- mean_disp_tmp[mean_disp_tmp[,2] > 0,]#mean_disp_tmp行列中の二列目(DISPERSION部分)が0より大きいもののみ抽出(理由は後に使うrnbinom関数が負のdispersion parameterの値を許容しないからです)
hoge <- sample(1:nrow(mean_disp_tmp), param_Ngene, replace=TRUE)#最終的にparam_Ngeneで指定した行数分のデータにしたいので、mean_disp_tmp行列の行数から(復元抽出で)ランダムサンプリングするための数値ベクトル情報をhogeに格納
mean_disp <- mean_disp_tmp[hoge,]      #mean_disp_tmp行列からhogeで指定した行を抽出した結果をmean_dispに格納

#指定したDEGの条件にすべく、meanに相当するところの値を群ごとに変更する。また、このときにDEGの位置情報も取得している
mu <- mean_disp[,1]                    #経験分布の平均値に相当する情報をmuに格納(単に文字数を減らして見やすくしたいだけです)
DEG_degree_A <- rep(1, param_Ngene)         #(param_Ngene)で指定した遺伝子数分だけ倍率変化の初期値を1倍としたものをDEG_degree_Aに格納
DEG_degree_A[1:(param_Ngene*param_PDEG*param_PA)] <- param1#DEG_degree_Aのベクトルに対して、最初の行から(param_Ngene*param_PDEG*param_PA)で表現されるG1群で高発現にする遺伝子数分に相当する位置を(param1)倍するという情報に置換する
mu_A <- mu*DEG_degree_A                #G1群で高発現とする位置のmuの値を(param1)倍した結果をmu_Aに格納
DEG_degree_B <- rep(1, param_Ngene)         #(param_Ngene)で指定した遺伝子数分だけ倍率変化の初期値を1倍としたものをDEG_degree_Bに格納
DEG_degree_B[(param_Ngene*param_PDEG*param_PA+1):(param_Ngene*param_PDEG)] <- param1#DEG_degree_Bのベクトルに対して、G1群で高発現とした位置情報の次の行(param_Ngene*param_PDEG*param_PA+1)からG2群で高発現にする遺伝子数分に相当する位置を(param1)倍するという情報に置換する
mu_B <- mu*DEG_degree_B                #G2群で高発現とする位置のmuの値を(param1)倍した結果をmu_Bに格納
DEG_posi_org <- (DEG_degree_A*DEG_degree_B) > 1#DEGに相当する位置をTRUE、それ以外をFALSEとしたベクトルをDEG_posi_orgに格納
nonDEG_posi_org <- (DEG_degree_A*DEG_degree_B) == 1#non-DEGに相当する位置をTRUE、それ以外をFALSEとしたベクトルをnon-DEG_posi_orgに格納

#負の二項分布に従う乱数を生成して群ごとのシミュレーションデータを得る
outA <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G1){                   #(param_G1)回ループを回す
    outA <- cbind(outA, rnbinom(n=length(mu_A), mu=mu_A, size=1/mean_disp[,2]))#length(mu_A)個の乱数を発生させている(rnbinom関数はVARIANCE=mu + mu^2/sizeとして定義しているので左記のような指定方法でよい)
}                                                                #ここまできたら、次のiの値でループの最初からやり直し
outB <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G2){                   #(param_G2)回ループを回す
    outB <- cbind(outB, rnbinom(n=length(mu_B), mu=mu_B, size=1/mean_disp[,2]))#length(mu_B)個の乱数を発生させている(rnbinom関数はVARIANCE=mu + mu^2/sizeとして定義しているので左記のような指定方法でよい)
}                                                                #ここまできたら、次のiの値でループの最初からやり直し

#(param_Ngene)行(param_G1+param_G2)列のカウント情報からなる行列outから全ての列でゼロカウントの行を削除した行列RAWを作成し、ファイルに出力
out <- cbind(outA, outB)               #G1群のデータとG2群のデータを列方向で結合した結果をoutに格納
obj <- rowSums(out) > 0                #条件を満たすかどうかを判定した結果をobjに格納(行の和が0より大きいかどうか)
RAW <- out[obj,]                       #行列outの中からobjベクトルの値がTRUEとなる行のみを抽出してRAWに格納
DEG_posi <- DEG_posi_org[obj]          #DEG_posi_orgベクトルに対して、objベクトルの値がTRUEとなる要素のみを抽出してDEG_posiに格納
nonDEG_posi <- nonDEG_posi_org[obj]    #nonDEG_posi_orgベクトルに対して、objベクトルの値がTRUEとなる要素のみを抽出してnonDEG_posiに格納
tmp <- cbind(RAW, DEG_posi)            #保存したい情報をtmpに格納(行列RAWとDEGかどうかのフラグ情報)
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#M-A plotを描画して確認
data <- RAW                            #シミュレーションデータRAWをdataとして取り扱う
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- mean_G2 - mean_G1            #M-A plotの縦軸に相当する情報(Minus)を計算した結果をy_axisに格納
#param_xrange <- c(0.5, 10000)         #横軸の描画範囲を指定したものをparam_xrangeに格納
#plot(x_axis, y_axis, pch=20, cex=0.1, xlim=log2(param_xrange), xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)")#M-A plotを描画
plot(x_axis, y_axis, pch=20, cex=0.1, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)")#M-A plotを描画
points(x_axis[DEG_posi], y_axis[DEG_posi], col="magenta", pch=20, cex=0.1)#DEGに相当するもの(つまりDEG_posiがTRUEの部分)の色をマゼンタにしている
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", c("DEG", "non-DEG"), col=c("magenta", "black"), pch=19)#legendを表示
	

3. G1群1サンプル vs. G2群1サンプルのデータで、全遺伝子の15%がDEG。DEGのうちの20%がG1群で4倍高発現、残りの80%がG2群で4倍高発現というデータにしたい場合:

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 4                            #発現変動の度合い(fold-change)を指定
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_Ngene <- 20000                   #全遺伝子数を指定
param_PDEG <- 0.15                     #発現変動遺伝子の割合(PDEG)を指定
param_PA <- 0.2                        #DEGのうちG1群で高発現なものの割合(PA)を指定

#必要なパッケージをロード
library(NBPSeq)                        #パッケージの読み込み

#発現データの読み込みとラベル情報の作成
data(arab)                             #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab                           #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
data.cl <- c(rep(1, 3), rep(2, 3))     #G1群を1、G2群を2としたベクトルdata.clを作成

#RPM正規化して群ごとのMEANとφの経験分布情報を取得
RPM <- sweep(data, 2, 1000000/colSums(data), "*")#RPM正規化した結果をRPMに格納
RPM_A <- RPM[,data.cl == 1]            #G1群のデータのみ抽出してRPM_Aに格納
RPM_B <- RPM[,data.cl == 2]            #G2群のデータのみ抽出してRPM_Bに格納
RPM_A <- RPM_A[apply(RPM_A,1,var) > 0,]#分散が0より大きいもののみ抽出
RPM_B <- RPM_B[apply(RPM_B,1,var) > 0,]#分散が0より大きいもののみ抽出
MEAN <- c(apply(RPM_A, 1, mean), apply(RPM_B, 1, mean))#RPM補正後のread countsの遺伝子ごとの平均値を計算した結果をMEANに格納
VARIANCE <- c(apply(RPM_A, 1, var), apply(RPM_B, 1, var))#RPM補正後のread countsの遺伝子ごとの分散を計算した結果をVARIANCEに格納
DISPERSION <- (VARIANCE - MEAN)/(MEAN*MEAN)#RPM補正後のread countsの遺伝子ごとのφを計算した結果をDISPERSIONに格納
mean_disp_tmp <- cbind(MEAN, DISPERSION)#MEANとDISPERSIONを列方向に結合した結果をmean_disp_tmpに格納
mean_disp_tmp <- mean_disp_tmp[mean_disp_tmp[,2] > 0,]#mean_disp_tmp行列中の二列目(DISPERSION部分)が0より大きいもののみ抽出(理由は後に使うrnbinom関数が負のdispersion parameterの値を許容しないからです)
hoge <- sample(1:nrow(mean_disp_tmp), param_Ngene, replace=TRUE)#最終的にparam_Ngeneで指定した行数分のデータにしたいので、mean_disp_tmp行列の行数から(復元抽出で)ランダムサンプリングするための数値ベクトル情報をhogeに格納
mean_disp <- mean_disp_tmp[hoge,]      #mean_disp_tmp行列からhogeで指定した行を抽出した結果をmean_dispに格納

#指定したDEGの条件にすべく、meanに相当するところの値を群ごとに変更する。また、このときにDEGの位置情報も取得している
mu <- mean_disp[,1]                    #経験分布の平均値に相当する情報をmuに格納(単に文字数を減らして見やすくしたいだけです)
DEG_degree_A <- rep(1, param_Ngene)    #(param_Ngene)で指定した遺伝子数分だけ倍率変化の初期値を1倍としたものをDEG_degree_Aに格納
DEG_degree_A[1:(param_Ngene*param_PDEG*param_PA)] <- param1#DEG_degree_Aのベクトルに対して、最初の行から(param_Ngene*param_PDEG*param_PA)で表現されるG1群で高発現にする遺伝子数分に相当する位置を(param1)倍するという情報に置換する
mu_A <- mu*DEG_degree_A                #G1群で高発現とする位置のmuの値を(param1)倍した結果をmu_Aに格納
DEG_degree_B <- rep(1, param_Ngene)    #(param_Ngene)で指定した遺伝子数分だけ倍率変化の初期値を1倍としたものをDEG_degree_Bに格納
DEG_degree_B[(param_Ngene*param_PDEG*param_PA+1):(param_Ngene*param_PDEG)] <- param1#DEG_degree_Bのベクトルに対して、G1群で高発現とした位置情報の次の行(param_Ngene*param_PDEG*param_PA+1)からG2群で高発現にする遺伝子数分に相当する位置を(param1)倍するという情報に置換する
mu_B <- mu*DEG_degree_B                #G2群で高発現とする位置のmuの値を(param1)倍した結果をmu_Bに格納
DEG_posi_org <- (DEG_degree_A*DEG_degree_B) > 1#DEGに相当する位置をTRUE、それ以外をFALSEとしたベクトルをDEG_posi_orgに格納
nonDEG_posi_org <- (DEG_degree_A*DEG_degree_B) == 1#non-DEGに相当する位置をTRUE、それ以外をFALSEとしたベクトルをDEG_posi_orgに格納

#負の二項分布に従う乱数を生成して群ごとのシミュレーションデータを得る
outA <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G1){                   #(param_G1)回ループを回す
    outA <- cbind(outA, rnbinom(n=length(mu_A), mu=mu_A, size=1/mean_disp[,2]))#length(mu_A)個の乱数を発生させている(rnbinom関数はVARIANCE=mu + mu^2/sizeとして定義しているので左記のような指定方法でよい)
}                                      #ここまできたら、次のiの値でループの最初からやり直し
outB <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G2){                   #(param_G2)回ループを回す
    outB <- cbind(outB, rnbinom(n=length(mu_B), mu=mu_B, size=1/mean_disp[,2]))#length(mu_B)個の乱数を発生させている(rnbinom関数はVARIANCE=mu + mu^2/sizeとして定義しているので左記のような指定方法でよい)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#(param_Ngene)行(param_G1+param_G2)列のカウント情報からなる行列outから全ての列でゼロカウントの行を削除した行列RAWを作成し、ファイルに出力
out <- cbind(outA, outB)               #G1群のデータとG2群のデータを列方向で結合した結果をoutに格納
obj <- rowSums(out) > 0                #条件を満たすかどうかを判定した結果をobjに格納(行の和が0より大きいかどうか)
RAW <- out[obj,]                       #行列outの中からobjベクトルの値がTRUEとなる行のみを抽出してRAWに格納
DEG_posi <- DEG_posi_org[obj]          #DEG_posi_orgベクトルに対して、objベクトルの値がTRUEとなる要素のみを抽出してDEG_posiに格納
nonDEG_posi <- nonDEG_posi_org[obj]    #nonDEG_posi_orgベクトルに対して、objベクトルの値がTRUEとなる要素のみを抽出してnonDEG_posiに格納
tmp <- cbind(RAW, DEG_posi)            #保存したい情報をtmpに格納(行列RAWとDEGかどうかのフラグ情報)
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#M-A plotを描画して確認
data <- RAW                            #シミュレーションデータRAWをdataとして取り扱う
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- mean_G2 - mean_G1            #M-A plotの縦軸に相当する情報(Minus)を計算した結果をy_axisに格納
#param_xrange <- c(0.5, 10000)         #横軸の描画範囲を指定したものをparam_xrangeに格納
#plot(x_axis, y_axis, pch=20, cex=0.1, xlim=log2(param_xrange), xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)")#M-A plotを描画
plot(x_axis, y_axis, pch=20, cex=0.1, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)")#M-A plotを描画
points(x_axis[DEG_posi], y_axis[DEG_posi], col="magenta", pch=20, cex=0.1)#DEGに相当するもの(つまりDEG_posiがTRUEの部分)の色をマゼンタにしている
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", c("DEG", "non-DEG"), col=c("magenta", "black"), pch=19)#legendを表示
	

解析 | 発現変動 | について

ここでは、RNA-seqから得られるカウントデータの特徴や、実験デザイン、モデルなどについて基本的なところを述べます。

カウントデータとモデル

私のマイクロアレイの論文(Kadota et al., 2009)では、「データ正規化法」と「発現変動遺伝子検出法」の組合せに相性がある、ということを述べています。NGSデータ解析時にも同様な注意が必要です。

ここでの入力データは「遺伝子発現行列」です。「raw countsのもの」か「正規化後」の遺伝子発現行列のどちらを入力データとして用いるのかは用いる方法によりますが、特に指定のない限り「raw countsのデータ」を入力として下さい。

NGSデータは測定値が何回sequenceされたかというcount情報に基づくもので、digital gene expression (DGE)データなどと呼ばれます。 そして、生のカウントデータは当然ながら、integer (整数;小数点以下の数値を含むはずがない)です。 ある遺伝子由来のsequenceされたリード数は二項分布(binomial distribution)に従うと様々な論文中で言及されています。つまり、

  • 一般的な二項分布の説明:1(成功)か0(失敗)かのいずれかのn回の独立な試行を行ったときの1の数で表現される離散確率分布で、1が出る確率をpとしている。
  • NGSに置き換えた説明:マップされたトータルのリード数がnで、あるリードに着目したときにある特定の遺伝子由来のものである確率がp、ということになります。

ポアソン分布(Poisson distribution)に従う、という記述もよくみかけますが本質的に同じ意味(ポアソン分布や正規分布は二項分布の近似)です。 つまり、nが大きいのがNGSの特徴であるので、pが小さくても、np(sequenceされたある特定の遺伝子由来のリード数の期待値、に相当; λ=np)がそこそこ大きな値になることが期待されるわけです。

というわけですので、このような二項分布を仮定したモデルに基づく「発現変動遺伝子検出法」を用いる際には、 へたに正規化を行ってそのモデルを仮定することができなくなるような墓穴を掘ることはないでしょう、ということです。

ちなみに「負の二項分布(negative bionomial distribution)」というキーワードを目にすることもあろうかと思いますが、これは二項分布の拡張版です。

いわゆるtechnical variation (技術的なばらつき)は「ポアソン分布」として考えることができるが、 biological variation (生物学的なばらつき;もう少し正確にはbiological replicatesのvariation)は一般にそれよりも大きいので(サンプル間の変動係数(coefficient of variation; CV)を)additional variationとして取り扱うべく「負の二項(Negative Binomial; NB)分布」として考える必要性があるのでしょうね。(Robinson and Oshlack, 2010)

technical replicatesとbiological replicatesの意味合い

technical replicatesとbiological replicatesの意味合いについて、もうすこしざっくりと説明します。

例えば「人間である私の体内の二つの組織間(例えば大脳(Brain; B)と皮膚(Skin; S))で発現変動している遺伝子を検出したい」という目的があったとします。 同じ組織でもばらつきを考慮する必要があるので大脳由来サンプルをいくつかに分割して(これがtechnical replicatesという意味)データを取得します。 皮膚由来サンプルについても同様です。これで得られたデータは(B1, B2, ...) vs. (S1, S2, ...)のようなreplicatesありのデータになります。 この私一個人のtechnical replicatesデータから発現変動遺伝子が得られたとします。 一般的に「私一個人内でのデータのばらつき(technical variation)」は「同じ人間だけど複数の別人の大脳(or 皮膚)由来サンプル間のばらつき(biological variation)」よりも小さいです。 ですので、technical replicates由来データで発現変動遺伝子(Differentially Expressed Genes; DEGs)を同定した結果は「そんなあほな!!」というくらいのDEGs数がレポートされます。 ここで注意しなければいけないのは、この結果は「私一個人の二つのサンプル間で発現変動している遺伝子がこれだけあった」ということを言っているだけで、 「(私が所属する)人間全般に言えることではない!」という点です。そしてもちろん一般には「私個人の事象についてではなく人間(ある特定の生物種)全般にいえる事象に興味がある」わけです。 それゆえ(biological replicatesのデータでないとユニバーサルな事象を理解するのが難しいために)ある程度理解が進んだ人はbiological replicatesが重要だと言っているわけです。

「モデルだ〜分布だ〜」ということと「ユーザーがプログラムを実行して得られる結果(発現変動遺伝子数や特徴)」との関係

「モデルだ〜分布だ〜」ということと「ユーザーがプログラムを実行して得られる結果(発現変動遺伝子数や特徴)」との関係についてですが、重要なのは「比較している二群間でどの程度差があれば発現変動していると判断するか?」です。

これをうまく表現するために、同一サンプルの(biological) replicatesデータから発現変動していないデータがどの程度ばらついているかをまず見積もります。 (このときにどういう数式でばらつきを見積もるのか?というところでいろんな選択肢が存在するがために沢山のRパッケージが存在しうるというわけですが、、、まあこれはおいといて) 負の二項分布モデル(negative binomial model; NB model)では分散VARをVAR = MEAN + φMEAN^2という数式(φ > 0)で表現するのが一般的です。 ちなみにポアソンモデルというのはNBモデルのφ = 0の場合(つまりVAR = MEAN; ある遺伝子の平均発現量がわかるとその遺伝子の分散が概ね平均と同じ、という意味)です。 計算手順としては、同一サンプルの(biological) replicatesデータからφがどの程度の値かを見積もります(推定します)。 ここまでで「ある発現変動していない遺伝子(non-DEGs)の平均発現量がこれくらいのときの分散はこれくらい」という情報が得られます。 これで発現変動していないものの分布(モデル)が決まります。その後、比較する二つのサンプルのカウント(発現量)データを一緒にして分散を計算し、 non-DEGsの分布のどの程度の位置にいるか(p値)を計算し、形式的には帰無仮説(Null Hypothesis)を棄却するかどうかという手順を経てDEG or non-DEGの判定をします。

用いる正規化法の違いが(non-DEGの)モデル構築にどう影響するか?どう関係するのか?

用いる正規化法の違いが(non-DEGの)モデル構築にどう影響するか?どう関係するのか?についてですが、これは極めてシンプルで、DEGかどうかの判定をする際に「比較する二つのサンプルのカウント(発現量)データを一緒にして分散を計算し...」を行う際に、サンプル間の正規化がうまくできていなければバラツキ(分散)を正しく計算できません。

ただそれだけですが、用いる正規化法次第で結果が大きく異なりうるのです(Robinson and Oshlack, 2010)。そして発現変動解析結果はその後の解析(GO解析など)にほとんどそのまま反映されますので私を含む多くのグループが正規化法の開発や性能評価といったあたりの研究を行っています。

正規化 | についてのところでも述べていますが、大抵の場合、 パッケージ独自の「正規化法」と「発現変動遺伝子検出法」が実装されており、「どの正規化法を使うか?」ということが「どの発現変動遺伝子検出法を使うか?」ということよりも結果に与える影響が大きい(Bullard et al., 2010; Kadota et al., 2012; Garmire and Subramanian, 2012)ことがわかりつつあります。 従来のサンプル間正規化法(RPMやTMM法)は比較する二群間(G1群 vs. G2群)でDEG数に大きな偏りがないことを前提にしています。 つまり、「(G1群 >> G2群)のDEG数と(G1群 << G2群)のDEG数が同程度」という前提条件がありますが、実際には大きく偏りがある場合も想定すべきで、偏りがあるなしにかかわらずロバストに正規化を行ってくれるのがTbT正規化法(Kadota et al., 2012)です。 偏りがあるなしの主な原因はDEGの分布にあるわけです。よって、TbT論文では、「正規化中にDEG検出を行い、DEGを除き、non-DEGのみで再度正規化係数を決める」というDEG elimination strategyに基づく正規化法を提案しています。 そして、TbT法を含むDEG elimination strategyに基づくいくつかの正規化法をTCCというRパッケージ中に実装しています(TCC論文中ではこの戦略をDEGES「でげす」と呼んでいます; Sun et al., 2013)。TCCパッケージ中に実装されている主な方法および入力データは以下の通りです:

  1. DEGES/TbT:オリジナルのTbT法そのもの。TMM-baySeq-TMMという3ステップで正規化を行う方法。step 2のDEG同定のところで計算時間のかかるbaySeqを採用しているため、他のパッケージでは数秒で終わる正規化ステップが数十分程度はかかるのがネック。また、biological replicatesがあることを前提としている。(A1, A2, ...) vs. (B1, B2, ...)のようなデータという意味。
  2. iDEGES/edgeR:DEGES/TbT法の超高速版(100倍程度高速)。TMM-(edgeR-TMM)nというステップで正規化を行う方法(デフォルトはn = 3)。step 2のDEG同定のところでedgeRパッケージ中のexact test (Robinson and Smyth, 2008)を採用しているためDEG同定の高速化が可能。
    したがって、(step2 - step3)のサイクルをiterative (それゆえDEGESの頭にiterativeの意味を示すiがついたiDEGESとなっている)に行ってよりロバストな正規化係数を得ることが理論的に可能な方法です。 それゆえreplicatesのある二群間比較を行いたい場合にはDEGES/TbTよりもiDEGES/edgeRのほうがおすすめ。
  3. iDEGES/DESeq:一連のmulti-stepの正規化手順をすべてDESeqパッケージ中の関数のみで実装したパイプライン。複製実験のない二群間比較時(i.e., A1 vs. B1など)にはこちらを利用します。

TCCパッケージでは、内部的にedgeR, baySeq, DESeqを利用しています。

解析 | 発現変動 | 2群間 | 対応なし | 複製あり | TCC (Sun_2013)

TCCを用いたやり方を示します。

内部的にiDEGES/edgeR(Sun_2013)正規化を実行したのち、 edgeRパッケージ中のexact testで発現変動遺伝子(Differentially expressed Genes; DEGs)検出を行っています。TCC原著論文中のiDEGES/edgeR-edgeRという解析パイプラインに相当します。 全てTCCパッケージ(Sun et al., BMC Bioinformatics, 2013)内で完結します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge1.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR)               #param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

正規化後のテキストファイルデータを出力し、平均-分散プロットのpngファイルを出力しています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge2.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge2.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(平均-分散プロット)
hoge <- normalized                     #正規化後のデータをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納

png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="black")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
obj <- (result$q.value < param_FDR)    #条件を満たすかどうかを判定した結果をobjに格納
points(MEAN[obj], VARIANCE[obj], col="magenta", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

DEG検出後に任意のFDR閾値を満たす遺伝子数を調べたり、色分けしたりx, y軸の範囲を限定するなどする様々なテクニックを示しています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.1                       #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納

#後処理(様々な情報を得ている)
sum(tcc$estimatedDEG)                  #param_FDRのところで指定した閾値を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
sum(tcc$DEGES$potentialDEG)            #DEGES正規化のstep2でpotential DEGと判定された数を表示
tcc$norm.factors                       #DEGES正規化係数を表示(この係数を用いてDEG検出を行っている)

#ファイルに保存(全遺伝子でM-A plot)
out_f1 <- "hoge3_all_010.png"           #出力ファイル名を指定してout_f1に格納
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
A <- getResult(tcc)$a.value            #M-A plotのA値を抽出
png(out_f1, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)",#M-A plotを描画
     xlim=c(-2, 16), ylim=c(-8, 6), pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
obj <- tcc$stat$q.value < param_FDR    #条件を満たすかどうかを判定した結果をobjに格納
points(A[obj], M[obj], col="magenta", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
sum(M[obj] < 0)                        #FDR < 0.10を満たものの中でM < 0(G1群で高発現)となる遺伝子数を表示
sum(M[obj] > 0)                        #FDR < 0.10を満たものの中でM > 0(G2群で高発現)となる遺伝子数を表示

#ファイルに保存(non-DEGデータのみでM-A plot; FDR < 0.1)
tcc <- tcc[param_nonDEG]               #non-DEGデータ情報のみ抽出
out_f2 <- "hoge3_nonDEG_010.png"       #出力ファイル名を指定してout_f2に格納

M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
A <- getResult(tcc)$a.value            #M-A plotのA値を抽出
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)",#M-A plotを描画
     xlim=c(-2, 16), ylim=c(-8, 6), pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
obj <- tcc$stat$q.value < param_FDR    #条件を満たすかどうかを判定した結果をobjに格納
points(A[obj], M[obj], col="magenta", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
sum(M[obj] < 0)                        #FDR < 0.10を満たものの中でM < 0(G1群で高発現)となる遺伝子数を表示
sum(M[obj] > 0)                        #FDR < 0.10を満たものの中でM > 0(G2群で高発現)となる遺伝子数を表示

#ファイルに保存(non-DEGデータのみでM-A plot; FDR < 0.2)
param_FDR <- 0.2                       #DEG検出時のfalse discovery rate (FDR)閾値を指定
out_f3 <- "hoge3_nonDEG_020.png"       #出力ファイル名を指定してout_f3に格納
M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
A <- getResult(tcc)$a.value            #M-A plotのA値を抽出
png(out_f3, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)",#M-A plotを描画
     xlim=c(-2, 16), ylim=c(-8, 6), pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
obj <- tcc$stat$q.value < param_FDR    #条件を満たすかどうかを判定した結果をobjに格納
points(A[obj], M[obj], col="magenta", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
sum(M[obj] < 0)                        #FDR < 0.10を満たものの中でM < 0(G1群で高発現)となる遺伝子数を表示
sum(M[obj] > 0)                        #FDR < 0.10を満たものの中でM > 0(G2群で高発現)となる遺伝子数を表示

#ファイルに保存(non-DEGデータのみでM-A plot; FDR < 0.4)
param_FDR <- 0.4                       #DEG検出時のfalse discovery rate (FDR)閾値を指定
out_f4 <- "hoge3_nonDEG_040.png"       #出力ファイル名を指定してout_f4に格納

M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
A <- getResult(tcc)$a.value            #M-A plotのA値を抽出
png(out_f4, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)",#M-A plotを描画
     xlim=c(-2, 16), ylim=c(-8, 6), pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
obj <- tcc$stat$q.value < param_FDR    #条件を満たすかどうかを判定した結果をobjに格納
points(A[obj], M[obj], col="magenta", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
sum(M[obj] < 0)                        #FDR < 0.10を満たものの中でM < 0(G1群で高発現)となる遺伝子数を表示
sum(M[obj] > 0)                        #FDR < 0.10を満たものの中でM > 0(G2群で高発現)となる遺伝子数を表示

#ファイルに保存(non-DEGデータのみでM-A plot; FDR < 0.6)
param_FDR <- 0.6                       #DEG検出時のfalse discovery rate (FDR)閾値を指定
out_f5 <- "hoge3_nonDEG_060.png"        #出力ファイル名を指定してout_f5に格納

M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
A <- getResult(tcc)$a.value            #M-A plotのA値を抽出
png(out_f5, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)",#M-A plotを描画
     xlim=c(-2, 16), ylim=c(-8, 6), pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
obj <- tcc$stat$q.value < param_FDR    #条件を満たすかどうかを判定した結果をobjに格納
points(A[obj], M[obj], col="magenta", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
sum(M[obj] < 0)                        #FDR < 0.10を満たものの中でM < 0(G1群で高発現)となる遺伝子数を表示
sum(M[obj] > 0)                        #FDR < 0.10を満たものの中でM > 0(G2群で高発現)となる遺伝子数を表示
	

4. サンプルデータ4の18,110 genes×10 samplesのリアルデータ(data_marioni.txt; kidney 5サンプル vs. liver 5サンプル)の場合:

「FDR閾値を満たすもの」と「fold-change閾値を満たすもの」それぞれのM-A plotを作成しています。

in_f <- "data_marioni.txt"             #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge4.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge4_FDR.png"              #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge4_FC.png"               #出力ファイル名を指定してout_f3に格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_FC <- 2                          #fold-change閾値(param_FC倍)を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot; FDR)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR, xlim=c(-3, 13), ylim=c(-10, 10))#param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
legend("bottomright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示

#ファイルに保存(M-A plot; fold-change)
param_FC <- 2                          #fold-change閾値(param_FC倍)を指定
M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
hoge <- rep(1, length(M))              #初期値を1にしたベクトルhogeを作成
hoge[abs(M) > log2(param_FC)] <- 2     #条件を満たす位置に2を代入
cols <- c("black", "magenta")          #色情報を指定してcolsに格納

png(out_f3, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, col=cols, col.tag=hoge, xlim=c(-3, 13), ylim=c(-10, 10))#M-A plotを描画
legend("bottomright", c(paste("DEG(", param_FC, "-fold)", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
sum(abs(M) > log2(16))                 #16倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(8))                  #8倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(4))                  #4倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(2))                  #2倍以上発現変動する遺伝子数を表示
	

5. サンプルデータ4の18,110 genes×10 samplesのリアルデータ(data_marioni.txt; kidney 5サンプル vs. liver 5サンプル)の最初の4サンプルを比較する場合:

「FDR閾値を満たすもの」と「fold-change閾値を満たすもの」それぞれのM-A plotを作成しています。

in_f <- "data_marioni.txt"             #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge5.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge5_FDR.png"              #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge5_FC.png"               #出力ファイル名を指定してout_f3に格納
param_G1 <- 2                          #G1群(kidney)のサンプル数を指定
param_G2 <- 2                          #G2群(liver)のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_FC <- 2                          #fold-change閾値(param_FC倍)を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出)
data <- data[,1:(param_G1+param_G2)]   #最初の(param_G1+param_G2)列分のデータを抽出している

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot; FDR)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR, xlim=c(-3, 13), ylim=c(-10, 10))#param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
legend("bottomright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示

#ファイルに保存(M-A plot; fold-change)
param_FC <- 2                          #fold-change閾値(param_FC倍)を指定
M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
hoge <- rep(1, length(M))              #初期値を1にしたベクトルhogeを作成
hoge[abs(M) > log2(param_FC)] <- 2     #条件を満たす位置に2を代入
cols <- c("black", "magenta")          #色情報を指定してcolsに格納

png(out_f3, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, col=cols, col.tag=hoge, xlim=c(-3, 13), ylim=c(-10, 10))#M-A plotを描画
legend("bottomright", c(paste("DEG(", param_FC, "-fold)", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
sum(abs(M) > log2(16))                 #16倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(8))                  #8倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(4))                  #4倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(2))                  #2倍以上発現変動する遺伝子数を表示
	

6. サンプルデータ8の26,221 genes×6 samplesのリアルデータ(data_arab.txt; mock 3サンプル vs. hrcc 3サンプル)の場合:

「FDR閾値を満たすもの」と「fold-change閾値を満たすもの」それぞれのM-A plotを作成しています。

in_f <- "data_arab.txt"                #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge6.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge6_FDR.png"              #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge6_FC.png"               #出力ファイル名を指定してout_f3に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_FC <- 2                          #fold-change閾値(param_FC倍)を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出)
data <- data[,1:(param_G1+param_G2)]   #最初の(param_G1+param_G2)列分のデータを抽出している

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot; FDR)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR, xlim=c(-3, 13), ylim=c(-10, 10))#param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
legend("bottomright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示

#ファイルに保存(M-A plot; fold-change)
param_FC <- 2                          #fold-change閾値(param_FC倍)を指定
M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
hoge <- rep(1, length(M))              #初期値を1にしたベクトルhogeを作成
hoge[abs(M) > log2(param_FC)] <- 2     #条件を満たす位置に2を代入
cols <- c("black", "magenta")          #色情報を指定してcolsに格納

png(out_f3, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, col=cols, col.tag=hoge, xlim=c(-3, 13), ylim=c(-10, 10))#M-A plotを描画
legend("bottomright", c(paste("DEG(", param_FC, "-fold)", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
sum(abs(M) > log2(16))                 #16倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(8))                  #8倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(4))                  #4倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(2))                  #2倍以上発現変動する遺伝子数を表示
	

7. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

1.と基本的に同じで、出力のテキストファイルが正規化前のデータではなく正規化後のデータになっていて、発現変動順にソートしたものになっています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge7.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge7.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR)               #param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

解析 | 発現変動 | 2群間 | 対応なし | 複製あり | edgeR(Robinson_2010)

edgeRパッケージを用いて発現変動遺伝子(Differentially expressed Genes; DEGs)検出を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化を実行
d <- estimateCommonDisp(d)             #the quantile-adjusted conditional maximum likelihood (qCML)法でcommon dispersionを計算している
d <- estimateTagwiseDisp(d)            #the quantile-adjusted conditional maximum likelihood (qCML)法でmoderated tagwise dispersionを計算している
out <- exactTest(d)                    #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

MA-plotも描くやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化を実行
d <- estimateCommonDisp(d)             #the quantile-adjusted conditional maximum likelihood (qCML)法でcommon dispersionを計算している
d <- estimateTagwiseDisp(d)            #the quantile-adjusted conditional maximum likelihood (qCML)法でmoderated tagwise dispersionを計算している
out <- exactTest(d)                    #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#MA-plotを描画
plotSmear(d)                           #MA-plotの基本形(縦軸(M):log-ratio, 横軸(A):全体的な発現レベル)
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

MA-plotも描き、FDR < 0.05を満たすものを赤色で示すやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化を実行
d <- estimateCommonDisp(d)             #the quantile-adjusted conditional maximum likelihood (qCML)法でcommon dispersionを計算している
d <- estimateTagwiseDisp(d)            #the quantile-adjusted conditional maximum likelihood (qCML)法でmoderated tagwise dispersionを計算している
out <- exactTest(d)                    #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#MA-plotを描画
hoge <- rownames(data)[q.value < param_FDR]#指定したFDRの閾値を満たす遺伝子名情報をhogeに格納
plotSmear(d, de.tags=hoge)             #MA-plotの基本形に加え、発現変動遺伝子に相当する
length(hoge)                           #発現変動遺伝子数を表示
length(hoge)/nrow(data)                #発現変動遺伝子の全遺伝子数に占める割合を表示
	

4. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

MA-plotも描き、FDR値で発現変動順に並べた上位300個を赤色で示すやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param3 <- 300                          #MA-plot描画時の赤色で示す上位遺伝子数の閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化を実行
d <- estimateCommonDisp(d)             #the quantile-adjusted conditional maximum likelihood (qCML)法でcommon dispersionを計算している
d <- estimateTagwiseDisp(d)            #the quantile-adjusted conditional maximum likelihood (qCML)法でmoderated tagwise dispersionを計算している
out <- exactTest(d)                    #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#MA-plotを描画
hoge <- rownames(data)[ranking <= param3]#param3で指定した個数の上位遺伝子の遺伝子名情報をhogeに格納
plotSmear(d, de.tags=hoge)             #MA-plotの基本形に加え、発現変動遺伝子に相当する
length(hoge)                           #発現変動遺伝子数を表示
length(hoge)/nrow(data)                #発現変動遺伝子の全遺伝子数に占める割合を表示
	

5. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

MA-plotも描き、2倍以上発現変化しているものを赤色で示すやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param3 <- 2                            #MA-plot描画時の倍率変化の閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化を実行
d <- estimateCommonDisp(d)             #the quantile-adjusted conditional maximum likelihood (qCML)法でcommon dispersionを計算している
d <- estimateTagwiseDisp(d)            #the quantile-adjusted conditional maximum likelihood (qCML)法でmoderated tagwise dispersionを計算している
out <- exactTest(d)                    #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#MA-plotを描画
hoge <- rownames(data)[abs(out$table$logFC) >= log2(param3)]#param3で指定した倍率変化の閾値を満たす遺伝子名情報をhogeに格納
plotSmear(d, de.tags=hoge)             #MA-plotの基本形に加え、発現変動遺伝子に相当する
length(hoge)                           #発現変動遺伝子数を表示
length(hoge)/nrow(data)                #発現変動遺伝子の全遺伝子数に占める割合を表示
	

6. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

MA-plotも描き、MA-plotで大きさを指定してpng形式ファイルに保存するやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge6.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge6.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param3 <- 2                            #MA-plot描画時の倍率変化の閾値を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化を実行
d <- estimateCommonDisp(d)             #the quantile-adjusted conditional maximum likelihood (qCML)法でcommon dispersionを計算している
d <- estimateTagwiseDisp(d)            #the quantile-adjusted conditional maximum likelihood (qCML)法でmoderated tagwise dispersionを計算している
out <- exactTest(d)                    #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#MA-plotを描画
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hoge <- rownames(data)[abs(out$table$logFC) >= log2(param3)]#param3で指定した倍率変化の閾値を満たす遺伝子名情報をhogeに格納
plotSmear(d, de.tags=hoge)             #MA-plotの基本形に加え、発現変動遺伝子に相当する
dev.off()                              #おまじない
length(hoge)                           #発現変動遺伝子数を表示
length(hoge)/nrow(data)                #発現変動遺伝子の全遺伝子数に占める割合を表示
	

7. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

MA-plotも描き、FDR < 0.01を満たすものを赤色で示したMA-plotをファイルに保存するやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge7.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge7.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.01                      #MA-plot描画時のfalse discovery rate (FDR)閾値を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化を実行
d <- estimateCommonDisp(d)             #the quantile-adjusted conditional maximum likelihood (qCML)法でcommon dispersionを計算している
d <- estimateTagwiseDisp(d)            #the quantile-adjusted conditional maximum likelihood (qCML)法でmoderated tagwise dispersionを計算している
out <- exactTest(d)                    #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
#write.table(tmp[order(ranking),], out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存(発現変動順にソートしたいとき)

#MA-plotを描画
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hoge <- rownames(data)[q.value < param_FDR]#指定したFDRの閾値を満たす遺伝子名情報をhogeに格納
plotSmear(d, de.tags=hoge)             #MA-plotの基本形に加え、発現変動遺伝子に相当する
dev.off()                              #おまじない
length(hoge)                           #発現変動遺伝子数を表示
length(hoge)/nrow(data)                #発現変動遺伝子の全遺伝子数に占める割合を表示
	

8. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

MA-plotも描き、FDR < 0.01を満たすものを赤色で示したMA-plotをファイルに保存するやり方です。 基本は7と同じで、MA-plotの描画をplotSmear関数を用いないで行うやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge8.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge8.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.01                      #MA-plot描画時のfalse discovery rate (FDR)閾値を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化を実行
d <- estimateCommonDisp(d)             #the quantile-adjusted conditional maximum likelihood (qCML)法でcommon dispersionを計算している
d <- estimateTagwiseDisp(d)            #the quantile-adjusted conditional maximum likelihood (qCML)法でmoderated tagwise dispersionを計算している
out <- exactTest(d)                    #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPM正規化後のデータでM-A plotを描画(するための基礎情報取得)
norm_f_RPM <- 1000000/colSums(data)    #各列に対して掛ける正規化係数を計算してnorm_f_RPMに格納
RPM <- sweep(data, 2, norm_f_RPM, "*") #norm_f_RPMを各列に掛けた結果をRPMに格納
data <- RPM                            #RPMをdataに格納
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (q.value < param_FDR)      #指定した閾値未満のものの位置情報をDEG_posiに格納

#MA-plotを描画(本番)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A=(log2(G2)+log2(G1))/2", ylab="M=log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
points(x_axis[DEG_posi], y_axis[DEG_posi], col="red", pch=20, cex=0.1)#DEGを赤色にしている
dev.off()                              #おまじない
sum(DEG_posi)                          #発現変動遺伝子数を表示
sum(DEG_posi)/nrow(data)               #発現変動遺伝子の全遺伝子数に占める割合を表示
	

9. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

MA-plotも描き、FDR < 0.01を満たすものを赤色で示したMA-plotをファイルに保存するやり方です。 基本は8と同じで、MA-plotの描画をRPMではなくTMM正規化後のデータで行うやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge9.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge9.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.01                      #MA-plot描画時のfalse discovery rate (FDR)閾値を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#edgeRを用いてDEGの検出を実行
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化を実行
d <- estimateCommonDisp(d)             #the quantile-adjusted conditional maximum likelihood (qCML)法でcommon dispersionを計算している
d <- estimateTagwiseDisp(d)            #the quantile-adjusted conditional maximum likelihood (qCML)法でmoderated tagwise dispersionを計算している
out <- exactTest(d)                    #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPM正規化後のデータでM-A plotを描画(するための基礎情報取得)
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化係数を計算
norm_f_TMM <- d$samples$norm.factors   #TMM正規化係数の情報を抽出してnorm_f_TMMに格納
names(norm_f_TMM) <- colnames(data)    #norm_f_TMMのnames属性をcolnames(data)で与えている
effective_libsizes <- colSums(data) * norm_f_TMM#effective library sizesというのはlibrary sizesに(TMM)正規化係数を掛けたものなのでそれを計算した結果をeffective_libsizesに格納
RPM_TMM <- sweep(data, 2, 1000000/effective_libsizes, "*")#元のカウントデータをeffective_libsizesで割り(RPMデータと同程度の数値分布にしたいので)1000000を掛けた正規化後のデータをRPM_TMMに格納

data <- RPM_TMM                        #RPM_TMMをdataに格納
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_edgeR < param_FDR)      #指定した閾値未満のものの位置情報をDEG_posiに格納

#MA-plotを描画(本番)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A=(log2(G2)+log2(G1))/2", ylab="M=log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
points(x_axis[DEG_posi], y_axis[DEG_posi], col="red", pch=20, cex=0.1)#DEGを赤色にしている
dev.off()                              #おまじない
sum(DEG_posi)                          #発現変動遺伝子数を表示
sum(DEG_posi)/nrow(data)               #発現変動遺伝子の全遺伝子数に占める割合を表示
	

解析 | 発現変動 | 2群間 | 対応なし | 複製あり | SAMseq(Li_2013)

samrパッケージ中のSAMseq (Li and Tibshirani, 2013)を用いて 発現変動遺伝子(Differentially expressed Genes; DEGs)検出を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(samr)                          #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番(DEG検出)
out <- SAMseq(data, data.cl, resp.type="Two class unpaired")#DEG検出を実行した結果をoutに格納
p.value <- samr.pvalues.from.perms(out$samr.obj$tt, out$samr.obj$ttstar)#p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < 0.10)                    #FDR < 0.10を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納。
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

このDEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_DEG <- 2000                      #DEG数を指定
param_nonDEG <- 8000                   #non-DEG数を指定

#必要なパッケージをロード
library(samr)                          #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番(DEG検出)
out <- SAMseq(data, data.cl, resp.type="Two class unpaired")#DEG検出を実行した結果をoutに格納
p.value <- samr.pvalues.from.perms(out$samr.obj$tt, out$samr.obj$ttstar)#p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < 0.10)                    #FDR < 0.10を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納。
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#後処理(AUC値の計算)
obj <- c(rep(1, param_DEG), rep(0, param_nonDEG))#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

3. サンプルデータ13と同じ10,000 genes×6 samplesのシミュレーションデータの作成から行う場合:

「G1_rep1, G1_rep2, G1_rep3, G2_rep1, G2_rep2, G2_rep3」の計6サンプル分からなります。 全10,000遺伝子中の最初の2,000個(gene_1〜gene_2000まで)が発現変動遺伝子(DEG)です。 全2,000 DEGsの内訳:最初の90%分(gene_1〜gene_1800)がG1群で4倍高発現、残りの10%分(gene_1801〜gene_2000)がG2群で4倍高発現

このDEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(samr)                          #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=10000, PDEG=0.2,#シミュレーションデータの作成
             DEG.assign=c(0.9, 0.1),   #シミュレーションデータの作成
             DEG.foldchange=c(4, 4),   #シミュレーションデータの作成
             replicates=c(3, 3))       #シミュレーションデータの作成
data <- tcc$count                      #カウントデータ情報をdataに格納
data.cl <- tcc$group$group             #G1群を1、G2群を2としたベクトルdata.clを作成

#本番(DEG検出)
out <- SAMseq(data, data.cl, resp.type="Two class unpaired")#DEG検出を実行した結果をoutに格納
p.value <- samr.pvalues.from.perms(out$samr.obj$tt, out$samr.obj$ttstar)#p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < 0.10)                    #FDR < 0.10を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納。
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#後処理(AUC値の計算)
obj <- as.numeric(tcc$simulation$trueDEG != 0)#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

4. サンプルデータ13と同じ10,000 genes×6 samplesのシミュレーションデータの作成から行う場合:

「G1_rep1, G1_rep2, G1_rep3, G2_rep1, G2_rep2, G2_rep3」の計6サンプル分からなります。 全10,000遺伝子中の最初の2,000個(gene_1〜gene_2000まで)が発現変動遺伝子(DEG)です。 全2,000 DEGsの内訳:最初の90%分(gene_1〜gene_1800)がG1群で4倍高発現、残りの10%分(gene_1801〜gene_2000)がG2群で4倍高発現

このDEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。 samrパッケージではなくTCCパッケージを用いています。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(samr)                          #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=10000, PDEG=0.2,#シミュレーションデータの作成
             DEG.assign=c(0.9, 0.1),   #シミュレーションデータの作成
             DEG.foldchange=c(4, 4),   #シミュレーションデータの作成
             replicates=c(3, 3))       #シミュレーションデータの作成

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="samseq")#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(q.value < 0.10)                    #FDR < 0.10を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#後処理(AUC値の計算)
calcAUCValue(tcc)                      #AUC計算
	

解析 | 発現変動 | 2群間 | 対応なし | 複製なし | TCC (Sun_2013)

TCCを用いたやり方を示します。

内部的にiDEGES/DESeq(Sun_2013)正規化を実行したのち、 DESeqパッケージ中のnegative binomial testで発現変動遺伝子(Differentially expressed Genes; DEGs)検出を行っています。 TCC原著論文中のiDEGES/DESeq-DESeqという解析パイプラインに相当します。 全てTCCパッケージ内で完結します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", test.method="deseq",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
head(result, n=3)                      #確認してるだけです(最初の3遺伝子分を表示)
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画したり、 このDEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_DEG <- 2000                      #DEG数を指定
param_nonDEG <- 8000                   #non-DEG数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", test.method="deseq",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
head(result, n=3)                      #確認してるだけです(最初の3遺伝子分を表示)
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#正規化後のデータでM-A plotを描画
plot(tcc, FDR=param_FDR)               #param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画

#AUC値の計算
ranking <- tcc$stat$rank               #順位情報をrankingに格納
obj <- c(rep(1, param_DEG), rep(0, param_nonDEG))#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

3. サンプルデータ8の26,221 genes×6 samplesのリアルデータ(data_arab.txt; mock 3サンプル vs. hrcc 3サンプル)の場合:

mock群の1番目(mock1)と3番目(mock3)のサブセットを抽出して複製なしデータとして取り扱っています。

「FDR閾値を満たすもの」と「fold-change閾値を満たすもの」それぞれのM-A plotを作成しています。

in_f <- "data_arab.txt"                #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge3.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge3_FDR.png"              #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge3_FC.png"               #出力ファイル名を指定してout_f3に格納
param_subset <- c(1, 3)                #取り扱いたいサブセット情報を指定
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_FC <- 2                          #fold-change閾値(param_FC倍)を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <-data[,param_subset]             #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", test.method="deseq",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
head(result, n=3)                      #確認してるだけです(最初の3遺伝子分を表示)
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot; FDR)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR, xlim=c(-3, 13), ylim=c(-10, 10))#param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
legend("bottomright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示

#ファイルに保存(M-A plot; fold-change)
param_FC <- 2                          #fold-change閾値(param_FC倍)を指定
M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
hoge <- rep(1, length(M))              #初期値を1にしたベクトルhogeを作成
hoge[abs(M) > log2(param_FC)] <- 2     #条件を満たす位置に2を代入
cols <- c("black", "magenta")          #色情報を指定してcolsに格納

png(out_f3, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, col=cols, col.tag=hoge, xlim=c(-3, 13), ylim=c(-10, 10))#M-A plotを描画
legend("bottomright", c(paste("DEG(", param_FC, "-fold)", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
sum(abs(M) > log2(16))                 #16倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(8))                  #8倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(4))                  #4倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(2))                  #2倍以上発現変動する遺伝子数を表示
	

4. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

1.と基本的に同じで、出力のテキストファイルが正規化前のデータではなく正規化後のデータになっていて、発現変動順にソートしたものになっています。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge4.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge4.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", test.method="deseq",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR)               #param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

解析 | 発現変動 | 2群間 | 対応なし | 複製なし | DESeq (Anders_2010)

Anders and Huberの(AH)正規化(Anders_2010)を実行したのち、 DESeqパッケージ中のnegative binomial testで発現変動遺伝子(Differentially expressed Genes; DEGs)検出を行うDESeqパッケージ内のオリジナルの手順を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(DESeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番(Anders and Huberの(AH)正規化)
cds <- newCountDataSet(data, data.cl)  #CountDataSetオブジェクトを作成してcdsに格納
cds <- estimateSizeFactors(cds)        #size factorを計算し、結果をcdsに格納
sizeFactors(cds)                       #これがDESeqのsize factorsです(1.049957, 0.952420)

#本番(DEG検出)
cds <- estimateDispersions(cds, method="blind", sharingMode="fit-only")#モデル構築
out <- nbinomTest(cds, 1, 2)           #発現変動の各種統計量を計算し、結果をoutに格納
p.value <- out$pval                    #p-valueをp.valueに格納
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- out$padj                    #adjusted p-valueをq.valueに格納
q.value[is.na(q.value)] <- 1           #NAを1に置換している
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
logratio <- out$log2FoldChange         #log2(B/A)統計量をlogratioに格納
head(out, n=3)                         #確認してるだけです(最初の3遺伝子分を表示)
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data, p.value, q.value, ranking, logratio)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画したり、 このDEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_DEG <- 2000                      #DEG数を指定
param_nonDEG <- 8000                   #non-DEG数を指定
param_FDR <- 0.1                       #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(DESeq)                         #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番(Anders and Huberの(AH)正規化)
cds <- newCountDataSet(data, data.cl)  #CountDataSetオブジェクトを作成してcdsに格納
cds <- estimateSizeFactors(cds)        #size factorを計算し、結果をcdsに格納
sizeFactors(cds)                       #これがDESeqのsize factorsです(1.049957, 0.952420)

#本番(DEG検出)
cds <- estimateDispersions(cds, method="blind", sharingMode="fit-only")#モデル構築
out <- nbinomTest(cds, 1, 2)           #発現変動の各種統計量を計算し、結果をoutに格納
p.value <- out$pval                    #p-valueをp.valueに格納
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- out$padj                    #adjusted p-valueをq.valueに格納
q.value[is.na(q.value)] <- 1           #NAを1に置換している
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
logratio <- out$log2FoldChange         #log2(B/A)統計量をlogratioに格納
head(out, n=3)                         #確認してるだけです(最初の3遺伝子分を表示)
sum(q.value < param_FDR)                 #指定したFDR閾値を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data, p.value, q.value, ranking, logratio)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#正規化後のデータでM-A plotを描画
plotMA(out)                            #指定したFDR閾値を満たすDEGを赤としてM-A plotを描画

#AUC値の計算
obj <- c(rep(1, param_DEG), rep(0, param_nonDEG))#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

3. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

TCCパッケージを用いて同様の解析を行うやり方です。出力ファイルのa.value列がlogratioに相当し、q.value列上でFDR閾値を決めます。

(内部的な細かい話ですが...)estimateDispersions関数実行時に、fitType="parametric"を最初に試して、エラーが出たら自動的に"local"に変更しています。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.10                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc,iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, FDR=param_FDR)  #DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
head(result, n=3)                      #確認してるだけです(最初の3遺伝子分を表示)
sum(tcc$stat$q.value < param_FDR)      #指定したFDR閾値を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

TCCパッケージを用いて同様の解析を行うやり方です。出力ファイルのa.value列がlogratioに相当し、q.value列上でFDR閾値を決めます。

(内部的な細かい話ですが...)estimateDispersions関数実行時に、fitType="parametric"を最初に試して、エラーが出たら自動的に"local"に変更しています。

param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画したり、 このDEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.10                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_DEG <- 2000                      #DEG数を指定
param_nonDEG <- 8000                   #non-DEG数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc,iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, FDR=param_FDR)  #DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
head(result, n=3)                      #確認してるだけです(最初の3遺伝子分を表示)
sum(tcc$stat$q.value < param_FDR)      #指定したFDR閾値を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#正規化後のデータでM-A plotを描画
plot(tcc, FDR=param_FDR)               #param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画

#AUC値の計算
ranking <- tcc$stat$rank               #順位情報をrankingに格納
obj <- c(rep(1, param_DEG), rep(0, param_nonDEG))#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

解析 | 発現変動 | 2群間 | 対応なし | 複製なし | edgeR(Robinson_2010)

edgeRパッケージを用いて発現変動遺伝子(Differentially expressed Genes; DEGs)検出を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化を実行
d <- estimateGLMCommonDisp(d, method="deviance", robust=TRUE, subset=NULL)#モデル構築
out <- exactTest(d)                    #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 発現変動 | 2群間 | BitSeq (Glaus_2012)

BitSeqのやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

#必要なパッケージをロード
library(BitSeq)                        #パッケージの読み込み
	

解析 | 発現変動 | 2群間 | DSS (Wu_201X)

DSS (Dispersion Shrinkage for Sequencing)のやり方を示します。二群間比較用です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

#必要なパッケージをロード
library(DSS)                           #パッケージの読み込み
	

解析 | 発現変動 | 2群間 | NOISeq (Tarazona_2011)

NOISeq(参考文献1)のやり方を示します。二群間比較用です。

ここでは、以下の3つのデータセットに対するやり方を示します:

  1. Technical replicatesデータ(G1群5サンプル vs. G2群5サンプル)
  2. Biological replicatesデータ(G1群3サンプル vs. G2群3サンプル: data_arab.txt)
  3. Biological replicatesシミュレーションデータ(G1群3サンプル vs. G2群3サンプル: simdata_3vs3.txt)

Technical replicatesのほうは、サンプルデータ2のSupplementaryTable2_changed.txtのデータです。

Biological replicatesのほうは、NBPSeqパッケージに同梱されているArabidopsis(シロイヌナズナ)のデータ(サンプルデータ8のdata_arab.txt)です。

この方法は負の二項分布(negative-binomial distribution;biological replicates用)やポアソン分布(Poisson distribution;technical replicates用)などの何らかの分布を仮定したパラメトリックな方法(edgeR, DESeq, baySeq, NBPSeq, GPseqなどが該当)とは異なり、ノンパラメトリックな方法です。

replicateがないデータ(G1群1サンプル vs. G2群1サンプル)場合には(technical replicatesを想定して?!)noise distributionを作成し、replicatesがある場合には同一群内のデータを用いてnoise distributionを作成することでDEG or non-DEGの判定をするような仕組みになっています。

また、この方法は転写物の長さ情報も(RPKM補正後のデータを使いたい場合には)使います。マニュアル中にはここでは長さ情報がない場合には"NA"という情報を含むファイル(SupplementaryTable2_changed_length.txt)を入力として与えるという選択肢を提供していますが、私が2012/06/19に試した限りではうまく動きません。 よって、以下では長さ情報を含むファイルを読み込まずに実行するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. Technical replicatesデータ(G1群5サンプル vs. G2群5サンプル)の場合(データの正規化はTMM法を採用する場合):

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f1 <- "hoge1.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param3 <- "tech"                       #replicatesのタイプを指定。入力データがtechnical replicatesの場合は"tech"を、biological replicatesの場合は"bio"を指定
param4 <- "tmm"                        #データ正規化手段を指定。Upper Quartile値を揃える場合は"uqua"を、TMM正規化法を採用する場合には"tmm"を、(転写物の長さ情報がある場合には1000bpに揃えて)総リード数が100万になるようにしたい場合には"rpkm"を、データ正規化を行わない場合には"n"を指定
param5 <- 0.8                          #DEGとみなすProbability(1に近いほどより厳しい閾値に相当)を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
source("http://bioinfo.cipf.es/noiseq/lib/exe/fetch.php?media=noiseq.r")#NOISeqを利用するための関数をロード

#入力ファイルの読み込みとラベル情報の作成
data <- readData(file=in_f, header=TRUE, cond1=c(2:(param_G1+1)), cond2=c((param_G1+2):(param_G1+1+param_G2)))#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
RAW <- cbind(data[[1]], data[[2]])     #結果の出力時にG1群G2群の別々に分かれた状態になっているのをまとめたものをRAWに格納(出力時により簡便に取り扱うためのおまじない)
rownames(RAW) <- rownames(data[[1]])   #RAWの行名を読み込んだ発現データファイルの一列目の情報で与えている

#NOISeq本番
out <- noiseq(data[[1]], data[[2]], repl=param3, norm=param4, long=1000, q=param5, nss=0, lc=1, k=0.5)#NOISeqを実行した結果をoutに格納

#得られた統計量や順位情報などを抽出してファイル出力
stat_NOISeq <- out$probab              #DEGとみなす確率(1に近いほど発現変動の度合いが大きくて0に近いほどnon-DEG。ここではq=0.8と指定しているので、Probabilityが0.8以上のものがDEGとされていることになる)をstat_NOISeqに格納
stat_NOISeq <- ifelse(is.na(stat_NOISeq), 0, stat_NOISeq)#NAを0に置換している(全部の数値が0で計算できないようなものがNAとなり、これらはDEGとは言えないのでProbabilityの値を0にしたいという思想です)
rank_NOISeq <- rank(-stat_NOISeq)      #stat_NOISeqでランキングした結果をrank_NOISeqに格納
hoge <- cbind(rownames(RAW), RAW, stat_NOISeq, rank_NOISeq)#入力データの右側に、「stat_NOISeq」と「rank_NOISeq」を結合した結果をtmpに格納
tmp <- hoge[order(rank_NOISeq),]       #発現変動の度合いでソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPM正規化後のデータでM-A plotを描画(するための基礎情報取得)
data <- RAW                            #RAWをdataに格納
norm_f_RPM <- 1000000/colSums(data)    #各列に対して掛ける正規化係数を計算してnorm_f_RPMに格納
RPM <- sweep(data, 2, norm_f_RPM, "*") #norm_f_RPMを各列に掛けた結果をRPMに格納
data <- RPM                            #RPMをdataに格納
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_NOISeq > param5)     #param5で指定した閾値以上のものの位置情報をDEG_posiに格納

#MA-plotを描画(本番)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
points(x_axis[DEG_posi], y_axis[DEG_posi], col="red", pch=20, cex=0.1)#DEGを赤色にしている
dev.off()                              #おまじない

#おまけ
sum(DEG_posi)                          #発現変動遺伝子数を表示
sum(DEG_posi)/nrow(data)               #発現変動遺伝子の全遺伝子数に占める割合を表示
	

2. Biological replicatesデータ(G1群3サンプル vs. G2群3サンプル)の場合:

in_f <- "data_arab.txt"                #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge2.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge2.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param3 <- "bio"                        #replicatesのタイプを指定。入力データがtechnical replicatesの場合は"tech"を、biological replicatesの場合は"bio"を指定
param4 <- "tmm"                        #データ正規化手段を指定。Upper Quartile値を揃える場合は"uqua"を、TMM正規化法を採用する場合には"tmm"を、(転写物の長さ情報がある場合には1000bpに揃えて)総リード数が100万になるようにしたい場合には"rpkm"を、データ正規化を行わない場合には"n"を指定
param5 <- 0.8                          #DEGとみなすProbability(1に近いほどより厳しい閾値に相当)を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
source("http://bioinfo.cipf.es/noiseq/lib/exe/fetch.php?media=noiseq.r")#NOISeqを利用するための関数をロード

#入力ファイルの読み込みとラベル情報の作成
data <- readData(file=in_f, header=TRUE, cond1=c(2:(param_G1+1)), cond2=c((param_G1+2):(param_G1+1+param_G2)))#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
RAW <- cbind(data[[1]], data[[2]])     #結果の出力時にG1群G2群の別々に分かれた状態になっているのをまとめたものをRAWに格納(出力時により簡便に取り扱うためのおまじない)
rownames(RAW) <- rownames(data[[1]])   #RAWの行名を読み込んだ発現データファイルの一列目の情報で与えている

#NOISeq本番
out <- noiseq(data[[1]], data[[2]], repl=param3, norm=param4, long=1000, q=param5, nss=0, lc=1, k=0.5)#NOISeqを実行した結果をoutに格納

#得られた統計量や順位情報などを抽出してファイル出力
stat_NOISeq <- out$probab              #DEGとみなす確率(1に近いほど発現変動の度合いが大きくて0に近いほどnon-DEG。ここではq=0.8と指定しているので、Probabilityが0.8以上のものがDEGとされていることになる)をstat_NOISeqに格納
stat_NOISeq <- ifelse(is.na(stat_NOISeq), 0, stat_NOISeq)#NAを0に置換している(全部の数値が0で計算できないようなものがNAとなり、これらはDEGとは言えないのでProbabilityの値を0にしたいという思想です)
rank_NOISeq <- rank(-stat_NOISeq)      #stat_NOISeqでランキングした結果をrank_NOISeqに格納
hoge <- cbind(rownames(RAW), RAW, stat_NOISeq, rank_NOISeq)#入力データの右側に、「stat_NOISeq」と「rank_NOISeq」を結合した結果をtmpに格納
tmp <- hoge[order(rank_NOISeq),]       #発現変動の度合いでソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPM正規化後のデータでM-A plotを描画(するための基礎情報取得)
data <- RAW                            #RAWをdataに格納
norm_f_RPM <- 1000000/colSums(data)    #各列に対して掛ける正規化係数を計算してnorm_f_RPMに格納
RPM <- sweep(data, 2, norm_f_RPM, "*") #norm_f_RPMを各列に掛けた結果をRPMに格納
data <- RPM                            #RPMをdataに格納
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_NOISeq > param5)     #param5で指定した閾値以上のものの位置情報をDEG_posiに格納

#MA-plotを描画(本番)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
points(x_axis[DEG_posi], y_axis[DEG_posi], col="red", pch=20, cex=0.1)#DEGを赤色にしている
dev.off()                              #おまじない

#おまけ
sum(DEG_posi)                          #発現変動遺伝子数を表示
sum(DEG_posi)/nrow(data)               #発現変動遺伝子の全遺伝子数に占める割合を表示
	

3. Biological replicatesのシミュレーションデータデータ(G1群3サンプル vs. G2群3サンプル、simdata_3vs3.txt)の場合:

in_f <- "simdata_3vs3.txt"             #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge3.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge3.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param3 <- "bio"                        #replicatesのタイプを指定。入力データがtechnical replicatesの場合は"tech"を、biological replicatesの場合は"bio"を指定
param4 <- "tmm"                        #データ正規化手段を指定。Upper Quartile値を揃える場合は"uqua"を、TMM正規化法を採用する場合には"tmm"を、(転写物の長さ情報がある場合には1000bpに揃えて)総リード数が100万になるようにしたい場合には"rpkm"を、データ正規化を行わない場合には"n"を指定
param5 <- 0.8                          #DEGとみなすProbability(1に近いほどより厳しい閾値に相当)を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
source("http://bioinfo.cipf.es/noiseq/lib/exe/fetch.php?media=noiseq.r")#NOISeqを利用するための関数をロード

#入力ファイルの読み込みとラベル情報の作成
data <- readData(file=in_f, header=TRUE, cond1=c(2:(param_G1+1)), cond2=c((param_G1+2):(param_G1+1+param_G2)))#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
RAW <- cbind(data[[1]], data[[2]])     #結果の出力時にG1群G2群の別々に分かれた状態になっているのをまとめたものをRAWに格納(出力時により簡便に取り扱うためのおまじない)
rownames(RAW) <- rownames(data[[1]])   #RAWの行名を読み込んだ発現データファイルの一列目の情報で与えている

#NOISeq本番
out <- noiseq(data[[1]], data[[2]], repl=param3, norm=param4, long=1000, q=param5, nss=0, lc=1, k=0.5)#NOISeqを実行した結果をoutに格納

#得られた統計量や順位情報などを抽出してファイル出力
stat_NOISeq <- out$probab              #DEGとみなす確率(1に近いほど発現変動の度合いが大きくて0に近いほどnon-DEG。ここではq=0.8と指定しているので、Probabilityが0.8以上のものがDEGとされていることになる)をstat_NOISeqに格納
stat_NOISeq <- ifelse(is.na(stat_NOISeq), 0, stat_NOISeq)#NAを0に置換している(全部の数値が0で計算できないようなものがNAとなり、これらはDEGとは言えないのでProbabilityの値を0にしたいという思想です)
rank_NOISeq <- rank(-stat_NOISeq)      #stat_NOISeqでランキングした結果をrank_NOISeqに格納
hoge <- cbind(rownames(RAW), RAW, stat_NOISeq, rank_NOISeq)#入力データの右側に、「stat_NOISeq」と「rank_NOISeq」を結合した結果をtmpに格納
tmp <- hoge[order(rank_NOISeq),]       #発現変動の度合いでソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPM正規化後のデータでM-A plotを描画(するための基礎情報取得)
data <- RAW                            #RAWをdataに格納
norm_f_RPM <- 1000000/colSums(data)    #各列に対して掛ける正規化係数を計算してnorm_f_RPMに格納
RPM <- sweep(data, 2, norm_f_RPM, "*") #norm_f_RPMを各列に掛けた結果をRPMに格納
data <- RPM                            #RPMをdataに格納
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_NOISeq > param5)     #param5で指定した閾値以上のものの位置情報をDEG_posiに格納

#MA-plotを描画(本番)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
points(x_axis[DEG_posi], y_axis[DEG_posi], col="red", pch=20, cex=0.1)#DEGを赤色にしている
dev.off()                              #おまじない

#おまけ
sum(DEG_posi)                          #発現変動遺伝子数を表示
sum(DEG_posi)/nrow(data)               #発現変動遺伝子の全遺伝子数に占める割合を表示
	

4. Biological replicatesのシミュレーションデータデータ(G1群3サンプル vs. G2群3サンプル、simdata_3vs3.txt)の場合

どこがDEGがわかっているのでAUC値を計算するところまでやる:

in_f <- "simdata_3vs3.txt"             #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge4.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge4.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param3 <- "bio"                        #replicatesのタイプを指定。入力データがtechnical replicatesの場合は"tech"を、biological replicatesの場合は"bio"を指定
param4 <- "tmm"                        #データ正規化手段を指定。Upper Quartile値を揃える場合は"uqua"を、TMM正規化法を採用する場合には"tmm"を、(転写物の長さ情報がある場合には1000bpに揃えて)総リード数が100万になるようにしたい場合には"rpkm"を、データ正規化を行わない場合には"n"を指定
param5 <- 0.8                          #DEGとみなすProbability(1に近いほどより厳しい閾値に相当)を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
source("http://bioinfo.cipf.es/noiseq/lib/exe/fetch.php?media=noiseq.r")#NOISeqを利用するための関数をロード
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data.tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
DEG_posi <- data.tmp$DEG_posi          #DEGの位置情報を取得
nonDEG_posi <- data.tmp$nonDEG_posi    #nonDEGの位置情報を取得
data <- data.tmp[,1:(param_G1+param_G2)]#発現データ部分のみ抽出してdataに格納
RAW <- data                            #dataの内容をRAWにコピーしてるだけー

#NOISeq本番
out <- noiseq(data[,data.cl==1], data[,data.cl==2], repl=param3, norm=param4, long=1000, q=param5, nss=0, lc=1, k=0.5)#NOISeqを実行した結果をoutに格納

#得られた統計量や順位情報などを抽出してファイル出力
stat_NOISeq <- out$probab              #DEGとみなす確率(1に近いほど発現変動の度合いが大きくて0に近いほどnon-DEG。ここではq=0.8と指定しているので、Probabilityが0.8以上のものがDEGとされていることになる)をstat_NOISeqに格納
stat_NOISeq <- ifelse(is.na(stat_NOISeq), 0, stat_NOISeq)#NAを0に置換している(全部の数値が0で計算できないようなものがNAとなり、これらはDEGとは言えないのでProbabilityの値を0にしたいという思想です)
rank_NOISeq <- rank(-stat_NOISeq)      #stat_NOISeqでランキングした結果をrank_NOISeqに格納
hoge <- cbind(rownames(RAW), RAW, stat_NOISeq, rank_NOISeq, DEG_posi)#入力データの右側に、「stat_NOISeq」、「rank_NOISeq」、「DEG_posi」を結合した結果をtmpに格納
write.table(hoge, out_f1, sep="\t", append=F, quote=F, row.names=F)#hogeの中身を指定したファイル名で保存

#AUC値を計算
AUC(rocdemo.sca(truth=DEG_posi, data=-rank_NOISeq))#AUC値を計算する関数AUCを実行(結果はそのまま表示されている。1に近いほど感度・特異度が高いことを示す)

#RPM正規化後のデータでM-A plotを描画(するための基礎情報取得)
data <- RAW                            #RAWをdataに格納
norm_f_RPM <- 1000000/colSums(data)    #各列に対して掛ける正規化係数を計算してnorm_f_RPMに格納
RPM <- sweep(data, 2, norm_f_RPM, "*") #norm_f_RPMを各列に掛けた結果をRPMに格納
data <- RPM                            #RPMをdataに格納
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_NOISeq > param5)     #param5で指定した閾値以上のものの位置情報をDEG_posiに格納

#MA-plotを描画(本番)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
points(x_axis[DEG_posi], y_axis[DEG_posi], col="red", pch=20, cex=0.1)#DEGを赤色にしている
dev.off()                              #おまじない

#おまけ
sum(DEG_posi)                          #発現変動遺伝子数を表示
sum(DEG_posi)/nrow(data)               #発現変動遺伝子の全遺伝子数に占める割合を表示
	

5. Biological replicatesのシミュレーションデータデータ(G1群3サンプル vs. G2群3サンプル、simdata_3vs3.txt)の場合

どこがDEGがわかっているのでAUC値を計算するところまでやり、予めTMM正規化したデータをNOISeqで解析する:

in_f <- "simdata_3vs3.txt"             #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge5.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge5.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param3 <- "bio"                        #replicatesのタイプを指定。入力データがtechnical replicatesの場合は"tech"を、biological replicatesの場合は"bio"を指定
param4 <- "n"                          #データ正規化手段を指定。ここでは自分でTMM正規化後のデータを作成したものを読み込ませるので、オプションとしては「データの正規化を行わない"n"」を与えている
param5 <- 0.8                          #DEGとみなすProbability(1に近いほどより厳しい閾値に相当)を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
source("http://bioinfo.cipf.es/noiseq/lib/exe/fetch.php?media=noiseq.r")#NOISeqを利用するための関数をロード
library(edgeR)                         #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data.tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
DEG_posi <- data.tmp$DEG_posi          #DEGの位置情報を取得
nonDEG_posi <- data.tmp$nonDEG_posi    #nonDEGの位置情報を取得
data <- data.tmp[,1:(param_G1+param_G2)] #発現データ部分のみ抽出してdataに格納
RAW <- data                            #dataの内容をRAWにコピーしてるだけ

#TMM正規化後のデータを作成
data <- RAW                            #RAWの内容をdataにコピーしてるだけ
d <- DGEList(counts=data, group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化係数を計算
norm_f_TMM <- d$samples$norm.factors   #TMM正規化係数の情報を抽出してnorm_f_TMMに格納
effective_libsizes <- colSums(data) * norm_f_TMM#effective library sizesというのはlibrary sizesに(TMM)正規化係数を掛けたものなのでそれを計算した結果をeffective_libsizesに格納
RPM_TMM <- sweep(data, 2, 1000000/effective_libsizes, "*")#元のカウントデータをeffective_libsizesで割り(RPMデータと同程度の数値分布にしたいので)one million (=1000000)を掛けた正規化後のデータをRPM_TMMに格納

#NOISeq本番
data <- RPM_TMM                        #RPM_TMMの内容をdataにコピーしてるだけ
out <- noiseq(data[,data.cl==1], data[,data.cl==2], repl=param3, norm=param4, long=1000, q=param5, nss=0, lc=1, k=0.5)#NOISeqを実行した結果をoutに格納

#得られた統計量や順位情報などを抽出してファイル出力
stat_NOISeq <- out$probab              #DEGとみなす確率(1に近いほど発現変動の度合いが大きくて0に近いほどnon-DEG。ここではq=0.8と指定しているので、Probabilityが0.8以上のものがDEGとされていることになる)をstat_NOISeqに格納
stat_NOISeq <- ifelse(is.na(stat_NOISeq), 0, stat_NOISeq)#NAを0に置換している(全部の数値が0で計算できないようなものがNAとなり、これらはDEGとは言えないのでProbabilityの値を0にしたいという思想です)
rank_NOISeq <- rank(-stat_NOISeq)      #stat_NOISeqでランキングした結果をrank_NOISeqに格納
hoge <- cbind(rownames(RAW), RAW, stat_NOISeq, rank_NOISeq, DEG_posi)#入力データの右側に、「stat_NOISeq」、「rank_NOISeq」、「DEG_posi」を結合した結果をtmpに格納
write.table(hoge, out_f1, sep="\t", append=F, quote=F, row.names=F)#hogeの中身を指定したファイル名で保存

#AUC値を計算
AUC(rocdemo.sca(truth=DEG_posi, data=-rank_NOISeq))#AUC値を計算する関数AUCを実行(結果はそのまま表示されている。1に近いほど感度・特異度が高いことを示す)

#RPM正規化後のデータでM-A plotを描画(するための基礎情報取得)
data <- RAW                            #RAWをdataに格納
norm_f_RPM <- 1000000/colSums(data)    #各列に対して掛ける正規化係数を計算してnorm_f_RPMに格納
RPM <- sweep(data, 2, norm_f_RPM, "*") #norm_f_RPMを各列に掛けた結果をRPMに格納
data <- RPM                            #RPMをdataに格納
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_NOISeq > param5)     #param5で指定した閾値以上のものの位置情報をDEG_posiに格納

#MA-plotを描画(本番)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
points(x_axis[DEG_posi], y_axis[DEG_posi], col="red", pch=20, cex=0.1)#DEGを赤色にしている
dev.off()                              #おまじない

#おまけ
sum(DEG_posi)                          #発現変動遺伝子数を表示
sum(DEG_posi)/nrow(data)               #発現変動遺伝子の全遺伝子数に占める割合を表示
	

6. Biological replicatesのシミュレーションデータデータ(G1群3サンプル vs. G2群3サンプル、simdata_3vs3.txt)の場合

どこがDEGがわかっているのでAUC値を計算するところまでやり、予めTbT正規化したデータをNOISeqで解析する:

in_f <- "simdata_3vs3.txt"             #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge6.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge6.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param3 <- "bio"                        #replicatesのタイプを指定。入力データがtechnical replicatesの場合は"tech"を、biological replicatesの場合は"bio"を指定
param4 <- "n"                          #データ正規化手段を指定。ここでは自分でTMM正規化後のデータを作成したものを読み込ませるので、オプションとしては「データの正規化を行わない"n"」を与えている
param5 <- 0.8                          #DEGとみなすProbability(1に近いほどより厳しい閾値に相当)を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
source("http://bioinfo.cipf.es/noiseq/lib/exe/fetch.php?media=noiseq.r")#NOISeqを利用するための関数をロード
library(edgeR)                         #パッケージの読み込み
library(ROC)                           #パッケージの読み込み
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data.tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
DEG_posi <- data.tmp$DEG_posi          #DEGの位置情報を取得
nonDEG_posi <- data.tmp$nonDEG_posi    #nonDEGの位置情報を取得
data <- data.tmp[,1:(param_G1+param_G2)]#発現データ部分のみ抽出してdataに格納
RAW <- data                            #dataの内容をRAWにコピーしてるだけ

#TbT正規化後のデータを作成
data <- RAW                            #RAWの内容をdataにコピーしてるだけ
TbTout <- do_TbT(data, data.cl, sample_num=10000)#TbT正規化法を実行する関数do_TbTを実行した結果をTbToutに格納
norm_f_TbT <- TbTout$norm_f_TbT        #TbT正規化係数の情報を抽出してnorm_f_TbTに格納
effective_libsizes <- colSums(data) * norm_f_TbT#effective library sizesというのはlibrary sizesに(TbT)正規化係数を掛けたものなのでそれを計算した結果をeffective_libsizesに格納
RPM_TbT <- sweep(data, 2, 1000000/effective_libsizes, "*")#元のカウントデータをeffective_libsizesで割り(RPMデータと同程度の数値分布にしたいので)one million (=1000000)を掛けた正規化後のデータをRPM_TbTに格納

#NOISeq本番
data <- RPM_TbT                        #RPM_TMMの内容をdataにコピーしてるだけ
out <- noiseq(data[,data.cl==1], data[,data.cl==2], repl=param3, norm=param4, long=1000, q=param5, nss=0, lc=1, k=0.5)#NOISeqを実行した結果をoutに格納

#得られた統計量や順位情報などを抽出してファイル出力
stat_NOISeq <- out$probab              #DEGとみなす確率(1に近いほど発現変動の度合いが大きくて0に近いほどnon-DEG。ここではq=0.8と指定しているので、Probabilityが0.8以上のものがDEGとされていることになる)をstat_NOISeqに格納
stat_NOISeq <- ifelse(is.na(stat_NOISeq), 0, stat_NOISeq)#NAを0に置換している(全部の数値が0で計算できないようなものがNAとなり、これらはDEGとは言えないのでProbabilityの値を0にしたいという思想です)
rank_NOISeq <- rank(-stat_NOISeq)      #stat_NOISeqでランキングした結果をrank_NOISeqに格納
hoge <- cbind(rownames(RAW), RAW, stat_NOISeq, rank_NOISeq, DEG_posi)#入力データの右側に、「stat_NOISeq」、「rank_NOISeq」、「DEG_posi」を結合した結果をtmpに格納
write.table(hoge, out_f1, sep="\t", append=F, quote=F, row.names=F)#hogeの中身を指定したファイル名で保存

#AUC値を計算
AUC(rocdemo.sca(truth=DEG_posi, data=-rank_NOISeq))#AUC値を計算する関数AUCを実行(結果はそのまま表示されている。1に近いほど感度・特異度が高いことを示す)

#RPM正規化後のデータでM-A plotを描画(するための基礎情報取得)
data <- RAW                            #RAWをdataに格納
norm_f_RPM <- 1000000/colSums(data)    #各列に対して掛ける正規化係数を計算してnorm_f_RPMに格納
RPM <- sweep(data, 2, norm_f_RPM, "*") #norm_f_RPMを各列に掛けた結果をRPMに格納
data <- RPM                            #RPMをdataに格納
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_NOISeq > param5)     #param5で指定した閾値以上のものの位置情報をDEG_posiに格納

#MA-plotを描画(本番)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
points(x_axis[DEG_posi], y_axis[DEG_posi], col="red", pch=20, cex=0.1)#DEGを赤色にしている
dev.off()                              #おまじない

#おまけ
sum(DEG_posi)                          #発現変動遺伝子数を表示
sum(DEG_posi)/nrow(data)               #発現変動遺伝子の全遺伝子数に占める割合を表示
	

解析 | 発現変動 | 2群間 | NBPSeq (Di_2011)

NBPSeqを用いてるやり方を行います。

このパッケージは、任意の正規化法によって得られた正規化係数を組み込むことができます。

このパッケージは、基本的にBiological replicatesのデータを入力として想定しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. デフォルト(たぶんRPM補正)の場合:

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param3 <- 0.01                         #MA-plot描画時のp-valueの閾値を指定

#必要なパッケージをロード
library(NBPSeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データをmatrix型に変換している
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
RAW <- data                            #dataをRAWに格納

#NBPSeqを用いてDEGの検出を実行
out <- nbp.test(data, data.cl, 1, 2)   #計算を実行
stat_NBPSeq <- out$p.values            #p-valueをstat_NBPSeqに格納
rank_NBPSeq <- rank(stat_NBPSeq)       #stat_NBPSeqでランキングした結果をrank_NBPSeqに格納
tmp <- cbind(rownames(data), data, stat_NBPSeq, rank_NBPSeq)#入力データの右側に、「stat_NBPSeq」と「rank_NBPSeq」を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPM正規化後のデータでM-A plotを描画(するための基礎情報取得)
data <- RAW                            #RAWをdataに格納
norm_f_RPM <- 1000000/colSums(data)    #各列に対して掛ける正規化係数を計算してnorm_f_RPMに格納
RPM <- sweep(data, 2, norm_f_RPM, "*") #norm_f_RPMを各列に掛けた結果をRPMに格納
data <- RPM                            #RPMをdataに格納
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_NBPSeq < param3)     #param3で指定した閾値未満のものの位置情報をDEG_posiに格納

#MA-plotを描画(本番)
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
points(x_axis[DEG_posi], y_axis[DEG_posi], col="red", pch=20, cex=0.1)#DEGを赤色にしている
	

2. TMM正規化法を組み合わせた場合:

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param3 <- 0.01                         #MA-plot描画時のp-valueの閾値を指定

#必要なパッケージをロード
library(NBPSeq)                        #パッケージの読み込み
library(edgeR)                         #パッケージの読み込み
library(DEGseq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データをmatrix型に変換している
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
RAW <- data                            #dataをRAWに格納

#TMM正規化係数を得る
d <- DGEList(counts=data, group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化(参考文献2)を実行
norm_f_TMM <- d$samples$norm.factors   #TMM正規化係数の部分のみ取り出してnorm_f_TMMに格納

#TMM正規化係数とNBPSeqを組合せてDEGの検出を実行
out <- nbp.test(data, data.cl, 1, 2, norm.factors=norm_f_TMM)#TMM正規化係数を組み合わせて計算を実行
stat_NBPSeq <- out$p.values            #p-valueをstat_NBPSeqに格納
rank_NBPSeq <- rank(stat_NBPSeq)       #stat_NBPSeqでランキングした結果をrank_NBPSeqに格納
tmp <- cbind(rownames(data), data, stat_NBPSeq, rank_NBPSeq)#入力データの右側に、「stat_NBPSeq」と「rank_NBPSeq」を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPM正規化後のデータでM-A plotを描画(するための基礎情報取得)
data <- RAW                            #RAWをdataに格納
norm_f_RPM <- 1000000/colSums(data)    #各列に対して掛ける正規化係数を計算してnorm_f_RPMに格納
RPM <- sweep(data, 2, norm_f_RPM, "*") #norm_f_RPMを各列に掛けた結果をRPMに格納
data <- RPM                            #RPMをdataに格納
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_NBPSeq < param3)     #param3で指定した閾値未満のものの位置情報をDEG_posiに格納

#MA-plotを描画(本番)
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
points(x_axis[DEG_posi], y_axis[DEG_posi], col="red", pch=20, cex=0.1)#DEGを赤色にしている
	

解析 | 発現変動 | 2群間 | 対応あり | について

実験デザインが以下のような場合にこのカテゴリーに属す方法を適用します:

Aさんの正常サンプル(or "time_point1" or "Group1")
Bさんの正常サンプル(or "time_point1" or "Group1")
Cさんの正常サンプル(or "time_point1" or "Group1")
Aさんの腫瘍サンプル(or "time_point2" or "Group2")
Bさんの腫瘍サンプル(or "time_point2" or "Group2")
Cさんの腫瘍サンプル(or "time_point2" or "Group2")

2014年3月に調査した結果をリストアップします。

解析 | 発現変動 | 2群間 | 対応あり | 複製なし | TCC中のDEGES/edgeR-edgeR (Sun_2013)

DEGES/edgeR正規化(Sun et al., 2013)を実行したのち、 edgeRパッケージ中のGLM (一般化線形モデル; Generalized Linear Model)に基づく方法 (McCarthy et al., 2012)で発現変動遺伝子(Differentially expressed Genes; DEGs)検出を行うやり方を示します。 TCC原著論文中のDEGES/edgeR-edgeRという解析パイプラインに相当します。 Bioconductor ver. 2.13で利用可能なTCC ver. 1.2.0ではまだ実装されていないので、 ここでは、edgeRパッケージ中の関数のみを用いて対応のあるサンプル(paired samples)データ解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(1. DGEListオブジェクトの作成、2. 実験デザイン行列の作成など)
d <- DGEList(counts=data)              #1. DGEListオブジェクトdを作成
pair <- as.factor(c(1:param_G1, 1:param_G2))#2. 対応関係の情報をpairに格納
cl <- as.factor(c(rep(1, param_G1), rep(2, param_G2)))#2. グループラベル情報をclに格納
design <- model.matrix(~ pair + cl)    #2. デザイン行列を作成した結果をdesignに格納
FDR <- 0.1                             #DEGES正規化内部でのDEG検出時のFDR閾値を指定
floorPDEG <- 0.05                      #上記FDR閾値を満たす遺伝子数がここで指定した値(5%)未満だったときに、最低でも上位5%の遺伝子をDEGとみなして除去するための下限値を指定

#本番(DEGES/edgeR正規化)
### STEP 1 ###
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
d$samples$norm.factors                 #確認してるだけです
### STEP 2 ###
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #モデル構築(ばらつきの程度を見積もっている)
out <- glmLRT(fit)                     #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
if (sum(q.value < FDR) > (floorPDEG * nrow(data))){#FDR閾値を満たす遺伝子数がここで指定した値(5%)よりも多いかどうか?
  is.DEG <- as.logical(q.value < FDR)  #Yesの場合は、FDR閾値を満たす遺伝子がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
} else {                               #Noの場合は...
  is.DEG <- as.logical(rank(p.value, ties.method="min") <= nrow(data)*floorPDEG)#上位(floorPDEG)%がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
}
### STEP 3 ###
d <- DGEList(counts=data[!is.DEG, ])   #DGEListオブジェクトdを作成(non-DEG)
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
norm.factors <- d$samples$norm.factors*colSums(data[!is.DEG, ])/colSums(data)#non-DEGのみ用に得られたTMM正規化係数を全遺伝子に掛けられるようにするための補正
norm.factors <- norm.factors/mean(norm.factors)#TMM正規化を実行した結果をdに格納
norm.factors                           #確認してるだけです

#本番(DEG検出)
d <- DGEList(counts=data)              #DGEListオブジェクトdを作成
d$samples$norm.factors <- norm.factors #計算した正規化係数を代入
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #モデル構築(ばらつきの程度を見積もっている)
out <- glmLRT(fit)                     #検定
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

1.と全く同じ結果が得られますが、デザイン行列designの作成のところで順番を入れ替えています。 それに伴い、検定時のglmLRT関数実行時に、coefで指定する列情報を2列目に変更しています。1.ではデフォルトがdesign行列の最後の列なので、何も指定しなくていいのです。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(1. DGEListオブジェクトの作成、2. 実験デザイン行列の作成など)
d <- DGEList(counts=data)              #1. DGEListオブジェクトdを作成
pair <- as.factor(c(1:param_G1, 1:param_G2))#2. 対応関係の情報をpairに格納
cl <- as.factor(c(rep(1, param_G1), rep(2, param_G2)))#2. グループラベル情報をclに格納
design <- model.matrix(~ cl + pair)    #2. デザイン行列を作成した結果をdesignに格納
FDR <- 0.1                             #DEGES正規化内部でのDEG検出時のFDR閾値を指定
floorPDEG <- 0.05                      #上記FDR閾値を満たす遺伝子数がここで指定した値(5%)未満だったときに、最低でも上位5%の遺伝子をDEGとみなして除去するための下限値を指定

#本番(DEGES/edgeR正規化)
### STEP 1 ###
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
d$samples$norm.factors                 #確認してるだけです
### STEP 2 ###
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #モデル構築(ばらつきの程度を見積もっている)
out <- glmLRT(fit, coef=2)             #検定(デザイン行列の2列目が目的のグループラベル情報clに相当)
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
if (sum(q.value < FDR) > (floorPDEG * nrow(data))){#FDR閾値を満たす遺伝子数がここで指定した値(5%)よりも多いかどうか?
  is.DEG <- as.logical(q.value < FDR)  #Yesの場合は、FDR閾値を満たす遺伝子がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
} else {                               #Noの場合は...
  is.DEG <- as.logical(rank(p.value, ties.method="min") <= nrow(data)*floorPDEG)#上位(floorPDEG)%がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
}
### STEP 3 ###
d <- DGEList(counts=data[!is.DEG, ])   #DGEListオブジェクトdを作成(non-DEG)
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
norm.factors <- d$samples$norm.factors*colSums(data[!is.DEG, ])/colSums(data)#non-DEGのみ用に得られたTMM正規化係数を全遺伝子に掛けられるようにするための補正
norm.factors <- norm.factors/mean(norm.factors)#TMM正規化を実行した結果をdに格納
norm.factors                           #確認してるだけです

#本番(DEG検出)
d <- DGEList(counts=data)              #DGEListオブジェクトdを作成
d$samples$norm.factors <- norm.factors #計算した正規化係数を代入
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #モデル構築(ばらつきの程度を見積もっている)
out <- glmLRT(fit, coef=2)             #検定(デザイン行列の2列目が目的のグループラベル情報clに相当)
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

DEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_DEG <- 2000                      #DEG数を指定
param_nonDEG <- 8000                   #non-DEG数を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(1. DGEListオブジェクトの作成、2. 実験デザイン行列の作成など)
d <- DGEList(counts=data)              #1. DGEListオブジェクトdを作成
pair <- as.factor(c(1:param_G1, 1:param_G2))#2. 対応関係の情報をpairに格納
cl <- as.factor(c(rep(1, param_G1), rep(2, param_G2)))#2. グループラベル情報をclに格納
design <- model.matrix(~ pair + cl)    #2. デザイン行列を作成した結果をdesignに格納
FDR <- 0.1                             #DEGES正規化内部でのDEG検出時のFDR閾値を指定
floorPDEG <- 0.05                      #上記FDR閾値を満たす遺伝子数がここで指定した値(5%)未満だったときに、最低でも上位5%の遺伝子をDEGとみなして除去するための下限値を指定

#本番(DEGES/edgeR正規化)
### STEP 1 ###
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
d$samples$norm.factors                 #確認してるだけです
### STEP 2 ###
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #モデル構築(ばらつきの程度を見積もっている)
out <- glmLRT(fit)                     #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
if (sum(q.value < FDR) > (floorPDEG * nrow(data))){#FDR閾値を満たす遺伝子数がここで指定した値(5%)よりも多いかどうか?
  is.DEG <- as.logical(q.value < FDR)  #Yesの場合は、FDR閾値を満たす遺伝子がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
} else {                               #Noの場合は...
  is.DEG <- as.logical(rank(p.value, ties.method="min") <= nrow(data)*floorPDEG)#上位(floorPDEG)%がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
}
### STEP 3 ###
d <- DGEList(counts=data[!is.DEG, ])   #DGEListオブジェクトdを作成(non-DEG)
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
norm.factors <- d$samples$norm.factors*colSums(data[!is.DEG, ])/colSums(data)#non-DEGのみ用に得られたTMM正規化係数を全遺伝子に掛けられるようにするための補正
norm.factors <- norm.factors/mean(norm.factors)#TMM正規化を実行した結果をdに格納
norm.factors                           #確認してるだけです

#本番(DEG検出)
d <- DGEList(counts=data)              #DGEListオブジェクトdを作成
d$samples$norm.factors <- norm.factors #計算した正規化係数を代入
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #モデル構築(ばらつきの程度を見積もっている)
out <- glmLRT(fit)                     #検定
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値の計算
obj <- c(rep(1, param_DEG), rep(0, param_nonDEG))#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

4. TCCパッケージ中の1,000 genes×6 samplesのカウントデータ(hypoData)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_200までがDEG (最初の180個がG1群で高発現、残りの20個がG2群で高発現) gene_201〜gene_1000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み
library(TCC)                           #パッケージの読み込み

#カウントデータオブジェクトの読み込み
data(hypoData)                         #TCCパッケージ中のhypoDataオブジェクトをロード
data <- hypoData                       #オブジェクト名を変更

#前処理(1. DGEListオブジェクトの作成、2. 実験デザイン行列の作成など)
d <- DGEList(counts=data)              #1. DGEListオブジェクトdを作成
pair <- as.factor(c(1:param_G1, 1:param_G2))#2. 対応関係の情報をpairに格納
cl <- as.factor(c(rep(1, param_G1), rep(2, param_G2)))#2. グループラベル情報をclに格納
design <- model.matrix(~ pair + cl)    #2. デザイン行列を作成した結果をdesignに格納
FDR <- 0.1                             #DEGES正規化内部でのDEG検出時のFDR閾値を指定
floorPDEG <- 0.05                      #上記FDR閾値を満たす遺伝子数がここで指定した値(5%)未満だったときに、最低でも上位5%の遺伝子をDEGとみなして除去するための下限値を指定

#本番(DEGES/edgeR正規化)
### STEP 1 ###
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
d$samples$norm.factors                 #確認してるだけです
### STEP 2 ###
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #モデル構築(ばらつきの程度を見積もっている)
out <- glmLRT(fit)                     #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
if (sum(q.value < FDR) > (floorPDEG * nrow(data))){#FDR閾値を満たす遺伝子数がここで指定した値(5%)よりも多いかどうか?
  is.DEG <- as.logical(q.value < FDR)  #Yesの場合は、FDR閾値を満たす遺伝子がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
} else {                               #Noの場合は...
  is.DEG <- as.logical(rank(p.value, ties.method="min") <= nrow(data)*floorPDEG)#上位(floorPDEG)%がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
}
### STEP 3 ###
d <- DGEList(counts=data[!is.DEG, ])   #DGEListオブジェクトdを作成(non-DEG)
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
norm.factors <- d$samples$norm.factors*colSums(data[!is.DEG, ])/colSums(data)#non-DEGのみ用に得られたTMM正規化係数を全遺伝子に掛けられるようにするための補正
norm.factors <- norm.factors/mean(norm.factors)#TMM正規化を実行した結果をdに格納
norm.factors                           #確認してるだけです

#本番(DEG検出)
d <- DGEList(counts=data)              #DGEListオブジェクトdを作成
d$samples$norm.factors <- norm.factors #計算した正規化係数を代入
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #モデル構築(ばらつきの程度を見積もっている)
out <- glmLRT(fit)                     #検定
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. TCCパッケージ中の1,000 genes×6 samplesのカウントデータ(hypoData)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_200までがDEG (最初の180個がG1群で高発現、残りの20個がG2群で高発現) gene_201〜gene_1000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

4.と全く同じ結果が得られますが、デザイン行列designの作成のところで順番を入れ替えています。 それに伴い、検定時のglmLRT関数実行時に、coefで指定する列情報を2列目に変更しています。1.ではデフォルトがdesign行列の最後の列なので、何も指定しなくていいのです。

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み
library(TCC)                           #パッケージの読み込み

#カウントデータオブジェクトの読み込み
data(hypoData)                         #TCCパッケージ中のhypoDataオブジェクトをロード
data <- hypoData                       #オブジェクト名を変更

#前処理(1. DGEListオブジェクトの作成、2. 実験デザイン行列の作成など)
d <- DGEList(counts=data)              #1. DGEListオブジェクトdを作成
pair <- as.factor(c(1:param_G1, 1:param_G2))#2. 対応関係の情報をpairに格納
cl <- as.factor(c(rep(1, param_G1), rep(2, param_G2)))#2. グループラベル情報をclに格納
design <- model.matrix(~ cl + pair)    #2. デザイン行列を作成した結果をdesignに格納
FDR <- 0.1                             #DEGES正規化内部でのDEG検出時のFDR閾値を指定
floorPDEG <- 0.05                      #上記FDR閾値を満たす遺伝子数がここで指定した値(5%)未満だったときに、最低でも上位5%の遺伝子をDEGとみなして除去するための下限値を指定

#本番(DEGES/edgeR正規化)
### STEP 1 ###
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
d$samples$norm.factors                 #確認してるだけです
### STEP 2 ###
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #モデル構築(ばらつきの程度を見積もっている)
out <- glmLRT(fit, coef=2)             #検定(デザイン行列の2列目が目的のグループラベル情報clに相当)
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
if (sum(q.value < FDR) > (floorPDEG * nrow(data))){#FDR閾値を満たす遺伝子数がここで指定した値(5%)よりも多いかどうか?
  is.DEG <- as.logical(q.value < FDR)  #Yesの場合は、FDR閾値を満たす遺伝子がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
} else {                               #Noの場合は...
  is.DEG <- as.logical(rank(p.value, ties.method="min") <= nrow(data)*floorPDEG)#上位(floorPDEG)%がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
}
### STEP 3 ###
d <- DGEList(counts=data[!is.DEG, ])   #DGEListオブジェクトdを作成(non-DEG)
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
norm.factors <- d$samples$norm.factors*colSums(data[!is.DEG, ])/colSums(data)#non-DEGのみ用に得られたTMM正規化係数を全遺伝子に掛けられるようにするための補正
norm.factors <- norm.factors/mean(norm.factors)#TMM正規化を実行した結果をdに格納
norm.factors                           #確認してるだけです

#本番(DEG検出)
d <- DGEList(counts=data)              #DGEListオブジェクトdを作成
d$samples$norm.factors <- norm.factors #計算した正規化係数を代入
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #モデル構築(ばらつきの程度を見積もっている)
out <- glmLRT(fit, coef=2)             #検定(デザイン行列の2列目が目的のグループラベル情報clに相当)
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 発現変動 | 2群間 | 対応あり | 複製なし | TCC中のDEGES/DESeq-DESeq (Sun_2013)

書きかけです。

DEGES/DESeq正規化(Sun et al., 2013)を実行したのち、 DESeqパッケージ中のGLM (一般化線形モデル; Generalized Linear Model)に基づく方法 で発現変動遺伝子(Differentially expressed Genes; DEGs)検出を行うやり方を示します。 TCC原著論文中のDEGES/DESeq-DESeqという解析パイプラインに相当します。 Bioconductor ver. 2.13で利用可能なTCC ver. 1.2.0ではまだ実装されていないので、 ここでは、DESeqパッケージ中の関数のみを用いて対応のあるサンプル(paired samples)データ解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

TCC ver. 1.3.2で2014年4月に利用可能予定のコードです。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(DESeq)                          #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(1. DGEListオブジェクトの作成、2. 実験デザイン行列の作成など)
d <- DGEList(counts=data)              #1. DGEListオブジェクトdを作成
pair <- as.factor(c(1:param_G1, 1:param_G2))#2. 対応関係の情報をpairに格納
cl <- as.factor(c(rep(1, param_G1), rep(2, param_G2)))#2. グループラベル情報をclに格納
design <- model.matrix(~ pair + cl)    #2. デザイン行列を作成した結果をdesignに格納
FDR <- 0.1                             #DEGES正規化内部でのDEG検出時のFDR閾値を指定
floorPDEG <- 0.05                      #上記FDR閾値を満たす遺伝子数がここで指定した値(5%)未満だったときに、最低でも上位5%の遺伝子をDEGとみなして除去するための下限値を指定

#本番(DEGES/edgeR正規化)
### STEP 1 ###
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
d$samples$norm.factors                 #確認してるだけです
### STEP 2 ###
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #モデル構築(ばらつきの程度を見積もっている)
out <- glmLRT(fit)                     #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
if (sum(q.value < FDR) > (floorPDEG * nrow(data))){#FDR閾値を満たす遺伝子数がここで指定した値(5%)よりも多いかどうか?
  is.DEG <- as.logical(q.value < FDR)  #Yesの場合は、FDR閾値を満たす遺伝子がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
} else {                               #Noの場合は...
  is.DEG <- as.logical(rank(p.value, ties.method="min") <= nrow(data)*floorPDEG)#上位(floorPDEG)%がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
}
### STEP 3 ###
d <- DGEList(counts=data[!is.DEG, ])   #DGEListオブジェクトdを作成(non-DEG)
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
norm.factors <- d$samples$norm.factors*colSums(data[!is.DEG, ])/colSums(data)#non-DEGのみ用に得られたTMM正規化係数を全遺伝子に掛けられるようにするための補正
norm.factors <- norm.factors/mean(norm.factors)#TMM正規化を実行した結果をdに格納
norm.factors                           #確認してるだけです

#本番(DEG検出)
d <- DGEList(counts=data)              #DGEListオブジェクトdを作成
d$samples$norm.factors <- norm.factors #計算した正規化係数を代入
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #モデル構築(ばらつきの程度を見積もっている)
out <- glmLRT(fit)                     #検定
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 発現変動 | 2群間 | 対応あり | 複製なし | edgeR(Robinson_2010)

edgeRパッケージを用いて対応のあるサンプル(paired samples)データ解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_f1に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(1. DGEListオブジェクトの作成、2. TMM正規化、3. 実験デザイン行列の作成)
d <- DGEList(data)                     #1. DGEListオブジェクトdを作成
d <- calcNormFactors(d)                #2. TMM正規化を実行した結果をdに格納
pair <- as.factor(c(1:param_G1, 1:param_G2))#3. 対応関係の情報をpairに格納
cl <- as.factor(c(rep(1, param_G1), rep(2, param_G2)))#3. グループラベル情報をclに格納
design <- model.matrix(~ pair + cl)    #3. デザイン行列を作成した結果をdesignに格納

#本番(DEG検出)
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #モデル構築(ばらつきの程度を見積もっている)
out <- glmLRT(fit)                     #検定
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

DEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_f1に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_DEG <- 2000                      #DEG数を指定
param_nonDEG <- 8000                   #non-DEG数を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(1. DGEListオブジェクトの作成、2. TMM正規化、3. 実験デザイン行列の作成)
d <- DGEList(data)                     #1. DGEListオブジェクトdを作成
d <- calcNormFactors(d)                #2. TMM正規化を実行した結果をdに格納
pair <- as.factor(c(1:param_G1, 1:param_G2))#3. 対応関係の情報をpairに格納
cl <- as.factor(c(rep(1, param_G1), rep(2, param_G2)))#3. グループラベル情報をclに格納
design <- model.matrix(~ pair + cl)    #3. デザイン行列を作成した結果をdesignに格納

#本番(DEG検出)
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #モデル構築(ばらつきの程度を見積もっている)
out <- glmLRT(fit)                     #検定
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値の計算
obj <- c(rep(1, param_DEG), rep(0, param_nonDEG))#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

解析 | 発現変動 | 2群間 | 対応あり | 複製なし | DESeq (Anders_2010)

DESeqパッケージを用いて対応のあるサンプル(paired samples)データ解析を行うやり方を示します。 TCCパッケージでも内部的にDESeqを呼び出して実行可能なので、そのやり方も示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

TCC ver. 1.3.2で2014年4月に利用可能予定のコードです。getResult関数のところでエラーが出るようですね。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
design.cl <- data.frame(               #デザイン行列と同じ意味合いのデータフレーム形式オブジェクトを作成
    group=c(rep(1, param_G1), rep(2, param_G2)),#グループラベル情報
    pair=c(1:param_G1, 1:param_G2)     #対応関係の情報
)                                      #
tcc <- new("TCC", data, design.cl)     #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0, paired=T)#正規化を実行した結果をtccに格納
tcc$norm.factors                       #確認してるだけです

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR, paired=T)#DEG検出を実行した結果をtccに格納
#result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
#sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示
p.value <- tcc$stat$p.value             #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
#tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

DEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

TCC ver. 1.3.2で2014年4月に利用可能予定のコードです。getResult関数のところでエラーが出るようですね。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_DEG <- 2000                      #DEG数を指定
param_nonDEG <- 8000                   #non-DEG数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
design.cl <- data.frame(               #デザイン行列と同じ意味合いのデータフレーム形式オブジェクトを作成
    group=c(rep(1, param_G1), rep(2, param_G2)),#グループラベル情報
    pair=c(1:param_G1, 1:param_G2)     #対応関係の情報
)                                      #
tcc <- new("TCC", data, design.cl)     #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0, paired=T)#正規化を実行した結果をtccに格納
tcc$norm.factors                       #確認してるだけです

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR, paired=T)#DEG検出を実行した結果をtccに格納
#result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
#sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示
p.value <- tcc$stat$p.value             #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
#tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値の計算
obj <- c(rep(1, param_DEG), rep(0, param_nonDEG))#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

1.と同じ入力形式で、TCCパッケージを使わずにDESeqパッケージ中の関数のみで行うやり方です。TCCのほうが手順的にも簡便であることがわかります。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(DESeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
pair <- c(1:param_G1, 1:param_G2)      #対応関係の情報
design.cl <- data.frame(               #デザイン行列と同じ意味合いのデータフレーム形式オブジェクトを作成
    group=as.factor(data.cl),          #グループラベル情報
    pair=as.factor(pair)               #対応関係の情報
)                                      #

#本番(正規化)
cds <- newCountDataSet(data, design.cl)#CountDataSetオブジェクトを作成してcdsに格納
cds <- estimateSizeFactors(cds)        #size factorを計算し、結果をcdsに格納
sizeFactors(cds)                       #これがDESeqのsize factors

#本番(DEG検出)
cds <- estimateDispersions(cds, method="blind", sharingMode="fit-only")#モデル構築
fit1 <- fitNbinomGLMs(cds, count ~ as.factor(data.cl) + as.factor(pair))#full model
fit0 <- fitNbinomGLMs(cds, count ~ as.factor(pair))#reduced model
p.value <- nbinomGLMTest(fit1, fit0)   #検定
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. TCCパッケージ中の1,000 genes×6 samplesのカウントデータ(hypoData)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_200までがDEG (最初の180個がG1群で高発現、残りの20個がG2群で高発現) gene_201〜gene_1000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

TCC ver. 1.3.2で2014年4月に利用可能予定のコードです。getResult関数のところでエラーが出るようですね。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(DESeq)                         #パッケージの読み込み

#カウントデータオブジェクトの読み込み
data(hypoData)                         #TCCパッケージ中のhypoDataオブジェクトをロード
data <- hypoData                       #オブジェクト名を変更

#前処理(TCCクラスオブジェクトの作成)
design.cl <- data.frame(               #デザイン行列と同じ意味合いのデータフレーム形式オブジェクトを作成
    group=c(rep(1, param_G1), rep(2, param_G2)),#グループラベル情報
    pair=c(1:param_G1, 1:param_G2)     #対応関係の情報
)                                      #
tcc <- new("TCC", data, design.cl)     #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0, paired=T)#正規化を実行した結果をtccに格納
tcc$norm.factors                       #確認してるだけです

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR, paired=T)#DEG検出を実行した結果をtccに格納
#result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
#sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示
p.value <- tcc$stat$p.value             #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
#tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. TCCパッケージ中の1,000 genes×6 samplesのカウントデータ(hypoData)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_200までがDEG (最初の180個がG1群で高発現、残りの20個がG2群で高発現) gene_201〜gene_1000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

DEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

TCC ver. 1.3.2で2014年4月に利用可能予定のコードです。getResult関数のところでエラーが出るようですね。

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_DEG <- 200                       #DEG数を指定
param_nonDEG <- 800                    #non-DEG数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(ROC)                           #パッケージの読み込み
library(DESeq)                         #パッケージの読み込み

#カウントデータオブジェクトの読み込み
data(hypoData)                         #TCCパッケージ中のhypoDataオブジェクトをロード
data <- hypoData                       #オブジェクト名を変更

#前処理(TCCクラスオブジェクトの作成)
design.cl <- data.frame(               #デザイン行列と同じ意味合いのデータフレーム形式オブジェクトを作成
    group=c(rep(1, param_G1), rep(2, param_G2)),#グループラベル情報
    pair=c(1:param_G1, 1:param_G2)     #対応関係の情報
)                                      #
tcc <- new("TCC", data, design.cl)     #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0, paired=T)#正規化を実行した結果をtccに格納
tcc$norm.factors                       #確認してるだけです

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR, paired=T)#DEG検出を実行した結果をtccに格納
#result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
#sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示
p.value <- tcc$stat$p.value             #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
#tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値の計算
obj <- c(rep(1, param_DEG), rep(0, param_nonDEG))#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

6. TCCパッケージ中の1,000 genes×6 samplesのカウントデータ(hypoData)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_200までがDEG (最初の180個がG1群で高発現、残りの20個がG2群で高発現) gene_201〜gene_1000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

4.と同じ入力形式で、TCCパッケージを使わずにDESeqパッケージ中の関数のみで行うやり方です。TCCのほうが手順的にも簡便であることがわかります。

out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(DESeq)                         #パッケージの読み込み
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data(hypoData)                         #TCCパッケージ中のhypoDataオブジェクトをロード
data <- hypoData                       #オブジェクト名を変更
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
pair <- c(1:param_G1, 1:param_G2)      #対応関係の情報
design.cl <- data.frame(               #デザイン行列と同じ意味合いのデータフレーム形式オブジェクトを作成
    group=as.factor(data.cl),          #グループラベル情報
    pair=as.factor(pair)               #対応関係の情報
)                                      #

#本番(正規化)
cds <- newCountDataSet(data, design.cl)#CountDataSetオブジェクトを作成してcdsに格納
cds <- estimateSizeFactors(cds)        #size factorを計算し、結果をcdsに格納
sizeFactors(cds)                       #これがDESeqのsize factors

#本番(DEG検出)
cds <- estimateDispersions(cds, method="blind", sharingMode="fit-only")#モデル構築
fit1 <- fitNbinomGLMs(cds, count ~ as.factor(data.cl) + as.factor(pair))#full model
fit0 <- fitNbinomGLMs(cds, count ~ as.factor(pair))#reduced model
p.value <- nbinomGLMTest(fit1, fit0)   #検定
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 発現変動 | 3群間 | 対応なし | について

実験デザインが以下のような場合にこのカテゴリーに属す方法を適用します:

Aさんの肝臓サンプル(or "time_point1" or "Group1")
Bさんの肝臓サンプル(or "time_point1" or "Group1")
Cさんの肝臓サンプル(or "time_point1" or "Group1")
Dさんの腎臓サンプル(or "time_point2" or "Group2")
Eさんの腎臓サンプル(or "time_point2" or "Group2")
Fさんの腎臓サンプル(or "time_point2" or "Group2")
Gさんの大腸サンプル(or "time_point3" or "Group3")
Hさんの大腸サンプル(or "time_point3" or "Group3")
Iさんの大腸サンプル(or "time_point3" or "Group3")

2014年3月に調査した結果をリストアップします。

解析 | 発現変動 | 3群間 | 対応なし | 複製あり | TCC (Sun_2013)

TCCを用いたやり方を示します。

内部的にiDEGES/edgeR(Sun_2013)正規化を実行したのち、 edgeRパッケージ中のexact testで発現変動遺伝子(Differentially expressed Genes; DEGs)検出を行っています。 TCC原著論文中のiDEGES/edgeR-edgeRという解析パイプラインに相当します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

2. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)と同じものをTCCパッケージ内部で作成する場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータ作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
             DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
             DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
             replicates = c(param_G1, param_G2, param_G3))#各群のサンプル数を指定

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
calcAUCValue(tcc)                      #AUC値計算結果を表示(どこかの群で発現変動しているか否かの1 or 0の予測結果のベクトルと真の情報とのROC曲線の下部面積)
	

3. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

4. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)と同じものをTCCパッケージ内部で作成する場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータ作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
             DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
             DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
             replicates = c(param_G1, param_G2, param_G3))#各群のサンプル数を指定

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
calcAUCValue(tcc)                      #AUC値計算結果を表示(どこかの群で発現変動しているか否かの1 or 0の予測結果のベクトルと真の情報とのROC曲線の下部面積)
	

5. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

1.と基本的に同じで、出力のテキストファイルが正規化前のデータではなく正規化後のデータになっていて、発現変動順にソートしたものになっています。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
    

解析 | 発現変動 | 3群間 | 対応なし | 複製あり | edgeR(Robinson_2010)

TMM正規化(Robinson_2010)を実行したのち、 edgeRパッケージ中のexact testで発現変動遺伝子(Differentially expressed Genes; DEGs)検出を行うやり方(edgeR coupled with TMM normalization; TMM-edgeR)を示します。デフォルトのedgeRの手順に相当します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#「rownames情報」、「カウントデータ」、「DEG検出結果」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

2. サンプルデータ15の10,000 genes×9 samplesのシミュレーションデータ(data_hypodata_3vs3vs3.txt)と同じものをTCCパッケージ内部で作成する場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータ作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
             DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
             DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
             replicates = c(param_G1, param_G2, param_G3))#各群のサンプル数を指定

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#「rownames情報」、「カウントデータ」、「DEG検出結果」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
calcAUCValue(tcc)                      #AUC値計算結果を表示(どこかの群で発現変動しているか否かの1 or 0の予測結果のベクトルと真の情報とのROC曲線の下部面積)
	

3. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#「rownames情報」、「カウントデータ」、「DEG検出結果」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

4. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)と同じものをTCCパッケージ内部で作成する場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータ作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
             DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
             DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
             replicates = c(param_G1, param_G2, param_G3))#各群のサンプル数を指定

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#「rownames情報」、「カウントデータ」、「DEG検出結果」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
calcAUCValue(tcc)                      #AUC値計算結果を表示(どこかの群で発現変動しているか否かの1 or 0の予測結果のベクトルと真の情報とのROC曲線の下部面積)
	

5. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

3.と同じ入力形式で、TCCパッケージを使わずにedgeRパッケージ中の関数のみで行うやり方です。TCCのほうが手順的にも簡便であることがわかります。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(DGEListオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
d <- DGEList(data, group=data.cl)      #DGEListオブジェクトdを作成

#本番(正規化)
d <- calcNormFactors(d)                #正規化を実行した結果をdに格納

#本番(DEG検出)
design <- model.matrix(~ as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #検定
coef <- 2:length(unique(data.cl))      #線形モデルの比較する係数を指定(全ての群間比較時のおまじない的な記述法です)
lrt <- glmLRT(fit, coef=coef)          #検定
tmp <- topTags(lrt, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- tmp$table$PValue            #p値を抽出
q.value <- tmp$table$FDR               #q値を抽出
result <- cbind(p.value, q.value)      #p値とq値をまとめた結果をresultに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, result)#「rownames情報」、「カウントデータ」、「DEG検出結果」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

解析 | 発現変動 | 3群間 | 対応なし | 複製あり | DESeq (Anders_2010)

DESeqパッケージを用いて発現変動遺伝子(Differentially expressed Genes; DEGs)検出を行うやり方(DESeq coupled with DESeq normalization; DESeq-DESeq)を示します。 デフォルトのDESeqの手順に相当します。TCCパッケージを用いても同様のことができますので、動作確認も兼ねて両方のやり方を示しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#「rownames情報」、「カウントデータ」、「DEG検出結果」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

2. サンプルデータ15の10,000 genes×9 samplesのシミュレーションデータ(data_hypodata_3vs3vs3.txt)と同じものをTCCパッケージ内部で作成する場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータ作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
             DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
             DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
             replicates = c(param_G1, param_G2, param_G3))#各群のサンプル数を指定

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#「rownames情報」、「カウントデータ」、「DEG検出結果」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
calcAUCValue(tcc)                      #AUC値計算結果を表示(どこかの群で発現変動しているか否かの1 or 0の予測結果のベクトルと真の情報とのROC曲線の下部面積)
	

3. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

1.と同じ入力形式で、TCCパッケージを使わずにDESeqパッケージ中の関数のみで行うやり方です。TCCのほうが手順的にも簡便であることがわかります。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(DESeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成

#本番(正規化)
cds <- newCountDataSet(data, data.cl)  #CountDataSetオブジェクトを作成してcdsに格納
cds <- estimateSizeFactors(cds)        #size factorを計算した結果をcdsに格納
sizeFactors(cds)                       #これがDESeqのsize factors

#本番(DEG検出)
cds <- estimateDispersions(cds, method="pooled")#モデル構築
fit1 <- fitNbinomGLMs(cds, count ~ as.factor(data.cl))#full model
fit0 <- fitNbinomGLMs(cds, count ~ 1)  #reduced model
p.value <- nbinomGLMTest(fit1, fit0)   #検定
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

4. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#「rownames情報」、「カウントデータ」、「DEG検出結果」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

5. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)と同じものをTCCパッケージ内部で作成する場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータ作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
             DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
             DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
             replicates = c(param_G1, param_G2, param_G3))#各群のサンプル数を指定

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#「rownames情報」、「カウントデータ」、「DEG検出結果」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
calcAUCValue(tcc)                      #AUC値計算結果を表示(どこかの群で発現変動しているか否かの1 or 0の予測結果のベクトルと真の情報とのROC曲線の下部面積)
	

6. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

3.と同じ入力形式で、TCCパッケージを使わずにDESeqパッケージ中の関数のみで行うやり方です。TCCのほうが手順的にも簡便であることがわかります。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(DESeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成

#本番(正規化)
cds <- newCountDataSet(data, data.cl)  #CountDataSetオブジェクトを作成してcdsに格納
cds <- estimateSizeFactors(cds)        #size factorを計算した結果をcdsに格納
sizeFactors(cds)                       #これがDESeqのsize factors

#本番(DEG検出)
cds <- estimateDispersions(cds, method="pooled")#モデル構築
fit1 <- fitNbinomGLMs(cds, count ~ as.factor(data.cl))#full model
fit0 <- fitNbinomGLMs(cds, count ~ 1)  #reduced model
p.value <- nbinomGLMTest(fit1, fit0)   #検定
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

解析 | 発現変動 | 時系列データ | Bayesian model-based clustering (Nascimento_2012)

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

	

解析 | 選択的スプライシング | について

選択的スプライシング(alternative splicing)とは、ある共通の前駆体mRNAからエクソン(exon)のextending, shortening, skipping, includingやイントロン(intron)配列の保持(retaining)によって異なるmRNAバリアントを作り出すメカニズムのことを指します。

これらのイベントはalternative exon events (AEEs)と総称されるようです。ちなみに全ヒト遺伝子の75-92%が複数のアイソフォーム(multiple isoforms)となりうるという報告もあるようです(言い換えると8-25%がsingle isoform genesだということ)。

alternative isoformsの予測や定量化を行ってくれるようです。

2014年2月に調査した結果をリストアップします。

解析 | 選択的スプライシング | DEXSeq

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

	

解析 | 選択的スプライシング | Solas (Richard_2010)

Solasは、1つのサンプルのデータを入力として与えたときには「alternative exonsの予測」や「alternative splice formsの定量化」を行います。 また、2つのサンプルを入力として与えた場合には、「differential alternative exonsの予測」をしてくれるようです。 これら3つの予測は、それぞれCell type-specific Alternative uSage Index (CASI), PrOportion EstiMation (POEM), and Differential Alternative uSage Index (DASI)という提案手法で行うようです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

	

解析 | 機能解析 | 遺伝子オントロジー(GO)解析 | について

RNA-seqなどのタグカウントデータから遺伝子オントロジー(GO)解析を行うためのパッケージもいくつか出ています。

2014年3月に調査した結果をリストアップします。

解析 | 機能解析 | 遺伝子オントロジー(GO)解析 | SeqGSEA (Wang_2014)

SeqGSEAを用いてGO解析を行うやり方を示します。 このパッケージは、exonレベルのカウントデータを入力として、発現変動遺伝子セットに相当する有意に発現変動したGO termsを出力するのが基本ですが、geneレベルのカウントデータを入力として解析することも可能です。 統計的有意性の評価にサンプルラベル情報の並べ替え(permutation)戦略を採用しているため、 各グループあたりの反復数が5以上のデータを想定しているようです(Wang et al., 2014)。また、計算時間が半端なくかかります。 例えば、並べ替え回数がたったの20回でも2時間ちょっとかかります(Panasonic Let's note CF-SX3本郷モデルの場合)のでご注意ください。 推奨は1000回以上と書いてますが、10日ほどかかることになるので個人的にはアリエナイですね...。

SeqGSEAでの機能解析の基本は、exonレベルとgeneレベルの発現変動解析結果を組み合わせてGSEAを行うというものです(Wang and Cairns, 2013)。 SeqGSEA著者たちは、exonレベルの発現変動解析のことをDifferential splicing (DS) analysisと呼んでいて、 おそらくDSGseq (Wang et al., 2013)はSeqGSEA中に組み込まれています。 そしてgeneレベルの発現変動解析をDifferential expression (DE) analysisとして、SeqGSEA中では DESeqを利用しています。

GSEAに代表される発現変動遺伝子セット解析は、基本的にGSEAの開発者らが作成した様々な遺伝子セット情報を収めたMolecular Signatures Database (MSigDB)からダウンロードした.gmt形式ファイルを読み込んで解析を行います。

*gmt形式ファイルのダウンロード方法は、基本的に以下の通りです:

  1. Molecular Signatures Database (MSigDB)
    register」のページで登録し、遺伝子セットをダウンロード可能な状態にする。
  2. Molecular Signatures Database (MSigDB)
    「Download gene sets」の"Download"のところをクリックし、Loginページで登録したe-mail addressを入力。
  3. これでMSigDBのダウンロードページに行けるので、
    「c5: gene ontology gene sets」の「bp: biological process」を解析したい場合はc5.bp.v4.0.symbols.gmtファイルをダウンロードしておく。
    「c5: gene ontology gene sets」の「cc: cellular components」を解析したい場合はc5.cc.v4.0.symbols.gmtファイルをダウンロードしておく。
    「c5: gene ontology gene sets」の「mf: molecular functions」を解析したい場合はc5.mf.v4.0.symbols.gmtファイルをダウンロードしておく。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. exonレベルのカウントデータファイル(srp017142_count_bowtie2.txt)の場合:

パイプライン | ゲノム | 機能解析 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013) のStep2の出力結果ファイルです。SeqGSEA内部でReadCountSetクラスオブジェクトというものを作成する必要がありますが、 これはexonレベルのカウントデータと遺伝子アノテーション情報(Ensembl gene IDおよびexon ID)を対応づけるためのものです。 カウントデータ自体は、ヒトゲノム("hg19")のEnsembl Genes ("ensGene")情報を利用して取得しているので、 アノテーション情報も同じ条件でオンライン上でTranscriptDbオブジェクトとして取得しています(Lawrence et al., 2013)。 以下のスクリプト中の前処理のところでごちゃごちゃと計算しているのは、複数のEnsembl gene IDによって共有されているexon (shared exon)の情報のみ解析から除外しています。 その後、shared exonを除く残りのexonレベルのカウントデータ情報を用いてDifferential splicing (DS) analysisを行い、exonレベルの発現変動解析(Wang et al., Gene, 2013)を行っています。 計算のボトルネックはこの部分です。 次に、exonレベルのカウントデータからgeneレベルのカウントデータを作成したのち、DESeqパッケージを用いて 遺伝子レベルの発現変動解析(Anders and Huber, 2010)を行っています。 SeqGSEA (Wang and Cairns, BMC Bioinformatics)は、これら2つのレベルの発現変動解析結果の情報を統合して よりよい遺伝子セット解析(Gene Set Enrichment Analysis; GSEA; Subramanian et al., 2005)を行うという手法です。 ヒト遺伝子の90%以上は選択的スプライシングが起こっている(Wang et al., Nature, 2008)ので、 geneレベルのみの発現変動解析結果をもとにするやり方であるGOSeq (Young et al., Genome Biol., 2010)よりもいいだろう、という思想です。 以下では"c5.bp.v4.0.symbols.gmt"の解析を行っています。 また、並べ替え回数がたったの20回でも2時間ちょっとかかります(Panasonic Let's note CF-SX3本郷モデルの場合)のでご注意ください。 並べ替えを200回行って得られた srp017142_SeqGSEA_c5bp_exon200.txtでは、FDR < 0.01を満たすGO termは26個であることがわかります。

in_f1 <- "srp017142_count_bowtie2.txt" #入力ファイル名を指定してin_f1に格納
in_f2 <- "c5.bp.v4.0.symbols.gmt"      #入力ファイル名を指定してin_f2に格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_perm <- 20                       #並べ替え回数を指定(数値が大きいほどより正確だがその分だけ時間がかかる。実際の解析ではサンプル数にもよるが最低でも1000以上を推奨)
param1 <- "hg19"                       #TranscriptDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #TranscriptDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

#必要なパッケージをロード
library(SeqGSEA)                       #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f4で指定したファイルの読み込み
dim(data)                              #確認してるだけです
tmp_colname <- colnames(data)          #SeqGSEAが判別可能なサンブルラベル情報に変更
colnames(data) <- c(paste("E", 1:param_G1, sep=""), paste("C", 1:param_G2, sep=""))#SeqGSEAが判別可能なサンブルラベル情報に変更

#前処理(ReadCountSetクラスオブジェクトの作成)
txdb <- makeTranscriptDbFromUCSC(genome=param1, tablename=param2)#TranscriptDbオブジェクトを取得してtxdbに格納
hoge1 <- exonsBy(txdb, by=c("gene"))   #Ensembl Gene IDごとに構成するexonの座標情報を格納したGRangesListオブジェクトをhoge1に格納
hoge2 <- unlist(hoge1)                 #GRangesListからGRanges形式オブジェクトに変換
hoge2                                  #確認してるだけです
hoge3 <- table(hoge2$exon_id)          #exon IDごとの出現回数を取得
hoge4 <- names(hoge3)[hoge3 == 1]      #出現回数が1回だったもののexon ID情報を取得
obj <- is.element(as.character(hoge2$exon_id), hoge4)#元のhoge2オブジェクト上での位置情報を取得
exonIDs <- as.character(hoge2$exon_id)[obj]#shared exon以外のexon IDを取得
geneIDs <- names(hoge2)[obj]           #shared exon以外のgene IDを取得
data <- data[exonIDs,]                 #shared exon以外のexon IDの並びでカウントデータのサブセットを取得
dim(data)                              #確認してるだけです
exonIDs <- paste("E", exonIDs, sep="") #exon IDの最初に"E"を追加
RCS <- newReadCountSet(data, exonIDs, geneIDs)#ReadCountSetオブジェクトを作成
RCS                                    #確認してるだけです

#前処理(低発現exonのフィルタリング)
RCS <- exonTestability(RCS, cutoff = 5)#exonレベルでの総リードカウント数が5未満のリードを除去
geneTestable <- geneTestability(RCS)   #geneレベルでのフィルタリングの有無情報を取得
RCS <- subsetByGenes(RCS, unique(geneID(RCS))[geneTestable])#フィルタリング実行
RCS                                    #確認してるだけです

#本番(Differential splicing (DS) analysis; Wang et al., Gene, 2013)
time_DS_s <- proc.time()               #計算時間を計測するため
RCS <- estiExonNBstat(RCS)             #DS解析(exon DS NB-statistics算出)
RCS <- estiGeneNBstat(RCS)             #DS解析(gene DS NB-statistics算出)
head(fData(RCS)[, c("exonIDs", "geneIDs", "testable", "NBstat")])#確認してるだけです
permuteMat <- genpermuteMat(RCS, times=param_perm)#DS解析(permutation testのところ)
RCS <- DSpermute4GSEA(RCS, permuteMat) #DS解析(permutation testのところ)
DSscore.normFac <- normFactor(RCS@permute_NBstat_gene) #DS解析(NB統計量の正規化によるDSスコアの算出)
DSscore <- scoreNormalization(RCS@featureData_gene$NBstat, DSscore.normFac)#DS解析(NB統計量の正規化によるDSスコアの算出)
DSscore.perm <- scoreNormalization(RCS@permute_NBstat_gene, DSscore.normFac)#DS解析(NB統計量の正規化によるDSスコアの算出)
RCS <- DSpermutePval(RCS, permuteMat)  #DS解析(p値の算出)
head(DSresultGeneTable(RCS))           #確認してるだけです
time_DS_e <- proc.time()               #計算時間を計測するため
time_DS_e - time_DS_s                  #計算時間を表示(単位は秒)

#本番(Differential expression (DE) analysis; Anders and Huber, Genome Biol., 2010)
time_DE_s <- proc.time()               #計算時間を計測するため
geneCounts <- getGeneCount(RCS)        #DE解析(geneレベルのカウントデータ取得)
head(geneCounts)                       #確認してるだけです
DEG <- runDESeq(geneCounts, label(RCS))#DE解析(DESeqの実行)
DEGres <- DENBStat4GSEA(DEG)           #DE解析(NB統計量情報の取得)
DEpermNBstat <- DENBStatPermut4GSEA(DEG, permuteMat)#DE解析(permutation testのところ)
DEscore.normFac <- normFactor(DEpermNBstat)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore <- scoreNormalization(DEGres$NBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore.perm <- scoreNormalization(DEpermNBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEGres <- DEpermutePval(DEGres, DEpermNBstat)#DE解析(p値の算出)
head(DEGres)                           #確認してるだけです
time_DE_e <- proc.time()               #計算時間を計測するため
time_DE_e - time_DE_s                  #計算時間を表示(単位は秒)

#本番(Integrative GSEA; Wang and Cairns, BMC Bioinformatics, 2013)
combine <- rankCombine(DEscore, DSscore, DEscore.perm, DSscore.perm, DEweight = 0.3)#DS scoreとDE scoreの統合
gene.score <- combine$geneScore        #integrated score情報取得
gene.score.perm <- combine$genePermuteScore#permutationデータセットのintegrated average score情報取得
GS <- loadGenesets(in_f2, unique(geneID(RCS)), geneID.type = "ensembl")#gmtファイルの読み込みおよびSeqGeneSetオブジェクトの作成
GS <- GSEnrichAnalyze(GS, gene.score, gene.score.perm)#SeqGSEAの実行

#ファイルに保存
#tmp <- GSEAresultTable(GS, GSDesc = TRUE)#SeqGSEA実行結果をtmpに格納(この関数はソート機能がないので非推奨)
tmp <- topGeneSets(GS, n=length(GS@GSNames), sortBy="FDR")#SeqGSEA実行結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. geneレベルのカウントデータファイル(srp017142_count_bowtie.txt)の場合:

パイプライン | ゲノム | 発現変動 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013) のStep2の出力結果ファイルです。 SeqGSEA (Wang and Cairns, BMC Bioinformatics)は、 exonレベル(Differential Splicing; DS)とgeneレベル(Differential Expression; DE)の2つの発現変動解析結果を統合して よりよい遺伝子セット解析(Gene Set Enrichment Analysis; GSEA; Subramanian et al., 2005)を行うという手法ですが、 選択的スプライシング(Alternative Splicing; AS)が少ないあるいはない高等生物以外にも適用可能です。 ここでは、geneレベルの発現変動解析のみに基づくDE-only GSEAのやり方を示します。計算時間のボトルネックになっていたexonレベルの発現変動解析を含まないので高速に計算可能なため、 並べ替え回数を多くすることが可能です(500回で100分程度)。 以下では"c5.bp.v4.0.symbols.gmt"の解析を行っています。並べ替えを500回行って得られた srp017142_SeqGSEA_c5bp_gene500.txtでは、FDR < 0.05を満たすGO termは10個であることがわかります。

in_f1 <- "srp017142_count_bowtie.txt"  #入力ファイル名を指定してin_f1に格納
in_f2 <- "c5.bp.v4.0.symbols.gmt"      #入力ファイル名を指定してin_f2に格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_perm <- 40                       #並べ替え回数を指定(数値が大きいほどより正確だがその分だけ時間がかかる。実際の解析ではサンプル数にもよるが最低でも1000以上を推奨)

#必要なパッケージをロード
library(SeqGSEA)                       #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f4で指定したファイルの読み込み
dim(data)                              #確認してるだけです
tmp_colname <- colnames(data)          #SeqGSEAが判別可能なサンブルラベル情報に変更
colnames(data) <- c(paste("E", 1:param_G1, sep=""), paste("C", 1:param_G2, sep=""))#SeqGSEAが判別可能なサンブルラベル情報に変更
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番(Differential expression (DE) analysis; Anders and Huber, Genome Biol., 2010)
time_s <- proc.time()                  #計算時間を計測するため
DEG <- runDESeq(data, as.factor(data.cl))#DESeqの実行
DEGres <- DENBStat4GSEA(DEG)           #NB統計量情報の取得
permuteMat <- genpermuteMat(as.factor(data.cl), times=param_perm)#並べ替え情報の取得
DEpermNBstat <- DENBStatPermut4GSEA(DEG, permuteMat)#DE解析(permutation testのところ)
DEscore.normFac <- normFactor(DEpermNBstat)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore <- scoreNormalization(DEGres$NBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore.perm <- scoreNormalization(DEpermNBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)

#本番(Integrative GSEA; Wang and Cairns, BMC Bioinformatics, 2013)
gene.score <- geneScore(DEscore, DEweight=1)#integrated score情報取得
gene.score.perm <- genePermuteScore(DEscore.perm, DEweight=1)#permutationデータセットのintegrated average score情報取得
GS <- loadGenesets(in_f2, rownames(data), geneID.type = "ensembl")#gmtファイルの読み込みおよびSeqGeneSetオブジェクトの作成
GS <- GSEnrichAnalyze(GS, gene.score, gene.score.perm, weighted.type=1)#SeqGSEAの実行
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(単位は秒)

#ファイルに保存
#tmp <- GSEAresultTable(GS, GSDesc = TRUE)#SeqGSEA実行結果をtmpに格納(この関数はソート機能がないので非推奨)
tmp <- topGeneSets(GS, n=length(GS@GSNames), sortBy="FDR")#SeqGSEA実行結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 機能解析 | 遺伝子オントロジー(GO)解析 | GOseq (Young_2010)

GOseqを用いてGO解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

	

解析 | 機能解析 | パスウェイ(Pathway)解析 | について

RNA-seqなどのタグカウントデータからパスウェイ(Pathway)解析を行うためのパッケージもいくつか出ています。このページでは、 SeqGSEAの解析が一通りできるようにしてあります(2014/03/30)。 入力のカウントデータは、Ensembl (Flicek et al., Nucleic Acids Res., 2014)のアノテーション情報がおそらくデファクトスタンダードだと思います。

2014年3月に調査した結果をリストアップします。

解析 | 機能解析 | パスウェイ(Pathway)解析 | SeqGSEA (Wang_2014)

SeqGSEAを用いてPathway解析を行うやり方を示します。 このパッケージは、exonレベルのカウントデータを入力として、発現変動遺伝子セットに相当する有意に発現変動したKEGG Pathway名などを出力するのが基本ですが、geneレベルのカウントデータを入力として解析することも可能です。 統計的有意性の評価にサンプルラベル情報の並べ替え(permutation)戦略を採用しているため、 各グループあたりの反復数が5以上のデータを想定しているようです(Wang et al., 2014)。また、計算時間が半端なくかかります。 例えば、並べ替え回数がたったの20回でも2時間ちょっとかかります(Panasonic Let's note CF-SX3本郷モデルの場合)のでご注意ください。 推奨は1000回以上と書いてますが、10日ほどかかることになるので個人的にはアリエナイですね...。

SeqGSEAでの機能解析の基本は、exonレベルとgeneレベルの発現変動解析結果を組み合わせてGSEAを行うというものです(Wang and Cairns, 2013)。 SeqGSEA著者たちは、exonレベルの発現変動解析のことをDifferential splicing (DS) analysisと呼んでいて、 おそらくDSGseq (Wang et al., 2013)はSeqGSEA中に組み込まれています。 そしてgeneレベルの発現変動解析をDifferential expression (DE) analysisとして、SeqGSEA中では DESeqを利用しています。

GSEAに代表される発現変動遺伝子セット解析は、基本的にGSEAの開発者らが作成した様々な遺伝子セット情報を収めたMolecular Signatures Database (MSigDB)からダウンロードした.gmt形式ファイルを読み込んで解析を行います。

*gmt形式ファイルのダウンロード方法は、基本的に以下の通りです:

  1. Molecular Signatures Database (MSigDB)
    register」のページで登録し、遺伝子セットをダウンロード可能な状態にする。
  2. Molecular Signatures Database (MSigDB)
    「Download gene sets」の"Download"のところをクリックし、Loginページで登録したe-mail addressを入力。
  3. これでMSigDBのダウンロードページに行けるので、
    「c2: curated gene sets」の「all canonical pathways」を解析したい場合はc2.cp.v4.0.symbols.gmtファイルをダウンロードしておく。
    「c2: curated gene sets」の「BioCarta gene sets」を解析したい場合はc2.cp.biocarta.v4.0.symbols.gmtファイルをダウンロードしておく。
    「c2: curated gene sets」の「KEGG gene sets」を解析したい場合はc2.cp.kegg.v4.0.symbols.gmtファイルをダウンロードしておく。
    「c2: curated gene sets」の「Reactome gene sets」を解析したい場合はc2.cp.reactome.v4.0.symbols.gmtファイルをダウンロードしておく。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. exonレベルのカウントデータファイル(srp017142_count_bowtie2.txt)の場合:

パイプライン | ゲノム | 機能解析 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013) のStep2の出力結果ファイルです。SeqGSEA内部でReadCountSetクラスオブジェクトというものを作成する必要がありますが、 これはexonレベルのカウントデータと遺伝子アノテーション情報(Ensembl gene IDおよびexon ID)を対応づけるためのものです。 カウントデータ自体は、ヒトゲノム("hg19")のEnsembl Genes ("ensGene")情報を利用して取得しているので、 アノテーション情報も同じ条件でオンライン上でTranscriptDbオブジェクトとして取得しています(Lawrence et al., 2013)。 以下のスクリプト中の前処理のところでごちゃごちゃと計算しているのは、複数のEnsembl gene IDによって共有されているexon (shared exon)の情報のみ解析から除外しています。 その後、shared exonを除く残りのexonレベルのカウントデータ情報を用いてDifferential splicing (DS) analysisを行い、exonレベルの発現変動解析(Wang et al., Gene, 2013)を行っています。 計算のボトルネックはこの部分です。 次に、exonレベルのカウントデータからgeneレベルのカウントデータを作成したのち、DESeqパッケージを用いて 遺伝子レベルの発現変動解析(Anders and Huber, 2010)を行っています。 SeqGSEA (Wang and Cairns, BMC Bioinformatics)は、これら2つのレベルの発現変動解析結果の情報を統合して よりよい遺伝子セット解析(Gene Set Enrichment Analysis; GSEA; Subramanian et al., 2005)を行うという手法です。 ヒト遺伝子の90%以上は選択的スプライシングが起こっている(Wang et al., Nature, 2008)ので、 geneレベルのみの発現変動解析結果をもとにするやり方であるGOSeq (Young et al., Genome Biol., 2010)よりもいいだろう、という思想です。 以下では"c2.cp.kegg.v4.0.symbols.gmt"の解析を行っています。 また、並べ替え回数がたったの20回でも2時間ちょっとかかります(Panasonic Let's note CF-SX3本郷モデルの場合)のでご注意ください。 並べ替えを200回行って得られた srp017142_SeqGSEA_c2cp_exon200.txtでは、FDR < 0.02を満たすパスウェイIDは21個であることがわかります(計算時間は20時間ほどでした)。

in_f1 <- "srp017142_count_bowtie2.txt" #入力ファイル名を指定してin_f1に格納
in_f2 <- "c2.cp.kegg.v4.0.symbols.gmt" #入力ファイル名を指定してin_f2に格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_perm <- 20                       #並べ替え回数を指定(数値が大きいほどより正確だがその分だけ時間がかかる。実際の解析ではサンプル数にもよるが最低でも1000以上を推奨)
param1 <- "hg19"                       #TranscriptDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #TranscriptDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

#必要なパッケージをロード
library(SeqGSEA)                       #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f4で指定したファイルの読み込み
dim(data)                              #確認してるだけです
tmp_colname <- colnames(data)          #SeqGSEAが判別可能なサンブルラベル情報に変更
colnames(data) <- c(paste("E", 1:param_G1, sep=""), paste("C", 1:param_G2, sep=""))#SeqGSEAが判別可能なサンブルラベル情報に変更

#前処理(ReadCountSetクラスオブジェクトの作成)
txdb <- makeTranscriptDbFromUCSC(genome=param1, tablename=param2)#TranscriptDbオブジェクトを取得してtxdbに格納
hoge1 <- exonsBy(txdb, by=c("gene"))   #Ensembl Gene IDごとに構成するexonの座標情報を格納したGRangesListオブジェクトをhoge1に格納
hoge2 <- unlist(hoge1)                 #GRangesListからGRanges形式オブジェクトに変換
hoge2                                  #確認してるだけです
hoge3 <- table(hoge2$exon_id)          #exon IDごとの出現回数を取得
hoge4 <- names(hoge3)[hoge3 == 1]      #出現回数が1回だったもののexon ID情報を取得
obj <- is.element(as.character(hoge2$exon_id), hoge4)#元のhoge2オブジェクト上での位置情報を取得
exonIDs <- as.character(hoge2$exon_id)[obj]#shared exon以外のexon IDを取得
geneIDs <- names(hoge2)[obj]           #shared exon以外のgene IDを取得
data <- data[exonIDs,]                 #shared exon以外のexon IDの並びでカウントデータのサブセットを取得
dim(data)                              #確認してるだけです
exonIDs <- paste("E", exonIDs, sep="") #exon IDの最初に"E"を追加
RCS <- newReadCountSet(data, exonIDs, geneIDs)#ReadCountSetオブジェクトを作成
RCS                                    #確認してるだけです

#前処理(低発現exonのフィルタリング)
RCS <- exonTestability(RCS, cutoff = 5)#exonレベルでの総リードカウント数が5未満のリードを除去
geneTestable <- geneTestability(RCS)   #geneレベルでのフィルタリングの有無情報を取得
RCS <- subsetByGenes(RCS, unique(geneID(RCS))[geneTestable])#フィルタリング実行
RCS                                    #確認してるだけです

#本番(Differential splicing (DS) analysis; Wang et al., Gene, 2013)
time_DS_s <- proc.time()               #計算時間を計測するため
RCS <- estiExonNBstat(RCS)             #DS解析(exon DS NB-statistics算出)
RCS <- estiGeneNBstat(RCS)             #DS解析(gene DS NB-statistics算出)
head(fData(RCS)[, c("exonIDs", "geneIDs", "testable", "NBstat")])#確認してるだけです
permuteMat <- genpermuteMat(RCS, times=param_perm)#DS解析(permutation testのところ)
RCS <- DSpermute4GSEA(RCS, permuteMat) #DS解析(permutation testのところ)
DSscore.normFac <- normFactor(RCS@permute_NBstat_gene) #DS解析(NB統計量の正規化によるDSスコアの算出)
DSscore <- scoreNormalization(RCS@featureData_gene$NBstat, DSscore.normFac)#DS解析(NB統計量の正規化によるDSスコアの算出)
DSscore.perm <- scoreNormalization(RCS@permute_NBstat_gene, DSscore.normFac)#DS解析(NB統計量の正規化によるDSスコアの算出)
RCS <- DSpermutePval(RCS, permuteMat)  #DS解析(p値の算出)
head(DSresultGeneTable(RCS))           #確認してるだけです
time_DS_e <- proc.time()               #計算時間を計測するため
time_DS_e - time_DS_s                  #計算時間を表示(単位は秒)

#本番(Differential expression (DE) analysis; Anders and Huber, Genome Biol., 2010)
time_DE_s <- proc.time()               #計算時間を計測するため
geneCounts <- getGeneCount(RCS)        #DE解析(geneレベルのカウントデータ取得)
head(geneCounts)                       #確認してるだけです
DEG <- runDESeq(geneCounts, label(RCS))#DE解析(DESeqの実行)
DEGres <- DENBStat4GSEA(DEG)           #DE解析(NB統計量情報の取得)
DEpermNBstat <- DENBStatPermut4GSEA(DEG, permuteMat)#DE解析(permutation testのところ)
DEscore.normFac <- normFactor(DEpermNBstat)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore <- scoreNormalization(DEGres$NBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore.perm <- scoreNormalization(DEpermNBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEGres <- DEpermutePval(DEGres, DEpermNBstat)#DE解析(p値の算出)
head(DEGres)                           #確認してるだけです
time_DE_e <- proc.time()               #計算時間を計測するため

#本番(Integrative GSEA; Wang and Cairns, BMC Bioinformatics, 2013)
combine <- rankCombine(DEscore, DSscore, DEscore.perm, DSscore.perm, DEweight = 0.3)#DS scoreとDE scoreの統合
gene.score <- combine$geneScore        #integrated score情報取得
gene.score.perm <- combine$genePermuteScore#permutationデータセットのintegrated average score情報取得
GS <- loadGenesets(in_f2, unique(geneID(RCS)), geneID.type = "ensembl")#gmtファイルの読み込みおよびSeqGeneSetオブジェクトの作成
GS <- GSEnrichAnalyze(GS, gene.score, gene.score.perm)#SeqGSEAの実行

#ファイルに保存
#tmp <- GSEAresultTable(GS, GSDesc = TRUE)#SeqGSEA実行結果をtmpに格納(この関数はソート機能がないので非推奨)
tmp <- topGeneSets(GS, n=length(GS@GSNames), sortBy="FDR")#SeqGSEA実行結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. geneレベルのカウントデータファイル(srp017142_count_bowtie.txt)の場合:

パイプライン | ゲノム | 発現変動 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013) のStep2の出力結果ファイルです。 SeqGSEA (Wang and Cairns, BMC Bioinformatics)は、 exonレベル(Differential Splicing; DS)とgeneレベル(Differential Expression; DE)の2つの発現変動解析結果を統合して よりよい遺伝子セット解析(Gene Set Enrichment Analysis; GSEA; Subramanian et al., 2005)を行うという手法ですが、 選択的スプライシング(Alternative Splicing; AS)が少ないあるいはない高等生物以外にも適用可能です。 ここでは、geneレベルの発現変動解析のみに基づくDE-only GSEAのやり方を示します。計算時間のボトルネックになっていたexonレベルの発現変動解析を含まないので高速に計算可能なため、 並べ替え回数を多くすることが可能です(500回で100分程度)。 以下では"c2.cp.kegg.v4.0.symbols.gmt"の解析を行っています。並べ替えを500回行って得られた srp017142_SeqGSEA_c2cpkegg_gene1000.txtでは、FDR < 0.02を満たすPathwayは44個であることがわかります。

in_f1 <- "srp017142_count_bowtie.txt"  #入力ファイル名を指定してin_f1に格納
in_f2 <- "c2.cp.kegg.v4.0.symbols.gmt" #入力ファイル名を指定してin_f2に格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_perm <- 40                       #並べ替え回数を指定(数値が大きいほどより正確だがその分だけ時間がかかる。実際の解析ではサンプル数にもよるが最低でも1000以上を推奨)

#必要なパッケージをロード
library(SeqGSEA)                       #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f4で指定したファイルの読み込み
dim(data)                              #確認してるだけです
tmp_colname <- colnames(data)          #SeqGSEAが判別可能なサンブルラベル情報に変更
colnames(data) <- c(paste("E", 1:param_G1, sep=""), paste("C", 1:param_G2, sep=""))#SeqGSEAが判別可能なサンブルラベル情報に変更
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番(Differential expression (DE) analysis; Anders and Huber, Genome Biol., 2010)
time_s <- proc.time()                  #計算時間を計測するため
DEG <- runDESeq(data, as.factor(data.cl))#DESeqの実行
DEGres <- DENBStat4GSEA(DEG)           #NB統計量情報の取得
permuteMat <- genpermuteMat(as.factor(data.cl), times=param_perm)#並べ替え情報の取得
DEpermNBstat <- DENBStatPermut4GSEA(DEG, permuteMat)#DE解析(permutation testのところ)
DEscore.normFac <- normFactor(DEpermNBstat)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore <- scoreNormalization(DEGres$NBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore.perm <- scoreNormalization(DEpermNBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)

#本番(Integrative GSEA; Wang and Cairns, BMC Bioinformatics, 2013)
gene.score <- geneScore(DEscore, DEweight=1)#integrated score情報取得
gene.score.perm <- genePermuteScore(DEscore.perm, DEweight=1)#permutationデータセットのintegrated average score情報取得
GS <- loadGenesets(in_f2, rownames(data), geneID.type = "ensembl")#gmtファイルの読み込みおよびSeqGeneSetオブジェクトの作成
GS <- GSEnrichAnalyze(GS, gene.score, gene.score.perm, weighted.type=1)#SeqGSEAの実行
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(単位は秒)

#ファイルに保存
#tmp <- GSEAresultTable(GS, GSDesc = TRUE)#SeqGSEA実行結果をtmpに格納(この関数はソート機能がないので非推奨)
tmp <- topGeneSets(GS, n=length(GS@GSNames), sortBy="FDR")#SeqGSEA実行結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | ChIP-seq | DiffBind (Ross-Innes_2012)

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(DiffBind)                      #パッケージの読み込み
	

解析 | ChIP-seq | ChIPseqR (Humburg_2011)

ChIPseqRを用いたやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(ChIPseqR)                      #パッケージの読み込み
	

解析 | ChIP-seq | chipseq

chipseqを用いたやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(chipseq)                       #パッケージの読み込み
	

解析 | ChIP-seq | PICS (Zhang_2011)

PICSを用いたやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(PICS)                          #パッケージの読み込み
	

解析 | ChIP-seq | ChIPpeakAnno (Zhu_2010)

ChIPpeakAnnoを用いたやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(ChIPpeakAnno)                  #パッケージの読み込み
	

解析 | ChIP-seq | rMAT (Droit_2010)

rMATを用いたやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(rMAT)                          #パッケージの読み込み
	

解析 | ChIP-seq | CSAR (Kaufmann_2009)

CSARを用いたやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(CSAR)                          #パッケージの読み込み
	

解析 | ChIP-seq | ChIPsim (Zhang_2008)

ChIPsimを用いたやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(ChIPsim)                       #パッケージの読み込み
	

解析 | ChIP-seq | 新規モチーフ | rGADEM(Li_2009)

rGADEMを用いたやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(rGADEM)                        #パッケージの読み込み
	

解析 | ChIP-seq | 新規モチーフ | cosmo(Bembom_2007)

cosmoを用いたやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(cosmo)                         #パッケージの読み込み
	

解析 | chromosome conformation capture (3C) | について

"chromosome conformation capture" (3C)は、DNAが細胞中でどのような立体的な配置(染色体の高次構造; chromosome conformation)をとっているか、 またどのような長距離ゲノム間相互作用(long-range genomic interactions)がなされているかを網羅的に調べるための実験技術です(Dekker et al., Science, 2002)。

その後、circular "chromosome conformation capture" (4C; Zhao et al., Nat. Genet., 2006)、 "chromosome conformation capture" carbon copy (5C; Dostie et al., Genome Res., 2006)、 Hi-C (Lieberman-Aiden et al., Science, 2009)、 single-cell Hi-C (Nagano et al., Nature, 2013)などの関連手法が提案されています。

ReviewとしてはDekker et al., Nat. Rev. Genet., 2013などが参考になると思います。 これらのクロマチン間の相互作用(chromatin interaction)を網羅的に検出すべく、NGSと組み合わされた"3C-seq"由来データが出てきています。 Rパッケージは、マップ後のBAM形式ファイルなどを入力として、統計的に有意な相互作用をレポートします。

2014年2月に調査した結果をリストアップします。

解析 | 3C | r3Cseq (Thongjuea_2013)

r3Cseqを用いたやり方を示します。

BAM形式ファイルを入力として、シス相互作用(cis-interaction; 同じ染色体上の異なる部位同士の相互作用)や トランス相互作用(trans-interaction; 異なる染色体間の相互作用)を統計解析結果として出力します。 出力は、シンプルテキストファイルとbedGraphファイル(Kent et al., Genome Res., 2002)のようです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(r3Cseq)                        #パッケージの読み込み
	

解析 | Bisulfite sequencing (BS-seq) | について

Bisulfite sequencing (BS-seq; Bisulfite-seq)は、ゲノムDNAに対してbisulfite (重亜硫酸ナトリウム)処理を行った後にシーケンスを行う実験技術です。

BS-seqは、メチル化状態を検出するためのものです。bisulfite処理すると、メチル化されていないシトシン(C)はウラシル(U)に変換されます。 しかし、メチル化シトシンはUに変換されません。この性質を利用して、bisulfite処理後のDNAを鋳型にしてsequenceすれば、 メチル化シトシンのみCとして読まれ、それ以外はTとして読まれるので、メチル化の有無を区別することができるというものです。 但し、一般にマイクログラム程度のDNA量を必要とするため、一連の処理はPCR増幅のステップを含みます。 その後、アダプター付加(adapter ligation)後にbisulfite処理を行うのではなく、bisulfite処理後にアダプター付加を行うことでPCR増幅のステップを省いた PBAT法(post-bisulfite adaptor tagging; Miura et al., Nucleic Acids Res., 2012)などの関連手法が開発されているようです。

2014年2月に調査した結果をリストアップします。

解析 | BS-seq | BiSeq (Hebestreit_2013)

BiSeqを用いたやり方を示します。

Bismark (Krueger et al., Bioinformatics, 2011)というBS-seq用マッピングプログラムの出力ファイルを入力として、 比較するグループ間でメチル化状態の異なる領域(Differentially Methylated Regions; DMRs)を出力します。

一般に、検定に供されるCpGサイトは100万(one million)以上になります。そのため、多重比較補正(multiple testing correction)後には、 ごく一部の明らかに差のある個所しか有意と判定されない傾向にあります(Bock C., Nat Rev Genet., 2012)。

BiSeqでは、階層的な検定手順(a hierarchical testing procedure; Benjamini and Heller, J Am Stat Assoc., 2007)を採用しています。 具体的には、最初のステップとして「領域(regions)」を単位として検定を行った後、検定の結果棄却された領域(rejected regions)内でより詳細な「個所(locations)」の検定を行う戦略を採用しています。 このように階層的に行うことで、検定数(number of hypothesis tests)を減らすことができ、ひいては検出力(statistical power)を上げることができるわけです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(BiSeq)                         #パッケージの読み込み
	

解析 | BS-seq | bsseq (Hansen_2012)

bsseqを用いたやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(bsseq)                         #パッケージの読み込み
	

解析 | 制限酵素切断部位(RECS)地図 | REDseq (Zhu_201X)

制限酵素消化(restriction enzyme digestion; RED)でアプローチ可能なところと不可能なところを区別できるとうれしいようです。 この制限酵素認識部位を調べるためのRパッケージだそうです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(REDseq)                        #パッケージの読み込み
	

解析 | small RNA | segmentSeq (Hardcastle_2012)

segmentSeqパッケージを用いたやり方を示します。 ゲノム上のsmall interfering RNAs (siRNAs)が結合?!する場所を探してくれるようです。 主な特徴としては、従来の発見的な方法(heuristic method)では、siRNAsの複数個所の"loci"としてレポートしてしまっていたものを、 提案手法の経験ベイズ(empirical Bayesian methods)を用いることで必要以上に分割してしまうことなく"locus"としてレポートしてくれるようです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(segmentSeq)                    #パッケージの読み込み
	

作図 | について

ggplot2という美しい図を作成できるパッケージが存在します。私自身はまだ使ったことがありませんが、デフォルトの作図で気に入らない方は是非お試しください。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

library(ggplot2)                       #パッケージの読み込み
	

作図 | M-A plot(基本編)

マイクロアレイ解析のときにもよく見かけましたが、NGSデータでもデータの分布を示す目的などで用いられます。

解析 | 発現変動 | 2群間 | DESeq (Anders_2010)中でもM-A plotの描画法を示していますが、 ここではサンプルデータ2のSupplementaryTable2_changed.txtの 「G1群 5サンプル vs. G2群 5サンプル」の二群間比較データ(raw count; 特定の遺伝子領域にいくつリードがマップされたかをただカウントした数値データ)を用いていくつかの例を示します。

また、ここでは各群の値の平均値を用いています。 M-A plotについてよくわからない方は私の「2010/12/28のセミナー@金沢」のスライドをごらんください。

この入力データファイルはver.48のEnsembl Gene IDのものであり、 各IDに対応するGene symbol情報などはイントロ | NGS | アノテーション情報取得(BioMart and biomaRt)の3を行って得られたens_gene_48.txt中に存在します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. raw countのデータ:

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#M-A plot本番
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画

#以下は(こんなこともできますという)おまけ
#縦軸の任意の位置に赤で水平線を引きたい
param3 <- 1                            #縦軸の任意の値(つまりこの場合は2倍の発現量の差に相当)をparam3に格納
abline(h=param3, col="red", lwd=1)     #param3で指定したy軸上の値で横線を引く(lwdの値を大きくするほど線が太くなる;横線を引きたいときはh=param3で、縦線を引きたいときはv=param3にするとよい)
	

2. raw countのデータ(サイズを指定してpng形式で保存したいとき):

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#M-A plot本番
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid()                                 #grid線を追加している
dev.off()                              #おまじない
	

3. raw countのデータ(2を基本としてy軸の範囲をparam5で指定したいとき):

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)
param5 <- c(-5, 5)                     #y軸の任意の範囲を指定

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#M-A plot本番
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1, ylim=param5)#MA-plotを描画
dev.off()                              #おまじない
	

4. raw countのデータ(3を基本としてグリッドをparam6で指定した色およびparam7で指定した線のタイプで表示させたいとき):

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)
param5 <- c(-5, 5)                     #y軸の任意の範囲を指定
param6 <- "gray"                       #グリッドの色(red, black, blue, and so on)を指定
param7 <- "solid"                      #グリッド線のタイプ("dotted", "solid", ...)を指定

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#M-A plot本番
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1, ylim=param5)#MA-plotを描画
grid(col=param6, lty=param7)           #param6, 7で指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

5. raw countのデータ(4を基本としてparam8で指定した任意のIDがどのあたりにあるかをparam9で指定した色で表示):

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)
param5 <- c(-8, 8)                     #y軸の任意の範囲を指定
param6 <- "gray"                       #グリッドの色(red, black, blue, and so on)を指定
param7 <- "dotted"                     #グリッド線のタイプ("dotted", "solid", ...)を指定
param8 <- c("ENSG00000004468","ENSG00000182325","ENSG00000110492","ENSG00000008516","ENSG00000100170","ENSG00000173698","ENSG00000171433")#任意のIDを指定
param9 <- "red"                        #色を指定

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#M-A plot本番
obj <- is.element(rownames(data), param8)#param8で指定したIDの位置情報をobjに格納
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1, ylim=param5)#MA-plotを描画
grid(col=param6, lty=param7)           #param6, 7で指定したパラメータでグリッドを表示
points(x_axis[obj], y_axis[obj], col=param9)#param8で指定したGene symbolsに相当する点をparam9で指定した色で表示
dev.off()                              #おまじない

#以下は(こんなこともできますという)おまけ
data[obj,]                             #param8で指定したIDの発現データを表示
	

6. raw countのデータ(4を基本としてparam8で指定した原著論文中でRT-PCRで発現変動が確認された7遺伝子のGene symbolsがどのあたりにあるかをparam9で指定した色で表示):

一見ややこしくて回りくどい感じですが、以下のような事柄に対処するために、ここで記述しているような集合演算テクニック(intersect, is.element (or %in%))を駆使することは非常に大事です:

  1. 一つのgene symbolが複数のEnsembl Gene IDsに対応することがよくある。
  2. BioMartなどから取得したIDの対応関係情報を含むアノテーションファイル(ens_gene_48.txt)中に、原著論文で言及されparam8で指定したgene symbolsが存在しない。
  3. 読み込んだ発現データファイル中にはあるがアノテーションファイル中には存在しないIDがある。
in_f1 <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_f1に格納
in_f2 <- "ens_gene_48.txt"             #アノテーション情報ファイルを指定してin_f2に格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)
param5 <- c(-8, 8)                     #y軸の任意の範囲を指定
param6 <- "gray"                       #グリッドの色(red, black, blue, and so on)を指定
param7 <- "dotted"                     #グリッド線のタイプ("dotted", "solid", ...)を指定
param8 <- c("MMP25","SLC5A1","MDK","GPR64","CD38","GLOD5","FBXL6")#RT-PCRで発現変動が確認されたGene symbolsを指定
param9 <- "red"                        #色を指定

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

tmp <- read.table(in_f2, header=TRUE, sep="\t", quote="")#in_f2で指定したファイルの読み込み
gs_annot <- tmp[,5]                    #5列目(HGNC symbol)の情報をgs_annotに格納
names(gs_annot) <- tmp[,1]             #gs_annotとIDを対応づけている

gs_annot_sub <- intersect(gs_annot, param8)#param8で指定したgene symbolsとアノテーションファイル中のgene symbolsの積集合をgs_annot_subに格納(結果としてparam8と同じ情報になるが、アノテーションファイル中にないものをparam8で指定する可能性もあるためです)
obj_annot <- is.element(gs_annot, gs_annot_sub)#gs_annot_subで指定したgene symbolsのアノテーションファイル中における位置情報をobj_annotに格納(「obj_annot <- gs_annot %in% gs_annot_sub」と同じ意味)
ensembl_annot_gs <- unique(names(gs_annot)[obj_annot])#アノテーションファイル中のobj_annotに対応する位置にあるEnsembl IDsをensembl_annot_gsに格納
ensembl_data_gs <- intersect(rownames(data), ensembl_annot_gs)#ensembl_annot_gsで指定したEnsembl IDsと発現データファイル中のEnsembl IDsの積集合をensembl_data_gs
obj <- is.element(rownames(data), ensembl_data_gs)#発現データファイル中のensembl_data_gsに対応する位置にあるEnsembl IDsをobjに格納 (「obj <- rownames(data) %in% ensembl_data_gs」と同じ意味)

mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)

png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1, ylim=param5)#MA-plotを描画
grid(col=param6, lty=param7)           #param6, 7で指定したパラメータでグリッドを表示
points(x_axis[obj], y_axis[obj], col=param9)#param8で指定したGene symbolsに相当する点をparam9で指定した色で表示
dev.off()                              #おまじない

#以下は(こんなこともできますという)おまけ
ensembl_data_gs                        #param8で指定したGene symbolsに対応するEnsembl Gene IDを表示
data[obj,]                             #param8で指定したGene symbolsの発現データを表示
	

7. RPMデータ(library size normalizationを行ったデータでMA-plot)の場合:

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#RPM補正とM-A plot本番
RPM <- sweep(data, 2, 1000000/colSums(data), "*")#RPM補正した結果をRPMに格納
data <- RPM                            #オブジェクトRPMの情報をdataに代入している
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)

png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid()                                 #grid線を追加している
dev.off()                              #おまじない
	

作図 | M-A plot(ggplot2編)

ここではサンプルデータ2のSupplementaryTable2_changed.txtの 「G1群 5サンプル vs. G2群 5サンプル」の二群間比較データ(raw count; 特定の遺伝子領域にいくつリードがマップされたかをただカウントした数値データ) とTCCパッケージから生成したシミュレーションデータとを用いて2例を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. raw countのデータ

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_fig <- c(380, 420)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ggplot2)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)

#前処理(データ正規化; 群ごとに総リード数の平均値を揃えている)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
hoge <- data[,data.cl==1]              #G1群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G1群の正規化係数を計算した結果をnfに格納
G1 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG1に格納
colSums(G1)                                                      #総リード数を表示
hoge <- data[,data.cl==2]              #G2群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G2群の正規化係数を計算した結果をnfに格納
G2 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG2に格納
colSums(G2)                            #総リード数を表示

#ggplot2用のデータを整形
mean_G1 <- log2(apply(G1, 1, mean))
mean_G2 <- log2(apply(G2, 1, mean))
df <- data.frame(
    A = (mean_G1 + mean_G2) / 2,
    M = mean_G2 - mean_G1
)
head(df)

#ggplot2の描画レイヤーを描く
l <- ggplot(df, aes(x = A, y = M))     #x座標をdfのMEAN列に、y座標をdfのVARIANCEの列とする
l <- l + geom_point(size = 2, pch = 20, na.rm = T)#マーカーの形ををpch=20、サイズをcex=2で指定する
l <- l + xlab("A value")               #x軸ラベル
l <- l + ylab("M value")               #y軸ラベル

#本番(Mean-Variance plot; G1 and G2 両方)
plot(l)

#画像として保存する(Mean-Variance plot; G1 and G2 両方)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(l)                                #プロット
dev.off()                              #おまじない
	

2. シミュレーションデータ

TCCパッケージで生成される2群間比較用のシミュレーションデータを描きます。 シミュレーションデータの場合G1群で高発現しているDEGか、G2群で高発現しているDEGか、non-DEGかわかっいるため、それぞれ別々の色に塗ります。

out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_fig <- c(380, 420)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)
library(ggplot2)

#MAプロット用のデータを生成する
tcc <- simulateReadCounts(replicates = c(param_G1, param_G2))#TCCパッケージの関数を利用してシミュレーションデータを生成する
ma <- plot(tcc)                        #TCCパッケージ中のplot関数を利用してMAプロットの座標を求める

#ggplot2用のデータを整形
tag <- tcc$simulation$trueDEG
tag[tag == 0] <- "non-DEG"
tag[tag == 1] <- "DEG (G1)"
tag[tag == 2] <- "DEG (G2)"
df <- data.frame(
    A = ma$a.value,                    #横軸の値
    M = ma$m.value,                    #縦軸の値
    TYPE = as.factor(tag)              #DEGかnon-DEGか
)

#ggplot2の描画レイヤーを描く
l <- ggplot(df, aes(x = A, y = M))     #x座標をdfのMEAN列に、y座標をdfのVARIANCEの列とする
l <- l + geom_point(aes(colour = TYPE), size = 2, pch = 20, na.rm = T)#マーカーの形ををpch=20、サイズをcex=2で指定する
l <- l + xlab("A value")               #x軸ラベル
l <- l + ylab("M value")               #y軸ラベル

#本番(Mean-Variance plot; G1 and G2 両方)
plot(l)

#画像として保存する(Mean-Variance plot; G1 and G2 両方)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(l)                                #プロット
dev.off()                              #おまじない
	

作図 | ROC曲線

私の2008,2009年の論文では、 主にRT-PCRで発現変動が確認された遺伝子を「真の発現変動遺伝子」とし、どの発現変動遺伝子のランキング法が「真の発現変動遺伝子」をより上位にすることができるかを示す指標として、 「ROC曲線の下部面積(Area Under the ROC curve; AUC)」で方法の比較を行っています(参考文献1,2)。

このAUC値を計算するための基礎情報がROC曲線です。よって、

ここではサンプルデータ2のSupplementaryTable2_changed.txtの 「G1群 5サンプル vs. G2群 5サンプル」の二群間比較データ(raw count; 特定の遺伝子領域にいくつリードがマップされたかをただカウントした数値データ)を用いていくつかの例を示します。

必要な情報は二つのベクトルです。一つは何らかのランキング法を用いて発現変動の度合いで遺伝子をランキングした順位情報、そしてもう一つはどの遺伝子が「真の発現変動遺伝子」かを示す0 or 1の情報です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 「真の発現変動遺伝子」の情報をparam3で指定し、解析 | 発現変動 | 2群間 | baySeq (Hardcastle_2010)の「1.配列長情報なし」の順位情報を用いた場合:

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param3 <- c("ENSG00000004468","ENSG00000182325","ENSG00000110492","ENSG00000008516","ENSG00000100170","ENSG00000173698","ENSG00000171433")#任意のIDを指定
param4 <- "False Positive Rate (FPR)"  #ROC曲線の図のx軸ラベルを指定
param5 <- "True Positive Rate (TPR)"   #ROC曲線の図のy軸ラベルを指定
param6 <- "ROC curves for raw count data"#図のタイトルを指定

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#Step1: 任意のランキング法を用いて順位情報を取得
groups <- list(NDE=rep(1, (param_G1+param_G2)), DE=data.cl)#このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=as.matrix(data), replicates=data.cl, libsizes=as.integer(colSums(data)), groups=groups)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=1000, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL)#事後確率を計算
out@estProps                           #発現変動(DE)遺伝子がデータの中にどの程度含まれていたかを表示(右側の数値;ちなみに左側の数値はNDEの割合を示す)
stat_bayseq <- out@posteriors[,2]      #DEのposterior likelihoodをstat_bayseqに格納
rank_bayseq <- rank(-stat_bayseq, ties.method="min")#stat_bayseqでランキングした結果をrank_bayseqに格納

#Step2: 「真の発現変動遺伝子」に相当する行に1を、それ以外を0としたベクトルを作成
obj <- is.element(rownames(data), param3)#param3で指定したIDの位置情報をobjに格納
obj[obj == "TRUE"] <- 1                #TRUE or FALSEの情報から1 or 0の情報に変換

#Step3: ROC曲線描画
out <- rocdemo.sca(truth = obj, data  =-rank_bayseq)#ROC曲線描画用の形式にしてoutに格納
plot(out, xlab=param4, ylab=param5, main=param6)#描画

#以下は(こんなこともできますという)おまけ
AUC(out)                               #AUC値を計算
	

2. 「1.を基本としつつ、さらにもう一つのランキング法を実行して、二つのROC曲線を重ね書きしたい」場合:

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param3 <- c("ENSG00000004468","ENSG00000182325","ENSG00000110492","ENSG00000008516","ENSG00000100170","ENSG00000173698","ENSG00000171433")#任意のIDを指定
param4 <- "False Positive Rate (FPR)"  #ROC曲線の図のx軸ラベルを指定
param5 <- "True Positive Rate (TPR)"   #ROC曲線の図のy軸ラベルを指定
param6 <- "ROC curves for raw count data"#図のタイトルを指定

#必要なパッケージをロード
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")#おまじない(関数ADの呼び出しのため)
library(ROC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#Step1-1: 任意のランキング法1(baySeq)を用いて順位情報を取得
groups <- list(NDE=rep(1, (param_G1+param_G2)), DE=data.cl)#このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=as.matrix(data), replicates=data.cl, libsizes=as.integer(colSums(data)), groups=groups)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=1000, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL)#事後確率を計算
out@estProps                           #発現変動(DE)遺伝子がデータの中にどの程度含まれていたかを表示(右側の数値;ちなみに左側の数値はNDEの割合を示す)
stat_bayseq <- out@posteriors[,2]      #DEのposterior likelihoodをstat_bayseqに格納
rank_bayseq <- rank(-stat_bayseq, ties.method="min")#stat_bayseqでランキングした結果をrank_bayseqに格納

#Step1-2: 任意のランキング法2(AD; logratio)を用いて順位情報を取得
datalog <- log2(data + 1)              #生データに1足してlogをとったものをdatalogに格納
stat_AD <- AD(data=datalog, data.cl=data.cl)#AD統計量(ただのlogの世界でのAverage Difference)を計算して結果をstat_ADに格納
rank_AD <- rank(-abs(stat_AD), ties.method="min")#stat_ADでランキングした結果をrank_ADに格納

#Step2: 「真の発現変動遺伝子」に相当する行に1を、それ以外を0としたベクトルを作成
obj <- is.element(rownames(data), param3)#param3で指定したIDの位置情報をobjに格納
obj[obj == "TRUE"] <- 1                #TRUE or FALSEの情報から1 or 0の情報に変換

#Step3: ROC曲線描画
out1 <- rocdemo.sca(truth = obj, data  =-rank_bayseq)#ランキング法1の結果をROC曲線描画用の形式にしてout1に格納
plot(out1, axes=F, ann=F)              #軸の数値情報およびラベル情報を描画しない(axes=Fとann=F)設定にして描画
par(new=T)                             #上書きします、という宣言
out2 <- rocdemo.sca(truth = obj, data  =-rank_AD)#ランキング法2の結果をROC曲線描画用の形式にしてout2に格納
plot(out2, xlab=param4, ylab=param5, main=param6)#描画

#以下は(こんなこともできますという)おまけ
AUC(out)                               #AUC値を計算
	

3. 「2.を基本としつつ、ランキング法ごとに指定した色にしたい」場合:

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param3 <- c("ENSG00000004468","ENSG00000182325","ENSG00000110492","ENSG00000008516","ENSG00000100170","ENSG00000173698","ENSG00000171433")#任意のIDを指定
param4 <- "False Positive Rate (FPR)"  #ROC曲線の図のx軸ラベルを指定
param5 <- "True Positive Rate (TPR)"   #ROC曲線の図のy軸ラベルを指定
param6 <- "ROC curves for raw count data"#図のタイトルを指定
param7 <- c(  0,  0,  0)               #ランキング法1の色をRGBで指定
param8 <- c(255,  0,  0)               #ランキング法2の色をRGBで指定

#必要なパッケージをロード
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")#おまじない(関数ADの呼び出しのため)
library(ROC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#Step1-1: 任意のランキング法1(baySeq)を用いて順位情報を取得
groups <- list(NDE=rep(1, (param_G1+param_G2)), DE=data.cl)#このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=as.matrix(data), replicates=data.cl, libsizes=as.integer(colSums(data)), groups=groups)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=1000, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL)#事後確率を計算
out@estProps                           #発現変動(DE)遺伝子がデータの中にどの程度含まれていたかを表示(右側の数値;ちなみに左側の数値はNDEの割合を示す)
stat_bayseq <- out@posteriors[,2]      #DEのposterior likelihoodをstat_bayseqに格納
rank_bayseq <- rank(-stat_bayseq, ties.method="min")#stat_bayseqでランキングした結果をrank_bayseqに格納

#Step1-2: 任意のランキング法2(AD; logratio)を用いて順位情報を取得
datalog <- log2(data + 1)              #生データに1足してlogをとったものをdatalogに格納
stat_AD <- AD(data=datalog, data.cl=data.cl)#AD統計量(ただのlogの世界でのAverage Difference)を計算して結果をstat_ADに格納
rank_AD <- rank(-abs(stat_AD), ties.method="min")#stat_ADでランキングした結果をrank_ADに格納

#Step2: 「真の発現変動遺伝子」に相当する行に1を、それ以外を0としたベクトルを作成
obj <- is.element(rownames(data), param3)#param3で指定したIDの位置情報をobjに格納
obj[obj == "TRUE"] <- 1                #TRUE or FALSEの情報から1 or 0の情報に変換

#Step3: ROC曲線描画
out1 <- rocdemo.sca(truth = obj, data  =-rank_bayseq)#ランキング法1の結果をROC曲線描画用の形式にしてout1に格納
plot(out1, axes=F, ann=F, col=rgb(param7[1], param7[2], param7[3], max=255))#軸の数値情報およびラベル情報を描画しない(axes=Fとann=F)設定にして描画
par(new=T)                             #上書きします、という宣言
out2 <- rocdemo.sca(truth = obj, data  =-rank_AD)#ランキング法2の結果をROC曲線描画用の形式にしてout2に格納
plot(out2, xlab=param4, ylab=param5, main=param6, col=rgb(param8[1], param8[2], param8[3], max=255))#描画

#以下は(こんなこともできますという)おまけ
AUC(out1)                              #ランキング法1のAUC値を計算
AUC(out2)                              #ランキング法2のAUC値を計算
	

4. 「3.を基本としつつ、legendも追加したい(ここではとりあえず「lwd=1」としてますが線分の形式をいろいろ変えることができます(詳細はこちら))」場合:

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param3 <- c("ENSG00000004468","ENSG00000182325","ENSG00000110492","ENSG00000008516","ENSG00000100170","ENSG00000173698","ENSG00000171433")#任意のIDを指定
param4 <- "False Positive Rate (FPR)"  #ROC曲線の図のx軸ラベルを指定
param5 <- "True Positive Rate (TPR)"   #ROC曲線の図のy軸ラベルを指定
param6 <- "ROC curves for raw count data"#図のタイトルを指定
param7 <- c(  0,  0,  0)               #ランキング法1の色をRGBで指定
param8 <- c(255,  0,  0)               #ランキング法2の色をRGBで指定
param9 <- "baySeq"                     #legend用のランキング法1の名前を指定
param10 <- "AD"                        #legend用のランキング法2の名前を指定

#必要なパッケージをロード
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")#おまじない(関数ADの呼び出しのため)
library(ROC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#Step1-1: 任意のランキング法1(baySeq)を用いて順位情報を取得
groups <- list(NDE=rep(1, (param_G1+param_G2)), DE=data.cl)#このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=as.matrix(data), replicates=data.cl, libsizes=as.integer(colSums(data)), groups=groups)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=1000, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL)#事後確率を計算
out@estProps                           #発現変動(DE)遺伝子がデータの中にどの程度含まれていたかを表示(右側の数値;ちなみに左側の数値はNDEの割合を示す)
stat_bayseq <- out@posteriors[,2]      #DEのposterior likelihoodをstat_bayseqに格納
rank_bayseq <- rank(-stat_bayseq, ties.method="min")#stat_bayseqでランキングした結果をrank_bayseqに格納

#Step1-2: 任意のランキング法2(AD; logratio)を用いて順位情報を取得
datalog <- log2(data + 1)              #生データに1足してlogをとったものをdatalogに格納
stat_AD <- AD(data=datalog, data.cl=data.cl)#AD統計量(ただのlogの世界でのAverage Difference)を計算して結果をstat_ADに格納
rank_AD <- rank(-abs(stat_AD), ties.method="min")#stat_ADでランキングした結果をrank_ADに格納

#Step2: 「真の発現変動遺伝子」に相当する行に1を、それ以外を0としたベクトルを作成
obj <- is.element(rownames(data), param3)#param3で指定したIDの位置情報をobjに格納
obj[obj == "TRUE"] <- 1                #TRUE or FALSEの情報から1 or 0の情報に変換

#Step3: ROC曲線描画
out1 <- rocdemo.sca(truth = obj, data  =-rank_bayseq)#ランキング法1の結果をROC曲線描画用の形式にしてout1に格納
plot(out1, axes=F, ann=F, col=rgb(param7[1], param7[2], param7[3], max=255))#軸の数値情報およびラベル情報を描画しない(axes=Fとann=F)設定にして描画
par(new=T)                             #上書きします、という宣言
out2 <- rocdemo.sca(truth = obj, data  =-rank_AD)#ランキング法2の結果をROC曲線描画用の形式にしてout2に格納
plot(out2, xlab=param4, ylab=param5, main=param6, col=rgb(param8[1], param8[2], param8[3], max=255))#描画
legend(0.6, 0.3,                       #legendの左上の開始点がx軸0.6y軸0.3の座標となるようにしてlegendを描画
    c(param9, param10),                #param9, 10で指定した方法名を描画
    col=c(rgb(param7[1], param7[2], param7[3], max=255),#param7指定した方法の色を描画
          rgb(param8[1], param8[2], param8[3], max=255)#param8指定した方法の色を描画
    ),                                 #色指定のところは終了
    lwd=1,                             #線の幅を指定(大きな値-->太い線)
    merge=TRUE                         #TRUEにすると図の右端の線にかぶらない
)                                                                #legendの各種パラメータ指定終了

#以下は(こんなこともできますという)おまけ
AUC(out1)                              #ランキング法1のAUC値を計算
AUC(out2)                              #ランキング法2のAUC値を計算
	

5. 「4」と同じ結果だがパラメータの指定法が違う場合(多数の方法を一度に描画するときに便利です):

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param3 <- c("ENSG00000004468","ENSG00000182325","ENSG00000110492","ENSG00000008516","ENSG00000100170","ENSG00000173698","ENSG00000171433")#任意のIDを指定
param4 <- "False Positive Rate (FPR)"  #ROC曲線の図のx軸ラベルを指定
param5 <- "True Positive Rate (TPR)"   #ROC曲線の図のy軸ラベルを指定
param6 <- "ROC curves for raw count data"#図のタイトルを指定
param7 <- list("baySeq", c(  0,  0,  0))#ランキング法1の「方法名」と「色をRGB」で指定
param8 <- list("AD", c(255,  0,  0))   #ランキング法2の「方法名」と「色をRGB」で指定

#必要なパッケージをロード
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")#おまじない(関数ADの呼び出しのため)
library(ROC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#Step1-1: 任意のランキング法1(baySeq)を用いて順位情報を取得
groups <- list(NDE=rep(1, (param_G1+param_G2)), DE=data.cl)#このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=as.matrix(data), replicates=data.cl, libsizes=as.integer(colSums(data)), groups=groups)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=1000, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL)#事後確率を計算
out@estProps                           #発現変動(DE)遺伝子がデータの中にどの程度含まれていたかを表示(右側の数値;ちなみに左側の数値はNDEの割合を示す)
stat_bayseq <- out@posteriors[,2]      #DEのposterior likelihoodをstat_bayseqに格納
rank_bayseq <- rank(-stat_bayseq, ties.method="min")#stat_bayseqでランキングした結果をrank_bayseqに格納

#Step1-2: 任意のランキング法2(AD; logratio)を用いて順位情報を取得
datalog <- log2(data + 1)              #生データに1足してlogをとったものをdatalogに格納
stat_AD <- AD(data=datalog, data.cl=data.cl)#AD統計量(ただのlogの世界でのAverage Difference)を計算して結果をstat_ADに格納
rank_AD <- rank(-abs(stat_AD), ties.method="min")#stat_ADでランキングした結果をrank_ADに格納

#Step2: 「真の発現変動遺伝子」に相当する行に1を、それ以外を0としたベクトルを作成
obj <- is.element(rownames(data), param3)#param3で指定したIDの位置情報をobjに格納
obj[obj == "TRUE"] <- 1                #TRUE or FALSEの情報から1 or 0の情報に変換

#Step3: ROC曲線描画
out1 <- rocdemo.sca(truth = obj, data  =-rank_bayseq)#ランキング法1の結果をROC曲線描画用の形式にしてout1に格納
plot(out1, axes=F, ann=F, col=rgb(param7[[2]][1], param7[[2]][2], param7[[2]][3], max=255))#軸の数値情報およびラベル情報を描画しない(axes=Fとann=F)設定にして描画
par(new=T)                             #上書きします、という宣言
out2 <- rocdemo.sca(truth = obj, data  =-rank_AD)#ランキング法2の結果をROC曲線描画用の形式にしてout2に格納
plot(out2, xlab=param4, ylab=param5, main=param6, col=rgb(param8[[2]][1], param8[[2]][2], param8[[2]][3], max=255))#描画
legend(0.6, 0.3,                       #legendの左上の開始点がx軸0.6y軸0.3の座標となるようにしてlegendを描画
    c(param7[[1]], param8[[1]]),       #param9, 10で指定した方法名を描画
    col=c(rgb(param7[[2]][1], param7[[2]][2], param7[[2]][3], max=255),#param7指定した方法の色を描画
          rgb(param8[[2]][1], param8[[2]][2], param8[[2]][3], max=255)#param8指定した方法の色を描画
    ),                                 #色指定のところは終了
    lwd=1,                             #線の幅を指定(大きな値-->太い線)
    merge=TRUE                         #TRUEにすると図の右端の線にかぶらない
)                                                                #legendの各種パラメータして終了

#以下は(こんなこともできますという)おまけ
AUC(out1)                              #ランキング法1のAUC値を計算
AUC(out2)                              #ランキング法2のAUC値を計算
	

作図 | SplicingGraphs

選択的スプライシング(Alternative Splicing; AS)はグラフで表現可能です(Sammeth, 2009)。 SplicingGraphsというパッケージはそれをうまく作成できるようです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(SplicingGraphs)                #パッケージの読み込み
	

パイプライン | について

ここの項目では、公共DBからのRNA-seqデータ取得から、マッピング、カウントデータ取得、発現変動解析までの一連のコマンドを示します。 2013年秋頃にRのみで一通り行えるようにしたので記述内容を大幅に変更しています。

パイプライン | ゲノム | 発現変動 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013)

Neyret-Kahn et al., Genome Res., 2013の2群間比較用ヒトRNA-seqデータ (3 proliferative samples vs. 3 Ras samples)が GSE42213に登録されています。 ここでは、SRAdbパッケージを用いたそのFASTQ形式ファイルのダウンロードから、 QuasRパッケージを用いたマッピングおよびカウントデータ取得、 そしてTCCパッケージを用いた発現変動遺伝子(DEG)検出までを行う一連の手順を示します。

原著論文(Neyret-Kahn et al., Genome Res., 2013)では72-baseと書いてますが、取得ファイルは54-baseしかありません。 また、ヒトサンプルなのになぜかマウスゲノム("mm9")にマップしたと書いているのも意味不明です。 ちなみ54 bpと比較的長いリードであり、原著論文中でもsplice-aware alignerの一つであるTopHat (Trapnell et al., Bioinformatics, 2009)を用いてマッピングを行ったと記述していますが、 ここでは、(計算時間短縮のため)basic alignerの一つであるBowtieをQuasRの内部で用いています。

多数のファイルが作成されるので、ここでは「デスクトップ」上に「SRP017142」というフォルダを作成しておき、そこで作業を行うことにします。

Step1. RNA-seqデータのgzip圧縮済みのFASTQファイルをダウンロード:

論文中の記述からGSE42213を頼りに、 RNA-seqデータがGSE42212として収められていることを見出し、 その情報からSRP017142にたどり着いています。 したがって、ここで指定するのは"SRP017142"となります。

計6ファイル、合計6Gb程度の容量のファイルがダウンロードされます。東大の有線LANで一時間弱程度かかります。 早く終わらせたい場合は、最後のgetFASTQfile関数のオプションを'ftp'から'fasp'に変更すると時間短縮可能です。

イントロ | NGS | 配列取得 | FASTQ or SRALite | SRAdb(Zhu_2013)の記述内容と基本的に同じです。

param <- "SRP017142"                   #取得したいSRA IDを指定

#必要なパッケージをロード
library(SRAdb)                         #パッケージの読み込み

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(圧縮状態で300Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#前処理(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。

#前処理(FASTQファイルサイズを表示)
k <- getFASTQinfo(in_acc=hoge$run)     #「hoge$run」で指定したSRRから始まるIDのFASTQファイルサイズ情報などを取得してkに格納
k                                      #kの中身を表示
hoge2 <- cbind(k$library.name,         #ライブラリ名と、
                  k$run.read.count,    #総リード数と、
                  k$file.name,         #ファイル名と、
                  k$file.size)         #ファイルサイズ、の順番で列方向で結合した結果をhoge2に格納
hoge2                                  #hoge2の中身を表示(表示される情報を限定しているだけです)

#本番(FASTQファイルのダウンロード)
getFASTQfile(hoge$run, srcType='ftp')  #「hoge$run」で指定したSRRから始まるIDのFASTQファイルのダウンロード
	

無事ダウンロードが終了すると、作業ディレクトリ(「デスクトップ」上の「SRP017142」フォルダ)中に7つのファイルが存在するはずです。 4Gb程度ある"SRAmetadb.sqlite"ファイルは無視して構いません。残りの"SRR"からはじまる6つのファイルがダウンロードしたRNA-seqデータです。 オリジナルのサンプル名(の略称)で対応関係を表すとsrp017142_samplename.txtのようになっていることがわかります。 尚このファイルはマッピング時の入力ファイルとしても用います。

Step2. ヒトゲノムへのマッピングおよびカウントデータ取得:

マップしたいFASTQファイルリストおよびそのサンプル名を記述したsrp017142_samplename.txtを作業ディレクトリに保存したうえで、下記を実行します。

BSgenomeパッケージで利用可能なBSgenome.Hsapiens.UCSC.hg19へマッピングしています。 名前から推測できるように"UCSC"の"hg19"にマップしているのと同じです。

basic alignerの一つであるBowtieを内部的に用いており、ここではマッピング時のオプションをデフォルトにしています。 原著論文中で用いられたTopHatと同じsplice-aware alignerののカテゴリに含まれるSpliceMap (Au et al., Nucleic Acids Res., 2010) を利用したい場合は、qAlign関数実行のところでsplicedAlignmentオプションをBowtieに対応する"F"からSpliceMapに対応する"T"に変更してください。

hg19にマップした結果なので、TranscriptDbオブジェクト取得時のゲノム情報もそれを基本として Ensembl Genes ("ensGene")を指定しているので、Ensembl Gene IDに対するカウントデータ取得になっています。

マシンパワーにもよりますが、ノートPCでも10時間程度で終わると思います。

マップ後 | カウント情報取得 | ゲノム | アノテーション有 | QuasR(Lerch_XXX)の記述内容と基本的に同じです。

in_f1 <- "srp017142_samplename.txt"    #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f1 <- "srp017142_QC_bowtie.pdf"    #出力ファイル名を指定してout_f1に格納
out_f2 <- "srp017142_count_bowtie.txt" #出力ファイル名を指定してout_f2に格納
out_f3 <- "srp017142_genelength.txt"   #出力ファイル名を指定してout_f3に格納
out_f4 <- "srp017142_RPKM_bowtie.txt"  #出力ファイル名を指定してout_f4に格納
out_f5 <- "srp017142_transcript_seq.fa"#出力ファイル名を指定してout_f5に格納
out_f6 <- "srp017142_other_info1.txt"  #出力ファイル名を指定してout_f6に格納
param1 <- "hg19"                       #TranscriptDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #TranscriptDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param3 <- "gene"                       #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#マッピングおよびQCレポート用ファイル作成
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2,            #マッピングを行うqAlign関数を実行した結果をoutに格納
              splicedAlignment=F)      #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
qQCReport(out, pdfFilename=out_f1)     #QCレポート結果をファイルに保存
palette("default")                     #おまじない

#カウントデータ取得およびファイル保存
txdb <- makeTranscriptDbFromUCSC(genome=param1, tablename=param2)#TranscriptDbオブジェクトを取得してtxdbに格納
count <- qCount(out, txdb, reportLevel=param3)#カウントデータ行列を取得してcountに格納
data <- count[,-1]                     #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#遺伝子配列長情報取得およびファイル保存
genelength <- count[,1]                #遺伝子配列長情報をgenelengthに格納
tmp <- cbind(names(genelength), genelength)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPKM取得およびファイル保存
nf_RPM <- 1000000/colSums(data)        #正規化係数(RPM補正用)を計算した結果をnf_RPMに格納
RPM <- sweep(data, 2, nf_RPM, "*")     #正規化係数を各列に掛けた結果をRPMに格納
nf_RPK <- 1000/genelength              #正規化係数(RPK補正用)を計算した結果をnf_RPKに格納
RPKM <- sweep(RPM, 1, nf_RPK, "*")     #正規化係数を各行に掛けた結果をRPKMに格納
tmp <- cbind(rownames(RPKM), RPKM)     #保存したい情報をtmpに格納
write.table(tmp, out_f4, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#転写物配列情報取得およびファイル保存
library(in_f2, character.only=T)       #指定したパッケージの読み込み
tmp <- ls(paste("package", in_f2, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
fasta <- extractTranscriptsFromGenome(genome, txdb)#転写物塩基配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです
writeXStringSet(fasta, file=out_f5, format="fasta", width=50)#tmpの中身を指定したファイル名で保存

#ファイルに保存(各種情報)
sink(out_f6)                           #指定したファイルへの書き込み指令(表示結果がファイルに保存される)
cat("1. Computation time for mapping (in second).\n")#計算時間を表示(一番右側の数字。単位はsecond)
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
cat("\n\n2. Options used for mapping.\n")#マッピングに用いたオプション情報を表示
out@alignmentParameter                 #マッピングに用いたオプション情報を表示
cat("\n\n3. Alignment statistics.\n")  #マッピング結果(alignment statistics)の表示。
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数
cat("\n\n4. Gene annotation info.\n")  #UCSCからの遺伝子アノテーション情報取得時のバージョン情報などを表示
txdb                                   #UCSCからの遺伝子アノテーション情報取得時のバージョン情報などを表示
cat("\n\n5. Session info.\n")          #解析に用いたRや各種パッケージのバージョン情報を表示
sessionInfo()                          #解析に用いたRや各種パッケージのバージョン情報を表示
sink()                                 #書き込み終了の指令
	

無事マッピングが終了すると、指定した5つのファイルが生成されているはずです。

  1. QCレポートファイル(srp017142_QC_bowtie.pdf):Quality Controlレポートです。よく利用されるFastQCのようなものです。
  2. カウントデータファイル(srp017142_count_bowtie.txt):グループ(サンプル)間での発現変動遺伝子同定に用います。
  3. 遺伝子配列長情報ファイル(srp017142_genelength.txt):配列長とカウント数の関係を調べたいときなどに用います。これはおまけです。
  4. RPKM補正後のファイル(srp017142_RPKM_bowtie.txt):同一サンプル内での発現レベルの大小関係を知りたいときなどに用います。
  5. 転写物塩基配列ファイル(srp017142_transcript_seq.fa):(遺伝子ではなく)転写物の塩基配列のmulti-FASTAファイルです。参考まで。
  6. その他の各種情報ファイル(srp017142_other_info1.txt):論文作成時に必要な、マッピング時に用いたオプション情報、マップされたリード数、Rおよび用いたパッケージのバージョン情報などを含みます。

Step3. サンプル間クラスタリング:

カウントデータ(srp017142_count_bowtie.txt)を用いてサンプル間の全体的な類似度を眺めることを目的として、サンプル間クラスタリングを行います。

類似度は「1-Spearman相関係数」、方法は平均連結法で行っています。 TCC論文(Sun et al., 2013)のFig.3でも同じ枠組みでクラスタリングを行った結果を示していますので、英語論文執筆時の参考にどうぞ。 PearsonではなくSpearmanで行っているのは、ダイナミックレンジが広いので、順序尺度程度にしておいたほうがいいだろうという思想が一番大きいです。 log2変換してダイナミックレンジを圧縮してPearsonにするのも一般的には「アリ」だとは思いますが、マップされたリード数が100万以上あるにも関わらずRPKMデータを用いると、RPKM補正後の値が1未満のものがかなり存在すること、 そしてlogをとれるようにゼロカウントデータの処理が必要ですがやりかた次第で結果がころころかわりうるという状況が嫌なので、RNA-seqデータの場合には私はSpearman相関係数にしています。 また、ベクトルの要素間の差を基本とするdistance metrics (例:ユークリッド距離やマンハッタン距離など)は、比較的最近のRNA-seqデータ正規化法 (TMM: Robinson and Oshlack, 2010, TbT: Kadota et al., 2012, TCC; Sun et al., 2013)論文の重要性が理解できれば、その類似度は少なくともfirst choiceにならないと思われます。 つまり、サンプルごとに転写物の組成比が異なるため、RPMやCPMのような総リード数を補正しただけのデータを用いて「サンプル間の数値の差」に基づいて距離を定めるのはいかがなものか?という思想です。 逆に、ユークリッド距離などを用いてクラスタリングを行った結果と比較することで、転写物の組成比に関する知見が得られるのかもしれません。 さらに、全体的な発現レベルが低いものを予めフィルタリングしておく必要もあるのだろうとは思います。このあたりは、真の回答はありませんので、 (手持ちのデータにこの類似度を適用したときの理論上の短所をきちんと理解したうえで)いろいろ試すというのは重要だとは思います。

ここではカウントデータでクラスタリングをしていますが、おそらく配列長補正後のRPKMデータ(srp017142_RPKM_bowtie.txt) でも得られる樹形図のトポロジー(相対的な位置関係)はほぼ同じになるのではないかと思っています。配列長補正の有無で、サンプル間の相関係数の値自体は変わりますが、 同じグループに属するサンプルであれば反復実験間でそれほど違わないので、多少順位に変動があっても全体としては相殺されるはずです...が確証はありません。

in_f3 <- "srp017142_count_bowtie.txt"  #入力ファイル名を指定してin_f3に格納
out_f6 <- "srp017142_count_cluster.png"#出力ファイル名を指定してout_f6に格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f3, header=TRUE, row.names=1, sep="\t", quote="")#指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#クラスタリングおよび結果の保存
data.dist <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdata.distに格納
out <- hclust(data.dist, method="average")#階層的クラスタリングを実行し、結果をoutに格納
png(out_f6, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

無事計算が終了すると、指定したファイル(srp017142_count_cluster.png)が生成されているはずです。

Step4. 発現変動遺伝子(DEG)同定:

カウントデータファイル(srp017142_count_bowtie.txt)を入力として2群間で発現の異なる遺伝子の検出を行います。

このデータはbiological replicatesありのデータなので、TCCパッケージ(Sun et al., 2013)の推奨ガイドラインに従って、 iDEGES/edgeR正規化(Sun et al., 2013; Robinson et al., 2010; Robinson and Oshlack, 2010; Robinson and Smyth, 2008)を行ったのち、 edgeRパッケージ中のan exact test (Robinson and Smyth, 2008)を行って、DEG検出を行っています。

解析 | 発現変動 | 2群間 | 対応なし | 複製あり | iDEGES/edgeR-edgeR(Sun_2013)および 正規化 | サンプル間 | 2群間 | 複製あり | iDEGES/edgeR(Sun_2013)の記述内容と基本的に同じです。

in_f4 <- "srp017142_count_bowtie.txt"  #入力ファイル名を指定してin_f4に格納
out_f7 <- "srp017142_DEG_bowtie.txt"   #出力ファイル名を指定してout_f7に格納
out_f8 <- "srp017142_MAplot_bowtie.png"#出力ファイル名を指定してout_f8に格納
out_f9 <- "srp017142_other_info2.txt"  #出力ファイル名を指定してout_f9に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_fig <- c(430, 390)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f4, header=TRUE, row.names=1, sep="\t", quote="")#in_f4で指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f7, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f7で指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f8, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR)               #param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない

#ファイルに保存(各種情報)
sink(out_f9)                           #指定したファイルへの書き込み指令(表示結果がファイルに保存される)
cat("1. Numbers of DEGs satisfying several FDR thresholds.\n")#任意のFDR閾値を満たす遺伝子数を表示
cat("FDR < 0.05:");print(sum(tcc$stat$q.value < 0.05))#任意のFDR閾値を満たす遺伝子数を表示
cat("FDR < 0.10:");print(sum(tcc$stat$q.value < 0.10))#任意のFDR閾値を満たす遺伝子数を表示
cat("FDR < 0.20:");print(sum(tcc$stat$q.value < 0.20))#任意のFDR閾値を満たす遺伝子数を表示
cat("FDR < 0.30:");print(sum(tcc$stat$q.value < 0.30))#任意のFDR閾値を満たす遺伝子数を表示
cat("\n\n2. Session info.\n")          #解析に用いたRや各種パッケージのバージョン情報を表示
sessionInfo()                          #解析に用いたRや各種パッケージのバージョン情報を表示
sink()                                 #書き込み終了の指令
	

無事計算が終了すると、指定した3つのファイルが生成されているはずです。

  1. 発現変動解析結果ファイル(srp017142_DEG_bowtie.txt):iDEGES/edgeR-edgeRパイプラインによるDEG同定結果です。 "rank"列でソートすると発現変動の度合い順になります。"q.value"列の情報は任意のFDR閾値を満たす遺伝子数を調べるときに用います。 尚、左側の実数の数値データはiDEGES/edgeR正規化後のデータです。M-A plotはこの数値データに基づいて作成されています。尚、配列長補正は掛かっておりませんのでご注意ください。
  2. M-A plotファイル(srp017142_MAplot_bowtie.png):M versus A plotです。横軸が平均発現レベル(右側が高発現、左側が低発現)。縦軸がlog(G2/G1)で、0より下がG1群で高発現、0より上がG2群で高発現です。
  3. その他の各種情報ファイル(srp017142_other_info2.txt):FDR < 0.05, 0.1, 0.2, 0.3を満たす遺伝子数、論文作成時に必要な、Rおよび用いたパッケージのバージョン情報(特にTCC)などを含みます。

Step5. iDEGES/edgeR正規化後のデータに配列長補正を実行:

カウントデータファイル(srp017142_count_bowtie.txt)と遺伝子配列長情報ファイル(srp017142_genelength.txt)を入力として TCCパッケージ(Sun et al., 2013)の推奨ガイドラインに従って、 iDEGES/edgeR正規化(Sun et al., 2013; Robinson et al., 2010; Robinson and Oshlack, 2010; Robinson and Smyth, 2008)を行ったのち、 配列長補正(Reads per kilobase (RPK) or Counts per kilobase (CPK))を実行した結果を返します。

そろそろ誰かが論文で公式に言い出すかもしれません(既にどこかで書かれているかも...)が、RPM (Reads per million)が提唱されたのは、総リード数が100万程度だった時代です。 今はマップされた総リード数が数千万リードという時代ですので、RPM or RPKMのような100万にするような補正後のデータだと、 (細かい点をすっとばすと)せっかく読んだ総リード数の桁が増えてもダイナミックレンジが広くなりようがありません。 iDEGES/edgeR正規化後のデータは、マップされた総リード数の中央値(median)に合わせているので、リード数が増えるほどダイナミックレンジは広くなります。 しかし、これ自体は配列長補正がかかっていないため、RPKMデータと似たような「配列長補正まで行った後のiDEGES/edgeR正規化データ」があったほうが嬉しいヒトがいるのかな、ということで提供しています。 利用法としては、サンプル間クラスタリングを行う際に、順位相関係数以外のサンプルベクトル中の要素間の差に基づくユークリッド距離やマンハッタン距離をどうしても使いたい場合には RPKMのようなデータを使うよりはこちらの正規化データのほうがnon-DEG間の距離がより0に近い値になるから直感的にはいいのではと思っています。 ただし、iDEGES/edgeR正規化を行うときにサンプルのラベル情報を用いていながら(supervised learningみたいなことを行っている)、 unsupervised learningの一種であるクラスタリングを行う、ということの妥当性についてはよくわかりません。

正規化 | サンプル間 | 2群間 | 複製あり | iDEGES/edgeR(Sun_2013)正規化 | 基礎 | RPK or CPK (配列長補正)の記述内容と基本的に同じです。

in_f4 <- "srp017142_count_bowtie.txt"  #入力ファイル名を指定してin_f4に格納
in_f5 <- "srp017142_genelength.txt"    #入力ファイル名を指定してin_f5に格納
out_f10 <- "srp017142_normalized_bowtie.txt"#出力ファイル名を指定してout_f10に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f4, header=TRUE, row.names=1, sep="\t", quote="")#in_f4で指定したファイルの読み込み
len <- read.table(in_f5, header=TRUE, row.names=1, sep="\t", quote="")#in_f5で指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化 --> 配列長補正)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
nf <- 1000/len[,1]                     #正規化係数(RPK補正用)を計算した結果をnfに格納
normalizedK <- sweep(normalized, 1, nf, "*")#正規化係数を各行に掛けた結果をnormalizedKに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalizedK)#「rownames情報」、「正規化後のカウントデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f10, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f10で指定したファイル名で保存
	

無事計算が終了すると、配列長補正まで行った後のiDEGES/edgeR正規化データファイル(srp017142_normalized_bowtie.txt)が生成されているはずです。

パイプライン | ゲノム | 機能解析 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013)

Neyret-Kahn et al., Genome Res., 2013の2群間比較用ヒトRNA-seqデータ (3 proliferative samples vs. 3 Ras samples)が GSE42213に登録されています。 ここでは、ファイルのダウンロードから、マッピング、カウントデータ取得、機能解析までを行う一連の手順を示します。 SRAdbパッケージを用いたFASTQ形式ファイルのダウンロードがうまくいかない現象を2014/03/27に確認した(2014/04/01に復旧確認済み)ので、 それを使わずに行っています。

多数のファイルが作成されるので、ここでは「デスクトップ」上に「SRP017142」というフォルダを作成しておき、そこで作業を行うことにします。

Step1. RNA-seqデータのbzip2圧縮済みのFASTQファイルをダウンロード:

論文中の記述からGSE42213を頼りに、 RNA-seqデータがGSE42212として収められていることを見出し、 その情報からSRP017142にたどり着きます。

ダウンロードはDDBJ Sequence Read Archive (DRA)のサイトからbzip2圧縮されたFASTQ形式ファイル (SRR616151.fastq.bz2, ..., SRR616156.fastq.bz2)として行います。

無事ダウンロードが終了すると、作業ディレクトリ(「デスクトップ」上の「SRP017142」フォルダ)中に6つのファイルが存在するはずです。 オリジナルのサンプル名(の略称)で対応関係を表すとsrp017142_samplename2.txtのようになっていることがわかります。 尚このファイルはマッピング時の入力ファイルとしても用います。

Step2. ヒトゲノムへのマッピングおよびカウントデータ取得:

マップしたいFASTQファイルリストおよびそのサンプル名を記述したsrp017142_samplename2.txtを作業ディレクトリに保存したうえで、下記を実行します。

BSgenomeパッケージで利用可能なBSgenome.Hsapiens.UCSC.hg19へマッピングしています。 名前から推測できるように"UCSC"の"hg19"にマップしているのと同じです。

basic alignerの一つであるBowtieを内部的に用いており、 ここではマッピング時のオプションを"-m 1 --best --strata -v 2"にしています。

hg19にマップした結果なので、TranscriptDbオブジェクト取得時のゲノム情報もそれを基本として Ensembl Genes ("ensGene")を指定しているので、Ensembl Gene IDに対するカウントデータ取得になっています。 但し、機能解析で用いるSeqGSEAパッケージの入力に合わせて、exonレベルのカウントデータとして取得しています。

マシンパワーにもよりますが、ノートPCでも10時間程度で終わると思います。

マップ後 | カウント情報取得 | ゲノム | アノテーション有 | QuasR(Lerch_XXX)の記述内容と基本的に同じです。

in_f1 <- "srp017142_samplename2.txt"   #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f1 <- "srp017142_QC_bowtie2.pdf"   #出力ファイル名を指定してout_f1に格納
out_f2 <- "srp017142_count_bowtie2.txt"#出力ファイル名を指定してout_f2に格納
out_f3 <- "srp017142_genelength2.txt"  #出力ファイル名を指定してout_f3に格納
out_f4 <- "srp017142_RPKM_bowtie2.txt" #出力ファイル名を指定してout_f4に格納
out_f5 <- "srp017142_transcript_seq2.fa"#出力ファイル名を指定してout_f5に格納
out_f6 <- "srp017142_other_info1_2.txt" #出力ファイル名を指定してout_f6に格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param1 <- "hg19"                       #TranscriptDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #TranscriptDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param3 <- "exon"                       #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#マッピングおよびQCレポート用ファイル作成
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
qQCReport(out, pdfFilename=out_f1)     #QCレポート結果をファイルに保存
palette("default")                     #おまじない

#カウントデータ取得およびファイル保存
txdb <- makeTranscriptDbFromUCSC(genome=param1, tablename=param2)#TranscriptDbオブジェクトを取得してtxdbに格納
count <- qCount(out, txdb, reportLevel=param3)#カウントデータ行列を取得してcountに格納
data <- count[,-1]                     #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#配列長情報取得およびファイル保存
genelength <- count[,1]                #遺伝子配列長情報をgenelengthに格納
tmp <- cbind(names(genelength), genelength)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPKM取得およびファイル保存
nf_RPM <- 1000000/colSums(data)        #正規化係数(RPM補正用)を計算した結果をnf_RPMに格納
RPM <- sweep(data, 2, nf_RPM, "*")     #正規化係数を各列に掛けた結果をRPMに格納
nf_RPK <- 1000/genelength              #正規化係数(RPK補正用)を計算した結果をnf_RPKに格納
RPKM <- sweep(RPM, 1, nf_RPK, "*")     #正規化係数を各行に掛けた結果をRPKMに格納
tmp <- cbind(rownames(RPKM), RPKM)     #保存したい情報をtmpに格納
write.table(tmp, out_f4, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#塩基配列情報取得およびファイル保存
library(in_f2, character.only=T)       #指定したパッケージの読み込み
tmp <- ls(paste("package", in_f2, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
fasta <- extractTranscriptsFromGenome(genome, txdb)#転写物塩基配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです
writeXStringSet(fasta, file=out_f5, format="fasta", width=50)#tmpの中身を指定したファイル名で保存

#ファイルに保存(各種情報)
sink(out_f6)                           #指定したファイルへの書き込み指令(表示結果がファイルに保存される)
cat("1. Computation time for mapping (in second).\n")#計算時間を表示(一番右側の数字。単位はsecond)
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
cat("\n\n2. Options used for mapping.\n")#マッピングに用いたオプション情報を表示
out@alignmentParameter                 #マッピングに用いたオプション情報を表示
cat("\n\n3. Alignment statistics.\n")  #マッピング結果(alignment statistics)の表示。
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数
cat("\n\n4. Gene annotation info.\n")  #UCSCからの遺伝子アノテーション情報取得時のバージョン情報などを表示
txdb                                   #UCSCからの遺伝子アノテーション情報取得時のバージョン情報などを表示
cat("\n\n5. Session info.\n")          #解析に用いたRや各種パッケージのバージョン情報を表示
sessionInfo()                          #解析に用いたRや各種パッケージのバージョン情報を表示
sink()                                 #書き込み終了の指令
	

無事マッピングが終了すると、指定した6つのファイルが生成されているはずです。

  1. QCレポートファイル(srp017142_QC_bowtie2.pdf):Quality Controlレポートです。よく利用されるFastQCのようなものです。
  2. カウントデータファイル(srp017142_count_bowtie2.txt):グループ(サンプル)間での発現変動遺伝子同定に用います。
  3. 遺伝子配列長情報ファイル(srp017142_genelength2.txt):配列長とカウント数の関係を調べたいときなどに用います。これはおまけです。
  4. RPKM補正後のファイル(srp017142_RPKM_bowtie2.txt):同一サンプル内での発現レベルの大小関係を知りたいときなどに用います。
  5. 転写物塩基配列ファイル(srp017142_transcript_seq2.fa):(遺伝子ではなく)転写物の塩基配列のmulti-FASTAファイルです。参考まで。
  6. その他の各種情報ファイル(srp017142_other_info1_2.txt):論文作成時に必要な、マッピング時に用いたオプション情報、マップされたリード数、Rおよび用いたパッケージのバージョン情報などを含みます。

Step3. 機能解析:

カウントデータファイル(srp017142_count_bowtie2.txt)を入力として SeqGSEAを用いて機能解析を行います。 このパッケージは基本的にexonレベルのカウントデータを入力とするので、その前提で行っています。 また、統計的有意性の評価にサンプルラベル情報の並べ替え(permutation)戦略を採用しているため、 各グループあたりの反復数が5以上のデータを想定しているようです。また、計算時間を半端なく要します(10時間とか)。 それゆえ、本来このデータセットはグループあたりの反復数が3しかないので、適用外ということになります。

Step2に引き続いて行う場合には、dataとtxdbオブジェクトの構築を行う必要は本来ありません。 同様の理由でtxdbオブジェクトの作成に必要なparam1とparam2も必要ありませんが、 これらのアノテーション情報を利用していることが既知であるという前提のもとで行っています。

最終的に欲しいReadCountSetクラスオブジェクトは、「カウントデータ、gene ID、exon ID」の3つの情報から構築されます。 しかし、txdbオブジェクトから得られるgene IDとexon IDはshared exonを含むので、曖昧性を排除するためこれらを除去する必要があります。 それゆえ、hoge2中のexon IDを抽出して一回しか出現しなかったIDをhoge4として取得し、 もとのhoge2オブジェクトの並びで取得しなおしたものがexonIDsとgeneIDsオブジェクトです。

exonレベルカウントデータもshared exonの情報を含むので、それらを除いたものを取得しています。

SeqGSEAでの機能解析の基本はexonレベルとgeneレベルの発現変動解析結果を組み合わせてGSEAを行うというものです(Wang and Cairns, 2013)。 SeqGSEA著者たちは、exonレベルの発現変動解析のことをDifferential splicing (DS) analysisと呼んでいて、 おそらくDSGseqはSeqGSEA中に組み込まれていると思います。 そしてgeneレベルの発現変動解析をdifferential expression (DE) analysisとして、SeqGSEA中では DESeqを利用しています。

GSEAに代表される発現変動遺伝子セット解析は、基本的にGSEAの開発者らが作成した様々な遺伝子セット情報を収めたMolecular Signatures Database (MSigDB)からダウンロードした.gmt形式ファイルを読み込んで解析を行います。

*gmt形式ファイルのダウンロード方法は、基本的に以下の通りです:

  1. Molecular Signatures Database (MSigDB)
    register」のページで登録し、遺伝子セットをダウンロード可能な状態にする。
  2. Molecular Signatures Database (MSigDB)
    「Download gene sets」の"Download"のところをクリックし、Loginページで登録したe-mail addressを入力。
  3. これでMSigDBのダウンロードページに行けるので、
    「c5: gene ontology gene sets」の「BP: biological process」を解析したい場合はc5.bp.v4.0.symbols.gmtファイルをダウンロードしておく。
    「c2: curated gene sets」の「KEGG gene sets」を解析したい場合はc2.cp.kegg.v4.0.symbols.gmtファイルをダウンロードしておく。
    「c3: motif gene sets」を解析したい場合はc3.all.v4.0.symbols.gmtファイルをダウンロードしておく。

以下ではc5.bp.v4.0.symbols.gmtの解析を行っています。 また、並べ替え回数がたったの20回でも2時間ちょっとかかります(Panasonic Let's note CF-SX3本郷モデルの場合)のでご注意ください。 推奨は1000回以上と書いてますが、個人的にはアリエナイですね。。。

in_f4 <- "srp017142_count_bowtie2.txt" #入力ファイル名を指定してin_f4に格納
in_f5 <- "c5.bp.v4.0.symbols.gmt"      #入力ファイル名を指定してin_f5に格納
out_f7 <- "srp017142_SeqGSEA_c5bp.txt" #出力ファイル名を指定してout_f7に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_perm <- 20                       #並べ替え回数を指定(数値が大きいほどより正確だがその分だけ時間がかかる。実際の解析ではサンプル数にもよるが最低でも1000以上を推奨)
param1 <- "hg19"                       #TranscriptDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #TranscriptDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

#必要なパッケージをロード
library(SeqGSEA)                       #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f4, header=TRUE, row.names=1, sep="\t", quote="")#in_f4で指定したファイルの読み込み
dim(data)                              #確認してるだけです
tmp_colname <- colnames(data)          #SeqGSEAが判別可能なサンブルラベル情報に変更
colnames(data) <- c(paste("E", 1:param_G1, sep=""), paste("C", 1:param_G2, sep=""))#SeqGSEAが判別可能なサンブルラベル情報に変更

#前処理(ReadCountSetクラスオブジェクトの作成)
txdb <- makeTranscriptDbFromUCSC(genome=param1, tablename=param2)#TranscriptDbオブジェクトを取得してtxdbに格納
hoge1 <- exonsBy(txdb, by=c("gene"))   #Ensembl Gene IDごとに構成するexonの座標情報を格納したGRangesListオブジェクトをhoge1に格納
hoge2 <- unlist(hoge1)                 #GRangesListからGRanges形式オブジェクトに変換
hoge2                                  #確認してるだけです
hoge3 <- table(hoge2$exon_id)          #exon IDごとの出現回数を取得
hoge4 <- names(hoge3)[hoge3 == 1]      #出現回数が1回だったもののexon ID情報を取得
obj <- is.element(as.character(hoge2$exon_id), hoge4)#元のhoge2オブジェクト上での位置情報を取得
exonIDs <- as.character(hoge2$exon_id)[obj]#shared exon以外のexon IDを取得
geneIDs <- names(hoge2)[obj]           #shared exon以外のgene IDを取得
data <- data[exonIDs,]                 #shared exon以外のexon IDの並びでカウントデータのサブセットを取得
#rownames(data) <- paste(geneIDs, exonIDs, sep=":")#行名を変更
dim(data)                              #確認してるだけです
exonIDs <- paste("E", exonIDs, sep="") #exon IDの最初に"E"を追加
RCS <- newReadCountSet(data, exonIDs, geneIDs)#ReadCountSetオブジェクトを作成
RCS                                    #確認してるだけです

#前処理(低発現exonのフィルタリング)
RCS <- exonTestability(RCS, cutoff = 5)#exonレベルでの総リードカウント数が5未満のリードを除去
geneTestable <- geneTestability(RCS)   #geneレベルでのフィルタリングの有無情報を取得
RCS <- subsetByGenes(RCS, unique(geneID(RCS))[geneTestable])#フィルタリング実行
RCS                                    #確認してるだけです

#本番(Differential splicing (DS) analysis; Wang et al., Gene, 2013)
time_DS_s <- proc.time()               #計算時間を計測するため
RCS <- estiExonNBstat(RCS)             #DS解析(exon DS NB-statistics算出)
RCS <- estiGeneNBstat(RCS)             #DS解析(gene DS NB-statistics算出)
head(fData(RCS)[, c("exonIDs", "geneIDs", "testable", "NBstat")])#確認してるだけです
permuteMat <- genpermuteMat(RCS, times=param_perm)#DS解析(permutation testのところ)
RCS <- DSpermute4GSEA(RCS, permuteMat) #DS解析(permutation testのところ)
DSscore.normFac <- normFactor(RCS@permute_NBstat_gene) #DS解析(NB統計量の正規化によるDSスコアの算出)
DSscore <- scoreNormalization(RCS@featureData_gene$NBstat, DSscore.normFac)#DS解析(NB統計量の正規化によるDSスコアの算出)
DSscore.perm <- scoreNormalization(RCS@permute_NBstat_gene, DSscore.normFac)#DS解析(NB統計量の正規化によるDSスコアの算出)
RCS <- DSpermutePval(RCS, permuteMat)  #DS解析(p値の算出)
head(DSresultGeneTable(RCS))           #確認してるだけです
time_DS_e <- proc.time()               #計算時間を計測するため
time_DS_e - time_DS_s                  #計算時間を表示(単位は秒)

#本番(Differential expression (DE) analysis; Anders and Huber, Genome Biol., 2010)
time_DE_s <- proc.time()               #計算時間を計測するため
geneCounts <- getGeneCount(RCS)        #DE解析(geneレベルのカウントデータ取得)
head(geneCounts)                       #確認してるだけです
DEG <- runDESeq(geneCounts, label(RCS))#DE解析(DESeqの実行)
DEGres <- DENBStat4GSEA(DEG)           #DE解析(NB統計量情報の取得)
DEpermNBstat <- DENBStatPermut4GSEA(DEG, permuteMat)#DE解析(permutation testのところ)
DEscore.normFac <- normFactor(DEpermNBstat)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore <- scoreNormalization(DEGres$NBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore.perm <- scoreNormalization(DEpermNBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEGres <- DEpermutePval(DEGres, DEpermNBstat)#DE解析(p値の算出)
head(DEGres)                           #確認してるだけです
time_DE_e <- proc.time()               #計算時間を計測するため
time_DE_e - time_DE_s                  #計算時間を表示(単位は秒)

#本番(Integrative GSEA; Wang and Cairns, BMC Bioinformatics, 2013)
combine <- rankCombine(DEscore, DSscore, DEscore.perm, DSscore.perm, DEweight = 0.3)#DS scoreとDE scoreの統合
gene.score <- combine$geneScore        #integrated score情報取得
gene.score.perm <- combine$genePermuteScore#permutationデータセットのintegrated average score情報取得
GS <- loadGenesets(in_f5, unique(geneID(RCS)), geneID.type = "ensembl")#gmtファイルの読み込みおよびSeqGeneSetオブジェクトの作成
GS <- GSEnrichAnalyze(GS, gene.score, gene.score.perm)#SeqGSEAの実行

#ファイルに保存
#tmp <- GSEAresultTable(GS, GSDesc = TRUE)#SeqGSEA実行結果をtmpに格納(この関数はソート機能がないので非推奨)
tmp <- topGeneSets(GS, n=length(GS@GSNames), sortBy="FDR")#SeqGSEA実行結果をtmpに格納
write.table(tmp, out_f7, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

無事計算が終了すると、指定したファイル(srp017142_SeqGSEA_c5bp.txt)が生成されているはずです。 このファイルは並べ替え回数を30回(param_perm <- 30)にして実行した結果です。 permutation p-valueに基づく結果であり並べ替え回数が少ないので、同じ数値を指定した計算結果でも、全く同じ数値や並びになっているとは限りませんのでご注意ください。 例えば、このファイルの場合は、FDR < 0.05未満のものが22個(遺伝子セット名が"CYTOKINESIS"から"INNATE_IMMUNE_RESPONSE"まで)あると解釈します。

パイプライン | ゲノム | 機能解析 | 2群間 | 対応なし | 複製あり | SRP011435(Huang_2012)

Huang et al., Development, 2012の2群間比較用シロイヌナズナRNA-seqデータ (4 DEX-treated vs. 4 mock-treated)が GSE36469に登録されています。 ここでは、SRAdbパッケージを用いたそのFASTQ形式ファイルのダウンロードから、 QuasRパッケージを用いたマッピングおよびカウントデータ取得、 そしてTCCパッケージを用いた発現変動遺伝子(DEG)検出までを行う一連の手順を示します。

多数のファイルが作成されるので、ここでは「デスクトップ」上に「SRP011435」というフォルダを作成しておき、そこで作業を行うことにします。

Step1. RNA-seqデータのgzip圧縮済みのFASTQファイルをダウンロード:

論文中の記述からGSE36469を頼りに、 RNA-seqデータがGSE36469として収められていることを見出し、 その情報からSRP011435にたどり着いています。 したがって、ここで指定するのは"SRP011435"となります。

計8ファイル、合計10Gb程度の容量のファイルがダウンロードされます。東大の有線LANで2時間程度かかります。 早く終わらせたい場合は、最後のgetFASTQfile関数のオプションを'ftp'から'fasp'に変更すると時間短縮可能です。

イントロ | NGS | 配列取得 | FASTQ or SRALite | SRAdb(Zhu_2013)の記述内容と基本的に同じです。

param <- "SRP011435"                   #取得したいSRA IDを指定

#必要なパッケージをロード
library(SRAdb)                         #パッケージの読み込み

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(圧縮状態で300Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#前処理(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。

#前処理(FASTQファイルサイズを表示)
k <- getFASTQinfo(in_acc=hoge$run)     #「hoge$run」で指定したSRRから始まるIDのFASTQファイルサイズ情報などを取得してkに格納
k                                      #kの中身を表示
hoge2 <- cbind(k$library.name,         #ライブラリ名と、
                  k$run.read.count,    #総リード数と、
                  k$file.name,         #ファイル名と、
                  k$file.size)         #ファイルサイズ、の順番で列方向で結合した結果をhoge2に格納
hoge2                                  #hoge2の中身を表示(表示される情報を限定しているだけです)

#本番(FASTQファイルのダウンロード)
getFASTQfile(hoge$run, srcType='ftp')  #「hoge$run」で指定したSRRから始まるIDのFASTQファイルのダウンロード
	

無事ダウンロードが終了すると、作業ディレクトリ(「デスクトップ」上の「SRP011435」フォルダ)中に9つのファイルが存在するはずです。 4Gb程度ある"SRAmetadb.sqlite"ファイルは無視して構いません。残りの"SRR"からはじまる8つのファイルがダウンロードしたRNA-seqデータです。 オリジナルのサンプル名(の略称)で対応関係を表すとsrp011435_samplename.txtのようになっていることがわかります。 尚このファイルはマッピング時の入力ファイルとしても用います。

Step2. シロイヌナズナ(A. thaliana)ゲノムへのマッピングおよびカウントデータ取得:

マップしたいFASTQファイルリストおよびそのサンプル名を記述したsrp011435_samplename.txtを作業ディレクトリに保存したうえで、下記を実行します。

BSgenomeパッケージで利用可能なBSgenome.Athaliana.TAIR.TAIR9へマッピングしています。 名前から推測できるように"TAIR"の"TAIR9"にマップしているのと同じです。BSgenome.Athaliana.TAIR.TAIR9パッケージインストールされていない場合は自動でインストールしてくれるので特に気にする必要はありません。

basic alignerの一つであるBowtieを内部的に用いており、ここではマッピング時のオプションをデフォルトにしています。 原著論文中で用いられたTopHatと同じsplice-aware alignerののカテゴリに含まれるSpliceMap (Au et al., Nucleic Acids Res., 2010) を利用したい場合は、qAlign関数実行のところでsplicedAlignmentオプションをBowtieに対応する"F"からSpliceMapに対応する"T"に変更してください。

TAIR9にマップした結果であり、UCSCからはArabidopsisの遺伝子アノテーション情報が提供されていないため、 TAIR10_GFF3_genes.gffを予めダウンロードしておき、makeTranscriptDbFromGFF関数を用いてTranscriptDbオブジェクトを作成しています。

マシンパワーにもよりますが、ノートPCでも10時間程度で終わると思います。

マップ後 | カウント情報取得 | ゲノム | アノテーション有 | QuasR(Lerch_XXX)の記述内容と基本的に同じです。

in_f1 <- "srp011435_samplename.txt"    #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Athaliana.TAIR.TAIR9"#入力ファイル名を指定してin_f2に格納(リファレンス配列)
in_f3 <- "TAIR10_GFF3_genes.gff"       #入力ファイル名を指定してin_f3に格納(GFF3またはGTF形式のアノテーションファイル)
out_f1 <- "srp011435_QC_bowtie.pdf"    #出力ファイル名を指定してout_f1に格納
out_f2 <- "srp011435_count_bowtie.txt" #出力ファイル名を指定してout_f2に格納
out_f3 <- "srp011435_genelength.txt"   #出力ファイル名を指定してout_f3に格納
out_f4 <- "srp011435_RPKM_bowtie.txt"  #出力ファイル名を指定してout_f4に格納
out_f5 <- "srp011435_transcript_seq.fa"#出力ファイル名を指定してout_f5に格納
out_f6 <- "srp011435_other_info1.txt"  #出力ファイル名を指定してout_f6に格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param3 <- "gene"                       #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#マッピングおよびQCレポート用ファイル作成
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping,#マッピングを行うqAlign関数を実行した結果をoutに格納
              splicedAlignment=F)      #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
qQCReport(out, pdfFilename=out_f1)     #QCレポート結果をファイルに保存
palette("default")                     #おまじない
time_e - time_s                        #計算時間を表示(単位は秒)

#カウントデータ取得およびファイル保存
txdb <- makeTranscriptDbFromGFF(in_f3) #TranscriptDbオブジェクトを取得してtxdbに格納
count <- qCount(out, txdb, reportLevel=param3)#カウントデータ行列を取得してcountに格納
data <- count[,-1]                     #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#遺伝子配列長情報取得およびファイル保存
genelength <- count[,1]                #遺伝子配列長情報をgenelengthに格納
tmp <- cbind(names(genelength), genelength)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPKM取得およびファイル保存
nf_RPM <- 1000000/colSums(data)        #正規化係数(RPM補正用)を計算した結果をnf_RPMに格納
RPM <- sweep(data, 2, nf_RPM, "*")     #正規化係数を各列に掛けた結果をRPMに格納
nf_RPK <- 1000/genelength              #正規化係数(RPK補正用)を計算した結果をnf_RPKに格納
RPKM <- sweep(RPM, 1, nf_RPK, "*")     #正規化係数を各行に掛けた結果をRPKMに格納
tmp <- cbind(rownames(RPKM), RPKM)     #保存したい情報をtmpに格納
write.table(tmp, out_f4, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#転写物配列情報取得およびファイル保存
library(in_f2, character.only=T)       #指定したパッケージの読み込み
tmp <- ls(paste("package", in_f2, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
fasta <- extractTranscriptsFromGenome(genome, txdb)#転写物塩基配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです
writeXStringSet(fasta, file=out_f5, format="fasta", width=50)#tmpの中身を指定したファイル名で保存

#ファイルに保存(各種情報)
sink(out_f6)                           #指定したファイルへの書き込み指令(表示結果がファイルに保存される)
cat("1. Computation time for mapping (in second).\n")#計算時間を表示(一番右側の数字。単位はsecond)
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
cat("\n\n2. Options used for mapping.\n")#マッピングに用いたオプション情報を表示
out@alignmentParameter                 #マッピングに用いたオプション情報を表示
cat("\n\n3. Alignment statistics.\n")  #マッピング結果(alignment statistics)の表示。
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数
cat("\n\n4. Gene annotation info.\n")  #UCSCからの遺伝子アノテーション情報取得時のバージョン情報などを表示
txdb                                   #UCSCからの遺伝子アノテーション情報取得時のバージョン情報などを表示
cat("\n\n5. Session info.\n")          #解析に用いたRや各種パッケージのバージョン情報を表示
sessionInfo()                          #解析に用いたRや各種パッケージのバージョン情報を表示
sink()                                 #書き込み終了の指令
	

無事マッピングが終了すると、指定した6つのファイルが生成されているはずです。

  1. QCレポートファイル(srp011435_QC_bowtie.pdf):Quality Controlレポートです。よく利用されるFastQCのようなものです。
  2. カウントデータファイル(srp011435_count_bowtie.txt):グループ(サンプル)間での発現変動遺伝子同定に用います。
  3. 遺伝子配列長情報ファイル(srp011435_genelength.txt):配列長とカウント数の関係を調べたいときなどに用います。これはおまけです。
  4. RPKM補正後のファイル(srp011435_RPKM_bowtie.txt):同一サンプル内での発現レベルの大小関係を知りたいときなどに用います。
  5. 転写物塩基配列ファイル(srp011435_transcript_seq.fa):(遺伝子ではなく)転写物の塩基配列のmulti-FASTAファイルです。参考まで。
  6. その他の各種情報ファイル(srp011435_other_info1.txt):論文作成時に必要な、マッピング時に用いたオプション情報、マップされたリード数、Rおよび用いたパッケージのバージョン情報などを含みます。

Step2. シロイヌナズナ(A. thaliana)ゲノムへのマッピングおよびカウントデータ取得(リファレンスがmulti-FASTAファイルの場合):

マップしたいFASTQファイルリストおよびそのサンプル名を記述したsrp011435_samplename.txtを作業ディレクトリに保存したうえで、下記を実行します。 シロイヌナズナのゲノム配列ファイル(TAIR10_chr_all.fas)へマッピングしています。 但し、マッピングに用いるQuasRパッケージ中のqAlign関数がリファレンス配列ファイルの拡張子として"*.fasta", "*.fa", "*.fna"しか認識してくれません。 また、カウントデータを取得するために遺伝子アノテーションファイル(TAIR10_GFF3_genes.gff)を利用する必要がありますが、 このファイル中の染色体名と揃える必要があるため、TAIR10_chr_all.fasファイル中のdescription部分をparamで指定した文字列に置換したファイル(tmp_genome.fasta)を中間ファイルとして作成しています。 TAIR10_GFF3_genes.gffを予めダウンロードしておき、makeTranscriptDbFromGFF関数を用いてTranscriptDbオブジェクトを作成しています。 マシンパワーにもよりますが、ノートPCでも10時間程度で終わると思います。マップ後 | カウント情報取得 | ゲノム | アノテーション有 | QuasR(Lerch_XXX)の記述内容と基本的に同じです。 2014年5月2日までextractTranscriptsFromGenome関数を用いて転写物配列情報を取得していましたが、「'extractTranscriptsFromGenome' is deprecated. Use 'extractTranscriptSeqs' instead.」 という警告メッセージが出たので、extractTranscriptSeqs関数に変更しています。尚、Step2のトータル計算時間はノートPCで7時間程度です。

in_f <- "TAIR10_chr_all.fas"           #入力ファイル名を指定してin_fに格納
out_f <- "tmp_genome.fasta"            #出力ファイル名を指定してout_fに格納
param <- c("Chr1","Chr2","Chr3","Chr4","Chr5","ChrM","ChrC")#置換したい文字列を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
names(fasta) <- param                  #names(fasta)の中身をparamで置換
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	
in_f1 <- "srp011435_samplename.txt"    #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "tmp_genome.fasta"            #入力ファイル名を指定してin_f2に格納(リファレンス配列)
in_f3 <- "TAIR10_GFF3_genes.gff"       #入力ファイル名を指定してin_f3に格納(GFF3またはGTF形式のアノテーションファイル)
out_f1 <- "srp011435_QC_bowtie_2.pdf"  #出力ファイル名を指定してout_f1に格納
out_f2 <- "srp011435_count_bowtie_2.txt"#出力ファイル名を指定してout_f2に格納
out_f3 <- "srp011435_genelength_2.txt" #出力ファイル名を指定してout_f3に格納
out_f4 <- "srp011435_RPKM_bowtie_2.txt"#出力ファイル名を指定してout_f4に格納
#out_f5 <- "srp011435_transcript_seq_2.fa"#出力ファイル名を指定してout_f5に格納
out_f6 <- "srp011435_other_info1_2.txt"#出力ファイル名を指定してout_f6に格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param3 <- "gene"                       #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み
#library(Rsamtools)                     #パッケージの読み込み

#マッピングおよびQCレポート用ファイル作成
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping,#マッピングを行うqAlign関数を実行した結果をoutに格納
              splicedAlignment=F)      #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
qQCReport(out, pdfFilename=out_f1)     #QCレポート結果をファイルに保存
palette("default")                     #おまじない
time_e - time_s                        #計算時間を表示(単位は秒)

#カウントデータ取得およびファイル保存
txdb <- makeTranscriptDbFromGFF(in_f3) #TranscriptDbオブジェクトを取得してtxdbに格納
count <- qCount(out, txdb, reportLevel=param3)#カウントデータ行列を取得してcountに格納
data <- count[,-1]                     #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#遺伝子配列長情報取得およびファイル保存
genelength <- count[,1]                #遺伝子配列長情報をgenelengthに格納
tmp <- cbind(names(genelength), genelength)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPKM取得およびファイル保存
nf_RPM <- 1000000/colSums(data)        #正規化係数(RPM補正用)を計算した結果をnf_RPMに格納
RPM <- sweep(data, 2, nf_RPM, "*")     #正規化係数を各列に掛けた結果をRPMに格納
nf_RPK <- 1000/genelength              #正規化係数(RPK補正用)を計算した結果をnf_RPKに格納
RPKM <- sweep(RPM, 1, nf_RPK, "*")     #正規化係数を各行に掛けた結果をRPKMに格納
tmp <- cbind(rownames(RPKM), RPKM)     #保存したい情報をtmpに格納
write.table(tmp, out_f4, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#転写物配列情報取得およびファイル保存はエラーが出るので実行しないようにしています。
#fasta_trans <- extractTranscriptSeqs(FaFile(in_f2), txdb)#転写物塩基配列情報を取得した結果をfasta_transに格納
#fasta_trans <- extractTranscriptSeqs(FaFile(in_f2), exonsBy(txdb, by="tx", use.names=TRUE))#転写物塩基配列情報を取得した結果をfasta_transに格納
#fasta_trans <- extractTranscriptSeqs(FaFile(in_f2), cdsBy(txdb, by="tx", use.names=TRUE))#転写物塩基配列情報を取得した結果をfasta_transに格納
#fasta_trans <- extractTranscriptSeqs(fasta, txdb)#転写物塩基配列情報を取得した結果をfasta_transに格納
#fasta_trans <- extractTranscriptSeqs(fasta, exonsBy(txdb, by="tx", use.names=TRUE))#転写物塩基配列情報を取得した結果をfasta_transに格納
#fasta_trans                            #確認してるだけです
#writeXStringSet(fasta_trans, file=out_f5, format="fasta", width=50)#tmpの中身を指定したファイル名で保存

#ファイルに保存(各種情報)
sink(out_f6)                           #指定したファイルへの書き込み指令(表示結果がファイルに保存される)
cat("1. Computation time for mapping (in second).\n")#計算時間を表示(一番右側の数字。単位はsecond)
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
cat("\n\n2. Options used for mapping.\n")#マッピングに用いたオプション情報を表示
out@alignmentParameter                 #マッピングに用いたオプション情報を表示
cat("\n\n3. Alignment statistics.\n")  #マッピング結果(alignment statistics)の表示。
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数
cat("\n\n4. Gene annotation info.\n")  #UCSCからの遺伝子アノテーション情報取得時のバージョン情報などを表示
txdb                                   #UCSCからの遺伝子アノテーション情報取得時のバージョン情報などを表示
cat("\n\n5. Session info.\n")          #解析に用いたRや各種パッケージのバージョン情報を表示
sessionInfo()                          #解析に用いたRや各種パッケージのバージョン情報を表示
sink()                                 #書き込み終了の指令
	

無事マッピングが終了すると、指定した6つのファイルが生成されているはずです。

  1. QCレポートファイル(srp011435_QC_bowtie_2.pdf):Quality Controlレポートです。よく利用されるFastQCのようなものです。
  2. カウントデータファイル(srp011435_count_bowtie_2.txt):グループ(サンプル)間での発現変動遺伝子同定に用います。
  3. 遺伝子配列長情報ファイル(srp011435_genelength_2.txt):配列長とカウント数の関係を調べたいときなどに用います。これはおまけです。
  4. RPKM補正後のファイル(srp011435_RPKM_bowtie_2.txt):同一サンプル内での発現レベルの大小関係を知りたいときなどに用います。
  5. その他の各種情報ファイル(srp011435_other_info1_2.txt):論文作成時に必要な、マッピング時に用いたオプション情報、マップされたリード数、Rおよび用いたパッケージのバージョン情報などを含みます。

Step3. サンプル間クラスタリング:

カウントデータ(srp011435_count_bowtie_2.txt)を用いてサンプル間の全体的な類似度を眺めることを目的として、サンプル間クラスタリングを行います。

類似度は「1-Spearman相関係数」、方法は平均連結法で行っています。 TCC論文(Sun et al., 2013)のFig.3でも同じ枠組みでクラスタリングを行った結果を示していますので、英語論文執筆時の参考にどうぞ。 PearsonではなくSpearmanで行っているのは、ダイナミックレンジが広いので、順序尺度程度にしておいたほうがいいだろうという思想が一番大きいです。 log2変換してダイナミックレンジを圧縮してPearsonにするのも一般的には「アリ」だとは思いますが、マップされたリード数が100万以上あるにも関わらずRPKMデータを用いると、RPKM補正後の値が1未満のものがかなり存在すること、 そしてlogをとれるようにゼロカウントデータの処理が必要ですがやりかた次第で結果がころころかわりうるという状況が嫌なので、RNA-seqデータの場合には私はSpearman相関係数にしています。 また、ベクトルの要素間の差を基本とするdistance metrics (例:ユークリッド距離やマンハッタン距離など)は、比較的最近のRNA-seqデータ正規化法 (TMM: Robinson and Oshlack, 2010, TbT: Kadota et al., 2012, TCC; Sun et al., 2013)論文の重要性が理解できれば、その類似度は少なくともfirst choiceにならないと思われます。 つまり、サンプルごとに転写物の組成比が異なるため、RPMやCPMのような総リード数を補正しただけのデータを用いて「サンプル間の数値の差」に基づいて距離を定めるのはいかがなものか?という思想です。 逆に、ユークリッド距離などを用いてクラスタリングを行った結果と比較することで、転写物の組成比に関する知見が得られるのかもしれません。 さらに、全体的な発現レベルが低いものを予めフィルタリングしておく必要もあるのだろうとは思います。このあたりは、真の回答はありませんので、 (手持ちのデータにこの類似度を適用したときの理論上の短所をきちんと理解したうえで)いろいろ試すというのは重要だとは思います。

ここではカウントデータでクラスタリングをしていますが、おそらく配列長補正後のRPKMデータ(srp011435_RPKM_bowtie_2.txt) でも得られる樹形図のトポロジー(相対的な位置関係)はほぼ同じになるのではないかと思っています。配列長補正の有無で、サンプル間の相関係数の値自体は変わりますが、 同じグループに属するサンプルであれば反復実験間でそれほど違わないので、多少順位に変動があっても全体としては相殺されるはずです...が確証はありません。

in_f3 <- "srp011435_count_bowtie_2.txt"#入力ファイル名を指定してin_f3に格納
out_f6 <- "srp011435_count_cluster.png"#出力ファイル名を指定してout_f6に格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f3, header=TRUE, row.names=1, sep="\t", quote="")#指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#クラスタリングおよび結果の保存
data.dist <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdata.distに格納
out <- hclust(data.dist, method="average")#階層的クラスタリングを実行し、結果をoutに格納
png(out_f6, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

上と同じ結果は、TCC ver. 1.4.0以降で clusterSample関数を用いて得ることができます。

in_f3 <- "srp011435_count_bowtie_2.txt"#入力ファイル名を指定してin_f3に格納
out_f6 <- "hoge.png"                   #出力ファイル名を指定してout_f6に格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f3, header=TRUE, row.names=1, sep="\t", quote="")#指定したファイルの読み込み

#クラスタリングおよび結果の保存
out <- clusterSample(data, dist.method="spearman",
                        hclust.method="average", unique.pattern=TRUE)
png(out_f6, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

無事計算が終了すると、指定したファイル(srp011435_count_cluster.png)が生成されているはずです。

Step4. 発現変動遺伝子(DEG)同定:

カウントデータファイル(srp011435_count_bowtie_2.txt)を入力として2群間で発現の異なる遺伝子の検出を行います。

このデータはtechnical replicatesを含むので、それをマージしたのちbiological replicatesのデータにしてからTCCパッケージ(Sun et al., 2013)の推奨ガイドラインに従って、 iDEGES/edgeR正規化(Sun et al., 2013; Robinson et al., 2010; Robinson and Oshlack, 2010; Robinson and Smyth, 2008)を行ったのち、 edgeRパッケージ中のan exact test (Robinson and Smyth, 2008)を行って、DEG検出を行っています。

解析 | 発現変動 | 2群間 | 対応なし | 複製あり | iDEGES/edgeR-edgeR(Sun_2013)の記述内容と基本的に同じです。

technical replicatesデータのマージ。ここでは、アドホックに2列分ごとのサブセットを抽出し、行の総和を計算したのち、結合しています。

in_f <- "srp011435_count_bowtie_2.txt" #入力ファイル名を指定してin_fに格納
out_f <- "srp011435_count_bowtie_3.txt"#出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです

#本番(technical replicatesをマージ)
DEX_bio1 <- rowSums(data[,1:2])        #サブセットを抽出し、行の総和を計算
DEX_bio2 <- rowSums(data[,3:4])        #サブセットを抽出し、行の総和を計算
mock_bio1 <- rowSums(data[,5:6])       #サブセットを抽出し、行の総和を計算
mock_bio2 <- rowSums(data[,7:8])       #サブセットを抽出し、行の総和を計算
out <- cbind(DEX_bio1, DEX_bio2, mock_bio1, mock_bio2)#列方向で結合した結果をoutに格納
head(out)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(out), out)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
	
in_f4 <- "srp011435_count_bowtie_3.txt"#入力ファイル名を指定してin_f4に格納
out_f7 <- "srp011435_DEG_bowtie.txt"   #出力ファイル名を指定してout_f7に格納
out_f8 <- "srp011435_MAplot_bowtie.png"#出力ファイル名を指定してout_f8に格納
out_f9 <- "srp011435_other_info2.txt"  #出力ファイル名を指定してout_f9に格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #DEG検出時のfalse discovery rate (FDR)閾値を指定
param_fig <- c(430, 390)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f4, header=TRUE, row.names=1, sep="\t", quote="")#in_f4で指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの結果を抽出してをresultに格納
sum(tcc$stat$q.value < param_FDR)      #FDR < param_FDRを満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f7, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f7で指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f8, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR)               #param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成している
       col=c("magenta", "black"), pch=20)#凡例を作成している
dev.off()                              #おまじない

#ファイルに保存(各種情報)
sink(out_f9)                           #指定したファイルへの書き込み指令(表示結果がファイルに保存される)
cat("1. Numbers of DEGs satisfying several FDR thresholds.\n")#任意のFDR閾値を満たす遺伝子数を表示
cat("FDR < 0.05:");print(sum(tcc$stat$q.value < 0.05))#任意のFDR閾値を満たす遺伝子数を表示
cat("FDR < 0.10:");print(sum(tcc$stat$q.value < 0.10))#任意のFDR閾値を満たす遺伝子数を表示
cat("FDR < 0.20:");print(sum(tcc$stat$q.value < 0.20))#任意のFDR閾値を満たす遺伝子数を表示
cat("FDR < 0.30:");print(sum(tcc$stat$q.value < 0.30))#任意のFDR閾値を満たす遺伝子数を表示
cat("\n\n2. Session info.\n")          #解析に用いたRや各種パッケージのバージョン情報を表示
sessionInfo()                          #解析に用いたRや各種パッケージのバージョン情報を表示
sink()                                 #書き込み終了の指令
	

無事計算が終了すると、指定した3つのファイルが生成されているはずです。

  1. 発現変動解析結果ファイル(srp011435_DEG_bowtie.txt):iDEGES/edgeR-edgeRパイプラインによるDEG同定結果です。 "rank"列でソートすると発現変動の度合い順になります。"q.value"列の情報は任意のFDR閾値を満たす遺伝子数を調べるときに用います。 尚、左側の実数の数値データはiDEGES/edgeR正規化後のデータです。M-A plotはこの数値データに基づいて作成されています。尚、配列長補正は掛かっておりませんのでご注意ください。
  2. M-A plotファイル(srp011435_MAplot_bowtie.png):M versus A plotです。横軸が平均発現レベル(右側が高発現、左側が低発現)。縦軸がlog(G2/G1)で、0より下がG1群で高発現、0より上がG2群で高発現です。
  3. その他の各種情報ファイル(srp011435_other_info2.txt):FDR < 0.05, 0.1, 0.2, 0.3を満たす遺伝子数、論文作成時に必要な、Rおよび用いたパッケージのバージョン情報(特にTCC)などを含みます。

パイプライン | ゲノム | small RNA | SRP016842(Nie_2013)

Nie et al., BMC Genomics, 2013のカイコ (Bombyx mori) small RNA-seqデータが GSE41841に登録されています。 (そしてリンク先のGSM1025527からも様々な情報を得ることができます。) ここでは、SRAdbパッケージを用いたそのFASTQ形式ファイルのダウンロードから、 QuasRパッケージを用いたマッピングまでを行う一連の手順を示します。

basic alignerの一つであるBowtieをQuasRの内部で用いています。

ここでは「デスクトップ」上に「SRP016842」というフォルダを作成しておき、そこで作業を行うことにします。

Step1. RNA-seqデータのgzip圧縮済みのFASTQファイルをダウンロード:

論文中の記述からGSE41841を頼りに、 SRP016842にたどり着いています。 したがって、ここで指定するのは"SRP016842"となります。

以下を実行して得られるsmall RNA-seqファイルは一つ(SRR609266.fastq.gz)で、ファイルサイズは400Mb弱、11928428リードであることがわかります。

イントロ | NGS | 配列取得 | FASTQ or SRALite | SRAdb(Zhu_2013)の記述内容と基本的に同じです。

param <- "SRP016842"                   #取得したいSRA IDを指定

#必要なパッケージをロード
library(SRAdb)                         #パッケージの読み込み

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(圧縮状態で300Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#前処理(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示

#前処理(FASTQファイルサイズを表示)
k <- getFASTQinfo(hoge$run)            #「hoge$run」で指定したSRRから始まるIDのFASTQファイルサイズ情報などを取得してkに格納
k                                      #kの中身を表示
hoge2 <- cbind(k$library.name,         #ライブラリ名と、
                  k$run.read.count,    #総リード数と、
                  k$file.name,         #ファイル名と、
                  k$file.size)         #ファイルサイズ、の順番で列方向で結合した結果をhoge2に格納
hoge2                                  #hoge2の中身を表示(表示される情報を限定しているだけです)

#本番(FASTQファイルのダウンロード)
getFASTQfile(hoge$run, srcType='ftp')  #「hoge$run」で指定したSRRから始まるIDのFASTQファイルのダウンロード
	

無事ダウンロードが終了すると、作業ディレクトリ(「デスクトップ」上の「SRP016842」フォルダ)中に2つのファイルが存在するはずです。 4Gb程度ある"SRAmetadb.sqlite"ファイルは無視して構いません。残りの"SRR"からはじまるファイル(SRR609266.fastq.gz)がダウンロードしたsRNA-seqデータです。 オリジナルのサンプル名(の略称)で対応関係を表すとsrp016842_samplename.txtのようになっていることがわかります。 尚このファイルはマッピング時の入力ファイルとしても用います。

Step2. カイコゲノム配列をダウンロード:

カイコゲノム配列はBSgenomeパッケージとして提供されていないため、自力で入手する必要があります。 手順としては、農業生物資源研究所(NIAS)が提供しているカイコゲノム配列のウェブページからIntegrated sequences (integretedseq.txt.gz) をダウンロードし、解凍します。解凍後のファイル名は"integretedseq.txt"となりますが、拡張子を".txt"から".fa"に変更して、"integretedseq.fa"としたものを作業ディレクトリ(「デスクトップ」上の「SRP016842」フォルダ)上にコピーしておきます。

Step3. small RNA-seqデータの前処理:

原著論文(Nie et al., 2013)中では、アダプター配列やクオリティの低いリードを除去したのち、ゲノムにマッピングしたと書いてあります。 アダプター配列情報はどこにも書かれていませんでしたが、Table S2中のアダプター配列除去後の最も短いリードが18 nt (例:"GCAGTCGTGGCCGAGCGG")であり、 「この18 nt」と「この配列を含む生リード配列の差分」がアダプター配列ということになります。 詳細な情報は書かれていませんでしたが、おそらくアダプター配列は"TGGAATTCTCGGGTGCCAAGGAACTCCAGTC..."という感じだろうと推測できます。

ここでは、ダウンロードした"SRR609266.fastq.gz"ファイルを入力として、 1塩基ミスマッチまで許容して(推定)アダプター配列除去を行ったのち、"ACGT"のみからなる配列(許容するN数が0)で、 配列長が18nt以上のものをフィルタリングして出力しています。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納(RNA-seqファイル)
out_f <- "SRR609266_p.fastq.gz"        #出力ファイル名を指定してout_fに格納
param_adapter <- "TGGAATTCTCGGGTGCCAAGGAACTCCAGTC"#アダプター配列を指定
param_mismatch <- 1                    #許容するミスマッチ数を指定
param_nBases <- 0                      #許容するNの数を指定
param_minLength <- 18                  #アダプター配列除去後の許容する最低配列長を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(前処理)
res <- preprocessReads(filename=in_f,  #前処理を実行
             outputFilename=out_f,     #前処理を実行
             Rpattern=param_adapter,   #前処理を実行
             max.Rmismatch=rep(param_mismatch, nchar(param_adapter)),#前処理を実行
             nBases=param_nBases,      #前処理を実行
             minLength=param_minLength)#前処理を実行
res                                    #確認してるだけです
	

前処理実行後のresオブジェクトを眺めると、入力ファイルのリード数が11928428であり、 アダプター配列除去後に18nt未満の長さになってしまったためにフィルタリングされたリード数が157229、 "N"を1つ以上含むためにフィルタリングされたリード数が21422あったことがわかります。ここでは配列長分布は得ておりませんが、 出力ファイルを解凍して配列長分布を調べると原著論文中のTable S1と似た結果になっていることから、ここでの処理が妥当であることがわかります。

Step4. カイコゲノムへのマッピングおよびカウントデータ取得:

マップしたい前処理後のFASTQファイル名("SRR609266_p.fastq.gz")およびその任意のサンプル名を記述したsrp016842_samplename.txtを作業ディレクトリに保存したうえで、下記を実行します。

Step2でダウンロードしたintegretedseq.faへマッピングしています。

basic alignerの一つであるBowtieを内部的に用いており、 ここではマッピング時のオプションを"-m 1 -v 0"とし、「ミスマッチを許容せず1ヶ所にのみマップされるもの」をレポートしています。 ミスマッチを許容していないため、--best --strataというオプションは事実上意味をなさないためにつけていません。 QuasRのマニュアル中のようにalignmentParameterオプションは特に指定せず(デフォルト)、50ヶ所にマップされるリードまでをレポートする "maxHits=50"オプションをつけるという思想もあります。

マシンパワーにもよりますが、20分程度で終わると思います。

マップ後 | カウント情報取得 | ゲノム | アノテーション有 | QuasR(Lerch_XXX)の記述内容と基本的に同じです。

in_f1 <- "srp016842_samplename.txt"    #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "integretedseq.fa"            #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f1 <- "srp016842_QC.pdf"           #出力ファイル名を指定してout_f1に格納
out_f2 <- "srp016842_other_info1.txt"  #出力ファイル名を指定してout_f2に格納
param_mapping <- "-m 1 -v 0"           #マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicRanges)                 #パッケージの読み込み
library(Rsamtools)                     #パッケージの読み込み

#マッピングおよびQCレポート用ファイル作成
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2,            #マッピングを行うqAlign関数を実行した結果をoutに格納
      alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
qQCReport(out, pdfFilename=out_f1)     #QCレポート結果をファイルに保存

#本番(マップされたリードの和集合領域およびその領域に対するカウント情報取得)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
tmpsname <- out@alignments[,2]         #サンプル名(in_f1の2列目に相当)をtmpsnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  k <- readGAlignments(tmpfname[i])    #BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  m <- reduce(granges(k))              #GRangesオブジェクトへの変換および和集合領域情報を得た結果のGRangesオブジェクトをmに格納
  tmpcount <- summarizeOverlaps(m, tmpfname[i])#GRangesオブジェクトmに対するBAMファイルのマップ結果のカウント情報取得結果をtmpcountに格納
  count <- assays(tmpcount)$counts     #SummarizedExperimentクラスオブジェクトのtmpcountからカウントデータ行列部分を抽出した結果をcountに格納
  colnames(count) <- tmpsname[i]       #列名を付与
  tmp <- cbind(as.data.frame(m), count)#和集合領域情報とカウント情報を結合した結果をtmpに格納
  out_f <- sub(".bam", "_range.txt", tmpfname[i])#変更したファイル名を作成した結果をout_fに格納
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
  #和集合領域の塩基配列情報取得
  out_f <- sub(".bam", "_range.fa", tmpfname[i])#変更したファイル名を作成した結果をout_fに格納
  fasta <- getSeq(FaFile(in_f2), m)    #塩基配列情報取得結果をfastaに格納
  h <- as.data.frame(m)                #description行情報の作成
  names(fasta) <- paste(h[,1],h[,2],h[,3],h[,4],h[,5], sep="_")#description行情報の作成
  writeXStringSet(fasta, file=out_f, format="fasta", width=50)#description行情報の作成
}

#ファイルに保存(各種情報)
sink(out_f2)                           #指定したファイルへの書き込み指令(表示結果がファイルに保存される)
cat("1. Computation time for mapping (in second).\n")#計算時間を表示(一番右側の数字。単位はsecond)
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
cat("\n\n2. Options used for mapping.\n")#マッピングに用いたオプション情報を表示
out@alignmentParameter                 #マッピングに用いたオプション情報を表示
cat("\n\n3. Alignment statistics.\n")  #マッピング結果(alignment statistics)の表示。
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数
cat("\n\n4. Session info.\n")          #解析に用いたRや各種パッケージのバージョン情報を表示
sessionInfo()                          #解析に用いたRや各種パッケージのバージョン情報を表示
sink()                                 #書き込み終了の指令
	

無事マッピングが終了すると、指定した2つのファイルが生成されているはずです。

  1. QCレポートファイル(srp016842_QC.pdf):Quality Controlレポートです。よく利用されるFastQCのようなものです。
  2. その他の各種情報ファイル(srp016842_other_info1.txt):論文作成時に必要な、マッピング時に用いたオプション情報、マップされたリード数、Rおよび用いたパッケージのバージョン情報などを含みます。

この他にも以下に示すような形式のファイルがサンプルごとに自動生成されます。以下に示すファイル名中の"fa03ced5b37"に相当する部分はランダムな文字列からなり、サンプルごと、そして実行するたびに異なります。 理由は、同じ入力ファイルを異なるパラメータやリファレンス配列にマッピングしたときに、間違って上書きしてしまうのを防ぐためです。

  • "*.bam"ファイル(例:SRR609266_p_fa03ced5b37.bam; 約200Mb):BAM形式のサンプルごとのマッピング結果ファイルです。
  • "*_range.txt"ファイル(例:SRR609266_p_fa03ced5b37_range.txt):マップされたリードの和集合領域(オーバーラップ領域をまとめたもの)をリストアップし、その領域に基づいてカウント情報を取得したものです。BEDTools(Quinlan and Hall, Bioinformatics, 2010) のmergeBEDというプログラムと同じような結果を得ているという理解でかまいません。
  • "*_range.fa"ファイル(例:SRR609266_p_fa03ced5b37_range.fa):マップされたリードの和集合領域(オーバーラップ領域をまとめたもの)の塩基配列を格納したファイルです。