(Rで)塩基配列解析(主に次世代シーケンサーのデータ) (last modified 2013/05/24, since 2010)
What's new?
RパッケージTCCの最新版は1.1.99です。
6月6日に開催されるNAIST植物グローバル教育プロジェクト・平成25年度ワークショップでは、R(ver. 3.0.1)とTCC(ver. 1.1.99)をベースに話をする予定です。
Rのインストールと起動を実行したあとにTCC(ver. 1.1.99)のインストールも忘れずに行っておいてください。詳細なインストール方法はこちら。(2013/05/24)NEW
・平成25年6月27日、7月3, 4日にこのウェブページ関連の実習を含む講義(農学生命情報科学特論I)を行います。
東大生以外の外部の方も受講可能です。詳しくは事務局までお問い合わせください。(2013/05/23)NEW
・R3.0.1がリリースされていたのでこれに変更しました。(2013/05/17)NEW
- はじめに (last modified 2012/03/29)
- Rのインストールと起動(last modified 2013/05/17) NEW
- サンプルデータ(last modified 2013/01/23)
- イントロダクション | NGS | 各種覚書(last modified 2010/12/10)
- イントロダクション | NGS | 様々なプラットフォーム(last modified 2011/07/15)
- イントロダクション | NGS | リファレンス配列取得(マップされる側)(last modified 2011/02/03)
- イントロダクション | NGS | リファレンス配列取得後の各種情報抽出(特にRefSeq)(last modified 2011/03/20)
- イントロダクション | NGS | リファレンス配列取得後の各種情報抽出2(readFASTA関数の利用)(last modified 2011/04/07)
- イントロダクション | NGS | アノテーション情報取得(refFlatファイル)(last modified 2010/12/07)
- イントロダクション | NGS | アノテーション情報取得(BioMart and biomaRt)(last modified 2011/08/26)
- イントロダクション | 一般 | 遺伝子の転写開始点近傍配列(上流配列など)を取得(last modified 2012/07/09)
- イントロダクション | 一般 | 任意のキーワードを含む行を抽出(last modified 2012/07/13)
- イントロダクション | 一般 | ランダムな塩基配列を作成(last modified 2012/04/02)
- イントロダクション | 一般 | 任意の長さの可能な全ての塩基配列を作成(last modified 2012/05/28)
- イントロダクション | 一般 | 配列取得(last modified 2010/7/7)
- イントロダクション | 一般 | 指定した範囲の配列を取得(last modified 2012/04/04)
- イントロダクション | 一般 | 翻訳配列(translate)を取得(last modified 2011/07/27)
- イントロダクション | 一般 | 相補鎖(complement)を取得(last modified 2011/07/27)
- イントロダクション | 一般 | 逆相補鎖(reverse complement)を取得(last modified 2011/07/27)
- イントロダクション | 一般 | 逆鎖(reverse)を取得(last modified 2011/07/27)
- イントロダクション | 一般 | 二連続塩基の出現頻度情報を取得(last modified 2012/05/28)
- イントロダクション | 一般 | 三連続塩基の出現頻度情報を取得(last modified 2012/05/28)
- イントロダクション | 一般 | 任意の長さの連続塩基の出現頻度情報を取得(last modified 2012/05/28)
- イントロダクション | NGS | NGSデータ取得(last modified 2011/07/19)
- イントロダクション | NGS | NGSデータ取得(SRAdb)(last modified 2011/01/14)
- イントロダクション | NGS | マッピング | basic aligner (基本的なマッピングプログラム)(last modified 2012/09/11)
- イントロダクション | NGS | マッピング | splice-aware aligner (spliced readもマッピング可能なもの)(last modified 2012/08/08)
- イントロダクション | NGS | マッピング | (short) readの入力形式について(last modified 2011/08/03)
- イントロダクション | NGS | マッピング | (short) readの出力形式について(last modified 2010/12/06)
- イントロダクション | NGS | マッピング | (ESTレベルの長さの)contig(last modified 2010/12/06)
- イントロダクション | NGS | ファイル形式の変換(last modified 2011/10/31)
- イントロダクション | NGS | アセンブルプログラムについて(last modified 2011/07/26)
- イントロダクション | NGS | アセンブルプログラム(ゲノム)(last modified 2012/08/01)
- イントロダクション | NGS | アセンブルプログラム(転写物)(last modified 2012/08/30)
- イントロダクション | NGS | アセンブル後のmulti-fastaファイルからN50などの基本情報を取得(last modified 2012/04/03)
- イントロダクション | NGS | 可視化ツール(R用)(last modified 2010/7/8)
- イントロダクション | NGS | 可視化ツール(R以外)(last modified 2010/7/8)
- イントロダクション | NGSとqPCRやmicroarrayなどとの比較(last modified 2010/12/16)
- ファイルの読み込み | マップ前 | FASTQ形式(last modified 2013/01/16)
- ファイルの読み込み | マップ前 | FASTA形式(last modified 2010/6/18)
- ファイルの読み込み | マップ前 | Illuminaの*_seq.txt(last modified 2010/6/3)
- ファイルの読み込み | マップ前 | Illuminaの*_qseq.txt(last modified 2012/08/06)
- ファイルの読み込み | マップ後 | Bowtie形式(last modified 2013/01/16)
- ファイルの読み込み | マップ後 | BAM形式(last modified 2010/7/13)
- ファイルの読み込み | マップ後 | GFF3形式(last modified 2010/6/9)
- ファイルの読み込み | マップ後 | SOAP形式(last modified 2011/07/20)
- クオリティチェック | NGS(一般)について (last modified 2012/08/02)
- クオリティチェック | NGS(一般) |qrqc (Quick Read Quality Control) (last modified 2012/02/20)
- フィルタリング | 一般 | fastqファイルからACGTのみからなる配列(重複あり)の抽出(last modified 2012/07/13)
- フィルタリング | 一般 | fastqファイルからACGTのみからなる配列(重複なし)の抽出(last modified 2012/07/13)
- フィルタリング | 一般 | multi-fastaファイルのdescription行の記述を整形(last modified 2012/07/13)
- フィルタリング | 一般 | multi-fastaファイルからACGT以外の文字の出現数でフィルタリング(last modified 2012/07/13)
- フィルタリング | 一般 | multi-fastaファイルから指定した配列長のもののみ抽出(last modified 2012/04/03)
- フィルタリング | 一般 | multi-fastaファイルから任意のサブセットを抽出(last modified 2012/07/17)
- フィルタリング | NGS(miRNA) | アダプター配列除去0(基本的なところ)(last modified 2010/5/27)
- フィルタリング | NGS(miRNA) | アダプター配列除去1(Illumina *_seq.txt; ミスマッチ数指定)(last modified 2010/5/25)
- フィルタリング | NGS(miRNA) | アダプター配列除去2(Illumina *_seq.txt; ミスマッチ数指定,除去後の配列長条件を追加)(last modified 2010/5/26)
- フィルタリング | NGS(miRNA) | アダプター配列除去3(Illumina *_seq.txt; ミスマッチ数指定,除去後の配列長条件,ACGTのみからなる配列を追加,重複あり)(last modified 2010/6/2)
- フィルタリング | NGS(miRNA) | アダプター配列除去4(Illumina *_seq.txt; ミスマッチ数指定,除去後の配列長条件,ACGTのみからなる配列を追加,重複なし)(last modified 2010/6/8)
- フィルタリング | NGS(miRNA) | アダプター配列除去(Illumina *_qseq.txt; ミスマッチ数指定,除去後の配列長条件,ACGTのみからなる配列を追加,重複あり)(last modified 2012/08/06)
- フィルタリング | NGS(miRNA) | アダプター配列除去(FASTQファイル; girafe; Toedling_2010)(last modified 2012/08/06)
- フィルタリング | NGS(miRNA) | アダプター配列除去(FASTQファイル; ShortRead; Morgan_2009)(last modified 2012/08/06)
- フィルタリング | NGS(一般) | ゲノム配列へのマップ後のファイルから必要な情報のみ抽出(SOAP形式ファイル)(last modified 2011/07/21)
- フィルタリング | NGS | quality scoreの評価1 (FASTQファイルを読み込んでPHREDスコア化した結果を眺める)(last modified 2011/08/16)
- フィルタリング | NGS | quality scoreの評価2 (FASTQファイルを読み込んでPHREDスコアが低いリードを除去する)(last modified 2011/08/03)
- フィルタリング | NGS | quality scoreの評価3 (FASTQファイルを読み込んでPHREDスコアが低い塩基をNに置換する)(last modified 2011/08/04)
- フィルタリング | NGS | paired-endの二つのFASTQファイルを読み込んで両方でpass_filteringフラグが1のもののみ抽出する(last modified 2011/11/09)
- フィルタリング | NGS | artifact(adapter sequences, low-complexity reads, and PCR duplicates)やsequencing errorの除去(last modified 2012/08/07)
- フィルタリング | NGS | htSeqTools (Planet_2012) (last modified 2012/08/01)
- フィルタリング | NGS | 末端部分のトリミング (last modified 2012/09/12)
- 前処理 | について(last modified 2010/12/16)
- 前処理 | Trinity出力ファイルからFPKM値を取得(last modified 2011/10/20)
- 前処理 | トランスクリプトーム配列へのマップ後のファイルからマップされたリード数をカウント(BED形式ファイル)(last modified 2013/01/30)
- 前処理 | Ensembl Geneの長さを計算する(last modified 2011/08/15)
- 前処理 | 転写物の配列長が長いほどマップされたリード数が多くなることを確認(last modified 2012/09/11)
- 前処理 | 転写物の配列長が長いほど発現変動遺伝子とされる確率が上昇することを確認(last modified 2011/09/09)
- 前処理 | 発現レベルの定量化について(last modified 2013/01/22)
- 前処理 | 正規化について(last modified 2013/03/14)
- 前処理 | 正規化(サンプル内) | GC bias補正 | full quantile (FQ)正規化(Risso_2011)(last modified 2013/01/22)
- 前処理 | 正規化(サンプル内) | 全般 | GAM正規化(Zheng_2011)(last modified 2013/01/18)
- 前処理 | 正規化(サンプル間) | 二群間用 | 複製なし | DEGES/TbT正規化(TbT; Sun_submitted)(last modified 2013/03/15)
- 前処理 | 正規化(サンプル間) | 二群間用 | 複製なし | iDEGES/DESeq正規化(Sun_submitted)(last modified 2013/01/28)
- 前処理 | 正規化(サンプル間) | 二群間用 | 複製なし | TMM正規化(Robinson_2010)(last modified 2013/03/14)
- 前処理 | 正規化(サンプル間) | 二群間用 | 複製あり | iDEGES/edgeR正規化(Sun_submitted)(last modified 2013/01/24)
- 前処理 | 正規化(サンプル間) | 二群間用 | 複製あり | DEGES/TbT正規化(TbT; Kadota_2012)(last modified 2013/01/23)
- 前処理 | 正規化(サンプル間) | 二群間用 | 複製あり | TMM正規化(Robinson_2010)(last modified 2013/03/14)
- 前処理 | 正規化(サンプル間) | 全般 | Anders and Huberの(AH)正規化(Anders_2010)(last modified 2013/01/23)
- 前処理 | 正規化(サンプル間) | 全般 | Upper-quartile (UQ)正規化(Bullard_2010)(last modified 2013/01/24)
- 前処理 | 正規化(サンプル間) | 全般 | Quantile正規化(Bullard_2010)(last modified 2013/01/24)
- 前処理 | 正規化(サンプル間) | 全般 | RPM正規化 (Mortazavi_2008)(last modified 2012/09/27)
- 前処理 | 正規化(混合) | RPKM正規化(Mortazavi_2008) | raw count matrixから(last modified 2012/02/29)
- 前処理 | 正規化(混合) | RPKM正規化(Mortazavi_2008) | ゲノムマップ後のBED形式ファイルから(last modified 2011/01/06)
- 解析 | 一般 | アラインメント(ペアワイズ;基本編1)(last modified 2010/6/8)
- 解析 | 一般 | アラインメント(ペアワイズ;基本編2)(last modified 2010/6/8)
- 解析 | 一般 | アラインメント(ペアワイズ;応用編)(last modified 2010/6/8)
- 解析 | 一般 | パターンマッチング(last modified 2013/04/10)
- 解析 | 一般 | GC含量 (GC contents)(last modified 2013/04/08)
- 解析 | 一般 | Sequence logos (Schneider_1990)(last modified 2012/06/27)
- 解析 | 一般 | 上流配列解析 | Local Distribution of Short Sequences (LDSS)解析 (Yamamoto_2007)(last modified 2012/07/17)
- 解析 | 一般 | 上流配列解析 | Relative Appearance Ratio (RAR)解析 (Yamamoto_2011)(last modified 2012/07/17)
- 解析 | NGS(RNA-seq) | その他 | Technical replicatesのデータがポアソン分布に従うことを確認(last modified 2011/11/14)
- 解析 | NGS(RNA-seq) | その他 | ポアソン分布に従うシミュレーションデータを作成する(last modified 2011/09/16)
- 解析 | NGS(RNA-seq) | その他 | Biological replicatesのデータが負の二項分布に従うことを確認(last modified 2012/08/24)
- 解析 | NGS(RNA-seq) | その他 | 負の二項分布に従うシミュレーションデータを作成する(fixed dispersion)(last modified 2011/10/31)
- 解析 | NGS(RNA-seq) | その他 | 負の二項分布に従うシミュレーションデータを作成する(random dispersion)(last modified 2011/10/31)
- 解析 | NGS(RNA-seq) | その他 | 負の二項分布に従うシミュレーションデータを作成する(tagwise dispersion)(last modified 2012/10/18)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | について(last modified 2013/05/21) NEW
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | 複製なし | DESeq with iDEGES/DESeq (Sun_submitted) (last modified 2013/05/23)recommendedNEW
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | 複製なし | DESeq (Anders_2010) (last modified 2013/01/28)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | 複製あり | edgeR with iDEGES/edgeR (Sun_submitted) (last modified 2013/05/22)recommendedNEW
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | 複製あり | edgeR with DEGES/TbT (Kadota_2012) (last modified 2013/01/28)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | 複製あり | edgeR coupled with TbT normalization (上と同じで昔の記述) (last modified 2012/09/11)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | 複製あり | NBPSeq coupled with TbT normalization (Kadota_2012) (last modified 2012/08/24)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | 複製あり | DESeq coupled with TbT normalization (Kadota_2012) (last modified 2012/06/27)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | 複製あり | baySeq (Hardcastle_2010) (last modified 2011/12/20)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | BitSeq (Glaus_2012) (last modified 2013/01/08)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | DSS (Wu_2012) (last modified 2013/01/18)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | NOISeq (Tarazona_2011) (last modified 2013/01/08)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | GPseq (Srivastava_2010) (last modified 2012/06/21)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | NBPSeq (Di_2011) (last modified 2012/03/15)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | DESeq (Anders_2010) (last modified 2012/10/01)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | Fisher's exact test (FET) by DEGseq(last modified 2011/06/09)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | Likelihood ratio test (LRT) by DEGseq(last modified 2011/06/09)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | Fold change (FC) by DEGseq(last modified 2011/06/09)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | MARS (Wang_2010) by DEGseq(last modified 2011/06/09)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | edgeR (Robinson_2010) (last modified 2012/10/24)
- 解析 | NGS(RNA-seq) | 発現変動エクソン | 二群間 | DEXSeq (Anders_2012)(last modified 2013/03/12)
- 解析 | NGS(RNA-seq) | 発現変動遺伝子 | 時系列データ| Bayesian model-based clustering (Nascimento_2012) (last modified 2012/09/10)
- 解析 | NGS(RNA-seq) | 選択的スプライシング | Solas (Richard_2010) (last modified 2010/11/29)
- 解析 | NGS(RNA-seq) | Gene Ontology解析 | Gao's method (Gao_2011) (last modified 2011/12/14)
- 解析 | NGS(RNA-seq) | Gene Ontology解析 | GOseq (Young_2010) (last modified 2010/11/26)
- 解析 | NGS(ChIP-seq) | について(last modified 2010/11/25)
- 解析 | NGS(ChIP-seq) | DiffBind (last modified 2011/12/14)
- 解析 | NGS(ChIP-seq) | ChIPseqR (last modified 2011/12/14)
- 解析 | NGS(ChIP-seq) | chipseq (last modified 2011/12/14)
- 解析 | NGS(ChIP-seq) | PICS (Zhang_2011)(last modified 2011/12/14)
- 解析 | NGS(ChIP-seq) | ChIPpeakAnno (Zhu_2010)(last modified 2011/01/18)
- 解析 | NGS(ChIP-seq) | rMAT (Droit_2010)(last modified 2011/12/07)
- 解析 | NGS(ChIP-seq) | CSAR (Kaufmann_2009)(last modified 2011/01/18)
- 解析 | NGS(ChIP-seq) | ChIPsim (Zhang_2008)(last modified 2011/12/14)
- 解析 | NGS(ChIP-seq) | 新規モチーフ | rGADEM (Li_2009)(last modified 2011/12/14)
- 解析 | NGS | 長距離ゲノム間相互作用の検出 | r3Cseq (Thongjuea_201X)(last modified 2011/12/14)
- 解析 | NGS | 制限酵素切断部位(RECS)地図 | REDseq (Zhu_201X)(last modified 2011/12/14)
- 解析 | NGS(small RNA) | segmentSeq (Hardcastle_accepted)(last modified 2011/12/14)
- 作図 | について(last modified 2012/09/10)
- 作図 | M-A plot(last modified 2012/10/01)
- 作図 | ROC曲線(last modified 2012/10/01)
- 解析パイプラインゲノム配列用1(ゲノムマップから発現変動までの一連のコマンド群; 方向性無視)(last modified 2011/02/22)
- 解析パイプラインゲノム配列用2(ゲノムマップから発現変動までの一連のコマンド群; 方向性考慮)(last modified 2011/02/22)
- 解析パイプラインゲノム配列用3(ゲノムマップから発現変動までの一連のコマンド群; 方向性無視でpaired-endの場合)(last modified 2011/10/20)
- 解析パイプライントランスクリプトーム配列用1(トランスクリプトーム配列へのマップから発現変動までの一連のコマンド群; 方向性無視)(last modified 2011/04/11)
- 配列モチーフ(cosmo)(last modified 2010/06/14)
- リンク集(last modified 2012/03/29)
はじめに
このページは、次世代シーケンサー(Next-Generation Sequencer; NGS)などから得られた短い塩基配列(short read)データ解析をRで行うための一連の手続きをまとめているものであり、
特にアグリバイオインフォマティクス教育研究プログラムの被養成者がわかる程度のレベルで作成した(しつつある)ものです。
アグリバイオの分野は、ヒトやマウスといったゲノム配列既知のモデル生物ではなくアノテーション情報が乏しい非モデル生物を主に取り扱います。
例えば、主に次世代シーケンサーから得られる塩基配列データを用いて、「de novo (genome or transcriptome) assemblyを行い、発現変動領域を同定する」
といった解析が第一段階として行われますが、現状では解析の「最初のほうはLinuxベース、最後のほうはRベース」です。
いずれも実験系研究者にとってはハードルが高い上に、使いこなすのが容易ではありませんが、
後者のほうが比較的(マイクロアレイ解析用のツール群が多数提供され使い慣れた人が多いということもあり)敷居が低いことと思います。
ここでは、アグリバイオインフォマティクス教育研究プログラム
の教育研究用資料として、また、一部新学術領域研究「複合適応形質進化の遺伝子基盤解明」
の研究を遂行する上で私が用いたテクニックや知識を項目別にまとめてあります。
本当に正しいやり方かどうかなど一切の保証はできませんので予めご承知おきください。
このページの中身自体は、所属機関とは一切関係ない一個人の備忘録のようなものです。リンクは自由にしていただいて構いませんし、講義資料として使うのもご自由になさってください。
間違いや修正点、また「このような解析をやりたいがどうすればいいか?」などのリクエストがあればメール(
)
をいただければ...(実際問題として相当様々なことにトラップされてますので対応は難しいですが...)前向きに検討させていただきます。
もちろん、アグリバイオインフォマティクス教育研究プログラム被養成者からのリクエストは優先的に対応します。
なお、よく(例えばDドライブの)外付けHDに大きなサイズのファイル(4GB以上)を保存できない、ということがあったりしますが、その対処法はおまじない的にコマンドプロンプト上で「convert D: /fs:ntfs」とやっておくことです。
このページ内で用いる色についての説明:
コメント
特にやらなくてもいいコマンド
プログラム実行時に目的に応じて変更すべき箇所
...
rm(list = ls())
「"...\Rgui.exe" LANGUAGE=en」で英語環境にできる
Rのインストールと起動
基本的にはこちらまたはこちらをご覧ください。
よく分からない人でWindowsユーザーの方へ:
- R-3.0.1-win.exe(32/64 bitともにこれ)をクリックして「実行する」を選択
- 聞かれるがままに「次へ」などを押してとにかくインストールを完了させる
- Windows Vistaの人は(パッケージのインストール中に書き込み権限に関するエラーが出るのを避けるために)「コントロールパネル」−「ユーザーアカウント」−「ユーザーアカウント制御の有効化または無効化」で、
「ユーザーアカウント制御(UAC)を使ってコンピュータの保護に役立たせる」のチェックをあらかじめ外しておくことを強くお勧めします。
- インストールが無事完了したら、デスクトップに出現する「R3.0.1 (32 bitの場合)」または「R x64 3.0.1 (64 bitの場合)」アイコンをダブルクリックして起動
- 以下を、「R コンソール画面上」でコピー&ペーストする。10GB程度のディスク容量を要しますが一番お手軽です。(どこからダウンロードするか?と聞かれるので、その場合は自分のいる場所から近いサイトを指定)
------ ここから ------
install.packages(available.packages()[,1]) #CRAN中にある全てのパッケージをインストール
source("http://www.bioconductor.org/biocLite.R") #おまじない
biocLite(all_group()) #Bioconductor中にある全てのパッケージをインストール
------ ここまで ------
- 「コントロールパネル」−「フォルダオプション」−「表示(タブ)」−「詳細設定」のところで、「登録されている拡張子は表示しない」のチェックを外してください。
以下は(2011/12/26まで掲載していた)昔の5.のところの記述(基本的にやらなくてよい)
------ ここから ------
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")#門田が作成した関数群をロード
source("http://www.bioconductor.org/biocLite.R") #おまじない
install.packages("ascii",dep=T) #asciiパッケージのインストール
install.packages("Epi",dep=T) #Epiパッケージのインストール
install.packages("NBPSeq",dep=T) #NBPSeqパッケージのインストール
biocLite("ArrayExpressHTS", dependencies=TRUE) #ArrayExpressHTSパッケージのインストール
biocLite("baySeq", dependencies=TRUE) #baySeqパッケージのインストール
biocLite("biomaRt", dependencies=TRUE) #biomaRtパッケージのインストール
biocLite("Biostrings", dependencies=TRUE) #Biostringsパッケージのインストール
biocLite("ChIPpeakAnno", dependencies=TRUE) #ChIPpeakAnnoパッケージのインストール
biocLite("chipseq", dependencies=TRUE) #chipseqパッケージのインストール
biocLite("ChIPseqR", dependencies=TRUE) #ChIPseqRパッケージのインストール
biocLite("ChIPsim", dependencies=TRUE) #ChIPsimパッケージのインストール
biocLite("cosmo", dependencies=TRUE) #cosmoパッケージのインストール
biocLite("CSAR", dependencies=TRUE) #CSARパッケージのインストール
biocLite("DEGseq", dependencies=TRUE) #DEGseqパッケージのインストール
biocLite("DESeq", dependencies=TRUE) #DESeqパッケージのインストール
biocLite("DEXSeq", dependencies=TRUE) #DEXSeqパッケージのインストール
biocLite("DiffBind", dependencies=TRUE) #DiffBindパッケージのインストール
biocLite("edgeR", dependencies=TRUE) #edgeRパッケージのインストール
biocLite("GeneR", dependencies=TRUE) #GeneRパッケージのインストール
biocLite("GenomicRanges", dependencies=TRUE) #GenomicRangesパッケージのインストール
biocLite("girafe", dependencies=TRUE) #girafeパッケージのインストール
biocLite("goseq", dependencies=TRUE) #goseqパッケージのインストール
biocLite("pasilla", dependencies=TRUE) #pasillaパッケージのインストール
biocLite("PICS", dependencies=TRUE) #PICSパッケージのインストール
biocLite("qrqc", dependencies=TRUE) #qrqcパッケージのインストール
biocLite("r3Cseq", dependencies=TRUE) #r3Cseqパッケージのインストール
biocLite("RCurl", dependencies=TRUE) #RCurlパッケージのインストール
biocLite("REDseq", dependencies=TRUE) #REDseqパッケージのインストール
biocLite("rGADEM", dependencies=TRUE) #rGADEMパッケージのインストール
biocLite("rMAT", dependencies=TRUE) #rMATパッケージのインストール
biocLite("ROC", dependencies=TRUE) #ROCパッケージのインストール
biocLite("Rsubread", dependencies=TRUE) #Rsubreadパッケージのインストール
biocLite("Rsamtools", dependencies=TRUE) #Rsamtoolsパッケージのインストール
biocLite("segmentSeq", dependencies=TRUE) #segmentSeqパッケージのインストール
biocLite("seqLogo", dependencies=TRUE) #seqLogoパッケージのインストール
biocLite("ShortRead", dependencies=TRUE) #ShortReadパッケージのインストール
biocLite("SRAdb", dependencies=TRUE) #SRAdbパッケージのインストール
------ ここまで ------
サンプルデータ
- 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)
-------------------------
- 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)
-------------------------
- 上記SupplementaryTable2_changed.txtをさらに加工したデータ:
NGSデータは(マイクロアレイの黎明期と同じく)金がかかりますので(technical and/or biological) replicatesを簡単には増やせませんので、「1サンプル vs. 1サンプル」比較の局面がまだまだあろうかと思います。
そこで、上記ファイルの2-6列目と7-11列目をそれぞれまとめた(総和をとった)ものSupplementaryTable2_changed2.txtです:
- ABI_SOLiD/25-35bp/single-end/mouse (SRA000306; EB vs. ES) data (Cloonan et al., Nature Methods, 2008)
- Illumina/50bp/paired-end/mouse (SRA012213; liver) data (Robertson et al., Nature Methods, 2010)
- Illumina/35bp/single-end/human (SRA010153; MAQC) data (Bullard et al., BMC Bioinformatics, 2010)
- Illumina/32bp/single-end/human (SRA000299; Liver vs. Kidney) data (Marioni et al., Genome Res., 2008)
- NBPSeqパッケージ中のArabidopsisのBiological replicatesデータ(A群3サンプル vs. B群3サンプル)です。
オリジナルは"AT4G32850"というIDのものが重複して存在していたため、19520行目のデータを除去してタブ区切りテキストファイル(data_arab.txt)にしています。
-------------------------
2列目:mock1(A群)
3列目:mock2(A群)
4列目:mock3(A群)
5列目:hrcc1(B群)
6列目:hrcc2(B群)
7列目:hrcc3(B群)
-------------------------
- ReCountデータベース
マッピング済みの遺伝子発現行列形式のデータセットを多数提供しています。
- Yeastの二群間比較用データ(2 mutant strains vs. 2 wild-types; technical replicates)
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の中身を指定したファイル名で保存
------ ここまで ------
BioconductorのyeastRNASeqのwebページ
yeastRNASeq:Lee et al., PLoS Genet., 2008
- 上記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の中身を指定したファイル名で保存
------ ここまで ------
BioconductorのEDASeqのwebページ
EDASeq:Risso et al., BMC Bioinformatics, 2011
- 「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の中身を指定したファイル名で保存
------ ここまで ------
- 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倍高発現
R Console画面上で「library(TCC)」と打ち込んでエラーが出る場合は、a.をコピペで実行してパッケージをインストールしましょう。
a. TCCパッケージのインストール:
------ ここから ------
install.packages("TCC", type = "source") #TCCパッケージのインストール
------ ここまで ------
b. TCCパッケージ(≥ ver. 1.1.99)がインストールされていれば以下のコピペでも取得可能:
------ ここから ------
library(TCC) #パッケージの読み込み
data(hypoData) #TCCパッケージ中で提供されているシミュレーションデータをロード
#ファイルに出力
tmp <- cbind(rownames(hypoData), hypoData) #「rownames情報」と「カウントデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, "data_hypodata_3vs3.txt", sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
------ ここまで ------
- 上記の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) #パッケージの読み込み
data(hypoData) #TCCパッケージ中で提供されているシミュレーションデータをロード
#ファイルに出力
tmp <- cbind(rownames(hypoData), hypoData[, c(1, 4)]) #「rownames情報」と「カウントデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, "data_hypodata_1vs1.txt", sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
------ ここまで ------
イントロダクション | NGS | 各種覚書
覚書1-1(raw image analysis and base call):
Swift (Whiteford et al., Bioinformatics, 2009)Illumina専用
覚書1(base call):
Altacyclic
Rolexa
覚書3(strand-specific sequencing系):
(Vivancos et al., Genome Res., 2010)
(Levin et al., Nat Methods, 2010)
イントロダクション | 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)。
Helicos Heliscopeについて:
Helicos社の製品はPCR増幅を必要としない、いわゆる1分子シーケンサーと呼ばれるものみたいです。
2011, May 19に理研が独自開発したCAGE法をHeliscope用に最適化したHeliScopeCAGE法(参考文献5)についてプレスリリースしてましたね。
参考文献1(Huse et al., Genome Biol., 2007)
参考文献2(Dohm et al., Nucleic Acids Res., 2008)
参考文献3(Harismendy et al., Genome Biol., 2009)
参考文献4(Miller et al., Genomics, 2010)
参考文献5(Kanamori-Katayama et al., Genome Res., 2011)
イントロダクション | NGS | リファレンス配列取得(マップされる側)
次世代シーケンサーから得られる配列(reads)は様々なリファレンス配列への適用が可能です。ゲノム配列に限らず、cDNA配列セット、RefSeqやトランスポゾン配列のセットなどにもマップすることができます。
で、いざ配列取得を、と思ったときになかなか目的のセットにたどり着けない、という経験が私も結構ありますので、ここでは備忘録的にリンク先を記しておきます。
イントロダクション | NGS | リファレンス配列取得後の各種情報抽出(特にRefSeq)
RefSeqのHumanのmulti-fastaファイルから以下のようなことを実際にやる必要があったので、一応やり方を示しますがこのファイルは数十Mb程度ありますのであしからず。。。
・配列長情報がほしい
・RefSeq accession numberからバージョン情報を除いたものがほしい
以下ではファイルのダウンロードのところから示していますが、ダウンロードと圧縮ファイルの解凍が既に終わっているヒトはstep2からどうぞ。
「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。
#step1:圧縮ファイルのダウンロード(確認したときときは46,352 transcriptsでした;解凍はどうにかしてやってください)
------ ここから ------
in_f <- "ftp://ftp.ncbi.nih.gov/refseq/H_sapiens/mRNA_Prot/human.rna.fna.gz"#欲しいファイルのURLを指定
hoge <- unlist(strsplit(in_f, "/", fixed=TRUE)) #in_f中の文字列を"/"で分割した結果をhogeに保存
download.file(in_f, destfile=hoge[length(hoge)]) #in_fで指定したURLのファイルをhoge[length(hoge)]で指定したファイル名で保存
------ ここまで ------
#step2:本番
------ ここから ------
in_f <- "human.rna.fna" #解凍後のmulti-fastaファイルのファイル名human.rna.fnaを指定
out_f1 <- "hoge.txt" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
hoge <- strsplit(names(reads), "|", fixed=TRUE) #names(reads)中の文字列を"|"で区切った結果をリスト形式でhogeに格納
refseq_with_v <- unlist(lapply(hoge, "[[", 4)) #hogeのリスト中の4番目の要素(RefSeq accession number部分に相当)のみ抽出してrefseq_with_vに格納
hoge2 <- strsplit(refseq_with_v, ".", fixed=TRUE) #refseq_with_v中の文字列を"."で区切った結果をリスト形式でhoge2に格納
refseq_without_v <- unlist(lapply(hoge2, "[[", 1)) #hoge2のリスト中の1番目の要素(RefSeq accession numberのバージョン番号でない部分に相当)のみ抽出してrefseq_without_vに格納
tmp <- cbind(refseq_without_v, width(reads)) #「バージョン情報なしのRefSeq accession number (refseq_without_v)」と「配列長情報(width(reads))」を結合してtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#「webの11」に相当。tmpの中身をout_fで指定したファイル名で保存。
#以下は(こんなこともできますという)おまけ
#description部分をRefSeq accession number(バージョン番号つき)のみにしてFASTA形式で保存したい場合:
param1 <- 50 #一行あたりの塩基数を指定
out_f2 <- "hoge.fasta" #出力ファイル名を指定
reads #今現在のreadsオブジェクトを眺めているだけ(namesという列の部分がオリジナルのdescriptionのままになっていることがわかる)
names(reads) <- refseq_with_v #names(reads)の中身をrefseq_with_vで置換(バージョン番号なしにしたければrefseq_without_vにすればいい)
reads #今現在のreadsオブジェクトを眺めているだけ(namesという列の部分がrefseq_with_vでちゃんと置換されていることがわかる)
writeXStringSet(reads, file=out_f2, format="fasta", width=param1)#一行あたりの塩基数をparam1で指定した数にして、out_f2で指定したファイル名でreadsというオブジェクトをfasta形式で保存
#param2で指定した配列長以上のもののみ抽出して保存したい場合:
param1 <- 70 #一行あたりの塩基数を指定
param2 <- 200 #配列長の閾値を指定
out_f3 <- "hoge2.fasta" #出力ファイル名を指定
reads #今現在のreadsオブジェクトを眺めているだけ(namesという列の部分がrefseq_with_vでちゃんと置換されていることがわかる)
reads <- reads[width(reads) >= param2] #readsオブジェクト中のwidth(reads)で表される配列長がparam2以上のもののみ抽出してoutに格納
reads #今現在のreadsオブジェクトを眺めているだけ(配列数が減っているのがわかる)
writeXStringSet(reads, file=out_f3, format="fasta", width=param1)#一行あたりの塩基数をparam1で指定した数にして、out_f3で指定したファイル名でreadsというオブジェクトをfasta形式で保存
------ ここまで ------
イントロダクション | NGS | リファレンス配列取得後の各種情報抽出2(readFASTA関数の利用)
multi-fastaファイルって、一行あたりの塩基数がせいぜい100bp程度なので、通常?!はリファレンス配列取得後の各種情報抽出(特にRefSeq)中で示すようにreadDNAStringSet関数でファイルの読み込みができます。
しかし、trans-ABySSを実行して得られた転写物コンティグのmulti-fastaファイル(ファイル名がXXX-contigs.faであらわされます。ここではl1-contigs.fa)は、コンティグを一行で表します。
そのため、readDNAStringSet関数で読み込める限度を超えることにより「cannot read line XXX, line is too long」などというエラーがでて読み込めないという問題に悩まされます。
最近、この問題を回避する方法がわかりましたので、一応掲載しておきます。ここでは配列長が300bp以上のもののみを抽出して、
300という数値情報をもとにl1-contigs_300.faというファイル名を自動生成するやり方を示します。
「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。
やり方1:
------ ここから ------
in_f <- "l1-contigs.fa" #multi-fastaファイルのファイル名を指定
param1 <- 300 #配列長の閾値を指定
param2 <- 60 #出力時の一行あたりの塩基数を指定
hoge <- unlist(strsplit(in_f, ".", fixed=TRUE)) #in_f中の文字列を"."で分割した結果をhogeに保存
out_f <- paste(hoge[1], "_", param1, ".", hoge[2], sep="") #出力ファイル名を自動生成
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
tmp <- readFASTA(in_f) #in_fで指定したファイルをreadFASTA関数を用いて読み込み
tmp_desc <- unlist(lapply(tmp, "[[", 1)) #tmpのリスト中の1番目の要素(description情報)のみ抽出してtmp_descに格納
tmp_seq <- unlist(lapply(tmp, "[[", 2)) #tmpのリスト中の2番目の要素(配列情報)のみ抽出してtmp_seqに格納
reads <- DNAStringSet(tmp_seq) #character vector形式の配列情報であるtmp_seqをDNAStringSetオブジェクト形式にしてreadsに格納
names(reads) <- tmp_desc #readsオブジェクトのnamesのところにtmp_descの情報を代入
reads #今現在のreadsオブジェクトを表示
reads <- reads[width(reads) >= param1] #param1で指定した配列長以上のもののみ抽出してreadsに格納
reads #今現在のreadsオブジェクトを表示
writeXStringSet(reads, file=out_f, format="fasta", width=param2) #一行あたりの塩基数をparam2で指定した数にして、out_fで指定したファイル名でreadsというオブジェクトをfasta形式で保存
------ ここまで ------
やり方2(別の関数をつかっているだけです):
------ ここから ------
in_f <- "l1-contigs.fa" #multi-fastaファイルのファイル名を指定
param1 <- 300 #配列長の閾値を指定
param2 <- 60 #出力時の一行あたりの塩基数を指定
hoge <- unlist(strsplit(in_f, ".", fixed=TRUE)) #in_f中の文字列を"."で分割した結果をhogeに保存
out_f <- paste(hoge[1], "_", param1, ".", hoge[2], sep="") #出力ファイル名を自動生成
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
tmp <- readFASTA(in_f) #in_fで指定したファイルをreadFASTA関数を用いて読み込み
tmp_desc <- sapply(tmp, "[[", 1) #tmpのリスト中の1番目の要素(description情報)のみ抽出してtmp_descに格納
tmp_seq <- sapply(tmp, "[[", 2) #tmpのリスト中の2番目の要素(配列情報)のみ抽出してtmp_seqに格納
reads <- DNAStringSet(tmp_seq) #character vector形式の配列情報であるtmp_seqをDNAStringSetオブジェクト形式にしてreadsに格納
names(reads) <- tmp_desc #readsオブジェクトのnamesのところにtmp_descの情報を代入
reads #今現在のreadsオブジェクトを表示
reads <- reads[width(reads) >= param1] #param1で指定した配列長以上のもののみ抽出してreadsに格納
reads #今現在のreadsオブジェクトを表示
writeXStringSet(reads, file=out_f, format="fasta", width=param2) #一行あたりの塩基数をparam2で指定した数にして、out_fで指定したファイル名でreadsというオブジェクトをfasta形式で保存
------ ここまで ------
やり方2に加えてdescription行を配列長のところまでの情報に制限したい場合:
------ ここから ------
in_f <- "l1-contigs.fa" #multi-fastaファイルのファイル名を指定
param1 <- 300 #配列長の閾値を指定
param2 <- 60 #出力時の一行あたりの塩基数を指定
hoge <- unlist(strsplit(in_f, ".", fixed=TRUE)) #in_f中の文字列を"."で分割した結果をhogeに保存
out_f <- paste(hoge[1], "_", param1, ".", hoge[2], sep="") #出力ファイル名を自動生成
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
tmp <- readFASTA(in_f) #in_fで指定したファイルをreadFASTA関数を用いて読み込み
tmp_desc <- sapply(tmp, "[[", 1) #tmpのリスト中の1番目の要素(description情報)のみ抽出してtmp_descに格納
tmp_seq <- sapply(tmp, "[[", 2) #tmpのリスト中の2番目の要素(配列情報)のみ抽出してtmp_seqに格納
reads <- DNAStringSet(tmp_seq) #character vector形式の配列情報であるtmp_seqをDNAStringSetオブジェクト形式にしてreadsに格納
tmp_desc <- chartr(":", " ", tmp_desc) #description情報に相当するtmp_desc中の":"を"_"に置換した結果をまたtmp_descに格納
hoge <- strsplit(tmp_desc, " ", fixed=TRUE) #tmp_desc中の文字列を" "で区切った結果をhogeに格納
names(reads) <- paste(sapply(hoge,"[[",1), sapply(hoge,"[[",2), sapply(hoge,"[[",3),sep="_")#readsオブジェクトのnamesのところにhogeの1-3番目までの要素を"_"で連結したものを代入
reads #今現在のreadsオブジェクトを表示
reads <- reads[width(reads) >= param1] #param1で指定した配列長以上のもののみ抽出してreadsに格納
reads #今現在のreadsオブジェクトを表示
writeXStringSet(reads, file=out_f, format="fasta", width=param2) #一行あたりの塩基数をparam2で指定した数にして、out_fで指定したファイル名でreadsというオブジェクトをfasta形式で保存
------ ここまで ------
イントロダクション | NGS | アノテーション情報取得(refFlatファイル)
数多くの生物種についてはUCSCのSequence and Annotation Downloadsから辿っていけばrefFlat形式の遺伝子アノテーションファイルを得ることができます。
このrefFlat形式のアノテーションファイルは、どの領域にどの遺伝子があるのかという座標(Coordinates)情報を含みます。
具体的な使途としては、例えばゲノム配列に対してマッピングした結果から既知遺伝子の発現レベルを見積もるところ(前処理 | 正規化(混合) | RPKM正規化(Mortazavi_2008) | ゲノムマップ後のBED形式ファイルから)で必要となります。
マイクロアレイ解析に慣れた人への説明としては、NGSのゲノムマッピング結果から遺伝子発現行列をお手軽に得るために必要なおまじないのファイル、のようなものだと解釈していただければいいと思います。
例として、ヒトとラットの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 and biomaRt)
2011年8月10日に気付いた誤り、および当初私がイメージした情報取得方法
正確には、以前の記述自体に誤りがあるわけではないのですが、私が完全に勘違いをしていたために、以下の2011年8月10日までの記述内容に従って取得したファイル(ens_gene_48.txtなど)を使ってその後の解析(例えば前処理 | 正規化(混合) | RPKM正規化(Mortazavi_2008) | raw count matrixから)を行ってはいけない、というお知らせです。
勘違いの内容とは、「Ensembl Gene IDの配列長は、実際にはイントロン領域などを含んだ(start, end)の範囲であるにも関わらず、”その遺伝子を構成する全転写物の代表的な配列長のようなもの”だと思い込んでいた」ことです。
例えば(2011年8月10日現在)ENSG00000174469(chr7の145,813,453-148,118,090)は、4つの転写物(transcripts or splice variants)があります。そしてそれぞれ異なった長さ(ENST00000361727: 9894 bp, ENST00000455301: 556 bp, ENST00000538075: 1944 bp, ENST00000463592: 6063 bp)を持っています。
この遺伝子の”長さ”を定義する方法はいくつかあります。例えば参考文献2のやり方は「その遺伝子を構成する全転写物の長さの中央値(median)とする」です。この場合4003.5 bpとすべきです。しかし、これまでの計算方法は148118090-145813453 = 2304637 bpと計算していた、というわけです。
したがって、修正版としては、参考文献2の長さの計算法に従った配列長を計算するための基礎情報の取得法を示します。Ensemblの比較的最近のversion (例えば2011年二月のver. 61とか)ではtranscript lengthの情報をBioMart経由で取得できなくなっているようです。
ここでは、ヒトに関する情報取得を目的として、以下の二つのやり方を示します:
1. 2011年8月15日現在取得およびアクセス可能なver. 46からEnsembl cDNA length情報(とその他の一部)を取得するやり方
2. 最新のバージョンからcDNA配列情報そのものを取得し、そのファイルをRで読み込んでcDNA length情報を取得するやり方
1. web経由(ver. 46)でやる場合(以下はコピペじゃありませんよ):
------ ここから ------
0. http://uswest.ensembl.org/Help/ArchiveListをクリック
1. Ensembl 46: Aug 2007のところをクリック
2. Mine Ensembl with BioMartのところをクリック
3. 「- CHOOSE DATABASE-」のプルダウンメニューから「Ensembl 46」を選択
4. 「- CHOOSE DATASET-」のプルダウンメニューから「Homo sapiens genes (NCBI36)」を選択
5. 左側にある青文字の「Attibutes」をクリック
6. 「GENE」の左側にある+の記号をクリック
7. 「Ensembl Gene ID」,「Ensembl Transcript ID」,「Ensembl CDS length」,「Ensembl cDNA length」にチェックを入れる
8. 「EXTERNAL」の左側にある+の記号をクリック
9. 「HGNC symbol」, 「RefSeq DNA ID」にチェックを入れる
10. 左上のほうにある「Results」のところをクリック
11. 「Go 」ボタンをクリックして好きなファイル名(例:ens_gene_46.txt)で保存
------ ここまで ------
2. web経由(2011年8月15日現在の最新のバージョン)でやる場合(現状では、なぜか「Microsoft Internet Extensionで内部エラーが発生しました」などとなってファイルのダウンロードができません...):
------ ここから ------
1. BioMartをクリック
2. BioMart Central Portalのところをクリック
3. 「- CHOOSE DATABASE-」のプルダウンメニューから「Ensembl Genes 63 (SANGER UK)」を選択
4. 「- CHOOSE DATASET-」のプルダウンメニューから「Homo sapiens genes (GRCh37.p3)」を選択
5. 左側にある青文字の「Attibutes」をクリック
6. (デフォルトでは「Features」のところにチェックが入っている)「Sequences」のところにチェックを入れる
6. 「SEQUENCES」の左側にある+の記号をクリック
7. (デフォルトでは「Protein」のところにチェックが入っている)「cDNA sequences 」にチェックを入れる
8. 「Header Information 」の左側にある+の記号をクリック
9. 「Ensembl Gene ID」と「Ensembl Transcript ID」のみにチェックが入っていることを確認
10. 左上のほうにある「Results」のところをクリック
11. 「Unique results only」のところにチェックを入れて、 「Go 」ボタンをクリック
12. 好きなファイル名(例:ens_seq_63.txt)で保存
------ ここまで ------
BioconductorのbiomaRtのwebページ
参考文献1(Smedley et al., BMC Genomics, 2009)
以下は2011年8月10日までの記述内容
世の中には様々なデータベースがありますが、データベース間でのIDの対応関係や、例えばある遺伝子がゲノム上のどこにあるのかなどの情報を一度に得たいという局面がRNA-seqではあります。
実際に私が必要とした情報としては、Ensembl Gene IDのリストは手元にあるが、「その配列長が知りたい」でした。
このような情報をお手軽に得ることができるのがBioMart(参考文献1)です。
ここではヒト(やマウス)の「Ensembl Gene ID」、「染色体名」、「そのGeneの座標情報(start, end)」、「gene symbol」の情報を取得する方法を下記に示します。
私は1のweb経由で得られた結果ファイルをens_gene_60.txtというファイル名で、また、3のEnsembl ver.48について得たファイルをens_gene_48.txtというファイル名で保存しました。
Rでやった結果と行数が同じで、異なるのは最初の一行目だけであることがわかると思います。
注意事項としては、チェックした順番に列の右側に追加されていきますので、得られたファイルを読み込むときにはどの情報が何列目にあるのかをちゃんと把握しておく必要があります。
BioMartについては統合TV中でもいくつかのやり方が紹介されてますのでもう少しわかりやすい情報(例えばこれ)がほしい方はそちらを訪れてみるといいです。
また、おそらくですがbioMartからとってこれる情報は最新バージョンのみだと思います。実際問題としては、Ensembl ver.XXなどという記述がありますので、そのバージョンを揃える必要が出てきます。
その場合は、直接EnsemblのArchiveにアクセスして以前のバージョンのデータを取得する必要があります。
1. web経由(最新のバージョン)でやる場合(以下はコピペじゃありませんよ):
------ ここから ------
1. BioMartをクリック
2. Ensemblのところをクリック
3. 「- CHOOSE DATABASE-」のプルダウンメニューから「Ensembl Genes 60」を選択
4. 「- CHOOSE DATASET-」のプルダウンメニューから「Homo sapiens genes (GRCh37.p2)」を選択
5. 左側にある青文字の「Attibutes」をクリック
6. 「GENE」の左側にある+の記号をクリック
7. 「Ensembl Gene ID」,「Chromosome Name」,「Gene Start (bp)」,「Gene End (bp)」にチェックを入れる
8. 「EXTERNAL」の左側にある+の記号をクリック
9. 「HGNC symbol」にチェックを入れる
10. 左上のほうにある「Results」のところをクリック
11. 「Go 」ボタンをクリックして好きなファイル名(例:ens_gene_60.txt)で保存
------ ここまで ------
2. Rでやる場合(以下は基本コピペですよ):
------ ここから ------
out_f <- "ens_gene_60_2.txt" #出力ファイル名を指定
#必要なパッケージなどをロード
library(biomaRt) #パッケージの読み込み
listMarts() #「webの1」に相当し、利用可能なデータベースを表示している(ここでこのライブラリ中での名前を把握しておく。例えばEnsemblは"ensembl"という名前になっていることが分かる)。
mart <- useMart("ensembl") #「webの2」に相当
listDatasets(mart) #「webの3」に相当
mart <- useDataset("hsapiens_gene_ensembl", mart=mart) #「webの4」に相当
listFilters(mart) #「webの?」に相当。特定の染色体上だけ、とか特定のマイクロアレイ上に搭載されたものだけ、などのフィルター(Filters)の条件を指定することができるが今回は何も指定していないので。。。
listAttributes(mart) #「webの5-9」に相当。欲しい情報はそれぞれ"ensembl_gene_id", "chromosome_name", "start_position", "end_position", "hgnc_symbol"で取得可能であることが分かる(実際にはなかなかわかりずらいので、私はwebの表示順などから探し当てました。。。)
attr <- c("ensembl_gene_id", "chromosome_name", "start_position", "end_position", "hgnc_symbol")#「webの5-9」に相当
out <- getBM(attributes=attr, filters="", values="", mart=mart) #「webの10」に相当
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#「webの11」に相当。outの中身をout_fで指定したファイル名で保存。
------ ここまで ------
3. web経由(Ensemblの任意のversion)でやる場合(以下はコピペじゃありませんよ):
------ ここから ------
0. EnsemblのArchiveをクリック
1. 任意のバージョン(例えばEnsembl 48: Dec 2007)をクリック
2. 「Mine Ensembl with BioMart」をクリック
3. 「- CHOOSE DATABASE-」のプルダウンメニューから「Ensembl 48」を選択
4. 「- CHOOSE DATASET-」のプルダウンメニューから「Homo sapiens genes (NCBI36)」を選択
5. 左側にある青文字の「Attibutes」をクリック
6. 「GENE」の左側にある+の記号をクリック
7. 「Ensembl Gene ID」,「Chromosome Name」,「Gene Start (bp)」,「Gene End (bp)」にチェックを入れる
8. 「EXTERNAL」の左側にある+の記号をクリック
9. 「HGNC symbol」にチェックを入れる
10. 左上のほうにある「Results」のところをクリック
11. 「Unique results only」のところにチェックを入れて、 「Go 」ボタンをクリックして好きなファイル名(例:ens_gene_48.txt)で保存
------ ここまで ------
4. Rでやる場合(対象がマウス:以下は基本コピペですよ):
------ ここから ------
out_f <- "ens_gene_60_mm.txt" #出力ファイル名を指定
#必要なパッケージなどをロード
library(biomaRt) #パッケージの読み込み
listMarts() #「webの1」に相当し、利用可能なデータベースを表示している(ここでこのライブラリ中での名前を把握しておく。例えばEnsemblは"ensembl"という名前になっていることが分かる)。
mart <- useMart("ensembl") #「webの2」に相当
listDatasets(mart) #「webの3」に相当
mart <- useDataset("mmusculus_gene_ensembl", mart=mart) #「webの4」に相当
listFilters(mart) #「webの?」に相当。特定の染色体上だけ、とか特定のマイクロアレイ上に搭載されたものだけ、などのフィルター(Filters)の条件を指定することができるが今回は何も指定していないので。。。
listAttributes(mart) #「webの5-9」に相当。欲しい情報はそれぞれ"ensembl_gene_id", "chromosome_name", "start_position", "end_position", "mgi_curated_gene_symbol", "refseq_dna"で取得可能であることが分かる(実際にはなかなかわかりずらいので、私はwebの表示順などから探し当てました。。。また、mgi_gene_symbolなるものもあって、どれがより正確なのかは不明です)
attr <- c("ensembl_gene_id", "chromosome_name", "start_position", "end_position", "mgi_curated_gene_symbol", "refseq_dna")#「webの5-9」に相当
out <- getBM(attributes=attr, filters="", values="", mart=mart) #「webの10」に相当
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#「webの11」に相当。outの中身をout_fで指定したファイル名で保存。
------ ここまで ------
BioconductorのbiomaRtのwebページ
参考文献1(Smedley et al., BMC Genomics, 2009)
参考文献2(Oshlack and Wakefield, Biology Direct, 2009)
イントロダクション | 一般 | 遺伝子の転写開始点近傍配列(上流配列など)を取得
プロモーター解析を行いたいときに「あれ、どこだったっけ?」とよくなるのでまとめときます。
・UCSCを利用する場合:
UCSCのSequence and Annotation Downloadsページからリストアップされている目的の生物種を選択。Full data setページの下のほうで上流1000, 2000, 5000bpの配列を取得可能。以下は例
ラット:Rat
ヒト:Human
マウス:Mouse
ゼブラフィッシュ:Zebrafish
...
・DBTSS(参考文献1)を利用する場合:
左側の下のほうのDownloadをクリックし、dbtss_recentlyを選択。2012/07/06現在、以下の5つの生物種の転写開始点(Transcriptional Start Sites; TSS)の上流1000bp-下流200bpの範囲の配列を取得可能。
ヒト:hspromoter.tab.gz
マウス:mmpromoter.tab.gz
シアニディオシゾン (C. merolae):cmpromoter.tab.gz
ゼブラフィッシュ(D. rerio):drpromoter.tab.gz
熱帯熱マラリア原虫(P. falciparum):pfpromoter.tab.gz
・EPD(参考文献2)を利用する場合:
ヒトやマウスは「Access EPD」- 「Download EPD db」ですぐに到達可能。
それ以外のイネとかは「Access EPD」- 「Download EPD db」で「Download EPD (refine selection)」の"refine selection"のところをいじれば...13046 rice sequencesがダウンロードできるはずだが...
・個別の生物種ごとに作成されたDBを利用する場合:
イネ:RAP-DB(参考文献3)の
ダウンロードタブから上流・下流それぞれ1000, 2000, 3000bpの配列を取得可能(計6種類)。
シロイヌナズナ:The Arabidopsis Information Resource (TAIR)(参考文献4)の
「ダウンロード」−「Sequences」タブからblast_datasetsのTAIR10_blastsetsまでいくと、
上流・下流それぞれ500, 1000, 3000bpの配列を取得可能(計6種類)。
参考文献1(Yamashita et al., Nucleic Acids Res., 2012)
参考文献2(Schmid et al., Nucleic Acids Res., 2006)
参考文献3(Rice Annotation Project, Nucleic Acids Res., 2008)
参考文献4(Lamesch et al., Nucleic Acids Res., 2012)
イントロダクション | 一般 | 任意のキーワードを含む行を抽出
例えばタブ区切りテキストファイルのannotation.txtが手元にあり、この中からgenelist1.txtのようなリストファイル中の文字列を含む行を抽出するやり方を示します。
Linux (UNIX)のgrepコマンドのようなものです。perlのハッシュのようなものです。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. 目的のタブ区切りテキストファイル(annotation.txt)中の第1列目をキーとして、リストファイル(genelist1.txt)中のものが含まれる行全体を出力したい場合:
------ ここから ------
in_f1 <- "annotation.txt" #入力ファイル名(目的のタブ区切りテキストファイル)を指定
in_f2 <- "genelist1.txt" #入力ファイル名(キーワードなどのリストファイル)を指定
out_f <- "hoge1.txt" #出力ファイル名を指定
param <- 1 #in_f1で読み込む目的のファイルの何列目のデータに対してサーチしたいかを指定
#ファイルの読み込み
data <- read.table(in_f1, header=TRUE, sep="\t", quote="") #入力ファイル(目的のファイル)を読み込んでdataに格納
keywords <- readLines(in_f2) #入力ファイル(リストファイル)を読み込んでkeywordsに格納
dim(data) #オブジェクトdataの行数と列数を表示
#本番
obj <- is.element(as.character(data[,param]), keywords) #in_f1で読み込んだファイル中の(param)列目の文字列ベクトル中の各要素がベクトルkeywords中に含まれるか含まれないか(TRUE or FALSE)の情報をobjに格納(集合演算をしている)
out <- data[obj,] #行列dataからobjがTRUEとなる行のみを抽出した結果をoutに格納
dim(out) #オブジェクトoutの行数と列数を表示
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身をout_fで指定したファイル名で保存。
------ ここまで ------
2. 目的のタブ区切りテキストファイル(annotation.txt)中の第1列目をキーとして、リストファイル(genelist2.txt)中のものが含まれる行全体を出力したい場合:
------ ここから ------
in_f1 <- "annotation.txt" #入力ファイル名(目的のタブ区切りテキストファイル)を指定
in_f2 <- "genelist2.txt" #入力ファイル名(キーワードなどのリストファイル)を指定
out_f <- "hoge2.txt" #出力ファイル名を指定
param <- 1 #in_f1で読み込む目的のファイルの何列目のデータに対してサーチしたいかを指定
#ファイルの読み込み
data <- read.table(in_f1, header=TRUE, sep="\t", quote="") #入力ファイル(目的のファイル)を読み込んでdataに格納
keywords <- readLines(in_f2) #入力ファイル(リストファイル)を読み込んでkeywordsに格納
#本番
obj <- is.element(as.character(data[,param]), keywords) #in_f1で読み込んだファイル中の(param)列目の文字列ベクトル中の各要素がベクトルkeywords中に含まれるか含まれないか(TRUE or FALSE)の情報をobjに格納(集合演算をしている)
out <- data[obj,] #行列dataからobjがTRUEとなる行のみを抽出した結果をoutに格納
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身をout_fで指定したファイル名で保存。
------ ここまで ------
3. 目的のタブ区切りテキストファイル(annotation.txt)中の第3列目をキーとして、リストファイル(genelist2.txt)中のものが含まれる行全体を出力したい場合:
------ ここから ------
in_f1 <- "annotation.txt" #入力ファイル名(目的のタブ区切りテキストファイル)を指定
in_f2 <- "genelist2.txt" #入力ファイル名(キーワードなどのリストファイル)を指定
out_f <- "hoge3.txt" #出力ファイル名を指定
param <- 3 #in_f1で読み込む目的のファイルの何列目のデータに対してサーチしたいかを指定
#ファイルの読み込み
data <- read.table(in_f1, header=TRUE, sep="\t", quote="") #入力ファイル(目的のファイル)を読み込んでdataに格納
keywords <- readLines(in_f2) #入力ファイル(リストファイル)を読み込んでkeywordsに格納
#本番
obj <- is.element(as.character(data[,param]), keywords) #in_f1で読み込んだファイル中の(param)列目の文字列ベクトル中の各要素がベクトルkeywords中に含まれるか含まれないか(TRUE or FALSE)の情報をobjに格納(集合演算をしている)
out <- data[obj,] #行列dataからobjがTRUEとなる行のみを抽出した結果をoutに格納
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身をout_fで指定したファイル名で保存。
------ ここまで ------
4. 目的のタブ区切りテキストファイル(annotation.txt)に対して、リストファイル(genelist1.txt)中のものが含まれる行全体を出力したい場合:
------ ここから ------
in_f1 <- "annotation.txt" #入力ファイル名(目的のタブ区切りテキストファイル)を指定
in_f2 <- "genelist1.txt" #入力ファイル名(キーワードなどのリストファイル)を指定
out_f <- "hoge4.txt" #出力ファイル名を指定
#ファイルの読み込み
data <- readLines(in_f1) #入力ファイル(目的のファイル)を読み込んでdataに格納
keywords <- readLines(in_f2) #入力ファイル(リストファイル)を読み込んでkeywordsに格納
#本番(リストファイル中の要素数分だけループを回して、要素中の文字列と一致する行番号情報を得て、その行のみ出力)
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") #進行状況を表示させてるだけ
}
obj <- unique(hoge) #得られるhogeベクトルは重複している可能性があるのでunique関数もかけた結果をobjに格納
out <- data[obj] #ベクトルdataからobjがTRUEとなる要素のみを抽出した結果をoutに格納(dataオブジェクトは行列ではないことに注意!)
writeLines(out, out_f) #outの中身をout_fで指定したファイル名で保存。
#以下は(こんなこともできますという)おまけ
#リストファイル中にあるキーワードごとに、それが見つかった行番号情報を出力
out_f2 <- "hoge4_hoge.txt" #出力ファイル名を指定
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の中身をout_f2で指定したファイル名で保存。
------ ここまで ------
5. 目的のタブ区切りテキストファイル(annotation.txt)中の第1列目をキーとして、リストファイル(genelist1.txt)中のものに対応するannotation.txt中の第4列目(subcellular_location列)のみを出力する場合:
------ ここから ------
in_f1 <- "annotation.txt" #入力ファイル名(目的のタブ区切りテキストファイル)を指定
in_f2 <- "genelist1.txt" #入力ファイル名(キーワードなどのリストファイル)を指定
out_f <- "hoge5.txt" #出力ファイル名を指定
param1 <- 1 #in_f1で読み込む目的のファイルの何列目のデータに対してサーチしたいかを指定
param2 <- 4 #in_f1で読み込む目的のファイルの何列目のデータを出力したいかを指定
#ファイルの読み込み
data <- read.table(in_f1, header=TRUE, sep="\t", quote="") #入力ファイル(目的のファイル)を読み込んでdataに格納
keywords <- readLines(in_f2) #入力ファイル(リストファイル)を読み込んでkeywordsに格納
#本番
obj <- is.element(as.character(data[,param1]), keywords) #in_f1で読み込んだファイル中の(param1)列目の文字列ベクトル中の各要素がベクトルkeywords中に含まれるか含まれないか(TRUE or FALSE)の情報をobjに格納(集合演算をしている)
out <- data[obj,param2] #行列dataからobjがTRUEとなる行の(param2)列目の情報のみを抽出した結果をoutに格納
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身をout_fで指定したファイル名で保存。
------ ここまで ------
6. 4と同じことをsapply関数を用いてやる場合:
------ ここから ------
in_f1 <- "annotation.txt" #入力ファイル名(目的のタブ区切りテキストファイル)を指定
in_f2 <- "genelist1.txt" #入力ファイル名(キーワードなどのリストファイル)を指定
out_f <- "hoge6.txt" #出力ファイル名を指定
#ファイルの読み込み
data <- readLines(in_f1) #入力ファイル(目的のファイル)を読み込んでdataに格納
keywords <- readLines(in_f2) #入力ファイル(リストファイル)を読み込んでkeywordsに格納
#本番(リストファイル中の要素一つ一つに対して、要素中の文字列と一致する行番号情報を得て、その行のみ出力)
keywords <- unique(keywords) #リストファイル中の要素が重複している可能性があるので、重複なしの状態にしている
hoge <- sapply(keywords, grep, x=data) #リストファイル中の要素一つ一つに対して、要素中の文字列と一致する行番号情報を得ている
obj <- unique(hoge) #得られるhogeベクトルは重複している可能性があるのでunique関数をかけた結果をobjに格納
out <- data[obj] #ベクトルdataからobjがTRUEとなる要素のみを抽出した結果をoutに格納(dataオブジェクトは行列ではないことに注意!)
writeLines(out, out_f) #outの中身をout_fで指定したファイル名で保存。
------ ここまで ------
7. 6と同じことを別のファイルを用いてやる場合:
ラットのアノテーション情報ファイル(GPL1355-14795.txt), 二群間比較で発現変動が確認された遺伝子IDリストファイル(result_rankprod_BAT_id.txt)
------ ここから ------
in_f1 <- "GPL1355-14795.txt" #入力ファイル名(アノテーション情報ファイル)を指定
in_f2 <- "result_rankprod_BAT_id.txt" #入力ファイル名(キーワードなどのリストファイル)を指定
out_f <- "hoge7.txt" #出力ファイル名を指定
#ファイルの読み込み
data <- readLines(in_f1) #入力ファイル(目的のファイル)を読み込んでdataに格納
keywords <- readLines(in_f2) #入力ファイル(リストファイル)を読み込んでkeywordsに格納
#本番(リストファイル中の要素一つ一つに対して、要素中の文字列と一致する行番号情報を得て、その行のみ出力)
keywords <- unique(keywords) #リストファイル中の要素が重複している可能性があるので、重複なしの状態にしている
hoge <- sapply(keywords, grep, x=data) #リストファイル中の要素一つ一つに対して、要素中の文字列と一致する行番号情報を得ている
obj <- unique(hoge) #得られるhogeベクトルは重複している可能性があるのでunique関数をかけた結果をobjに格納
out <- data[obj] #ベクトルdataからobjがTRUEとなる要素のみを抽出した結果をoutに格納(dataオブジェクトは行列ではないことに注意!)
writeLines(out, out_f) #outの中身をout_fで指定したファイル名で保存。
------ ここまで ------
8. 7と基本的には同じだが、「遺伝子IDリストファイル中の文字列」が「アノテーション情報ファイル中の一番左側」にしか存在しないという前提で高速に探索したい場合:
ラットのアノテーション情報ファイル(GPL1355-14795.txt), 二群間比較で発現変動が確認された遺伝子IDリストファイル(result_rankprod_BAT_id.txt)
------ ここから ------
in_f1 <- "GPL1355-14795.txt" #入力ファイル名(アノテーション情報ファイル)を指定
in_f2 <- "result_rankprod_BAT_id.txt" #入力ファイル名(キーワードなどのリストファイル)を指定
out_f <- "hoge8.txt" #出力ファイル名を指定
#ファイルの読み込み
data <- readLines(in_f1) #入力ファイル(目的のファイル)を読み込んでdataに格納
keywords <- readLines(in_f2) #入力ファイル(リストファイル)を読み込んでkeywordsに格納
#本番(リストファイル中の要素一つ一つに対して、要素中の文字列と一致する行番号情報を得て、その行のみ出力)
keywords <- unique(keywords) #リストファイル中の要素が重複している可能性があるので、重複なしの状態にしている
hoge <- sapply(paste("^", keywords, sep=""), grep, x=data) #リストファイル中の要素一つ一つに対して、要素中の文字列と一致する行番号情報を得ている
obj <- unique(hoge) #得られるhogeベクトルは重複している可能性があるのでunique関数をかけた結果をobjに格納
out <- data[obj] #ベクトルdataからobjがTRUEとなる要素のみを抽出した結果をoutに格納(dataオブジェクトは行列ではないことに注意!)
writeLines(out, out_f) #outの中身をout_fで指定したファイル名で保存。
------ ここまで ------
9. 8を基本として、8の出力ファイルは対象の行の情報全てを出力するものであったが、13列目のRefSeq Transcript IDに相当するもののみ抽出したい場合:
ラットのアノテーション情報ファイル(GPL1355-14795.txt), 二群間比較で発現変動が確認された遺伝子IDリストファイル(result_rankprod_BAT_id.txt)
------ ここから ------
in_f1 <- "GPL1355-14795.txt" #入力ファイル名(アノテーション情報ファイル)を指定
in_f2 <- "result_rankprod_BAT_id.txt" #入力ファイル名(キーワードなどのリストファイル)を指定
out_f <- "hoge9.txt" #出力ファイル名を指定
param <- 13 #in_f1で読み込むファイルの何列目のデータを出力したいかを指定
#ファイルの読み込み
data <- readLines(in_f1) #入力ファイル(目的のファイル)を読み込んでdataに格納
keywords <- readLines(in_f2) #入力ファイル(リストファイル)を読み込んでkeywordsに格納
#本番(リストファイル中の要素一つ一つに対して、要素中の文字列と一致する行番号情報を得て、その行のみ出力)
keywords <- unique(keywords) #リストファイル中の要素が重複している可能性があるので、重複なしの状態にしている
hoge <- sapply(paste("^", keywords, sep=""), grep, x=data) #リストファイル中の要素一つ一つに対して、要素中の文字列と一致する行番号情報を得ている
obj <- unique(hoge) #得られるhogeベクトルは重複している可能性があるのでunique関数をかけた結果をobjに格納
hoge2 <- data[obj] #ベクトル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の中身をout_fで指定したファイル名で保存。
------ ここまで ------
10. 9を基本として、8の出力ファイルは対象の行の情報全てを出力するものであったが、13列目のRefSeq Transcript IDに相当するもののみ抽出したい場合:
ラットのアノテーション情報ファイル(GPL1355-14795.txt), 二群間比較で発現変動が確認された遺伝子IDリストファイル(result_rankprod_BAT_id.txt)
アノテーション情報ファイルの形式は"#"から始まる行以外は同じ列数なので、行列形式などにすることが可能なことを利用している(9に比べて一般性は劣るがより劇的に早い計算が可能)
------ ここから ------
in_f1 <- "GPL1355-14795.txt" #入力ファイル名(アノテーション情報ファイル)を指定
in_f2 <- "result_rankprod_BAT_id.txt" #入力ファイル名(キーワードなどのリストファイル)を指定
out_f <- "hoge10.txt" #出力ファイル名を指定
param <- 13 #in_f1で読み込むファイルの何列目のデータを出力したいかを指定
#ファイルの読み込み
data <- readLines(in_f1) #入力ファイル(目的のファイル)を読み込んでdataに格納
keywords <- readLines(in_f2) #入力ファイル(リストファイル)を読み込んでkeywordsに格納
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の中身をout_fで指定したファイル名で保存。
------ ここまで ------
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_f2 <- "result_rankprod_BAT_id.txt" #入力ファイル名(キーワードなどのリストファイル)を指定
out_f1 <- "result_rankprod_BAT_RefSeq_DEG.txt" #出力ファイル名1を指定
out_f2 <- "result_rankprod_BAT_RefSeq_nonDEG.txt" #出力ファイル名2を指定
param <- 13 #in_f1で読み込むファイルの何列目のデータを出力したいかを指定
#ファイルの読み込み
data <- readLines(in_f1) #入力ファイル(目的のファイル)を読み込んでdataに格納
geneid_DEG <- readLines(in_f2) #入力ファイル(リストファイル)を読み込んでgeneid_DEGに格納
#アノテーション情報ファイル中で"#"から始まる行を除いて(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の中身をout_f1で指定したファイル名で保存。
writeLines(out_nonDEG, out_f2) #out_nonDEGの中身をout_f2で指定したファイル名で保存。
------ ここまで ------
イントロダクション | 一般 | ランダムな塩基配列を作成
タイトル通り、「任意の長さ」で「任意の塩基組成」からなるつランダムな塩基配列を作成するやり方を示します。
A,C,G,Tの数値を指定することで任意の塩基組成にできるようになっています。指定する数値の合計は別に100にならなくてもかまいません。
例えば「全てを1にしておけば、四種類の塩基の出現確率の期待値が25%」になりますし、「A=0, C=705, G=89, T=206みたいな指定法だと、(数値の合計が1000なので)塩基Cの出現確率が70.5%」みたいなこともできます。
1. 基本形(配列の生成のみ):
------ ここから ------
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に格納
------ ここまで ------
2. 基本形(任意のdescription行つきのFASTA形式ファイルで保存):
------ ここから ------
param1 <- 50 #配列長を指定
narabi <- c("A","C","G","T") #以下の数値指定時にACGTの並びを間違えないようにするために記述している(内部的にも使用してます)
param2 <- c(20, 30, 30, 20) #(A,C,G,Tの並びで)各塩基の存在比率を指定
param3 <- "kkk" #FASTA形式ファイルのdescription行に記述する内容
out_f <- "hoge2.fa" #出力ファイル名を指定
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#param2で指定したACGTの比率で配列を生成しoutに格納するところ
ACGTset <- rep(narabi, param2) #narabi中の塩基がparam2で指定した数だけ存在する文字列ベクトルACGTsetを作成
out <- paste(sample(ACGTset, param1, replace=T), collapse="") #ACGTsetの文字型ベクトルからparam1回分だけ復元抽出して得られた塩基配列をoutに格納
#param2で指定したACGTの比率で配列を生成
reads <- DNAStringSet(out) #生成したoutオブジェクトはDNA塩基配列だと認識させるDNAStringSet関数を適用した結果をreadsに格納
names(reads) <- param3 #FASTA形式ファイルのdescription行に相当する記述を追加している
writeXStringSet(reads, file=out_f, format="fasta", width=50) #一行あたりの塩基数を「widthオプションで指定した数」にして、out_fで指定したファイル名でreadsというオブジェクトをfasta形式で保存
------ ここまで ------
3. 任意の配列長をもつものを複数個作ってmulti-fastaファイルにしたい場合:
------ ここから ------
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行に記述する内容
out_f <- "hoge3.fa" #出力ファイル名を指定
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#param2で指定したACGTの比率で配列を生成
ACGTset <- rep(narabi, param2) #narabi中の塩基がparam2で指定した数だけ存在する文字列ベクトルACGTsetを作成
out <- NULL #outというプレースホルダの作成
for(i in 1:length(param1)){ #length(param1)で表現される配列数分だけループを回す
out <- c(out, paste(sample(ACGTset, param1[i], replace=T), collapse=""))#ACGTsetの文字型ベクトルからparam1[i]回分だけ復元抽出して得られた塩基配列をoutに格納
}
#DNAStringSetオブジェクト形式に変換してdescription情報を追加し、ファイルに出力するところ
reads <- DNAStringSet(out) #生成したoutオブジェクトはDNA塩基配列だと認識させるDNAStringSet関数を適用した結果をreadsに格納
names(reads) <- paste(param3, 1:length(out), sep="_") #FASTA形式ファイルのdescription行に相当する記述を追加している
writeXStringSet(reads, file=out_f, format="fasta", width=50) #一行あたりの塩基数を「widthオプションで指定した数」にして、out_fで指定したファイル名でreadsというオブジェクトをfasta形式で保存
------ ここまで ------
4. 配列長情報を含むファイル(seq_length.txt; 中身は「24, 103, 65, 49」という四行からなる数値情報)を読み込む場合:
------ ここから ------
in_f <- "seq_length.txt" #読み込みたい配列長情報を含むファイルの名前を指定
narabi <- c("A","C","G","T") #以下の数値指定時にACGTの並びを間違えないようにするために記述している(内部的にも使用してます)
param2 <- c(20, 30, 30, 20) #(A,C,G,Tの並びで)各塩基の存在比率を指定
param3 <- "contig" #FASTA形式ファイルのdescription行に記述する内容
out_f <- "hoge4.fa" #出力ファイル名を指定
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#入力ファイルの読み込み
param1 <- readLines(in_f) #入力ファイル(in_fファイル)を読み込んでparam1に格納
#param2で指定したACGTの比率で配列を生成
ACGTset <- rep(narabi, param2) #narabi中の塩基がparam2で指定した数だけ存在する文字列ベクトルACGTsetを作成
out <- NULL #outというプレースホルダの作成
for(i in 1:length(param1)){ #length(param1)で表現される配列数分だけループを回す
out <- c(out, paste(sample(ACGTset, param1[i], replace=T), collapse=""))#ACGTsetの文字型ベクトルからparam1[i]回分だけ復元抽出して得られた塩基配列をoutに格納
}
#DNAStringSetオブジェクト形式に変換してdescription情報を追加し、ファイルに出力するところ
reads <- DNAStringSet(out) #生成したoutオブジェクトはDNA塩基配列だと認識させるDNAStringSet関数を適用した結果をreadsに格納
names(reads) <- paste(param3, 1:length(out), sep="_") #FASTA形式ファイルのdescription行に相当する記述を追加している
writeXStringSet(reads, file=out_f, format="fasta", width=50) #一行あたりの塩基数を「widthオプションで指定した数」にして、out_fで指定したファイル名でreadsというオブジェクトをfasta形式で保存
------ ここまで ------
イントロダクション | 一般 | 任意の長さの可能な全ての塩基配列を作成
"A", "C", "G", "T"からなる任意の長さのn塩基からなる全ての塩基配列を作成するやり方を示します。
「ファイル」−「ディレクトリの変更」で出力結果ファイルを保存したいディレクトリに移動し以下をコピペ。
1. n=3として、4^n = 4^3 = 64通りの3塩基からなる可能な配列を作成したい場合:
------ ここから ------
out_f <- "hoge.txt" #出力ファイル名を指定
param <- 3 #欲しい連続塩基の長さ情報を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
out <- mkAllStrings(c("A", "C", "G", "T"), param) #(param)連続塩基の全ての可能な配列情報をoutに格納
writeLines(out, out_f) #outの中身をout_fで指定したファイル名で保存。
------ ここまで ------
2. n=5として、4^n = 4^5 = 1024通りの5塩基からなる可能な配列を作成したい場合:
------ ここから ------
out_f <- "hoge2.txt" #出力ファイル名を指定
param <- 5 #欲しい連続塩基の長さ情報を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
out <- mkAllStrings(c("A", "C", "G", "T"), param) #(param)連続塩基の全ての可能な配列情報をoutに格納
writeLines(out, out_f) #outの中身をout_fで指定したファイル名で保存。
------ ここまで ------
BioconductorのBiostringsのwebページ
イントロダクション | 一般 | 配列取得
例えばRefSeqの"NM_006256"の配列を入手したい、などと取得したい配列のaccession番号が既知の場合にR経由でNCBIから配列情報を取得するやり方を示します。
しかし、Windows 64 bit版はNot Available...。
------ ここから ------
param1 <- "NM_006256" #取得したい配列のアクセッション番号を指定
#必要なパッケージなどをロード
library(GeneR) #パッケージの読み込み
------ ここまで ------
BioconductorのGeneRのwebページ
イントロダクション | 一般 | 指定した範囲の配列を取得
1.では、12塩基(AGTGACGGTCTT)からなる一つの塩基配列(description行が">kadota")からなるFASTA形式ファイル(sample1.fasta)を入力として、
この塩基配列の任意の範囲 (始点が3, 終点が9)の配列を抽出し、得られた部分配列をFASTA形式ファイル(tmp1.fasta)に出力するやり方を示します。
2.では、RefSeqのhuman mRNAのmulti-fasta形式のファイル (h_rna.fasta)が手元にあったとして、
任意のRefSeq ID (例:NM_203348.1)の任意の範囲 (例:始点が2, 終点が5)の配列の抽出を行います。
3.では、2.の延長線上で、目的のaccession番号が複数ある場合に対応したものです。予め用意しておいた「1列目:accession, 2列目:start位置, 3列目:end位置」からなるリストファイル (list_sub1.txt)を読み込ませて、目的の配列のmulti-fastaファイルをゲットするやり方を示します。
ここでは、得られた部分配列をFASTA形式ファイル(ファイル名:tmp3.fasta)で保存するやり方を示します。
4.では、3.と同じことを異なるファイル(multi-fastaファイル:hoge4.fa、リストファイル;list_sub2.txt)を用いて行っています。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. sample1.fastaファイルの場合:
------ ここから ------
in_f <- "sample1.fasta" #multi-fasta形式のファイルを指定
out_f <- "tmp1.fasta" #出力ファイル名を指定
param <- c(3, 9) #抽出したい範囲の始点と終点を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- subseq(reads, param[1], param[2]) #paramで指定した始点と終点の範囲の配列を抽出してoutに格納
writeXStringSet(out, file=out_f, format="fasta", width=80) #outの中身をout_fで指定したファイル名で保存
------ ここまで ------
2. h_rna.fastaファイルの場合:
------ ここから ------
in_f <- "h_rna.fasta" #multi-fasta形式のファイルを指定
out_f <- "tmp2.fasta" #出力ファイル名を指定
param1 <- "NM_203348.1" #取得したい配列のアクセッション番号を指定
param2 <- c(2, 5) #抽出したい範囲の始点と終点を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
head(reads) #readsオブジェクトの最初の一部を表示(ちなみに最後の一部を表示させたい場合は「tail(reads)」)
names(reads) #readsオブジェクトのID (description部分)を表示させたい場合
obj <- names(reads) == param1 #param1で指定したIDの配列の位置情報(TRUE or FALSE)をobjに格納
out <- subseq(reads[obj], param2[1], param2[2]) #objがTRUEとなる塩基配列のもののみに対して、param2で指定した始点と終点の範囲の配列を抽出してoutに格納
writeXStringSet(out, file=out_f, format="fasta", width=80) #outの中身をout_fで指定したファイル名で保存
------ ここまで ------
3. h_rna.fastaファイルで抽出したい情報をリストファイル(list_sub1.txt)で与える場合:
------ ここから ------
in_f1 <- "h_rna.fasta" #multi-fasta形式のファイルを指定
in_f2 <- "list_sub1.txt" #リストファイルを指定
out_f <- "tmp3.fasta" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f1, format="fasta") #in_f1で指定したファイルをFASTA形式で読み込み
list_obj <- read.table(in_f2) #in_f2で指定したファイルの読み込み
out <- NULL #最終的に得る結果を格納するためのプレースホルダoutを作成しているだけ
for(i in 1:nrow(list_obj)){ #length(list_obj)回だけループを回す
obj <- names(reads) == list_obj[i,1] #names(reads)中でlist_obj[i,1]と一致する位置をTRUE、それ以外をFALSEとしたベクトルobjを作成
out <- append(out, subseq(reads[obj], start=list_obj[i,2], end=list_obj[i,3]))#subseq関数を用いてobjがTRUEとなるもののみに対して、list_obj[i,2]とlist_obj[i,3]で与えた範囲に対応する部分配列を抽出した結果をoutにどんどん格納している
} #
writeXStringSet(out, file=out_f, format="fasta", width=80) #outの中身をout_fで指定したファイル名で保存
------ ここまで ------
4. hoge4.faファイルで抽出したい情報をリストファイル(list_sub2.txt)で与える場合:
------ ここから ------
in_f1 <- "hoge4.fa" #multi-fasta形式のファイルを指定
in_f2 <- "list_sub2.txt" #リストファイルを指定
out_f <- "tmp4.fasta" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f1, format="fasta") #in_f1で指定したファイルをFASTA形式で読み込み
list_obj <- read.table(in_f2) #in_f2で指定したファイルの読み込み
out <- NULL #最終的に得る結果を格納するためのプレースホルダoutを作成しているだけ
for(i in 1:nrow(list_obj)){ #nrow(list_obj)回だけループを回す
obj <- names(reads) == list_obj[i,1] #names(reads)中でlist_obj[i,1]と一致する位置をTRUE、それ以外をFALSEとしたベクトルobjを作成
out <- append(out, subseq(reads[obj], start=list_obj[i,2], end=list_obj[i,3]))#subseq関数を用いてobjがTRUEとなるもののみに対して、list_obj[i,2]とlist_obj[i,3]で与えた範囲に対応する部分配列を抽出した結果をoutにどんどん格納している
} #
writeXStringSet(out, file=out_f, format="fasta", width=80) #outの中身をout_fで指定したファイル名で保存
------ ここまで ------
BioconductorのBiostringsのwebページ
イントロダクション | 一般 | 翻訳配列(translate)を取得
例1では、12塩基(AGTGACGGTCTT)からなる一つの塩基配列(description行が">kadota")からなるFASTA形式ファイル(sample1.fasta)を入力として、
この塩基配列をアミノ酸配列に翻訳した結果を任意のファイル名(tmp2.fasta)で出力するやり方を示します。
例2では、RefSeqのhuman mRNAのmulti-fasta形式のファイル (h_rna.fasta)が手元にあったとして、
この塩基配列をアミノ酸配列に翻訳するやり方を示します。
現状では、406番目のID (NR_002762.1)の塩基配列の498番目の文字が「塩基ではない(not a base at pos 498)」となって、計算が途中でストップします。
調べた結果、この文字は"N"であることがわかりました。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
#例1:sample1.fastaファイルの場合
------ ここから ------
in_f <- "sample1.fasta" #multi-fasta形式のファイルを指定
out_f <- "tmp2.fasta" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- translate(reads) #readsをアミノ酸配列に翻訳したものをoutに格納
names(out) <- names(reads) #現状では翻訳した結果のオブジェクトoutのdescription行が消えてしまうようなので、description部分の情報に相当するnames(reads)をnames(out)に格納している
writeXStringSet(out, file=out_f, format="fasta", width=80) #outの中身をout_fで指定したファイル名で保存
------ ここまで ------
#例2:h_rna.fastaファイルの場合
------ ここから ------
in_f <- "h_rna.fasta" #multi-fasta形式のファイルを指定
out_f <- "tmp2.fasta" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- translate(reads) #readsをアミノ酸配列に翻訳したものをoutに格納
writeXStringSet(out, file=out_f, format="fasta", width=80) #outの中身をout_fで指定したファイル名で保存
------ ここまで ------
BioconductorのBiostringsのwebページ
イントロダクション | 一般 | 相補鎖(complement)を取得
例1では、12塩基(AGTGACGGTCTT)からなる一つの塩基配列(description行が">kadota")からなるFASTA形式ファイル(sample1.fasta)を入力として、
この塩基配列の相補鎖(complement)を任意のファイル名(tmp3.fasta)で出力するやり方を示します。
例2では、RefSeqのhuman mRNAのmulti-fasta形式のファイル (h_rna.fasta)が手元にあったとして、
この塩基配列の相補鎖(complement)を出力するやり方を示します。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
#例1:sample1.fastaファイルの場合
------ ここから ------
in_f <- "sample1.fasta" #multi-fasta形式のファイルを指定
out_f <- "tmp3.fasta" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- complement(reads) #readsオブジェクトの相補鎖をoutに格納
writeXStringSet(out, file=out_f, format="fasta", width=80) #outの中身をout_fで指定したファイル名で保存
------ ここまで ------
#例2:h_rna.fastaファイルの場合
------ ここから ------
in_f <- "h_rna.fasta" #multi-fasta形式のファイルを指定
out_f <- "tmp3.fasta" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- complement(reads) #readsオブジェクトの相補鎖をoutに格納
writeXStringSet(out, file=out_f, format="fasta", width=80) #outの中身をout_fで指定したファイル名で保存
------ ここまで ------
BioconductorのBiostringsのwebページ
イントロダクション | 一般 | 逆相補鎖(reverse complement)を取得
例1では、12塩基(AGTGACGGTCTT)からなる一つの塩基配列(description行が">kadota")からなるFASTA形式ファイル(sample1.fasta)を入力として、
この塩基配列の逆相補鎖(reverse complement)を任意のファイル名(tmp4.fasta)で出力するやり方を示します。
例2では、RefSeqのhuman mRNAのmulti-fasta形式のファイル (h_rna.fasta)が手元にあったとして、
この塩基配列の逆相補鎖(reverse complement)を出力することができます。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
#例1:sample1.fastaファイルの場合
------ ここから ------
in_f <- "sample1.fasta" #multi-fasta形式のファイルを指定
out_f <- "tmp4.fasta" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- reverseComplement(reads) #readsオブジェクトの逆相補鎖をoutに格納
writeXStringSet(out, file=out_f, format="fasta", width=80) #outの中身をout_fで指定したファイル名で保存
------ ここまで ------
#例2:h_rna.fastaファイルの場合
------ ここから ------
in_f <- "h_rna.fasta" #multi-fasta形式のファイルを指定
out_f <- "tmp4.fasta" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- reverseComplement(reads) #readsオブジェクトの逆相補鎖をoutに格納
writeXStringSet(out, file=out_f, format="fasta", width=80) #outの中身をout_fで指定したファイル名で保存
------ ここまで ------
BioconductorのBiostringsのwebページ
イントロダクション | 一般 | 逆鎖(reverse)を取得
例1では、12塩基(AGTGACGGTCTT)からなる一つの塩基配列(description行が">kadota")からなるFASTA形式ファイル(sample1.fasta)を入力として、
この塩基配列の逆鎖(reverse)を任意のファイル名(tmp4.fasta)で出力するやり方を示します。
例2では、RefSeqのhuman mRNAのmulti-fasta形式のファイル (h_rna.fasta)が手元にあったとして、
この塩基配列の逆鎖(reverse)を出力することができます。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
#例1:sample1.fastaファイルの場合
------ ここから ------
in_f <- "sample1.fasta" #multi-fasta形式のファイルを指定
out_f <- "tmp4.fasta" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- reverse(reads) #readsオブジェクトの逆鎖をoutに格納
writeXStringSet(out, file=out_f, format="fasta", width=80) #outの中身をout_fで指定したファイル名で保存
------ ここまで ------
#例2:h_rna.fastaファイルの場合
------ ここから ------
in_f <- "h_rna.fasta" #multi-fasta形式のファイルを指定
out_f <- "tmp4.fasta" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- reverse(reads) #readsオブジェクトの逆鎖をoutに格納
writeXStringSet(out, file=out_f, format="fasta", width=80) #outの中身をout_fで指定したファイル名で保存
------ ここまで ------
BioconductorのBiostringsのwebページ
イントロダクション | 一般 | 二連続塩基の出現頻度情報を取得
"AA", "AC", "AG", "AT", "CA", "CC", "CG", "CT", "GA", "GC", "GG", "GT", "TA", "TC", "TG", "TT"の計4^2 = 16通りの二連続塩基の出現頻度を調べるやり方を示します。
ここでは以下の二つを例題として行います:
1. 「イントロダクション | 一般 | ランダムな塩基配列を作成」の4.を実行して得られたmulti-fastaファイル(hoge4.fa)
2. 130MB程度のRefSeqのhuman mRNAのmulti-fastaファイル(h_rna.fasta)
h_rna.fastaの406番目のID (NR_002762.1)の塩基配列の498番目の文字が"N"なはずなのですが、これはどのように計算されているのでしょうか。。。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. hoge4.faファイルの場合:
------ ここから ------
in_f <- "hoge4.fa" #multi-fasta形式の入力ファイルを指定
out_f <- "hoge1.txt" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- dinucleotideFrequency(reads) #二連続塩基の出現頻度情報をoutに格納
tmp <- cbind(names(reads), out) #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
2. h_rna.fastaファイルの場合:
------ ここから ------
in_f <- "h_rna.fasta" #multi-fasta形式のファイルを指定
out_f <- "hoge2.txt" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- dinucleotideFrequency(reads) #二連続塩基の出現頻度情報をoutに格納
tmp <- cbind(names(reads), out) #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
BioconductorのBiostringsのwebページ
イントロダクション | 一般 | 三連続塩基の出現頻度情報を取得
4^3 = 64通りの三連続塩基の出現頻度を調べるやり方を示します。
ここでは以下の二つを例題として行います:
1. 「イントロダクション | 一般 | ランダムな塩基配列を作成」の4.を実行して得られたmulti-fastaファイル(hoge4.fa)
2. 130MB程度のRefSeqのhuman mRNAのmulti-fastaファイル(h_rna.fasta)
h_rna.fastaの406番目のID (NR_002762.1)の塩基配列の498番目の文字が"N"なはずなのですが、これはどのように計算されているのでしょうか。。。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. hoge4.faファイルの場合:
------ ここから ------
in_f <- "hoge4.fa" #multi-fasta形式の入力ファイルを指定
out_f <- "hoge1.txt" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- trinucleotideFrequency(reads) #三連続塩基の出現頻度情報をoutに格納
tmp <- cbind(names(reads), out) #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
2. h_rna.fastaファイルの場合:
------ ここから ------
in_f <- "h_rna.fasta" #multi-fasta形式のファイルを指定
out_f <- "hoge2.txt" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- trinucleotideFrequency(reads) #三連続塩基の出現頻度情報をoutに格納
tmp <- cbind(names(reads), out) #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
BioconductorのBiostringsのwebページ
イントロダクション | 一般 | 任意の長さの連続塩基の出現頻度情報を取得
4^n通りの任意のn連続塩基の出現頻度を調べるやり方を示します。
ここでは「イントロダクション | 一般 | ランダムな塩基配列を作成」の4.を実行して得られたmulti-fastaファイル(hoge4.fa)を入力としていくつかの例題を行います:
例えば二連続塩基の場合はn=2, 三連続塩基の場合はn=3と指定します。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. hoge4.faファイルで4連続塩基(n=4)の出現頻度情報がほしい場合:
------ ここから ------
in_f <- "hoge4.fa" #multi-fasta形式の入力ファイルを指定
out_f <- "hoge1.txt" #出力ファイル名を指定
param <- 4 #欲しい連続塩基の長さ情報を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- oligonucleotideFrequency(reads, width=param) #(param)連続塩基の出現頻度情報をoutに格納
tmp <- cbind(names(reads), out) #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
2. hoge4.faファイルで2連続塩基(n=2)の出現頻度情報がほしい場合:
------ ここから ------
in_f <- "hoge4.fa" #multi-fasta形式の入力ファイルを指定
out_f <- "hoge2.txt" #出力ファイル名を指定
param <- 2 #欲しい連続塩基の長さ情報を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- oligonucleotideFrequency(reads, width=param) #(param)連続塩基の出現頻度情報をoutに格納
tmp <- cbind(names(reads), out) #最初の列にID情報、そのあとに出現頻度情報のoutを結合したtmpを作成
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
3. hoge4.faファイルで2連続塩基(n=2)の全コンティグをまとめた出現頻度情報がほしい場合:
------ ここから ------
in_f <- "hoge4.fa" #multi-fasta形式の入力ファイルを指定
out_f <- "hoge3.txt" #出力ファイル名を指定
param <- 2 #欲しい連続塩基の長さ情報を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- oligonucleotideFrequency(reads, 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の中身をout_fで指定したファイル名で保存。
------ ここまで ------
4. hoge4.faファイルで2連続塩基(n=2)の全コンティグをまとめた出現確率情報がほしい場合:
------ ここから ------
in_f <- "hoge4.fa" #multi-fasta形式の入力ファイルを指定
out_f <- "hoge4.txt" #出力ファイル名を指定
param <- 2 #欲しい連続塩基の長さ情報を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
out <- oligonucleotideFrequency(reads, 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の中身をout_fで指定したファイル名で保存。
------ ここまで ------
BioconductorのBiostringsのwebページ
イントロダクション | NGS | NGSデータ取得
次世代シーケンサーから得られる塩基配列データを公共データベースから取得します。
データの形式は基本的にSanger typeのFASTQ形式です。
FASTA形式はリードあたり二行(idの行と配列の行)で表現します。
FASTQ形式はリードあたり4行(@から始まるidの行と配列の行、および+から始まるidの行とbase callの際のqualityの行)で表現します。
FASTQ形式は、Sangerのものがオリジナルで、Illuminaのプラットフォームから得られるのはFASTQ-like formatという表現がなされるようです。
NCBI SRAはSanger typeのデータです。
イントロダクション | NGS | NGSデータ取得(SRAdb)
RからもSRAdbパッケージを用いて配列を取得することができます。ここでは参考文献1のIllumina 35bp single endのデータ(accession number: SRA010153)の一部の取得を行います。
一部、というのは、ここ(http://www.ncbi.nlm.nih.gov/sra/SRA010153)にアクセスして、
phi X control laneを用いてベースコールしたBrain (SRX016359)とUHR (SRX016367)のデータのみの取得を行う、という意味です。
尚、得られるファイル形式は*.lite.sra形式です。基本的にはこのやり方でいいはずなんですが、なぜか現状ではfastq-dumpコマンドを使ってlite.sra形式からfastq形式に変換する際にエラーが出てしまうので、素直にウェブからダウンロードするほうが手っ取り早いです。。。
「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。
------ ここから ------
param <- "SRX016359" #accession番号を指定してparamに格納
#必要なパッケージなどをロード
library(SRAdb) #パッケージの読み込み
sqlfile <- getSRAdbFile() #おまじない(SRAmetadb.sqliteファイルを取得してsqlfileというオブジェクト名とする)
file.info(sqlfile) #おまじない(sqlfileの中身を表示させてるだけ)
sra_con <- dbConnect(SQLite(), sqlfile) #おまじない
rs <- listSRAfile(in_acc=param, sra_con=sra_con) #paramで指定したexperimentのaccessionから得られる"SRR"から始まるrunのaccession番号のURL情報を取得して、rsというオブジェクト名とする
for(i in 1:length(rs$sra)){ #"SRR"のアクセッション番号分だけループを回す
hoge <- unlist(strsplit(rs$sra[[i]], "/", fixed=TRUE)) #URLの文字列を"/"で分割した結果をhogeに保存
cat('downloading(',i, "/", length(rs$sra), ')', hoge[length(hoge)], "\n", sep="")#状況を表示
download.file(rs$sra[[i]], destfile=hoge[length(hoge)]) #rs$sra[[i]]で指定したURLのファイルをhoge[length(hoge)]で指定したファイル名で保存
}
param <- "SRX016367" #accession番号を指定してparamに格納
sqlfile <- getSRAdbFile() #おまじない(SRAmetadb.sqliteファイルを取得してsqlfileというオブジェクト名とする)
file.info(sqlfile) #おまじない(sqlfileの中身を表示させてるだけ)
sra_con <- dbConnect(SQLite(), sqlfile) #おまじない
rs <- listSRAfile(in_acc=param, sra_con=sra_con) #paramで指定したexperimentのaccessionから得られる"SRR"から始まるrunのaccession番号のURL情報を取得して、rsというオブジェクト名とする
for(i in 1:length(rs$sra)){ #"SRR"のアクセッション番号分だけループを回す
hoge <- unlist(strsplit(rs$sra[[i]], "/", fixed=TRUE)) #URLの文字列を"/"で分割した結果をhogeに保存
cat('downloading(',i, "/", length(rs$sra), ')', hoge[length(hoge)], "\n", sep="")#状況を表示
download.file(rs$sra[[i]], destfile=hoge[length(hoge)]) #rs$sra[[i]]で指定したURLのファイルをhoge[length(hoge)]で指定したファイル名で保存
}
------ ここまで ------
BioconductorのSRAdbのwebページ
参考文献1(Bullard et al., BMC Bioinformatics, 2010)
イントロダクション | NGS | マッピング | basic aligner
ここで紹介するのは、主にトランスクリプトーム配列へのマッピングを行うためのプログラムたちです。
イントロダクション | NGS | マッピング | splice-aware aligner (spliced readもマッピング可能なもの)で紹介するプログラムたちはいわゆるgapped alignmentが可能なプログラムなので複数のエクソンをまたぐリード(i.e., spliced reads)のマッピングも可能なので、ゲノム配列へのマッピング用に使われます。
が、splice-aware aligner (or spliced alignmer)は内部的にここで紹介するbasic aligner (or unspliced aligner)を使っています。basic alignerはアルゴリズム的な観点から大きく二種類に大別可能ですが、そのアルゴリズムの特性によって得手不得手がありますのでご注意ください。
また、論文自体は古くても、プログラムを頻繁にバージョンアップさせてよりよくなっている場合もありますので、出版年にこだわる必要はあまりないのではと思っています。
・(BLASTやFASTA的な昔からある)Seed-and-extend methods
このカテゴリに含まれる方法は、マップするshort readよりもさらに短い配列(これがいわゆる"seed"; 種)の完全一致(perfect match)領域をリファレンス配列から探し、このseed領域を拡張(extend)させてアラインメントするというスタンスのものたちです。
特徴としては、マップするリファレンス配列(ゲノム配列 or トランスクリプトーム配列)のクオリティが低い場合にも対応可能です。
したがって、近縁種のゲノムにマップしたいような場合には、内部的にこのカテゴリに含まれるプログラムを採用しているほうがより多くマップさせることができることが期待されます。
また、polymorphism (or sequence variation)の割合が高いようなものについても、こちらのカテゴリの方法のほうがよりよい結果を得られると期待されます。
以下のプログラムたちがこのカテゴリに含まれます:
SSAHA2 (Ning et al., Genome Res., 2001)
RMAP (Smith et al., BMC Bioinformatics, 2008)
MAQ (Li et al., Genome Res., 2008)
MOM (Eaves and Gao, Bioinformatics, 2009)
SHRiMP (Rumble et al., PLoS Comput. Biol., 2009)
RazerS (Weese et al., Genome Res., 2009)
PerM (Chen et al., Bioinformatics, 2009)
BFAST (Homer et al., PLoS One, 2009)
Novoalign (Krawitz et al., Bioinformatics, 2010)
GASSST (Rizk and Lavenier, Bioinformatics, 2010)
Stampy (Lunter and Goodson, Genome Res., 2011)
SHRiMP2 (David et al., Bioinformatics, 2011)
・Burrows-Wheeler transform (BWT) methods
このカテゴリに含まれる方法は、文字通りBWTというアルゴリズムを用いて効率的にマップしたいshort readsと完全一致(perfect match)する領域を探すものたちです。基本的にperfect matchを探すのに向いているため、ミスマッチを許容すると劇的に計算が遅くなります。
したがって、比較的きれいなトランスクリプトーム配列に対してマップさせたい場合には、このカテゴリに含まれるプログラムを用いるほうが計算時間的に有利だと思います。
short readのころには、このアルゴリズムを実装したプログラムがどんどんpublishされていたような印象がありますが、最近はどうなんでしょうね。こっち方面はあまりサーベイしていないのですが、プログラムのバージョンアップで多少のindelsに対しても頑健なものになっているのかもしれません。。。
以下のプログラムたちがこのカテゴリに含まれます:
Bowtie (Langmead et al., Genome Biol., 2009)
BWA (Li and Durbin, Bioinformatics, 2009(BWA-shortの論文))
SOAP2 (Li et al., Bioinformatics, 2009)
BWA (Li and Durbin, Bioinformatics, 2010(BWA-SWの論文))
Bowtie 2 (Langmead and Salzberg, Nat. Methods, 2012)
・比較的最近(2012年)のベンチマークデータでの比較解析論文
Schbath et al., J. Comput. Biol., 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
イントロダクション | NGS | マッピング | splice-aware aligner (spliced readもマッピング可能なもの)
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というものがあるようです。)
- BLAT (Kent WJ, Genome Res., 2002)
・その他:seed-and-extend aligner
- QPALMA (De Bona et al., Bioinformatics, 2008)
- TopHat (Trapnell et al., Bioinformatics, 2009)
・OS:Linux and Mac
・入力ファイル:FASTA and FASTQ
・出力形式:SAM format
・その他:リードあたり75bpで最適化しているようだ。Illumina and ABI SOLiD。Burrows-Wheeler Transform (BWT) aligner
- RNA-MATE (Cloonan et al., Bioinformatics, 2009)
- GSNAP (Wu et al., Bioinformatics, 2010)
・その他:seed-and-extend aligner
- SpliceMap (Au et al., Nucleic Acids Res., 2010)
- MapSplice (Wang et al., Nucleic Acids Res., 2010)
- HMMSplicer (Dimon et al., PLoS One, 2010)
- X-MATE (Wood et al., Bioinformatics, 2011)
・その他:RNA-MATEのアップデート版です
- RNASEQR (Chen et al., Nucleic Acids Res., 2012)
- PASSion (Zhang et al., Bioinformatics, 2012)
- ContextMap (Bonfert et al., BMC Bioinformatics, 2012)
Review:
Garber et al., Nat. Methods, 2011
イントロダクション | NGS | マッピング | プログラムの入力形式について
マップされる側の入力形式は基本的にFASTA形式です。マップする側の入力形式はFASTAとFASTQ形式がありますが、基本的にはSanger typeのFASTQ形式です。
マップする側のファイルがSanger typeのFASTQ形式ではない場合には、予めSanger typeの FASTQ形式に変換する必要があります。
例えばIlluminaの「"s_*_sequence.txt"という形式のファイル」や
「一配列を一行で表現したSCARF (Solexa compact ASCII read format)形式のファイル」
をSanger type FASTQ formatに変換するperl scriptは、マッピングプログラムMAQのページ中のfq_all2std.plです。
但し!!、マッピングプログラムによってはNCBI Sequence Read Archive (SRA)から得られるSanger typeのFASTQ形式ファイルをちゃんと読み込んでくれません。。。
これはファイル中のスペース(" ")が原因のようです。
NCBI Sequence Read Archive (SRA)から得られる*.fastqファイル
(例:SRR037439.fastq; 実在のファイルの最初の2000行分)の場合は、私はfastq_process.pl (or fastq_process2.pl)プログラムで処理したもの
(例:example.fastq2)をマッピングプログラムにかけています。
こうすることでマップ後のファイルサイズをかなり圧縮することが可能です。
ちなみにプログラムの実行方法は「fastq_process.pl SRR037439.fastq > SRR037439.fastq2」or 「fastq_process2.pl SRR037439.fastq > SRR037439.fastq2」で、実行前と実行後のファイルの最初の10行を念のため以下に示します:
--- SRR037439.fastq ---
@SRR037439.1 HWI-E4_6_30ACL:2:1:0:176 length=35
NNNNNNNNNNNNNNNCTACCCCCCCAGCCGCCGCA
+SRR037439.1 HWI-E4_6_30ACL:2:1:0:176 length=35
!!!!!!!!!!!!!!!""""""""""""""""#"""
@SRR037439.2 HWI-E4_6_30ACL:2:1:0:252 length=35
NNNNNNNNNNNNNNNAGACAGTTGATTTAGCATAG
+SRR037439.2 HWI-E4_6_30ACL:2:1:0:252 length=35
!!!!!!!!!!!!!!!"+"""""""""""""""""&
@SRR037439.3 HWI-E4_6_30ACL:2:1:0:1152 length=35
NNNNNNNNNNNNNNNGGGTGGGGCGTTTGTTCTT
--- fastq_process.plをかけた後のSRR037439.fastq2 ---
@SRR037439.1
NNNNNNNNNNNNNNNCTACCCCCCCAGCCGCCGCA
+SRR037439.1
!!!!!!!!!!!!!!!""""""""""""""""#"""
@SRR037439.2
NNNNNNNNNNNNNNNAGACAGTTGATTTAGCATAG
+SRR037439.2
!!!!!!!!!!!!!!!"+"""""""""""""""""&
@SRR037439.3
NNNNNNNNNNNNNNNGGGTGGGGCGTTTGTTCTTG
--- fastq_process2.plをかけた後のSRR037439.fastq2 ---
@1
NNNNNNNNNNNNNNNCTACCCCCCCAGCCGCCGCA
+1
!!!!!!!!!!!!!!!""""""""""""""""#"""
@2
NNNNNNNNNNNNNNNAGACAGTTGATTTAGCATAG
+2
!!!!!!!!!!!!!!!"+"""""""""""""""""&
@3
NNNNNNNNNNNNNNNGGGTGGGGCGTTTGTTCTTG
次にRでfastq_process.plと同じことをやる方法について記述します。(2011/08/03追加)
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "SRR037439_2.fastq" #出力ファイル名を指定してout_fに格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
reads <- readFastq(in_f) #in_fで指定したファイルの読み込み
hoge <- strsplit(as.character(id(reads)), " ", fixed=TRUE) #id(reads)中の文字列を" "で区切った結果をリスト形式でhogeに格納
out <- ShortReadQ(sread(reads), quality(reads), BStringSet(sapply(hoge,"[[", 1)))#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをoutに格納
writeFastq(out, out_f) #オブジェクトoutをFASTQ形式で保存
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
イントロダクション | NGS | マッピング | プログラムの出力形式について
マッピング | basic alignerを眺めると、いろいろな出力形式があることがわかります。
注目すべきは、Sequence Alignment/Map (SAM) formatです。
この形式は国際共同研究の1000人のゲノムを解析するという1000 Genomes Projectで採用された(開発された)フォーマットで、("@"から始まる)header sectionと(そうでない)alignment sectionから構成されています。
このヒトの目で解読可能な形式がSAMフォーマットで、このバイナリ版がBinary Alignment/Map (BAM)フォーマットというものです。今後SAM/BAM formatという記述をよく見かけるようになることでしょう。
代表的な出力ファイル形式:
イントロダクション | NGS | マッピング | (ESTレベルの長さの) contig
いくつか挙げておきます:
Trans-ABySSの論文中では、exonerate(のest2genomeというモード)でcontigをマウスゲノムにマップしています(参考文献1)。また、SPALNはcDNA配列をゲノムにマップするものですが、私自身がEST配列をゲノムにマップする目的で使用した経験があります。
・exonerate (Slater and Birney, BMC Bioinformatics, 2005)
・SPALN (Gotoh O., Nucleic Acids Res., 2008)
参考文献1(Robertson et al., Nature Methods, 2010)
イントロダクション | NGS | ファイル形式の変換
ごちゃませですがとりあえず...
以下の2011年10月ごろ気付いたのですが、以下のqseq2fastq.plプログラムを用いてfastq形式ファイルへの変換をすると、なぜか元の*qseq.txtファイル中の並びにならないバグ?!があります。
特に、paired-endファイルのときには、独立にqseq2fastq.plプログラムを実行して、二つのファイル(例えばread1.fqとread2.fqファイル)を得ることになるのですが、この二つのファイル中のIDの並びもまた同じ行に同じIDがこないという不思議な現象に遭遇しています。
これはアセンブル時にどういう影響を与えるのかわかりません(現在調査中)がいずれにしても気持ち悪いので、Rで変換するプログラムを最近作りました。
イントロダクション | NGS | アセンブルプログラムについて
アセンブルという言葉がなかなか理解しずらい人は、単純に「多重配列アラインメント(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など比較的長い配列(数百塩基程度)のアセンブルを目的としたものが多いようです。
・ARACHNE (Batzoglou et al., Genome Res, 2002)
・CABOG (Miller et al., Bioinformatics, 2008)
・Celera Assembler (Myers et al., Science, 2000)
・Edena (Hernandez et al., Genome Res., 2008)
・Newbler (Margulies et al., Nature, 2005)
・PCAP (Huang et al., Genome Res., 2003)
・SHORTY (Hossain et al., BMC Bioinformatics, 2009)
二つめは「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アプローチ」に移行していくという可能性もあるのではないかと思っています。
・ABySS (Simpson et al., Genome Res., 2009)
・ALLPATHS-LG (Maccallum et al., Genome Biol., 2009)
・EULER-SR (Chaisson et al., Genome Res., 2009)
・SOAPdenovo (Li et al., Genome Res., 2010)
・Velvet (Zerbino and Birney, Genome Res., 2008)
三つめは「貪欲法(Greedy algorithm)」に基づくもので、
・SSAKE (Warren et al., Bioinformatics, 2007)
・SHARCGS (Dohm et al., Genome Res., 2007)
・VCAKE (Jeck et al., Bioinformatics, 2007)
などがこのアプローチに含まれます。
ここで述べた以外にもこの分類体系でうまく表現できないものもあります。。。
参考文献1(Phillippy et al., Genome Biol., 2008)
参考文献2(Pevzner et al., PNAS, 2001)
参考文献3(Chaisson et al., Bioinformatics, 2004)
参考文献4(Chaisson et al., Genome Res., 2008)
参考文献5(Chaisson et al., Genome Res., 2009)
参考文献X(Miller et al., Genomics, 2010)
イントロダクション | NGS | アセンブルプログラム(ゲノム)
多少間違っている可能性もありますし、バージョンアップで別のプラットフォームに対応可能になっていることもありますので、予めご容赦ください。
SEQanswers中にはプラットフォームごとのではなく、プログラムごとの説明もあります(例えばABySS)。
ABI SOLiD用:
Illumina用:
- Phusion (Mullikin and Ning, Genome Res., 2003)
- SSAKE (Warren et al., Bioinformatics, 2007)
- VCAKE (Jeck et al., Bioinformatics, 2007)
- SHARCGS (Dohm et al., Genome Res., 2007)
- Edena (bacteria程度用か!?; single-end and uniform length only?!) (Hernandez et al., Genome Res., 2008)
- Velvet (Zerbino and Birney, Genome Res., 2008)
- EULER-SR (Chaisson et al., Genome Res., 2009)
- ABySS (Simpson et al., Genome Res., 2009)
- Taipan (Schmidt et al., Bioinformatics, 2009)
- MIRA (Diguistini et al., Genome Biol., 2009)
- ALLPATHS-LG (Maccallum et al., Genome Biol., 2009)
- SOAPdenovo (Li et al., Genome Res., 2010)
- Platanus (論文はまだ?!)
Roche 454用:
- Phusion (Mullikin and Ning, Genome Res., 2003)
- PCAP (Huang et al., Genome Res., 2003)
- Newbler (Margulies et al., Nature, 2005)
- Velvet (Zerbino and Birney, Genome Res., 2008)
- CABOG (Miller et al., Bioinformatics, 2008)
- EULER-SR (Chaisson et al., Genome Res., 2009)
- ABySS (Simpson et al., Genome Res., 2009)
- MIRA (Diguistini et al., Genome Biol., 2009)
とりあえずリストアップ:
イントロダクション | NGS | アセンブルプログラム(転写物)
多少間違っている可能性もありますし、バージョンアップで別のプラットフォームに対応可能になっていることもありますので、予めご承知おきください。
ここでは非モデル生物解析を意識して「de novo trancriptome assembly」のものを列挙しました。
よって、ScriptureやCufflinksなどのゲノム配列やその他の情報を利用するものはreference-based methodsの項目に入れています。
基本的な戦略1
どの方法も基本的にアセンブルする(配列同士を連結する)かどうかの判断基準として、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の範囲にしています。
基本的な戦略2
また、(これは今のところRnnotatorのみにしか実装されていない?!)非翻訳領域(untranslated region; UTR)が重複しているような複数の遺伝子が同じコンティグ上に含まれる(gene fusion)場合や、
そうでないキメラアセンブリでもコンティグ上にリードをマップすることではっきりとstrandの向きが変わっているようなものを見つけることができます。
そのようなコンティグ上のtransition pointをうまく分断する(splitting contig)ことでより精度の高いコンティグを作成する方向にプログラムが進化していくことでしょう。
非モデル生物の比較トランスクリプトーム解析はどうする?
私の戦略は、
1. 比較する二つのサンプルのリードを一つのサンプルだとしてde novo (transcriptome) assemblyを行います。
こうすることで同一転写物が同じコンティグに含まれるので、「昔ながらの双方向ベストヒットがどーのこーの。。。」というめんどくささから解放されます。
この際、リード数が膨大になるので予めsort unique (重複のないリードの集合に)しておくことで、圧倒的な計算時間の短縮がなされることでしょう。(これはRnnotatorの"duplicate read removal"と同じです)
2. 得られたコンティグ上に再び重複ありのリードをマップします。
比較する二サンプル由来リードの両方がマップされているコンティグのみの情報を使うのは基本中の基本ですが、さらにこの中にも発現変動コンティグ(differentially expressed contigs)が含まれている(はずだし、そういうのを見つけることを目的としてやっている)ので、
とりあえずtrimmed meanとかmedianとかで正規化します。この際発現量をどのように定量化するか?という問題もありますが、average coverageあたりが計算が軽くてわかりやすいかなと思っています。
3. なんらかの統計量を用いて発現変動コンティグをランキングし、RT-PCRなどで確認、アノテーション。
このあたりは、まだde novo trancriptome assemblyの方法論が固まりつつある段階ですので、その後の解析をどうするか?といったあたりはまだ手つかずだと思っています。
どのアセンブリ法がいいか?どの正規化法がいいか?どの定量化法がいいか?どのランキング法がいいか?といったあたりに取り組んでいます。
ちなみにkは奇数(odd number)しかないのはなぜでしょう?それはパリンドローム(palindrome)を回避するためです。
例えば5'-ACGTTGCA-3'という配列でk=8を考えてみるとこの相補鎖も全く同じ(そういう配列がパリンドロームだから)で混乱してしまいますが、kが例えば7や9のような奇数なら相補鎖にマッチすることはないのでパリンドローム問題にぶち当たることはないわけです。
ABI SOLiD用:
Illumina用:
- Multiple-k (Surget-Groba and Montoya-Burgos, Genome Res., 2010)
- Trans-ABySS (Robertson et al., Nature Methods, 2010; v1.2.0のマニュアル)
- Rnnotator (欲しければ著者にメールか?!) (Martin et al., BMC Genomics, 2010)
- Trinity (Grabherr et al., Nature Biotechnol, 2011)
- Oases ((Schulz et al., Bioinformatics, 2012))
Roche 454用:
reference-based methods(遺伝子構造推定):
- Scripture (Guttman et al., Nature Biotechnol., 2010)
- Cufflinks (Trapnell et al., Nature Biotechnol., 2010)
- STM (Surget-Groba and Montoya-Burgos, Genome Res., 2010)
- ALEXA-seq (Griffith et al., Nat Methods, 2010)
- ARTADE2 (Kawaguchi et al., Bioinformatics, 2012)
- Plntron (Pirola et al., BMC Bioinformatics, 2012)
Review:
Martin and Wang, Nat. Rev. Genet., 2011
備忘録:
Trans-ABySSインストール後にマニュアルにNCBIStandalone.pyファイルの中身を書き換えろ、とあった。このファイルがどこにあるのかわからず困ったので、検索の仕方を書き置き
「find /usr -name NCBIStandalone.py」
このときのファイルは1146行目だった。
イントロダクション | NGS | アセンブル後のmulti-fastaファイルからN50などの基本情報を取得
アセンブルプログラムを実行して得られるmulti-fastaファイルを読み込んで、Total lengthやaverage lengthなどの各種情報取得を行うためのやり方を示します。
ここでは以下の二つを例題として行います:
1. 「イントロダクション | 一般 | ランダムな塩基配列を作成」の4.を実行して得られたmulti-fastaファイル(hoge4.fa)
2. 130MB程度のRefSeqのhuman mRNAのmulti-fastaファイル(h_rna.fasta)
「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。
1. hoge4.faファイルの場合:
------ ここから ------
in_f <- "hoge4.fa" #multi-fasta形式の入力ファイルを指定
out_f <- "hoge1.txt" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
Total_length <- sum(width(reads)) #コンティグの「トータルの長さ」の情報を取得
Number_of_contigs <- length(reads) #「コンティグ数」の情報を取得
Average_length <- mean(width(reads)) #コンティグの「平均長」の情報を取得
Median_length <- median(width(reads)) #コンティグの「中央値」の情報を取得
Max_length <- max(width(reads)) #コンティグの長さの「最大値」の情報を取得
Min_length <- min(width(reads)) #コンティグの長さの「最小値」の情報を取得
#N50計算のところ
sorted_length <- rev(sort(width(reads))) #長さ情報を降順にソートした結果をsorted_lengthに格納
N50 <- sorted_length[cumsum(sorted_length) >= Total_length/2][1] #「N50」(長いものから足しこんでいってTotal_lengthの半分に達したときのコンティグの長さ、のこと)の情報を取得
#GC含量(GC content)計算のところ
count <- alphabetFrequency(reads) #A,C,G,T,..の数を各配列ごとにカウントした結果をcountに格納
CG <- rowSums(count[,2:3]) #C,Gの総数を計算してCGに格納
ACGT <- rowSums(count[,1:4]) #A,C,G,Tの総数を計算してACGTに格納
GC_content <- sum(CG)/sum(ACGT) #トータルのGC含量の情報を取得
#出力用に結果をまとめている
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_length))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_length))
tmp <- rbind(tmp, c("Median length", Median_length))
tmp <- rbind(tmp, c("Max length", Max_length))
tmp <- rbind(tmp, c("Min length", Min_length))
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の中身をout_fで指定したファイル名で保存。
------ ここまで ------
2. h_rna.fastaファイルの場合:
------ ここから ------
in_f <- "h_rna.fasta" #multi-fasta形式の入力ファイルを指定
out_f <- "hoge2.txt" #出力ファイル名を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
Total_length <- sum(width(reads)) #コンティグの「トータルの長さ」の情報を取得
Number_of_contigs <- length(reads) #「コンティグ数」の情報を取得
Average_length <- mean(width(reads)) #コンティグの「平均長」の情報を取得
Median_length <- median(width(reads)) #コンティグの「中央値」の情報を取得
Max_length <- max(width(reads)) #コンティグの長さの「最大値」の情報を取得
Min_length <- min(width(reads)) #コンティグの長さの「最小値」の情報を取得
#N50計算のところ
sorted_length <- rev(sort(width(reads))) #長さ情報を降順にソートした結果をsorted_lengthに格納
N50 <- sorted_length[cumsum(sorted_length) >= Total_length/2][1] #「N50」(長いものから足しこんでいってTotal_lengthの半分に達したときのコンティグの長さ、のこと)の情報を取得
#GC含量(GC content)計算のところ
count <- alphabetFrequency(reads) #A,C,G,T,..の数を各配列ごとにカウントした結果をcountに格納
CG <- rowSums(count[,2:3]) #C,Gの総数を計算してCGに格納
ACGT <- rowSums(count[,1:4]) #A,C,G,Tの総数を計算してACGTに格納
GC_content <- sum(CG)/sum(ACGT) #トータルのGC含量の情報を取得
#出力用に結果をまとめている
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_length))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_length))
tmp <- rbind(tmp, c("Median length", Median_length))
tmp <- rbind(tmp, c("Max length", Max_length))
tmp <- rbind(tmp, c("Min length", Min_length))
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の中身をout_fで指定したファイル名で保存。
------ ここまで ------
イントロダクション | NGS | 可視化ツール(R用)
可視化ツールも結構あります。
イントロダクション | NGS | 可視化ツール(それ以外)
可視化ツールも結構あります。
- EagleView (Huang and Marth, Genome Res., 2008)
・OS:Linux and Windows, and Mac
- MagicViewer (Hou et al., Nucleic Acids Res., 2010)
・OS:Linux and Windows, and Mac
- MapView (Bao et al., Bioinformatics, 2009)
・OS:Linux and Windows
- NGSView (Arner et al., Bioinformatics, 2010)
・OS:Linux
- Tablet (Milne et al., Bioinformatics, 2010)
・OS:Linux and Windows, and Mac
- ZOOM Lite (Zhang et al., Nucleic Acids Res., 2010)
・OS:Linux and Windows
イントロダクション | NGSとqPCRやmicroarrayなどとの比較
一言でいえば、3者の再現性は高いようです。
前処理 | についてでも述べていますが、NGS (RNA-seq)データも(マイクロアレイのときと同様に)
-------------------------------------------------------
1. 発現レベルをどのようにして見積もるか(定量化するか)
2. サンプル間比較をするためにどのように正規化するか
-------------------------------------------------------
という論文が出ています。
まず、1についてですが、様々な定量化の方法が提案されており、数十個程度の遺伝子についてRT-PCR
(qPCR?! or (半)定量PCR?! <-このあたりの用語に違いがあるのかといったあたりについては無知です)
の結果との比較を行い、定量化法の良しあしを評価しています。
・NGS vs. RT-PCR('t Hoen et al., Nucleic Acids Res., 2008のFigure 4)
・NGS vs. RT-PCR(MAQCサンプルの論文; Mane et al., BMC Genomics, 2009のFigure 3b)
・NGS vs. RT-PCR(MAQCサンプルの論文; Asmann et al., BMC Genomics, 2009のFigure 4)
・NGS vs. RT-PCR(NACの論文; Griffith et al., Nat. Methods, 2010のFigure 2)
・NGS vs. RT-PCR(FVKMの論文; Lee et al., Nucleic Acids Res., 2010のFigures 2 and 3)
・NGS vs. microarray(RPKMの論文; Mortazavi et al., Nat Methods, 2008のFigure 3)
・NGS vs. microarray(virtual lengthの論文; Sultan et al., Science, 2008のFigure 2)
・NGS vs. microarray(Marioni et al., Genome Res., 2008のFigures 3 and 4)
・NGS vs. microarray('t Hoen et al., Nucleic Acids Res., 2008のFigure 3)
・NGS vs. microarray(MAQCサンプルの論文; Mane et al., BMC Genomics, 2009のSupplementary Figureの下半分)
・NGS vs. microarray(Solasの論文; Richard et al., Nucleic Acids Res., 2010のSupplementary Figure S8)
・NGS vs. microarray(NACの論文; Griffith et al., Nat. Methods, 2010のSupplementary Figure 9a,b)
・microarray vs. RT-PCR(MAQCサンプルの論文; Mane et al., BMC Genomics, 2009のSupplementary Figureの上半分)
・三者比較(Bullard et al., BMC Bioinformatics, 2010のFigure S7の左下(lower triangle))
・三者比較(microRNAの論文; Pradervand et al., Biotechniques, 2010のFigure 1)
参考文献2(Trapnell et al., Nature Biotechnol., 2010)
ファイルの読み込み | マップ前 | FASTQ形式
FASTQ形式のファイルは、塩基配列情報のほかにベースコール(base call)した際のクオリティ情報(昔でいうところのPHRED score)も含むファイルです。
したがって、そのファイルサイズはFASTA形式ファイルの約二倍です。
歴史:
昔は、Sanger法で得られた塩基配列情報に(よって当時はクオリティ情報は0-93の数値の範囲からなるPHREDスコアで表現されていた)PHREDスコアの間に"スペース"を入れたQUAL形式が一般的でした。
しかし、"スペース"の情報もメモリを消費しますので、一つの塩基に対してつけられる最大二けたからなるPHREDスコアをスペースもなくして一つの文字コード(より正確にはASCII printable character中の"スペース"を除く文字コード)で表現する、というのがもともとのコンセプトです(そうすることで塩基配列の長さと同じ長さのquality情報となるのでうれしい)。
ASCII printable character (ASCII印字可能文字)とは、全部で128個からなる(この表現は不正確かもしれないが...)ASCII文字コードのうち最初の32文字(10進数でいうところのASCII 0からASCII 31)よりあとのASCII 32-126に相当する文字コードのことです。
ただし、ASCII 32は"スペース"に相当するものですので、具体的には以下のような対応表に基づいてPHREDスコアを一つの文字コードで表現しています。(ASCII 33-126に対応する文字コード表はこちら)
Sanger PHREDスコア0 <--> ! (ASCII 33 に相当)
Sanger PHREDスコア1 <--> " (ASCII 34 に相当)
Sanger PHREDスコア2 <--> # (ASCII 35 に相当)
Sanger PHREDスコア3 <--> $ (ASCII 36 に相当)
...
Sanger PHREDスコア92 <--> } (ASCII 125 に相当)
Sanger PHREDスコア93 <--> ~ (ASCII 126 に相当)
別な言い方をすると、Sanger FASTQ形式ファイルはPHREDスコア0-93を表現するのにASCII 33-126を使っている、ということになります。
変換自体は至ってシンプルにできます。例えば「ASCII 33が!」といったことさえわかっていれば、その33という数値はPHREDスコアに33を足せばいいだけだからです。
上記はオリジナルの「Sanger FASTQ形式 (Sanger standard)」についての説明でしたが、現実にはこのほかにも「Solexa FASTQ形式」 や「Illumina FASTQ形式」があります(Solexaはその後Illuminaに買収されたので、よくIllumina/Solexaなどの表現がなされます)。
そして厄介なことに、SolexaというNGSプラットフォームから出力されるquality scoreは独自のものであり、値の範囲も-5から62となっています。Solexaはこれらの値をASCIIコードの59-126であらわしています:
Solexaスコア -5 <--> ; (ASCII 59 に相当)
Solexaスコア -4 <--> < (ASCII 60 に相当)
...
Solexaスコア 61 <--> } (ASCII 125 に相当)
Solexaスコア 62 <--> ~ (ASCII 126 に相当)
Solexaはその後Illuminaに買収され、Illuminaの比較的最近のバージョンの機器は、昔のSolexa scoreではなくPHRED scoreに変わっています。
が、そのPHRED scoreの値の範囲は0から62であり、ASCIIコードの64-126であらわしているので、このあたりの取り扱いは注意が必要です。
また、、、どのバージョン由来のデータなのかを自動判定するのは、原著論文中の記述が間違っている場合もあるので、、、結構厄介です。
その一方で、多くのプログラムがSanger FASTQ形式をサポートしているので、最も手っ取り早いのはIllumina FASTQ形式などのファイルを早めにSanger FASTQ形式に変換しておくことです。
ちなみにNCBI SRA中のデータは全てSanger FASTQ形式に変換されたものだったと思います。
ここまで理解できれば、あとは参考文献1ご覧になることで、より詳細な理解が進むと思われます。
本題:
ここでは、NCBI Sequence Read Archive (SRA)から得られる(従ってSanger FASTQ形式)
FASTQ形式ファイル(例としてSRR037439.fastq; 実在のファイルの最初の2000行分)を読み込んで単純に塩基配列情報のみを読み込むやり方と、そのquality情報も含めて読み込むやり方を紹介します。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. readDNAStringSet関数を用いた場合(quality情報は読み込まれない):
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fastq") #in_fで指定したファイルの読み込み
reads #readsの中身を表示
------ ここまで ------
2. readFastq関数を用いてquality情報も取り扱いたい場合:
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
hoge <- readFastq(in_f) #in_fで指定したファイルの読み込み
hoge #hogeオブジェクトの中身を表示させてるだけ("ShortReadQ"というクラスのオブジェクトであることがわかる)
showClass("ShortReadQ") #ShortReadQ"というクラスのオブジェクトからどのように情報を取得するかを調べたい場合
reads <- sread(hoge) #塩基配列情報を取り出してreadsに格納
qualities <- quality(hoge) #quality情報を取り出してqualitiesに格納
ids <- id(hoge) #id情報を取り出してidsに格納
------ ここまで ------
3. readFastq関数を用いて読み込み、description行の" "以降の文字を削除して、またFASTQ形式で保存したい場合:
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "SRR037439_2.fastq" #出力ファイル名を指定してout_fに格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
reads <- readFastq(in_f) #in_fで指定したファイルの読み込み
hoge <- strsplit(as.character(id(reads)), " ", fixed=TRUE) #id(reads)中の文字列を" "で区切った結果をリスト形式でhogeに格納
serial <- sapply(hoge,"[[", 1) #hogeのリスト中の一番目の要素のみ取り出してserialに格納
#id(reads) <- BStringSet(serial) #id(reads)中の文字列を「serialをBStringSetオブジェクト化したもの」で置き換えることはできないようだ...なのでとりあえず以下のようにしている
out <- ShortReadQ(sread(reads), quality(reads), BStringSet(serial))#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをoutに格納
writeFastq(out, out_f) #オブジェクトoutをFASTQ形式で保存
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
参考文献1(Cock et al., Nucleic Acids Res., 2010)
ファイルの読み込み | マップ前 | FASTA形式
ここでは(multi-)FASTA形式ファイルを読み込むやり方を、250 readsからなるtest1.fastaファイルを例として解説します。
readFASTAという関数を使っても読み込めるのですが、ここで紹介しているreadDNAStringSet関数のほうがメモリ消費量が圧倒的に少ないのでお勧めです。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
in_f <- "test1.fasta" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルの読み込み
#以下は(こんなこともできますという)おまけ
#description部分と配列長をファイルに保存
out_f <- "hoge.txt" #出力ファイル名を指定
width(reads) #配列長情報を表示
tmp <- cbind(names(reads), width(reads))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
#description部分と配列長+アルファをファイルに保存
out_f <- "hoge2.txt" #出力ファイル名を指定
width(reads) #配列長情報を表示
tmp <- cbind("source", paste("1..", width(reads), sep=""), "note", paste("contig: ", names(reads), sep=""), "", paste("Bombyx mori DNA, W chromosome, contig: ", names(reads), sep=""))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
BioconductorのBiostringsのwebページ
ファイルの読み込み | マップ前 | Illuminaの*_seq.txt
Illuminaの出力ファイルで、初期のものは*_seq.txtというものらしいです。
実際の生の配列データファイルは数百程度に分割されています。ここでは、そのファイル群がおさめられているディレクトリ(例:tmp)を指定して、その中の「*_seq.txt」ファイル群について一気に行う方法を示します。
ここでは、(s_1_0001_seq.txtとs_1_0007_seq.txtの二つのファイルを含む; それぞれ1394行および826行からなる)「tmp」という名前のフォルダ(”ディレクトリ”と同じ意味)がデスクトップ上にあることを想定して行います。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
param1 <- "s_1_.*_seq.txt" #"s_1_*_seq.txt"という感じのファイル名のものを読み込みたい場合("."の有無に注意!!)
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
files <- list.files(getwd(), pattern=param1) #param1で指定した正規表現にマッチする文字列を含むファイルのリストをfilesに格納
strsplit(readLines(files[[1]],1), "\t") #filesで読み込んだファイルのリストについて、最初のファイルの一行目をタブで区切って表示させているだけ。5列目のデータが塩基配列情報だということを確認しているにすぎない。
colClasses <- c(rep(list(NULL), 4), "DNAString") #DNAStringSetというオブジェクト形式にするための情報を予め作成している。最初の4列には"NULL"を、最後の5列目には"DNAString"というベクトルを作成してcolClassesに格納している
reads <- readXStringColumns(getwd(), param1, colClasses = colClasses)#colClassesで指定した列(この場合5列目)をreadXStringColumns関数を用いて読み込むことでXStringSetオブジェクト(この場合"X"は"DNA"に相当)にした結果をreadsに格納
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
ファイルの読み込み | マップ前 | Illuminaの*_qseq.txt
Illuminaの出力ファイルで、比較的最近のは*_qseq.txtというものらしいです。
実際の生の配列データファイルは数百程度に分割されています。ここでは、そのファイル群がおさめられているディレクトリ(例:tmp)を指定して、その中の「*_qseq.txt」ファイル群について一気に行う方法を示します。
ここでは、(s_1_1_0005_qseq.txtとs_1_1_0015_qseq.txtの二つのファイルを含む; それぞれ114行および73行からなる)「tmp」という名前のフォルダ(”ディレクトリ”と同じ意味)がデスクトップ上にあることを想定して行います。
以下のスクリプトでは、hogeオブジェクトを得た時点でhoge[[1]]が塩基配列情報、hoge[[2]]がquality情報ということで最低限必要な情報を得られていることになります。
別の場所でも書いていますが、一口にFASTQ形式といってもいろんなバージョンがあります。ここでは、以下の複数の場合を示します:
尚、Sanger FASTQファイルで出力するところでは(ベタで)ややこしいことをやっていますが、これはquality scoreを表現するASCII characterの範囲が異なるために、
例えばIllumina FASTQのASCII 64 (@に相当)はSanger FASTQのASCII33 (!に相当)に対応しますよ、という文字列置換を明確に一文字ずつやっているためです。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. qseqファイルの読み込みのところまでの場合:
以下はreadの塩基配列とqualityスコア部分の抽出のみの基本形です。
------ ここから ------
param1 <- "s_._._.*_qseq.txt" #"s_*_*_*_qseq.txt"という感じのファイル名のものを読み込みたい場合("."の有無に注意!!)
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
files <- list.files(getwd(), pattern=param1) #param1で指定した正規表現にマッチする文字列を含むファイルのリストをfilesに格納
strsplit(readLines(files[1], 1), "\t") #全部で11列あり、9列目が塩基配列情報、10列目がquality情報だということを確認しているだけ
colClasses <- rep(list(NULL), 11) #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[9:10] <- c("DNAString", "BString") #DNAStringSetというオブジェクト形式にするための情報を予め作成している。9, 10列目がそれぞれ"DNAString", "BString"だという情報を与えている
hoge <- readXStringColumns(getwd(), param1, colClasses = colClasses)#colClassesで指定した列(この場合5列目)をreadXStringColumns関数を用いて読み込むことでXStringSetオブジェクト(この場合"X"は"DNA"に相当)にした結果をhogeに格納
------ ここまで ------
2. Illumina FASTQ形式ファイルとして保存したい場合(descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしたい場合):
つまり、descriptionのところをqseq形式ファイルの「3列目(レーン番号)」:「4列目」:「5列目」:「6列目」:「11列目(pass filterフラグ情報)」で表す場合です。
------ ここから ------
param1 <- "s_._._.*_qseq.txt" #"s_*_*_****_qseq.txt"という感じのファイル名のものを読み込みたい場合("."の有無に注意!!)
out_f <- "hoge_illumina.fq" #出力ファイル名を指定してout_fに格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
files <- list.files(getwd(), pattern=param1) #param1で指定した正規表現にマッチする文字列を含むファイルのリストをfilesに格納
strsplit(readLines(files[1], 1), "\t") #全部で11列あり、9列目が塩基配列情報、10列目がquality情報だということを確認しているだけ
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(), param1, colClasses = colClasses)#colClassesで指定した列(この場合5列目)をreadXStringColumns関数を用いて読み込むことでXStringSetオブジェクト(この場合"X"は"DNA"に相当)にした結果をhogeに格納
sequence <- hoge[[5]] #readの塩基配列情報部分をsequenceに格納
sequence <- chartr("-", "N", sequence) #"-"になっているものを"N"に置換
quality_s <- hoge[[6]] #readのquality情報部分をquality_sに格納
#FASTQ形式のdescription部分を作成
description <- paste(hoge[[1]], hoge[[2]], hoge[[3]], hoge[[4]], hoge[[7]], sep=":")#FASTQ形式のdescription部分を作成している
out <- ShortReadQ(sequence, quality_s, BStringSet(description)) #ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをoutに格納
writeFastq(out, out_f) #オブジェクトoutをFASTQ形式で保存
------ ここまで ------
3. Illumina FASTQ形式ファイルとして保存したい場合(descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしたい場合):
つまり、descriptionのところをqseq形式ファイルの「3列目(レーン番号)」:「4列目」:「5列目」:「6列目」:「11列目(pass filteringフラグ情報)」で表す場合です。
2と異なる点は、paired-endのファイルをアセンブルするときにはdescriptionのところに"/1"とか"/2"という追加の記述をしておく必要がある場合(例では"/2"を追加したい場合)に以下のやり方を用います。
------ ここから ------
param1 <- "s_._._.*_qseq.txt" #"s_*_*_****_qseq.txt"という感じのファイル名のものを読み込みたい場合("."の有無に注意!!)
param2 <- "/2" #"/2"という記述をdescription行に追加したい場合
out_f <- "hoge_illumina2.fq" #出力ファイル名を指定してout_fに格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
files <- list.files(getwd(), pattern=param1) #param1で指定した正規表現にマッチする文字列を含むファイルのリストをfilesに格納
strsplit(readLines(files[1], 1), "\t") #全部で11列あり、9列目が塩基配列情報、10列目がquality情報だということを確認しているだけ
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(), param1, colClasses = colClasses)#colClassesで指定した列(この場合5列目)をreadXStringColumns関数を用いて読み込むことでXStringSetオブジェクト(この場合"X"は"DNA"に相当)にした結果をhogeに格納
sequence <- hoge[[5]] #readの塩基配列情報部分をsequenceに格納
sequence <- chartr("-", "N", sequence) #"-"になっているものを"N"に置換
quality_s <- hoge[[6]] #readのquality情報部分をquality_sに格納
#FASTQ形式のdescription部分を作成
description <- paste(hoge[[1]], hoge[[2]], hoge[[3]], hoge[[4]], hoge[[7]], sep=":")#FASTQ形式のdescription部分を作成している
description <- paste(description, param2, sep="") #param2で指定した記述内容の追加
out <- ShortReadQ(sequence, quality_s, BStringSet(description)) #ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをoutに格納
writeFastq(out, out_f) #オブジェクトoutをFASTQ形式で保存
------ ここまで ------
4. Sanger FASTQ形式ファイルとして保存したい場合:
------ ここから ------
param1 <- "s_._._.*_qseq.txt" #"s_*_*_****_qseq.txt"という感じのファイル名のものを読み込みたい場合("."の有無に注意!!)
param2 <- "/2" #"/2"という記述をdescription行に追加したい場合
out_f <- "hoge_sanger2.fq" #出力ファイル名を指定してout_fに格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
files <- list.files(getwd(), pattern=param1) #param1で指定した正規表現にマッチする文字列を含むファイルのリストをfilesに格納
strsplit(readLines(files[1], 1), "\t") #全部で11列あり、9列目が塩基配列情報、10列目がquality情報だということを確認しているだけ
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(), param1, colClasses = colClasses)#colClassesで指定した列(この場合5列目)をreadXStringColumns関数を用いて読み込むことでXStringSetオブジェクト(この場合"X"は"DNA"に相当)にした結果をhogeに格納
sequence <- hoge[[5]] #readの塩基配列情報部分をsequenceに格納
sequence <- chartr("-", "N", sequence) #"-"になっているものを"N"に置換
quality_s <- hoge[[6]] #readのquality情報部分をquality_sに格納
#FASTQ形式のdescription部分を作成
description <- paste(hoge[[1]], hoge[[2]], hoge[[3]], hoge[[4]], hoge[[7]], sep=":")#FASTQ形式のdescription部分を作成している
description <- paste(description, param2, sep="") #param2で指定した記述内容の追加
#Illumina qualityスコアをSanger qualityスコアに変換
quality_s <- chartr("@", "!", quality_s) #「Illumina ASCII 64」 = 「Sanger ASCII 33」 Phred score = 0に相当
quality_s <- chartr("A", "\"", quality_s) #「Illumina ASCII 65」 = 「Sanger ASCII 34」 Phred score = 1に相当
quality_s <- chartr("B", "#", quality_s) #「Illumina ASCII 66」 = 「Sanger ASCII 35」 Phred score = 2に相当
quality_s <- chartr("C", "$", quality_s) #「Illumina ASCII 67」 = 「Sanger ASCII 36」 Phred score = 3に相当
quality_s <- chartr("D", "%", quality_s) #「Illumina ASCII 68」 = 「Sanger ASCII 37」 Phred score = 4に相当
quality_s <- chartr("E", "&", quality_s) #「Illumina ASCII 69」 = 「Sanger ASCII 38」 Phred score = 5に相当
quality_s <- chartr("F", "'", quality_s) #「Illumina ASCII 70」 = 「Sanger ASCII 39」 Phred score = 6に相当
quality_s <- chartr("G", "(", quality_s) #「Illumina ASCII 71」 = 「Sanger ASCII 40」 Phred score = 7に相当
quality_s <- chartr("H", ")", quality_s) #「Illumina ASCII 72」 = 「Sanger ASCII 41」 Phred score = 8に相当
quality_s <- chartr("I", "*", quality_s) #「Illumina ASCII 73」 = 「Sanger ASCII 42」 Phred score = 9に相当
quality_s <- chartr("J", "+", quality_s) #「Illumina ASCII 74」 = 「Sanger ASCII 43」 Phred score =10に相当
quality_s <- chartr("K", ",", quality_s) #「Illumina ASCII 75」 = 「Sanger ASCII 44」 Phred score =11に相当
quality_s <- chartr("L", "-", quality_s) #「Illumina ASCII 76」 = 「Sanger ASCII 45」 Phred score =12に相当
quality_s <- chartr("M", ".", quality_s) #「Illumina ASCII 77」 = 「Sanger ASCII 46」 Phred score =13に相当
quality_s <- chartr("N", "/", quality_s) #「Illumina ASCII 78」 = 「Sanger ASCII 47」 Phred score =13に相当
quality_s <- chartr("O", "0", quality_s) #「Illumina ASCII 79」 = 「Sanger ASCII 48」 Phred score =14に相当
quality_s <- chartr("P", "1", quality_s) #「Illumina ASCII 80」 = 「Sanger ASCII 49」 Phred score =15に相当
quality_s <- chartr("Q", "2", quality_s) #「Illumina ASCII 81」 = 「Sanger ASCII 50」 Phred score =16に相当
quality_s <- chartr("R", "3", quality_s) #「Illumina ASCII 82」 = 「Sanger ASCII 51」 Phred score =17に相当
quality_s <- chartr("S", "4", quality_s) #「Illumina ASCII 83」 = 「Sanger ASCII 52」 Phred score =18に相当
quality_s <- chartr("T", "5", quality_s) #「Illumina ASCII 84」 = 「Sanger ASCII 53」 Phred score =19に相当
quality_s <- chartr("U", "6", quality_s) #「Illumina ASCII 85」 = 「Sanger ASCII 54」 Phred score =20に相当
quality_s <- chartr("V", "7", quality_s) #「Illumina ASCII 86」 = 「Sanger ASCII 55」 Phred score =21に相当
quality_s <- chartr("W", "8", quality_s) #「Illumina ASCII 87」 = 「Sanger ASCII 56」 Phred score =22に相当
quality_s <- chartr("X", "9", quality_s) #「Illumina ASCII 88」 = 「Sanger ASCII 57」 Phred score =23に相当
quality_s <- chartr("Y", ":", quality_s) #「Illumina ASCII 89」 = 「Sanger ASCII 58」 Phred score =24に相当
quality_s <- chartr("Z", ";", quality_s) #「Illumina ASCII 90」 = 「Sanger ASCII 59」 Phred score =25に相当
quality_s <- chartr("[", "<", quality_s) #「Illumina ASCII 91」 = 「Sanger ASCII 60」 Phred score =26に相当
quality_s <- chartr("\\", "=", quality_s) #「Illumina ASCII 92」 = 「Sanger ASCII 61」 Phred score =27に相当
quality_s <- chartr("]", ">", quality_s) #「Illumina ASCII 93」 = 「Sanger ASCII 62」 Phred score =28に相当
quality_s <- chartr("^", "?", quality_s) #「Illumina ASCII 94」 = 「Sanger ASCII 63」 Phred score =29に相当
quality_s <- chartr("_", "@", quality_s) #「Illumina ASCII 95」 = 「Sanger ASCII 64」 Phred score =30に相当
quality_s <- chartr("`", "A", quality_s) #「Illumina ASCII 96」 = 「Sanger ASCII 65」 Phred score =31に相当
quality_s <- chartr("a", "B", quality_s) #「Illumina ASCII 97」 = 「Sanger ASCII 66」 Phred score =32に相当
quality_s <- chartr("b", "C", quality_s) #「Illumina ASCII 98」 = 「Sanger ASCII 67」 Phred score =33に相当
quality_s <- chartr("c", "D", quality_s) #「Illumina ASCII 99」 = 「Sanger ASCII 68」 Phred score =34に相当
quality_s <- chartr("d", "E", quality_s) #「Illumina ASCII 100」= 「Sanger ASCII 69」 Phred score =35に相当
quality_s <- chartr("e", "F", quality_s) #「Illumina ASCII 101」= 「Sanger ASCII 70」 Phred score =36に相当
quality_s <- chartr("f", "G", quality_s) #「Illumina ASCII 102」= 「Sanger ASCII 71」 Phred score =37に相当
quality_s <- chartr("g", "H", quality_s) #「Illumina ASCII 103」= 「Sanger ASCII 72」 Phred score =38に相当
quality_s <- chartr("h", "I", quality_s) #「Illumina ASCII 104」= 「Sanger ASCII 73」 Phred score =39に相当
quality_s <- chartr("i", "J", quality_s) #「Illumina ASCII 105」= 「Sanger ASCII 74」 Phred score =40に相当
quality_s <- chartr("j", "K", quality_s) #「Illumina ASCII 106」= 「Sanger ASCII 75」 Phred score =41に相当
quality_s <- chartr("k", "L", quality_s) #「Illumina ASCII 107」= 「Sanger ASCII 76」 Phred score =42に相当
quality_s <- chartr("l", "M", quality_s) #「Illumina ASCII 108」= 「Sanger ASCII 77」 Phred score =43に相当
quality_s <- chartr("m", "N", quality_s) #「Illumina ASCII 109」= 「Sanger ASCII 78」 Phred score =44に相当
quality_s <- chartr("n", "O", quality_s) #「Illumina ASCII 110」= 「Sanger ASCII 79」 Phred score =45に相当
quality_s <- chartr("o", "P", quality_s) #「Illumina ASCII 111」= 「Sanger ASCII 80」 Phred score =46に相当
quality_s <- chartr("p", "Q", quality_s) #「Illumina ASCII 112」= 「Sanger ASCII 81」 Phred score =47に相当
quality_s <- chartr("q", "R", quality_s) #「Illumina ASCII 113」= 「Sanger ASCII 82」 Phred score =48に相当
quality_s <- chartr("r", "S", quality_s) #「Illumina ASCII 114」= 「Sanger ASCII 83」 Phred score =49に相当
quality_s <- chartr("s", "T", quality_s) #「Illumina ASCII 115」= 「Sanger ASCII 84」 Phred score =50に相当
quality_s <- chartr("t", "U", quality_s) #「Illumina ASCII 116」= 「Sanger ASCII 85」 Phred score =51に相当
quality_s <- chartr("u", "V", quality_s) #「Illumina ASCII 117」= 「Sanger ASCII 86」 Phred score =52に相当
quality_s <- chartr("v", "W", quality_s) #「Illumina ASCII 118」= 「Sanger ASCII 87」 Phred score =53に相当
quality_s <- chartr("w", "X", quality_s) #「Illumina ASCII 119」= 「Sanger ASCII 88」 Phred score =54に相当
quality_s <- chartr("x", "Y", quality_s) #「Illumina ASCII 120」= 「Sanger ASCII 89」 Phred score =55に相当
quality_s <- chartr("y", "Z", quality_s) #「Illumina ASCII 121」= 「Sanger ASCII 90」 Phred score =56に相当
quality_s <- chartr("z", "[", quality_s) #「Illumina ASCII 122」= 「Sanger ASCII 91」 Phred score =57に相当
quality_s <- chartr("{", "\\", quality_s) #「Illumina ASCII 123」= 「Sanger ASCII 92」 Phred score =58に相当
quality_s <- chartr("|", "]", quality_s) #「Illumina ASCII 124」= 「Sanger ASCII 93」 Phred score =59に相当
quality_s <- chartr("}", "^", quality_s) #「Illumina ASCII 125」= 「Sanger ASCII 94」 Phred score =60に相当
quality_s <- chartr("~", "_", quality_s) #「Illumina ASCII 126」= 「Sanger ASCII 95」 Phred score =61に相当
out <- ShortReadQ(sequence, quality_s, BStringSet(description)) #ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをoutに格納
writeFastq(out, out_f) #オブジェクトoutをFASTQ形式で保存
------ ここまで ------
5. Sanger FASTQ形式ファイルとして保存したい場合:
4.のやり方に加えて、*.qseq.txtファイルの最後の列にあるpass filteringフラグが1のもののみ抽出したい場合です。
このpass filteringはIllumina独自のquality情報で、「0のものはqualityが低く、1のものはqualityが高い」という0 or 1で表現されています。
注意点としては、paired-endの場合は、独立の二つのファイルとして得られることになりますが、両方で1という基準にする必要があります。
そのため、4で得た二つのpaired-endファイルを入力ファイルとして読み込んで両方で1というfiteringをやらないといけません。
------ ここから ------
param1 <- "s_._._.*_qseq.txt" #"s_*_*_****_qseq.txt"という感じのファイル名のものを読み込みたい場合("."の有無に注意!!)
param2 <- "/2" #"/2"という記述をdescription行に追加したい場合
out_f <- "hoge_sanger2.fq" #出力ファイル名を指定してout_fに格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
files <- list.files(getwd(), pattern=param1) #param1で指定した正規表現にマッチする文字列を含むファイルのリストをfilesに格納
strsplit(readLines(files[1], 1), "\t") #全部で11列あり、9列目が塩基配列情報、10列目がquality情報だということを確認しているだけ
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(), param1, colClasses = colClasses)#colClassesで指定した列(この場合5列目)をreadXStringColumns関数を用いて読み込むことでXStringSetオブジェクト(この場合"X"は"DNA"に相当)にした結果をhogeに格納
sequence <- hoge[[5]] #readの塩基配列情報部分をsequenceに格納
sequence <- chartr("-", "N", sequence) #"-"になっているものを"N"に置換
quality_s <- hoge[[6]] #readのquality情報部分をquality_sに格納
pass_filter <- hoge[[7]] #pass filtering情報部分をpass_filterに格納
#FASTQ形式のdescription部分を作成
description <- paste(hoge[[1]], hoge[[2]], hoge[[3]], hoge[[4]], hoge[[7]], sep=":")#FASTQ形式のdescription部分を作成している
description <- paste(description, param2, sep="") #param2で指定した記述内容の追加
#Illumina qualityスコアをSanger qualityスコアに変換
quality_s <- chartr("@", "!", quality_s) #「Illumina ASCII 64」 = 「Sanger ASCII 33」 Phred score = 0に相当
quality_s <- chartr("A", "\"", quality_s) #「Illumina ASCII 65」 = 「Sanger ASCII 34」 Phred score = 1に相当
quality_s <- chartr("B", "#", quality_s) #「Illumina ASCII 66」 = 「Sanger ASCII 35」 Phred score = 2に相当
quality_s <- chartr("C", "$", quality_s) #「Illumina ASCII 67」 = 「Sanger ASCII 36」 Phred score = 3に相当
quality_s <- chartr("D", "%", quality_s) #「Illumina ASCII 68」 = 「Sanger ASCII 37」 Phred score = 4に相当
quality_s <- chartr("E", "&", quality_s) #「Illumina ASCII 69」 = 「Sanger ASCII 38」 Phred score = 5に相当
quality_s <- chartr("F", "'", quality_s) #「Illumina ASCII 70」 = 「Sanger ASCII 39」 Phred score = 6に相当
quality_s <- chartr("G", "(", quality_s) #「Illumina ASCII 71」 = 「Sanger ASCII 40」 Phred score = 7に相当
quality_s <- chartr("H", ")", quality_s) #「Illumina ASCII 72」 = 「Sanger ASCII 41」 Phred score = 8に相当
quality_s <- chartr("I", "*", quality_s) #「Illumina ASCII 73」 = 「Sanger ASCII 42」 Phred score = 9に相当
quality_s <- chartr("J", "+", quality_s) #「Illumina ASCII 74」 = 「Sanger ASCII 43」 Phred score =10に相当
quality_s <- chartr("K", ",", quality_s) #「Illumina ASCII 75」 = 「Sanger ASCII 44」 Phred score =11に相当
quality_s <- chartr("L", "-", quality_s) #「Illumina ASCII 76」 = 「Sanger ASCII 45」 Phred score =12に相当
quality_s <- chartr("M", ".", quality_s) #「Illumina ASCII 77」 = 「Sanger ASCII 46」 Phred score =13に相当
quality_s <- chartr("N", "/", quality_s) #「Illumina ASCII 78」 = 「Sanger ASCII 47」 Phred score =13に相当
quality_s <- chartr("O", "0", quality_s) #「Illumina ASCII 79」 = 「Sanger ASCII 48」 Phred score =14に相当
quality_s <- chartr("P", "1", quality_s) #「Illumina ASCII 80」 = 「Sanger ASCII 49」 Phred score =15に相当
quality_s <- chartr("Q", "2", quality_s) #「Illumina ASCII 81」 = 「Sanger ASCII 50」 Phred score =16に相当
quality_s <- chartr("R", "3", quality_s) #「Illumina ASCII 82」 = 「Sanger ASCII 51」 Phred score =17に相当
quality_s <- chartr("S", "4", quality_s) #「Illumina ASCII 83」 = 「Sanger ASCII 52」 Phred score =18に相当
quality_s <- chartr("T", "5", quality_s) #「Illumina ASCII 84」 = 「Sanger ASCII 53」 Phred score =19に相当
quality_s <- chartr("U", "6", quality_s) #「Illumina ASCII 85」 = 「Sanger ASCII 54」 Phred score =20に相当
quality_s <- chartr("V", "7", quality_s) #「Illumina ASCII 86」 = 「Sanger ASCII 55」 Phred score =21に相当
quality_s <- chartr("W", "8", quality_s) #「Illumina ASCII 87」 = 「Sanger ASCII 56」 Phred score =22に相当
quality_s <- chartr("X", "9", quality_s) #「Illumina ASCII 88」 = 「Sanger ASCII 57」 Phred score =23に相当
quality_s <- chartr("Y", ":", quality_s) #「Illumina ASCII 89」 = 「Sanger ASCII 58」 Phred score =24に相当
quality_s <- chartr("Z", ";", quality_s) #「Illumina ASCII 90」 = 「Sanger ASCII 59」 Phred score =25に相当
quality_s <- chartr("[", "<", quality_s) #「Illumina ASCII 91」 = 「Sanger ASCII 60」 Phred score =26に相当
quality_s <- chartr("\\", "=", quality_s) #「Illumina ASCII 92」 = 「Sanger ASCII 61」 Phred score =27に相当
quality_s <- chartr("]", ">", quality_s) #「Illumina ASCII 93」 = 「Sanger ASCII 62」 Phred score =28に相当
quality_s <- chartr("^", "?", quality_s) #「Illumina ASCII 94」 = 「Sanger ASCII 63」 Phred score =29に相当
quality_s <- chartr("_", "@", quality_s) #「Illumina ASCII 95」 = 「Sanger ASCII 64」 Phred score =30に相当
quality_s <- chartr("`", "A", quality_s) #「Illumina ASCII 96」 = 「Sanger ASCII 65」 Phred score =31に相当
quality_s <- chartr("a", "B", quality_s) #「Illumina ASCII 97」 = 「Sanger ASCII 66」 Phred score =32に相当
quality_s <- chartr("b", "C", quality_s) #「Illumina ASCII 98」 = 「Sanger ASCII 67」 Phred score =33に相当
quality_s <- chartr("c", "D", quality_s) #「Illumina ASCII 99」 = 「Sanger ASCII 68」 Phred score =34に相当
quality_s <- chartr("d", "E", quality_s) #「Illumina ASCII 100」= 「Sanger ASCII 69」 Phred score =35に相当
quality_s <- chartr("e", "F", quality_s) #「Illumina ASCII 101」= 「Sanger ASCII 70」 Phred score =36に相当
quality_s <- chartr("f", "G", quality_s) #「Illumina ASCII 102」= 「Sanger ASCII 71」 Phred score =37に相当
quality_s <- chartr("g", "H", quality_s) #「Illumina ASCII 103」= 「Sanger ASCII 72」 Phred score =38に相当
quality_s <- chartr("h", "I", quality_s) #「Illumina ASCII 104」= 「Sanger ASCII 73」 Phred score =39に相当
quality_s <- chartr("i", "J", quality_s) #「Illumina ASCII 105」= 「Sanger ASCII 74」 Phred score =40に相当
quality_s <- chartr("j", "K", quality_s) #「Illumina ASCII 106」= 「Sanger ASCII 75」 Phred score =41に相当
quality_s <- chartr("k", "L", quality_s) #「Illumina ASCII 107」= 「Sanger ASCII 76」 Phred score =42に相当
quality_s <- chartr("l", "M", quality_s) #「Illumina ASCII 108」= 「Sanger ASCII 77」 Phred score =43に相当
quality_s <- chartr("m", "N", quality_s) #「Illumina ASCII 109」= 「Sanger ASCII 78」 Phred score =44に相当
quality_s <- chartr("n", "O", quality_s) #「Illumina ASCII 110」= 「Sanger ASCII 79」 Phred score =45に相当
quality_s <- chartr("o", "P", quality_s) #「Illumina ASCII 111」= 「Sanger ASCII 80」 Phred score =46に相当
quality_s <- chartr("p", "Q", quality_s) #「Illumina ASCII 112」= 「Sanger ASCII 81」 Phred score =47に相当
quality_s <- chartr("q", "R", quality_s) #「Illumina ASCII 113」= 「Sanger ASCII 82」 Phred score =48に相当
quality_s <- chartr("r", "S", quality_s) #「Illumina ASCII 114」= 「Sanger ASCII 83」 Phred score =49に相当
quality_s <- chartr("s", "T", quality_s) #「Illumina ASCII 115」= 「Sanger ASCII 84」 Phred score =50に相当
quality_s <- chartr("t", "U", quality_s) #「Illumina ASCII 116」= 「Sanger ASCII 85」 Phred score =51に相当
quality_s <- chartr("u", "V", quality_s) #「Illumina ASCII 117」= 「Sanger ASCII 86」 Phred score =52に相当
quality_s <- chartr("v", "W", quality_s) #「Illumina ASCII 118」= 「Sanger ASCII 87」 Phred score =53に相当
quality_s <- chartr("w", "X", quality_s) #「Illumina ASCII 119」= 「Sanger ASCII 88」 Phred score =54に相当
quality_s <- chartr("x", "Y", quality_s) #「Illumina ASCII 120」= 「Sanger ASCII 89」 Phred score =55に相当
quality_s <- chartr("y", "Z", quality_s) #「Illumina ASCII 121」= 「Sanger ASCII 90」 Phred score =56に相当
quality_s <- chartr("z", "[", quality_s) #「Illumina ASCII 122」= 「Sanger ASCII 91」 Phred score =57に相当
quality_s <- chartr("{", "\\", quality_s) #「Illumina ASCII 123」= 「Sanger ASCII 92」 Phred score =58に相当
quality_s <- chartr("|", "]", quality_s) #「Illumina ASCII 124」= 「Sanger ASCII 93」 Phred score =59に相当
quality_s <- chartr("}", "^", quality_s) #「Illumina ASCII 125」= 「Sanger ASCII 94」 Phred score =60に相当
quality_s <- chartr("~", "_", quality_s) #「Illumina ASCII 126」= 「Sanger ASCII 95」 Phred score =61に相当
out <- ShortReadQ(sequence, quality_s, BStringSet(description)) #ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをoutに格納
out <- out[as.character(pass_filter) == "1"] #pass_filter中の値が1のもののみ抽出
writeFastq(out, out_f) #オブジェクトoutをFASTQ形式で保存
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
ファイルの読み込み | マップ後 | Bowtie形式
ここでは代表的なshort readsのリファレンス配列へのマッピング法であるBowtieを実行して得られたBowtie形式出力ファイルを読み込むやり方を、yeastRNASeqパッケージ中にある(このパッケージがインストールされていることが前提です)wt_1_f.bowtie.gzファイルを例として解説します。
yeastRNASeqというパッケージがインストールされていれば、(例えば私のWindows 7, 64bitマシン環境だと)「コンピュータ - OS(C:) - Program Files - R - R-2.15.2 - library - yeastRNASeq - reads」から目的のファイルにたどり着きます。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. ディレクトリの変更をちゃんとやった場合:
------ ここから ------
in_f <- "wt_1_f.bowtie.gz" #読み込みたいBowtie形式出力ファイル名を指定してin_fに格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
output <- readAligned(in_f, type="Bowtie") #in_fで指定したファイルの読み込み
output #読み込んだAlignedReadオブジェクトoutputを表示
------ ここまで ------
2. 任意のディレクトリ位置から、以下のようにして特定の場所にある目的のファイルを読み込むことも可能です:
「コンピュータ - OS(C:) - Program Files - R - R-2.15.2 - library - yeastRNASeq - reads」
------ ここから ------
in_f <- "wt_1_f.bowtie.gz" #読み込みたいBowtie形式出力ファイル名を指定してin_fに格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
#yeastRNASeqパッケージ中のreadsフォルダ中に目的のファイルがあることがわかっているので...
path <- file.path(system.file(package = "yeastRNASeq", "reads"))
output <- readAligned(path, in_f, type="Bowtie") #in_fで指定したファイルの読み込み
output #読み込んだAlignedReadオブジェクトoutputを表示
------ ここまで ------
BioconductorのShortReadのwebページ
BioconductorのyeastRNASeqのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
yeastRNASeq:Lee et al., PLoS Genet., 2008
Bowtie (Langmead et al., Genome Biol., 2009)
ファイルの読み込み | マップ後 | BAM形式
ここではBAM形式ファイルを読み込むやり方を解説します。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
#必要なパッケージなどをロード
library(Rsamtools) #パッケージの読み込み
------ ここまで ------
BioconductorのRsamtoolsのwebページ
ファイルの読み込み | マップ後 | GFF3形式
ここではマッピング | basic alignerの一つであるPASS(参考文献1)を実行して得られたGFF3形式ファイルを読み込むやり方を、xxx行からなるoutput.gff3ファイルを例として解説します。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
------ ここまで ------
BioconductorのBiostringsのwebページ
ファイルの読み込み | マップ後 | SOAP形式
ここでは代表的なshort readsのリファレンス配列へのマッピング法であるSOAP(or SOAP2; 参考文献1)を実行して得られた出力ファイルを読み込むやり方を、850行からなるoutput.soapファイルを例として解説します。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
in_f <- "output.soap" #読み込みたいSOAP出力ファイル名を指定してin_fに格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
output <- readAligned(in_f, type="SOAP") #in_fで指定したファイルの読み込み
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
参考文献1(Li et al., Bioinformatics., 2009)
クオリティチェック | NGS(一般)について
Quality Control (QC)を実行する様々な方法が提案されています。2012年8月1日現在、ここでは入力ファイルがFASTQファイルのものに限定しています。
フィルタリング | NGS | artifact(adapter sequences, low-complexity reads, and PCR duplicates)やsequencing errorの除去も合わせて参考になさってください。そこは入力ファイルがマップ後のSAM/BAM形式ファイルなどを読み込むものについてリストアップしています。
入力ファイルがFASTQ形式ファイル(Rパッケージ):
・qrqc:原著論文はないのか?!...
・girafe: Toedling et al., Bioinformatics, 2010; アダプター外し機能もあります
入力ファイルがFASTQ形式ファイル(R以外):
・FastQC: 原著論文はないのか?!...; SAM/BAM形式も読み込める
・FASTX-ToolKit:原著論文はないのか?!...; format converterもいくつかあり; FASTA形式も読み込める
・Quake: Kelley et al., Genome Biol., 2010
・ECHO: Kao et al., Genome Res., 2011; gzipped fileも読み込めるらしい
・Hammer: Medvedev et al., Bioinformatics, 2011
・ConDeTri: Smeds et al., PLoS One, 2011
・NGS QC Toolkit: Patel et al., PLoS One, 2012; format converterもいくつかあり
・SEQuel: Ronen et al., Bioinformatics, 2012
クオリティチェック | NGS(一般) | qrqc (Quick Read Quality Control)
FastQCのR版のようなものです。Sanger FASTQ形式ファイルを読み込んで、positionごとの「クオリティスコア(quality score)」、「どんな塩基が使われているのか(base frequency and base proportion)」、「リード長の分布」、「GC含量」、「htmlレポート」などを出力してくれます。
ここではSRR037439.fastqファイルに対して解析を行う例を示します。
下記を実行すると「SRR037439-report」という名前のフォルダが作成されます。中にあるreport.htmlをダブルクリックするとhtmlレポートを見ることができます。
2012/02/20に気づきましたが、R2.13.1ではうまくいきますが、R2.14.1ではエラーがでてうまくいきません。。。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTQ形式のファイル名を指定してin_fに格納
#必要なパッケージなどをロード
library(qrqc) #パッケージの読み込み
reads <- readSeqFile(in_f, quality="phred") #FASTQ形式ファイルの読み込み(Sanger FASTQ形式の場合は"phred", Illumina FASTQ形式の場合は"illumina"にすればよい)
makeReport(reads) #htmlレポートの作成
------ ここまで ------
Bioconductorのqrqcのwebページ
フィルタリング | 一般 | fastqファイルからACGTのみからなる配列(重複あり)の抽出
このウェブページでは、読み込んだ塩基配列情報を"reads"というオブジェクト名にしています。したがって(どのファイル形式から読み込んだものでもいいのですが)ここではSRR037439.fastqを読み込んで得られたreadsに対して行います。
第二段落(outのところまで)を実行すると、リード数が11410745 --> 10622888にちゃんと減っており、ぱっと見てNなどが含まれないことがわかります。
最後まで実行して得られるのは、"hoge.txt"というファイル名の(multi-)FASTA形式のファイルです。
param1で指定している"kkk"の意味は、"hoge.txt"を開いてみてみればわかります。
例題ファイルは500 reads程度しかないので一瞬で終わりますが、Windowsで実行する場合、数千万リードからなるファイルだと数日というオーダーで時間がかかりますのでご注意ください。
ちなみにここでの”重複あり”というのは全く同じ配列(例:"AACGTTGCA"と"AACGTTGCA")もそのまま取り扱う、という意味です。
ファイルへの出力を実際にやってみると、少しでもファイルサイズを圧縮したい気持ちに駆られると思います。
この次の項目の”重複なし”は、例えば"AACGTTGCA"がk回読まれたなどという風に、全く同じ配列が何度も出てこないようにしたものです。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
param1 <- "kkk" #(multi-)FASTA形式のdescription部分(の一部)を指定してparam1に格納
out_f <- "hoge.txt" #出力ファイル名を指定
#必要なパッケージをロード
library(ShortRead) #パッケージの読み込み
#入力ファイルの読み込み
reads <- readDNAStringSet(in_f, format="fastq") #in_fで指定したファイルの読み込み
#本番
count <- rowSums(alphabetFrequency(DNAStringSet(reads))[,1:4]) #各readについてACGTの総数をカウントし、結果をcountに格納
out <- reads[width(reads) == count] #各readの長さ(width(reads))とcountの結果を比較して、同じ長さもののみoutに格納
#ファイルへの出力
names(out) <- paste(param1, 1:length(out), sep="_") #(multi-)FASTA形式のdescription部分を作成している
writeXStringSet(out, file=out_f, format="fasta", width=80) #outの中身をout_fで指定したファイル名で保存
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
フィルタリング | 一般 | fastqファイルからACGTのみからなる配列(重複なし)の抽出
ここでは、一つ上の項目のfastqファイルからACGTのみからなる配列(重複あり)の抽出とは少し違って、ユニークな配列からなるセットにするやり方を紹介します。
第二段落(outのところまで)を実行すると、リード数が11410745 --> 10622888に減りましたが、さらに重複を排除することで8208963まで減ります。
ちなみに、ユニークとはいっても例えば"AACGTTGCA"と"AACGTTGCAG"は独立な配列として取り扱われます。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
param1 <- "kkk" #(multi-)FASTA形式のdescription部分(の一部)を指定してparam1に格納
out_f <- "hoge.txt" #出力ファイル名を指定
#必要なパッケージをロード
library(ShortRead) #パッケージの読み込み
#入力ファイルの読み込み
reads <- readDNAStringSet(in_f, format="fastq") #in_fで指定したファイルの読み込み
#本番
count <- rowSums(alphabetFrequency(DNAStringSet(reads))[,1:4]) #各readについてACGTの総数をカウントし、結果をcountに格納
out <- reads[width(reads) == count] #各readの長さ(width(reads))とcountの結果を比較して、同じ長さもののみoutに格納
out1 <- tables(out, n=length(unique(out))) #読まれた頻度順にsequenceをソートして結果をout1に格納
out2 <- DNAStringSet(names(out1$top)) #sequenceの配列情報(「names(out1$top)」)をDNAStringSetオブジェクトとしてout2に格納
names(out2) <- paste(param1, 1:length(out2), out1$top, sep="_") #(multi-)FASTA形式のdescription部分を作成している
writeXStringSet(out2, file=out_f, format="fasta", width=80) #out2の中身をout_fで指定したファイル名で保存
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
フィルタリング | 一般 | multi-fastaファイルのdescription行の記述を整形
multi-fastaファイルのdescription行の記述はものによってまちまちです。ここでは何種類かのmulti-fasta形式ファイルに対して、「目的の記述部分のみ抽出し、それを新たなdescription」としてファイルに出力するやり方を紹介します。
1. ラットの上流配列(1000bp)ファイル(rat_upstream_1000.fa)からRefSeq IDの部分のみを抽出したい場合:
2. Trinity.fastaから最初のスペースで区切られる前の文字列のみにしたい場合:
3. DHFR.fastaからRefSeq ID部分のみ抽出したい場合:
4. DHFR.fastaからバージョン番号を除いたRefSeq ID部分のみ抽出したい場合:
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
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")し、分割後の一つ目の要素を抽出
------ ここから ------
in_f <- "rat_upstream_1000.fa" #multi-fastaファイル名を指定
out_f <- "hoge1.fa" #出力ファイル名(IDリストに一致する配列)を指定
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#入力ファイルの読み込み
seq <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルを読み込んでseqに格納
#本番
hoge <- strsplit(names(seq), "_up_", fixed=TRUE) #names(reads)中の文字列を"_up_"で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", 1)) #hogeのリスト中の1番目の要素(これがRefSeq IDに相当)を抽出してhoge2に格納
names(seq) <- hoge2 #names(seq)の中身をhoge2で置換
#ファイルに保存
writeXStringSet(seq, file=out_f, format="fasta", width=60) #一行あたりの塩基数を60にして、out_fで指定したファイル名で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]")し、分割後の一つ目の要素を抽出
------ ここから ------
in_f <- "Trinity.fasta" #multi-fastaファイル名を指定
out_f <- "hoge2.fa" #出力ファイル名(IDリストに一致する配列)を指定
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#入力ファイルの読み込み
seq <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルを読み込んでseqに格納
#本番
hoge <- strsplit(names(seq), " ", fixed=TRUE) #names(reads)中の文字列を" "で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", 1)) #hogeのリスト中の1番目の要素(これがRefSeq IDに相当)を抽出してhoge2に格納
names(seq) <- hoge2 #names(seq)の中身をhoge2で置換
#ファイルに保存
writeXStringSet(seq, file=out_f, format="fasta", width=60) #一行あたりの塩基数を60にして、out_fで指定したファイル名で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" #multi-fastaファイル名を指定
out_f <- "hoge3.fa" #出力ファイル名(IDリストに一致する配列)を指定
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#入力ファイルの読み込み
seq <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルを読み込んでseqに格納
#本番
hoge <- strsplit(names(seq), "|", fixed=TRUE) #names(reads)中の文字列を"|"で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", 4)) #hogeのリスト中の4番目の要素(これがRefSeq IDに相当)を抽出してhoge2に格納
names(seq) <- hoge2 #names(seq)の中身をhoge2で置換
#ファイルに保存
writeXStringSet(seq, file=out_f, format="fasta", width=60) #一行あたりの塩基数を60にして、out_fで指定したファイル名で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" #multi-fastaファイル名を指定
out_f <- "hoge4.fa" #出力ファイル名(IDリストに一致する配列)を指定
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#入力ファイルの読み込み
seq <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルを読み込んでseqに格納
#本番
hoge <- strsplit(names(seq), "|", fixed=TRUE) #names(reads)中の文字列を"|"で区切った結果をリスト形式で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(seq) <- hoge4 #names(seq)の中身をhoge4で置換
#ファイルに保存
writeXStringSet(seq, file=out_f, format="fasta", width=60) #一行あたりの塩基数を60にして、out_fで指定したファイル名でfasta形式で保存
------ ここまで ------
BioconductorのBiostringsのwebページ
フィルタリング | 一般 | multi-fastaファイルからACGT以外の文字の出現数でフィルタリング
UCSCのSequence and Annotation Downloadsページから取得したラットの上流配列(1000bp)ファイル(rat_upstream_1000.fa)
の中から、ACGT以外の"N"などを沢山含む配列を除去したいときに用います。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
in_f <- "rat_upstream_1000.fa" #multi-fastaファイル名を指定
out_f <- "hoge1.fa" #出力ファイル名(IDリストに一致する配列)を指定
param <- 0 #許容するACGT以外の文字数を指定(0の場合はACGTのみからなる配列のみ抽出することに相当。5の場合はACGT以外の文字が含まれるのを5個まで許容することに相当)
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#入力ファイルの読み込み
seq <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルを読み込んでseqに格納
#ACGT以外の文字数をカウントしてフィルタリングするところ
count <- rowSums(alphabetFrequency(DNAStringSet(seq))[,1:4]) #各塩基配列についてACGTの総数をカウントし、結果をcountに格納
obj <- (width(seq) - count) <= param #各塩基配列についてACGT以外の文字数が(param)個以下の場合にTRUE, それ以外をFALSEとしたベクトルobjを作成
out <- seq[obj] #seqという配列集合からobjがTRUEとなる要素のみ抽出してoutに格納
#ファイルに保存
writeXStringSet(out, file=out_f, format="fasta", width=60) #一行あたりの塩基数を60にして、out_fで指定したファイル名でfasta形式で保存
------ ここまで ------
BioconductorのBiostringsのwebページ
フィルタリング | 一般 | multi-fastaファイルから指定した配列長のもののみ抽出
multi-fasta形式のファイルが手元にあったとして、任意の配列長のもののみ抽出するやり方を示します。
ここでは以下の二つを例題として行います:
1. 「イントロダクション | 一般 | ランダムな塩基配列を作成」の4.を実行して得られたmulti-fastaファイル(hoge4.fa)
2. 130MB程度のRefSeqのhuman mRNAのmulti-fastaファイル(h_rna.fasta)
「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。
1. hoge4.faファイルの場合:
------ ここから ------
in_f <- "hoge4.fa" #multi-fasta形式の入力ファイルを指定
out_f <- "hoge1.fasta" #出力ファイル名を指定
param <- 50 #配列長の閾値を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
reads #今現在のreadsオブジェクトを表示
reads <- reads[width(reads) >= param] #paramで指定した配列長以上のもののみ抽出してreadsに格納
reads #今現在のreadsオブジェクトを表示
writeXStringSet(reads, file=out_f, format="fasta") #out_fで指定したファイル名でreadsというオブジェクトをfasta形式で保存
------ ここまで ------
2. h_rna.fastaファイルの場合:
------ ここから ------
in_f <- "h_rna.fasta" #multi-fasta形式のファイルを指定
out_f <- "hoge2.fasta" #出力ファイル名を指定
param <- 200 #配列長の閾値を指定
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
reads #今現在のreadsオブジェクトを表示
reads <- reads[width(reads) >= param] #paramで指定した配列長以上のもののみ抽出してreadsに格納
reads #今現在のreadsオブジェクトを表示
writeXStringSet(reads, file=out_f, format="fasta") #out_fで指定したファイル名でreadsというオブジェクトをfasta形式で保存
------ ここまで ------
BioconductorのBiostringsのwebページ
フィルタリング | 一般 | multi-fastaファイルから任意のサブセットを抽出
遺伝子の転写開始点近傍配列(上流配列など)を取得を参考にして、任意の生物種の上流配列を取得することができます。
この中から例えばマイクロアレイ解析の二群間比較によって得られた発現変動遺伝子のIDリストファイルが手元にあったときに、リストファイル中のIDに対応する上流配列のサブセットを抽出したい場合に利用します。
ここでは、UCSCのSequence and Annotation Downloadsページから取得したラットの上流配列(1000bp)ファイル(rat_upstream_1000.fa)
の中から、ラット褐色脂肪組織の「満腹 vs. 空腹」の二群間比較で得られた発現変動RefSeq IDリストファイル(result_rankprod_BAT_RefSeq_DEG.txt)中の「上流配列サブセット」を出力するやり方を紹介します。
尚、このRefSeq IDリストファイルの作成手順は、(Rで)マイクロアレイデータ解析のサンプルマイクロアレイデータ21中に記載しています。
また、multi-fastaファイルのdescription行の記述中にIDリストファイル中の文字列が存在することが大前提であることはいうまでもありませんが、description行の記述の仕方がものによってかなり異なりますので、
strsplit関数適用時に用いる分割のための文字列(下記では"_up_"としている)や分割後の文字列群の中から取り出す要素の位置(下記では一つめの要素を取り出している)は、自分でmulti-fastaファイルを眺めてmulti-fastaファイルのdescription行の記述を整形を参考にして適宜変更してください。
さらにここでは、ACGTの四種類だけからなる配列のみ抽出しています(つまり"N"を一つでも含む配列は捨てています)。このやり方の詳細はmulti-fastaファイルからACGT以外の文字の出現数でフィルタリングを参考にしてください。
「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。
------ ここから ------
in_f1 <- "rat_upstream_1000.fa" #multi-fastaファイル名を指定
in_f2 <- "result_rankprod_BAT_RefSeq_DEG.txt" #IDリストファイル名を指定
out_f <- "seq_BAT_DEG.fa" #出力ファイル名(IDリストに一致する配列)を指定
param <- 0 #許容するACGT以外の文字数を指定(0の場合はACGTのみからなる配列のみ抽出することに相当。5の場合はACGT以外の文字が含まれるのを5個まで許容することに相当)
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#入力ファイルの読み込み
seq <- readDNAStringSet(in_f1, format="fasta") #in_f1で指定したファイルを読み込んでseqに格納
keywords <- readLines(in_f2) #in_f2で指定したファイルを読み込んでkeywordsに格納
#(in_f2で読み込んだRefSeq ID情報からなるkeywordsベクトルと対応がとれるように)seq中のdescription部分を改変
hoge <- strsplit(names(seq), "_up_", fixed=TRUE) #names(reads)中の文字列を"_up_"で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", 1)) #hogeのリスト中の1番目の要素(これがRefSeq IDに相当)を抽出してhoge2に格納
names(seq) <- hoge2 #names(seq)の中身をhoge2で置換
seq <- unique(seq) #重複を除去(13452 sequences --> 12998 sequences)
seq <- seq[width(seq) == median(width(seq))] #この場合上流1000bpの配列集合を取り扱っているはずだが、まれにそうでないものが含まれるので配列集合の配列長の中央値と同じでないものを排除している(12998 sequences --> 12997 sequences)
count <- rowSums(alphabetFrequency(DNAStringSet(seq))[,1:4]) #各塩基配列についてACGTの総数をカウントし、結果をcountに格納
obj <- (width(seq) - count) <= param #各塩基配列についてACGT以外の文字数が(param)個以下の場合にTRUE, それ以外をFALSEとしたベクトルobjを作成
seq <- seq[obj] #seqという配列集合からobjがTRUEとなる要素のみ抽出(12997 sequences --> 12261 sequences)してoutに格納
#本番(names(seq)中の各要素がベクトルkeywords中に含まれるものを抽出して保存。複数のRefSeq IDになっているものは無視の方向で...。)
out <- seq[is.element(names(seq), keywords)] #names(seq)中の各要素がベクトルkeywords中に含まれるものをoutに格納
writeXStringSet(out, file=out_f, format="fasta", width=60) #一行あたりの塩基数を60にして、out_fで指定したファイル名でfasta形式で保存
------ ここまで ------
BioconductorのBiostringsのwebページ
フィルタリング | NGS(miRNA) | アダプター配列除去0(基本的なところ)
ここでは、この後の項目で実際に行っているアダプター配列除去時の挙動をいくつか例示することによって感覚をつかみます。
1. アダプター配列が8塩基の場合:
------ ここから ------
param1 <- DNAStringSet(c("GCTTTCCCCAAGTAGGT","TTCTGCTTGGATCGGAAG"))#アダプター配列を含む塩基配列を指定してparam1に格納
param2 <- "ACGTACGT" #アダプター配列情報を指定してparam2に格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
#左側にアダプター配列が含まれている場合1(100%マッチ):
trimLRPatterns(Lpattern=param2, subject=param1, max.Lmismatch=0) #max.Lmismatch=0はミスマッチが0個という意味。2番目の配列の左端のTがアダプター配列と認識されてトリミングされている
#左側にアダプター配列が含まれている場合2(100%マッチ):
trimLRPatterns(Lpattern=param2, subject=param1, max.Lmismatch=rep(0, nchar(param2)))#max.Lmismatch=0はミスマッチが0個という意味。2番目の配列の左端のTがアダプター配列と認識されてトリミングされている
#右側にアダプター配列が含まれている場合1(100%マッチ):
trimLRPatterns(Rpattern=param2, subject=param1, max.Rmismatch=0) #max.Rmismatch=0はミスマッチが0個という意味。100%マッチのところはないのでparam1の配列がそのまま表示されている
#右側にアダプター配列が含まれている場合2(100%マッチ):
trimLRPatterns(Rpattern=param2, subject=param1, max.Rmismatch=rep(0, nchar(param2)))#max.Rmismatch=0はミスマッチが0個という意味。100%マッチのところはないのでparam1の配列がそのまま表示されている
#右側にアダプター配列が含まれている場合1(ミスマッチを2個まで許容):
trimLRPatterns(Rpattern=param2, subject=param1, max.Rmismatch=2) #param1の1番目の配列の右側8塩基はちゃんとトリミングされているが、2番目の配列の右側3塩基はされてないのはなぜ?
#右側にアダプター配列が含まれている場合2(ミスマッチを2個まで許容):
trimLRPatterns(Rpattern=param2, subject=param1, max.Rmismatch=rep(2, nchar(param2)))#param1の1番目の配列の右側8塩基、2番目の配列の右側3塩基がトリミングされている
------ ここまで ------
2. RNA配列の右側をちょっと変えた場合:
------ ここから ------
param1 <- DNAStringSet(c("GCTTTCCCCAAGTAGAC","TTCTGCTTGGATCGGATG"))#アダプター配列を含む塩基配列を指定してparam1に格納
param2 <- "ACGTACGT" #アダプター配列情報を指定してparam2に格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
#ミスマッチを2個まで許容:
#rep(2, nchar(param2))の意味は以下のとおりです。
#param2の最初の1塩基分(A)を2塩基ミスマッチで探索
#param2の最初の2塩基分(AC)を2塩基ミスマッチで探索
#param2の最初の3塩基分(ACG)を2塩基ミスマッチで探索
#...
#param2の最初のnchar(param2)塩基分(ACGTACGT)を2塩基ミスマッチで探索
trimLRPatterns(Rpattern=param2, subject=param1, max.Rmismatch=rep(2, nchar(param2)))#2塩基ミスマッチを許容とはいっても”常識的な”トリミングをしてくれるのね
#ミスマッチを2個まで許容(失敗例):
trimLRPatterns(Rpattern=param2, subject=param1, max.Rmismatch=2) #なんで違った結果になるんでしょうね?!
------ ここまで ------
3. 右側のアダプター配列が8塩基のままで許容ミスマッチを個数ではなく割合で指定する場合:
------ ここから ------
param1 <- DNAStringSet(c("GCTTTCCCCAAGTAGGT","GCTTTCCCCACGTAGGT","GCTTTCCCCTCGTAGGT"))#アダプター配列を含む塩基配列を指定してparam1に格納
param2 <- "ACGTACGT" #アダプター配列情報を指定してparam2に格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
#ミスマッチの割合を0.3(アダプター30%)まで許容:
trimLRPatterns(Rpattern=param2, subject=param1, max.Rmismatch=0.3)#
#ミスマッチの割合を0.2(アダプター20%)まで許容:
trimLRPatterns(Rpattern=param2, subject=param1, max.Rmismatch=0.2)#
#ミスマッチの割合を0.1(アダプター10%)まで許容:
trimLRPatterns(Rpattern=param2, subject=param1, max.Rmismatch=0.1)#
------ ここまで ------
4. アダプター除去後の配列がx塩基以上含むものという指定をしたい場合:
------ ここから ------
param1 <- DNAStringSet(c("GCTTTCCCCAAGTAGGT","GCTTTCCCCAAGTACGT","GCTTTCCCCAAGTAGAC"))#アダプター配列を含む塩基配列を指定してparam1に格納
param2 <- "ACGTACGT" #アダプター配列情報を指定してparam2に格納
param3 <- 15 #xの値を指定してparam3に格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
#100%マッチ:
hoge <- trimLRPatterns(Rpattern=param2, subject=param1, max.Rmismatch=rep(0, nchar(param2))) #max.Rmismatch=0はミスマッチが0個という意味。100%マッチのところはないのでparam1の配列がそのまま表示されている
out <- hoge[hoge@ranges@width >= param3,] #条件を満たすものだけを抽出してoutに格納
out #outの中身を表示
#ミスマッチを2個まで許容:
hoge <- trimLRPatterns(Rpattern=param2, subject=param1, max.Rmismatch=rep(2, nchar(param2)))#param1の1番目の配列の右側8塩基が、2番目の配列の右側3塩基(なぜ4塩基じゃない?!)がトリミングされている
out <- hoge[hoge@ranges@width >= param3,] #条件を満たすものだけを抽出してoutに格納
out #outの中身を表示
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
フィルタリング | NGS(miRNA) | アダプター配列除去1(Illumina *_seq.txt; ミスマッチ数指定)
Illuminaを実行して得られるファイルは多数ありますが、ここでは、3'側(右側)にアダプター配列を含む生の配列ファイルの「*_seq.txt」を入力として、
アダプター配列(例:CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG; Oligonucleotide sequences (c) 2007-2009 Illumina, Inc. All rights reserved.)を除去した結果を返すやり方を紹介します。
実際の生の配列データファイルは数百程度に分割されています。ここでは、そのファイル群がおさめられているディレクトリ(例:Solexa_seq)を指定して、その中の「*_seq.txt」ファイル群について一気に行う方法を示します。
ここでは、(s_1_0001_seq.txtとs_1_0007_seq.txtの二つのファイルを含む; それぞれ1394行および826行からなる)「Solexa_seq」という名前のフォルダ(”ディレクトリ”と同じ意味)がデスクトップ上にあることを想定して行います。
以下を実行して得られるのは、"hoge.txt"というファイル名の(multi-)FASTA形式のファイルです。param4で指定している"kkk"の意味は、"hoge.txt"を開いてみてみればわかります。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
param1 <- "s_1_.*_seq.txt" #"s_1_*_seq.txt"という感じのファイル名のものを読み込みたい場合("."の有無に注意!!)
param2 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam2に格納
param3 <- 0 #許容するミスマッチの数を指定してparam3に格納
param4 <- "kkk" #(multi-)FASTA形式のdescription部分(の一部)を指定してparam4に格納
out_f <- "hoge.txt" #出力ファイル名を指定
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
files <- list.files(getwd(), pattern=param1) #param1で指定した正規表現にマッチする文字列を含むファイルのリストをfilesに格納
strsplit(readLines(files[[1]],1), "\t") #filesで読み込んだファイルのリストについて、最初のファイルの一行目をタブで区切って表示させているだけ。5列目のデータが塩基配列情報だということを確認しているにすぎない。
colClasses <- c(rep(list(NULL), 4), "DNAString") #DNAStringSetというオブジェクト形式にするための情報を予め作成している。最初の4列には"NULL"を、最後の5列目には"DNAString"というベクトルを作成してcolClassesに格納している
reads <- readXStringColumns(getwd(), param1, colClasses = colClasses)#colClassesで指定した列(この場合5列目)をreadXStringColumns関数を用いて読み込むことでXStringSetオブジェクト(この場合"X"は"DNA"に相当)にした結果をreadsに格納
out <- trimLRPatterns(Rpattern=param2, subject=reads[[1]], max.Rmismatch = rep(param3, nchar(param2)))
names(out) <- paste(param4, 1:length(out), sep="_") #(multi-)FASTA形式のdescription部分を作成している
writeXStringSet(out, file=out_f, format="fasta", width=80) #outの中身をout_fで指定したファイル名で保存(Xeon W5590 3.33GHz 98GBメモリマシンでも30秒程度かかります...)。
#以下は(こんなこともできますという)おまけ
#同一配列(idensical reads)何回も読まれている場合があるので、
#out中の配列群について、一回しか出現していないreadが何個あったかという情報を得たい場合:
tables(out)$distribution #k回出現したreadがn個あったという情報を表形式で出力(1回しか出現しなかったのが2125 reads、2回出現したのが19 reads、...)
#out中の配列群について、配列長の最小と最大の情報を得たい場合1:
range(out@ranges@width) #配列長のベクトル(out@ranges@width)に対してrange関数を適用
#out中の配列群について、配列長の最小と最大の情報を得たい場合2:
c(min(out@ranges@width), max(out@ranges@width)) #配列長のベクトル(out@ranges@width)に対してmin関数とmax関数を適用
#out中の配列群について、配列長別に何readsあったかをカウントしてR Console上に表示したい場合:
out2 <- NULL #最終的にout2という名前で結果を得るためのプレースホルダー(おまじない)
hoge <- out@ranges@width #以下のプログラムを見やすくするために配列長のベクトル(out@ranges@width)をhogeに格納(hogeとして取り扱っているだけ)
for(i in min(hoge):max(hoge)){ #配列長の最小値から最大値まで1刻みでループを回す
out2 <- rbind(out2, c(i, sum(hoge == i))) #配列長iの数をカウントした結果をout2に格納している
} #配列長の最小値から最大値まで1刻みでループを回す
colnames(out2) <- c("length", "count") #得られたout2の1列目は配列長情報、2列目はその配列長だったread数に相当するので、列名をそのように与えている
out2
#out中の配列群について、配列長別に何readsあったかをカウントしてファイルに出力したい場合:
out_f2 <- "hoge2.txt" #出力ファイル名を指定
out2 <- NULL #最終的にout2という名前で結果を得るためのプレースホルダー(おまじない)
hoge <- out@ranges@width #以下のプログラムを見やすくするために配列長のベクトル(out@ranges@width)をhogeに格納(hogeとして取り扱っているだけ)
for(i in min(hoge):max(hoge)){ #配列長の最小値から最大値まで1刻みでループを回す
out2 <- rbind(out2, c(i, sum(hoge == i))) #配列長iの数をカウントした結果をout2に格納している
} #配列長の最小値から最大値まで1刻みでループを回す
colnames(out2) <- c("length", "count") #得られたout2の1列目は配列長情報、2列目はその配列長だったread数に相当するので、列名をそのように与えている
write.table(out2, out_f2, sep="\t", append=F, quote=F, row.names=F)#out2の中身をout_f2で指定したファイル名で保存。
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
フィルタリング | NGS(miRNA) | アダプター配列除去2(Illumina *_seq.txt; ミスマッチ数指定,除去後の配列長条件を追加)
アダプター配列除去1のやり方を最後までやるとアダプター配列を含まないものが538 reads、
一塩基だけ含むものが756 reads、などという結果が得られていることがわかりますが...。
small RNAの解析などでRNAの配列長が一定の範囲内(例:23-30 nt)にあると決め打ちするような場合に、こちらを参考にしてやります。
以下を実行して得られるのは、"hoge.txt"というファイル名の(multi-)FASTA形式のファイルです。param4で指定している"kkk"の意味は、"hoge.txt"を開いてみてみればわかります。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
param1 <- "s_1_.*_seq.txt" #"s_1_*_seq.txt"という感じのファイル名のものを読み込みたい場合("."の有無に注意!!)
param2 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam2に格納
param3 <- 2 #許容するミスマッチの数を指定してparam3に格納
param4 <- "kkk" #(multi-)FASTA形式のdescription部分(の一部)を指定してparam4に格納
param5 <- 23:30 #RNA配列長の範囲を指定してparam5に格納
out_f <- "hoge.txt" #出力ファイル名を指定
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
files <- list.files(getwd(), pattern=param1) #param1で指定した正規表現にマッチする文字列を含むファイルのリストをfilesに格納
colClasses <- c(rep(list(NULL), 4), "DNAString") #DNAStringSetというオブジェクト形式にするための情報を予め作成している。最初の4列には"NULL"を、最後の5列目には"DNAString"というベクトルを作成してcolClassesに格納している
reads <- readXStringColumns(getwd(), param1, colClasses = colClasses)#colClassesで指定した列(この場合5列目)をreadXStringColumns関数を用いて読み込むことでXStringSetオブジェクト(この場合"X"は"DNA"に相当)にした結果をreadsに格納
hoge <- reads[[1]]@ranges@width #以下のプログラムを見やすくするためにアダプター配列除去前のベクトル(reads[[1]]@ranges@width)をhogeに格納
if(length(hoge) != sum(hoge == mean(hoge))){ #以下の4行分のif文で、hogeの各要素についてhogeの平均値(この場合mean(hoge)=36に相当)
cat("Error: Lengths of reads with adapter are different!\n") #に等しいものをカウントした結果(右辺に相当;この場合2220)が、元々のhogeの要素数
cat("You cannot use this program!\n") #(左辺のlength(hoge)に相当;この場合も2220)と等しくなければError以下の文を表示させている。
}else{ #もしこの文が表示されたら、同じ配列長でないものが含まれていることを意味するので、RNA配列長を指定することはあきらめてください
hoge2 <- trimLRPatterns(Rpattern=param2, subject=reads[[1]], max.Rmismatch = rep(param3, nchar(param2)))#アダプターを含む配列の長さが全部同じだった場合のみ、アダプター配列除去を行い、結果をhoge2に格納
out <- hoge2[((hoge2@ranges@width >= min(param5)) & (hoge2@ranges@width <= max(param5))),]#hoge2の中からparam5で指定した配列長の条件を満たすもののみ抽出してoutに格納
names(out) <- paste(param4, 1:length(out), sep="_") #(multi-)FASTA形式のdescription部分を作成している
writeXStringSet(out, file=out_f, format="fasta", width=80) #outの中身をout_fで指定したファイル名で保存
}
#以下は(こんなこともできますという)おまけ
#out中の配列群について、配列長別に何readsあったかをカウントしてファイルに出力したい場合:
out_f2 <- "hoge2.txt" #出力ファイル名を指定
out2 <- NULL #最終的にout2という名前で結果を得るためのプレースホルダー(おまじない)
hoge <- out@ranges@width #以下のプログラムを見やすくするために配列長のベクトル(out@ranges@width)をhogeに格納(hogeとして取り扱っているだけ)
for(i in min(hoge):max(hoge)){ #配列長の最小値から最大値まで1刻みでループを回す
out2 <- rbind(out2, c(i, sum(hoge == i))) #配列長iの数をカウントした結果をout2に格納している
} #配列長の最小値から最大値まで1刻みでループを回す
colnames(out2) <- c("length", "count") #得られたout2の1列目は配列長情報、2列目はその配列長だったread数に相当するので、列名をそのように与えている
write.table(out2, out_f2, sep="\t", append=F, quote=F, row.names=F)#out2の中身をout_f2で指定したファイル名で保存。
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
フィルタリング | NGS(miRNA) | アダプター配列除去3(Illumina *_seq.txt; ミスマッチ数指定; 除去後の配列長条件,ACGTのみからなる配列を追加,重複あり)
アダプター配列除去2で指定した条件に加えて、"N"や"-"などを含まず"ACGT"からなる配列のみを得たい場合にこちらを参考にしてやります。
alphabetFrequency関数を用いて、得られる結果の1-4列分の情報([,1:4])を用いていることがわかります。
(これは「alphabet(DNAString())」とR Console画面上に打ち込んでみればわかりますが)alphabetFrequency関数の結果は、「alphabet(DNAString())」の表示結果からみられる順番に"A"がいくつあったか、"C"が...、という結果を返してくれます。
したがって、例えば"N"を含むのものだけを除去したい場合には、[,15]と指定してやって、この値が0のもののみピックアップするという手順を踏めばいいです。
以下を実行して得られるのは、"hoge.txt"というファイル名の(multi-)FASTA形式のファイルです。param4で指定している"kkk"の意味は、"hoge.txt"を開いてみてみればわかります。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
param1 <- "s_1_.*_seq.txt" #"s_1_*_seq.txt"という感じのファイル名のものを読み込みたい場合("."の有無に注意!!)
param2 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam2に格納
param3 <- 2 #許容するミスマッチの数を指定してparam3に格納
param4 <- "kkk" #(multi-)FASTA形式のdescription部分(の一部)を指定してparam4に格納
param5 <- 23:30 #RNA配列長の範囲を指定してparam5に格納
out_f <- "hoge.txt" #出力ファイル名を指定
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
files <- list.files(getwd(), pattern=param1) #param1で指定した正規表現にマッチする文字列を含むファイルのリストをfilesに格納
colClasses <- c(rep(list(NULL), 4), "DNAString") #DNAStringSetというオブジェクト形式にするための情報を予め作成している。最初の4列には"NULL"を、最後の5列目には"DNAString"というベクトルを作成してcolClassesに格納している
reads <- readXStringColumns(getwd(), param1, colClasses = colClasses)#colClassesで指定した列(この場合5列目)をreadXStringColumns関数を用いて読み込むことでXStringSetオブジェクト(この場合"X"は"DNA"に相当)にした結果をreadsに格納
hoge <- reads[[1]]@ranges@width #以下のプログラムを見やすくするためにアダプター配列除去前のベクトル(reads[[1]]@ranges@width)をhogeに格納
if(length(hoge) != sum(hoge == mean(hoge))){ #以下の4行分のif文で、hogeの各要素についてhogeの平均値(この場合mean(hoge)=36に相当)
cat("Error: Lengths of reads with adapter are different!\n") #に等しいものをカウントした結果(右辺に相当;この場合2220)が、元々のhogeの要素数
cat("You cannot use this program!\n") #(左辺のlength(hoge)に相当;この場合も2220)と等しくなければError以下の文を表示させている。
}else{ #もしこの文が表示されたら、同じ配列長でないものが含まれていることを意味するので、RNA配列長を指定することはあきらめてください
hoge2 <- trimLRPatterns(Rpattern=param2, subject=reads[[1]], max.Rmismatch = rep(param3, nchar(param2)))#アダプターを含む配列の長さが全部同じだった場合のみ、アダプター配列除去を行い、結果をhoge2に格納
out <- hoge2[((hoge2@ranges@width >= min(param5)) & (hoge2@ranges@width <= max(param5))),]#hoge2の中からparam5で指定した配列長の条件を満たすもののみ抽出してoutに格納
count <- rowSums(alphabetFrequency(DNAStringSet(out))[,1:4]) #各readについてACGTの総数をカウントし、結果をcountに格納
out2 <- out[out@ranges@width == count] #各readの長さ(out@ranges@width)とcountの結果を比較して、同じ長さもののみout2に格納
names(out2) <- paste(param4, 1:length(out2), sep="_") #(multi-)FASTA形式のdescription部分を作成している
writeXStringSet(out2, file=out_f, format="fasta", width=80) #out2の中身をout_fで指定したファイル名で保存
}
#以下は(こんなこともできますという)おまけ
#out中の配列群について、配列長別に何readsあったかをカウントしてファイルに出力したい場合:
out_f2 <- "hoge2.txt" #出力ファイル名を指定
out2 <- NULL #最終的にout2という名前で結果を得るためのプレースホルダー(おまじない)
hoge <- out@ranges@width #以下のプログラムを見やすくするために配列長のベクトル(out@ranges@width)をhogeに格納(hogeとして取り扱っているだけ)
for(i in min(hoge):max(hoge)){ #配列長の最小値から最大値まで1刻みでループを回す
out2 <- rbind(out2, c(i, sum(hoge == i))) #配列長iの数をカウントした結果をout2に格納している
} #配列長の最小値から最大値まで1刻みでループを回す
colnames(out2) <- c("length", "count") #得られたout2の1列目は配列長情報、2列目はその配列長だったread数に相当するので、列名をそのように与えている
write.table(out2, out_f2, sep="\t", append=F, quote=F, row.names=F)#out2の中身をout_f2で指定したファイル名で保存。
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
フィルタリング | NGS(miRNA) | アダプター配列除去4(Illumina *_seq.txt; ミスマッチ数指定; 除去後の配列長条件,ACGTのみからなる配列を追加,重複なし)
アダプター配列除去1,2,and 3の出力ファイル(hoge.txt)は、「全く同じ長さかつ同じ配列」のものを含んでいました。
このようなデータを"reads"といいます(らしいです)。それに対して、ユニークな配列にしたデータを"species"といいます(らしいです)。ユニークにするので、ファイルサイズは少なくてすみます。
しかし、ユニークにしたままでは、特定の配列が何回読まれたかという情報が消えてしまいます。
ここでは、(multi-)FASTA形式でspeciesで出力する際に、"description行(>行のあとの記述部分に相当)"に、何回読まれたかという情報を追加しています。
具体的には、「以下のparam4で指定したサンプルのIDらしきもの(kkk)」、「シリアル番号(sss)」、「何回読まれたかの情報(xxx)」を「_」で連結したものをdescription行に書き込むようにしています。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
param1 <- "s_1_.*_seq.txt" #"s_1_*_seq.txt"という感じのファイル名のものを読み込みたい場合("."の有無に注意!!)
param2 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam2に格納
param3 <- 2 #許容するミスマッチの数を指定してparam3に格納
param4 <- "kkk" #(multi-)FASTA形式のdescription部分(の一部)を指定してparam4に格納
param5 <- 23:30 #RNA配列長の範囲を指定してparam5に格納
out_f <- "hoge.txt" #出力ファイル名を指定
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
files <- list.files(getwd(), pattern=param1) #param1で指定した正規表現にマッチする文字列を含むファイルのリストをfilesに格納
colClasses <- c(rep(list(NULL), 4), "DNAString") #DNAStringSetというオブジェクト形式にするための情報を予め作成している。最初の4列には"NULL"を、最後の5列目には"DNAString"というベクトルを作成してcolClassesに格納している
reads <- readXStringColumns(getwd(), param1, colClasses = colClasses)#colClassesで指定した列(この場合5列目)をreadXStringColumns関数を用いて読み込むことでXStringSetオブジェクト(この場合"X"は"DNA"に相当)にした結果をreadsに格納
hoge <- reads[[1]]@ranges@width #以下のプログラムを見やすくするためにアダプター配列除去前のベクトル(reads[[1]]@ranges@width)をhogeに格納
if(length(hoge) != sum(hoge == mean(hoge))){ #以下の4行分のif文で、hogeの各要素についてhogeの平均値(この場合mean(hoge)=36に相当)
cat("Error: Lengths of reads with adapter are different!\n") #に等しいものをカウントした結果(右辺に相当;この場合2220)が、元々のhogeの要素数
cat("You cannot use this program!\n") #(左辺のlength(hoge)に相当;この場合も2220)と等しくなければError以下の文を表示させている。
}else{ #もしこの文が表示されたら、同じ配列長でないものが含まれていることを意味するので、RNA配列長を指定することはあきらめてください
hoge2 <- trimLRPatterns(Rpattern=param2, subject=reads[[1]], max.Rmismatch = rep(param3, nchar(param2)))#アダプターを含む配列の長さが全部同じだった場合のみ、アダプター配列除去を行い、結果をhoge2に格納
out <- hoge2[((hoge2@ranges@width >= min(param5)) & (hoge2@ranges@width <= max(param5))),]#hoge2の中からparam5で指定した配列長の条件を満たすもののみ抽出してoutに格納
count <- rowSums(alphabetFrequency(DNAStringSet(out))[,1:4]) #各readについてACGTの総数をカウントし、結果をcountに格納
out2 <- out[out@ranges@width == count] #各readの長さ(out@ranges@width)とcountの結果を比較して、同じ長さもののみout2に格納
out3 <- tables(out2, n=length(unique(out2))) #読まれた頻度順にshord readをソートして結果をout3に格納
out4 <- DNAStringSet(names(out3$top)) #short readsの配列情報(「names(out3$top)」)をDNAStringSetオブジェクトとしてout4に格納
names(out4) <- paste(param4, 1:length(out4), out3$top, sep="_")#(multi-)FASTA形式のdescription部分を作成している
writeXStringSet(out4, file=out_f, format="fasta", width=80) #out4の中身をout_fで指定したファイル名で保存
}
#以下は(こんなこともできますという)おまけ
#out中の配列群について、配列長別に何readsあったかをカウントしてファイルに出力したい場合:
out_f2 <- "hoge2.txt" #出力ファイル名を指定
out2 <- NULL #最終的にout2という名前で結果を得るためのプレースホルダー(おまじない)
hoge <- out@ranges@width #以下のプログラムを見やすくするために配列長のベクトル(out@ranges@width)をhogeに格納(hogeとして取り扱っているだけ)
for(i in min(hoge):max(hoge)){ #配列長の最小値から最大値まで1刻みでループを回す
out2 <- rbind(out2, c(i, sum(hoge == i))) #配列長iの数をカウントした結果をout2に格納している
} #配列長の最小値から最大値まで1刻みでループを回す
colnames(out2) <- c("length", "count") #得られたout2の1列目は配列長情報、2列目はその配列長だったread数に相当するので、列名をそのように与えている
write.table(out2, out_f2, sep="\t", append=F, quote=F, row.names=F)#out2の中身をout_f2で指定したファイル名で保存。
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
フィルタリング | NGS(miRNA) | アダプター配列除去(Illumina *_qseq.txt; ミスマッチ数指定; 除去後の配列長条件,ACGTのみからなる配列を追加,重複あり)
アダプター配列除去2で指定した条件に加えて、"N"や"-"などを含まず"ACGT"からなる配列のみを得たい場合にこちらを参考にしてやります。
param1で指定する内容は、"s_2_1_0001_qseq.txt"から"s_2_0120_qseq.txt"のファイル名からなる120個のファイルを含むディレクトリを指定して解析を行うときの例です。
例えば"s_5_1_0001_qseq.txt"から"s_5_0120_qseq.txt"のファイル名からなる120個のファイルを含むディレクトリを指定して解析する場合は、param1で指定するところをs_5_1_.*_qseq.txtとして下さい。
以下を実行して得られるのは、"hoge.txt"というファイル名の(multi-)FASTA形式のファイルです。param4で指定している"kkk"の意味は、"hoge.txt"を開いてみてみればわかります。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
param1 <- "s_._._.*_qseq.txt" #"s_._._.*_qseq.txt"という感じのファイル名のものを読み込みたい場合("."の有無に注意!!)
param2 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam2に格納
param3 <- 2 #許容するミスマッチの数を指定してparam3に格納
param4 <- "kkk" #(multi-)FASTA形式のdescription部分(の一部)を指定してparam4に格納
param5 <- 23:30 #RNA配列長の範囲を指定してparam5に格納
out_f <- "hoge.txt" #出力ファイル名を指定
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
files <- list.files(getwd(), pattern=param1) #param1で指定した正規表現にマッチする文字列を含むファイルのリストをfilesに格納
colClasses <- rep(list(NULL), 11) #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[9:10] <- c("DNAString", "BString") #DNAStringSetというオブジェクト形式にするための情報を予め作成している。9, 10列目がそれぞれ"DNAString", "BString"だという情報を与えている
reads <- readXStringColumns(getwd(), param1, colClasses = colClasses)#colClassesで指定した列(この場合5列目)をreadXStringColumns関数を用いて読み込むことでXStringSetオブジェクト(この場合"X"は"DNA"に相当)にした結果をreadsに格納
hoge <- reads[[1]]@ranges@width #以下のプログラムを見やすくするためにアダプター配列除去前のベクトル(reads[[1]]@ranges@width)をhogeに格納
if(length(hoge) != sum(hoge == mean(hoge))){ #以下の4行分のif文で、hogeの各要素についてhogeの平均値(この場合mean(hoge)=36に相当)
cat("Error: Lengths of reads with adapter are different!\n") #に等しいものをカウントした結果(右辺に相当;この場合2220)が、元々のhogeの要素数
cat("You cannot use this program!\n") #(左辺のlength(hoge)に相当;この場合も2220)と等しくなければError以下の文を表示させている。
}else{ #もしこの文が表示されたら、同じ配列長でないものが含まれていることを意味するので、RNA配列長を指定することはあきらめてください
hoge2 <- trimLRPatterns(Rpattern=param2, subject=reads[[1]], max.Rmismatch = rep(param3, nchar(param2)))#アダプターを含む配列の長さが全部同じだった場合のみ、アダプター配列除去を行い、結果をhoge2に格納
out <- hoge2[((hoge2@ranges@width >= min(param5)) & (hoge2@ranges@width <= max(param5))),]#hoge2の中からparam5で指定した配列長の条件を満たすもののみ抽出してoutに格納
count <- rowSums(alphabetFrequency(DNAStringSet(out))[,1:4]) #各readについてACGTの総数をカウントし、結果をcountに格納
out2 <- out[out@ranges@width == count] #各readの長さ(out@ranges@width)とcountの結果を比較して、同じ長さもののみout2に格納
names(out2) <- paste(param4, 1:length(out2), sep="_") #(multi-)FASTA形式のdescription部分を作成している
writeXStringSet(out2, file=out_f, format="fasta", width=80) #out2の中身をout_fで指定したファイル名で保存
}
#以下は(こんなこともできますという)おまけ
#out中の配列群について、配列長別に何readsあったかをカウントしてファイルに出力したい場合:
out_f2 <- "hoge2.txt" #出力ファイル名を指定
out2 <- NULL #最終的にout2という名前で結果を得るためのプレースホルダー(おまじない)
hoge <- out@ranges@width #以下のプログラムを見やすくするために配列長のベクトル(out@ranges@width)をhogeに格納(hogeとして取り扱っているだけ)
for(i in min(hoge):max(hoge)){ #配列長の最小値から最大値まで1刻みでループを回す
out2 <- rbind(out2, c(i, sum(hoge == i))) #配列長iの数をカウントした結果をout2に格納している
} #配列長の最小値から最大値まで1刻みでループを回す
colnames(out2) <- c("length", "count") #得られたout2の1列目は配列長情報、2列目はその配列長だったread数に相当するので、列名をそのように与えている
write.table(out2, out_f2, sep="\t", append=F, quote=F, row.names=F)#out2の中身をout_f2で指定したファイル名で保存。
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
フィルタリング | NGS(miRNA) | アダプター配列除去(FASTQファイル; girafe; Toedling_2010)
一般的なNGSのファイル形式であるFASTQ形式ファイル(3'側にアダプター配列を含む塩基配列からなる)を読み込んでアダプター配列除去を行います。
ここでは、NCBI Sequence Read Archive (SRA)から得られる(従ってSanger FASTQ形式)
FASTQ形式ファイル(例としてSRR037439.fastq; 実在のファイルの最初の2000行分)を読み込んで行うやり方を紹介します。
実際にアダプター配列除去のための関数は参考文献1のgirafeというRパッケージで提供されたものを使っています。
注意点1としては、実際に塩基配列長が短くなっていてもdescription行の記述(特に配列長情報の記述)は変わりませんので、「なんかおかしい」と気にしなくて大丈夫です。
注意点2としては、例えば、アダプター配列の5'側が「CATCG...」となっているにも関わらずなぜ二番目の配列の3'側「...CATAG」の最後の5塩基がトリムされているのだろう?
と疑問に思われる方がいらっしゃるかもしれませんが、これは。R Console上で「?trimAdapter」と打ち込んでデフォルトのオプションを眺めることで理由がわかります。
つまり、アラインメントスコア計算時に、この関数はデフォルトで一致に1点、不一致に-1点を与えて一塩基づつオーバーラップの度合いを上げていく、という操作をしているからです。
したがって、もし完全一致のみに限定したい場合は、trimAdapter関数のところで、不一致に対して大幅に減点するようなパラメータを与えればいいんです。例えば「mismatch.score = -1000」とか。。。
以下では、以下の3つの場合のやり方を示します(ちょっとづつ結果が異なることがわかります):
1. trimAdapter関数のデフォルトの場合
2. param1で指定するアダプター配列と完全一致のみで且つ、最低2塩基以上一致しないとトリムしない場合
3. param1で指定するアダプター配列と完全一致のみで且つ、最低4塩基以上一致しないとトリムしない場合
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. デフォルトのパラメータ(一致に1点、不一致に-1点)を採用する場合:
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTQ形式のファイル名を指定してin_fに格納
out_f <- "hoge1.fastq" #アダプター配列除去後の出力ファイル名を指定してout_fに格納
param1 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam1に格納
#必要なパッケージをロード
library(girafe) #パッケージの読み込み
#FASTQ形式ファイルの読み込み
readq <- readFastq(in_f) #in_fで指定したファイルの読み込み
#本番
out <- trimAdapter(readq, param1) #trimAdapter関数を用いてアダプター配列除去した結果をoutに格納
writeFastq(out, out_f) #オブジェクトoutをFASTQ形式で保存
head(sread(readq)) #アダプター配列除去前の塩基配列(の一部)を表示させてるだけ
head(sread(out)) #アダプター配列除去後の塩基配列(の一部)を表示させてるだけ
table(width(readq)) #アダプター配列除去前の塩基配列の配列長を示しているだけ(「35bpのものが500配列」という意味)
table(width(out)) #アダプター配列除去後の塩基配列の配列長を示しているだけ(「35bpのものが464配列, 33bpのものが8配列, ...」という意味)
------ ここまで ------
2. paramで指定するアダプター配列と完全一致のみで且つ、最低2塩基以上一致しないとトリムしない場合:
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTQ形式のファイル名を指定してin_fに格納
out_f <- "hoge2.fastq" #アダプター配列除去後の出力ファイル名を指定してout_fに格納
param1 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam1に格納
param2 <- 2 #アダプター配列との最低一致塩基数をparam2に格納
mismatch <- nchar(param1) + 100 #不一致に対して大幅に減点するための値を「アダプター配列長 + 100」としている(100を余分に足しているのは念のためです)
#必要なパッケージをロード
library(girafe) #パッケージの読み込み
#FASTQ形式ファイルの読み込み
readq <- readFastq(in_f) #in_fで指定したファイルの読み込み
#本番
out <- trimAdapter(readq, param1, mismatch.score = -mismatch, score.threshold = param2)#trimAdapter関数を用いてアダプター配列除去した結果をoutに格納
writeFastq(out, out_f) #オブジェクトoutをFASTQ形式で保存
head(sread(readq)) #アダプター配列除去前の塩基配列(の一部)を表示させてるだけ
head(sread(out)) #アダプター配列除去後の塩基配列(の一部)を表示させてるだけ
table(width(readq)) #アダプター配列除去前の塩基配列の配列長を示しているだけ(「35bpのものが500配列」という意味)
table(width(out)) #アダプター配列除去後の塩基配列の配列長を示しているだけ(「35bpのものが487配列, 33bpのものが10配列, ...」という意味)
------ ここまで ------
3. param1で指定するアダプター配列と完全一致のみで且つ、最低4塩基以上一致しないとトリムしない場合:
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTQ形式のファイル名を指定してin_fに格納
out_f <- "hoge3.fastq" #アダプター配列除去後の出力ファイル名を指定してout_fに格納
param1 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam1に格納
param2 <- 4 #アダプター配列との最低一致塩基数をparam2に格納
mismatch <- nchar(param1) + 100 #不一致に対して大幅に減点するための値を「アダプター配列長 + 100」としている(100を余分に足しているのは念のためです)
#必要なパッケージをロード
library(girafe) #パッケージの読み込み
#FASTQ形式ファイルの読み込み
readq <- readFastq(in_f) #in_fで指定したファイルの読み込み
#本番
out <- trimAdapter(readq, param1, mismatch.score = -mismatch, score.threshold = param2)#trimAdapter関数を用いてアダプター配列除去した結果をoutに格納
writeFastq(out, out_f) #オブジェクトoutをFASTQ形式で保存
head(sread(readq)) #アダプター配列除去前の塩基配列(の一部)を表示させてるだけ
head(sread(out)) #アダプター配列除去後の塩基配列(の一部)を表示させてるだけ
table(width(readq)) #アダプター配列除去前の塩基配列の配列長を示しているだけ(「35bpのものが500配列」という意味)
table(width(out)) #アダプター配列除去後の塩基配列の配列長を示しているだけ(「35bpのものが498配列, 31bpのものが2配列」という意味)
------ ここまで ------
Bioconductorのgirafeのwebページ
参考文献1(Toedling et al., Bioinformatics, 2010)
フィルタリング | NGS(miRNA) | アダプター配列除去(FASTQファイル; ShortRead; Morgan_2009)
一般的なNGSのファイル形式であるFASTQ形式ファイル(3'側にアダプター配列を含む塩基配列からなる)を読み込んでアダプター配列除去を行います。
ここでは、NCBI Sequence Read Archive (SRA)から得られる(従ってSanger FASTQ形式)
FASTQ形式ファイル(例としてSRR037439.fastq; 実在のファイルの最初の2000行分)を読み込んで行うやり方を紹介します。
実際にアダプター配列除去のための関数は参考文献1のShortReadというRパッケージで提供されたものを使っています。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. 基本形(2塩基ミスマッチまで許容してFASTA形式で出力したい場合):
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTQ形式のファイル名を指定してin_fに格納
out_f <- "hoge1.fa" #アダプター配列除去後の出力ファイル名を指定してout_fに格納
param1 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam1に格納
param2 <- 2 #許容するミスマッチの数を指定してparam2に格納
#必要なパッケージをロード
library(ShortRead) #パッケージの読み込み
#FASTQ形式ファイルの読み込み
readq <- readFastq(in_f) #in_fで指定したファイルの読み込み
#本番(アダプター配列除去)
out <- trimLRPatterns(Rpattern=param1, subject=sread(readq), max.Rmismatch=rep(param2, nchar(param1)))#アダプター配列除去を行った結果をoutに格納
names(out) <- id(readq) #description部分の記述をid(reads)で与えている
#FASTA形式で出力
tmp <- out #outの中身をtmpにコピーしているだけ
writeXStringSet(tmp, file=out_f, format="fasta", width=50) #tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
2. 上記1.のミスマッチ数指定に加え、アダプター配列除去後の配列長の範囲(23bp-30bp)を指定したい場合:
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTQ形式のファイル名を指定してin_fに格納
out_f <- "hoge2.fa" #アダプター配列除去後の出力ファイル名を指定してout_fに格納
param1 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam1に格納
param2 <- 2 #許容するミスマッチの数を指定してparam2に格納
param3 <- c(23, 30) #RNA配列長の最小と最大値を指定してparam3に格納
#必要なパッケージをロード
library(ShortRead) #パッケージの読み込み
#FASTQ形式ファイルの読み込み
readq <- readFastq(in_f) #in_fで指定したファイルの読み込み
#アダプター配列除去
out <- trimLRPatterns(Rpattern=param1, subject=sread(readq), max.Rmismatch=rep(param2, nchar(param1)))#アダプター配列除去を行った結果をoutに格納
names(out) <- id(readq) #description部分の記述をid(reads)で与えている
#指定した配列長条件によるフィルタリング
obj <- ((width(out) >= min(param3)) & (width(out) <= max(param3)))#条件を満たす配列長を持つ要素をTRUE、それ以外をFALSEとした論理値ベクトルobjを作成
out2 <- out[obj] #objがTRUEとなる要素のみ抽出した結果をout2に格納
#FASTA形式で出力
tmp <- out2 #out2の中身をtmpにコピーしているだけ
writeXStringSet(tmp, file=out_f, format="fasta", width=50) #tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
3. 上記2.の「ミスマッチ数と配列長の範囲」指定に加え、ACGTのみからなる配列のみを抽出したい場合:
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTQ形式のファイル名を指定してin_fに格納
out_f <- "hoge3.fa" #アダプター配列除去後の出力ファイル名を指定してout_fに格納
param1 <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列情報を指定してparam1に格納
param2 <- 2 #許容するミスマッチの数を指定してparam2に格納
param3 <- c(23, 30) #RNA配列長の最小と最大値を指定してparam3に格納
#必要なパッケージをロード
library(ShortRead) #パッケージの読み込み
#FASTQ形式ファイルの読み込み
readq <- readFastq(in_f) #in_fで指定したファイルの読み込み
#本番(アダプター配列除去)
out <- trimLRPatterns(Rpattern=param1, subject=sread(readq), max.Rmismatch=rep(param2, nchar(param1)))#アダプター配列除去を行った結果をoutに格納
names(out) <- id(readq) #description部分の記述をid(reads)で与えている
#指定した配列長条件によるフィルタリング
obj <- ((width(out) >= min(param3)) & (width(out) <= max(param3)))#条件を満たす配列長を持つ要素をTRUE、それ以外をFALSEとした論理値ベクトルobjを作成
out2 <- out[obj] #objがTRUEとなる要素のみ抽出した結果をout2に格納
#ACGTのみからなるもの(Nなどを含まない)をフィルタリング
count <- rowSums(alphabetFrequency(DNAStringSet(out2))[,1:4]) #各readについてACGTの総数をカウントし、結果をcountに格納
out3 <- out2[width(out2) == count] #各readの長さwidth(out2)とcountの結果を比較して、同じ長さもののみout3に格納
#FASTA形式で出力
tmp <- out3 #out3の中身をtmpにコピーしているだけ
writeXStringSet(tmp, file=out_f, format="fasta", width=50) #tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
フィルタリング | NGS(一般) | ゲノムへのマップ後のファイルから必要な情報のみ抽出(SOAP形式ファイル)
ここでは、「マップ後のファイルの読み込み」と「その後のフィルタリング」を明示的に2段階に分けて示します。
以下の例で示すSOAP以外のフォーマットも「ファイルの読み込み | マップ後」を参考にして、必要な情報さえ読み込んでおけば、2段階目以降は同じです。
以下では、、SOAP(参考文献1)を実行して得られた、
850行からなるoutput.soapファイルの読み込みから、
「8番染色体上の+鎖のみにマップされたもののみ」など、いくつか例示します。
ちなみにここでは染色体とstrandのみのフィルタリングを示しましたが、他にもpolyAフィルタリングができるような関数(例えばpolynFilter)もあります。
詳細はR Console画面上で、「?srFilter」と打ち込んでみてください。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. 「8番染色体上の+鎖のみにマップされたもののみ」の場合のやり方1:
------ ここから ------
in_f <- "output.soap" #読み込みたいSOAP出力ファイル名を指定してin_fに格納
param1 <- "chr08" #染色体の条件
param2 <- "+" #strandの条件
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
#第1段階:マップ後のファイルの読み込み
output <- readAligned(in_f, type="SOAP") #in_fで指定したファイルの読み込み
#第2段階:フィルタリング
output <- output[output@chromosome == param1] #param1で指定した染色体の情報のみ抽出して、readsに格納
output <- output[output@strand == "+"] #param2で指定したstrandのもののみ抽出して、readsに格納
#以下は(こんなこともできますという)おまけ
reads <- sread(output) #outputで得られたオブジェクトから塩基配列情報をDNAStringSetオブジェクトとして得たい場合
------ ここまで ------
2. 「8番染色体上の+鎖のみにマップされたもののみ」の場合のやり方2:
------ ここから ------
in_f <- "output.soap" #読み込みたいSOAP出力ファイル名を指定してin_fに格納
param1 <- "chr08" #染色体の条件
param2 <- "+" #strandの条件
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
#第1段階:マップ後のファイルの読み込み
output <- readAligned(in_f, type="SOAP") #in_fで指定したファイルの読み込み
#第2段階:フィルタリング
filter <- compose(chromosomeFilter(param1), strandFilter(param2))#param1 and param2で指定したフィルタリング条件をまとめてfilterに格納
output <- output[filter(output)] #フィルタリングを実行して、その結果をreadsに格納
#以下は(こんなこともできますという)おまけ
reads <- sread(output) #outputで得られたオブジェクトから塩基配列情報をDNAStringSetオブジェクトとして得たい場合
------ ここまで ------
3. 「strandは気にせずに10番染色体上にマップされたもののみ」の場合:
------ ここから ------
in_f <- "output.soap" #読み込みたいSOAP出力ファイル名を指定してin_fに格納
param1 <- "chr10" #染色体の条件
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
#第1段階:マップ後のファイルの読み込み
output <- readAligned(in_f, type="SOAP") #in_fで指定したファイルの読み込み
#第2段階:フィルタリング
filter <- compose(chromosomeFilter(param1)) #param1で指定したフィルタリング条件をまとめてfilterに格納
output <- output[filter(output)] #フィルタリングを実行して、その結果をreadsに格納
#以下は(こんなこともできますという)おまけ
reads <- sread(output) #outputで得られたオブジェクトから塩基配列情報をDNAStringSetオブジェクトとして得たい場合
------ ここまで ------
4. 「マップされた染色体全てについてマップされたリード数などの基礎情報を取得」の場合:
------ ここから ------
in_f <- "output.soap" #読み込みたいSOAP出力ファイル名を指定してin_fに格納
out_f <- "output.hoge" #出力ファイル名を指定
#第1段階:マップ後のファイルの読み込み
library(ShortRead) #パッケージの読み込み
output <- readAligned(in_f, type="SOAP") #in_fで指定したファイルの読み込み
#第2段階:基礎情報取得
unique_chr <- sort(unique(output@chromosome)) #マップされた染色体情報を取得してunique_chrに格納
out <- NULL #おまじない
for(j in 1:length(unique_chr)){ #unique_chr中の染色体数分だけループを回す
output_sub <- output[output@chromosome == unique_chr[j]] #特定の染色体上にマップされたもののみ抽出してoutput_subに格納
out <- rbind(out, c(unique_chr[j], length(output_sub))) #染色体名(unique_chr[j])とその染色体上にマップされたリード数(length(output_sub))をまとめてoutに格納
}
colnames(out) <- c("chromosome_name", "reads_mapped") #列名を左記のように与えている
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身をout_fで指定したファイル名で保存。
------ ここまで ------
5. 「4. マップされた染色体全てについてマップされたリード数などの基礎情報を取得」の出力ファイル名の自動作成(拡張子.hoge)版:
割と便利なので備忘録的に掲載しておきます。
------ ここから ------
in_f <- "output.soap" #読み込みたいSOAP出力ファイル名を指定してin_fに格納
param <- "hoge" #出力ファイル名の拡張子を指定
out_f <- paste(unlist(strsplit(in_f, ".", fixed=TRUE))[1], param, sep=".") #出力ファイル名を作成してout_fに格納
#第1段階:マップ後のファイルの読み込み
library(ShortRead) #パッケージの読み込み
output <- readAligned(in_f, type="SOAP") #in_fで指定したファイルの読み込み
#第2段階:基礎情報取得
unique_chr <- sort(unique(output@chromosome)) #マップされた染色体情報を取得してunique_chrに格納
out <- NULL #おまじない
for(j in 1:length(unique_chr)){ #unique_chr中の染色体数分だけループを回す
output_sub <- output[output@chromosome == unique_chr[j]] #特定の染色体上にマップされたもののみ抽出してoutput_subに格納
out <- rbind(out, c(unique_chr[j], length(output_sub))) #染色体名(unique_chr[j])とその染色体上にマップされたリード数(length(output_sub))をまとめてoutに格納
}
colnames(out) <- c("chromosome_name", "reads_mapped") #列名を左記のように与えている
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身をout_fで指定したファイル名で保存。
------ ここまで ------
6. 「5」を基本形として、さらにstrand(+ or -)別の情報を追加したもの:
割と便利なので備忘録的に掲載しておきます。
------ ここから ------
in_f <- "output.soap" #読み込みたいSOAP出力ファイル名を指定してin_fに格納
param <- "hoge" #出力ファイル名の拡張子を指定
out_f <- paste(unlist(strsplit(in_f, ".", fixed=TRUE))[1], param, sep=".") #出力ファイル名を作成してout_fに格納
#第1段階:マップ後のファイルの読み込み
library(ShortRead) #パッケージの読み込み
output <- readAligned(in_f, type="SOAP") #in_fで指定したファイルの読み込み
#第2段階:基礎情報取得
unique_chr <- sort(unique(output@chromosome)) #マップされた染色体情報を取得してunique_chrに格納
out <- NULL #おまじない
for(j in 1:length(unique_chr)){ #unique_chr中の染色体数分だけループを回す
output_sub <- output[output@chromosome == unique_chr[j]] #特定の染色体上にマップされたもののみ抽出してoutput_subに格納
output_sub_f <- output_sub[output_sub@strand == "+"] #output_subの中で"+"鎖上にマップされたものをoutput_sub_fに格納
output_sub_r <- output_sub[output_sub@strand == "-"] #output_subの中で"-"鎖上にマップされたものをoutput_sub_rに格納
out <- rbind(out, c(unique_chr[j],length(output_sub),length(output_sub_f),length(output_sub_r)))#「染色体名(unique_chr[j])」、「その染色体上にマップされたリード数(length(output_sub))」、「+鎖上に...」、「-鎖上に...」をまとめてoutに格納
}
colnames(out) <- c("chromosome_name", "reads_mapped", "reads_mapped(+)", "reads_mapped(-)") #列名を左記のように与えている
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身をout_fで指定したファイル名で保存。
------ ここまで ------
BioconductorのBiostringsのwebページ
参考文献1(Li et al., Bioinformatics., 2009)
フィルタリング | NGS | quality scoreの評価1 (FASTQファイルを読み込んでPHREDスコア化した結果を眺める)
「ファイルの読み込み | マップ前 | FASTQ形式」とも若干かぶりますが、ここでは、
NCBI Sequence Read Archive (SRA)から得られる(従ってSanger FASTQ形式)
FASTQ形式ファイル(例としてSRR037439.fastq; 実在のファイルの最初の2000行分)を読み込んで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 (ASCIIコードからPHREDスコアに変換してその数値情報をタブ区切りテキストファイルで保存したい場合):
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "SRR037439.txt" #出力ファイル名を指定してout_fに格納
library(ShortRead) #パッケージの読み込み
reads <- readFastq(in_f) #in_fで指定したファイルの読み込み
hoge <- strsplit(as.character(id(reads)), " ", fixed=TRUE) #id(reads)中の文字列を" "で区切った結果をリスト形式でhogeに格納
serial <- sapply(hoge,"[[", 1) #hogeのリスト中の一番目の要素のみ取り出してserialに格納
out <- ShortReadQ(sread(reads), quality(reads), BStringSet(serial))#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをoutに格納
qscore <- as(quality(out), "matrix") #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をqscoreに格納
dim(qscore) #qscoreの行数と列数を確認しているだけ
rownames(qscore) <- serial #qscoreの行名をserialで与えている
colnames(qscore) <- 1:ncol(qscore) #qscoreの列名を1:ncol(qscore)の数値ベクトルで与えている
tmp <- cbind(serial, qscore) #qscore行列の左側にserialを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
やり方2 (ASCIIコードからPHREDスコアに変換した結果の分布をboxplotで描きたい場合):
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
library(ShortRead) #パッケージの読み込み
reads <- readFastq(in_f) #in_fで指定したファイルの読み込み
hoge <- strsplit(as.character(id(reads)), " ", fixed=TRUE) #id(reads)中の文字列を" "で区切った結果をリスト形式でhogeに格納
serial <- sapply(hoge,"[[", 1) #hogeのリスト中の一番目の要素のみ取り出してserialに格納
out <- ShortReadQ(sread(reads), quality(reads), BStringSet(serial))#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをoutに格納
qscore <- as(quality(out), "matrix") #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をqscoreに格納
rownames(qscore) <- serial #qscoreの行名をserialで与えている
colnames(qscore) <- 1:ncol(qscore) #qscoreの列名を1:ncol(qscore)の数値ベクトルで与えている
boxplot(as.data.frame(qscore), outline=FALSE, xlab="cycle number", ylab="PHRED score")#qscoreをdata.frame形式にしてboxplotを描画(outline=FALSEの意味は、外れ値を描画しない、です。)
------ ここまで ------
やり方3 (ASCIIコードからPHREDスコアに変換した結果の分布をboxplotでpngファイルに保存したい場合):
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "SRR037439.png" #出力ファイル名を指定してout_fに格納
param1 <- 600 #横幅(width; 単位はピクセル)を指定
param2 <- 400 #縦幅(height; 単位はピクセル)を指定
param3 <- 13 #文字の大きさ(単位はpoint)を指定
library(ShortRead) #パッケージの読み込み
reads <- readFastq(in_f) #in_fで指定したファイルの読み込み
hoge <- strsplit(as.character(id(reads)), " ", fixed=TRUE) #id(reads)中の文字列を" "で区切った結果をリスト形式でhogeに格納
serial <- sapply(hoge,"[[", 1) #hogeのリスト中の一番目の要素のみ取り出してserialに格納
out <- ShortReadQ(sread(reads), quality(reads), BStringSet(serial))#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをoutに格納
qscore <- as(quality(out), "matrix") #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をqscoreに格納
rownames(qscore) <- serial #qscoreの行名をserialで与えている
colnames(qscore) <- 1:ncol(qscore) #qscoreの列名を1:ncol(qscore)の数値ベクトルで与えている
png(out_f, pointsize=param3, width=param1, height=param2) #出力ファイルの各種パラメータを指定
boxplot(as.data.frame(qscore), outline=FALSE, xlab="cycle number", ylab="PHRED score")#qscoreをdata.frame形式にしてboxplotを描画(outline=FALSEの意味は、外れ値を描画しない、です。)
dev.off() #おまじない
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
フィルタリング | NGS | quality scoreの評価2 (FASTQファイルを読み込んでPHREDスコアが低いリードを除去する)
ここでは、NCBI Sequence Read Archive (SRA)から得られる(従ってSanger FASTQ形式)
FASTQ形式ファイル(例としてSRR037439.fastq; 実在のファイルの最初の2000行分)を読み込んで、ASCIIコードで表現されたquality scoreをPHREDスコアに変換した後のデータに対して、PHREDスコアが低いリードを除去するやり方を紹介します。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. PHREDスコアが20未満のものがリード長に占める割合が0.1以上のリードを除去する場合:
(例題のファイル中のリードは全て35bpのリードである。その10%以上ということで実質的にPHREDスコアが閾値未満のものが4塩基以上あるリードはダメ、ということになる)
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "SRR037439_f.fastq" #出力ファイル名を指定してout_fに格納
param1 <- 20 #PHREDスコアの閾値を指定
param2 <- 0.1 #指定した閾値未満のものがリード長に占める割合を指定
library(ShortRead) #パッケージの読み込み
reads <- readFastq(in_f) #in_fで指定したファイルの読み込み
hoge <- strsplit(as.character(id(reads)), " ", fixed=TRUE) #id(reads)中の文字列を" "で区切った結果をリスト形式でhogeに格納
serial <- sapply(hoge,"[[", 1) #hogeのリスト中の一番目の要素のみ取り出してserialに格納
hoge2 <- ShortReadQ(sread(reads), quality(reads), BStringSet(serial))#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをhoge2に格納
qscore <- as(quality(hoge2), "matrix") #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をqscoreに格納
obj <- (rowSums(qscore < param1) <= width(hoge2)*param2) #param1およびparam2で指定した条件を満たすリードをTRUE、そうでないものをFALSEとしたものをobjに格納
nrow(qscore) #qscoreの行数を表示させてもともとのリード数を表示させてるだけ
sum(obj) #obj中のTRUEの要素数(除去されずに残ったリード数)を表示させてるだけ
out <- hoge2[obj] #hoge2の中からobj中の要素がTRUEのもののみ抽出した結果をoutに格納
writeFastq(out, out_f) #オブジェクトoutをFASTQ形式で保存
------ ここまで ------
2. 各リードに対するPHREDスコアが20以上の塩基数が0.9より多いリードのみ抽出したい場合:
(1と同じことを別の言葉で表現しているだけです。)
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "SRR037439_f.fastq" #出力ファイル名を指定してout_fに格納
param1 <- 20 #PHREDスコアの閾値を指定
param2 <- 0.9 #指定した閾値以上の塩基数の各リードに占める割合を指定
library(ShortRead) #パッケージの読み込み
reads <- readFastq(in_f) #in_fで指定したファイルの読み込み
hoge <- strsplit(as.character(id(reads)), " ", fixed=TRUE) #id(reads)中の文字列を" "で区切った結果をリスト形式でhogeに格納
serial <- sapply(hoge,"[[", 1) #hogeのリスト中の一番目の要素のみ取り出してserialに格納
hoge2 <- ShortReadQ(sread(reads), quality(reads), BStringSet(serial))#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをhoge2に格納
qscore <- as(quality(hoge2), "matrix") #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をqscoreに格納
obj <- (rowSums(qscore >= param1) > width(hoge2)*param2) #param1およびparam2で指定した条件を満たすリードをTRUE、そうでないものをFALSEとしたものをobjに格納
nrow(qscore) #qscoreの行数を表示させてもともとのリード数を表示させてるだけ
sum(obj) #obj中のTRUEの要素数(除去されずに残ったリード数)を表示させてるだけ
out <- hoge2[obj] #hoge2の中からobj中の要素がTRUEのもののみ抽出した結果をoutに格納
writeFastq(out, out_f) #オブジェクトoutをFASTQ形式で保存
------ ここまで ------
#3. 各リードに対するPHREDスコアが任意の閾値以上の塩基数をまずは自分で眺めたい場合:
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "SRR037439_f.txt" #出力ファイル名を指定してout_fに格納
param1 <- 20 #PHREDスコアの閾値を指定
library(ShortRead) #パッケージの読み込み
reads <- readFastq(in_f) #in_fで指定したファイルの読み込み
hoge <- strsplit(as.character(id(reads)), " ", fixed=TRUE) #id(reads)中の文字列を" "で区切った結果をリスト形式でhogeに格納
serial <- sapply(hoge,"[[", 1) #hogeのリスト中の一番目の要素のみ取り出してserialに格納
hoge2 <- ShortReadQ(sread(reads), quality(reads), BStringSet(serial))#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをhoge2に格納
qscore <- as(quality(hoge2), "matrix") #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をqscoreに格納
obj_num <- rowSums(qscore >= param1) #param1で指定した条件を満たすリードごとの塩基数をobj_numに格納
obj_percent <- 100*obj_num/width(hoge2) #obj_num中の塩基数をパーセンテージに変換したものをobj_percentに格納
tmp <- cbind(serial, width(hoge2), obj_num, obj_percent) #「リードのシリアル番号」、「リードの長さ」、「obj_num」、「obj_percent」を列方向に結合したものをtmpに格納
colnames(tmp) <- c("serial", "read_length", "nucleotide_number", "percentage")#tmpに対して任意の列名を与えている
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
フィルタリング | NGS | quality scoreの評価3 (FASTQファイルを読み込んでPHREDスコアが低い塩基を"N"に置換する)
ここでは、NCBI Sequence Read Archive (SRA)から得られる(従ってSanger FASTQ形式)
FASTQ形式ファイル(例としてSRR037439.fastq; 実在のファイルの最初の2000行分)を読み込んで、ASCIIコードで表現されたquality scoreをPHREDスコアに変換し、PHREDスコアが任意の閾値未満の塩基を"N"に置換するやり方を紹介します。
まだ未確認ですが、おそらく以下の方法は、リード長が全て同じであるという前提で行っているような気がしますので、リード長が異なるものに適用した場合に不具合が生じるかもしれません。。。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
in_f <- "SRR037439.fastq" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "SRR037439_f.fastq" #出力ファイル名を指定してout_fに格納
param1 <- 20 #PHREDスコアの閾値を指定
param2 <- "N" #置換後の文字を指定
library(Biostrings) #パッケージの読み込み
library(ShortRead) #パッケージの読み込み
reads <- readFastq(in_f) #in_fで指定したファイルの読み込み
hoge <- strsplit(as.character(id(reads)), " ", fixed=TRUE) #id(reads)中の文字列を" "で区切った結果をリスト形式でhogeに格納
serial <- sapply(hoge,"[[", 1) #hogeのリスト中の一番目の要素のみ取り出してserialに格納
hoge2 <- ShortReadQ(sread(reads), quality(reads), BStringSet(serial))#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをhoge2に格納
qscore <- as(quality(hoge2), "matrix") #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をqscoreに格納
at <- qscore < param1 #param1で指定した条件を満たす塩基をTRUE、そうでないものをFALSEとした結果をatに格納
hoge3 <- DNAString(paste(rep(param2, width(hoge2)[1]), collapse=""))#「リード長がwidth(hoge2)[1]」で「全ての塩基がparam2で指定した文字」からなるDNAStringオブジェクトを作成してhoge3に格納(この場合Nが35個からなる塩基配列に相当)
letter <- as(Views(hoge3, start=1, end=rowSums(at)), "DNAStringSet")#rowSums(at)で各リードごとのPHREDスコアが閾値未満の塩基数がわかるので、その塩基数分からなるparam2の文字のDNAStringSetオブジェクトを作成してletterに格納
hoge4 <- replaceLetterAt(sread(hoge2), at, letter) #atやletterを作成したのは、ここで用いている目的のreplaceLetterAt関数がそれらの情報を用いて該当塩基部分の置換を行うからです
out <- ShortReadQ(hoge4, quality(reads), BStringSet(serial)) #ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをoutに格納
sread(out) #sread(out)の中身を表示させてるだけ(Nが増えているのがわかる; hoge4でも同じ)
writeFastq(out, out_f) #オブジェクトoutをFASTQ形式で保存
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
フィルタリング | NGS | paired-endの二つのFASTQファイルを読み込んで両方でpass_filteringフラグが1のもののみ抽出する
ファイルの読み込み | マップ前 | Illuminaの*_qseq.txtの4を実行して得られた二つのpaired-endファイル(read1.fqとread2.fq)があるという前提で二つのファイル中で両方ともpass filteringフラグが1となっているものを抽出するやり方を示します。
イントロダクション | NGS | ファイル形式の変換のところでも書いてますが
「sourceforgeからダウンロードして使えるqseq2fastq.plを用いて得られた二つのファイルはなぜか同一行のところに同一IDのリードがこない」
という気持ち悪いことになりますが、ここで読み込む二つのファイルは同一行に同一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となるもののみout_f1で指定したファイル名で保存
writeFastq(reads2[hoge_flag == 2], out_f2) #reads2の中からhoge_flagの値が2となるもののみout_f2で指定したファイル名で保存
}
------ ここまで ------
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
フィルタリング | NGS | artifact(adapter sequences, low-complexity reads, and PCR duplicates)やsequencing errorの除去
(ゲノムやトランスクリプトーム配列へのマッピング時には問題にならないと思いますが、おそらく)RNA-seqのアセンブルを行う場合には、sequencing errorの除去以外にも
「アダプター配列」や「low-complexity reads (低複雑性のリード;繰り返し配列)」や「PCR duplicates(ロングインサートライブラリによくあるらしい...)」の除去を行うのが普通なようです。
(私がTrinityでアセンブルを行う場合にはそんなことやったこともないのですが、やったら大分違うのでしょうか。。。)ここではこれらのerror除去を行うプログラムを列挙しておきます:
入力ファイルがリファレンス配列へのマップ後のファイル(SAM/BAM, BED, GFF形式など)(Rパッケージ):
・htSeqTools: Planet et al., Bioinformatics, 2012
・seqbias: Jones et al., Bioinformatics, 2012
入力ファイルがリファレンス配列へのマップ後のファイル(SAM/BAM, BED, GFF形式など)(R以外):
・SAMStat: Lassmann et al., Bioinformatics, 2011
・RNA-SeQC: DeLuca et al., Bioinformatics, 2012; RNA-seq用; BAM形式のみ
・RSeQC: Wang et al., Bioinformatics, 2012; RNA-seq用
(おそらく)454 platform用:
・PyroNoise: Quince et al., Nat. Methods, 2009
・ShoRAH: Zagordi et al., BMC Bioinformatics, 2011
・NGS QC Toolkit: Patel et al., PLoS One, 2012; Illuminaも可能
・KEC and ET: Skums et al., BMC Bioinformatics, 2012
その他:
・SHREC: Schroder et al., Bioinformatics, 2009; 入力ファイル形式がよくわからなかったのでそれ以上深入りせず...
・TagDust: Lassmann et al., Bioinformatics, 2009; web上でマニュアルを読めなかったのでそれ以上深入りせず...
・SeqTrim: Falqueras et al., BMC Bioinformatics, 2010; loginを要求されたのでそれ以上深入りせず...
・CUDA-EC: Shi et al., J. Comput. Biol., 2010; web上でマニュアルを読めなかったのでそれ以上深入りせず...
・EDAR: Zhao et al., J. Comput. Biol., 2010
・Redeem: Yang et al., BMC Bioinformatics, 2011; documentationが不親切でよくわかりません...orz
・PBcR: Koren et al., Nat. Biotechnol., 2012; Celera Assemblerの一部として実装されているらしい
フィルタリング | NGS | 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) #パッケージの読み込み
------ ここまで ------
BioconductorのhtSeqToolsのwebページ
参考文献1(Planet et al., Bioinformatics., 2012)
フィルタリング | NGS | 末端部分のトリミング
一般に、small RNAデータのマッピングを行う場合には「アダプター配列除去後の塩基配列データ」を用いてマッピングを行います。
その後、「マッピングされなかったNGSデータに対して、その(3')末端部分を一塩基トリムしたNGSデータを作成し、また同じパラメータでマッピングを試みる」
という作業を塩基配列長が一定の長さ以下になるまで繰り返す、こともまた行われます。
(basic alignerの)bowtieなどは末端部分を任意の塩基数分だけトリムしてマッピングするということを「--trim3 or --trim5」などのオプションで実行することは一応できますが、トリムした後の配列長が指定した長さ以上のもののみマッピングするという制限を与えることができなそうでした。
そこで、ここではbowtieで「--trim3 or --trim5」などのオプションをつけずにマッピングできるように、3'末端を指定塩基数分だけトリムし、トリム後の配列長が指定した長さ以上のリードのみ出力するやり方を示します。
ここでは以下のファイルを例題として行います:
1. 「イントロダクション | 一般 | ランダムな塩基配列を作成」の4.を実行して得られたmulti-fastaファイル(hoge4.fa)に対して、5塩基トリムし、トリム後の配列長が20塩基以上のもののみ出力
2. NCBI Sequence Read Archive (SRA)から得られる*.fastqファイル(SRR037439.fastq; 実在のファイルの最初の2000行分)に対して、2塩基トリムし、トリム後の配列長が30塩基以上のもののみ出力
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. hoge4.faファイルの場合(FASTA形式):
------ ここから ------
in_f <- "hoge4.fa" #multi-fasta形式の入力ファイルを指定
out_f <- "hoge_out.fa" #出力ファイル名を指定
param1 <- 5 #3'末端のトリムしたい塩基数
param2 <- 20 #トリム後に出力する配列長の閾値(ここで指定した数値以上の長さのものが出力される)
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
#塩基配列データファイルの読み込みとトリム
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
hoge <- DNAStringSet(reads, start=1, end=(width(reads)-param1)) #readsオブジェクトの中から(param1)塩基だけトリムした結果をDNAStringSet形式にしてhogeに格納
out <- hoge[width(hoge) >= param2] #(param2)で指定した配列長以上、という条件を満たすリードのみ抽出してoutに格納
writeXStringSet(out, file=out_f, format="fasta", width=60) #一行あたりの塩基数を60bpにして、out_fで指定したファイル名でoutというオブジェクトをFASTA形式で保存
------ ここまで ------
2. SRR037439.fastqファイルの場合(FASTQ形式):
------ ここから ------
in_f <- "SRR037439.fastq" #FASTQ形式の入力ファイルを指定
out_f <- "hoge_out2.fq" #出力ファイル名を指定
param1 <- 2 #3'末端のトリムしたい塩基数
param2 <- 30 #トリム後に出力する配列長の閾値(ここで指定した数値以上の長さのものが出力される)
#必要なパッケージなどをロード
library(Biostrings) #パッケージの読み込み
library(ShortRead) #パッケージの読み込み
#塩基配列データファイルの読み込みとトリム
reads <- readFastq(in_f) #in_fで指定したファイルの読み込み
hoge1 <- DNAStringSet(sread(reads), start=1, end=width(sread(reads))-param1)#sread(reads)オブジェクトの中から(param1)塩基だけトリムした結果をDNAStringSet形式にしてhoge1に格納
hoge2 <- BStringSet(quality(quality(reads)), start=1, end=width(quality(quality(reads)))-param1)#quality(reads)オブジェクトの中から(param1)塩基だけトリムした結果をDNAStringSet形式にしてhoge2に格納
#トリム後の配列長でフィルタリング
hoge1.f <- hoge1[width(hoge1) >= param2] #(param2)で指定した配列長以上、という条件を満たすもののみ抽出してhoge1.fに格納
hoge2.f <- hoge2[width(hoge1) >= param2] #(param2)で指定した配列長以上、という条件を満たすもののみ抽出してhoge2.fに格納
hoge3.f <- BStringSet(as.character(id(reads)))[width(hoge1) >= param2]#(param2)で指定した配列長以上、という条件を満たすもののみ抽出してhoge3.fに格納
#FASTQ形式に再び戻してファイル出力
out <- ShortReadQ(hoge1.f, hoge2.f, hoge3.f) #ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをoutに格納
writeFastq(out, out_f) #オブジェクトoutをFASTQ形式で保存
------ ここまで ------
BioconductorのBiostringsのwebページ
BioconductorのShortReadのwebページ
ShortRead:Morgan et al., Bioinformatics, 2009
前処理 | について
sequenceしたリードをゲノムにマッピングし、この中から各遺伝子(or 転写物)のエクソン領域にマップされたリードをカウントすることでraw countsのデータが得られます(参考パワポ資料中のスライド7)。
1サンプルにつき1列分のベクトルデータが生成されますので、サンプル数を増やすほど列数が増えていきます。1行あたり1遺伝子となり、遺伝子数が増えるほど行数が増えることになります。
このような手順を経て得られる複数のサンプルからなる行列データが、いわゆる「遺伝子発現行列」です。
そして、この遺伝子発現行列を作成する際に、raw countsの値をそのまま発現量とすることはできません。。。
sequencing depth (sequenceしたリード数)の違いや、配列長が長いほど発現量が高くなるという効果を補正する必要があります。このような作業をここでは「前処理」と呼んでいます。
前処理の基本形は、「マップされたトータルのリード数(all reads)」と「遺伝子の配列長(gene length)」の情報を主に用いて、
「正規化後の発現量=(raw counts * 定数)/(gene length * all reads)」(式1)
のようにすることです。
以下は例として比較的有名なRPKMという単位で発現レベルを表現するやり方の説明を通して前処理の基本的な考え方を述べています。また、今のところ正規化(サンプル間比較を可能にするための処理)と定量化(発現レベルを正確に見積もること; estimation or quantification of the mRNA expression level)をごっちゃにして記述していますが、それらは密接に関連していますので、「前処理 (preprocessing)」という表現をここでは使用しています。
NGSのデータは、サンプルごとにsequenceされたマップされた総リード数が異なります。
例えばsample Aはマップされた総リード数が210万あったのに対してsample Bは170万しかない、などです。
ゲノムにマッピングした後の数値データ(発現ベクトル)などを用いてサンプル間比較を行う際には、このマップされた総リード数の違いを補正してやる必要があります。
Reads per million (RPM)というのはこの補正を実現するための一つのやり方です。単に「100万リードあたりのread数」にしているだけです。
例えばsample Aに対する正規化係数(NormA)はNormA = 1,000,000/2,100,000となり、sample Bに対する正規化係数(NormB)はNormB = 1,000,000/1,700,000となります。
あるサンプルの正規化後の発現ベクトルのi番目の要素Safter(i)は正規化前の発現ベクトルのi番目の要素Sbefore(i)と正規化係数(N)との関係は以下のように表すことができます:
Safter(i) = Sbefore(i)*N
この考え方はマイクロアレイのグローバル正規化と本質的に同じです。例えば、RPM正規化はマイクロアレイの平均シグナル強度をそろえると基本的に同じことをやっているわけです。
さて、RPM補正後のデータを用いて、個々の遺伝子の発現レベルを計算(具体的にはexon領域にマップされるread数をカウント)すると、その配列長が長いものほど高発現になります。
これは"遺伝子発現レベル"を"マップされるread数"としているので配列長が長いほどよりヒットする確率が高くなる(つまりsequence可能なフラグメントが増えるということ)ので至極当然です("gene length-related biases";参考文献1)。
(ちなみにAffymetrixやAgilentの場合は、25 merとか60merという一定長の長さでtranscriptを表現しているので、上記の問題はマイクロアレイでは考える必要はなかったのでしょう)
この発現レベルが配列長依存だという問題を解決するための一つのやり方がRPKM (Reads per kilobase of exon model per million mapped reads)という単位で表現するというものです(参考文献2)。
RPM補正後のデータに対して「1 kilobase (つまり1,000 bp)あたりのread数」にしているだけです。
前処理 | 正規化(混合) | RPKM正規化(Mortazavi_2008) | ゲノムマップ後のBED形式ファイルからの例題で得られたSRR002320.bowtieexp中の"A1BG"というgeneNameはraw countsが18reads, gene lengthが1764, ゲノムにマップされた総リード数が13583445でした。
このA1BGの補正後の発現レベルは18*(1,000,000/13,583,445)*(1,000/1,764) = 0.751215 RPKMとして計算されます。
この式をよく眺めてみると、式1の定数が1,000,000,000になっているだけであることに気付くことでしょう。
NAC (Normalized average coverage)も式1 (RPKM)と本質的に同じものです。
FVKMとvirtual lengthは、multiple isoformsの情報をどのように取り扱うかという問題に対して、
virtual lengthは全エクソン領域の和集合領域で考えているのに対し、
FVKMはmultiple isoforms中で共通して用いられている積集合領域を考えている、という違いだけです。
二つとも"virtual"という一見意味不明な用語を含んでいますが、この説明のために、例として「35bpのリードをIlluminaで読んだデータ」と「遺伝子をvirtual lengthの和集合領域」で考えることにします。
NGSデータはマイクロアレイに比べてダイナミックレンジが広いという利点はあるとは思いますが、このようなグローバル正規化に基づく方法はごく少数の高発現遺伝子の発現レベルの影響をもろに受けます(そしてこれらが比較するサンプル間で発現変動していないとは限らない...)。
マイクロアレイはアナログデータで高発現遺伝子のシグナル強度が飽和してしまっているためにtotal countsに基づくグローバル正規化による負の影響がいい意味で軽減されていたのでしょうか。。。
このほかにもhypergeometric model (参考文献3)やマイクロアレイの正規化(特にAffymetrix GeneChip)のデファクトスタンダードであるquantile正規化(参考文献4)なども提案されています。
他のグローバル正規化、i)どの組織間でも発現レベルが同じだと仮定されて用いられるhousekeeping遺伝子の発現レベルをそろえる、ii)中央値をそろえる、iii)上位25%に位置する遺伝子(upper-quartile)の発現レベルでそろえる、なども当然”あり”だとは思います。
マイクロアレイの正規化(Affymetrix)についてと同じような感じのまとめ方を一応しておきます。
一つ一つののlane (or sample)ごとにグローバル正規化をするやりかた(他のlaneやサンプルの発現情報の影響を受けない):
・RPKM (Reads Per Kilobase (of exon model) per Million mapped reads; 参考文献2)
・FPKM (Fragments Per Kilobase (of transcript) per Million mapped fragments; 参考文献10)
・housekeeping遺伝子を利用(参考文献4)
・upper-quartile(上位四分位数)で正規化(参考文献4)
・FVKM (Fragments per Virtual Kilobase per Million sequenced reads) or LVKM (log2(FVKM + 1)に相当) (参考文献7)
・NAC (Normalized average coverage; 参考文献11, 12)
・virtual length正規化(参考文献9)
データセット全体の情報を用いて正規化するやりかた(他のlaneやサンプルの発現情報の影響を受ける):
・trimmed mean of M values (TMM)で正規化(参考文献5)
・quantile正規化(参考文献4, 6)
・virtual length正規化(参考文献9)
まだちゃんと把握してないが...:
・power law distribution正規化(参考文献8)
参考パワポ資料(2010/09/17の講演資料)
参考文献1(Oshlack and Wakefield, Biology Direct, 2009)
参考文献2(ERANGE; Mortazavi et al., Nat. Methods, 2008)
参考文献3(Marioni et al., Genome Res., 2008)
参考文献4(Bullard et al., BMC Bioinformatics, 2010)
参考文献5(Robinson and Oshlack, Genome Biol., 2010)
参考文献6(Langmead et al., Genome Biol., 2010)
参考文献7(Lee et al., Nucleic Acids Res., 2010)
参考文献8(Balwierz et al., Genome Biol., 2009)
参考文献9(Sultan et al., Science, 2008)
参考文献10(Cufflinks; Trapnell et al., Nature Biotechnol., 2010)
参考文献11(ALEXA-seq; Griffith et al., Nat Methods, 2010)
参考文献12(Trans-ABySS; Robertson et al., Nat Methods, 2010)
前処理 | Trinity出力ファイルからFPKM値を取得
2011年10月20日時点で最もお手軽にトランスクリプトーム配列のde novo assembleをしてくれるのはおそらくTrinity(参考文献1)です。
アセンブルプログラム(転写物)のところでは、kをいろいろやって...などと書いてますが、
Trinityは(trans-ABySSなどと違ってkの値を複数振ってコンティグの和集合を得てから重複を取り除いていくというような作業ではなく)k=25だけでアセンブルを実行しているということもあるのでしょうが、とにかく早いし(こちらの環境で数週間→3日程度)設定ファイルの記述など面倒なことはほとんどありません。
ここでは、手元にTrinityを実行して(どこかでやってもらって)得られたTrinity.fastaファイルがあるという前提で、description部分に記述されているそのコンティグの発現レベル(FPKM値)の情報などを抽出するやり方を示します。
尚、このファイルは基本的なフォーマット部分のみ人工的に作ったものですので、FPKMの記述以外のところは特に気にしないでください。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
in_f <- "Trinity.fasta" #読み込みたいファイル名を指定してin_fに格納
out_f <- "output.txt" #出力ファイル名を指定してout_fに格納
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
hoge <- strsplit(names(reads), " ", fixed=TRUE) #names(reads)中の文字列をスペース(" ")で区切った結果をリスト形式でhogeに格納
contigID <- unlist(lapply(hoge, "[[", 1)) #hogeのリスト中の1番目の要素(コンティグID部分に相当)のみ抽出してcontigIDに格納
hoge2 <- unlist(lapply(hoge, "[[", 3)) #hogeのリスト中の3番目の要素(FPKM部分に相当)のみ抽出してhoge2に格納
hoge3 <- strsplit(hoge2, "=", fixed=TRUE) #hoge2中の文字列を"="で区切った結果をリスト形式でhoge3に格納
FPKM <- unlist(lapply(hoge3, "[[", 2)) #hoge3のリスト中の2番目の要素(FPKMの実際の値部分に相当)のみ抽出してFPKMに格納
transcript_length <- width(reads) #配列長情報をtranscript_lengthに格納
tmp <- cbind(contigID, FPKM, transcript_length) #「コンティグID」、「FPKM値」、「配列長」を結合してtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
Trinity:Grabherr et al., Nature Biotechnol, 2011
前処理 | トランスクリプトーム配列へのマップ後のファイルからマップされたリード数をカウント(BED形式ファイル)
手元に「multi-fasta形式のマップされる側の塩基配列ファイル(例:h_rna.fastaやhoge4.fa)」と
Bowtie (Langmead et al., 2009)などのマッピングプログラムを用いて得られた
「どこにマップされたかを表すBED形式ファイル(例:SRR002324_t.bed、sample_1.bed、sample_2.bed)」があるとします。
発現変動遺伝子(DEG)同定の目的で用いられるTCCやedgeR
などのRパッケージは遺伝子(あるいは転写物)ごとに何個のリードがマップされたかという「カウント行列(count matrix)」を入力とすることを前提としています。
(ざっくり言えば)BED形式ファイルは、トランスクリプトーム配列にマップした場合、「どのtranscript(or 遺伝子)の(1列目)、どの位置から(2列目; start)、どの位置まで(3列目; end)にリードがマップされた」という情報からなります。
それゆえ「行数がマップされたリード数」に相当し、「遺伝子ごとの出現数がカウント数」に相当するわけです。
したがって、基本的にはBED形式ファイルを読み込んで「遺伝子名に相当する列」の部分の情報のみを用いて「どの遺伝子名が何回出現したか」をカウントすればいいだけなんですが...
実際には、二つのサンプル(or 二つのBED形式ファイル)を比較する場合などには「片方のBEDファイル中に一度も出現しない遺伝子」が存在しうるため、
「multi-fasta形式のマップされる側の塩基配列ファイル」も同時に読み込んでその遺伝子リストの並びで出力してやったほうが都合がいいのでここではそうしています。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. マップされる側の配列(hoge4.fa)中のIDの並びでBED形式ファイル(sample_1.bed)中の出現回数をカウントする場合:
------ ここから ------
in_f1 <- "sample_1.bed" #読み込みたいBED形式ファイル名を指定してin_f1に格納
in_f2 <- "hoge4.fa" #マップに用いたリファレンス配列のファイル名を指定してin_f2に格納
out_f <- "output1.txt" #出力ファイル名を指定してout_fに格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
#入力ファイルの読み込みと必要な情報の抽出など
reads <- readDNAStringSet(in_f2, format="fasta") #in_f2で指定したファイルを読み込んでreadsに格納
data <- read.table(in_f1, header=TRUE, sep="\t") #in_f1で指定したファイルを読み込んでdataに格納
ID_list <- as.vector(data[,1]) #行列dataから1列目の情報のみ抽出してベクトル形式にした結果をID_listに格納
out <- rle(sort(ID_list)) #どのIDがいくつあったかをカウントした結果をoutに格納
#本番
rawcount <- rep(0, length(reads)) #最終的に欲しいrawcount値の初期値を0にしておく
names(rawcount) <- names(reads) #names(reads)をnames(rawcount)に格納
hoge <- out$lengths #outオブジェクト中のカウント情報をhogeに格納
names(hoge) <- out$values #outオブジェクト中のID情報をnames(hoge)に格納
obj <- is.element(names(rawcount), names(hoge)) #names(rawcount)の並び順でnames(hoge)中のIDが存在する位置にTRUEを、そうでない位置にはFALSEを返した結果をobjに格納
common <- intersect(names(rawcount), names(hoge)) #names(rawcount)とnames(hoge)中の積集合をcommonに格納
rawcount[obj] <- hoge[common] #objがTRUEの位置に生リードカウントを代入
#ファイル出力
tmp <- cbind(names(reads), rawcount) #結果ファイルの1列目がID, 2列目がcount情報になるようにしたものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
2. マップされる側の配列(hoge4.fa)中のIDの並びでBED形式ファイル(sample_1.bed)中の出現回数をカウントする場合(1.と同じだが、若干異なる手順にしている):
------ ここから ------
in_f1 <- "sample_1.bed" #読み込みたいBED形式ファイル名を指定してin_f1に格納
in_f2 <- "hoge4.fa" #マップに用いたリファレンス配列のファイル名を指定してin_f2に格納
out_f <- "output2.txt" #出力ファイル名を指定してout_fに格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
#入力ファイルの読み込みと必要な情報の抽出など
reads <- readDNAStringSet(in_f2, format="fasta") #in_f2で指定したファイルを読み込んでreadsに格納
data <- read.table(in_f1, header=TRUE, sep="\t") #in_f1で指定したファイルを読み込んでdataに格納
ID_list <- as.vector(data[,1]) #行列dataから1列目の情報のみ抽出してベクトル形式にした結果をID_listに格納
out <- rle(sort(ID_list)) #どのIDがいくつあったかをカウントした結果をoutに格納
#本番
rawcount <- rep(0, length(reads)) #最終的に欲しいrawcount値の初期値を0にしておく
names(rawcount) <- sort(names(reads)) #sort(names(reads))をnames(rawcount)に格納
hoge <- out$lengths #outオブジェクト中のカウント情報をhogeに格納
names(hoge) <- out$values #outオブジェクト中のID情報をnames(hoge)に格納
obj <- is.element(names(rawcount), names(hoge)) #names(rawcount)の並び順でnames(hoge)中のIDが存在する位置にTRUEを、そうでない位置にはFALSEを返した結果をobjに格納
rawcount[obj] <- hoge #objがTRUEの位置に生リードカウントを代入
#ファイル出力(この段階でin_f2で読み込んだファイルのIDの並びに変更している)
tmp <- cbind(names(reads), rawcount[names(reads)]) #結果ファイルの1列目がID, 2列目がcount情報になるようにしたものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
3. マップされる側の配列(h_rna.fasta)中のIDの並びでBED形式ファイル(SRR002324_t.bed)中の出現回数をカウントする場合:
------ ここから ------
in_f1 <- "SRR002324_t.bed" #読み込みたいBED形式ファイル名を指定してin_f1に格納
in_f2 <- "h_rna.fasta" #マップに用いたリファレンス配列のファイル名を指定してin_f2に格納
out_f <- "output3.txt" #出力ファイル名を指定してout_fに格納
#必要なパッケージなどをロード
library(ShortRead) #パッケージの読み込み
#入力ファイルの読み込みと必要な情報の抽出など
reads <- readDNAStringSet(in_f2, format="fasta") #in_f2で指定したファイルを読み込んでreadsに格納
data <- read.table(in_f1, header=TRUE, sep="\t") #in_f1で指定したファイルを読み込んでdataに格納
ID_list <- as.vector(data[,1]) #行列dataから1列目の情報のみ抽出してベクトル形式にした結果をID_listに格納
out <- rle(sort(ID_list)) #どのIDがいくつあったかをカウントした結果をoutに格納
#本番
rawcount <- rep(0, length(reads)) #最終的に欲しいrawcount値の初期値を0にしておく
names(rawcount) <- names(reads) #names(reads)をnames(rawcount)に格納
hoge <- out$lengths #outオブジェクト中のカウント情報をhogeに格納
names(hoge) <- out$values #outオブジェクト中のID情報をnames(hoge)に格納
obj <- is.element(names(rawcount), names(hoge)) #names(rawcount)の並び順でnames(hoge)中のIDが存在する位置にTRUEを、そうでない位置にはFALSEを返した結果をobjに格納
common <- intersect(names(rawcount), names(hoge)) #names(rawcount)とnames(hoge)中の積集合をcommonに格納
rawcount[obj] <- hoge[common] #objがTRUEの位置に生リードカウントを代入
#ファイル出力
tmp <- cbind(names(reads), rawcount) #結果ファイルの1列目がID, 2列目がcount情報になるようにしたものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
4. マップされる側の配列(h_rna.fasta)中のIDをソートした並びでBED形式ファイル(SRR002324_t.bed)中の出現回数をカウントする場合:
基本的に2.の記述と同じで、最後のファイル出力のところでalphabet順にソートしたままの状態で出力しているだけです。
------ ここから ------
in_f1 <- "SRR002324_t.bed" #読み込みたいBED形式ファイル名を指定してin_f1に格納
in_f2 <- "h_rna.fasta" #マップに用いたリファレンス配列のファイル名を指定してin_f2に格納
out_f <- "output4.txt" #出力ファイル名を指定してout_fに格納
#BEDファイル中に出現するIDのみ、アルファベット順にソートして生リード数をカウント
data <- read.table(in_f1) #in_f1で指定したファイルを読み込んでdataに格納
ID_list <- as.vector(data[,1]) #行列dataから1列目の情報のみ抽出してベクトル形式にした結果をID_listに格納
out <- rle(sort(ID_list)) #どのIDがいくつあったかをカウントした結果をoutに格納
#マップされる側のファイルのID情報を抽出
library(ShortRead) #パッケージの読み込み
reads <- readDNAStringSet(in_f2, format="fasta") #in_f2で指定したファイルを読み込んでreadsに格納
#本番
rawcount <- rep(0, length(reads)) #最終的に欲しいrawcount値の初期値を0にしておく
names(rawcount) <- sort(names(reads)) #sort(names(reads))をnames(rawcount)に格納
hoge <- out$lengths #outオブジェクト中のカウント情報をhogeに格納
names(hoge) <- out$values #outオブジェクト中のID情報をnames(hoge)に格納
obj <- is.element(names(rawcount), names(hoge)) #names(rawcount)の並び順でnames(hoge)中のIDが存在する位置にTRUEを、そうでない位置にはFALSEを返した結果をobjに格納
rawcount[obj] <- hoge #objがTRUEの位置に生リードカウントを代入
#ファイル出力
tmp <- cbind(names(rawcount), rawcount) #結果ファイルの1列目がID, 2列目がcount情報になるようにしたものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
5. BED形式ファイル(SRR002324_t.bed)中にあるIDのもののみ、アルファベット順にソートして出力する場合:
------ ここから ------
in_f <- "SRR002324_t.bed" #読み込みたいBED形式ファイル名を指定してin_fに格納
out_f <- "output5.txt" #出力ファイル名を指定してout_fに格納
data <- read.table(in_f) #in_fで指定したファイルの読み込んでdataに格納
ID_list <- as.vector(data[,1]) #行列dataから1列目の情報のみ抽出してベクトル形式にした結果をID_listに格納
out <- rle(sort(ID_list)) #どのIDがいくつあったかをカウントした結果をoutに格納
#ファイル出力
tmp <- cbind(out$values, out$lengths) #結果ファイルの1列目がID, 2列目がcount情報になるようにしたものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
Bowtie:Langmead et al., Genome Biol., 2009
edgeR:Robinson et al., Bioinformatics, 2010
TCC (≥ ver. 1.1.99):Sun et al., submitted
ShortRead:Morgan et al., Bioinformatics, 2009
Marioni et al., Genome Res., 2008
前処理 | Ensembl Geneの長さを計算する
ここでいう「長さ」とは、イントロン領域などを含むEnsembl Geneの遺伝子領域(Start, End)の座標をもとに計算する「End - Start」のことではなく、
この遺伝子領域から転写される一つまたは複数の転写物(transcripts)の長さの要約統計量(medianとかmeanとかのこと)を指します。
ここでは、アノテーション情報取得(BioMart and biomaRt)の1を実行して得られたens_gene_46.txtを入力として、
一つのEnsembl Gene IDに対応する一つまたは複数のEnsembl Transcript IDのcDNA length情報を用いて、その中央値(median)を「長さ」とする参考文献1で計算されたやり方を示します。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
in_f <- "ens_gene_46.txt" #アノテーション情報ファイルを指定してin_fに格納
out_f <- "ens_gene_46_length.txt" #出力ファイル名を指定してout_fに格納
param <- "median" #計算したい要約統計量を指定してparamに格納
tmp <- read.table(in_f, header=TRUE, sep="\t", quote="") #アノテーション情報ファイルの読み込み
data <- na.omit(tmp) #行列tmpからNAを含む行を削除した結果をdataに格納
transcript_len <- data[,4] #Ensembl cDNA lengthに相当する列の情報をtranscript_lenに格納
ens_gene <- data[,1] #Ensembl Gene IDに相当する列の情報をens_geneに格納
tmpout <- tapply(transcript_len, ens_gene, param) #Ensembl Gene IDが同じものに対して、paramで指定した要約統計量を計算した結果をtmpoutに格納
out <- na.omit(as.data.frame(tmpout)) #tmpout中には新たに生成されたNAが含まれる。これは「length情報がない」ものに対して要約統計量を計算した結果に相当するものである。したがって、新たにtmpoutに対してNAを含むものを削除した結果をoutに格納している
tmp <- cbind(rownames(out), out) #Ensembl Gene IDと中央値の二つのベクトルを結合した結果をtmpに格納
colnames(tmp) <- c("Ensembl Gene ID", "Length") #行列tmpに任意の列名を与えている
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
参考文献1(Oshlack and Wakefield, Biology Direct, 2009)
前処理 | 転写物の配列長が長いほどマップされたリード数が多くなることを確認
ここでは、トランスクリプトーム配列へのマップ後のファイルからマップされたリード数をカウント(BED形式ファイル)で得られた結果(output.txt)から、
参考文献1で報告されているような「転写物の配列長由来の偏り(transcript length bias)」があるかどうかを確認します。
但し、output.txtからだけでは、元のRefSeq IDごとの配列長がわかりません。。。
従ってここでは、
0. 生リード数をカウントし、
1.「RefSeqのhuman mRNAのmulti-fasta形式のファイル(h_rna.fasta; マップされる側の配列)も読み込んで配列長情報を取得し、
2. IDの対応づけを行い
3. 配列長と生のリードカウント数のプロット図の作成
を行うことを通してtranscript length biasの確認をします。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
in_f1 <- "SRR002324_t.bed" #読み込みたいBED形式ファイル名を指定してin_f1に格納
in_f2 <- "h_rna.fasta" #読み込みたいmulti-fastaファイル名を指定してin_f2に格納
out_f <- "output2.txt" #出力ファイル名を指定してout_fに格納
#0. 生リードカウントのところ
data <- read.table(in_f1) #in_f1で指定したファイルの読み込んでdataに格納
ID_list <- as.vector(data[,1]) #行列dataから1列目の情報のみ抽出してベクトル形式にした結果をID_listに格納
hoge <- rle(sort(ID_list)) #どのIDがいくつあったかをカウントした結果をhogeに格納
rawcount <- hoge$lengths #count情報をrawcountに格納
names(rawcount) <- hoge$values #rawcountにnames属性を与えている(与えているのはID情報、つまりout$values)
#1. 配列長情報取得のところ
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f2, format="fasta") #in_f2で指定したファイルをFASTA形式で読み込み
trans_len <- width(reads) #配列長情報をtrans_lenに格納
names(trans_len) <- names(reads) #trans_lenにnames属性を与えている(与えているのはID情報、つまりnames(reads))
trans_len_s <- trans_len[order(names(trans_len))] #trans_lenをIDのアルファベット順に並び替えた結果をtrans_len_sに格納
#2. IDの対応づけ
#背景:trans_len_sの要素数とrawcountの要素数は異なる。
#目的:trans_len_s中のIDの並びに対応した生リードカウントのベクトル情報、の取得
rawcount2 <- rep(0, length(trans_len_s)) #目的のベクトル情報rawcount2のplaceholderを作成(初期値は0)
obj <- is.element(names(trans_len_s), names(rawcount)) #transl_len_sのIDの集合の中で、rawcount中のIDの集合に含まれるものはTRUEを、含まれないものはFALSEを返した結果をobjに格納
posi <- (1:length(obj))[obj] #objの中身はTRUE or FALSEでしかないので、TRUEに相当する行番号情報を取得してposiに格納
rawcount2[posi] <- rawcount #rawcount2ベクトル中のposiで与えた行番号の位置に、rawcountの値を順番に代入している
out <- cbind(trans_len_s, rawcount2) #trans_len_sとrawcount2の二つの列ベクトルを結合した結果をoutに格納
rownames(out) <- names(trans_len_s) #行列outの行名をnames(trans_len_s)で与えている
colnames(out) <- c("transcript_length", "raw_count") #行列outの列名を与えている
tmp <- cbind(rownames(out), out) #rownames(out)の列ベクトルを行列outの左側に結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
#3. 配列長と生のリードカウント数の箱ひげ図(boxplot)の作成
out_s <- out[order(out[,1]),] #行列outを1列目でソートした結果をout_sに格納
param <- 20 #boxplotを描くときの水準数(transcript_length順でソートした結果の分割数に相当)を指定
f <- gl(param, floor(nrow(out_s)/param)+1, nrow(out_s)) #nrow(out_s)で表される要素数からなるベクトルをparam個の水準数に分割した因子オブジェクトfを作成
y <- out_s[,2]
y[y < 0.1] <- 0.1
plot(f, log10(y)) #transcript_length順でparam個に分割したときのfの各水準に対する生リード数の箱ひげ図を描く
------ ここまで ------
参考文献1(Oshlack and Wakefield, Biology Direct, 2009)
前処理 | 転写物の配列長が長いほど発現変動遺伝子とされる確率が上昇することを確認
ここでは、サンプルデータ2の「1列目:Genename, 2-6列目:Kidney群, 7-11列目:Liver群」としたSupplementaryTable2_changed.txt(参考文献1のデータ)を入力として、
1. 発現変動遺伝子(DEG)の同定を行い、
2. DEGとされる確率が配列長依存かどうか
を調べることを通じて、参考文献2で報告されているような「転写物の配列長由来の偏り(transcript length bias)」があるかどうかを確認します。
参考文献2でも指摘されているように、配列長を考慮した方法を用いても、やはりまだ偏りがあることがわかります。
各IDに対応する配列長情報は前処理 | Ensembl Geneの長さを計算するを行って得られたens_gene_46_length.txt中に含まれるので、
このファイルの読み込みのところから行います。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. edgeRを用い、TMM正規化を行わずにDEGのランキングをする場合:
------ ここから ------
in_f1 <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_f1に格納
in_f2 <- "ens_gene_46_length.txt" #アノテーション情報ファイルを指定してin_f2に格納
out_f1 <- "hoge1.txt" #出力ファイル名を指定
out_f2 <- "hoge1FDR.png" #出力ファイル名を指定
param1 <- 5 #A群のサンプル数を指定
param2 <- 5 #B群のサンプル数を指定
library(DEGseq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- data[order(rownames(data)),] #Ensembl Gene IDのアルファベット順に行列dataの行を並び替えている
data <- as.matrix(data) #データの型をmatrixにしている
tmp <- read.table(in_f2, header=TRUE, sep="\t", quote="") #アノテーション情報ファイルの読み込み
gene_length <- tmp[,2] #配列長をgene_lengthに格納
names(gene_length) <- tmp[,1] #gene_length中の値とEnsembl Gene IDを対応づけている
gene_length <- gene_length[order(names(gene_length))] #Ensembl Gene IDのアルファベット順にgene_length中の要素を並び替えている
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
d <- DGEList(counts=data, group=data.cl) #DGEListオブジェクトを作成してdに格納
d <- estimateCommonDisp(d) #the quantile-adjusted conditional maximum likelihood (qCML)法でcommon dispersionを計算している
d <- estimateTagwiseDisp(d, prop.used=0.5, grid.length=500) #the quantile-adjusted conditional maximum likelihood (qCML)法でmoderated tagwise dispersionを計算している
out <- exactTest(d) #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
fdr <- p.adjust(out$table$PValue, method="BH") #False Discovery Rate (FDR)を計算し、結果をfdrに格納
names(fdr) <- rownames(data) #FDR値とEnsembl Gene IDを対応づけている
common <- intersect(names(gene_length), names(fdr)) #二つのベクトル(names(gene_length)とnames(fdr))の積集合(intersection)をcommonに格納
obj_gene_length <- is.element(names(gene_length), common) #commonで指定したEnsembl Gene IDsのnames(gene_length)中における位置情報をobj_gene_lengthに格納
obj_fdr <- is.element(names(fdr), common) #commonで指定したEnsembl Gene IDsのnames(fdr)中における位置情報をobj_fdrに格納
gene_length_sub <- gene_length[obj_gene_length] #gene_lengthベクトルの中から、obj_gene_lengthがTRUEとなっているもののみ抽出してgene_length_subに格納
fdr_sub <- fdr[obj_fdr] #fdrベクトルの中から、obj_fdrがTRUEとなっているもののみ抽出してfdr_subに格納
tmp <- cbind(names(fdr_sub), data[obj_fdr,], gene_length_sub, fdr_sub)#配列長情報があるEnsembl Gene IDのみからなる入力データの右側に、「gene_length」、「(Benjamini and Hochbergの方法で計算した)FDR値」を結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
lenfdr <- cbind(gene_length_sub, fdr_sub) #gene_length_subとfdr_subの二つのベクトルを列方向で結合した結果をlenfdrに格納。
lenfdr_s <- lenfdr[order(lenfdr[,1]),] #lenfdrを1列目のgene_lengthでソートした結果をlenfdr_sに格納。
param <- 20 #boxplotを描くときの水準数(transcript_length順でソートした結果の分割数に相当)を指定。
f <- gl(param, floor(nrow(lenfdr_s)/param)+1, nrow(lenfdr_s)) #nrow(out_s)で表される要素数からなるベクトルを20個の水準数に分割した因子オブジェクトfを作成
y <- lenfdr_s[,2] #行列len_fdr_sの2列目の情報をyに格納
png(out_f2, width=600, height=300) #出力ファイルの各種パラメータを指定
plot(f, y, xlab="gene length", ylab="FDR") #横軸がgene_length, 縦軸がFDRとしてプロット
dev.off() #おまじない
#参考文献2のFigure 1dのような縦軸にしたい場合
out_f3 <- "hoge1DE.png" #出力ファイル名を指定
param3 <- 0.1 #FDRの閾値を指定
hoge <- rep(1, nrow(lenfdr_s)) #のちに水準ごとの要素数をsum関数でカウントするために1からなるベクトルを作成している
f_num <- tapply(hoge, f, sum) #水準ごとの要素数をカウントした結果をf_numに格納
hoge <- (y <= param3) #FDR情報を含むyに対して、param3で指定した閾値以下のものをTRUE, それ以外をFALSEとしたベクトルを作成してhogeに格納
y_num <- tapply(hoge, f, sum) #水準ごとのFDRが閾値を満たす要素数をカウントした結果をy_numに格納
ratio <- 100*y_num/f_num #水準ごとのDEGとされた割合(%)を計算した結果をratioに格納
png(out_f3, width=600, height=300) #出力ファイルの各種パラメータを指定
plot(levels(f), ratio, xlab="gene length", ylab="%DE") #横軸がgene_length, 縦軸が%DEとしてプロット
dev.off() #おまじない
------ ここまで ------
2. edgeRを用い、TMM正規化を行ったデータに対してDEGのランキングをする場合:
------ ここから ------
in_f1 <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_f1に格納
in_f2 <- "ens_gene_46_length.txt" #アノテーション情報ファイルを指定してin_f2に格納
out_f1 <- "hoge2.txt" #出力ファイル名を指定
out_f2 <- "hoge2FDR.png" #出力ファイル名を指定
param1 <- 5 #A群のサンプル数を指定
param2 <- 5 #B群のサンプル数を指定
library(DEGseq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- data[order(rownames(data)),] #Ensembl Gene IDのアルファベット順に行列dataの行を並び替えている
data <- as.matrix(data) #データの型をmatrixにしている
tmp <- read.table(in_f2, header=TRUE, sep="\t", quote="") #アノテーション情報ファイルの読み込み
gene_length <- tmp[,2] #配列長をgene_lengthに格納
names(gene_length) <- tmp[,1] #gene_length中の値とEnsembl Gene IDを対応づけている
gene_length <- gene_length[order(names(gene_length))] #Ensembl Gene IDのアルファベット順にgene_length中の要素を並び替えている
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を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, prop.used=0.5, grid.length=500) #the quantile-adjusted conditional maximum likelihood (qCML)法でmoderated tagwise dispersionを計算している
out <- exactTest(d) #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
fdr <- p.adjust(out$table$PValue, method="BH") #False Discovery Rate (FDR)を計算し、結果をfdrに格納
names(fdr) <- rownames(data) #FDR値とEnsembl Gene IDを対応づけている
common <- intersect(names(gene_length), names(fdr)) #二つのベクトル(names(gene_length)とnames(fdr))の積集合(intersection)をcommonに格納
obj_gene_length <- is.element(names(gene_length), common) #commonで指定したEnsembl Gene IDsのnames(gene_length)中における位置情報をobj_gene_lengthに格納
obj_fdr <- is.element(names(fdr), common) #commonで指定したEnsembl Gene IDsのnames(fdr)中における位置情報をobj_fdrに格納
gene_length_sub <- gene_length[obj_gene_length] #gene_lengthベクトルの中から、obj_gene_lengthがTRUEとなっているもののみ抽出してgene_length_subに格納
fdr_sub <- fdr[obj_fdr] #fdrベクトルの中から、obj_fdrがTRUEとなっているもののみ抽出してfdr_subに格納
tmp <- cbind(names(fdr_sub), data[obj_fdr,], gene_length_sub, fdr_sub)#配列長情報があるEnsembl Gene IDのみからなる入力データの右側に、「gene_length」、「(Benjamini and Hochbergの方法で計算した)FDR値」を結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
lenfdr <- cbind(gene_length_sub, fdr_sub) #gene_length_subとfdr_subの二つのベクトルを列方向で結合した結果をlenfdrに格納。
lenfdr_s <- lenfdr[order(lenfdr[,1]),] #lenfdrを1列目のgene_lengthでソートした結果をlenfdr_sに格納。
param <- 20 #boxplotを描くときの水準数(transcript_length順でソートした結果の分割数に相当)を指定。
f <- gl(param, floor(nrow(lenfdr_s)/param)+1, nrow(lenfdr_s)) #nrow(out_s)で表される要素数からなるベクトルを20個の水準数に分割した因子オブジェクトfを作成
y <- lenfdr_s[,2] #行列len_fdr_sの2列目の情報をyに格納
png(out_f2, width=600, height=300) #出力ファイルの各種パラメータを指定
plot(f, y, xlab="gene length", ylab="FDR") #横軸がgene_length, 縦軸がFDRとしてプロット
dev.off() #おまじない
#参考文献2のFigure 1dのような縦軸にしたい場合
out_f3 <- "hoge2DE.png" #出力ファイル名を指定
param3 <- 0.1 #FDRの閾値を指定
hoge <- rep(1, nrow(lenfdr_s)) #のちに水準ごとの要素数をsum関数でカウントするために1からなるベクトルを作成している
f_num <- tapply(hoge, f, sum) #水準ごとの要素数をカウントした結果をf_numに格納
hoge <- (y <= param3) #FDR情報を含むyに対して、param3で指定した閾値以下のものをTRUE, それ以外をFALSEとしたベクトルを作成してhogeに格納
y_num <- tapply(hoge, f, sum) #水準ごとのFDRが閾値を満たす要素数をカウントした結果をy_numに格納
ratio <- 100*y_num/f_num #水準ごとのDEGとされた割合(%)を計算した結果をratioに格納
png(out_f3, width=600, height=300) #出力ファイルの各種パラメータを指定
plot(levels(f), ratio, xlab="gene length", ylab="%DE") #横軸がgene_length, 縦軸が%DEとしてプロット
dev.off() #おまじない
------ ここまで ------
3. baySeqを用い、生リードカウントデータを入力として長さ補正なしでDEGのランキングをする場合:
------ ここから ------
in_f1 <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_f1に格納
in_f2 <- "ens_gene_46_length.txt" #アノテーション情報ファイルを指定してin_f2に格納
out_f1 <- "hoge3.txt" #出力ファイル名を指定
param1 <- 5 #A群のサンプル数を指定
param2 <- 5 #B群のサンプル数を指定
#生データの読み込み
library(DEGseq) #パッケージの読み込み
library(baySeq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- data[order(rownames(data)),] #Ensembl Gene IDのアルファベット順に行列dataの行を並び替えている
data <- as.matrix(data) #データの型をmatrixにしている
#配列長情報を得ている
tmp <- read.table(in_f2, header=TRUE, sep="\t", quote="") #アノテーション情報ファイルの読み込み
gene_length <- tmp[,2] #配列長をgene_lengthに格納
names(gene_length) <- tmp[,1] #gene_length中の値とEnsembl Gene IDを対応づけている
gene_length <- gene_length[order(names(gene_length))] #Ensembl Gene IDのアルファベット順にgene_length中の要素を並び替えている
#baySeqを実行
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
libsizes <- rep(1000000, length(data.cl)) #すでにTMM正規化したデータを読み込ませるので、baySeq内部で正規化を行わないようにするためのおまじない
groups <- list(NDE=rep(1, (param1+param2)), DE=data.cl) #このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=as.matrix(data), replicates=data.cl, libsizes=libsizes, groups=groups)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=5000, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL) #事後確率を計算
stat_out <- out@posteriors[,2] #事後確率(0に近いほど変動している; 0が最大値)をstat_outに格納
rank_out <- rank(-stat_out) #stat_outでランキングした結果をrank_outに格納
ratio_out <- out@estProps[2] #全遺伝子中に占めるDEGの割合をratio_outに格納
names(rank_out) <- rownames(data) #ランキング結果とEnsembl Gene IDを対応づけている
#配列長情報がないEnsembl Gene IDのものもあるため、配列長情報があるもののみに限定
common <- intersect(names(gene_length), names(rank_out)) #二つのベクトル(names(gene_length)とnames(rank_out))の積集合(intersection)をcommonに格納
obj_gene_length <- is.element(names(gene_length), common) #commonで指定したEnsembl Gene IDsのnames(gene_length)中における位置情報をobj_gene_lengthに格納
obj_rank_out <- is.element(names(rank_out), common) #commonで指定したEnsembl Gene IDsのnames(fdr)中における位置情報をobj_fdrに格納
gene_length_sub <- gene_length[obj_gene_length] #gene_lengthベクトルの中から、obj_gene_lengthがTRUEとなっているもののみ抽出してgene_length_subに格納
rank_out_sub <- rank_out[obj_rank_out] #fdrベクトルの中から、obj_rank_outがTRUEとなっているもののみ抽出してrank_out_subに格納
tmp <- cbind(names(rank_out_sub), data[obj_rank_out,], gene_length_sub, rank_out_sub)#配列長情報があるEnsembl Gene IDのみからなる入力データの右側に、「gene_length」、「順位情報」を結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
lenrank <- cbind(gene_length_sub, rank_out_sub) #gene_length_subとrank_out_subの二つのベクトルを列方向で結合した結果をlenrankに格納。
lenrank_s <- lenrank[order(lenrank[,1]),] #lenrankを1列目のgene_lengthでソートした結果をlenrank_sに格納。
param <- 20 #boxplotを描くときの水準数(transcript_length順でソートした結果の分割数に相当)を指定。
f <- gl(param, floor(nrow(lenrank_s)/param)+1, nrow(lenrank_s)) #nrow(out_s)で表される要素数からなるベクトルを20個の水準数に分割した因子オブジェクトfを作成
y <- lenrank_s[,2] #行列len_rank_sの2列目の情報をyに格納
#参考文献2のFigure 1dのような縦軸にしたい場合
out_f3 <- "hoge3DE.png" #出力ファイル名を指定
param3 <- length(rank_out_sub)*ratio_out #「配列長をもつ全遺伝子数*DEGの割合」の順位までがDEGであるという情報をparam3に格納
hoge <- rep(1, nrow(lenrank_s)) #のちに水準ごとの要素数をsum関数でカウントするために1からなるベクトルを作成している
f_num <- tapply(hoge, f, sum) #水準ごとの要素数をカウントした結果をf_numに格納
hoge <- (y <= param3) #順位情報を含むyに対して、param3で指定した閾値以下のものをTRUE, それ以外をFALSEとしたベクトルを作成してhogeに格納
y_num <- tapply(hoge, f, sum) #水準ごとの順位が閾値を満たす要素数をカウントした結果をy_numに格納
ratio <- 100*y_num/f_num #水準ごとのDEGとされた割合(%)を計算した結果をratioに格納
png(out_f3, width=600, height=300) #出力ファイルの各種パラメータを指定
plot(levels(f), ratio, xlab="gene length", ylab="%DE") #横軸がgene_length, 縦軸が%DEとしてプロット
dev.off() #おまじない
------ ここまで ------
4. baySeqを用い、TMM正規化を行ったデータに対して長さ補正なしでDEGのランキングをする場合:
------ ここから ------
in_f1 <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_f1に格納
in_f2 <- "ens_gene_46_length.txt" #アノテーション情報ファイルを指定してin_f2に格納
out_f1 <- "hoge4.txt" #出力ファイル名を指定
param1 <- 5 #A群のサンプル数を指定
param2 <- 5 #B群のサンプル数を指定
#生データの読み込み
library(DEGseq) #パッケージの読み込み
library(baySeq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- data[order(rownames(data)),] #Ensembl Gene IDのアルファベット順に行列dataの行を並び替えている
data <- as.matrix(data) #データの型をmatrixにしている
#TMM正規化データの作成
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
d <- DGEList(counts=data, group=data.cl) #DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d) #TMM正規化係数を計算
norm_f <- 1000000/(colSums(data)*d$samples$norm.factors) #TMM正規化係数はRPM正規化とセットなので、最終的に各列に対して掛ける正規化係数はnorm_fで与えられる
RPM_TMM <- sweep(data, 2, norm_f, "*") #TMM正規化後のデータをRPM_TMMとして格納
data <- round(RPM_TMM) #以下ではRPM_TMMをdataとして取り扱うが、baySeqは整数値のみしか取り扱わないのでRPM_TMM中の小数点以下の数値を丸めた結果をdataとしている
#配列長情報を得ている
tmp <- read.table(in_f2, header=TRUE, sep="\t", quote="") #アノテーション情報ファイルの読み込み
gene_length <- tmp[,2] #配列長をgene_lengthに格納
names(gene_length) <- tmp[,1] #gene_length中の値とEnsembl Gene IDを対応づけている
gene_length <- gene_length[order(names(gene_length))] #Ensembl Gene IDのアルファベット順にgene_length中の要素を並び替えている
#baySeqを実行
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
libsizes <- rep(1000000, length(data.cl)) #すでにTMM正規化したデータを読み込ませるので、baySeq内部で正規化を行わないようにするためのおまじない
groups <- list(NDE=rep(1, (param1+param2)), DE=data.cl) #このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=as.matrix(data), replicates=data.cl, libsizes=libsizes, groups=groups)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=5000, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL) #事後確率を計算
stat_out <- out@posteriors[,2] #事後確率(0に近いほど変動している; 0が最大値)をstat_outに格納
rank_out <- rank(-stat_out) #stat_outでランキングした結果をrank_outに格納
ratio_out <- out@estProps[2] #全遺伝子中に占めるDEGの割合をratio_outに格納
names(rank_out) <- rownames(data) #ランキング結果とEnsembl Gene IDを対応づけている
#配列長情報がないEnsembl Gene IDのものもあるため、配列長情報があるもののみに限定
common <- intersect(names(gene_length), names(rank_out)) #二つのベクトル(names(gene_length)とnames(rank_out))の積集合(intersection)をcommonに格納
obj_gene_length <- is.element(names(gene_length), common) #commonで指定したEnsembl Gene IDsのnames(gene_length)中における位置情報をobj_gene_lengthに格納
obj_rank_out <- is.element(names(rank_out), common) #commonで指定したEnsembl Gene IDsのnames(fdr)中における位置情報をobj_fdrに格納
gene_length_sub <- gene_length[obj_gene_length] #gene_lengthベクトルの中から、obj_gene_lengthがTRUEとなっているもののみ抽出してgene_length_subに格納
rank_out_sub <- rank_out[obj_rank_out] #fdrベクトルの中から、obj_rank_outがTRUEとなっているもののみ抽出してrank_out_subに格納
tmp <- cbind(names(rank_out_sub), data[obj_rank_out,], gene_length_sub, rank_out_sub)#配列長情報があるEnsembl Gene IDのみからなる入力データの右側に、「gene_length」、「順位情報」を結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
lenrank <- cbind(gene_length_sub, rank_out_sub) #gene_length_subとrank_out_subの二つのベクトルを列方向で結合した結果をlenrankに格納。
lenrank_s <- lenrank[order(lenrank[,1]),] #lenrankを1列目のgene_lengthでソートした結果をlenrank_sに格納。
param <- 20 #boxplotを描くときの水準数(transcript_length順でソートした結果の分割数に相当)を指定。
f <- gl(param, floor(nrow(lenrank_s)/param)+1, nrow(lenrank_s)) #nrow(out_s)で表される要素数からなるベクトルを20個の水準数に分割した因子オブジェクトfを作成
y <- lenrank_s[,2] #行列len_rank_sの2列目の情報をyに格納
#参考文献2のFigure 1dのような縦軸にしたい場合
out_f3 <- "hoge4DE.png" #出力ファイル名を指定
param3 <- length(rank_out_sub)*ratio_out #「配列長をもつ全遺伝子数*DEGの割合」の順位までがDEGであるという情報をparam3に格納
hoge <- rep(1, nrow(lenrank_s)) #のちに水準ごとの要素数をsum関数でカウントするために1からなるベクトルを作成している
f_num <- tapply(hoge, f, sum) #水準ごとの要素数をカウントした結果をf_numに格納
hoge <- (y <= param3) #順位情報を含むyに対して、param3で指定した閾値以下のものをTRUE, それ以外をFALSEとしたベクトルを作成してhogeに格納
y_num <- tapply(hoge, f, sum) #水準ごとの順位が閾値を満たす要素数をカウントした結果をy_numに格納
ratio <- 100*y_num/f_num #水準ごとのDEGとされた割合(%)を計算した結果をratioに格納
png(out_f3, width=600, height=300) #出力ファイルの各種パラメータを指定
plot(levels(f), ratio, xlab="gene length", ylab="%DE") #横軸がgene_length, 縦軸が%DEとしてプロット
dev.off() #おまじない
------ ここまで ------
5. baySeqを用い、配列長情報があるもののみの生リードカウントデータを入力として長さ補正なしでDEGのランキングをする場合:
------ ここから ------
in_f1 <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_f1に格納
in_f2 <- "ens_gene_46_length.txt" #アノテーション情報ファイルを指定してin_f2に格納
out_f1 <- "hoge5.txt" #出力ファイル名を指定
param1 <- 5 #A群のサンプル数を指定
param2 <- 5 #B群のサンプル数を指定
#Ensembl Gene IDをアルファベット順に並び替えて発現データ(data)情報を取得
library(DEGseq) #パッケージの読み込み
library(baySeq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- data[order(rownames(data)),] #Ensembl Gene IDのアルファベット順に行列dataの行を並び替えている
#Ensembl Gene IDをアルファベット順に並び替えてgene_length情報を取得
tmp <- read.table(in_f2, header=TRUE, sep="\t", quote="") #アノテーション情報ファイルの読み込み
gene_length <- tmp[,2] #配列長をgene_lengthに格納
names(gene_length) <- tmp[,1] #gene_length中の値とEnsembl Gene IDを対応づけている
gene_length <- gene_length[order(names(gene_length))] #Ensembl Gene IDのアルファベット順にgene_length中の要素を並び替えている
#gene_length情報があり、かつ発現データファイル中にもあるEnsembl Gene IDのもののみ取り扱うための処理
common <- intersect(names(gene_length), rownames(data)) #二つのベクトル(names(gene_length)とrownames(data))の積集合(intersection)をcommonに格納
obj_gene_length <- is.element(names(gene_length), common) #commonで指定したEnsembl Gene IDsのnames(gene_length)中における位置情報をobj_gene_lengthに格納
obj_data <- is.element(rownames(data), common) #commonで指定したEnsembl Gene IDsのrownames(data)中における位置情報をobj_dataに格納
gene_length_sub <- gene_length[obj_gene_length] #gene_lengthベクトルの中から、obj_gene_lengthがTRUEとなっているもののみ抽出してgene_length_subに格納
data_sub <- data[obj_data,] #行列dataからobj_dataがTRUEとなっている行のみ抽出してdata_subに格納
#元々あった遺伝子数がどの程度の数になったかを表示
dim(data) #行列dataの行数と列数を表示
dim(data_sub) #行列data_subの行数と列数を表示
gene_length <- gene_length_sub #gene_lengthの中身をgene_length_subにしている
data <- as.matrix(data_sub) #dataの中身をmatrix形式のdata_subにしている
#baySeqを実行
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
groups <- list(NDE=rep(1, (param1+param2)), DE=data.cl) #このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=data, replicates=data.cl, libsizes=as.integer(colSums(data)), groups=groups)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=5000, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL) #事後確率を計算
out@estProps #発現変動(DE)遺伝子がデータの中にどの程度含まれていたかを表示(右側の数値;ちなみに左側の数値はNDEの割合を示す)
stat_out <- out@posteriors[,2] #事後確率(0に近いほど変動している; 0が最大値)をstat_outに格納
rank_out <- rank(-stat_out) #stat_outでランキングした結果をrank_outに格納
ratio_out <- out@estProps[2] #全遺伝子中に占めるDEGの割合をratio_outに格納
names(rank_out) <- rownames(data) #ランキング結果とEnsembl Gene IDを対応づけている
tmp <- cbind(names(rank_out), data, gene_length, rank_out) #配列長情報があるEnsembl Gene IDのみからなる入力データの右側に、「gene_length」、「順位情報」を結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
#参考文献2のFigure 1dのような縦軸にしたい場合
param <- 20 #boxplotを描くときの水準数(transcript_length順でソートした結果の分割数に相当)を指定。
out_f3 <- "hoge5DE.png" #出力ファイル名を指定
param3 <- length(rank_out)*ratio_out #「配列長をもつ全遺伝子数*DEGの割合」の順位までがDEGであるという情報をparam3に格納
lenrank <- cbind(gene_length, rank_out) #gene_lengthとrank_outの二つのベクトルを列方向で結合した結果をlenrankに格納。
lenrank_s <- lenrank[order(lenrank[,1]),] #lenrankを1列目のgene_lengthでソートした結果をlenrank_sに格納。
f <- gl(param, floor(nrow(lenrank_s)/param)+1, nrow(lenrank_s)) #nrow(out_s)で表される要素数からなるベクトルを20個の水準数に分割した因子オブジェクトfを作成
y <- lenrank_s[,2] #行列len_rank_sの2列目の情報をyに格納
hoge <- rep(1, nrow(lenrank_s)) #のちに水準ごとの要素数をsum関数でカウントするために1からなるベクトルを作成している
f_num <- tapply(hoge, f, sum) #水準ごとの要素数をカウントした結果をf_numに格納
hoge <- (y <= param3) #順位情報を含むyに対して、param3で指定した閾値以下のものをTRUE, それ以外をFALSEとしたベクトルを作成してhogeに格納
y_num <- tapply(hoge, f, sum) #水準ごとの順位が閾値を満たす要素数をカウントした結果をy_numに格納
ratio <- 100*y_num/f_num #水準ごとのDEGとされた割合(%)を計算した結果をratioに格納
png(out_f3, width=600, height=300) #出力ファイルの各種パラメータを指定
plot(levels(f), ratio, xlab="gene length", ylab="%DE") #横軸がgene_length, 縦軸が%DEとしてプロット
dev.off() #おまじない
------ ここまで ------
6. baySeqを用い、配列長情報があるもののみの生リードカウントデータを入力として長さ補正ありでDEGのランキングをする場合:
------ ここから ------
in_f1 <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_f1に格納
in_f2 <- "ens_gene_46_length.txt" #アノテーション情報ファイルを指定してin_f2に格納
out_f1 <- "hoge6.txt" #出力ファイル名を指定
param1 <- 5 #A群のサンプル数を指定
param2 <- 5 #B群のサンプル数を指定
#Ensembl Gene IDをアルファベット順に並び替えて発現データ(data)情報を取得
library(DEGseq) #パッケージの読み込み
library(baySeq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- data[order(rownames(data)),] #Ensembl Gene IDのアルファベット順に行列dataの行を並び替えている
#Ensembl Gene IDをアルファベット順に並び替えてgene_length情報を取得
tmp <- read.table(in_f2, header=TRUE, sep="\t", quote="") #アノテーション情報ファイルの読み込み
gene_length <- tmp[,2] #配列長をgene_lengthに格納
names(gene_length) <- tmp[,1] #gene_length中の値とEnsembl Gene IDを対応づけている
gene_length <- gene_length[order(names(gene_length))] #Ensembl Gene IDのアルファベット順にgene_length中の要素を並び替えている
#gene_length情報があり、かつ発現データファイル中にもあるEnsembl Gene IDのもののみ取り扱うための処理
common <- intersect(names(gene_length), rownames(data)) #二つのベクトル(names(gene_length)とrownames(data))の積集合(intersection)をcommonに格納
obj_gene_length <- is.element(names(gene_length), common) #commonで指定したEnsembl Gene IDsのnames(gene_length)中における位置情報をobj_gene_lengthに格納
obj_data <- is.element(rownames(data), common) #commonで指定したEnsembl Gene IDsのrownames(data)中における位置情報をobj_dataに格納
gene_length_sub <- gene_length[obj_gene_length] #gene_lengthベクトルの中から、obj_gene_lengthがTRUEとなっているもののみ抽出してgene_length_subに格納
data_sub <- data[obj_data,] #行列dataからobj_dataがTRUEとなっている行のみ抽出してdata_subに格納
#元々あった遺伝子数がどの程度の数になったかを表示
dim(data) #行列dataの行数と列数を表示
dim(data_sub) #行列data_subの行数と列数を表示
gene_length <- gene_length_sub #gene_lengthの中身をgene_length_subにしている
data <- as.matrix(data_sub) #dataの中身をmatrix形式のdata_subにしている
#baySeqを実行
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
groups <- list(NDE=rep(1, (param1+param2)), DE=data.cl) #このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=data, replicates=data.cl, libsizes=as.integer(colSums(data)), groups=groups, seglens=gene_length)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=5000, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL) #事後確率を計算
out@estProps #発現変動(DE)遺伝子がデータの中にどの程度含まれていたかを表示(右側の数値;ちなみに左側の数値はNDEの割合を示す)
stat_out <- out@posteriors[,2] #事後確率(0に近いほど変動している; 0が最大値)をstat_outに格納
rank_out <- rank(-stat_out) #stat_outでランキングした結果をrank_outに格納
ratio_out <- out@estProps[2] #全遺伝子中に占めるDEGの割合をratio_outに格納
names(rank_out) <- rownames(data) #ランキング結果とEnsembl Gene IDを対応づけている
tmp <- cbind(names(rank_out), data, gene_length, rank_out) #配列長情報があるEnsembl Gene IDのみからなる入力データの右側に、「gene_length」、「順位情報」を結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
#参考文献2のFigure 1dのような縦軸にしたい場合
param <- 20 #boxplotを描くときの水準数(transcript_length順でソートした結果の分割数に相当)を指定。
out_f3 <- "hoge6DE.png" #出力ファイル名を指定
param3 <- length(rank_out)*ratio_out #「配列長をもつ全遺伝子数*DEGの割合」の順位までがDEGであるという情報をparam3に格納
lenrank <- cbind(gene_length, rank_out) #gene_lengthとrank_outの二つのベクトルを列方向で結合した結果をlenrankに格納。
lenrank_s <- lenrank[order(lenrank[,1]),] #lenrankを1列目のgene_lengthでソートした結果をlenrank_sに格納。
f <- gl(param, floor(nrow(lenrank_s)/param)+1, nrow(lenrank_s)) #nrow(out_s)で表される要素数からなるベクトルを20個の水準数に分割した因子オブジェクトfを作成
y <- lenrank_s[,2] #行列len_rank_sの2列目の情報をyに格納
hoge <- rep(1, nrow(lenrank_s)) #のちに水準ごとの要素数をsum関数でカウントするために1からなるベクトルを作成している
f_num <- tapply(hoge, f, sum) #水準ごとの要素数をカウントした結果をf_numに格納
hoge <- (y <= param3) #順位情報を含むyに対して、param3で指定した閾値以下のものをTRUE, それ以外をFALSEとしたベクトルを作成してhogeに格納
y_num <- tapply(hoge, f, sum) #水準ごとの順位が閾値を満たす要素数をカウントした結果をy_numに格納
ratio <- 100*y_num/f_num #水準ごとのDEGとされた割合(%)を計算した結果をratioに格納
png(out_f3, width=600, height=300) #出力ファイルの各種パラメータを指定
plot(levels(f), ratio, xlab="gene length", ylab="%DE") #横軸がgene_length, 縦軸が%DEとしてプロット
dev.off() #おまじない
------ ここまで ------
7. baySeqを用い、TMM正規化後の配列長情報があるもののみのデータを入力として長さ補正ありでDEGのランキングをする場合:
------ ここから ------
in_f1 <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_f1に格納
in_f2 <- "ens_gene_46_length.txt" #アノテーション情報ファイルを指定してin_f2に格納
out_f1 <- "hoge7.txt" #出力ファイル名を指定
param1 <- 5 #A群のサンプル数を指定
param2 <- 5 #B群のサンプル数を指定
#Ensembl Gene IDをアルファベット順に並び替えて発現データ(data)情報を取得
library(DEGseq) #パッケージの読み込み
library(baySeq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- data[order(rownames(data)),] #Ensembl Gene IDのアルファベット順に行列dataの行を並び替えている
#TMM正規化データの作成
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
d <- DGEList(counts=data, group=data.cl) #DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d) #TMM正規化係数を計算
norm_f <- 1000000/(colSums(data)*d$samples$norm.factors) #TMM正規化係数はRPM正規化とセットなので、最終的に各列に対して掛ける正規化係数はnorm_fで与えられる
RPM_TMM <- sweep(data, 2, norm_f, "*") #TMM正規化後のデータをRPM_TMMとして格納
data <- round(RPM_TMM) #以下ではRPM_TMMをdataとして取り扱うが、baySeqは整数値のみしか取り扱わないのでRPM_TMM中の小数点以下の数値を丸めた結果をdataとしている
#Ensembl Gene IDをアルファベット順に並び替えてgene_length情報を取得
tmp <- read.table(in_f2, header=TRUE, sep="\t", quote="") #アノテーション情報ファイルの読み込み
gene_length <- tmp[,2] #配列長をgene_lengthに格納
names(gene_length) <- tmp[,1] #gene_length中の値とEnsembl Gene IDを対応づけている
gene_length <- gene_length[order(names(gene_length))] #Ensembl Gene IDのアルファベット順にgene_length中の要素を並び替えている
#gene_length情報があり、かつ発現データファイル中にもあるEnsembl Gene IDのもののみ取り扱うための処理
common <- intersect(names(gene_length), rownames(data)) #二つのベクトル(names(gene_length)とrownames(data))の積集合(intersection)をcommonに格納
obj_gene_length <- is.element(names(gene_length), common) #commonで指定したEnsembl Gene IDsのnames(gene_length)中における位置情報をobj_gene_lengthに格納
obj_data <- is.element(rownames(data), common) #commonで指定したEnsembl Gene IDsのrownames(data)中における位置情報をobj_dataに格納
gene_length_sub <- gene_length[obj_gene_length] #gene_lengthベクトルの中から、obj_gene_lengthがTRUEとなっているもののみ抽出してgene_length_subに格納
data_sub <- data[obj_data,] #行列dataからobj_dataがTRUEとなっている行のみ抽出してdata_subに格納
#元々あった遺伝子数がどの程度の数になったかを表示
dim(data) #行列dataの行数と列数を表示
dim(data_sub) #行列data_subの行数と列数を表示
gene_length <- gene_length_sub #gene_lengthの中身をgene_length_subにしている
data <- as.matrix(data_sub) #dataの中身をmatrix形式のdata_subにしている
#baySeqを実行
groups <- list(NDE=rep(1, (param1+param2)), DE=data.cl) #このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=data, replicates=data.cl, libsizes=as.integer(colSums(data)), groups=groups, seglens=gene_length)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=5000, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL) #事後確率を計算
out@estProps #発現変動(DE)遺伝子がデータの中にどの程度含まれていたかを表示(右側の数値;ちなみに左側の数値はNDEの割合を示す)
stat_out <- out@posteriors[,2] #事後確率(0に近いほど変動している; 0が最大値)をstat_outに格納
rank_out <- rank(-stat_out) #stat_outでランキングした結果をrank_outに格納
ratio_out <- out@estProps[2] #全遺伝子中に占めるDEGの割合をratio_outに格納
names(rank_out) <- rownames(data) #ランキング結果とEnsembl Gene IDを対応づけている
tmp <- cbind(names(rank_out), data, gene_length, rank_out) #配列長情報があるEnsembl Gene IDのみからなる入力データの右側に、「gene_length」、「順位情報」を結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
#参考文献2のFigure 1dのような縦軸にしたい場合
param <- 20 #boxplotを描くときの水準数(transcript_length順でソートした結果の分割数に相当)を指定。
out_f3 <- "hoge7DE.png" #出力ファイル名を指定
param3 <- length(rank_out)*ratio_out #「配列長をもつ全遺伝子数*DEGの割合」の順位までがDEGであるという情報をparam3に格納
lenrank <- cbind(gene_length, rank_out) #gene_lengthとrank_outの二つのベクトルを列方向で結合した結果をlenrankに格納。
lenrank_s <- lenrank[order(lenrank[,1]),] #lenrankを1列目のgene_lengthでソートした結果をlenrank_sに格納。
f <- gl(param, floor(nrow(lenrank_s)/param)+1, nrow(lenrank_s)) #nrow(out_s)で表される要素数からなるベクトルを20個の水準数に分割した因子オブジェクトfを作成
y <- lenrank_s[,2] #行列len_rank_sの2列目の情報をyに格納
hoge <- rep(1, nrow(lenrank_s)) #のちに水準ごとの要素数をsum関数でカウントするために1からなるベクトルを作成している
f_num <- tapply(hoge, f, sum) #水準ごとの要素数をカウントした結果をf_numに格納
hoge <- (y <= param3) #順位情報を含むyに対して、param3で指定した閾値以下のものをTRUE, それ以外をFALSEとしたベクトルを作成してhogeに格納
y_num <- tapply(hoge, f, sum) #水準ごとの順位が閾値を満たす要素数をカウントした結果をy_numに格納
ratio <- 100*y_num/f_num #水準ごとのDEGとされた割合(%)を計算した結果をratioに格納
png(out_f3, width=600, height=300) #出力ファイルの各種パラメータを指定
plot(levels(f), ratio, xlab="gene length", ylab="%DE") #横軸がgene_length, 縦軸が%DEとしてプロット
dev.off() #おまじない
------ ここまで ------
#3. RPKM正規化したデータを用いる場合:
------ ここから ------
in_f1 <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_f1に格納
in_f2 <- "ens_gene_46_length.txt" #アノテーション情報ファイルを指定してin_f2に格納
out_f1 <- "hoge3.txt" #出力ファイル名を指定
out_f2 <- "hoge3.png" #出力ファイル名を指定
param1 <- 5 #A群のサンプル数を指定
param2 <- 5 #B群のサンプル数を指定
#まずはEnsembl Gene IDをアルファベット順に並び替えてRPM正規化
library(DEGseq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- data[order(rownames(data)),] #Ensembl Gene IDのアルファベット順に行列dataの行を並び替えている
norm_factor1 <- 1000000/colSums(data) #各列に対して掛ける正規化係数を計算してnorm_factor1に格納
RPM <- sweep(data, 2, norm_factor1, "*") #norm_factor1を各列に掛けた結果をRPMに格納
#Ensembl Gene IDをアルファベット順に並び替えてgene_length情報を取得
tmp <- read.table(in_f2, header=TRUE, sep="\t", quote="") #アノテーション情報ファイルの読み込み
gene_length <- tmp[,2] #配列長をgene_lengthに格納
names(gene_length) <- tmp[,1] #gene_length中の値とEnsembl Gene IDを対応づけている
gene_length <- gene_length[order(names(gene_length))] #Ensembl Gene IDのアルファベット順にgene_length中の要素を並び替えている
#RPKM正規化をするために、gene_length情報があるデータのみ抽出し、そのサブセットのみでRPKM正規化
common <- intersect(names(gene_length), rownames(RPM)) #二つのベクトル(names(gene_length)とrownames(RPM))の積集合(intersection)をcommonに格納
obj_gene_length <- is.element(names(gene_length), common) #commonで指定したEnsembl Gene IDsのnames(gene_length)中における位置情報をobj_gene_lengthに格納
obj_RPM <- is.element(rownames(RPM), common) #commonで指定したEnsembl Gene IDsのrownames(RPM)中における位置情報をobj_RPMに格納
gene_length_sub <- gene_length[obj_gene_length] #gene_lengthベクトルの中から、obj_gene_lengthがTRUEとなっているもののみ抽出してgene_length_subに格納
RPM_sub <- RPM[obj_RPM,] #行列RPMからobj_RPMがTRUEとなっている行のみ抽出してRPM_subに格納
norm_factor2 <- 1000/gene_length_sub #各行に対して掛ける正規化係数を計算してnorm_factor2に格納
RPKM <- sweep(RPM_sub, 1, norm_factor2, "*") #norm_factor2を行列RPM_subの各行に掛けた結果をRPKMに格納
data <- as.matrix(RPKM) #データの型をmatrixにした結果をdataに格納
#発現変動の度合いを示すFDR値を各遺伝子について計算
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
d <- DGEList(counts=data, group=data.cl) #DGEListオブジェクトを作成してdに格納
d <- estimateCommonDisp(d) #the quantile-adjusted conditional maximum likelihood (qCML)法でcommon dispersionを計算している
d <- estimateTagwiseDisp(d, prop.used=0.5, grid.length=500) #the quantile-adjusted conditional maximum likelihood (qCML)法でmoderated tagwise dispersionを計算している
out <- exactTest(d) #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
fdr <- p.adjust(out$table$PValue, method="BH") #False Discovery Rate (FDR)を計算し、結果をfdrに格納
tmp <- cbind(rownames(data), data, gene_length_sub, fdr) #入力データの右側に、「gene_length」、「(Benjamini and Hochbergの方法で計算した)FDR値」を結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
lenfdr <- cbind(gene_length_sub, fdr) #gene_length_subとfdrの二つのベクトルを列方向で結合した結果をlenfdrに格納。
lenfdr_s <- lenfdr[order(lenfdr[,1]),] #lenfdrを1列目のgene_lengthでソートした結果をlenfdr_sに格納。
param <- 20 #boxplotを描くときの水準数(transcript_length順でソートした結果の分割数に相当)を指定。
f <- gl(param, floor(nrow(lenfdr_s)/param)+1, nrow(lenfdr_s)) #nrow(out_s)で表される要素数からなるベクトルを20個の水準数に分割した因子オブジェクトfを作成
y <- lenfdr_s[,2] #行列len_fdr_sの2列目の情報をyに格納
png(out_f2, width=600, height=300) #出力ファイルの各種パラメータを指定
plot(f, y, xlab="gene length", ylab="FDR") #横軸がgene_length, 縦軸がFDRとしてプロット
dev.off() #おまじない
#参考文献2のFigure 1dのような縦軸にしたい場合
param3 <- 0.1 #FDRの閾値を指定
hoge <- rep(1, nrow(lenfdr_s)) #のちに水準ごとの要素数をsum関数でカウントするために1からなるベクトルを作成している
f_num <- tapply(hoge, f, sum) #水準ごとの要素数をカウントした結果をf_numに格納
hoge <- (y <= param3) #FDR情報を含むyに対して、param3で指定した閾値以下のものをTRUE, それ以外をFALSEとしたベクトルを作成してhogeに格納
y_num <- tapply(hoge, f, sum) #水準ごとのFDRが閾値を満たす要素数をカウントした結果をy_numに格納
ratio <- 100*y_num/f_num #水準ごとのDEGとされた割合(%)を計算した結果をratioに格納
plot(levels(f), ratio, xlab="gene length", ylab="%DE") #横軸がgene_length, 縦軸が%DEとしてプロット
------ ここまで ------
参考文献1(Marioni et al., Genome Res., 2008)
参考文献2(Oshlack and Wakefield, Biology Direct, 2009)
前処理 | 発現レベルの定量化について
ここでは、RNA-seqデータ取得後に、spliced reads(複数のエクソンにまたがってマップされるべきリードのこと;junction readなどともいう)をどうにかしてマップし、
それらの情報をもとに遺伝子レベルおよび転写物レベルの発現量推定(expression quantification)を行うプログラムをいくつかリストアップしておきます。
ゲノムがわかっている場合とそうでない場合に大別されます。
(ヒトやマウスなど)既知の遺伝子構造情報がわかっている場合にはその情報を用いたほうが一般に精度が上がります(精度比較は既知のものと行われるからです)ので、
プログラムによっては(refFlat形式やGFF形式の)遺伝子アノテーション情報ファイルをオプションとして要求するものもあるかと思います。
ゲノム用:
・Scripture: Guttman et al., Nature Biotechnol., 2010
・Cufflinks: Trapnell et al., Nat. Biotechnol., 2010
・rQuant: Bohnert and Ratsch, Nucleic Acids Res., 2010
・ALEXA-seq: Griffith et al., Nat Methods, 2010
・MISO: Katz et al., Nat. Methods, 2010
・MMSEQ: Turro et al., Genome Biol., 2011
・IsoformEx: Kim et al., BMC Bioinformatics, 2011
・RSEM: Li and Dewey, BMC Bioinformatics, 2011
・SLIDE: Li et al., PNAS, 2011
・BitSeq: Glaus et al., Bioinformatics, 2012
・CEM: Li and Jiang, Bioinformatics, 2012
トランスクリプトーム用:
・NEUMA:Lee et al., Nucleic Acids Res., 2011
・IsoEM: Nicolae et al., Algorithms Mol. Biol., 2011
・RSEM: Li and Dewey, BMC Bioinformatics, 2011
備忘録:
「NEUMA」で提案されたFVKM値の算出手順(x bpを読むpaired-endの場合)は、
- RefSeqのようなmRNA配列の集合(transcriptome sequence)にマッピングし、
- mRNA isoform情報(refGene)を使って「isoformのみにマップされたリード数」と「複数のisoformsに共通してマップされたリード数」をNumber of Informative Reads (NIR)としてgNIRとiNIRを計算します。(別のmRNA配列にマップされるものは使わない)
- x bpのpaired-endなので実際に1.でマップした結果からpaired-endの両端の長さ(fragment size; mate pair distance)がどの程度だったか計算することができるので、
d = (x+1), (x+2), ..., 数百bp (原著論文ではx=36 bpのデータのときに250 bpとしているので、d=37, 38, ..., 250 bp)の長さの範囲で各dにおけるfragment sizeの確率P(d)を計算しておきます。
- 3で考慮したdの範囲について、まずはd = x+1について考える。transcriptome sequence中の各mRNA配列(アノテーション情報が豊富なヒトなどの場合には、RefSeqとUCSC refGeneからmRNA isoform annotation情報が得られるので)について、
複数のisoformがある場合にはisoformごとにfragment sizeがdの人工的なpaired-end (Artificial paired-end; APE)を全ての可能性について(つまり、一塩基ずつずらしたものを)作成します。
- 4で作成したAPE (人工的に作成したリード)をもう一度transcriptome sequenceにマップし、「isoformのみにマップされたリード数」と「複数のisoformsに共通してマップされたリード数」をカウントします。
- 4-5の手順は「d = x+1について」のものでしたが、これをつぎはd= x+2、その次はd= x+3などと計算していき、3で考慮したdの範囲について計算しまくります。
- そうすると、各dについての全mRNAのカウントデータが得られますので、最終的にisoformのみのほうの行列データ(iUd,i)と複数のisoformに共通した部分の行列データ(gUd,g)が得られます。
- 3で得られたP(d)と7で得られた行列データをそれぞれのdについて掛けたものの和をとったものがこの論文でexpected uniquely mappable area (EUMA)と呼んでいるものです。
例えば行列データがgUd,gのものについてのEUMA (gEUMAに相当)を計算すると、gEUMA = P(37)*gU37,g + P(38)*gU38,g + ...ということで各遺伝子gについてのEUMAが得られるわけです。(ここで、P(d)はサンプルごとに独立したものであることに注意)
- というわけで、ある遺伝子gの発現量gFVKMはそのサンプルに対してマップされたトータルのリード数Nを考慮して、gFVKM = gNIR/(gEUMA*N)として計算されます。各isoformについても同様に計算されます。注意点としては、EUMAの単位はkbとなっていることと、Nの単位もmillionとなっていることです。
EUMAというのは、「実際に観測されたmate pair distance (paired-endの平均的なフラグメント長、に相当)あたりにマップされるリード数の期待値」に相当するもので、いわばバックグラウンドレベルをこの値で定義しているわけです。
この値はFVKM値の計算時に分母で掛っているので、EUMAが0のものはそもそも計算ができません。。。原著論文では、EUMAのカットオフ値を50bpとしていますが、このカットオフ値以上のものを"measureble"と定義しています。
そしてこのカットオフ値以下のmRNA (or gene or isoform)を「この方法の枠組みでは発現レベルを正確に定量できない」という意味で"unmeasurable"として、解析から除外(remove)しています。
一方、EUMA値がカットオフ値より大きいものの、NIR値が0となっているものは、最終的に発現量は0だとして"unexpressed"としています。
このままではgEUMAがカットオフ値以下の場合に最終的な遺伝子の発現量値(gFVKM)が出力されない、ということになってしまいますが、
この論文の後半で、「"gFVKM値"と"全てのisoformsのiFVKM値の総和"が同程度なはずであり実際そうだった」ことから、このプログラムは最終的な出力結果(gLVKM値 = log2(x+1))算出の際に用いるxを「"gFVKM"か"測定可能なisoformsのiFVKM値の総和"どちらか数値の大きなほう」に基づいて計算しています。
このEUMAで正規化(normalization)した方法という意味でNEUMAという名称のようです。
原著論文で、Cufflinksとの比較も行っていて、ランダムに選んだ27個の遺伝子のRT-PCRの結果との相関でNEUMAのほうが優れている、ということになっています。
が、上述のように、既知のtrancriptome sequenceがないとそもそも適用できませんし、CufflinksやSolasなどのように新規遺伝子や新規isoformの検出ができるわけではありません。
よって、CufflinksやSolasのような方法を適用してできるだけ多くのisoformを同定しておいて、それらの情報を使ってNEUMAで定量化するという補完的な使い方が重要でしょう。
また、対象とするtranscriptome sequence配列が既に手元にあったとしても、例えばx bpを読むpaired-endのデータを解析したいわけですが、同じリファレンス配列だとしてもxの値が変わるとEUMAの計算もやり直さないといけないのがなかなかつらいところですね。
とはいっても上記手順を実行するうえで必要な情報がそろっていれば、よりよい定量化法をお探しの方は、心に留めておくべき方法だと思います。
「ALEXA-seq」は「normalized average coverage (NAC)」という値を計算しています。
まず、"ある配列"(gene or transcript or exon region)上にマップされたリードの総塩基数(a)を計算し、
それを"ある配列"の長さ(b)で割ったものがaverage coverage (AC)です。
で、このACの値はそのサンプルでsequenceした総リード数が多ければ多いほど高くなるので、サンプル間比較はそのままではできません。
よって、全配列上にマップされたリードの総塩基数で正規化する必要がある、ということでACの値に
「10,000,000,000/全配列上にマップされたリードの総塩基数」を掛けたものをNACとしています。
上記の10,000,000,000の値は任意ですが、論文中ではこの値にしています。
「Trans-ABySS」は、一言で表現するなら「Coverage per million mapped reads (CPM)」でしょうか。
もう少し具体的に書くと、「ある遺伝子上にマップされたリードのトータルの長さ(=a)」を、
「その遺伝子(gene)から発現している全転写物(all transcripts)の和集合領域の長さ(=b)」で割った値
を計算しておきます(いわゆるcoverage; 論文中では"normalized coverage value"としています)。
で、このcoverage (=a/b)の値はそのサンプルでsequenceした総リード数が多ければ多いほど高くなるので、サンプル間比較はそのままではできません。
よって、マップされた総リード数で正規化する必要がある、ということでcoverageの値に
「1,000,000/全遺伝子由来転写物の和集合領域にマップされたリード数」を掛けたものを"expression score"としています。
「ALEXA-seq」と思想的に(数式的にも実質的に)同じものです。よって、これもNACといってもいいでしょう。
前処理 | 正規化について
サンプル内正規化周辺:
一つ上の項目(前処理 | 発現レベルの定量化について)は主にリファレンス配列(ゲノムやトランスクリプトーム)に対して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法)は比較する二群間(A群 vs. B群)でDEG数に大きな偏りがないことを前提にしています。
つまり、「(A群 >> B群)のDEG数と(A群 << B群)の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., submitted)。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)も提案されています:
a. 複製実験データの再現性が高いかどうか?(reproducibilityとかprecisionという用語が対応します)
b. qRT-PCRやmicroarrayなどの他の実験技術由来のデータをgold standardとしてそれとの相関係数が高いかどうか?(accuracy; Garmire and Subramaniam, 2012)
c. シミュレーションデータなど、既知の発現変動遺伝子(DEGs)を発現変動遺伝子として上位にランキングできる正規化法かどうか?(AUC; Kadota et al., 2012)
「方法名」:「Rパッケージ名」:「原著論文」の順番です。(あれば)
また、必ずしも正規化法の原著論文とは対応付いていませんのであしからず。この方法を使いたいがどのパッケージで利用可能?、という視点でご覧になってください。
正規化(サンプル内; GC含量補正):
・regression正規化(loess):EDASeq:Risso et al., BMC Bioinformatics, 2011
・global正規化:EDASeq:Risso et al., BMC Bioinformatics, 2011
・full quantile (FQ)正規化:EDASeq:Risso et al., BMC Bioinformatics, 2011
・conditional quantile正規化(CQN):cqn:Hansen et al., Biostatistics, 2012
・GCcorrect:Benjamini and Speed, Nucleic Acids Res., 2012
正規化(サンプル内; GC contents and gene length同時補正):
generalized-additive-model (GAM)正規化:RNASeqBias:Zheng et al., BMC Bioinformatics, 2011
正規化(サンプル内; 全般;分布系):
two-parameter generarized Poisson (GP) model:GPseq:Srivastava and Chen, Nucleic Acids Res., 2010
正規化(サンプル内; 全般;その他(自分の前後の塩基の使用頻度を考慮, sequencing preference)):
multiple additive regression trees (MART) model:mseq:Li et al., Genome Biol., 2010
正規化(サンプル間):
・RPM (or CPM)正規化:edgeR:Robinson et al., Bioinformatics, 2010
・TMM正規化:edgeR:Robinson et al., Bioinformatics, 2010
・Anders and Huberの(AH)正規化:DESeq:Anders and Huber, Genome Biol, 2010
・median正規化:EDASeq:Risso et al., BMC Bioinformatics, 2011
・Upper-quartile (UQ)正規化:EDASeq:Risso et al., BMC Bioinformatics, 2011
・full quantile (FQ)正規化:EDASeq:Risso et al., BMC Bioinformatics, 2011
・TbT (DEGES/TbT)正規化(複製あり、なしデータ用):TCC (≥ ver. 1.1.99):Kadota et al., Algorithms Mol. Biol., 2012
・iDEGES/edgeR正規化(複製ありデータ用):TCC (≥ ver. 1.1.99):Sun et al., submitted
・iDEGES/DESeq正規化(複製なしデータ用):TCC (≥ ver. 1.1.99):Sun et al., submitted
他の参考文献:
an exact test for negative binomial distribution:Robinson and Smyth, Biostatistics, 2008
Oshlack and Wakefield, Biology Direct, 2009
goseq:Young et al., Genome Biol., 2010
Bullard et al., BMC Bioinformatics, 2010
ReCount:Frazee et al., BMC Bioinformatics, 2011
Garmire and Subramanian, RNA, 2012
DEXseq:Anders et al., Genome Res., 2012
Sun and Zhu, Bioinformatics, 2012
Dillies et al., Brief. Bioinform., in press
前処理 | 正規化(サンプル内) | GC bias補正 | full quantile (FQ)正規化(Risso_2011)
原著論文(Risso et al., 2011)中のFig.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, 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. EDASeqパッケージ中の記述と似たやり方で示した場合:
------ ここから ------
param_A <- 2 #A群のサンプル数を指定
param_B <- 2 #B群のサンプル数を指定
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_A), rep(2, param_B)) #A群を1、B群を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)) #プロット。A群("mut_1" and "mut_2"に相当)のラベルが1, B群("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)) #プロット。A群("mut_1" and "mut_2"に相当)のラベルが1, B群("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の中身をout_f1で指定したファイル名で保存
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の中身をout_f2で指定したファイル名で保存
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の中身をout_f3で指定したファイル名で保存
#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の中身をout_f4で指定したファイル名で保存
#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関数で最も近い整数値に丸めたものです。
------ ここまで ------
2. 二つのタブ区切りテキストファイルの読み込みからやる場合:
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_A <- 2 #A群のサンプル数を指定
param_B <- 2 #B群のサンプル数を指定
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で指定したファイルを読み込んでdata.tmpに格納
gc.tmp <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#in_f2で指定したファイルを読み込んでgc.tmpに格納
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を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)) #プロット。A群("mut_1" and "mut_2"に相当)のラベルが1, B群("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)) #プロット。A群("mut_1" and "mut_2"に相当)のラベルが1, B群("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の中身をout_f1で指定したファイル名で保存
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の中身をout_f2で指定したファイル名で保存
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の中身をout_f3で指定したファイル名で保存
------ ここまで ------
EDASeq:Risso et al., BMC Bioinformatics, 2011
yeastRNASeq:Lee et al., PLoS Genet., 2008
GCcorrect:Benjamini and Speed, Nucleic Acids Res., 2012
Saccharomyces Genome Database (SGD)
前処理 | 正規化(サンプル内) | GAM正規化(Zheng_2011)
RNASeqBiasというRパッケージの正規化法の論文です。論文中では、GAM correction法と呼んでいます。
a simple generalized-additive-model based approachを用いてGC contentやgene lengthの補正を同時に行ってくれるようです。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
------ ここまで ------
RNASeqBias:Zheng et al., BMC Bioinformatics, 2011
前処理 | 正規化(サンプル間) | 二群間用 | 複製なし | DEGES/TbT正規化(TbT; Sun_submitted)
TbT正規化は以前(2012年ごろ)は複製ありデータしか対応していませんでしたが、2013年にbaySeqが複製なしデータにも対応してるのを確認しました。
ここでは、DEGES/TbT正規化係数の算出法とDEGES/TbT正規化後のデータを得る手順などを示しています。
DEGES/TbT正規化は、TMM-(baySeq-TMM)n(n=1)のパイプラインですが、計算時間がかかるのは相変わらずですので、n >= 2としてiterationを行う戦略(iDEGES)はお勧めできません。
がparam1のところの数値を変えることでiDEGES/TbTを実行することは一応可能です。
が、基本的に正規化だけで終わることはありませんので、ここの項目のみでは何の役にも立ちませんのであしからず。。。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
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 <- "data_hypodata_1vs1_DEGESTbT.txt" #出力ファイル名を指定
param_A <- 1 #A群(G1群)のサンプル数を指定
param_B <- 1 #B群(G2群)のサンプル数を指定
param1 <- 1 #TMM-(baySeq-TMM)nパイプラインのnの値(iterationの回数)を指定(デフォルトは1)
param2 <- 10000 #ブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とかでやってみてください。)
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
#iDEGES/DESeq正規化の実行
tcc <- calcNormFactors(tcc, norm.method = "tmm", test.method = "bayseq",#正規化を実行した結果をtccに格納
iteration=param1, samplesize=param2) #正規化を実行した結果を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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータで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.19941 18.87876)
#iDEGES/DESeq正規化のstep2で検出されたpotential DEGの結果(step3で使われないものたち)を表示
table(tcc$private$DEGES.potentialDEG) #0 (nonDEGに相当)が8,049個、1 (G1で高発現のDEGに相当)が936個、2 (G2で高発現のDEGに相当)が1015個と判定されていたことがわかる。
#iDEGES/DESeq正規化係数を表示
tcc$norm.factors #正規化係数を表示(0.7786209 1.2213791)
#このデータは「答え」がわかっているものなので、答え(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.134), G1で高発現のDEG(青; -1.866), G2で高発現のDEG(赤; 2.187)
------ ここまで ------
baySeq:Hardcastle and Kelly, BMC Bioinformatics, 2010
TCC (≥ ver. 1.1.99):Sun et al., submitted
TbT正規化法:Kadota et al., Algorithms Mol. Biol., 2012
前処理 | 正規化(サンプル間) | 二群間用 | 複製なし | iDEGES/DESeq正規化(Sun_submitted)
iDEGES/edgeR法は、サンプルデータ14 (data_hypodata_1vs1.txt)の1 sample vs. 1 sampleのような「複製なし」データの正規化は実行できません。
理由はstep2で用いるexact test(iDEGES/edgeR法の場合)が複製ありを前提としているためです。
iDEGES/DESeq法は複製なしの二群間比較用データの正規化を「正規化時に悪さをする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 <- "data_hypodata_1vs1_iDEGESDESeq.txt" #出力ファイル名を指定
param_A <- 1 #A群(G1群)のサンプル数を指定
param_B <- 1 #B群(G2群)のサンプル数を指定
param1 <- 3 #DESeq-(DESeq-DESeq)nパイプラインのnの値(iterationの回数)を指定(デフォルトは3)
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
#iDEGES/DESeq正規化の実行
tcc <- calcNormFactors(tcc, iteration=param1) #正規化を実行した結果を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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータで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)
------ ここまで ------
DESeq:Anders and Huber, Genome Biol, 2010
TCC (≥ ver. 1.1.99):Sun et al., submitted
前処理 | 正規化(サンプル間) | 二群間用 | 複製なし | 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 <- "data_hypodata_1vs1_TMM.txt" #出力ファイル名を指定
param_A <- 1 #A群(G1群)のサンプル数を指定
param_B <- 1 #B群(G2群)のサンプル数を指定
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
#TMM正規化の実行
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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータで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)
------ ここまで ------
TMM正規化法:Robinson and Oshlack, Genome Biol., 2010
edgeR:Robinson et al., Bioinformatics, 2010
TCC:Kadota et al., Algorithms Mol. Biol., 2012
前処理 | 正規化(サンプル間) | 二群間用 | 複製あり | iDEGES/edgeR正規化(Sun_submitted)
iDEGES/edgeR法は、TbT法(Kadota et al., 2012)の改良版で、オリジナルのTbT法よりも100倍程度高速(デフォルトの場合)で理論性能は上です。
TbT法の正規化の基本戦略は「正規化時に悪さをするDEGを正規化前に除いてしまえ (DEG elimination strategy; DEGES; でげす)」で、
実体は「1.TMM法(Robinson and Oshlack, 2010) → 2.baySeq (Hardcastle and Kelly, 2010) → 3.TMM法」の解析パイプライン(TMM-baySeq-TMM)です。
しかし、step2でbaySeqパッケージ中の経験ベイズ(an empirical Bayesian method)を用いて発現変動遺伝子(Differentially Expressed Genes; DEGs)検出を行うために計算時間が非常にかかるという欠点がありました。
DEGES/edgeR法(iterativeを意味するiがついていない点に注意)はTbT法のstep2に相当するDEG同定のところで、edgeRパッケージに実装されているexact test (Robinson and Smyth, 2008)を利用したパイプラインTMM-edgeR-TMMです。
これはオリジナルのTbT法と同程度の性能を維持したまま400-500倍程度早い方法です。
TbT論文でも言及していますが、理論上、step1-(step2-step3)nとしてstep2-step3の手順を繰り返すことでよりロバストな正規化係数を得ることが可能ですが、
TMM-(baySeq-TMM)nのパイプラインでbaySeqを何度も繰り返すのは非現実的(計算時間が非常にかかるのでアリエナイ...)でした。
しかし、edgeR中のexact testであれば非常に計算が軽いのでstep2-step3の手順を繰り返すことが現実的に可能なわけです。しかも内部的に利用する関数はedgeRパッケージ中のもので基本的に完結するというメリットもある。
したがって、DEGES/edgeR法のiterative版(iterative DEGES/edgeR)という意味でiDEGES/edgeRと名づけたこのパイプラインTMM-(edgeR-TMM)n(デフォルトはn=3)は、
DEGES/edgeRよりもn倍程度計算時間はかかるものの理論上の性能が高いのでTbT法を利用するよりも断然お勧めです。
ちなみにDEGES/edgeRは「iDEGES/edgeRのn=1の場合」と解釈することも可能です。
ここでは、iDEGES/edgeR正規化係数の算出法とiDEGES/edgeR正規化後のデータを得る手順などを示しています。
が、基本的に正規化だけで終わることはありませんので、ここの項目のみでは何の役にも立ちませんのであしからず。。。
また、サンプルデータ14 (data_hypodata_1vs1.txt)の1 sample vs. 1 sampleのような「複製なし」データの正規化は実行できません(理由はstep2で用いるexact testが複製ありを前提としているためです)のでご注意ください。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
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_iDEGESedgeR.txt" #出力ファイル名を指定
param_A <- 3 #A群(G1群)のサンプル数を指定
param_B <- 3 #B群(G2群)のサンプル数を指定
param1 <- 3 #TMM-(edgeR-TMM)nパイプラインのnの値(iterationの回数)を指定(デフォルトは3)
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
#iDEGES/edgeR正規化の実行
tcc <- calcNormFactors(tcc, iteration=param1) #正規化を実行した結果を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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータで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.73976 17.92443 17.74807 18.17837 17.23521 17.16515)
#iDEGES/edgeR正規化のstep2で検出されたpotential DEGの結果(step3で使われないものたち)を表示
table(tcc$private$DEGES.potentialDEG) #0 (nonDEGに相当)が8,679個、1 (G1で高発現のDEGに相当)が1,109個、2 (G2で高発現のDEGに相当)が212個と判定されていたことがわかる
#iDEGES/edgeR正規化係数を表示
tcc$norm.factors #正規化係数を表示(0.7469719 0.8344937 0.7237473 1.2551083 1.1897781 1.2499007)
#このデータは「答え」がわかっているものなので、答え(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.033), G1で高発現のDEG(青; -1.960), G2で高発現のDEG(赤; 2.043)
------ ここまで ------
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_iDEGESedgeR.txt" #出力ファイル名を指定
param_A <- 2 #A群(mut群)のサンプル数を指定
param_B <- 2 #B群(wt群)のサンプル数を指定
param1 <- 3 #TMM-(edgeR-TMM)nパイプラインのnの値(iterationの回数)を指定(デフォルトは3)
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
#iDEGES/edgeR正規化の実行
tcc <- calcNormFactors(tcc, iteration=param1) #正規化を実行した結果を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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc) #M-A plotを描画
#iDEGES/edgeR正規化のstep2で検出されたpotential DEGの結果(step3で使われないものたち)を表示
table(tcc$private$DEGES.potentialDEG) #0 (nonDEGに相当)が4,036個、1 (G1で高発現のDEGに相当)が1,284個、2 (G2で高発現のDEGに相当)が1,745個と判定されていたことがわかる。実に100*(1284+1745)/7065=42.873%がDEGと判定されていることになるがtechnical replicatesのデータなので妥当といえば妥当。
#iDEGES/edgeR正規化係数を表示
tcc$norm.factors #正規化係数を表示(1.1860633 1.1823388 0.8178319 0.8137659)
------ ここまで ------
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 <- "data_yeast_7065_iDEGESedgeR2.txt" #出力ファイル名を指定
param_A <- 2 #A群(mut群)のサンプル数を指定
param_B <- 2 #B群(wt群)のサンプル数を指定
param1 <- 3 #TMM-(edgeR-TMM)nパイプラインのnの値(iterationの回数)を指定(デフォルトは3)
param_lowcount <- 0 #低発現遺伝子のフィルタリングを行う際の閾値。遺伝子(行)ごとにカウントの総和を計算し、ここで指定した値よりも大きいものだけがその後の解析に用いられる
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
dim(tcc$count) #カウント行列の行数と列数を表示(7065行4列)
#フィルタリングの実行(低発現のものを除去)
tcc <- filterLowCountGenes(tcc, low.count = param_lowcount) #param_lowcountで指定した閾値より大きい総カウント数をもつ遺伝子のみを抽出している
dim(tcc$count) #カウント行列の行数と列数を表示(6508行4列になっていることがわかる)
#iDEGES/edgeR正規化の実行
tcc <- calcNormFactors(tcc, iteration=param1) #正規化を実行した結果を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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc) #M-A plotを描画
#iDEGES/edgeR正規化のstep2で検出されたpotential DEGの結果(step3で使われないものたち)を表示
table(tcc$private$DEGES.potentialDEG) #0 (nonDEGに相当)が3,447個、1 (G1で高発現のDEGに相当)が1,311個、2 (G2で高発現のDEGに相当)が1,750個と判定されていたことがわかる
#iDEGES/edgeR正規化係数を表示
tcc$norm.factors #正規化係数を表示(1.1849185 1.1802298 0.8192871 0.8155645)
------ ここまで ------
Robinson and Smyth, Biostatistics, 2008
TMM正規化法:Robinson and Oshlack, Genome Biol., 2010
edgeR:Robinson et al., Bioinformatics, 2010
baySeq:Hardcastle and Kelly, BMC Bioinformatics, 2010
TCC:Kadota et al., Algorithms Mol. Biol., 2012
前処理 | 正規化(サンプル間) | 二群間用 | 複製あり | 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 <- "data_hypodata_3vs3_TbT.txt" #出力ファイル名を指定
param_A <- 3 #A群(G1群)のサンプル数を指定
param_B <- 3 #B群(G2群)のサンプル数を指定
param_samplesize <- 10000 #TbT法のstep2中で行うブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とか1000とかでやってみてください。)
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
#TbT正規化の実行
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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータで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 <- "data_yeast_7065_TbT.txt" #出力ファイル名を指定
param_A <- 2 #A群(mut群)のサンプル数を指定
param_B <- 2 #B群(wt群)のサンプル数を指定
param_samplesize <- 10000 #TbT法のstep2中で行うブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とか1000とかでやってみてください。)
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
#TbT正規化の実行
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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータで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 <- "data_yeast_7065_TbT2.txt" #出力ファイル名を指定
param_A <- 2 #A群(mut群)のサンプル数を指定
param_B <- 2 #B群(wt群)のサンプル数を指定
param_samplesize <- 10000 #TbT法のstep2中で行うブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とか1000とかでやってみてください。)
param_lowcount <- 0 #低発現遺伝子のフィルタリングを行う際の閾値。遺伝子(行)ごとにカウントの総和を計算し、ここで指定した値よりも大きいものだけがその後の解析に用いられる
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
dim(tcc$count) #カウント行列の行数と列数を表示(7065行4列)
#フィルタリングの実行(低発現のものを除去)
tcc <- filterLowCountGenes(tcc, low.count = param_lowcount) #param_lowcountで指定した閾値より大きい総カウント数をもつ遺伝子のみを抽出している
dim(tcc$count) #カウント行列の行数と列数を表示(6508行4列になっていることがわかる)
#TbT正規化の実行
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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータで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)
------ ここまで ------
Marioni et al., Genome Res., 2008
TMM正規化法:Robinson and Oshlack, Genome Biol., 2010
TbT正規化法:Kadota et al., Algorithms Mol. Biol., 2012
edgeR:Robinson et al., Bioinformatics, 2010
baySeq:Hardcastle and Kelly, BMC Bioinformatics, 2010
TCC (≥ ver. 1.1.99):Sun et al., submitted
前処理 | 正規化(サンプル間) | 二群間用 | 複製あり | 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 <- "data_hypodata_3vs3_TMM.txt" #出力ファイル名を指定
param_A <- 3 #A群(G1群)のサンプル数を指定
param_B <- 3 #B群(G2群)のサンプル数を指定
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
#TMM正規化の実行
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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータで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 <- "data_yeast_7065_TMM.txt" #出力ファイル名を指定
param_A <- 2 #A群(mut群)のサンプル数を指定
param_B <- 2 #B群(wt群)のサンプル数を指定
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
#TMM正規化の実行
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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータで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 <- "data_yeast_7065_TMM2.txt" #出力ファイル名を指定
param_A <- 2 #A群(mut群)のサンプル数を指定
param_B <- 2 #B群(wt群)のサンプル数を指定
#必要なパッケージなどをロード
library(edgeR) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データの型をmatrixにしている
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を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の中身をout_fで指定したファイル名で保存
------ ここまで ------
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であることが既知です。
------ ここから ------
in_f <- "data_hypodata_1vs1.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "data_hypodata_1vs1_TMM.txt" #出力ファイル名を指定
param_A <- 1 #A群(G1群)のサンプル数を指定
param_B <- 1 #B群(G2群)のサンプル数を指定
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
#TMM正規化の実行
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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータで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)
------ ここまで ------
5. サンプルデータ2の32,000 genes×10 samplesの「複製あり」タグカウントデータ(SupplementaryTable2_changed.txt)
technical replicatesのデータ(Kidney群5サンプル vs. Liver群5サンプル)です。
ごく昔の記述です。参考まで。
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_f1に格納
out_f <- "SupplementaryTable2_changed_TMM2.txt" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 1000000 #補正後の総リード数を指定(RPMデータと同程度の数値分布にしたい場合はここは変更しないで)
#必要なパッケージなどをロード
library(edgeR) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データの型をmatrixにしている
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#TMM正規化本番
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, param3/effective_libsizes, "*") #元のカウントデータをeffective_libsizesで割り(RPMデータと同程度の数値分布にしたいので)param3を掛けた正規化後のデータをRPM_TMMに格納
#正規化後のデータをファイルに出力
data <- RPM_TMM #RPM_TMMをdataに格納
tmp <- cbind(rownames(data), data) #ファイルに出力したい情報を連結してtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
#おまけとして、TMM正規化後のデータでM-A plotを描画
data <- RPM_TMM #RPM_TMMをdataに格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
------ ここまで ------
Marioni et al., Genome Res., 2008
TMM正規化法:Robinson and Oshlack, Genome Biol., 2010
edgeR:Robinson et al., Bioinformatics, 2010
TCC:Kadota et al., Algorithms Mol. Biol., 2012
前処理 | 正規化(サンプル間) | 全般 | Anders and Huberの(AH)正規化(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 <- "data_hypodata_3vs3_AH.txt" #出力ファイル名を指定
param_A <- 3 #A群(G1群)のサンプル数を指定
param_B <- 3 #B群(G2群)のサンプル数を指定
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
#Anders and Huberの(AH)正規化の実行
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=FALSE)#正規化を実行した結果を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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータで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 <- "data_yeast_7065_AH.txt" #出力ファイル名を指定
param_A <- 2 #A群(mut群)のサンプル数を指定
param_B <- 2 #B群(wt群)のサンプル数を指定
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
#Anders and Huberの(AH)正規化の実行
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=FALSE)#正規化を実行した結果を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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータで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 <- "data_yeast_7065_AH2.txt" #出力ファイル名を指定
param_A <- 2 #A群(mut群)のサンプル数を指定
param_B <- 2 #B群(wt群)のサンプル数を指定
#必要なパッケージなどをロード
library(DESeq) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データの型をmatrixにしている
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータの列ごとの各種要約統計量を表示
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 <- "data_yeast_7065_AH3.txt" #出力ファイル名を指定
param_A <- 2 #A群(mut群)のサンプル数を指定
param_B <- 2 #B群(wt群)のサンプル数を指定
#必要なパッケージなどをロード
library(DESeq) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データの型をmatrixにしている
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータの列ごとの各種要約統計量を表示
summary(normalized.count) #normalized.countの各列(つまりサンプル)の要約統計量を表示
------ ここまで ------
5. SupplementaryTable2_changed.txtの「5 samples vs. 5 samples」の比較の場合:
昔の記述です。参考まで。
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_f1に格納
out_f <- "SupplementaryTable2_changed_DESeq.txt" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 1000000 #補正後の総リード数を指定(RPMデータと同程度の数値分布にしたい場合はここは変更しないで)
#必要なパッケージなどをロード
library(DESeq) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データの型をmatrixにしている
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#DESeq正規化本番
cds <- newCountDataSet(data, data.cl) #おまじない(CountDataSetというクラスを作成している)
cds <- estimateSizeFactors(cds) #おまじない(サンプル間でマップされたread数が異なるのを補正するための正規化係数を計算している;いわゆるRPMの計算をしているような認識で差し支えない)
#data_DESeq <- sweep(data, 2, 1/sizeFactors(cds), "*") #生のリードカウントデータをDESeq正規化係数を含む補正後のライブラリサイズで割った正規化後のデータをdata_DESeqに格納
sizeFactors(cds) #計算された補正後のライブラリサイズを表示しているだけ
norm_f_DESeq <- sizeFactors(cds) * mean(colSums(data)) / colSums(data)#DESeq正規化係数の情報を抽出してnorm_f_DESeqに格納
effective_libsizes <- colSums(data) * norm_f_DESeq #effective library sizesというのはlibrary sizesに正規化係数を掛けたものなのでそれを計算した結果をeffective_libsizesに格納
data_DESeq <- sweep(data, 2, mean(colSums(data))/effective_libsizes, "*")#生のリードカウントデータをDESeq正規化係数を含む補正後のライブラリサイズで割った正規化後のデータをdata_DESeqに格納
colSums(counts(cds, normalized=TRUE)) #正規化後のデータについて、列ごとのSumを表示
colSums(data_DESeq) #正規化後のデータについて、列ごとのSumを表示(上の結果と同じなので正しい正規化後のデータを得られていることが分かる)
#正規化後のデータをファイルに出力
data <- data_DESeq #data_DESeqをdataに格納
tmp <- cbind(rownames(data), data) #ファイルに出力したい情報を連結してtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
#おまけとして、DESeq正規化後のデータでM-A plotを描画
data <- data_DESeq #data_DESeqをdataに格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
------ ここまで ------
6. SupplementaryTable2_changed2.txtの「1 sample vs. 1 sample」の比較の場合:
昔の記述です。参考まで。
------ ここから ------
in_f <- "SupplementaryTable2_changed2.txt" #読み込みたい発現データファイルを指定してin_f1に格納
out_f <- "SupplementaryTable2_changed2_DESeq.txt" #出力ファイル名を指定
param_A <- 1 #A群のサンプル数を指定
param_B <- 1 #B群のサンプル数を指定
param3 <- 1000000 #補正後の総リード数を指定(RPMデータと同程度の数値分布にしたい場合はここは変更しないで)
#必要なパッケージなどをロード
library(DESeq) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データの型をmatrixにしている
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#DESeq正規化本番
cds <- newCountDataSet(data, data.cl) #おまじない(CountDataSetというクラスを作成している)
cds <- estimateSizeFactors(cds) #おまじない(サンプル間でマップされたread数が異なるのを補正するための正規化係数を計算している;いわゆるRPMの計算をしているような認識で差し支えない)
#data_DESeq <- sweep(data, 2, 1/sizeFactors(cds), "*") #生のリードカウントデータをDESeq正規化係数を含む補正後のライブラリサイズで割った正規化後のデータをdata_DESeqに格納
sizeFactors(cds) #計算された補正後のライブラリサイズを表示しているだけ
norm_f_DESeq <- sizeFactors(cds) * mean(colSums(data)) / colSums(data)#DESeq正規化係数の情報を抽出してnorm_f_DESeqに格納
effective_libsizes <- colSums(data) * norm_f_DESeq #effective library sizesというのはlibrary sizesに正規化係数を掛けたものなのでそれを計算した結果をeffective_libsizesに格納
data_DESeq <- sweep(data, 2, mean(colSums(data))/effective_libsizes, "*")#生のリードカウントデータをDESeq正規化係数を含む補正後のライブラリサイズで割った正規化後のデータをdata_DESeqに格納
colSums(counts(cds, normalized=TRUE)) #正規化後のデータについて、列ごとのSumを表示
colSums(data_DESeq) #正規化後のデータについて、列ごとのSumを表示(上の結果と同じなので正しい正規化後のデータを得られていることが分かる)
#正規化後のデータをファイルに出力
data <- data_DESeq #data_DESeqをdataに格納
tmp <- cbind(rownames(data), data) #ファイルに出力したい情報を連結してtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
#おまけとして、DESeq正規化後のデータでM-A plotを描画
data <- data_DESeq #data_DESeqをdataに格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
------ ここまで ------
DESeq:Anders and Huber, Genome Biol, 2010
TCC:Kadota et al., Algorithms Mol. Biol., 2012
前処理 | 正規化(サンプル間) | 全般 | Upper-quartile (UQ)正規化(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" #出力ファイル名を指定
param_A <- 3 #A群(G1群)のサンプル数を指定
param_B <- 3 #B群(G2群)のサンプル数を指定
param1 <- "upper" #upper-quartile正規化法("upper")を指定
#必要なパッケージなどをロード
library(EDASeq) #パッケージの読み込み
#発現データの読み込みとSeqExpressionSetオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータで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" #出力ファイル名を指定
param_A <- 2 #A群(mut群)のサンプル数を指定
param_B <- 2 #B群(wt群)のサンプル数を指定
param1 <- "upper" #upper-quartile正規化法("upper")を指定
#必要なパッケージなどをロード
library(EDASeq) #パッケージの読み込み
#発現データの読み込みとSeqExpressionSetオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を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の中身をout_fで指定したファイル名で保存
------ ここまで ------
Bullard et al., BMC Bioinformatics, 2010
EDASeq:Risso et al., BMC Bioinformatics, 2011
前処理 | 正規化(サンプル間) | 全般 | Quantile正規化(Bullard_2010)
カウントデータの「サンプル(列)間でカウント数の順位が同じならばカウント数も同じ」になるような操作を行う正規化です。。
EDASeqというパッケージを用いて正規化を行うやり方を示します。
以下ではquantile正規化法を指定する際に"full"としていますが、これはEDASeqの原著論文(Risso et al., 2011)中で(conditional quantile法と区別するために)full quantileという表現を使っていることに由来します。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
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_Qu.txt" #出力ファイル名を指定
param_A <- 3 #A群(G1群)のサンプル数を指定
param_B <- 3 #B群(G2群)のサンプル数を指定
param1 <- "full" #Quantile正規化法("full")を指定
#必要なパッケージなどをロード
library(EDASeq) #パッケージの読み込み
#発現データの読み込みとSeqExpressionSetオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を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正規化の実行
hoge <- betweenLaneNormalization(es, which=param1) #正規化を実行した結果を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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータで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_Qu.txt" #出力ファイル名を指定
param_A <- 2 #A群(mut群)のサンプル数を指定
param_B <- 2 #B群(wt群)のサンプル数を指定
param1 <- "full" #Quantile正規化法("full")を指定
#必要なパッケージなどをロード
library(EDASeq) #パッケージの読み込み
#発現データの読み込みとSeqExpressionSetオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を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正規化の実行
hoge <- betweenLaneNormalization(es, which=param1) #正規化を実行した結果を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の中身をout_fで指定したファイル名で保存
------ ここまで ------
Bullard et al., BMC Bioinformatics, 2010
EDASeq:Risso et al., BMC Bioinformatics, 2011
前処理 | 正規化(サンプル間) | 全般 | RPM正規化(Mortazavi_2008)
生のマップされたリード数(raw counts)のデータから「Reads per million mapped reads (RPM)」のデータに変換するやり方を示します。
CPM (Counts per million)と同じものです。
おそらく参考文献1のヒトが最初だと思いますがもし間違っていたらご指摘よろしくお願いします。
ここではサンプルデータ2のSupplementaryTable2_changed.txtの
「A群 5サンプル vs. B群 5サンプル」のraw counts(特定の遺伝子領域にいくつリードがマップされたかをただカウントした数値データ)の二群間比較データを入力としてRPM変換後のファイルを出力するやり方を示します。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1.昔ながら?!のやり方の場合:
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "SupplementaryTable2_changed_RPM.txt" #出力ファイル名を指定
param1 <- 1000000 #補正後の総リード数を指定(RPMにしたい場合はここの数値はそのまま)
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
#RPM正規化
norm_f_RPM <- param1/colSums(data) #各列に対して掛ける正規化係数を計算してnorm_f_RPMに格納
RPM <- sweep(data, 2, norm_f_RPM, "*") #norm_f_RPMを各列に掛けた結果をRPMに格納
#正規化後のデータをファイルに出力
data <- RPM #RPMをdataに格納
tmp <- cbind(rownames(data), data) #ファイルに出力したい情報を連結してtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身をout_fで指定したファイル名で保存。
#おまけとして、RPM正規化後のデータでM-A plotを描画
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
data <- RPM #RPMをdataに格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
------ ここまで ------
2.edgeRパッケージ中のcpm関数を用いるやり方の場合:
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "SupplementaryTable2_changed_RPM.txt" #出力ファイル名を指定
#必要なパッケージなどをロード
library(edgeR) #パッケージの読み込み
#発現データの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
#CPM正規化の実行
RPM <- cpm(data) #CPM正規化を実行した結果をRPMに格納
#正規化後のデータをファイルに出力
data <- RPM #RPMをdataに格納
tmp <- cbind(rownames(data), data) #ファイルに出力したい情報を連結してtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身をout_fで指定したファイル名で保存。
#おまけとして、RPM正規化後のデータでM-A plotを描画
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
data <- RPM #RPMをdataに格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
------ ここまで ------
参考文献1(Mortazavi et al., Nat Methods, 2008)
前処理 | 正規化(混合) | RPKM正規化(Mortazavi_2008) | raw count matrixから
生のマップされたリード数(raw counts)のデータから「Reads per kilobase of exon per million mapped reads (RPKM)」のデータに変換するやり方を示します。
おそらく参考文献1のヒトが最初だと思いますがもし間違っていたらご指摘よろしくお願いします。
ここではサンプルデータ2のSupplementaryTable2_changed.txtの
「A群 5サンプル vs. B群 5サンプル」のraw counts(特定の遺伝子領域にいくつリードがマップされたかをただカウントした数値データ)の二群間比較データを入力としてRPKM変換後のファイルを出力するやり方を示します。
RPKM補正を行うためには各遺伝子(行)の配列長情報が必要となります。ここで用いる入力データファイルはver.48のEnsembl Gene IDのものであり、
各IDに対応する配列長情報は前処理 | Ensembl Geneの長さを計算するを行って得られたens_gene_46_length.txt中に含まれるので、
このファイルの読み込みのところから行います。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
in_f1 <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_f1に格納
in_f2 <- "ens_gene_46_length.txt" #アノテーション情報ファイルを指定してin_f2に格納
out_f <- "SupplementaryTable2_changed_RPKM.txt" #出力ファイル名を指定
param1 <- 1000000 #補正後の総リード数(per million mapped readsにするところ)を指定(RPKMにしたい場合はここの数値はそのまま)
param2 <- 1000 #補正後の配列長(per kilobase of exonにするところ)を指定(RPKMにしたい場合はここの数値はそのまま)
#まずはEnsembl Gene IDをアルファベット順に並び替えてRPM正規化
library(DEGseq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- data[order(rownames(data)),] #Ensembl Gene IDのアルファベット順に行列dataの行を並び替えている
norm_f_RPM <- param1/colSums(data) #各列に対して掛ける正規化係数を計算してnorm_f_RPMに格納
RPM <- sweep(data, 2, norm_f_RPM, "*") #norm_f_RPMを各列に掛けた結果をRPMに格納
#Ensembl Gene IDをアルファベット順に並び替えてgene_length情報を取得
tmp <- read.table(in_f2, header=TRUE, sep="\t", quote="") #アノテーション情報ファイルの読み込み
gene_length <- tmp[,2] #配列長をgene_lengthに格納
names(gene_length) <- tmp[,1] #gene_length中の値とEnsembl Gene IDを対応づけている
gene_length <- gene_length[order(names(gene_length))] #Ensembl Gene IDのアルファベット順にgene_length中の要素を並び替えている
#RPKM正規化をするために、gene_length情報があるデータのみ抽出し、そのサブセットのみでRPKM正規化
common <- intersect(names(gene_length), rownames(RPM)) #二つのベクトル(names(gene_length)とrownames(RPM))の積集合(intersection)をcommonに格納
obj_gene_length <- is.element(names(gene_length), common) #commonで指定したEnsembl Gene IDsのnames(gene_length)中における位置情報をobj_gene_lengthに格納
obj_RPM <- is.element(rownames(RPM), common) #commonで指定したEnsembl Gene IDsのrownames(RPM)中における位置情報をobj_RPMに格納
gene_length_sub <- gene_length[obj_gene_length] #gene_lengthベクトルの中から、obj_gene_lengthがTRUEとなっているもののみ抽出してgene_length_subに格納
RPM_sub <- RPM[obj_RPM,] #行列RPMからobj_RPMがTRUEとなっている行のみ抽出してRPM_subに格納
norm_factor2 <- param2/gene_length_sub #各行に対して掛ける正規化係数を計算してnorm_factor2に格納
RPKM <- sweep(RPM_sub, 1, norm_factor2, "*") #norm_factor2を行列RPM_subの各行に掛けた結果をRPKMに格納
tmp <- cbind(rownames(RPM_sub), gene_length_sub, RPKM) #ファイルに出力したい情報を連結してtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
参考文献1(Mortazavi et al., Nat Methods, 2008)
前処理 | 正規化(混合) | RPKM正規化(Mortazavi_2008) | ゲノムマップ後のBED形式ファイルから
ゲノムへのマッピング結果ファイル(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後のデータということになります。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
in_f1 <- "SRR002323.bowtiebed" #BED formatファイルを指定してin_f1に格納
in_f2 <- "refFlat.txt" #refFlat formatファイルを指定してin_f2に格納
out_f <- "SRR002323.bowtieexp" #出力ファイル名を指定してout_fに格納
library(DEGseq) #パッケージの読み込み
out <- getGeneExp(in_f1, refFlat=in_f2, output=out_f) #発現レベルを計算(一応結果をoutに格納しているが、出力ファイルの内容と同じです)
#以下は(こんなこともできますという)おまけ
out[,3] #3列目のRPKMの情報のみ抽出したいとき
------ ここまで ------
BioconductorのDEGseqのwebページ
解析 | 一般 | アラインメント(ペアワイズ;基本編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" #出力ファイル名を指定
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の中身をout_fで指定したファイル名で保存。
------ ここまで ------
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" #出力ファイル名を指定
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の中身をout_fで指定したファイル名で保存。
------ ここまで ------
BioconductorのBiostringsのwebページ
解析 | 一般 | アラインメント(ペアワイズ;基本編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)を表示
------ ここまで ------
BioconductorのBiostringsのwebページ
Biostringsパッケージ中のPairwise sequence alignment部分のPDFマニュアル
解析 | 一般 | アラインメント(ペアワイズ;応用編)
グローバルアラインメント(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" #出力ファイル名を指定
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の中身をout_fで指定したファイル名で保存。
------ ここまで ------
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" #出力ファイル名を指定
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の中身をout_fで指定したファイル名で保存。
------ ここまで ------
BioconductorのBiostringsのwebページ
解析 | 一般 | パターンマッチング
読み込んだリファレンス配列(reference sequence or subject sequence)から(短い)配列パターンを探す場合に利用します。
ここでは、以下の6つの例題を行います:
1. Dihydrofolate reductase (DHFR)という塩基配列(NM_000791)のFASTA形式ファイル(DHFR.fasta)をリファレンスとして、Zinc Finger Nuclease (ZFN)認識配列(AATGCTCAGGTA)領域の探索の場合:
2. 1. と同じDHFR.fasta)を入力として、"CCTACTATGT"というキーワード検索を行う場合:
3. 2. と同じでDHFR.fasta)を入力として、"CCTACTATGT"というキーワード検索を行った結果をファイルに保存する場合:
4. multi-fastaファイル:hoge4.faを入力として、"AGG"というキーワード検索を行う場合:
5. multi-fastaファイル:hoge4.faを入力(リファレンス配列)として、10リードからなるdata_seqlogo1.txtでマッピングを行う場合:
6. multi-fastaファイル:hoge4.faをリファレンス配列(マップされる側)として、4リードからなるdata_reads.txtでマッピングを行う場合:
7. multi-fastaファイル:hoge4.faをリファレンス配列(マップされる側)として、4リードからなるdata_reads.txtでマッピングを行う場合(記述の仕方が若干異なる):
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. DHFR.fastaを入力として、"AATGCTCAGGTA"でキーワード探索を行う場合(No hitです...):
------ ここから ------
in_f <- "DHFR.fasta" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
param <- "AATGCTCAGGTA" #調べたい配列パターンを指定してparamに格納
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#入力ファイルの読み込み
seq <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルの読み込み
#本番
out <- vmatchPattern(pattern=param, subject=seq) #paramで指定した配列と100%マッチの領域を探索して結果をoutに格納
out[[1]] #outの中身を表示(入力ファイル中には一致領域がないことを示している)
------ ここまで ------
2. DHFR.fastaを入力として、"CCTACTATGT"でキーワード探索を行う場合(存在することが分かっている断片配列):
------ ここから ------
in_f <- "DHFR.fasta" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
param <- "CCTACTATGT" #調べたい配列パターンを指定してparamに格納
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#入力ファイルの読み込み
seq <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルの読み込み
#本番
out <- vmatchPattern(pattern=param, subject=seq) #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" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "hoge.txt" #出力ファイル名を指定してout_fに格納
param <- "CCTACTATGT" #調べたい配列パターンを指定してparamに格納
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#入力ファイルの読み込み
seq <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルの読み込み
#本番
out <- vmatchPattern(pattern=param, subject=seq) #paramで指定した配列と100%マッチの領域を探索して結果をoutに格納
tmp <- cbind(start(unlist(out)), end(unlist(out))) #一致領域の(start, end)の位置情報をtmpに格納
colnames(tmp) <- c("start", "end") #行列tmpの列名を追加
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
4. multi-fastaファイルhoge4.faを入力として、"AGG"でキーワード探索を行う場合:
------ ここから ------
in_f <- "hoge4.fa" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "hoge2.txt" #出力ファイル名を指定してout_fに格納
param <- "AGG" #調べたい配列パターンを指定してparamに格納
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#入力ファイルの読み込み
seq <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルの読み込み
#本番
out <- vmatchPattern(pattern=param, subject=seq) #paramで指定した配列と100%マッチの領域を探索して結果をoutに格納
hoge <- cbind(start(unlist(out)), end(unlist(out))) #一致領域の(start, end)の位置情報をhogeに格納
colnames(hoge) <- c("start", "end") #行列hogeに列名を付加
rownames(hoge) <- names(unlist(out)) #行列hogeに行名を付加
tmp <- cbind(rownames(hoge), hoge) #ファイルに出力したい情報を連結してtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
5. multi-fastaファイルhoge4.faをリファレンス配列(マップされる側)として、10リードからなるdata_seqlogo1.txtでマッピングを行う場合:
------ ここから ------
in_f1 <- "hoge4.fa" #読み込みたいFASTA形式ファイルを指定してin_f1に格納
in_f2 <- "data_seqlogo1.txt" #読み込みたいFASTA形式ファイルを指定してin_f2に格納
out_f <- "hoge3.txt" #出力ファイル名を指定してout_fに格納
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#入力ファイルの読み込み
seq <- 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)){ #リード数分だけループを回す
tmp <- vmatchPattern(pattern=as.character(reads[i]), subject=seq)#オブジェクトreads中の各塩基配列と100%マッチの領域を探索して結果をtmpに格納
hoge1 <- cbind(start(unlist(tmp)), end(unlist(tmp))) #一致領域の(start, end)の位置情報をhoge1に格納
hoge2 <- names(unlist(tmp)) #ヒットしたリファレンス配列中の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の下に追加している(ループが回るたびにどんどん行数が増えていっているイメージ)
}
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#resultの中身をout_fで指定したファイル名で保存。
------ ここまで ------
6. multi-fastaファイルhoge4.faをリファレンス配列(マップされる側)として、4リードからなるdata_reads.txtでマッピングを行う場合:
------ ここから ------
in_f1 <- "hoge4.fa" #読み込みたいFASTA形式ファイルを指定してin_f1に格納
in_f2 <- "data_reads.txt" #読み込みたいFASTA形式ファイルを指定してin_f2に格納
out_f <- "hoge4.txt" #出力ファイル名を指定してout_fに格納
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#入力ファイルの読み込み
seq <- 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)){ #リード数分だけループを回す
tmp <- vmatchPattern(pattern=as.character(reads[i]), subject=seq)#オブジェクトreads中の各塩基配列と100%マッチの領域を探索して結果をtmpに格納
hoge1 <- cbind(start(unlist(tmp)), end(unlist(tmp))) #一致領域の(start, end)の位置情報をhoge1に格納
hoge2 <- names(unlist(tmp)) #ヒットしたリファレンス配列中の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の下に追加している(ループが回るたびにどんどん行数が増えていっているイメージ)
}
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#resultの中身をout_fで指定したファイル名で保存。
------ ここまで ------
7. multi-fastaファイルhoge4.faをリファレンス配列(マップされる側)として、4リードからなるdata_reads.txtでマッピングを行う場合(hoge1オブジェクトの作成のところの記述の仕方が若干異なる):
------ ここから ------
in_f1 <- "hoge4.fa" #読み込みたいFASTA形式ファイルを指定してin_f1に格納
in_f2 <- "data_reads.txt" #読み込みたいFASTA形式ファイルを指定してin_f2に格納
out_f <- "hoge5.txt" #出力ファイル名を指定してout_fに格納
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#入力ファイルの読み込み
seq <- 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(seq)){ #リファレンス配列数分だけループを回す
tmp <- matchPDict(PDict(reads), seq[[i]]) #リファレンス配列中のi番目の配列に対してオブジェクトreads中の全配列をmatchPDict関数を用いてマッピングした結果をtmpに格納
hoge1 <- cbind(start(unlist(tmp)), end(unlist(tmp))) #一致領域の(start, end)の位置情報をhoge1に格納
hoge2 <- names(unlist(tmp)) #ヒットしたリードのIDをhoge2に格納
hoge3 <- rep(names(seq[i]), length(hoge2)) #hoge2の要素数分だけ、マップされる側のリファレンス配列(in_f1で指定するものに相当)のIDをhoge3に格納
out <- rbind(out, cbind(hoge3, hoge2, hoge1)) #cbind(hoge3, hoge2, hoge1)で表される欲しい情報をどんどんオブジェクトoutの下に追加している(ループが回るたびにどんどん行数が増えていっているイメージ)
#as.integer(coverage(tmp, 1, width(seq[i])))
}
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#resultの中身をout_fで指定したファイル名で保存。
------ ここまで ------
BioconductorのBiostringsのwebページ
参考文献1(Santiago et al., PNAS, 2008)
解析 | 一般 | GC含量 (GC contents)
ここでは、multi-fasta形式ファイルを読み込んでコンティグごとのGC含量 (GC contents)を出力するやり方を示します。
ここでは以下の二つを例題として行います:
1. 「イントロダクション | 一般 | ランダムな塩基配列を作成」の4.を実行して得られたmulti-fastaファイル(hoge4.fa)
2. 「ファイルの読み込み | マップ前 | FASTA形式」で読み込んだ250 readsからなるtest1.fastaファイル
「description」「C,Gの総数」「A,C,G,Tの総数」「配列長」「%GC含量」をファイルに出力するやり方を例示します。
尚、ここでは%GC含量の計算を「CGの総数/ACGTの総数」で計算していますので、
もしGC含量を計算したい配列中にNなどが含まれる場合でNなどを含めた「配列長」を分母にしたい場合にはGC含量を計算をする数式中の「CG/ACGT*100」を「CG/width(reads)*100」に変更してください。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. hoge4.faファイルの場合:
------ ここから ------
in_f <- "hoge4.fa" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "hoge1.txt" #出力ファイル名を指定
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#入力ファイルの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルの読み込み
#GC含量(GC content)計算のところ
count <- alphabetFrequency(reads) #A,C,G,T,..の数を各配列ごとにカウントした結果をcountに格納
CG <- rowSums(count[,2:3]) #C,Gの総数を計算してCGに格納
ACGT <- rowSums(count[,1:4]) #A,C,G,Tの総数を計算してACGTに格納
out <- CG/ACGT*100 #%GC含量を計算してoutに格納
#出力用に結果をまとめている
tmp <- cbind(names(reads), CG, ACGT, width(reads), out) #ファイルに出力したい情報を連結して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の中身をout_fで指定したファイル名で保存。
------ ここまで ------
2. test1.fastaファイルの場合:
------ ここから ------
in_f <- "test1.fasta" #読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "hoge2.txt" #出力ファイル名を指定
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
#入力ファイルの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルの読み込み
#GC含量(GC content)計算のところ
count <- alphabetFrequency(reads) #A,C,G,T,..の数を各配列ごとにカウントした結果をcountに格納
CG <- rowSums(count[,2:3]) #C,Gの総数を計算してCGに格納
ACGT <- rowSums(count[,1:4]) #A,C,G,Tの総数を計算してACGTに格納
out <- CG/ACGT*100 #%GC含量を計算してoutに格納
#出力用に結果をまとめている
tmp <- cbind(names(reads), CG, ACGT, width(reads), out) #ファイルに出力したい情報を連結して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の中身をout_fで指定したファイル名で保存。
------ ここまで ------
BioconductorのBiostringsのwebページ
解析 | 一般 | Sequence logos (Schneider_1990)
参考文献1の方法sequence logos (しーくえんすろご)をやってくれます。
これを実行するためには、Multiple Sequence Alignment (MSA) が必要です...が単純に(NGSデータの)multi-fastaファイルを読み込んでポジションごとの出現頻度を見る、という目的のために使われたりします(たぶん)。
ここでは、以下の三つの例題を行います:
1. ファイルの読み込み(FASTA形式)で読み込んだ250 readsからなるtest1.fastaファイルを入力とする場合
2. 10 readsからなるdata_seqlogo1.txtの場合
3. 10 readsからなるdata_seqlogo1.txtで得られた図をファイルに保存したい場合
4. Arabidopsisの上流1000bpの配列セット(TAIR10_upstream_1000_20101104 <-- クリックなるべくしないで!!を"TAIR10_upstream_1000_20101104.fasta"というファイル名でダウンロードした配列
5. data_seqlogo1.txtの塩基組成を何らかの方法で既に計算した塩基組成ファイル(data_seqlogo2.txt)からの場合
注意点としては、3.の塩基組成ファイルの場合は、全部で4行からなり「A, C, G, T」の順番になっていなければいけません。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. 入力ファイルがmulti-fasta形式のファイル(test1.fasta)の場合:
------ ここから ------
in_f <- "test1.fasta" #読み込みたいファイル名を指定
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
library(seqLogo) #パッケージの読み込み
#入力ファイルの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルの読み込み
#本番
hoge <- consensusMatrix(reads, 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" #読み込みたいファイル名を指定
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
library(seqLogo) #パッケージの読み込み
#入力ファイルの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルの読み込み
#本番
hoge <- consensusMatrix(reads, 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)で得られた図をファイルに保存したい場合:
------ ここから ------
in_f <- "data_seqlogo1.txt" #読み込みたいファイル名を指定
out_f <- "test3.png" #出力ファイル名を指定
param <- c(600, 400) #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
library(seqLogo) #パッケージの読み込み
#入力ファイルの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルの読み込み
#本番
hoge <- consensusMatrix(reads, 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, width=param[1], height=param[2]) #出力ファイルの各種パラメータを指定
seqLogo(out) #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
dev.off() #おまじない
------ ここまで ------
4. 入力ファイルがmulti-fasta形式のファイル(TAIR10_upstream_1000_20101104.fasta)で、1000bpと長いため、930-1000bpの範囲のみについて解析し得られた図をファイルに保存したい場合:
------ ここから ------
in_f <- "TAIR10_upstream_1000_20101104.fasta" #読み込みたいファイル名を指定
out_f <- "test4.png" #出力ファイル名を指定
param1 <- c(930, 1000) #抽出したい範囲の始点と終点を指定
param2 <- c(1300, 400) #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
library(seqLogo) #パッケージの読み込み
#入力ファイルの読み込み
reads_org <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルの読み込み
reads_org <- reads_org[width(reads_org) == 1000] #配列長が1000bpでないもの(がたまに含まれるので)を除去している
reads <- subseq(reads_org, param1[1], param1[2]) #param1で指定した始点と終点の範囲の配列を抽出してreadsに格納
#本番
hoge <- consensusMatrix(reads, 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, width=param2[1], height=param2[2]) #出力ファイルの各種パラメータを指定
seqLogo(out) #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
dev.off() #おまじない
------ ここまで ------
5. 入力ファイルが塩基組成のファイル(data_seqlogo2.txt)の場合:
------ ここから ------
in_f <- "data_seqlogo2.txt" #読み込みたいファイル名を指定
#必要なパッケージをロード
library(Biostrings) #パッケージの読み込み
library(seqLogo) #パッケージの読み込み
#入力ファイルの読み込み
hoge <- read.table(in_f) #in_fで指定したファイルの読み込み
#本番
out <- makePWM(hoge) #情報量(information content; ic)を計算している
seqLogo(out) #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
------ ここまで ------
BioconductorのseqLogoのwebページ
参考文献1(Schneider and Stephens, NAR, 1990)
解析 | 一般 | 上流配列解析 | Local Distribution of Short Sequences (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に格納
#必要なパッケージをロード
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 #条件を満たすかどうかをチェック:出現頻度の最大値がthresholdより大きいものをTRUE
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の中身をout_fで指定したファイル名で保存。
#既知のコアプロモーター領域の分布をチェック
plot(out["TATAA",]) #TATA-boxのプロット
plot(out["GCCCA",]) #PPDB(参考文献4)中で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に格納
#必要なパッケージをロード
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 #条件を満たすかどうかをチェック:出現頻度の最大値がthresholdより大きいものをTRUE
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の中身をout_fで指定したファイル名で保存。
#pngファイルを一気に生成
for(i in 1:length(reads)){
out_f <- paste("result_", rownames(out)[i], ".png", sep="") #ファイル名を作成している
png(out_f, width=1000, height=500) #横幅1000ピクセル、縦幅500ピクセルの描画領域を生成
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に格納
#必要なパッケージをロード
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 #条件を満たすかどうかをチェック:出現頻度の最大値がthresholdより大きいものをTRUE
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の中身をout_fで指定したファイル名で保存。
#pngファイルを一気に生成
for(i in 1:length(reads)){
out_f <- paste("result_", rownames(out)[i], ".png", sep="") #ファイル名を作成している
png(out_f, width=1000, height=500) #横幅1000ピクセル、縦幅500ピクセルの描画領域を生成
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()
}
------ ここまで ------
参考文献1(LDSS; Yamamoto et al., BMC Genomics, 2007)
参考文献2(RAP-DB; Rice Annotation Project, Nucleic Acids Res., 2008)
参考文献3(TAIR; Lamesch et al., Nucleic Acids Res., 2012)
参考文献4(PPDB; Yamamoto and Obokata, Nucleic Acids Res., 2008)
参考文献5(PLACE; Higo et al., Nucleic Acids Res., 1999)
参考文献6(RAR; Yamamoto et al., BMC Plant Biol., 2011)
解析 | 一般 | 上流配列解析 | Relative Appearance Ratio (RAR)解析 (Yamamoto_2011)
手元に(Rで)マイクロアレイデータ解析のサンプルマイクロアレイデータ21の「発現変動遺伝子(DEG)の転写開始点のFASTA形式の上流配列セット(ファイル名:"seq_BAT_DEG.fa")」と「それ以外(nonDEG)の上流配列セット(ファイル名:"seq_BAT_nonDEG.fa")」
の二つのファイルがあったときに、任意のk-mer(4^k通り;k=6のときは4096通り)に対して、どのk-merが発現変動と関連しているかをFisher's Exact Testを用いてp値を計算する手順を示します。
尚、ここで用いている二つのファイルはいずれも「ACGTのみからなり、配列長は1000bp」です。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. pentamer(5-mer; 4^5=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のどの行がどの連続塩基由来のものかを割り当てている(行名を与えている)
FDR <- p.adjust(out[,ncol(out)], method="BH") #Benjamini and Hochberg (1995)の方法でFDRを計算した結果をFDRに格納
#ファイルに出力
tmp <- cbind(rownames(out), out, FDR) #ファイルに出力したい情報を連結してtmpに格納
colnames(tmp) <- c("k-mer", "Occurence in nonDEG", "# of nonDEG sequences", "Occurence in DEG", "# of DEG sequences", "p-value", "FDR")#列名を与えている
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
参考文献1(RAR; Yamamoto et al., BMC Plant Biol., 2011)
解析 | NGS(RNA-seq) | その他 | Technical replicatesのデータがポアソン分布に従うことを確認
MarioniらはTechnical replicatesのデータがポアソン分布(Poisson distribution)に従うことを報告しています(参考文献1)。
つまり「各遺伝子のtechnical replicatesデータの平均と分散が全体として同じ」だと言っているわけです。
ここでは、その論文のデータを用いて、kidneyサンプルの5 technical replicatesのデータを抽出して平均と分散のプロットを眺めます。
論文のデータは、サンプルデータ2のSupplementaryTable2_changed.txtの「kidney 5サンプル vs. liver 5サンプル」のデータに相当しますので、ここではデータ部分の最初の5列を抽出して解析を行います。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. 基本形
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
RPM <- sweep(data, 2, 1000000/colSums(data), "*") #サンプル(列)ごとの総リード数をそろえるべくRPMデータにしておく
RPM_k <- RPM[,1:5] #最初の5列分のデータがkidneyのデータなのでそれだけを抽出した結果をRPM_kに格納
RPM_k <- RPM_k[rowSums(RPM_k) > 0,] #全部が0だと分散を計算できないので、行の和が0より大きいもののみ抽出している
MEAN <- apply(RPM_k, 1, mean) #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(RPM_k, 1, var) #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy") #両対数(底は10)プロット
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
#以下では回帰分析を行うことを通じて、統計的な検証を行っている
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="red") #回帰直線を追加(この結果から傾きがおおむね1であることがわかり、確かにポアソン分布に従っていることがわかる)
out #outの簡単な中身を表示(切片(Intercept)が-0.3470, 傾き(MEAN)が0.9927であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out) #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.897と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
#一応y=xの直線を青で引いておく(y=a+bxのa=0, b=1)
abline(a=0, b=1, col="blue") #y=xの直線を追加
------ ここまで ------
2. ファイルに保存したい場合:
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge.png" #出力ファイル名を指定してout_fに格納
param1 <- 400 #横軸の大きさ(単位はピクセル)を指定
param2 <- 400 #縦軸の大きさ(単位はピクセル)を指定
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
RPM <- sweep(data, 2, 1000000/colSums(data), "*") #サンプル(列)ごとの総リード数をそろえるべくRPMデータにしておく
RPM_k <- RPM[,1:5] #最初の5列分のデータがkidneyのデータなのでそれだけを抽出した結果をRPM_kに格納
RPM_k <- RPM_k[rowSums(RPM_k) > 0,] #全部が0だと分散を計算できないので、行の和が0より大きいもののみ抽出している
MEAN <- apply(RPM_k, 1, mean) #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(RPM_k, 1, var) #各行の分散を計算した結果をVARIANCEに格納
#描画
png(out_f, width=param1, height=param2) #出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy") #両対数(底は10)プロット
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
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="red") #回帰直線を追加(この結果から傾きがおおむね1であることがわかり、確かにポアソン分布に従っていることがわかる)
out #outの簡単な中身を表示(切片(Intercept)が-0.3470, 傾き(MEAN)が0.9927であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out) #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.897と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
abline(a=0, b=1, col="blue") #y=xの直線を青色で追加
dev.off() #おまじない
------ ここまで ------
3. ファイルに保存したい場合でさらに軸の値の範囲も指定したい場合:
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge_RPM.png" #出力ファイル名を指定してout_fに格納
param1 <- 400 #横軸の大きさ(単位はピクセル)を指定
param2 <- 400 #縦軸の大きさ(単位はピクセル)を指定
param3 <- c(1e-03, 1e+05) #x軸の値の範囲を指定
param4 <- c(1e-03, 1e+05) #y軸の値の範囲を指定
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
RPM <- sweep(data, 2, 1000000/colSums(data), "*") #サンプル(列)ごとの総リード数をそろえるべくRPMデータにしておく
RPM_k <- RPM[,1:5] #最初の5列分のデータがkidneyのデータなのでそれだけを抽出した結果をRPM_kに格納
RPM_k <- RPM_k[rowSums(RPM_k) > 0,] #全部が0だと分散を計算できないので、行の和が0より大きいもののみ抽出している
MEAN <- apply(RPM_k, 1, mean) #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(RPM_k, 1, var) #各行の分散を計算した結果をVARIANCEに格納
#描画
png(out_f, width=param1, height=param2) #出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", xlim=param3, ylim=param4) #両対数(底は10)プロット
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
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="red") #回帰直線を追加(この結果から傾きがおおむね1であることがわかり、確かにポアソン分布に従っていることがわかる)
out #outの簡単な中身を表示(切片(Intercept)が-0.3470, 傾き(MEAN)が0.9927であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out) #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.897と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
abline(a=0, b=1, col="blue") #y=xの直線を青色で追加
dev.off() #おまじない
------ ここまで ------
参考文献1(Marioni et al., Genome Res., 2008)
解析 | NGS(RNA-seq) | その他 | ポアソン分布に従うシミュレーションデータを作成する
ポアソン分布(Poisson distribution)に従うデータとは、任意の値(λ)を与えたときに、分散がλとなるような分布になるようなデータのことです。
以下では、1.ポアソン分布の感覚をつかみながら、2.参考文献1の実際のデータを入力(empirical distribution of read countsに相当)として与えてシミュレーションデータの作成を行います。
論文のデータは、サンプルデータ2のSupplementaryTable2_changed.txtの「kidney 5サンプル vs. liver 5サンプル」のデータに相当しますが、このうちkidneyのデータを入力として与えることにします。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
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") #最終的に得られるoutは100行2列のデータ。この列名を指定している
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サンプル分の行列データとして作成):
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- 7 #サンプル数を指定
#データファイルの読み込みとλベクトルの作成(kidneyのfive technical replicatesのデータを用いる)
tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
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 #全部が0だと分散を計算できないので、行の和が0より大きいもののみTRUE、それ以外をFALSEとしたベクトルobjを作成している
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) #行列out2の右側に、「λ」、「(発生させた乱数の)平均」、「(発生させた乱数の)分散」を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
3. シミュレーションデータの作成本番(遺伝子数(行数)を任意に与える場合):
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- 7 #サンプル数を指定
param2 <- 5000 #遺伝子数を指定
#データファイルの読み込みとλベクトルの作成(kidneyのfive technical replicatesのデータを用いる)
tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tmp <- rowSums(tmp[,1:5]) #kidneyの5 replicatesのデータの各行の和を計算している
LAMBDA <- tmp[tmp > 0] #λが0だと意味がないのでそういうものを除いている
LAMBDA <- sample(LAMBDA, param2, replace=TRUE) #param2で指定した数だけサンプリングした結果を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 #行列outの各行の分散が0より大きいものをTRUE、それ以外をFALSEとしたベクトルobjを作成している
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) #LAMBDAの数値情報の右側に行列outを列方向で結合した結果をtmpに格納
colnames(tmp) <- c("LAMBDA", paste("replicate",1:param1,sep="")) #tmpの列名を与えている
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
4. シミュレーションデータの作成本番(A群3サンプル vs. B群3サンプルのデータで、全遺伝子の10%がA群で2倍高発現というデータにしたい場合):
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- 3 #A群のサンプル数を指定
param2 <- 3 #B群のサンプル数を指定
param3 <- 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="")#発現データファイルの読み込み
tmp <- rowSums(tmp[,1:5]) #kidneyの5 replicatesのデータの各行の和を計算している
LAMBDA <- tmp[tmp > 0] #λが0だと意味がないのでそういうものを除いている
LAMBDA <- sample(LAMBDA, param3, replace=TRUE) #param3で指定した数だけサンプリングした結果をLAMBDAに格納
LAMBDA <- LAMBDA*1000000/sum(LAMBDA) #リード数の総和を100万にしている
#発現変動遺伝子(DEG)に相当する位置情報の特定、およびA群用にその部分のみ(param5)倍高発現となるようなλに変更
DEG_degree <- rep(1, param3) #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree[1:(param3*param4)] <- param5 #param3個の遺伝子ベクトル中最初の(param3*param4)個の発現変動の度合いをparam5としている
DEG_posi <- DEG_degree == param5 #DEGの位置情報を取得している
LAMBDA_A <- LAMBDA*DEG_degree #A群用のλ(つまりLAMBDA*DEG_degree)をLAMBDA_Aに格納
LAMBDA_B <- LAMBDA #B群用のλ(つまりLAMBDA)をLAMBDA_Bに格納
#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(A群用)
outA <- NULL #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param1){ #param1回ループを回す(つまりA群のサンプル数分だけループを回している)
outA <- cbind(outA, rpois(n=length(LAMBDA_A), lambda=LAMBDA_A))#length(LAMBDA_A)個の乱数を発生させている(λベクトルはLAMBDA_Aで与えている)
} #ここまできたら、次のiの値でループの最初からやり直し
#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(B群用)
outB <- NULL #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param2){ #param2回ループを回す(つまりB群のサンプル数分だけループを回している)
outB <- cbind(outB, rpois(n=length(LAMBDA_B), lambda=LAMBDA_B))#length(LAMBDA_B)個の乱数を発生させている(λベクトルはLAMBDA_Bで与えている)
} #ここまできたら、次のiの値でループの最初からやり直し
#行列outをファイルに出力
out <- cbind(outA, outB) #A群のデータとB群のデータを列方向で結合した結果をoutに格納
colnames(out) <- c(paste("A",1:param1,sep=""),paste("B",1:param2,sep=""))#outの列名を与えている
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身をout_fで指定したファイル名で保存
#A vs. BのM-A plotを描画して確認
data <- out #シミュレーションデータをdataとして取り扱う
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- meanB - meanA #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(B)+log2(A))/2", ylab="M = log2(B)-log2(A)")#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. シミュレーションデータの作成本番(A群3サンプル vs. B群3サンプルのデータで、全遺伝子の10%がDEG。DEGのうちの80%がA群で高発現、残りの20%がB群で高発現というデータにしたい場合):
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- 3 #A群のサンプル数を指定
param2 <- 3 #B群のサンプル数を指定
param3 <- 10000 #遺伝子数を指定
param4 <- 0.1 #発現変動遺伝子の割合(PDEG)を指定
param5 <- 2 #発現変動の度合い(fold-change)を指定
param6 <- 0.8 #DEGのうちA群で高発現なものの割合(PA)を指定
#データファイルの読み込みとλベクトルの作成(kidneyのfive technical replicatesのデータを用いる)
tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tmp <- rowSums(tmp[,1:5]) #kidneyの5 replicatesのデータの各行の和を計算している
LAMBDA <- tmp[tmp > 0] #λが0だと意味がないのでそういうものを除いている
LAMBDA <- sample(LAMBDA, param3, replace=TRUE) #param3で指定した数だけサンプリングした結果をLAMBDAに格納
LAMBDA <- LAMBDA*1000000/sum(LAMBDA) #リード数の総和を100万にしている
#発現変動遺伝子(DEG)に相当する位置情報の特定、およびその部分のみ(param5)倍高発現となるようなλに変更
DEG_degree_A <- rep(1, param3) #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree_A[1:(param3*param4*param6)] <- param5 #param3個の遺伝子ベクトル中最初の(param3*param4*param6)個の発現変動の度合いをparam5としている
LAMBDA_A <- LAMBDA*DEG_degree_A #A群用のλ(つまりLAMBDA*DEG_degree_A)をLAMBDA_Aに格納
DEG_degree_B <- rep(1, param3) #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree_B[(param3*param4*param6+1):(param3*param4)] <- param5 #param3個の遺伝子ベクトル中「(param3*param4*param6+1):(param3*param4)」に相当する位置のの発現変動の度合いをparam5としている
LAMBDA_B <- LAMBDA*DEG_degree_B #B群用のλ(つまりLAMBDA*DEG_degree_B)をLAMBDA_Bに格納
DEG_posi <- (DEG_degree_A*DEG_degree_B) > 1 #DEGの位置情報を取得している
#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(A群用)
outA <- NULL #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param1){ #param1回ループを回す(つまりA群のサンプル数分だけループを回している)
outA <- cbind(outA, rpois(n=length(LAMBDA_A), lambda=LAMBDA_A))#length(LAMBDA_A)個の乱数を発生させている(λベクトルはLAMBDA_Aで与えている)
} #ここまできたら、次のiの値でループの最初からやり直し
#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(B群用)
outB <- NULL #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param2){ #param2回ループを回す(つまりB群のサンプル数分だけループを回している)
outB <- cbind(outB, rpois(n=length(LAMBDA_B), lambda=LAMBDA_B))#length(LAMBDA_B)個の乱数を発生させている(λベクトルはLAMBDA_Bで与えている)
} #ここまできたら、次のiの値でループの最初からやり直し
#行列outをファイルに出力
out <- cbind(outA, outB) #A群のデータとB群のデータを列方向で結合した結果をoutに格納
colnames(out) <- c(paste("A",1:param1,sep=""),paste("B",1:param2,sep=""))#outの列名を与えている
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身をout_fで指定したファイル名で保存
#A vs. BのM-A plotを描画して確認
data <- out #シミュレーションデータをdataとして取り扱う
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- meanB - meanA #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(B)+log2(A))/2", ylab="M = log2(B)-log2(A)")#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. シミュレーションデータの作成本番(参考文献2のFig. 2のデータとほとんど同じものを作りたい場合。違いはA群およびB群でuniqueに発現しているものを入れてないだけ。各群1サンプルしかないのでapply関数のところがなくなっていることにご注意ください):
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- 1 #A群のサンプル数を指定
param2 <- 1 #B群のサンプル数を指定
param3 <- 20000 #遺伝子数を指定
param4 <- 0.1 #発現変動遺伝子の割合(PDEG)を指定
param5 <- 2 #発現変動の度合い(fold-change)を指定
param6 <- 0.8 #DEGのうちA群で高発現なものの割合(PA)を指定
#データファイルの読み込みとλベクトルの作成(kidneyのfive technical replicatesのデータを用いる)
tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tmp <- rowSums(tmp[,1:5]) #kidneyの5 replicatesのデータの各行の和を計算している
LAMBDA <- tmp[tmp > 0] #λが0だと意味がないのでそういうものを除いている
LAMBDA <- sample(LAMBDA, param3, replace=TRUE) #param3で指定した数だけサンプリングした結果をLAMBDAに格納
LAMBDA <- LAMBDA*1000000/sum(LAMBDA) #リード数の総和を100万にしている
#発現変動遺伝子(DEG)に相当する位置情報の特定、およびその部分のみ(param5)倍高発現となるようなλに変更
DEG_degree_A <- rep(1, param3) #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree_A[1:(param3*param4*param6)] <- param5 #param3個の遺伝子ベクトル中最初の(param3*param4*param6)個の発現変動の度合いをparam5としている
LAMBDA_A <- LAMBDA*DEG_degree_A #A群用のλ(つまりLAMBDA*DEG_degree_A)をLAMBDA_Aに格納
DEG_degree_B <- rep(1, param3) #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree_B[(param3*param4*param6+1):(param3*param4)] <- param5 #param3個の遺伝子ベクトル中「(param3*param4*param6+1):(param3*param4)」に相当する位置のの発現変動の度合いをparam5としている
LAMBDA_B <- LAMBDA*DEG_degree_B #B群用のλ(つまりLAMBDA*DEG_degree_B)をLAMBDA_Bに格納
DEG_posi <- (DEG_degree_A*DEG_degree_B) > 1 #DEGの位置情報を取得している
#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(A群用)
outA <- NULL #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param1){ #param1回ループを回す(つまりA群のサンプル数分だけループを回している)
outA <- cbind(outA, rpois(n=length(LAMBDA_A), lambda=LAMBDA_A))#length(LAMBDA_A)個の乱数を発生させている(λベクトルはLAMBDA_Aで与えている)
} #ここまできたら、次のiの値でループの最初からやり直し
#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(B群用)
outB <- NULL #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param2){ #param2回ループを回す(つまりB群のサンプル数分だけループを回している)
outB <- cbind(outB, rpois(n=length(LAMBDA_B), lambda=LAMBDA_B))#length(LAMBDA_B)個の乱数を発生させている(λベクトルはLAMBDA_Bで与えている)
} #ここまできたら、次のiの値でループの最初からやり直し
#行列outをファイルに出力
out <- cbind(outA, outB) #A群のデータとB群のデータを列方向で結合した結果をoutに格納
colnames(out) <- c(paste("A",1:param1,sep=""),paste("B",1:param2,sep=""))#outの列名を与えている
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身をout_fで指定したファイル名で保存
#A vs. BのM-A plotを描画して確認
data <- out #シミュレーションデータをdataとして取り扱う
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- meanB - meanA #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(B)+log2(A))/2", ylab="M = log2(B)-log2(A)")#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を表示
------ ここまで ------
参考文献1(Marioni et al., Genome Res., 2008)
参考文献2(Robinson and Oshlack, Genome Biol., 2010)
参考文献2のsupplementary materialsのwebsite
解析 | NGS(RNA-seq) | その他 | Biological replicatesのデータが負の二項分布に従うことを確認
誰が最初か今のところ把握していませんがBiological replicatesのデータが負の二項分布(negative binomial distribution)に従うというのがこの業界のコンセンサスです。
つまり、ポアソン分布よりももっとばらつきが大きいということを言っています。
ここでは、参考文献1のNBPSeqの論文のデータを用いて、以下の三つつのプロットを眺めます:
1. Mockサンプルの3 biological replicatesのデータを抽出して平均と分散のプロット
2. treatedサンプルの3 biological replicatesのデータを抽出して平均と分散のプロット
3. 計6サンプルからなるファイル(data_arab.txt)を読み込んでtreatedサンプルの3 biological replicatesのデータを抽出して平均と分散のプロット
オリジナルのデータは、Arabidopsisの3 Mock samples vs. 3 treatment samplesです。もう少し具体的には、バクテリアを感染させて防御応答をみたデータで、詳細は参考文献2に書かれています。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. Mockサンプルの3 biological replicatesのデータの場合:
------ ここから ------
param_A <- 3 #A群のサンプル数を指定
param_B <- 3 #B群のサンプル数を指定
#必要なパッケージなどをロード
library(NBPSeq) #パッケージの読み込み
#(パッケージ中に存在する)発現データのロードとラベル情報の作成
data(arab) #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
dim(data) #行数と列数を表示
head(data) #最初の数行分を表示(最初の3列がMockサンプルであることが分かる)
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#RPM正規化とサブセットの抽出
RPM <- sweep(data, 2, 1000000/colSums(data), "*") #サンプル(列)ごとの総リード数をそろえるべくRPMデータにしておく
RPM_k <- RPM[,data.cl == 1] #A群(つまりMockサンプル)に相当するデータだけを抽出した結果をRPM_kに格納
RPM_k <- RPM_k[apply(RPM_k, 1, var) > 0,] #(後にlogスケールで描画するため)各行の分散が0より大きいもののみ抽出している(24,027行のデータになっているはず)
#Mean-Variance plotの作成
MEAN <- apply(RPM_k, 1, mean) #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(RPM_k, 1, var) #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy") #両対数(底は10)プロット
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
#以下では回帰分析を行うことを通じて、統計的な検証を行っている
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="red") #回帰直線を追加
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という従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
#一応y=xの直線を青で引いておく(y=a+bxのa=0, b=1)
abline(a=0, b=1, col="blue") #y=xの直線を追加(この結果から赤色の直線の傾きが1よりも明らかに大きく、ポアソン分布の「分散=平均」ではなく「分散 > 平均」となっていることがわかる)
#変動係数周辺
STDEV <- apply(RPM_k, 1, sd) #各行の標準偏差を計算した結果をSTDEVに格納
hoge <- as.data.frame(cbind(MEAN, STDEV)) #回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がSTDEVからなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(STDEV~MEAN, data=log10(hoge)) #独立変数(説明変数)をMEAN, 従属変数(目的変数)をSTDEVとしてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="red") #回帰直線を追加
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という従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
out$coefficients[2]
------ ここまで ------
2. treatedサンプルの3 biological replicatesのデータの場合1:
------ ここから ------
param_A <- 3 #A群のサンプル数を指定
param_B <- 3 #B群のサンプル数を指定
#必要なパッケージなどをロード
library(NBPSeq) #パッケージの読み込み
#(パッケージ中に存在する)発現データのロードとラベル情報の作成
data(arab) #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
dim(data) #行数と列数を表示
head(data) #最初の数行分を表示(最初の3列がMockサンプルであることが分かる)
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#RPM正規化とサブセットの抽出
RPM <- sweep(data, 2, 1000000/colSums(data), "*") #サンプル(列)ごとの総リード数をそろえるべくRPMデータにしておく
RPM_k <- RPM[,data.cl == 2] #B群(つまりhrccサンプル)に相当するデータだけを抽出した結果をRPM_kに格納
RPM_k <- RPM_k[apply(RPM_k, 1, var) > 0,] #(後にlogスケールで描画するため)各行の分散が0より大きいもののみ抽出している(24,027行のデータになっているはず)
#Mean-Variance plotの作成
MEAN <- apply(RPM_k, 1, mean) #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(RPM_k, 1, var) #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy") #両対数(底は10)プロット
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
#以下では回帰分析を行うことを通じて、統計的な検証を行っている
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="red") #回帰直線を追加
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という従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
#一応y=xの直線を青で引いておく(y=a+bxのa=0, b=1)
abline(a=0, b=1, col="blue") #y=xの直線を追加(この結果から赤色の直線の傾きが1よりも明らかに大きく、ポアソン分布の「分散=平均」ではなく「分散 > 平均」となっていることがわかる)
------ ここまで ------
3. treatedサンプルの3 biological replicatesのデータの場合2:
------ ここから ------
in_f <- "data_arab.txt" #読み込みたい発現データファイルを指定してin_fに格納
param_A <- 3 #A群のサンプル数を指定
param_B <- 3 #B群のサンプル数を指定
#必要なパッケージなどをロード
library(NBPSeq) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
dim(data) #行数と列数を表示
head(data) #最初の数行分を表示(最初の3列がMockサンプルであることが分かる)
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#RPM正規化とサブセットの抽出
RPM <- sweep(data, 2, 1000000/colSums(data), "*") #サンプル(列)ごとの総リード数をそろえるべくRPMデータにしておく
RPM_k <- RPM[,data.cl == 2] #B群(つまりhrccサンプル)に相当するデータだけを抽出した結果をRPM_kに格納
RPM_k <- RPM_k[apply(RPM_k, 1, var) > 0,] #(後にlogスケールで描画するため)各行の分散が0より大きいもののみ抽出している(24,027行のデータになっているはず)
#Mean-Variance plotの作成
MEAN <- apply(RPM_k, 1, mean) #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(RPM_k, 1, var) #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy") #両対数(底は10)プロット
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
#以下では回帰分析を行うことを通じて、統計的な検証を行っている
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="red") #回帰直線を追加
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という従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
#一応y=xの直線を青で引いておく(y=a+bxのa=0, b=1)
abline(a=0, b=1, col="blue") #y=xの直線を追加(この結果から赤色の直線の傾きが1よりも明らかに大きく、ポアソン分布の「分散=平均」ではなく「分散 > 平均」となっていることがわかる)
------ ここまで ------
4. 3.を基本として、軸の値の範囲を指定してMean-Variance plotをファイルに保存したい場合:
------ ここから ------
in_f <- "data_arab.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge.png" #出力ファイル名を指定してout_fに格納
param_A <- 3 #A群のサンプル数を指定
param_B <- 3 #B群のサンプル数を指定
param1 <- 500 #横軸の大きさ(単位はピクセル)を指定
param2 <- 500 #縦軸の大きさ(単位はピクセル)を指定
param3 <- c(1e-03, 1e+08) #x軸の値の範囲を指定
param4 <- c(1e-03, 1e+08) #y軸の値の範囲を指定
#必要なパッケージなどをロード
library(NBPSeq) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
dim(data) #行数と列数を表示
head(data) #最初の数行分を表示(最初の3列がMockサンプルであることが分かる)
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#RPM正規化とサブセットの抽出
RPM <- sweep(data, 2, 1000000/colSums(data), "*") #サンプル(列)ごとの総リード数をそろえるべくRPMデータにしておく
RPM_k <- RPM[,data.cl == 2] #B群(つまりhrccサンプル)に相当するデータだけを抽出した結果をRPM_kに格納
RPM_k <- RPM_k[apply(RPM_k, 1, var) > 0,] #(後にlogスケールで描画するため)各行の分散が0より大きいもののみ抽出している(24,027行のデータになっているはず)
#Mean-Variance plotの作成
MEAN <- apply(RPM_k, 1, mean) #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(RPM_k, 1, var) #各行の分散を計算した結果をVARIANCEに格納
png(out_f, width=param1, height=param2) #出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", xlim=param3, ylim=param4) #両対数(底は10)プロット
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
#以下では回帰分析を行うことを通じて、統計的な検証を行っている
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="red") #回帰直線を追加
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という従属変数が不要であるという帰無仮説を棄却するに値する、つまり従属変数が独立変数によって説明可能であることを意味する)
#一応y=xの直線を青で引いておく(y=a+bxのa=0, b=1)
abline(a=0, b=1, col="blue") #y=xの直線を追加(この結果から赤色の直線の傾きが1よりも明らかに大きく、ポアソン分布の「分散=平均」ではなく「分散 > 平均」となっていることがわかる)
dev.off() #おまじない
------ ここまで ------
参考文献1(Di et al., SAGMB, 2011)
参考文献2(Cumbie et al., PLoS One, in press; GENE-counterの論文)
解析 | NGS(RNA-seq) | その他 | 負の二項分布に従うシミュレーションデータを作成する(fixed dispersion)
誰が最初か今のところ把握していませんがBiological replicatesのデータが負の二項分布(negative binomial distribution)に従うというのがこの業界のコンセンサスです。
つまり、ポアソン分布よりももっとばらつき(dispersion)が大きいということを言っています。
ここでは、参考文献1のNBPSeqの論文のデータを用い、Mockサンプルの3 biological replicatesのデータを入力(empirical distribution of read countsに相当)としてシミュレーションデータを作成します。
オリジナルのデータは、Arabidopsisの3 Mock samples vs. 3 treatment samplesです。もう少し具体的には、バクテリアを感染させて防御応答をみたデータで、詳細は参考文献2に書かれています。
シミュレーションデータ作成時に気をつけないといけない点は、param3で指定するdispersion parameterの値をどうするのか?です。
この値は、Rのこの分布に従うデータを作成する際に用いるrnbinom関数中のsizeパラメータの値に相当します。muに相当するのが各遺伝子の平均のread countです。
分散(dispersion)は「mu + mu^2/size」ですので、sizeで与えるパラメータが大きければ大きいほど「分散≒平均」になりますので、ポアソン分布っぽいデータになり、
小さくすればそれだけ分散が平均に比べて大きいデータができる傾向になります。
一つのad hocなやり方は、Biological replicatesのデータが負の二項分布に従うことを確認のところで
「Mockサンプルの3 biological replicatesのデータの分散と平均のプロットの回帰直線の傾きの値(=1.349519)」に近くなるようなparam1の値を採用することです。
実際にparam1=1, 5, 10, 14, 20をやってみると、param1=14のときの傾きが最も実際のデータに近いことがわかりますが厳密さに神経質にならなくていいと思います。理由は分布や傾きはデータセットによって異なるからです。
以下ではparam1=10として、いくつかのシミュレーションデータの作成を行います。ちなみにこれがいわゆるfixed dispersionとかconstant dispersionとかいうやつです。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. 4サンプル分のシミュレーションデータを作成する場合:
------ ここから ------
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- 10 #dispersion parameter (shape parameter of the gamma mixing distribution)を指定
param2 <- 4 #サンプル数を指定
library(NBPSeq) #パッケージの読み込み
data(arab) #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
tmp <- rowSums(data[,1:3]) #A群のみのデータの各行の和を計算した結果をtmpに格納
RPM <- tmp*1000000/sum(tmp) #リード数の総和を100万にしている
mu <- RPM[RPM > 0] #リード数が0のものはシミュレーションデータを作成できないので除いている
#param1で指定したshapeパラメタを用いて(param2)サンプル分のシミュレーションデータを得る
out <- NULL #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param2){ #(param2)回ループを回す
out <- cbind(out, rnbinom(n=length(mu), mu=mu, size=param1)) #length(mu)個の乱数を発生させている(VARIANCEはmu + mu^2/size)
} #ここまできたら、次のiの値でループの最初からやり直し
#得られた行列outの分布を一応チェック
obj <- apply(out, 1, var) > 0 #行列outの各行の分散が0より大きいものをTRUE、それ以外をFALSEとしたベクトルobjを作成している
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の中から分散が計算できたもののみ、検証用情報(MEAN, VARIANCE)とともにファイルに出力
tmp <- cbind(out2, MEAN, VARIANCE) #行列out2の右側に、「(発生させた乱数の)平均」、「(発生させた乱数の)分散」を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
2. 4サンプル分のシミュレーションデータで、任意の遺伝子数(行数)をしたい場合:
------ ここから ------
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- 10 #dispersion parameter (shape parameter of the gamma mixing distribution)を指定
param2 <- 4 #サンプル数を指定
param3 <- 5000 #遺伝子数を指定
#データファイルの読み込みとempirical distribution of read countsに相当するmuを得る
library(NBPSeq) #パッケージの読み込み
data(arab) #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
tmp <- rowSums(data[,1:3]) #A群のみのデータの各行の和を計算した結果をtmpに格納
tmp <- tmp[tmp > 0] #リード数が0のものはシミュレーションデータを作成できないので除いている
hoge <- sample(tmp, param3, replace=TRUE) #param3で指定した数だけサンプリングした結果をhogeに格納
mu <- hoge*1000000/sum(hoge) #リード数の総和を100万にしている
#負の二項分布に従う乱数を生成してシミュレーションデータを得る
out <- NULL #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param2){ #(param2)回ループを回す
out <- cbind(out, rnbinom(n=length(mu), mu=mu, size=param1)) #length(mu)個の乱数を発生させている(VARIANCEはmu + mu^2/size)
} #ここまできたら、次のiの値でループの最初からやり直し
#得られた行列outの分布を一応チェック
obj <- apply(out, 1, var) > 0 #行列outの各行の分散が0より大きいものをTRUE、それ以外をFALSEとしたベクトルobjを作成している
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(mu, out) #muの数値情報の右側に行列outを列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
3. A群3サンプル vs. B群3サンプルのデータで、全遺伝子の15%がDEG。DEGのうちの20%がA群で4倍高発現、残りの80%がB群で4倍高発現というデータにしたい場合:
------ ここから ------
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- 10 #dispersion parameter (shape parameter of the gamma mixing distribution)を指定
param2 <- 3 #A群のサンプル数を指定
param3 <- 3 #B群のサンプル数を指定
param4 <- 20000 #全遺伝子数を指定
param5 <- 0.15 #発現変動遺伝子の割合(PDEG)を指定
param6 <- 4 #発現変動の度合い(fold-change)を指定
param7 <- 0.2 #DEGのうちA群で高発現なものの割合(PA)を指定
#データファイルの読み込みとempirical distribution of read countsに相当するmuを得る
library(NBPSeq) #パッケージの読み込み
data(arab) #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
tmp <- rowSums(data[,1:3]) #A群のみのデータの各行の和を計算した結果をtmpに格納
tmp <- tmp[tmp > 0] #リード数が0のものはシミュレーションデータを作成できないので除いている
hoge <- sample(tmp, param4, replace=TRUE) #param4で指定した数だけサンプリングした結果をhogeに格納
mu <- hoge*1000000/sum(hoge) #リード数の総和を100万にしている
#発現変動遺伝子(DEG)に相当する位置情報の特定、およびその部分のみ(param6)倍高発現となるようなmuに変更
DEG_degree_A <- rep(1, param4) #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree_A[1:(param4*param5*param7)] <- param6 #param4個の要素からなる遺伝子ベクトル中最初の(param4*param5*param7)個の発現変動の度合いをparam6としている
mu_A <- mu*DEG_degree_A #A群用のmu(つまりmu*DEG_degree_A)をmu_Aに格納
DEG_degree_B <- rep(1, param4) #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree_B[(param4*param5*param7+1):(param4*param5)] <- param6 #param4個の要素からなる遺伝子ベクトル中「(param4*param5*param7+1):(param4*param5)」に相当する位置の発現変動の度合いをparam6としている
mu_B <- mu*DEG_degree_B #B群用のmu(つまりmu*DEG_degree_B)をmu_Bに格納
DEG_posi <- (DEG_degree_A*DEG_degree_B) > 1 #DEGの位置情報を取得している
#負の二項分布に従う乱数を生成してシミュレーションデータを得る(A群用)
outA <- NULL #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param2){ #(param2)回ループを回す
outA <- cbind(outA, rnbinom(n=length(mu_A), mu=mu_A, size=param1)) #length(mu_A)個の乱数を発生させている(VARIANCEはmu_A + mu_A^2/size)
} #ここまできたら、次のiの値でループの最初からやり直し
#負の二項分布に従う乱数を生成してシミュレーションデータを得る(B群用)
outB <- NULL #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param2){ #(param2)回ループを回す
outB <- cbind(outB, rnbinom(n=length(mu_B), mu=mu_B, size=param1)) #length(mu_B)個の乱数を発生させている(VARIANCEはmu_B + mu_B^2/size)
} #ここまできたら、次のiの値でループの最初からやり直し
#行列outをファイルに出力
out <- cbind(outA, outB) #A群のデータとB群のデータを列方向で結合した結果をoutに格納
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身をout_fで指定したファイル名で保存
#A vs. BのM-A plotを描画して確認
data <- out #シミュレーションデータをdataとして取り扱う
data.cl <- c(rep(1, param2), rep(2, param3)) #A群を1、B群を2としたベクトルdata.clを作成
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- meanB - meanA #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(B)+log2(A))/2", ylab="M = log2(B)-log2(A)")#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を表示
------ ここまで ------
参考文献1(Di et al., SAGMB, 2011)
参考文献2(Cumbie et al., PLoS One, in press; GENE-counterの論文)
解析 | NGS(RNA-seq) | その他 | 負の二項分布に従うシミュレーションデータを作成する(random dispersion)
誰が最初か今のところ把握していませんがBiological replicatesのデータが負の二項分布(negative binomial distribution)に従うというのがこの業界のコンセンサスです。
つまり、ポアソン分布よりももっとばらつき(dispersion)が大きいということを言っています。
ここでは、参考文献1のNBPSeqの論文のデータを用い、Mockサンプルの3 biological replicatesのデータを入力(empirical distribution of read countsに相当)としてシミュレーションデータを作成します。
オリジナルのデータは、Arabidopsisの3 Mock samples vs. 3 treatment samplesです。もう少し具体的には、バクテリアを感染させて防御応答をみたデータで、詳細は参考文献2に書かれています。
一つ上のfixed dispersionのほかに、ここで示すrandom dispersionといってshape parameterとscale parameterの二つパラメータからなるガンマ分布からランダムにサンプルしたばらつきの値を採用する、というやり方もあります。
以下では、参考文献3のRandom dispersion simulationのところで実際に用いられたshape parameter = 0.85とscale paramter = 0.5からなるガンマ分布から、ランダムなばらつきをもつシミュレーションデータを生成するやり方を示します。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. 4サンプル分のシミュレーションデータを作成する場合:
------ ここから ------
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- c(0.85, 0.5) #shape parameterとscale parameterを指定
param2 <- 4 #サンプル数を指定
library(NBPSeq) #パッケージの読み込み
data(arab) #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
tmp <- rowSums(data[,1:3]) #A群のみのデータの各行の和を計算した結果をtmpに格納
RPM <- tmp*1000000/sum(tmp) #リード数の総和を100万にしている
mu <- RPM[RPM > 0] #リード数が0のものはシミュレーションデータを作成できないので除いている
#param1で指定したshapeパラメタを用いて(param2)サンプル分のシミュレーションデータを得る
out <- NULL #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param2){ #(param2)回ループを回す
dispersion_parameter <- rgamma(length(mu), shape=param1[1], scale=param1[2])#ガンマ分布からparam1で指定したパラメータを用いて以下のrnbinom関数中で用いるsizeのところに与えるrandom dispersion parameterベクトルを作成した結果をdispersion_parameterに格納
out <- cbind(out, rnbinom(n=length(mu), mu=mu, size=1/dispersion_parameter))#length(mu)個の乱数を発生させている(VARIANCEはmu + mu^2/size)
} #ここまできたら、次のiの値でループの最初からやり直し
#得られた行列outの分布を一応チェック
obj <- apply(out, 1, var) > 0 #行列outの各行の分散が0より大きいものをTRUE、それ以外をFALSEとしたベクトルobjを作成している
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の中から分散が計算できたもののみ、検証用情報(MEAN, VARIANCE)とともにファイルに出力
tmp <- cbind(out2, MEAN, VARIANCE) #行列out2の右側に、「(発生させた乱数の)平均」、「(発生させた乱数の)分散」を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
2. 4サンプル分のシミュレーションデータで、任意の遺伝子数(行数)をしたい場合:
------ ここから ------
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- c(0.85, 0.5) #shape parameterとscale parameterを指定
param2 <- 4 #サンプル数を指定
param3 <- 5000 #遺伝子数を指定
#データファイルの読み込みとempirical distribution of read countsに相当するmuを得る
library(NBPSeq) #パッケージの読み込み
data(arab) #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
tmp <- rowSums(data[,1:3]) #A群のみのデータの各行の和を計算した結果をtmpに格納
tmp <- tmp[tmp > 0] #リード数が0のものはシミュレーションデータを作成できないので除いている
hoge <- sample(tmp, param3, replace=TRUE) #param3で指定した数だけサンプリングした結果をhogeに格納
mu <- hoge*1000000/sum(hoge) #リード数の総和を100万にしている
#負の二項分布に従う乱数を生成してシミュレーションデータを得る
out <- NULL #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param2){ #(param2)回ループを回す
dispersion_parameter <- rgamma(length(mu), shape=param1[1], scale=param1[2])#ガンマ分布からparam1で指定したパラメータを用いて以下のrnbinom関数中で用いるsizeのところに与えるrandom dispersion parameterベクトルを作成した結果をdispersion_parameterに格納
out <- cbind(out, rnbinom(n=length(mu), mu=mu, size=1/dispersion_parameter))#length(mu)個の乱数を発生させている(VARIANCEはmu + mu^2/size)
} #ここまできたら、次のiの値でループの最初からやり直し
#得られた行列outの分布を一応チェック
obj <- apply(out, 1, var) > 0 #行列outの各行の分散が0より大きいものをTRUE、それ以外をFALSEとしたベクトルobjを作成している
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(mu, out) #muの数値情報の右側に行列outを列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
3. A群3サンプル vs. B群3サンプルのデータで、全遺伝子の15%がDEG。DEGのうちの20%がA群で4倍高発現、残りの80%がB群で4倍高発現というデータにしたい場合:
------ ここから ------
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- c(0.85, 0.5) #shape parameterとscale parameterを指定
param2 <- 3 #A群のサンプル数を指定
param3 <- 3 #B群のサンプル数を指定
param4 <- 20000 #全遺伝子数を指定
param5 <- 0.15 #発現変動遺伝子の割合(PDEG)を指定
param6 <- 4 #発現変動の度合い(fold-change)を指定
param7 <- 0.2 #DEGのうちA群で高発現なものの割合(PA)を指定
#データファイルの読み込みとempirical distribution of read countsに相当するmuを得る
library(NBPSeq) #パッケージの読み込み
data(arab) #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
tmp <- rowSums(data[,1:3]) #A群のみのデータの各行の和を計算した結果をtmpに格納
tmp <- tmp[tmp > 0] #リード数が0のものはシミュレーションデータを作成できないので除いている
hoge <- sample(tmp, param4, replace=TRUE) #param4で指定した数だけサンプリングした結果をhogeに格納
mu <- hoge*1000000/sum(hoge) #リード数の総和を100万にしている
#発現変動遺伝子(DEG)に相当する位置情報の特定、およびその部分のみ(param6)倍高発現となるようなmuに変更
DEG_degree_A <- rep(1, param4) #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree_A[1:(param4*param5*param7)] <- param6 #param4個の要素からなる遺伝子ベクトル中最初の(param4*param5*param7)個の発現変動の度合いをparam6としている
mu_A <- mu*DEG_degree_A #A群用のmu(つまりmu*DEG_degree_A)をmu_Aに格納
DEG_degree_B <- rep(1, param4) #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree_B[(param4*param5*param7+1):(param4*param5)] <- param6 #param4個の要素からなる遺伝子ベクトル中「(param4*param5*param7+1):(param4*param5)」に相当する位置の発現変動の度合いをparam6としている
mu_B <- mu*DEG_degree_B #B群用のmu(つまりmu*DEG_degree_B)をmu_Bに格納
DEG_posi <- (DEG_degree_A*DEG_degree_B) > 1 #DEGの位置情報を取得している
#負の二項分布に従う乱数を生成してシミュレーションデータを得る(A群用)
outA <- NULL #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param2){ #(param2)回ループを回す
dispersion_parameter <- rgamma(length(mu_A), shape=param1[1], scale=param1[2])#ガンマ分布からparam1で指定したパラメータを用いて以下のrnbinom関数中で用いるsizeのところに与えるrandom dispersion parameterベクトルを作成した結果をdispersion_parameterに格納
outA <- cbind(outA, rnbinom(n=length(mu_A), mu=mu_A, size=1/dispersion_parameter)) #length(mu_A)個の乱数を発生させている(VARIANCEはmu_A + mu_A^2/size)
} #ここまできたら、次のiの値でループの最初からやり直し
#負の二項分布に従う乱数を生成してシミュレーションデータを得る(B群用)
outB <- NULL #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param2){ #(param2)回ループを回す
dispersion_parameter <- rgamma(length(mu_B), shape=param1[1], scale=param1[2])#ガンマ分布からparam1で指定したパラメータを用いて以下のrnbinom関数中で用いるsizeのところに与えるrandom dispersion parameterベクトルを作成した結果をdispersion_parameterに格納
outB <- cbind(outB, rnbinom(n=length(mu_B), mu=mu_B, size=1/dispersion_parameter)) #length(mu_B)個の乱数を発生させている(VARIANCEはmu_B + mu_B^2/size)
} #ここまできたら、次のiの値でループの最初からやり直し
#行列outをファイルに出力
out <- cbind(outA, outB) #A群のデータとB群のデータを列方向で結合した結果をoutに格納
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身をout_fで指定したファイル名で保存
#A vs. BのM-A plotを描画して確認
data <- out #シミュレーションデータをdataとして取り扱う
data.cl <- c(rep(1, param2), rep(2, param3)) #A群を1、B群を2としたベクトルdata.clを作成
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- meanB - meanA #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(B)+log2(A))/2", ylab="M = log2(B)-log2(A)")#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を表示
------ ここまで ------
参考文献1(Di et al., SAGMB, 2011)
参考文献2(Cumbie et al., PLoS One, in press; GENE-counterの論文)
参考文献3(Hardcastle and Kelly, BMC Bioinformatics, 2010)
解析 | NGS(RNA-seq) | その他 | 負の二項分布に従うシミュレーションデータを作成する(tagwise dispersion)
誰が最初か今のところ把握していませんがBiological replicatesのデータが負の二項分布(negative binomial distribution)に従うというのがこの業界のコンセンサスです。
つまり、ポアソン分布よりももっとばらつき(dispersion)が大きいということを言っています。
ここでは、参考文献1のNBPSeqの論文のArabidopsisデータを入力(empirical distribution of read counts)としてシミュレーションデータを作成します。このシミュレーションの枠組みは門田TbT正規化法(参考文献3)で使われたものです。
オリジナルのデータは、Arabidopsisの3 Mock samples vs. 3 treatment samplesです。もう少し具体的には、バクテリアを感染させて防御応答をみたデータで、詳細は参考文献2に書かれています。
「fixed dispersion」や「random dispersion」はこの業界では一昔前のシミュレーション条件のようです。参考文献1や3はdispersionをmeanに応じて変えるべきという提言であり、そのための方法を記述しています。
以下では、Arabidopsisデータから得られた平均値(MEAN)と分散(VARIANCE)の値から計算されたdispersion parameter(φ=(VARIANCE - MEAN)/(MEAN*MEAN))とMEANの値を経験分布として用いてシミュレーションデータを生成するやり方を示します。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. 指定した遺伝子数(行数)とサンプル数(列数)のシミュレーションデータにしたい場合(基本形):
------ ここから ------
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- 20000 #遺伝子数を指定
param2 <- 4 #サンプル数を指定
#必要なパッケージをロード
library(NBPSeq) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data(arab) #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
data.cl <- c(rep(1, 3), rep(2, 3)) #A群を1、B群を2としたベクトルdata.clを作成
#RPM正規化して群ごとのMEANとφの経験分布情報を取得
RPM <- sweep(data, 2, 1000000/colSums(data), "*") #RPM正規化した結果をRPMに格納
RPM_A <- RPM[,data.cl == 1] #A群のデータのみ抽出してRPM_Aに格納
RPM_B <- RPM[,data.cl == 2] #B群のデータのみ抽出して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)) #read countsの遺伝子ごとの平均値を計算した結果をMEANに格納
VARIANCE <- c(apply(RPM_A, 1, var), apply(RPM_B, 1, var)) #read countsの遺伝子ごとの分散を計算した結果をVARIANCEに格納
DISPERSION <- (VARIANCE - MEAN)/(MEAN*MEAN) #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より大きいもののみ抽出
hoge <- sample(1:nrow(mean_disp_tmp), param1, replace=TRUE) #最終的にparam1で指定した行数分のデータにしたいので、mean_disp_tmp行列の行数から(復元抽出で)ランダムサンプリングするための数値ベクトル情報をhogeに格納
mean_disp <- mean_disp_tmp[hoge,] #mean_disp_tmp行列からhogeで指定した行を抽出した結果をmean_dispに格納
#負の二項分布に従う乱数を生成してシミュレーションデータを得る
out <- NULL #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param2){ #(param2)回ループを回す
out <- cbind(out, rnbinom(n=nrow(mean_disp), mu=mean_disp[,1], size=1/mean_disp[,2]))#nrow(mean_disp)個の乱数を発生させている(rnbinom関数はVARIANCE=mu + mu^2/sizeとして定義しているので左記のような指定方法でよい)
} #ここまできたら、次のiの値でループの最初からやり直し
#行列outをファイルに出力
tmp <- cbind(mean_disp[,1], out) #muの数値情報の右側に行列outを列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
#MEAN vs. DISPERSIONの両対数プロットを描画(参考文献1のFigure1と本質的に同じものです)
#png(file="hoge_real.png", height=600, width=600) #pngファイルにx軸:mean, y軸:dispersionのプロット図を保存
plot(log(MEAN, base=10), log(DISPERSION, base=10), panel.first=grid())#プロット図を作成
#dev.off() #おまじない
------ ここまで ------
2. A群2サンプル vs. B群2サンプルのデータで、全遺伝子の15%がDEG。DEGのうちの20%がA群で4倍高発現、残りの80%がB群で4倍高発現というデータにしたい場合:
------ ここから ------
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- 4 #発現変動の度合い(fold-change)を指定
param_A <- 2 #A群のサンプル数を指定
param_B <- 2 #B群のサンプル数を指定
param4 <- 20000 #全遺伝子数を指定
param_PDEG <- 0.15 #発現変動遺伝子の割合(PDEG)を指定
param_PA <- 0.2 #DEGのうちA群で高発現なものの割合(PA)を指定
#必要なパッケージをロード
library(NBPSeq) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data(arab) #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
data.cl <- c(rep(1, 3), rep(2, 3)) #A群を1、B群を2としたベクトルdata.clを作成(ここのラベル情報は経験分布作成用のデータが3群 vs. 3群のデータだと分かっているため)
#RPM正規化して群ごとのMEANとφの経験分布情報を取得
RPM <- sweep(data, 2, 1000000/colSums(data), "*") #RPM正規化した結果をRPMに格納
RPM_A <- RPM[,data.cl == 1] #A群のデータのみ抽出してRPM_Aに格納
RPM_B <- RPM[,data.cl == 2] #B群のデータのみ抽出して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), param4, replace=TRUE) #最終的にparam4で指定した行数分のデータにしたいので、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, param4) #(param4)で指定した遺伝子数分だけ倍率変化の初期値を1倍としたものをDEG_degree_Aに格納
DEG_degree_A[1:(param4*param_PDEG*param_PA)] <- param1 #DEG_degree_Aのベクトルに対して、最初の行から(param4*param_PDEG*param_PA)で表現されるA群で高発現にする遺伝子数分に相当する位置を(param1)倍するという情報に置換する
mu_A <- mu*DEG_degree_A #A群で高発現とする位置のmuの値を(param1)倍した結果をmu_Aに格納
DEG_degree_B <- rep(1, param4) #(param4)で指定した遺伝子数分だけ倍率変化の初期値を1倍としたものをDEG_degree_Bに格納
DEG_degree_B[(param4*param_PDEG*param_PA+1):(param4*param_PDEG)] <- param1#DEG_degree_Bのベクトルに対して、A群で高発現とした位置情報の次の行(param4*param_PDEG*param_PA+1)からB群で高発現にする遺伝子数分に相当する位置を(param1)倍するという情報に置換する
mu_B <- mu*DEG_degree_B #B群で高発現とする位置の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_A){ #(param_A)回ループを回す
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_B){ #(param_B)回ループを回す
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の値でループの最初からやり直し
#(param4)行(param_A+param_B)列のカウント情報からなる行列outから全ての列でゼロカウントの行を削除した行列RAWを作成し、ファイルに出力
out <- cbind(outA, outB) #A群のデータとB群のデータを列方向で結合した結果をoutに格納
obj <- rowSums(out) > 0 #行の和が0より大きいものをTRUE、それ以外をFALSEとした情報をobjに格納
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) #行列RAWの右側にDEGかどうかのフラグ情報を追加したものをtmpとして格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
#A vs. BのM-A plotを描画して確認
data <- RAW #シミュレーションデータRAWをdataとして取り扱う
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- meanB - meanA #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(B)+log2(A))/2", ylab="M = log2(B)-log2(A)")#M-A plotを描画
plot(x_axis, y_axis, pch=20, cex=0.1, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)")#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. A群1サンプル vs. B群1サンプルのデータで、全遺伝子の15%がDEG。DEGのうちの20%がA群で4倍高発現、残りの80%がB群で4倍高発現というデータにしたい場合:
------ ここから ------
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- 4 #発現変動の度合い(fold-change)を指定
param_A <- 1 #A群のサンプル数を指定
param_B <- 1 #B群のサンプル数を指定
param4 <- 20000 #全遺伝子数を指定
param_PDEG <- 0.15 #発現変動遺伝子の割合(PDEG)を指定
param_PA <- 0.2 #DEGのうちA群で高発現なものの割合(PA)を指定
#必要なパッケージをロード
library(NBPSeq) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data(arab) #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
data.cl <- c(rep(1, 3), rep(2, 3)) #A群を1、B群を2としたベクトルdata.clを作成
#RPM正規化して群ごとのMEANとφの経験分布情報を取得
RPM <- sweep(data, 2, 1000000/colSums(data), "*") #RPM正規化した結果をRPMに格納
RPM_A <- RPM[,data.cl == 1] #A群のデータのみ抽出してRPM_Aに格納
RPM_B <- RPM[,data.cl == 2] #B群のデータのみ抽出して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), param4, replace=TRUE) #最終的にparam4で指定した行数分のデータにしたいので、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, param4) #(param4)で指定した遺伝子数分だけ倍率変化の初期値を1倍としたものをDEG_degree_Aに格納
DEG_degree_A[1:(param4*param_PDEG*param_PA)] <- param1 #DEG_degree_Aのベクトルに対して、最初の行から(param4*param_PDEG*param_PA)で表現されるA群で高発現にする遺伝子数分に相当する位置を(param1)倍するという情報に置換する
mu_A <- mu*DEG_degree_A #A群で高発現とする位置のmuの値を(param1)倍した結果をmu_Aに格納
DEG_degree_B <- rep(1, param4) #(param4)で指定した遺伝子数分だけ倍率変化の初期値を1倍としたものをDEG_degree_Bに格納
DEG_degree_B[(param4*param_PDEG*param_PA+1):(param4*param_PDEG)] <- param1#DEG_degree_Bのベクトルに対して、A群で高発現とした位置情報の次の行(param4*param_PDEG*param_PA+1)からB群で高発現にする遺伝子数分に相当する位置を(param1)倍するという情報に置換する
mu_B <- mu*DEG_degree_B #B群で高発現とする位置の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_A){ #(param_A)回ループを回す
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_B){ #(param_B)回ループを回す
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の値でループの最初からやり直し
#(param4)行(param_A+param_B)列のカウント情報からなる行列outから全ての列でゼロカウントの行を削除した行列RAWを作成し、ファイルに出力
out <- cbind(outA, outB) #A群のデータとB群のデータを列方向で結合した結果をoutに格納
obj <- rowSums(out) > 0 #行の和が0より大きいものをTRUE、それ以外をFALSEとした情報をobjに格納
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) #行列RAWの右側にDEGかどうかのフラグ情報を追加したものをtmpとして格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
#A vs. BのM-A plotを描画して確認
data <- RAW #シミュレーションデータRAWをdataとして取り扱う
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- meanB - meanA #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(B)+log2(A))/2", ylab="M = log2(B)-log2(A)")#M-A plotを描画
plot(x_axis, y_axis, pch=20, cex=0.1, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)")#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を表示
------ ここまで ------
4. A群3サンプル vs. B群3サンプルのデータで、全遺伝子の20%がDEG。DEGのうちの90%がA群で4倍高発現、残りの80%がB群で4倍高発現というデータにしたい場合:
(2.と基本的には同じですがTCCパッケージ(ver. 0.3)中の関数を使って短いコードで実装しています)
------ ここから ------
out_f <- "simdata_3vs3.txt" #出力ファイル名を指定
param1 <- 4 #発現変動の度合い(fold-change)を指定
param_A <- 3 #A群のサンプル数を指定
param_B <- 3 #B群のサンプル数を指定
param4 <- 20000 #全遺伝子数を指定
param_PDEG <- 0.20 #発現変動遺伝子の割合(PDEG)を指定
param_PA <- 0.9 #DEGのうちA群で高発現なものの割合(PA)を指定
#必要なパッケージをロード
library(TCC) #パッケージの読み込み
#シミュレーションデータの作成本番
hoge <- NBsample(DEG_foldchange=param1, repA=param_A, repB=param_B, Ngene=param4, PDEG=param_PDEG, PA=param_PA)#シミュレーションデータの作成を行うNBsample関数を実行した結果をhogeに格納
RAW <- hoge$data #作成した数値データ部分を抽出してRAWに格納
rownames(RAW) <- paste("gene", 1:nrow(RAW), sep="_") #"gene_1", "gene_2"などの遺伝子名を付加している
DEG_posi <- hoge$DEG_posi #導入したDEGに相当する位置をTRUE、それ以外をFALSEとしたベクトルをDEG_posiに格納
nonDEG_posi <- hoge$nonDEG_posi #導入したnon-DEGに相当する位置をTRUE、それ以外をFALSEとしたベクトルをDEG_posiに格納
#得られた結果をファイルに出力
tmp <- cbind(rownames(RAW), RAW, DEG_posi, nonDEG_posi) #行列RAWの右側にDEGかどうかのフラグ情報を追加したものをtmpとして格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
5. A群3サンプル vs. B群3サンプルのデータで、全遺伝子の20%がDEG。DEGのうちの90%がA群で4倍高発現、残りの80%がB群で4倍高発現というデータにしたい場合:
(4.と基本的には同じですが3群間比較などの多群間比較用のシミュレーションデータ作成に対応したやり方です)
------ ここから ------
out_f <- "simdata_multi.txt" #出力ファイル名を指定
param_DEG.foldchange <- c(4, 10) #群ごとの発現変動の度合い(fold-change)を指定。ここでは「A群のDEGは4倍高発現、B群のDEGは10倍高発現」と指定している。
param_group <- c(5, 3) #群ごとのサンプル数を指定。ここでは「A群が5サンプル、B群が3サンプル」と指定している。
param_DEG.assign <- c(0.9, 0.1) #DEGのうち各群で高発現なものの割合を指定。ここでは「DEGのうち、A群で高発現なものが90%, B群で高発現なものが10%」と指定している。
param_Ngene <- 20000 #全遺伝子数を指定
param_PDEG <- 0.20 #全遺伝子に占める発現変動遺伝子の割合(PDEG)を指定。ここでは20000個中(20000*0.2)個をDEGと指定している。
#必要なパッケージをロード
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R") #シミュレーションデータの作成を行うNBsample_multi関数をロード
library(TCC) #パッケージの読み込み
#シミュレーションデータの作成本番
hoge <- NBsample_multi(DEG.foldchange=param_DEG.foldchange, group=param_group, Ngene=param_Ngene, PDEG=param_PDEG, DEG.assign=param_DEG.assign)#シミュレーションデータの作成を行うNBsample_multi関数を実行した結果をhogeに格納
RAW <- hoge$data #作成した数値データ部分を抽出してRAWに格納
rownames(RAW) <- paste("gene", 1:nrow(RAW), sep="_") #"gene_1", "gene_2"などの遺伝子名を付加している
DEG_posi <- hoge$DEG_posi #導入したDEGに相当する位置をTRUE、それ以外をFALSEとしたベクトルをDEG_posiに格納
nonDEG_posi <- hoge$nonDEG_posi #導入したnon-DEGに相当する位置をTRUE、それ以外をFALSEとしたベクトルをDEG_posiに格納
#得られた結果をファイルに出力
tmp <- cbind(rownames(RAW), RAW, DEG_posi, nonDEG_posi) #行列RAWの右側にDEGかどうかのフラグ情報を追加したものをtmpとして格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
#A vs. BのM-A plotを描画して確認
data <- RAW #シミュレーションデータをdataとして取り扱う
data.cl <- c(rep(1, param_samplenum[1]), rep(2, param_samplenum[2]))#A群を1、B群を2としたベクトルdata.clを作成
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- meanB - meanA #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(B)+log2(A))/2", ylab="M = log2(B)-log2(A)")#M-A plotを描画
points(x_axis[DEG_posi == "A"], y_axis[DEG_posi == "A"], col="magenta", pch=20, cex=0.1)#DEGに相当するもの(つまりDEG_posiがTRUEの部分)の色をmagentaにしている
points(x_axis[DEG_posi == "B"], y_axis[DEG_posi == "B"], col="cyan", pch=20, cex=0.1)#DEGに相当するもの(つまりDEG_posiがTRUEの部分)の色をcyanにしている
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
legend("topright", c("DEG(up_in_A)", "DEG(up_in_B)", "non-DEG"), col=c("magenta", "cyan", "black"), pch=19)#legendを表示
------ ここまで ------
6. 全部で5群のデータにしたい場合:
(5.と基本的には同じ枠組みですが多群間のシミュレーションデータ作成例です)
------ ここから ------
out_f <- "simdata_multi.txt" #出力ファイル名を指定
param_DEG.foldchange <- c(4, 10, 0, 5, 7) #群ごとの発現変動の度合い(fold-change)を指定。ここでは「A群のDEGは4倍高発現, B群のDEGは10倍高発現, C群のDEGは0倍高発現, D群のDEGは5倍高発現, E群のDEGは7倍高発現」と指定している。
param_group <- c(5, 3, 1, 2, 2) #群ごとのサンプル数を指定。ここでは「A群が5サンプル, B群が3サンプル, C群が1サンプル, D群が2サンプル, E群が2サンプル」と指定している。
param_DEG.assign <- c(0, 0.2, 0, 0.5, 0.3) #DEGのうち各群で高発現なものの割合を指定。ここでは「DEGのうち、A群で高発現なものが0%, B群で高発現なものが20%, C群で高発現なものが0%, D群で高発現なものが50%, E群で高発現なものが30%」と指定している。
param_Ngene <- 20000 #全遺伝子数を指定
param_PDEG <- 0.20 #全遺伝子に占める発現変動遺伝子の割合(PDEG)を指定。ここでは20000個中(20000*0.2)個をDEGと指定している。
#必要なパッケージをロード
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R") #シミュレーションデータの作成を行うNBsample_multi関数をロード
library(TCC) #パッケージの読み込み
#シミュレーションデータの作成本番
hoge <- NBsample_multi(DEG.foldchange=param_DEG.foldchange, group=param_group, Ngene=param_Ngene, PDEG=param_PDEG, DEG.assign=param_DEG.assign)#シミュレーションデータの作成を行うNBsample_multi関数を実行した結果をhogeに格納
RAW <- hoge$data #作成した数値データ部分を抽出してRAWに格納
rownames(RAW) <- paste("gene", 1:nrow(RAW), sep="_") #"gene_1", "gene_2"などの遺伝子名を付加している
DEG_posi <- hoge$DEG_posi #導入したDEGに相当する位置をTRUE、それ以外をFALSEとしたベクトルをDEG_posiに格納
nonDEG_posi <- hoge$nonDEG_posi #導入したnon-DEGに相当する位置をTRUE、それ以外をFALSEとしたベクトルをDEG_posiに格納
#得られた結果をファイルに出力
tmp <- cbind(rownames(RAW), RAW, DEG_posi, nonDEG_posi) #行列RAWの右側にDEGかどうかのフラグ情報を追加したものをtmpとして格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
参考文献1(Di et al., SAGMB, 2011)
参考文献2(Cumbie et al., PLoS One, in press; GENE-counterの論文)
参考文献3(Anders and Huber, Genome Biol., 2010)
参考文献3(Anders and Huber, Genome Biol., 2010)
参考文献4(Robinson et al., Bioinformatics, 2010)
CRANのTCCのwebページ
TCC:Kadota et al., Algorithms Mol. Biol., 2012
解析 | NGS(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の意味合いについて、もうすこしざっくりと説明します。
例えば「人間である私の体内の二つの組織間(例えば大脳(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の)モデル構築にどう影響するか?どう関係するのか?についてですが、これは極めてシンプルで、DEGかどうかの判定をする際に「比較する二つのサンプルのカウント(発現量)データを一緒にして分散を計算し...」を行う際に、サンプル間の正規化がうまくできていなければバラツキ(分散)を正しく計算できません。
ただそれだけですが、用いる正規化法次第で結果が大きく異なりうる(Robinson and Oshlack, 2010)のです。そして発現変動解析結果はその後の解析(GO解析など)にほとんどそのまま反映されますので私を含む多くのグループが正規化法の開発や性能評価といったあたりの研究を行っています。
前処理 | 正規化についてのところでも述べていますが、大抵の場合、
パッケージ独自の「正規化法」と「発現変動遺伝子検出法」が実装されており、「どの正規化法を使うか?」ということが「どの発現変動遺伝子検出法を使うか?」ということよりも結果に与える影響が大きい(Bullard et al., 2010; Kadota et al., 2012; Garmire and Subramaniam, 2012)ことがわかりつつあります。
従来のサンプル間正規化法(RPMやTMM法)は比較する二群間(A群 vs. B群)でDEG数に大きな偏りがないことを前提にしています。
つまり、「(A群 >> B群)のDEG数と(A群 << B群)の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., submitted)。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を利用しています。
TCC (ver. 1.1.3)は2013年5月21現在、CRANにしかアップしていませんが、現在Bioconductorに投稿中です。詳細はこちら
本題
以下は利用可能なRパッケージ:
・DEGSeq:Wang et al., Bioinformatics, 2010
・edgeR:Robinson et al., Bioinformatics, 2010
・GPseq:Srivastava et al., Nucleic Acids Res., 2010
・baySeq:Hardcastle and Kelly, BMC Bioinformatics, 2010
・DESeq:Anders and Huber, Genome Biol., 2010
・NBPSeq:Di et al., SAGMB, 2011
・BBSeq:Zhou et al., Bioinformatics, 2011
・NOISeq:Tarazona et al., Genome Res., 2011
・PoissonSeq:Li et al., Biostatistics, 2012
・SAMseq:Li and Tibshirani, Stat Methods Med Res., 2012
・TCC:Kadota et al., Algorithms Mol. Biol., 2012
・BitSeq:Glaus et al., Bioinformatics, 2012
・easyRNASeq:Delhomme et al., Bioinformatics, 2012
・ShrinkBayes:Van De Wiel et al., Biostatistics, 2013
・sSeq:Yu et al., Bioinformatics, 2013
Kadota et al., AMB, 2009
Bullard et al., BMC Bioinformatics, 2010
Robinson and Oshlack, Genome Biol., 2010
Garmire and Subramanian, RNA, 2012
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | 複製なし | DESeq with iDEGES/DESeq (Sun_submitted)
iDEGES/DESeq正規化(Sun_submitted)を実行したのち、
DESeqパッケージ中のnegative binomial testで発現変動遺伝子(Differentially expressed Genes; DEGs)検出を行うやり方を示します。
全てTCC (≥ ver. 1.1.99)パッケージ内で完結します。
ちなみに、param_DEmethodのところでの"deseq"は「(正規化後に実行する)DEG検出の手段としてDESeqパッケージ中の方法を利用する」ことに相当しますが、以下に示す別の選択肢もあります:
・DEG検出はbaySeqパッケージ中のempirical Bayesにしたい場合:"bayseq"
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
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 <- "data_hypodata_1vs1_iDEGESDESeq_DE.txt" #出力ファイル名を指定
param_A <- 1 #A群(G1群)のサンプル数を指定
param_B <- 1 #B群(G2群)のサンプル数を指定
param1 <- 3 #DESeq-(DESeq-DESeq)nパイプラインのnの値(iterationの回数)を指定(デフォルトは3)
param_DEmethod <- "deseq" #(正規化後に実行する)DEG検出法を指定
param_FDR <- 0.05 #DEG検出時のfalse discovery rate (FDR)閾値を指定
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl) #TCCクラスオブジェクトtccを作成
#iDEGES/DESeq正規化の実行
tcc <- calcNormFactors(tcc, norm.method="deseq", test.method="deseq",#正規化を実行した結果をtccに格納
iteration=param1, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
#DEG検出の実行と結果の抽出
tcc <- estimateDE(tcc, test.method=param_DEmethod, FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE) #p値などの結果を抽出してをresultに格納
#結果をまとめたものをファイルに出力
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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc, FDR=param_FDR) #param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
------ ここまで ------
DESeq:Anders and Huber, Genome Biol, 2010
TCC (≥ ver. 1.1.99):Sun et al., submitted
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | 複製なし | 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 <- "data_hypodata_1vs1_DESeq_DE.txt" #出力ファイル名を指定
param_A <- 1 #A群(G1群)のサンプル数を指定
param_B <- 1 #B群(G2群)のサンプル数を指定
param_fitType <- "parametric" #DESeqパッケージ内のestimateDispersions関数内のパラメータ("parametric" or "local")を指定
#必要なパッケージなどをロード
library(DESeq) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データの型をmatrixにしている
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を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)
#DEG検出の実行と結果の抽出
cds <- estimateDispersions(cds, method="blind", sharingMode="fit-only", fitType=param_fitType)#モデル構築
out <- nbinomTest(cds, 1, 2) #発現変動の各種統計量を計算し、結果をoutに格納
p.value <- out$pval #p-valueをp.valueに格納
p.value <- ifelse(is.na(p.value), 1, p.value) #NAを1に置換している
q.value <- out$padj #adjusted p-valueをq.valueに格納
q.value <- ifelse(is.na(q.value), 1, q.value) #NAを1に置換している
rank_DESeq <- rank(p.value) #p.valueでランキングした結果をrank_DESeqに格納
logratio <- out$log2FoldChange #log2(B/A)統計量をlogratioに格納
#結果をまとめたものをファイルに出力
tmp <- cbind(rownames(data), data, p.value, q.value, rank_DESeq, logratio)#入力データの右側に、「p.value」、「q.value」、「rank_DESeq」、「log(B/A)」を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plotMA(out) #FDR < 0.1 を満たすDEGを赤としてM-A plotを描画
------ ここまで ------
2. サンプルデータ14の10,000 genes×2 samplesの「複製なし」タグカウントデータ(data_hypodata_1vs1.txt)
TCCパッケージを用いて同様の解析を行うやり方です。出力ファイルのa.value列がlogratioに相当し、q.value列上でFDR閾値を決めます。
------ ここから ------
in_f <- "data_hypodata_1vs1.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "data_hypodata_1vs1_TCC_DE.txt" #出力ファイル名を指定
param_A <- 1 #A群(G1群)のサンプル数を指定
param_B <- 1 #B群(G2群)のサンプル数を指定
param_FDR <- 0.10 #DEG検出時のfalse discovery rate (FDR)閾値を指定
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
#Anders and Huberの(AH)正規化の実行
tcc <- calcNormFactors(tcc, iteration=FALSE) #正規化を実行した結果をtccに格納
#DEG検出の実行と結果の抽出
tcc <- estimateDE(tcc, FDR=param_FDR) #DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE) #p値などの結果を抽出してをresultに格納
#結果をまとめたものをファイルに出力
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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc, FDR=param_FDR) #param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
------ ここまで ------
DESeq:Anders and Huber, Genome Biol, 2010
TCC (≥ ver. 1.1.99):Sun et al., submitted
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | 複製あり | edgeR with iDEGES/edgeR (Sun_submitted)
iDEGES/edgeR正規化(Sun_submitted)を実行したのち、
edgeRパッケージ中のexact testで発現変動遺伝子(Differentially expressed Genes; DEGs)検出を行うやり方を示します。
全てTCC (≥ ver. 1.1.99)パッケージ内で完結します。
ちなみに、param_DEmethodのところでの"edger"は「(正規化後に実行する)DEG検出の手段としてedgeRパッケージ中の方法を利用する」ことに相当しますが、以下に示す他の二つの選択肢もあります:
・DEG検出はDESeqパッケージ中のnegative binomial testにしたい場合:"deseq"
・DEG検出はbaySeqパッケージ中のempirical Bayesにしたい場合:"bayseq"
また、param_FDRでは0.05を指定していますが、これは「DEGと判定したものの中でどの程度の数の偽物(本当はDEGではないのにDEGと判定されたもの)を許容するか?」
というfalse discovery rate (FDRと略す)の閾値を指定するところです。0.05だと5%偽物が含まれることを許容することに相当し、
一般にこの数を低く設定するほどDEGと判定する数が少なくなります。
ちなみによくp値の閾値(有意水準; significance level)と混同しがちですが、例えばp-value < 0.05は「non-DEGの中で(本当はDEGではないにもかかわらず)DEGと判定してしまうのが5%程度になるような閾値」に相当します。
つまり、「分子は同じですが、分母が異なる」ということです。なぜ、p値を使わずにFDR(p値に対応する正しい用語は本当はq-value)がよく用いられるかというと、
例えばある10000遺伝子からなるランダムデータの二群間比較を行って、p < 0.05の閾値を満たすものをDEGと判定するとしましょう。
p値の定義からいって、大体5%(10000×0.05 = 500個)程度がDEGと判定されます。この得られた500個が本当のDEG...ではないですよね?
つまり、実データの場合で、「有意水準を満たすDEG数」が「搭載遺伝子数×設定した有意水準」以下であればそのデータセット中にDEGはないという判定がくだされるべき、という常識的な判断を下せなければなりません。
逆に、10000遺伝子からなる実データの二群間比較を行って、p < 0.05の閾値を満たすものが1200個あったとしましょう。
この中には偶然にDEGと判定されたものが500個程度含まれると考えるべきですが、残りの700個程度は本物と考えていいですよね。
言い換えると1200個中(500/1200)×100 = 41.6667%がfalse positiveということであり、「FDR p < 0.416667を満たす遺伝子数は1200個あった」という言い方ができます。
実用上は、上記事柄が理解できていれば十分でしょう。
つまり
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
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_iDEGESedgeR_DE.txt" #出力ファイル名を指定
param_A <- 3 #A群(G1群)のサンプル数を指定
param_B <- 3 #B群(G2群)のサンプル数を指定
param1 <- 3 #正規化におけるTMM-(edgeR-TMM)nパイプラインのnの値(iterationの回数)を指定(デフォルトは3)
param_DEmethod <- "edger" #(正規化後に実行する)DEG検出法を指定
param_FDR <- 0.05 #DEG検出時のfalse discovery rate (FDR)閾値を指定
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl) #TCCクラスオブジェクトtccを作成
#iDEGES/edgeR正規化の実行
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
iteration=param1, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
#DEG検出の実行と結果の抽出
tcc <- estimateDE(tcc, test.method=param_DEmethod, FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE) #p値などの結果を抽出してをresultに格納
#結果をまとめたものをファイルに出力
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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc, FDR=param_FDR) #param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
------ ここまで ------
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_iDEGESedgeR_DE.txt" #出力ファイル名を指定
param_A <- 2 #A群(mut群)のサンプル数を指定
param_B <- 2 #B群(wt群)のサンプル数を指定
param1 <- 3 #TMM-(edgeR-TMM)nパイプラインのnの値(iterationの回数)を指定(デフォルトは3)
param_DEmethod <- "edger" #DEG検出法を指定
param_FDR <- 0.05 #DEG検出時のfalse discovery rate (FDR)閾値を指定
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
#iDEGES/edgeR正規化の実行
tcc <- calcNormFactors(tcc, iteration=param1) #正規化を実行した結果をtccに格納
#DEG検出の実行と結果の抽出
tcc <- estimateDE(tcc, test.method=param_DEmethod, FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE) #p値などの結果を抽出してをresultに格納
#結果をまとめたものをファイルに出力
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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc, FDR=param_FDR) #param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
------ ここまで ------
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 <- "data_yeast_7065_iDEGESedgeR_DE2.txt" #出力ファイル名を指定
param_A <- 2 #A群(mut群)のサンプル数を指定
param_B <- 2 #B群(wt群)のサンプル数を指定
param1 <- 3 #TMM-(edgeR-TMM)nパイプラインのnの値(iterationの回数)を指定(デフォルトは3)
param_lowcount <- 0 #低発現遺伝子のフィルタリングを行う際の閾値。遺伝子(行)ごとにカウントの総和を計算し、ここで指定した値よりも大きいものだけがその後の解析に用いられる
param_DEmethod <- "edger" #DEG検出法を指定
param_FDR <- 0.05 #DEG検出時のfalse discovery rate (FDR)閾値を指定
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
dim(tcc$count) #カウント行列の行数と列数を表示(7065行4列)
#フィルタリングの実行(低発現のものを除去)
tcc <- filterLowCountGenes(tcc, low.count = param_lowcount) #param_lowcountで指定した閾値より大きい総カウント数をもつ遺伝子のみを抽出している
dim(tcc$count) #カウント行列の行数と列数を表示(6508行4列になっていることがわかる)
#iDEGES/edgeR正規化の実行
tcc <- calcNormFactors(tcc, iteration=param1) #正規化を実行した結果をtccに格納
#DEG検出の実行と結果の抽出
tcc <- estimateDE(tcc, test.method=param_DEmethod, FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE) #p値などの結果を抽出してをresultに格納
#結果をまとめたものをファイルに出力
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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc, FDR=param_FDR) #param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
------ ここまで ------
TCC (≥ ver. 1.1.99):Sun et al., submitted
edgeR:Robinson et al., Bioinformatics, 2010
TMM正規化法:Robinson and Oshlack, Genome Biol., 2010
an exact test for negative binomial distribution:Robinson and Smyth, Biostatistics, 2008
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | 複製あり | edgeR with DEGES/TbT (Sun_submitted)
TbT正規化(DEGES/TbTと同じ; Kadota et al., 2012)を実行したのち、
edgeRパッケージ中のexact testで発現変動遺伝子(Differentially expressed Genes; DEGs)検出を行うやり方を示します。
全てTCC (≥ ver. 1.1.99)パッケージ内で完結します。
ちなみに、param_DEmethodのところでの"edger"は「DEG検出の手段としてedgeRパッケージ中の方法を利用する」ことに相当しますが、以下に示す他の二つの選択肢もあります:
・DEG検出はDESeqパッケージ中のnegative binomial testにしたい場合:"deseq"
・DEG検出はbaySeqパッケージ中のempirical Bayesにしたい場合:"bayseq"
この方法は原著論文(Kadota et al., 2012)でも議論していますが、計算時間が非常にかかるのが欠点です。よって、edgeR with iDEGES/edgeR (Sun_submitted) の利用を(計算時間と精度の両方の観点から)お勧めします。
また、ここでは計算時間短縮のためにparam_samplesizeを500にしていますが、本来のTbT正規化法(TCC論文中のDEGES/TbTと同じ)はここを10000として行います。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
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_DEGESTbT_DE.txt" #出力ファイル名を指定
param_A <- 3 #A群(G1群)のサンプル数を指定
param_B <- 3 #B群(G2群)のサンプル数を指定
param_samplesize <- 500 #TbT法のstep2中で行うブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とか1000とかでやってみてください。)
param_DEmethod <- "edger" #DEG検出法を指定
param_FDR <- 0.05 #DEG検出時のfalse discovery rate (FDR)閾値を指定
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
#TbT正規化(TCC論文中のDEGES/TbTと同じ)の実行
tcc <- calcNormFactors(tcc, norm.method="tmm", #正規化を実行した結果をtccに格納
test.method="bayseq", samplesize=param_samplesize)#正規化を実行した結果をtccに格納
#DEG検出の実行と結果の抽出
tcc <- estimateDE(tcc, test.method=param_DEmethod, FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE) #p値などの結果を抽出してをresultに格納
#結果をまとめたものをファイルに出力
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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc, FDR=param_FDR) #param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
------ ここまで ------
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_DEGESTbT_DE.txt" #出力ファイル名を指定
param_A <- 2 #A群(mut群)のサンプル数を指定
param_B <- 2 #B群(wt群)のサンプル数を指定
param_samplesize <- 500 #TbT法のstep2中で行うブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とか1000とかでやってみてください。)
param_DEmethod <- "edger" #DEG検出法を指定
param_FDR <- 0.05 #DEG検出時のfalse discovery rate (FDR)閾値を指定
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
#TbT正規化(TCC論文中のDEGES/TbTと同じ)の実行
tcc <- calcNormFactors(tcc, norm.method="tmm", #正規化を実行した結果をtccに格納
test.method="bayseq", samplesize=param_samplesize)#正規化を実行した結果をtccに格納
#DEG検出の実行と結果の抽出
tcc <- estimateDE(tcc, test.method=param_DEmethod, FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE) #p値などの結果を抽出してをresultに格納
#結果をまとめたものをファイルに出力
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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc, FDR=param_FDR) #param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
------ ここまで ------
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 <- "data_yeast_7065_DEGESTbT_DE2.txt" #出力ファイル名を指定
param_A <- 2 #A群(mut群)のサンプル数を指定
param_B <- 2 #B群(wt群)のサンプル数を指定
param_samplesize <- 500 #TbT法のstep2中で行うブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とか1000とかでやってみてください。)
param_lowcount <- 0 #低発現遺伝子のフィルタリングを行う際の閾値。遺伝子(行)ごとにカウントの総和を計算し、ここで指定した値よりも大きいものだけがその後の解析に用いられる
param_DEmethod <- "edger" #DEG検出法を指定
param_FDR <- 0.05 #DEG検出時のfalse discovery rate (FDR)閾値を指定
#必要なパッケージなどをロード
library(TCC) #パッケージの読み込み
#発現データの読み込みとTCCクラスオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
tcc <- new("TCC", as.matrix(data), c(param_A, param_B)) #TCCクラスオブジェクトtccを作成
dim(tcc$count) #カウント行列の行数と列数を表示(7065行4列)
#フィルタリングの実行(低発現のものを除去)
tcc <- filterLowCountGenes(tcc, low.count = param_lowcount) #param_lowcountで指定した閾値より大きい総カウント数をもつ遺伝子のみを抽出している
dim(tcc$count) #カウント行列の行数と列数を表示(6508行4列になっていることがわかる)
#TbT正規化(TCC論文中のDEGES/TbTと同じ)の実行
tcc <- calcNormFactors(tcc, norm.method="tmm", #正規化を実行した結果をtccに格納
test.method="bayseq", samplesize=param_samplesize)#正規化を実行した結果をtccに格納
#DEG検出の実行と結果の抽出
tcc <- estimateDE(tcc, test.method=param_DEmethod, FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE) #p値などの結果を抽出してをresultに格納
#結果をまとめたものをファイルに出力
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の中身をout_fで指定したファイル名で保存
#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc, FDR=param_FDR) #param_FDRで指定した閾値を満たすDEGをマゼンタ色にしてM-A plotを描画
------ ここまで ------
TCC (≥ ver. 1.1.99):Sun et al., submitted
edgeR:Robinson et al., Bioinformatics, 2010
TMM正規化法:Robinson and Oshlack, Genome Biol., 2010
baySeq:Hardcastle and Kelly, BMC Bioinformatics, 2010
TbT正規化法:Kadota et al., Algorithms Mol. Biol., 2012
an exact test for negative binomial distribution:Robinson and Smyth, Biostatistics, 2008
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | 複製あり | edgeR coupled with TbT normalization (Kadota_2012)
「TbT正規化(Kadota_2012)」と「解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | について」
のところでも述べていますが、KadotaらのTbT正規化法論文(参考文献1)中で、「既存のRパッケージのデフォルトの解析手順よりもTbT正規化法を組合せたほうが精度が高い」ということを述べています。
ここでは、2つデータセットに対してTbT正規化法を組み合わせたedgeR(参考文献2)のやり方を示します:
1. Technical replicatesデータ(A群5サンプル vs. B群5サンプル)をR (version 2.15.0)とedgeR (version 2.6.0)で実行する場合:
2. Biological replicatesデータ(A群3サンプル vs. B群3サンプル)をR (version 2.15.0)とedgeR (version 2.6.0)で実行する場合:
Technical replicatesのほうは、サンプルデータ2のSupplementaryTable2_changed.txtのデータです。
Biological replicatesのほうは、NBPSeqパッケージに同梱されているArabidopsis(シロイヌナズナ)のデータ(サンプルデータ8のdata_arab.txt)です。
このedgeRパッケージは、基本的にBiological replicatesのデータを入力として想定しています。
以下のスクリプトを実行すると概ね1時間程度はかかります(*_*)...。これは、TbT法の内部で計算時間のかかるbaySeq(参考文献4)を利用しているためです。
動作確認のみしたい、という人はparam3のところで指定する数値を500とかにして実行してください。おそらく数分で結果を得られると思われます。
2012年4月17日にTbT論文共著者の西山さんから「edgeRのversion 2.6.0(2012/03/26リリース)でexactTest関数の返り値の変数名が変わっているので、その部分を変更する必要がある」旨の指摘を受けたので修正しました。
私が動作確認したのはedgeRのversion 2.4.1 (2011/11/23リリース)で2012年3月初旬ごろでしたが、こういうことにはよく遭遇します。こんなもんです。。。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. Technical replicatesデータ(A群5サンプル vs. B群5サンプル; SupplementaryTable2_changed.txt)の場合:
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge2.txt" #出力ファイル名を指定
out_f2 <- "hoge2.png" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 10000 #ブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とか1000とかでやってみてください。)
param4 <- 0.01 #MA-plot描画時のFDRの閾値を指定
param5 <- c(600, 400) #MA-plotのファイル出力時の横幅と縦幅を指定(単位はピクセル)
#必要なパッケージなどをロード
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R") #門田のタグカウントデータ正規化法(TbT法)を利用するための関数をロード
library(DEGseq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
RAW <- data #dataをRAWに格納
#TbT正規化係数を計算
TbTout <- do_TbT(data, data.cl, sample_num=param3) #TbT正規化法を実行する関数do_TbTを実行した結果をTbToutに格納
norm_f_TbT <- TbTout$norm_f_TbT #TbT正規化係数の情報を抽出してnorm_f_TbTに格納
#TbT正規化係数を組合せたedgeRを用いてDEGの検出を実行
d <- DGEList(counts=data, group=data.cl) #DGEListオブジェクトを作成してdに格納
d$samples$norm.factors <- norm_f_TbT #TbT正規化係数を代入
d <- estimateCommonDisp(d) #the quantile-adjusted conditional maximum likelihood (qCML)法でcommon dispersionを計算している
d <- estimateTagwiseDisp(d, prop.used=0.5, grid.length=500) #the quantile-adjusted conditional maximum likelihood (qCML)法でmoderated tagwise dispersionを計算している
out <- exactTest(d) #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
stat_edgeR <- p.adjust(out$table$PValue, method="BH") #False Discovery Rate (FDR)を計算し、結果をstat_edgeRに格納
rank_edgeR <- rank(stat_edgeR) #FDR値でランキングした結果をrank_edgeRに格納
hoge <- cbind(rownames(data), data, out$table, stat_edgeR, rank_edgeR) #入力データの右側に、「logConc (M-A plotのAに相当するもの;全体的な発現レベルに相当)」、「logFC (M-A plotのMに相当するもの;いわゆるlog ratioと同じもの)」、「p値」、「(Benjamini and Hochbergの方法で計算した)FDR値」、「順位」を結合した結果をhogeに格納
tmp <- hoge[order(rank_edgeR),] #発現変動の度合いでソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_edgeR < param4) #param4で指定した閾値未満のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param5[1], height=param5[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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データ(A群3サンプル vs. B群3サンプルdata_arab.txt)の場合:
------ ここから ------
in_f <- "data_arab.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge4.txt" #出力ファイル名を指定
out_f2 <- "hoge4.png" #出力ファイル名を指定
param_A <- 3 #A群のサンプル数を指定
param_B <- 3 #B群のサンプル数を指定
param3 <- 10000 #ブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とか1000とかでやってみてください。)
param4 <- 0.01 #MA-plot描画時のFDRの閾値を指定
param5 <- c(600, 400) #MA-plotのファイル出力時の横幅と縦幅を指定(単位はピクセル)
#必要なパッケージなどをロード
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R") #門田のタグカウントデータ正規化法(TbT法)を利用するための関数をロード
library(NBPSeq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
library(DEGseq) #パッケージの読み込み
library(baySeq) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
RAW <- data #dataをRAWに格納
#TbT正規化係数を計算
TbTout <- do_TbT(data, data.cl, sample_num=param3) #TbT正規化法を実行する関数do_TbTを実行した結果をTbToutに格納
norm_f_TbT <- TbTout$norm_f_TbT #TbT正規化係数の情報を抽出してnorm_f_TbTに格納
#TbT正規化係数を組合せたedgeRを用いてDEGの検出を実行
d <- DGEList(counts=data, group=data.cl) #DGEListオブジェクトを作成してdに格納
d$samples$norm.factors <- norm_f_TbT #TbT正規化係数を代入
d <- estimateCommonDisp(d) #the quantile-adjusted conditional maximum likelihood (qCML)法でcommon dispersionを計算している
d <- estimateTagwiseDisp(d, prop.used=0.5, grid.length=500) #the quantile-adjusted conditional maximum likelihood (qCML)法でmoderated tagwise dispersionを計算している
out <- exactTest(d) #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
stat_edgeR <- p.adjust(out$table$PValue, method="BH") #False Discovery Rate (FDR)を計算し、結果をstat_edgeRに格納
rank_edgeR <- rank(stat_edgeR) #FDR値でランキングした結果をrank_edgeRに格納
hoge <- cbind(rownames(data), data, out$table, stat_edgeR, rank_edgeR) #入力データの右側に、「logConc (M-A plotのAに相当するもの;全体的な発現レベルに相当)」、「logFC (M-A plotのMに相当するもの;いわゆるlog ratioと同じもの)」、「p値」、「(Benjamini and Hochbergの方法で計算した)FDR値」、「順位」を結合した結果をhogeに格納
tmp <- hoge[order(rank_edgeR),] #発現変動の度合いでソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_edgeR < param4) #param4で指定した閾値未満のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param5[1], height=param5[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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) #発現変動遺伝子の全遺伝子数に占める割合を表示
------ ここまで ------
BioconductorのedgeRのwebページ
参考文献1(Kadota et al., AMB, 2012)
参考文献2(Robinson et al., Bioinformatics, 2010)
参考文献3(Robinson and Oshlack, Genome Biol., 2010)
参考文献4(Hardcastle and Kelly, BMC Bioinformatics, 2010)
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | 複製あり | NBPSeq coupled with TbT normalization (Kadota_2012)
「TbT正規化(Kadota_2012)」と「解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | について」
のところでも述べていますが、KadotaらのTbT正規化法論文(参考文献1)中で、「既存のRパッケージのデフォルトの解析手順よりもTbT正規化法を組合せたほうが精度が高い」ということを述べています。
ここでは、以下の2つのデータセットに対してTbT正規化法を組み合わせたNBPSeq(参考文献5)のやり方を示します:
1. Technical replicatesデータ(A群5サンプル vs. B群5サンプル)
2. Biological replicatesデータ(A群3サンプル vs. B群3サンプル)
Technical replicatesのほうは、サンプルデータ2のSupplementaryTable2_changed.txtのデータです。
Biological replicatesのほうは、NBPSeqパッケージに同梱されているArabidopsis(シロイヌナズナ)のデータ(サンプルデータ8のdata_arab.txt)です。
このパッケージは、基本的にBiological replicatesのデータを入力として想定しています。
以下のスクリプトを実行すると概ね1時間程度はかかります(*_*)...。これは、TbT法の内部で計算時間のかかるbaySeq(参考文献4)を利用しているためです。
動作確認のみしたい、という人はparam3のところで指定する数値を500とかにして実行してください。おそらく数分で結果を得られると思われます。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. Technical replicatesデータ(A群5サンプル vs. B群5サンプル)の場合:
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge1.txt" #出力ファイル名を指定
out_f2 <- "hoge1.png" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 10000 #ブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とか1000とかでやってみてください。)
param4 <- 0.01 #MA-plot描画時のp値の閾値を指定
param5 <- c(600, 400) #MA-plotのファイル出力時の横幅と縦幅を指定(単位はピクセル)
#必要なパッケージなどをロード
#source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R") #門田のタグカウントデータ正規化法(TbT法)を利用するための関数をロード
library(NBPSeq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
library(DEGseq) #パッケージの読み込み
library(baySeq) #パッケージの読み込み
library(TCC) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データをmatrix型に変換している
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
RAW <- data #dataをRAWに格納
#TbT正規化係数を計算
TbTout <- do_TbT(data, data.cl, sample_num=param3) #TbT正規化法を実行する関数do_TbTを実行した結果をTbToutに格納
norm_f_TbT <- TbTout$norm_f_TbT #TbT正規化係数の情報を抽出してnorm_f_TbTに格納
#TbT正規化係数を組合せたNBPSeqを用いてDEGの検出を実行
out <- nbp.test(data, data.cl, 1, 2, norm.factors=norm_f_TbT) #TbT正規化係数を組み合わせて計算を実行
stat_NBPSeq <- out$p.values #p-valueをstat_NBPSeqに格納
stat_NBPSeq <- ifelse(is.na(stat_NBPSeq), 1, stat_NBPSeq) #NAを1に置換している
rank_NBPSeq <- rank(stat_NBPSeq) #stat_NBPSeqでランキングした結果をrank_NBPSeqに格納
hoge <- cbind(rownames(data), data, stat_NBPSeq, rank_NBPSeq) #入力データの右側に、「stat_NBPSeq」と「rank_NBPSeq」を結合した結果をtmpに格納
tmp <- hoge[order(rank_NBPSeq),] #発現変動の度合いでソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_NBPSeq < param4) #param4で指定した閾値未満のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param5[1], height=param5[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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データ(A群3サンプル vs. B群3サンプル)の場合:
------ ここから ------
in_f <- "data_arab.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge2.txt" #出力ファイル名を指定
out_f2 <- "hoge2.png" #出力ファイル名を指定
param_A <- 3 #A群のサンプル数を指定
param_B <- 3 #B群のサンプル数を指定
param3 <- 10000 #ブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とか1000とかでやってみてください。)
param4 <- 0.01 #MA-plot描画時のp値の閾値を指定
param5 <- c(600, 400) #MA-plotのファイル出力時の横幅と縦幅を指定(単位はピクセル)
#必要なパッケージなどをロード
#source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R") #門田のタグカウントデータ正規化法(TbT法)を利用するための関数をロード
library(NBPSeq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
library(DEGseq) #パッケージの読み込み
library(baySeq) #パッケージの読み込み
library(TCC) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データをmatrix型に変換している
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
RAW <- data #dataをRAWに格納
#TbT正規化係数を計算
TbTout <- do_TbT(data, data.cl, sample_num=param3) #TbT正規化法を実行する関数do_TbTを実行した結果をTbToutに格納
norm_f_TbT <- TbTout$norm_f_TbT #TbT正規化係数の情報を抽出してnorm_f_TbTに格納
#TbT正規化係数を組合せたNBPSeqを用いてDEGの検出を実行
out <- nbp.test(data, data.cl, 1, 2, norm.factors=norm_f_TbT) #TbT正規化係数を組み合わせて計算を実行
stat_NBPSeq <- out$p.values #p-valueをstat_NBPSeqに格納
stat_NBPSeq <- ifelse(is.na(stat_NBPSeq), 1, stat_NBPSeq) #NAを1に置換している
rank_NBPSeq <- rank(stat_NBPSeq) #stat_NBPSeqでランキングした結果をrank_NBPSeqに格納
hoge <- cbind(rownames(data), data, stat_NBPSeq, rank_NBPSeq) #入力データの右側に、「stat_NBPSeq」と「rank_NBPSeq」を結合した結果をtmpに格納
tmp <- hoge[order(rank_NBPSeq),] #発現変動の度合いでソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_NBPSeq < param4) #param4で指定した閾値未満のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param5[1], height=param5[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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) #発現変動遺伝子の全遺伝子数に占める割合を表示
------ ここまで ------
BioconductorのNBPSeqのwebページ
参考文献1(Kadota et al., AMB, 2012)
参考文献2(Robinson et al., Bioinformatics, 2010)
参考文献2(Robinson and Oshlack, Genome Biol., 2010)
参考文献4(Hardcastle and Kelly, BMC Bioinformatics, 2010)
参考文献5(Di et al., SAGMB, 2011)
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | 複製あり | DESeq coupled with TbT normalization (Kadota_2012)
「TbT正規化(Kadota_2012)」と「解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | について」
のところでも述べていますが、KadotaらのTbT正規化法論文(参考文献1)中で、「既存のRパッケージのデフォルトの解析手順よりもTbT正規化法を組合せたほうが精度が高い」ということを述べています。
ここでは、以下の2つのデータセットに対してTbT正規化法を組み合わせたDESeq(参考文献5)のやり方を示します:
1. Technical replicatesデータ(A群5サンプル vs. B群5サンプル)
2. Biological replicatesデータ(A群3サンプル vs. B群3サンプル: data_arab.txt)
3. Biological replicatesシミュレーションデータ(A群3サンプル vs. B群3サンプル: simdata_3vs3.txt)
Technical replicatesのほうは、サンプルデータ2のSupplementaryTable2_changed.txtのデータです。
Biological replicatesの2.のほうは、NBPSeqパッケージに同梱されているArabidopsis(シロイヌナズナ)のデータ(サンプルデータ8のdata_arab.txt)です。
このパッケージは、基本的にBiological replicatesのデータを入力として想定しています。
また、以下のスクリプトは複製実験データあり(「A1, A2 vs. B1, B2」など)を想定したパラメータになっていますのでご注意ください。
以下のスクリプトを実行すると概ね1時間程度はかかります(*_*)...。これは、TbT法の内部で計算時間のかかるbaySeq(参考文献4)を利用しているためです。
動作確認のみしたい、という人はparam3のところで指定する数値を500とかにして実行してください。おそらく数分で結果を得られると思われます。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. Technical replicatesデータ(A群5サンプル vs. B群5サンプル)の場合:
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge1.txt" #出力ファイル名を指定
out_f2 <- "hoge1.png" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 10000 #ブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とか1000とかでやってみてください。)
param4 <- 0.01 #MA-plot描画時のFDRの閾値を指定
param5 <- c(600, 400) #MA-plotのファイル出力時の横幅と縦幅を指定(単位はピクセル)
#必要なパッケージなどをロード
#source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R") #門田のタグカウントデータ正規化法(TbT法)を利用するための関数をロード
library(DESeq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
library(DEGseq) #パッケージの読み込み
library(baySeq) #パッケージの読み込み
library(TCC) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データをmatrix型に変換している
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
RAW <- data #dataをRAWに格納
#TbT正規化係数を計算
TbTout <- do_TbT(data, data.cl, sample_num=param3) #TbT正規化法を実行する関数do_TbTを実行した結果をTbToutに格納
norm_f_TbT <- TbTout$norm_f_TbT #TbT正規化係数の情報を抽出してnorm_f_TbTに格納
#TbT正規化係数を組合せたDESeqを用いてDEGの検出を実行
cds <- newCountDataSet(data, data.cl) #おまじない(CountDataSetというクラスを作成している)
sizeFactors(cds) <- colSums(data)*norm_f_TbT #TbT正規化係数を掛けたeffective library sizeの値を代入している
cds <- estimateDispersions(cds, method="per-condition", sharingMode="maximum", fitType="local")#DESeq本番
out <- nbinomTest(cds, 1, 2) #DESeq本番
stat_DESeq <- out$padj #p-valueをstat_DESeqに格納
stat_DESeq <- ifelse(is.na(stat_DESeq), 1, stat_DESeq) #NAを1に置換している
rank_DESeq <- rank(stat_DESeq) #stat_DESeqでランキングした結果をrank_DESeqに格納
hoge <- cbind(rownames(data), data, stat_DESeq, rank_DESeq) #入力データの右側に、「stat_DESeq」と「rank_DESeq」を結合した結果をhogeに格納
tmp <- hoge[order(rank_DESeq),] #発現変動の度合いでソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_DESeq < param4) #param4で指定した閾値未満のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param5[1], height=param5[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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データ(A群3サンプル vs. B群3サンプル: data_arab.txt)の場合:
------ ここから ------
in_f <- "data_arab.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge2.txt" #出力ファイル名を指定
out_f2 <- "hoge2.png" #出力ファイル名を指定
param_A <- 3 #A群のサンプル数を指定
param_B <- 3 #B群のサンプル数を指定
param3 <- 10000 #ブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とか1000とかでやってみてください。)
param4 <- 0.01 #MA-plot描画時のFDRの閾値を指定
param5 <- c(600, 400) #MA-plotのファイル出力時の横幅と縦幅を指定(単位はピクセル)
#必要なパッケージなどをロード
#source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R") #門田のタグカウントデータ正規化法(TbT法)を利用するための関数をロード
library(DESeq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
library(DEGseq) #パッケージの読み込み
library(baySeq) #パッケージの読み込み
library(TCC) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データをmatrix型に変換している
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
RAW <- data #dataをRAWに格納
#TbT正規化係数を計算
TbTout <- do_TbT(data, data.cl, sample_num=param3) #TbT正規化法を実行する関数do_TbTを実行した結果をTbToutに格納
norm_f_TbT <- TbTout$norm_f_TbT #TbT正規化係数の情報を抽出してnorm_f_TbTに格納
#TbT正規化係数を組合せたDESeqを用いてDEGの検出を実行
cds <- newCountDataSet(data, data.cl) #おまじない(CountDataSetというクラスを作成している)
sizeFactors(cds) <- colSums(data)*norm_f_TbT #TbT正規化係数を掛けたeffective library sizeの値を代入している
cds <- estimateDispersions(cds, method="per-condition", sharingMode="maximum", fitType="local")#DESeq本番
out <- nbinomTest(cds, 1, 2) #DESeq本番
stat_DESeq <- out$padj #p-valueをstat_DESeqに格納
stat_DESeq <- ifelse(is.na(stat_DESeq), 1, stat_DESeq) #NAを1に置換している
rank_DESeq <- rank(stat_DESeq) #stat_DESeqでランキングした結果をrank_DESeqに格納
hoge <- cbind(rownames(data), data, stat_DESeq, rank_DESeq) #入力データの右側に、「stat_DESeq」と「rank_DESeq」を結合した結果をhogeに格納
tmp <- hoge[order(rank_DESeq),] #発現変動の度合いでソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_DESeq < param4) #param4で指定した閾値未満のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param5[1], height=param5[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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のシミュレーションデータデータ(A群3サンプル vs. B群3サンプル、simdata_3vs3.txt)の場合:
------ ここから ------
in_f <- "data_arab.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge2.txt" #出力ファイル名を指定
out_f2 <- "hoge2.png" #出力ファイル名を指定
param_A <- 3 #A群のサンプル数を指定
param_B <- 3 #B群のサンプル数を指定
param3 <- 10000 #ブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は500とか1000とかでやってみてください。)
param4 <- 0.01 #MA-plot描画時のFDRの閾値を指定
param5 <- c(600, 400) #MA-plotのファイル出力時の横幅と縦幅を指定(単位はピクセル)
#必要なパッケージなどをロード
#source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R") #門田のタグカウントデータ正規化法(TbT法)を利用するための関数をロード
library(DESeq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
library(DEGseq) #パッケージの読み込み
library(baySeq) #パッケージの読み込み
library(TCC) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data.tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データをmatrix型に変換している
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
data <- data.tmp[,1:(param_A+param_B)] #発現データ部分のみ抽出してdataに格納
RAW <- data #dataをRAWに格納
#TbT正規化係数を計算
TbTout <- do_TbT(data, data.cl, sample_num=param3) #TbT正規化法を実行する関数do_TbTを実行した結果をTbToutに格納
norm_f_TbT <- TbTout$norm_f_TbT #TbT正規化係数の情報を抽出してnorm_f_TbTに格納
#TbT正規化係数を組合せたDESeqを用いてDEGの検出を実行
cds <- newCountDataSet(data, data.cl) #おまじない(CountDataSetというクラスを作成している)
sizeFactors(cds) <- colSums(data)*norm_f_TbT #TbT正規化係数を掛けたeffective library sizeの値を代入している
cds <- estimateDispersions(cds, method="per-condition", sharingMode="maximum", fitType="local")#DESeq本番
out <- nbinomTest(cds, 1, 2) #DESeq本番
stat_DESeq <- out$padj #p-valueをstat_DESeqに格納
stat_DESeq <- ifelse(is.na(stat_DESeq), 1, stat_DESeq) #NAを1に置換している
rank_DESeq <- rank(stat_DESeq) #stat_DESeqでランキングした結果をrank_DESeqに格納
hoge <- cbind(rownames(data), data, stat_DESeq, rank_DESeq) #入力データの右側に、「stat_DESeq」と「rank_DESeq」を結合した結果をhogeに格納
tmp <- hoge[order(rank_DESeq),] #発現変動の度合いでソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_DESeq < param4) #param4で指定した閾値未満のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param5[1], height=param5[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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) #発現変動遺伝子の全遺伝子数に占める割合を表示
------ ここまで ------
BioconductorのDESeqのwebページ
参考文献1(Kadota et al., AMB, 2012)
参考文献2(Robinson et al., Bioinformatics, 2010)
参考文献2(Robinson and Oshlack, Genome Biol., 2010)
参考文献4(Hardcastle and Kelly, BMC Bioinformatics, 2010)
参考文献5(Anders and Huber, Genome Biol, 2010)
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | 複製なし | baySeq (Hardcastle_2010)
参考文献1のbaySeqというRパッケージをを用いて解析を行います。
このパッケージ中では、Poisson-Gamma approachとNegative-Binomial approachの二つのやり方が選択可能ですが、後者のほうがより精度が高いので後者のやりかたのみ示します。
また、edgeR, DEGseq, DESeqには(今のところ?!)実装されていませんが、発現レベルが配列長に依存するという問題がありますが、配列長の情報を用いて正規化するやり方も実装されてます。
また、baySeqは発現変動遺伝子(DEG)がどの程度含まれているかを推定する方法、というのも長所の一つですので、そのやり方(1.)と通常のFDRによるカットオフのやり方(2.)も示します。
したがって、以下の3つの場合についてのやり方を示します。
「1. 配列長の情報なし(DEG自動推定)」
「2. 配列長の情報なし(FDRカットオフ)」
「3. 配列長の情報あり(ファイルから情報取得)」
ここではサンプルデータ2のSupplementaryTable2_changed.txtの「5サンプル vs. 5サンプル」解析例を示します。
「3.」についてですが、各IDに対応する配列長情報は前処理 | Ensembl Geneの長さを計算するを行って得られたens_gene_46_length.txt中に含まれるので、
このファイルの読み込みのところから行います。
入力データ:raw countsの行列データ
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. 配列長の情報なし(DEG自動推定)の場合:
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge.txt" #出力ファイル名を指定
out_f2 <- "hoge.png" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 10000 #ブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は1000とかでやってみてください。)
param4 <- c(600, 400) #MA-plotのファイル出力時の横幅(単位はピクセル)と縦幅を指定
library(baySeq) #パッケージの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
groups <- list(NDE=rep(1, (param1+param2)), DE=data.cl) #このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=as.matrix(data), replicates=data.cl, libsizes=colSums(data), groups=groups)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=param3, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL) #事後確率を計算
out@estProps #発現変動(DE)遺伝子がデータの中にどの程度含まれていたかを表示(右側の数値;ちなみに左側の数値はNDEの割合を示す)
rank_bayseq <- rank(-out@posteriors[,2]) #DEのposterior likelihoodでランキングした結果をrank_bayseqに格納
hoge <- cbind(rownames(data), data, rank_bayseq) #入力データの右側に、「rank_bayseq」を結合した結果をhogeに格納
hoge_s <- hoge[order(rank_bayseq),] #発現変動の度合いでソートした結果をhoge_sに格納
hoge2 <- topCounts(out, group=2, number=length(rank_bayseq)) #LikelihoodやFDRを計算するtopCounts関数を適用した結果をhoge2に格納
tmp <- cbind(hoge_s, hoge2$Likelihood, hoge2$FDR) #hoge_sの右側に「Likelihood」, 「FDR値」を追加してtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存
#MA-plotを描画(するための基礎情報取得)
RPM <- sweep(data, 2, 1000000/colSums(data), "*") #RPM正規化した結果をRPMに格納
data <- RPM #オブジェクトRPMをdataに代入
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEGnum <- length(rank_bayseq)*out@estProps[2] #発現変動遺伝子数をDEGnumに格納
obj <- rownames(data)[rank_bayseq < DEGnum] #DEGに相当する遺伝子名情報をobjに格納
DEG_posi <- is.element(rownames(data), obj) #rownames(data)中の並びでのDEGの位置情報を取得してDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param4[1], height=param4[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="solid") #grid線を追加
points(x_axis[DEG_posi], y_axis[DEG_posi], col="red", pch=20, cex=0.1)#DEGを赤色にしている
dev.off() #おまじない
#おまけ
DEGnum #発現変動遺伝子数を表示
out@estProps[2] #発現変動遺伝子の全遺伝子数に占める割合を表示
------ ここまで ------
2. 配列長の情報なし(FDRカットオフ)の場合:
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge.txt" #出力ファイル名を指定
out_f2 <- "hoge.png" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 10000 #ブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は1000とかでやってみてください。)
param4 <- c(600, 400) #MA-plotのファイル出力時の横幅(単位はピクセル)と縦幅を指定
param5 <- 0.05 #MA-plot描画時のFDRの閾値を指定
library(baySeq) #パッケージの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
groups <- list(NDE=rep(1, (param1+param2)), DE=data.cl) #このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=as.matrix(data), replicates=data.cl, libsizes=colSums(data), groups=groups)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=param3, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL) #事後確率を計算
out@estProps #発現変動(DE)遺伝子がデータの中にどの程度含まれていたかを表示(右側の数値;ちなみに左側の数値はNDEの割合を示す)
rank_bayseq <- rank(-out@posteriors[,2]) #DEのposterior likelihoodでランキングした結果をrank_bayseqに格納
hoge <- cbind(rownames(data), data, rank_bayseq) #入力データの右側に、「rank_bayseq」を結合した結果をhogeに格納
hoge_s <- hoge[order(rank_bayseq),] #発現変動の度合いでソートした結果をhoge_sに格納
hoge2 <- topCounts(out, group=2, number=length(rank_bayseq)) #LikelihoodやFDRを計算するtopCounts関数を適用した結果をhoge2に格納
tmp <- cbind(hoge_s, hoge2$Likelihood, hoge2$FDR) #hoge_sの右側に「Likelihood」, 「FDR値」を追加してtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存
#MA-plotを描画(するための基礎情報取得)
RPM <- sweep(data, 2, 1000000/colSums(data), "*") #RPM正規化した結果をRPMに格納
data <- RPM #オブジェクトRPMをdataに代入
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEGnum <- sum(hoge2$FDR < param5) #param5で指定したFDRの閾値を満たす発現変動遺伝子数をDEGnumに格納
obj <- rownames(tmp)[hoge2$FDR < param5] #param5で指定したFDRの閾値を満たす遺伝子名情報をobjに格納
DEG_posi <- is.element(rownames(data), obj) #rownames(data)中の並びでのDEGの位置情報を取得してDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param4[1], height=param4[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="solid") #grid線を追加
points(x_axis[DEG_posi], y_axis[DEG_posi], col="red", pch=20, cex=0.1)#DEGを赤色にしている
dev.off() #おまじない
#おまけ
DEGnum #発現変動遺伝子数を表示
DEGnum/nrow(data) #発現変動遺伝子の全遺伝子数に占める割合を表示
------ ここまで ------
3. 配列長の情報あり(前処理 | Ensembl Geneの長さを計算するを行って得られたens_gene_46_length.txtから情報取得):
------ ここから ------
in_f1 <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_f1に格納
in_f2 <- "ens_gene_46_length.txt" #アノテーション情報ファイルを指定してin_f2に格納
out_f <- "hoge.txt" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 10000 #ブートストラップリサンプリング回数(10000が推奨。すごく時間がかかります。とりあえず、という人は1000とかでやってみてください。)
#Ensembl Gene IDをアルファベット順に並び替えて発現データ(data)情報を取得
library(baySeq) #パッケージの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- data[order(rownames(data)),] #Ensembl Gene IDのアルファベット順に行列dataの行を並び替えている
#Ensembl Gene IDをアルファベット順に並び替えてgene_length情報を取得
tmp <- read.table(in_f2, header=TRUE, sep="\t", quote="") #アノテーション情報ファイルの読み込み
gene_length <- tmp[,2] #配列長をgene_lengthに格納
names(gene_length) <- tmp[,1] #gene_length中の値とEnsembl Gene IDを対応づけている
gene_length <- gene_length[order(names(gene_length))] #Ensembl Gene IDのアルファベット順にgene_length中の要素を並び替えている
#gene_length情報があり、かつ発現データファイル中にもあるEnsembl Gene IDのもののみ取り扱うための処理
common <- intersect(names(gene_length), rownames(data)) #二つのベクトル(names(gene_length)とrownames(data))の積集合(intersection)をcommonに格納
obj_gene_length <- is.element(names(gene_length), common) #commonで指定したEnsembl Gene IDsのnames(gene_length)中における位置情報をobj_gene_lengthに格納
obj_data <- is.element(rownames(data), common) #commonで指定したEnsembl Gene IDsのrownames(data)中における位置情報をobj_dataに格納
gene_length_sub <- gene_length[obj_gene_length] #gene_lengthベクトルの中から、obj_gene_lengthがTRUEとなっているもののみ抽出してgene_length_subに格納
data_sub <- data[obj_data,] #行列dataからobj_dataがTRUEとなっている行のみ抽出してdata_subに格納
#元々あった遺伝子数がどの程度の数になったかを表示
dim(data) #行列dataの行数と列数を表示
dim(data_sub) #行列data_subの行数と列数を表示
gene_length <- gene_length_sub #gene_lengthの中身をgene_length_subにしている
data <- as.matrix(data_sub) #dataの中身をmatrix形式のdata_subにしている
#baySeq本番
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
groups <- list(NDE=rep(1, (param1+param2)), DE=data.cl) #このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=data, replicates=data.cl, libsizes=as.integer(colSums(data)), groups=groups, seglens=gene_length)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=param3, 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に格納
tmp <- cbind(rownames(data), data, stat_bayseq, rank_bayseq) #入力データの右側に、「stat_bayseq」と「rank_bayseq」を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
------ ここまで ------
BioconductorのbaySeqのwebページ
参考文献1(Hardcastle and Kelly, BMC Bioinformatics, 2010)
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | BitSeq (Glaus_2012)
BitSeqのやり方を示します。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
#必要なパッケージなどをロード
library(BitSeq) #パッケージの読み込み
------ ここまで ------
BitSeq:Glaus et al., Bioinformatics, 2012
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | DSS (Wu_201X)
DSS (Dispersion Shrinkage for Sequencing)のやり方を示します。二群間比較用です。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
#必要なパッケージなどをロード
library(DSS) #パッケージの読み込み
------ ここまで ------
BioconductorのDSSのwebページ
DSS:Wu et al., Biostatistics, 2012
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | NOISeq (Tarazona_2011)
NOISeq(参考文献1)のやり方を示します。二群間比較用です。
ここでは、以下の3つのデータセットに対するやり方を示します:
1. Technical replicatesデータ(A群5サンプル vs. B群5サンプル)
2. Biological replicatesデータ(A群3サンプル vs. B群3サンプル: data_arab.txt)
3. Biological replicatesシミュレーションデータ(A群3サンプル vs. B群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がないデータ(A群1サンプル vs. B群1サンプル)場合には(technical replicatesを想定して?!)noise distributionを作成し、replicatesがある場合には同一群内のデータを用いてnoise distributionを作成することでDEG or non-DEGの判定をするような仕組みになっています。
また、この方法は転写物の長さ情報も(RPKM補正後のデータを使いたい場合には)使います。マニュアル中にはここでは長さ情報がない場合には"NA"という情報を含むファイル(SupplementaryTable2_changed_length.txt)を入力として与えるという選択肢を提供していますが、私が2012/06/19に試した限りではうまく動きません。
よって、以下では長さ情報を含むファイルを読み込まずに実行するやり方を示します。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. Technical replicatesデータ(A群5サンプル vs. B群5サンプル)の場合(データの正規化はTMM法を採用する場合):
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge1.txt" #出力ファイル名を指定
out_f2 <- "hoge1.png" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
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に近いほどより厳しい閾値に相当)を指定
param6 <- 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:(param1+1)), cond2=c((param1+2):(param1+1+param2)))#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
RAW <- cbind(data[[1]], data[[2]]) #結果の出力時にA群B群の別々に分かれた状態になっているのをまとめたものを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の中身をout_f1で指定したファイル名で保存。
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_NOISeq > param5) #param5で指定した閾値以上のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param6[1], height=param6[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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データ(A群3サンプル vs. B群3サンプル)の場合:
------ ここから ------
in_f <- "data_arab.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge2.txt" #出力ファイル名を指定
out_f2 <- "hoge2.png" #出力ファイル名を指定
param_A <- 3 #A群のサンプル数を指定
param_B <- 3 #B群のサンプル数を指定
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に近いほどより厳しい閾値に相当)を指定
param6 <- 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:(param1+1)), cond2=c((param1+2):(param1+1+param2)))#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
RAW <- cbind(data[[1]], data[[2]]) #結果の出力時にA群B群の別々に分かれた状態になっているのをまとめたものを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の中身をout_f1で指定したファイル名で保存。
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_NOISeq > param5) #param5で指定した閾値以上のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param6[1], height=param6[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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のシミュレーションデータデータ(A群3サンプル vs. B群3サンプル、simdata_3vs3.txt)の場合:
------ ここから ------
in_f <- "simdata_3vs3.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge3.txt" #出力ファイル名を指定
out_f2 <- "hoge3.png" #出力ファイル名を指定
param1 <- 3 #A群のサンプル数を指定
param2 <- 3 #B群のサンプル数を指定
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に近いほどより厳しい閾値に相当)を指定
param6 <- 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:(param1+1)), cond2=c((param1+2):(param1+1+param2)))#発現データファイルの読み込み
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
RAW <- cbind(data[[1]], data[[2]]) #結果の出力時にA群B群の別々に分かれた状態になっているのをまとめたものを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の中身をout_f1で指定したファイル名で保存。
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_NOISeq > param5) #param5で指定した閾値以上のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param6[1], height=param6[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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のシミュレーションデータデータ(A群3サンプル vs. B群3サンプル、simdata_3vs3.txt)の場合
どこがDEGがわかっているのでAUC値を計算するところまでやる:
------ ここから ------
in_f <- "simdata_3vs3.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge4.txt" #出力ファイル名を指定
out_f2 <- "hoge4.png" #出力ファイル名を指定
param1 <- 3 #A群のサンプル数を指定
param2 <- 3 #B群のサンプル数を指定
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に近いほどより厳しい閾値に相当)を指定
param6 <- 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="")#発現データファイルの読み込み
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
DEG_posi <- data.tmp$DEG_posi #DEGの位置情報を取得
nonDEG_posi <- data.tmp$nonDEG_posi #nonDEGの位置情報を取得
data <- data.tmp[,1:(param1+param2)] #発現データ部分のみ抽出して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)#tmpの中身をout_f1で指定したファイル名で保存。
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_NOISeq > param5) #param5で指定した閾値以上のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param6[1], height=param6[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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のシミュレーションデータデータ(A群3サンプル vs. B群3サンプル、simdata_3vs3.txt)の場合
どこがDEGがわかっているのでAUC値を計算するところまでやり、予めTMM正規化したデータをNOISeqで解析する:
------ ここから ------
in_f <- "simdata_3vs3.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge5.txt" #出力ファイル名を指定
out_f2 <- "hoge5.png" #出力ファイル名を指定
param1 <- 3 #A群のサンプル数を指定
param2 <- 3 #B群のサンプル数を指定
param3 <- "bio" #replicatesのタイプを指定。入力データがtechnical replicatesの場合は"tech"を、biological replicatesの場合は"bio"を指定
param4 <- "n" #データ正規化手段を指定。ここでは自分でTMM正規化後のデータを作成したものを読み込ませるので、オプションとしては「データの正規化を行わない"n"」を与えている
param5 <- 0.8 #DEGとみなすProbability(1に近いほどより厳しい閾値に相当)を指定
param6 <- 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="")#発現データファイルの読み込み
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
DEG_posi <- data.tmp$DEG_posi #DEGの位置情報を取得
nonDEG_posi <- data.tmp$nonDEG_posi #nonDEGの位置情報を取得
data <- data.tmp[,1:(param1+param2)] #発現データ部分のみ抽出して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)#tmpの中身をout_f1で指定したファイル名で保存。
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_NOISeq > param5) #param5で指定した閾値以上のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param6[1], height=param6[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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のシミュレーションデータデータ(A群3サンプル vs. B群3サンプル、simdata_3vs3.txt)の場合
どこがDEGがわかっているのでAUC値を計算するところまでやり、予めTbT正規化したデータをNOISeqで解析する:
------ ここから ------
in_f <- "simdata_3vs3.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge6.txt" #出力ファイル名を指定
out_f2 <- "hoge6.png" #出力ファイル名を指定
param1 <- 3 #A群のサンプル数を指定
param2 <- 3 #B群のサンプル数を指定
param3 <- "bio" #replicatesのタイプを指定。入力データがtechnical replicatesの場合は"tech"を、biological replicatesの場合は"bio"を指定
param4 <- "n" #データ正規化手段を指定。ここでは自分でTMM正規化後のデータを作成したものを読み込ませるので、オプションとしては「データの正規化を行わない"n"」を与えている
param5 <- 0.8 #DEGとみなすProbability(1に近いほどより厳しい閾値に相当)を指定
param6 <- 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="")#発現データファイルの読み込み
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
DEG_posi <- data.tmp$DEG_posi #DEGの位置情報を取得
nonDEG_posi <- data.tmp$nonDEG_posi #nonDEGの位置情報を取得
data <- data.tmp[,1:(param1+param2)] #発現データ部分のみ抽出して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)#tmpの中身をout_f1で指定したファイル名で保存。
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_NOISeq > param5) #param5で指定した閾値以上のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param6[1], height=param6[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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) #発現変動遺伝子の全遺伝子数に占める割合を表示
------ ここまで ------
NOISeqのwebページ
BioconductorのNOISeqのwebページ
参考文献1(Tarazona et al., Genome Res., 2011)
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | GPseq (Srivastava_2010)
GPseq(参考文献1)のやり方を示す予定でしたが、CRANパッケージのやつはどうもBioconductorに比べて不親切ですね。。。マニュアルをざっと読んで...挫折しましたorz
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
#必要なパッケージなどをロード
library(GPseq) #パッケージの読み込み
------ ここまで ------
CRANのGPseqのwebページ
参考文献1(Srivastava et al., Nucleic Acids Res., 2010)
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | NBPSeq (Di_2011)
参考文献1のNBPSeqというRパッケージをを用いて解析を行います。
このパッケージは、任意の正規化法によって得られた正規化係数を組み込むことができますので、ここでは、以下の2つのやり方を示します:
1.デフォルトのRPM補正で行う場合(Technical replicatesデータ)
2. TMM正規化法(参考文献2)を組み合わせた場合(Technical replicatesデータ)
Technical replicatesのほうは、サンプルデータ2のSupplementaryTable2_changed.txtの「A群5サンプル vs. B群5サンプル」データです。
Biological replicatesのほうは、NBPSeqパッケージに同梱されているArabidopsis(シロイヌナズナ)の「A群3サンプル vs. B群3サンプル」データです。
このパッケージは、基本的にBiological replicatesのデータを入力として想定しています。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1.デフォルト(たぶんRPM補正)の場合:
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- 5 #A群のサンプル数を指定
param2 <- 5 #B群のサンプル数を指定
param3 <- 0.01 #MA-plot描画時のp-valueの閾値を指定
#必要なパッケージなどをロード
library(NBPSeq) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データをmatrix型に変換している
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を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の中身をout_fで指定したファイル名で保存
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆる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(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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" #出力ファイル名を指定
param1 <- 5 #A群のサンプル数を指定
param2 <- 5 #B群のサンプル数を指定
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="")#発現データファイルの読み込み
data <- as.matrix(data) #データをmatrix型に変換している
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を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の中身をout_fで指定したファイル名で保存
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆる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(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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を赤色にしている
------ ここまで ------
CRANのNBPSeqのwebページ
BioconductorのedgeRのwebページ
参考文献1(Di et al., SAGMB, 2011)
参考文献2(Robinson and Oshlack, Genome Biol., 2010)
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | DESeq (Anders_2010)
参考文献1のDESeqというRパッケージをを用いて解析を行います。
ここではサンプルデータ2と3の解析例を示します。
1. サンプルデータ2のSupplementaryTable2_changed.txtの「5サンプル vs. 5サンプル」の比較:
2. サンプルデータ3のSupplementaryTable2_changed2.txtの「1 sample vs. 1 sample」の比較:
3. サンプルデータ3のSupplementaryTable2_changed2.txtの「1 sample vs. 1 sample」の比較(logratioがInfにならないよう細工):
replicatesの数に応じて単にファイル名やサンプル数を指定するところだけでなく、ばらつきを見積もるところのパラメータが変わっていますのでご注意ください。
p値の計算結果を利用する際にごく一部ですが、例えば1.2E-102などと表示すべきところを1.2e-102などとなぜか小文字にしているがためにうまくランキングできていなかった経験があります。
ROC曲線を描くときにエラーが出たりします。
この問題を回避するための一つの策は現状では「stat_DESeq <- out$padj」となっているのを「stat_DESeq <- as.numeric(toupper(out$padj))」とすることです。またNGSデータの統計量は同値(tie)が非常に多くあり、これがROCやAUCを計算する際のパッケージ間のばらつきの原因になっています。よって、順位情報に変換してからそれらの計算をするのも一つの手かなと思っています(まだ未確認です)。(2011/02/10追加)
estimateDispersionsのところのempirical dispersionを計算するためのmethodオプションの選択肢は三つ(pooled, per-condition, and blind)。
pooledはA群B群といったラベル情報に関係なく全サンプルのデータを用いて遺伝子ごとのempirical disperionを計算、per-conditionは群ごとに計算、blindは...pooledと同じ?!...よくわかりません(*_*)がno replicatesのときに使えると明記してあるので1 sample vs. 1 sample比較の場合にはこのオプションを使えばいいのだろう...。
estimateDispersionsのところのsharingModeオプションの選択肢は三つ(fit-only, maximum, and gene-est-only)。
fit-onlyはvery few replicates (2 samples vs. 2 sampleとか)、maximumはthree or four replicates (3 samples vs. 3 samplesとか)、gene-est-onlyはmany replicates(10 samples vs. 10 samplesとか)で遺伝子ごとに計算されたempirical dispersion valueが十分信頼できるような場合に用いる。(2012/03/23追加)
estimateDispersionsのところのfitTypeオプションの選択肢は2つ(parametric or local)。localがオリジナルのDESeq論文で使われていた方法。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. SupplementaryTable2_changed.txtの「5サンプル vs. 5サンプル」の比較:
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge1.txt" #出力ファイル名を指定
out_f2 <- "hoge1.png" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 0.01 #FDRの閾値を指定
param4 <- c(600, 400) #MA-plotのファイル出力時の横幅と縦幅を指定(単位はピクセル)
#必要なパッケージをロード
library(DESeq) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
RAW <- data #dataをRAWに格納
#DESeqを用いてDEGの検出を実行
cds <- newCountDataSet(data, data.cl) #おまじない(CountDataSetというクラスを作成している)
cds <- estimateSizeFactors(cds) #おまじない(サンプル間でマップされたread数が異なるのを補正するための正規化係数を計算している;いわゆるRPMの計算をしているような認識で差し支えない)
sizeFactors(cds) #計算された正規化係数を表示しているだけ
cds <- estimateDispersions(cds, method="per-condition", sharingMode="maximum", fitType="local")#DESeq本番
out <- nbinomTest(cds, 1, 2) #発現変動の各種統計量を計算し、結果をoutに格納
stat_DESeq <- out$padj #p-valueをstat_DESeqに格納
stat_DESeq <- ifelse(is.na(stat_DESeq), 1, stat_DESeq) #NAを1に置換している
rank_DESeq <- rank(stat_DESeq) #stat_DESeqでランキングした結果をrank_DESeqに格納
logratio <- out$log2FoldChange #log2(B/A)統計量をlogratioに格納
tmp <- cbind(rownames(data), data, stat_DESeq, rank_DESeq, logratio)#入力データの右側に、「stat_DESeq」、「rank_DESeq」、「log(B/A)」を結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_DESeq < param3) #param3で指定した閾値未満のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param4[1], height=param4[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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. SupplementaryTable2_changed2.txtの「1 sample vs. 1 sample」の比較:
------ ここから ------
in_f <- "SupplementaryTable2_changed2.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge2.txt" #出力ファイル名を指定
out_f2 <- "hoge2.png" #出力ファイル名を指定
param_A <- 1 #A群のサンプル数を指定
param_B <- 1 #B群のサンプル数を指定
param3 <- 0.01 #FDRの閾値を指定
param4 <- c(600, 400) #MA-plotのファイル出力時の横幅と縦幅を指定(単位はピクセル)
#必要なパッケージをロード
library(DESeq) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
RAW <- data #dataをRAWに格納
#DESeqを用いてDEGの検出を実行
cds <- newCountDataSet(data, data.cl) #おまじない(CountDataSetというクラスを作成している)
cds <- estimateSizeFactors(cds) #おまじない(サンプル間でマップされたread数が異なるのを補正するための正規化係数を計算している;いわゆるRPMの計算をしているような認識で差し支えない)
sizeFactors(cds) #計算された正規化係数を表示しているだけ
cds <- estimateDispersions(cds, method="blind", sharingMode="fit-only", fitType="local")#DESeq本番
out <- nbinomTest(cds, 1, 2) #発現変動の各種統計量を計算し、結果をoutに格納
stat_DESeq <- out$padj #p-valueをstat_DESeqに格納
stat_DESeq <- ifelse(is.na(stat_DESeq), 1, stat_DESeq) #NAを1に置換している
rank_DESeq <- rank(stat_DESeq) #stat_DESeqでランキングした結果をrank_DESeqに格納
logratio <- out$log2FoldChange #log2(B/A)統計量をlogratioに格納
tmp <- cbind(rownames(data), data, stat_DESeq, rank_DESeq, logratio)#入力データの右側に、「stat_DESeq」、「rank_DESeq」、「log(B/A)」を結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_DESeq < param3) #param3で指定した閾値未満のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param4[1], height=param4[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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. SupplementaryTable2_changed2.txtの「1 sample vs. 1 sample」の比較
片方の群の数値が0になっている場合にlogratioの値がInf or -Infになるのを防ぐため正規化後のデータで1未満の数値をを1にしてlogratioを再計算している:
------ ここから ------
in_f <- "SupplementaryTable2_changed2.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge3.txt" #出力ファイル名を指定
out_f2 <- "hoge3.png" #出力ファイル名を指定
param_A <- 1 #A群のサンプル数を指定
param_B <- 1 #B群のサンプル数を指定
param3 <- 0.01 #FDRの閾値を指定
param4 <- c(600, 400) #MA-plotのファイル出力時の横幅と縦幅を指定(単位はピクセル)
#必要なパッケージをロード
library(DESeq) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
RAW <- data #dataをRAWに格納
#DESeqを用いてDEGの検出を実行
cds <- newCountDataSet(data, data.cl) #おまじない(CountDataSetというクラスを作成している)
cds <- estimateSizeFactors(cds) #おまじない(サンプル間でマップされたread数が異なるのを補正するための正規化係数を計算している;いわゆるRPMの計算をしているような認識で差し支えない)
sizeFactors(cds) #計算された正規化係数を表示しているだけ
norm_f_DESeq <- sizeFactors(cds) #DESeq正規化係数の情報を抽出してnorm_f_DESeqに格納
cds <- estimateDispersions(cds, method="blind", sharingMode="fit-only", fitType="local")#DESeq本番
out <- nbinomTest(cds, 1, 2) #発現変動の各種統計量を計算し、結果をoutに格納
stat_DESeq <- out$padj #p-valueをstat_DESeqに格納
stat_DESeq <- ifelse(is.na(stat_DESeq), 1, stat_DESeq) #NAを1に置換している
rank_DESeq <- rank(stat_DESeq) #stat_DESeqでランキングした結果をrank_DESeqに格納
logratio1 <- out$log2FoldChange #log2(B/A)統計量をlogratio1に格納
#DESeq正規化後のデータを作成し、1未満の数値を1にしてlogratioを計算した結果をlogratio2に格納
data <- RAW #RAWをdataに格納
data_DESeq <- sweep(data, 2, 1/norm_f_DESeq, "*") #生のリードカウントデータをDESeq正規化係数で割った正規化後のデータをdata_DESeqに格納
data <- data_DESeq #data_DESeqをdataに格納
data[data < 1] <- 1 #1未満の数値を1にしている
logratio2 <- log2(data[,data.cl==2]) - log2(data[,data.cl==1]) #log2(B/A)を計算した結果をlogratio2に格納
#ファイル出力
data <- RAW #RAWをdataに格納
tmp <- cbind(rownames(data), data, stat_DESeq, rank_DESeq, logratio1, logratio2)#入力データの右側に、「stat_DESeq」、「rank_DESeq」、「logratio1」、「logratio2」を結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_DESeq < param3) #param3で指定した閾値未満のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param4[1], height=param4[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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) #発現変動遺伝子の全遺伝子数に占める割合を表示
------ ここまで ------
BioconductorのDESeqのwebページ
参考文献1(Anders and Huber, Genome Biol, 2010)
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | Fisher's exact test (FET) by DEGseq
参考文献1でも用いられたFisher's exact test (FET)という方法を用いて解析を行います。
入力ファイルは、"遺伝子発現行列"形式のものです。
ここでは、サンプルデータ1 and 2を取り扱います。
コマンドを実行して得られるhoge.txtやhoge2.txt中には、以下の情報が含まれています:
1列目:Genename情報
2列目:A群の発現量の和
3列目:B群の発現量の和
4列目:2列目と3列目の値をそのまま利用してlog ratioを計算したもの
5列目:(何をやってるのかよくわからなないが)発現レベルを正規化した後にlog ratioを計算したもの
6列目:FETを実行して得られたp値
7列目:p値から求めたFDR(Benjamini and Hochbergのやり方で計算された多重検定補正後のp値))
8列目:p値から求めたFDR(Storeyのやり方で計算された多重検定補正後のp値))
9列目:p値でランキングした結果
注意点:NGSデータは統計量として同値(equal or tie)のものが多数でてきます。ここでは同値のものは順位の平均値を出力しています。また、"NA"のものが多数ありこれらは出現順に順位がついちゃってますのでご注意ください
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. サンプルデータ1のSupplementaryTable2.txtを用いる場合:
------ ここから ------
in_f <- "SupplementaryTable2.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- c(7, 9, 12, 15, 18) #A群のサンプルが何列目にあるかを指定
param2 <- c(8, 10, 11, 13, 16) #B群のサンプルが何列目にあるかを指定
param3 <- 1 #in_f中の何列目に遺伝子名に相当する情報があるかを指定
param4 <- "FET" #方法を指定
library(DEGseq) #パッケージの読み込み
data_A <- readGeneExp(file = in_f, geneCol=param3, valCol=param1)#A群の発現データのみ抽出してdata_Aに格納している
data_B <- readGeneExp(file = in_f, geneCol=param3, valCol=param2)#B群の発現データのみ抽出してdata_Bに格納している
DEGexp(geneExpMatrix1=data_A, geneCol1=1, expCol1=2:length(param1)+1, groupLabel1="A",#以下の3行でMARSを実行している
geneExpMatrix2=data_B, geneCol2=1, expCol2=2:length(param2)+1, groupLabel2="B", #groupLabelのところでは"A"とか"B"とか書いているが特に気にしなくてよい。
method=param4, outputDir=getwd()) #このDEGexp()関数はデフォルトで「"output"というディレクトリ、"output_score.txt"、"output.html"」を出力する
tmp <- read.table("output_score.txt", header=TRUE, row.names=1, sep="\t", quote="")#上記までの手続きでoutput_score.txtというファイルが自動生成されるので、不必要な部分を削除すべくそれを読み込んでいる
out <- tmp[,1:(ncol(tmp)-1)] #output_score.txt中の最終列以外の情報を抽出して、outに格納
out <- out[data_A[,1],] #「out中の行の並び」を「in_fで指定した入力ファイル中の行の並び」に変更
rank_p <- rank(out[,5]) #p値でランキングした結果をrank_pに格納
out <- cbind(out, rank_p) #rank_pの情報もoutの右側に追加
colnames(out) <- c("sum(A)", "sum(B)", "log2(A/B)", "log2(A/B)_normalized", "p-value", "FDR(BH)", "FDR(Storey)", "rank(p-value)")#列名情報を与えている
tmp2 <- cbind(rownames(out), out) #おまじない
write.table(tmp2, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
2. サンプルデータ2のSupplementaryTable2_changed.txtを用いる場合:
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge2.txt" #出力ファイル名を指定
param1 <- 5 #A群のサンプル数を指定
param2 <- 5 #B群のサンプル数を指定
param4 <- "FET" #方法を指定
library(DEGseq) #パッケージの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data_A <- cbind(rownames(data), data[,1:param1]) #A群の発現データを抽出してdata_Aに格納している
data_B <- cbind(rownames(data), data[,(param1+1):(param1+param2)])#B群の発現データを抽出してdata_Bに格納している
data_A <- as.matrix(data_A) #データの型をmatrixとしている
data_B <- as.matrix(data_B) #データの型をmatrixとしている
DEGexp(geneExpMatrix1=data_A, geneCol1=1, expCol1=2:param1+1, groupLabel1="A",#以下の3行でMARSを実行している
geneExpMatrix2=data_B, geneCol2=1, expCol2=2:param2+1, groupLabel2="B", #groupLabelのところでは"A"とか"B"とか書いているが特に気にしなくてよい。
method=param4, outputDir=getwd()) #このDEGexp()関数はデフォルトで「"output"というディレクトリ、"output_score.txt"、"output.html"」を出力する
tmp <- read.table("output_score.txt", header=TRUE, row.names=1, sep="\t", quote="")#上記までの手続きでoutput_score.txtというファイルが自動生成されるので、不必要な部分を削除すべくそれを読み込んでいる
out <- tmp[,1:(ncol(tmp)-1)] #output_score.txt中の最終列以外の情報を抽出して、outに格納
out <- out[data_A[,1],] #「out中の行の並び」を「in_fで指定した入力ファイル中の行の並び」に変更
rank_p <- rank(out[,5]) #p値でランキングした結果をrank_pに格納
out <- cbind(out, rank_p) #rank_pの情報もoutの右側に追加
colnames(out) <- c("sum(A)", "sum(B)", "log2(A/B)", "log2(A/B)_normalized", "p-value", "FDR(BH)", "FDR(Storey)", "rank(p-value)")#列名情報を与えている
tmp2 <- cbind(rownames(out), out) #おまじない
write.table(tmp2, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
BioconductorのDEGseqのwebページ
参考文献1(Bloom et al., BMC Genomics, 2009)
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | Likelihood ratio test (LRT) by DEGseq
参考文献1で用いられたLikelihood ratio test (LRT)という方法を用いて解析を行います。
入力ファイルは、"遺伝子発現行列"形式のものです。
ここでは、サンプルデータ1 and 2を取り扱います。
コマンドを実行して得られるhoge.txtやhoge2.txt中には、以下の情報が含まれています:
1列目:Genename情報
2列目:A群の発現量の和
3列目:B群の発現量の和
4列目:2列目と3列目の値をそのまま利用してlog ratioを計算したもの
5列目:(何をやってるのかよくわからなないが)発現レベルを正規化した後にlog ratioを計算したもの
6列目:LRTを実行して得られたp値
7列目:p値から求めたFDR(Benjamini and Hochbergのやり方で計算された多重検定補正後のp値))
8列目:p値から求めたFDR(Storeyのやり方で計算された多重検定補正後のp値))
9列目:p値でランキングした結果
注意点:NGSデータは統計量として同値(equal or tie)のものが多数でてきます。ここでは同値のものは順位の平均値を出力しています。また、"NA"のものが多数ありこれらは出現順に順位がついちゃってますのでご注意ください
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. サンプルデータ1のSupplementaryTable2.txtを用いる場合:
------ ここから ------
in_f <- "SupplementaryTable2.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- c(7, 9, 12, 15, 18) #A群のサンプルが何列目にあるかを指定
param2 <- c(8, 10, 11, 13, 16) #B群のサンプルが何列目にあるかを指定
param3 <- 1 #in_f中の何列目に遺伝子名に相当する情報があるかを指定
param4 <- "LRT" #方法を指定
library(DEGseq) #パッケージの読み込み
data_A <- readGeneExp(file = in_f, geneCol=param3, valCol=param1)#A群の発現データのみ抽出してdata_Aに格納している
data_B <- readGeneExp(file = in_f, geneCol=param3, valCol=param2)#B群の発現データのみ抽出してdata_Bに格納している
DEGexp(geneExpMatrix1=data_A, geneCol1=1, expCol1=2:length(param1)+1, groupLabel1="A",#以下の3行でMARSを実行している
geneExpMatrix2=data_B, geneCol2=1, expCol2=2:length(param2)+1, groupLabel2="B", #groupLabelのところでは"A"とか"B"とか書いているが特に気にしなくてよい。
method=param4, outputDir=getwd()) #このDEGexp()関数はデフォルトで「"output"というディレクトリ、"output_score.txt"、"output.html"」を出力する
tmp <- read.table("output_score.txt", header=TRUE, row.names=1, sep="\t", quote="")#上記までの手続きでoutput_score.txtというファイルが自動生成されるので、不必要な部分を削除すべくそれを読み込んでいる
out <- tmp[,1:(ncol(tmp)-1)] #output_score.txt中の最終列以外の情報を抽出して、outに格納
out <- out[data_A[,1],] #「out中の行の並び」を「in_fで指定した入力ファイル中の行の並び」に変更
rank_p <- rank(out[,5]) #p値でランキングした結果をrank_pに格納
out <- cbind(out, rank_p) #rank_pの情報もoutの右側に追加
colnames(out) <- c("sum(A)", "sum(B)", "log2(A/B)", "log2(A/B)_normalized", "p-value", "FDR(BH)", "FDR(Storey)", "rank(p-value)")#列名情報を与えている
tmp2 <- cbind(rownames(out), out) #おまじない
write.table(tmp2, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
2. サンプルデータ2のSupplementaryTable2_changed.txtを用いる場合:
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge2.txt" #出力ファイル名を指定
param1 <- 5 #A群のサンプル数を指定
param2 <- 5 #B群のサンプル数を指定
param4 <- "LRT" #方法を指定
library(DEGseq) #パッケージの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data_A <- cbind(rownames(data), data[,1:param1]) #A群の発現データを抽出してdata_Aに格納している
data_B <- cbind(rownames(data), data[,(param1+1):(param1+param2)])#B群の発現データを抽出してdata_Bに格納している
data_A <- as.matrix(data_A) #データの型をmatrixとしている
data_B <- as.matrix(data_B) #データの型をmatrixとしている
DEGexp(geneExpMatrix1=data_A, geneCol1=1, expCol1=2:param1+1, groupLabel1="A",#以下の3行でMARSを実行している
geneExpMatrix2=data_B, geneCol2=1, expCol2=2:param2+1, groupLabel2="B", #groupLabelのところでは"A"とか"B"とか書いているが特に気にしなくてよい。
method=param4, outputDir=getwd()) #このDEGexp()関数はデフォルトで「"output"というディレクトリ、"output_score.txt"、"output.html"」を出力する
tmp <- read.table("output_score.txt", header=TRUE, row.names=1, sep="\t", quote="")#上記までの手続きでoutput_score.txtというファイルが自動生成されるので、不必要な部分を削除すべくそれを読み込んでいる
out <- tmp[,1:(ncol(tmp)-1)] #output_score.txt中の最終列以外の情報を抽出して、outに格納
out <- out[data_A[,1],] #「out中の行の並び」を「in_fで指定した入力ファイル中の行の並び」に変更
rank_p <- rank(out[,5]) #p値でランキングした結果をrank_pに格納
out <- cbind(out, rank_p) #rank_pの情報もoutの右側に追加
colnames(out) <- c("sum(A)", "sum(B)", "log2(A/B)", "log2(A/B)_normalized", "p-value", "FDR(BH)", "FDR(Storey)", "rank(p-value)")#列名情報を与えている
tmp2 <- cbind(rownames(out), out) #おまじない
write.table(tmp2, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
BioconductorのDEGseqのwebページ
参考文献1(Marioni et al., Genome Res., 2008)
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | Fold change (FC) by DEGseq
ごく一般的なで用いられたFold change (FC)を用いて解析を行います。
入力ファイルは、"遺伝子発現行列"形式のものです。
ここでは、サンプルデータ1 and 2を取り扱います。
コマンドを実行して得られるhoge.txtやhoge2.txt中には、以下の情報が含まれています:
1列目:Genename情報
2列目:A群の発現量の和
3列目:B群の発現量の和
4列目:2列目と3列目の値をそのまま利用してlog ratioを計算したもの
5列目:(何をやってるのかよくわからなないが)発現レベルを正規化した後にlog ratioを計算したもの
6列目:5列目の絶対値でランキングした結果
注意点:NGSデータは統計量として同値(equal or tie)のものが多数でてきます。ここでは同値のものは順位の平均値を出力しています。また、"NA"のものが多数ありこれらは出現順に順位がついちゃってますのでご注意ください。
さらに、(よくNGSの論文で議論されていることですが)A, Bどちらかの群で"0"があると無限大になるため以下のやり方だとちゃんと?!ランキングできていないことがわかります。。。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. サンプルデータ1のSupplementaryTable2.txtを用いる場合:
------ ここから ------
in_f <- "SupplementaryTable2.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- c(7, 9, 12, 15, 18) #A群のサンプルが何列目にあるかを指定
param2 <- c(8, 10, 11, 13, 16) #B群のサンプルが何列目にあるかを指定
param3 <- 1 #in_f中の何列目に遺伝子名に相当する情報があるかを指定
param4 <- "FC" #方法を指定
library(DEGseq) #パッケージの読み込み
data_A <- readGeneExp(file = in_f, geneCol=param3, valCol=param1)#A群の発現データのみ抽出してdata_Aに格納している
data_B <- readGeneExp(file = in_f, geneCol=param3, valCol=param2)#B群の発現データのみ抽出してdata_Bに格納している
DEGexp(geneExpMatrix1=data_A, geneCol1=1, expCol1=2:length(param1)+1, groupLabel1="A",#以下の3行でMARSを実行している
geneExpMatrix2=data_B, geneCol2=1, expCol2=2:length(param2)+1, groupLabel2="B", #groupLabelのところでは"A"とか"B"とか書いているが特に気にしなくてよい。
method=param4, outputDir=getwd()) #このDEGexp()関数はデフォルトで「"output"というディレクトリ、"output_score.txt"、"output.html"」を出力する
tmp <- read.table("output_score.txt", header=TRUE, row.names=1, sep="\t", quote="")#上記までの手続きでoutput_score.txtというファイルが自動生成されるので、不必要な部分を削除すべくそれを読み込んでいる
out <- tmp[,1:(ncol(tmp)-1)] #output_score.txt中の最終列以外の情報を抽出して、outに格納
out <- out[data_A[,1],] #「out中の行の並び」を「in_fで指定した入力ファイル中の行の並び」に変更
rank_FC <- rank(-abs(out[,4])) #「正規化後のlog(FC)」の絶対値でランキングした結果をrank_FCに格納
out <- cbind(out, rank_FC) #rank_FCの情報もoutの右側に追加
colnames(out) <- c("sum(A)", "sum(B)", "log2(A/B)", "log2(A/B)_normalized", "rank(log2(A/B)_normalized)")#列名情報を与えている
tmp2 <- cbind(rownames(out), out) #おまじない
write.table(tmp2, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
2. サンプルデータ2のSupplementaryTable2_changed.txtを用いる場合:
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge2.txt" #出力ファイル名を指定
param1 <- 5 #A群のサンプル数を指定
param2 <- 5 #B群のサンプル数を指定
param4 <- "FC" #方法を指定
library(DEGseq) #パッケージの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data_A <- cbind(rownames(data), data[,1:param1]) #A群の発現データを抽出してdata_Aに格納している
data_B <- cbind(rownames(data), data[,(param1+1):(param1+param2)])#B群の発現データを抽出してdata_Bに格納している
data_A <- as.matrix(data_A) #データの型をmatrixとしている
data_B <- as.matrix(data_B) #データの型をmatrixとしている
DEGexp(geneExpMatrix1=data_A, geneCol1=1, expCol1=2:param1+1, groupLabel1="A",#以下の3行でMARSを実行している
geneExpMatrix2=data_B, geneCol2=1, expCol2=2:param2+1, groupLabel2="B", #groupLabelのところでは"A"とか"B"とか書いているが特に気にしなくてよい。
method=param4, outputDir=getwd()) #このDEGexp()関数はデフォルトで「"output"というディレクトリ、"output_score.txt"、"output.html"」を出力する
tmp <- read.table("output_score.txt", header=TRUE, row.names=1, sep="\t", quote="")#上記までの手続きでoutput_score.txtというファイルが自動生成されるので、不必要な部分を削除すべくそれを読み込んでいる
out <- tmp[,1:(ncol(tmp)-1)] #output_score.txt中の最終列以外の情報を抽出して、outに格納
out <- out[data_A[,1],] #「out中の行の並び」を「in_fで指定した入力ファイル中の行の並び」に変更
rank_FC <- rank(-abs(out[,4])) #「正規化後のlog(FC)」の絶対値でランキングした結果をrank_FCに格納
out <- cbind(out, rank_FC) #rank_FCの情報もoutの右側に追加
colnames(out) <- c("sum(A)", "sum(B)", "log2(A/B)", "log2(A/B)_normalized", "rank(log2(A/B)_normalized)")#列名情報を与えている
tmp2 <- cbind(rownames(out), out) #おまじない
write.table(tmp2, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
BioconductorのDEGseqのwebページ
参考文献2(Marioni et al., Genome Res., 2008)
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | MARS (Wang_2010) by DEGseq
参考文献1で提案されているMARS (MA-plot-based method with Random Sampling model)という方法を用いて解析を行います。
入力ファイルは、"遺伝子発現行列"形式のものです。
ここでは、サンプルデータ1 and 2を取り扱います。
コマンドを実行して得られるhoge.txtやhoge2.txt中には、以下の情報が含まれています:
1列目:Genename情報
2列目:A群の発現量の和
3列目:B群の発現量の和
4列目:2列目と3列目の値をそのまま利用してlog ratioを計算したもの
5列目:(何をやってるのかよくわからなないが)発現レベルを正規化した後にlog ratioを計算したもの
6列目:Zスコア(絶対値が大きいほどより発現変動していることを意味する。また、5列目の補正後のlog ratioの絶対値が低くても2列目や3列目が全体として大きな値であればZスコアは高くなる)
7列目:Zスコアから求めたp値(Zスコアの絶対値が大きいほどp値は低くなる)
8列目:p値から求めたFDR(Benjamini and Hochbergのやり方で計算された多重検定補正後のp値))
9列目:p値から求めたFDR(Storeyのやり方で計算された多重検定補正後のp値))
10列目:Zスコアから計算された発現変動の度合いでランキングした結果
注意点:NGSデータは統計量として同値(equal or tie)のものが多数でてきます。ここでは同値のものは順位の平均値を出力しています。また、"NA"のものが多数ありこれらは出現順に順位がついちゃってますのでご注意ください
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. サンプルデータ1のSupplementaryTable2.txtを用いる場合:
------ ここから ------
in_f <- "SupplementaryTable2.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge.txt" #出力ファイル名を指定
param1 <- c(7, 9, 12, 15, 18) #A群のサンプルが何列目にあるかを指定
param2 <- c(8, 10, 11, 13, 16) #B群のサンプルが何列目にあるかを指定
param3 <- 1 #in_f中の何列目に遺伝子名に相当する情報があるかを指定
param4 <- "MARS" #方法を指定
library(DEGseq) #パッケージの読み込み
data_A <- readGeneExp(file = in_f, geneCol=param3, valCol=param1)#A群の発現データのみ抽出してdata_Aに格納している
data_B <- readGeneExp(file = in_f, geneCol=param3, valCol=param2)#B群の発現データのみ抽出してdata_Bに格納している
DEGexp(geneExpMatrix1=data_A, geneCol1=1, expCol1=2:length(param1)+1, groupLabel1="A",#以下の3行でMARSを実行している
geneExpMatrix2=data_B, geneCol2=1, expCol2=2:length(param2)+1, groupLabel2="B", #groupLabelのところでは"A"とか"B"とか書いているが特に気にしなくてよい。
method=param4, outputDir=getwd()) #このDEGexp()関数はデフォルトで「"output"というディレクトリ、"output_score.txt"、"output.html"」を出力する
tmp <- read.table("output_score.txt", header=TRUE, row.names=1, sep="\t", quote="")#上記までの手続きでoutput_score.txtというファイルが自動生成されるので、不必要な部分を削除すべくそれを読み込んでいる
out <- tmp[,1:(ncol(tmp)-1)] #output_score.txt中の最終列以外の情報を抽出して、outに格納
out <- out[data_A[,1],] #「out中の行の並び」を「in_fで指定した入力ファイル中の行の並び」に変更
rank_Z <- rank(-abs(out[,5])) #Zスコアの絶対値でランキングした結果をrank_Zに格納
out <- cbind(out, rank_Z) #rank_Zの情報もoutの右側に追加
colnames(out) <- c("sum(A)", "sum(B)", "log2(A/B)", "log2(A/B)_normalized", "z-score", "p-value", "FDR(BH)", "FDR(Storey)", "rank(z-score)")#列名情報を与えている
tmp2 <- cbind(rownames(out), out) #おまじない
write.table(tmp2, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
2. サンプルデータ2のSupplementaryTable2_changed.txtを用いる場合:
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge2.txt" #出力ファイル名を指定
param1 <- 5 #A群のサンプル数を指定
param2 <- 5 #B群のサンプル数を指定
param4 <- "MARS" #方法を指定
library(DEGseq) #パッケージの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data_A <- cbind(rownames(data), data[,1:param1]) #A群の発現データを抽出してdata_Aに格納している
data_B <- cbind(rownames(data), data[,(param1+1):(param1+param2)])#B群の発現データを抽出してdata_Bに格納している
data_A <- as.matrix(data_A) #データの型をmatrixとしている
data_B <- as.matrix(data_B) #データの型をmatrixとしている
DEGexp(geneExpMatrix1=data_A, geneCol1=1, expCol1=2:param1+1, groupLabel1="A",#以下の3行でMARSを実行している
geneExpMatrix2=data_B, geneCol2=1, expCol2=2:param2+1, groupLabel2="B", #groupLabelのところでは"A"とか"B"とか書いているが特に気にしなくてよい。
method=param4, outputDir=getwd()) #このDEGexp()関数はデフォルトで「"output"というディレクトリ、"output_score.txt"、"output.html"」を出力する
tmp <- read.table("output_score.txt", header=TRUE, row.names=1, sep="\t", quote="")#上記までの手続きでoutput_score.txtというファイルが自動生成されるので、不必要な部分を削除すべくそれを読み込んでいる
out <- tmp[,1:(ncol(tmp)-1)] #output_score.txt中の最終列以外の情報を抽出して、outに格納
out <- out[data_A[,1],] #「out中の行の並び」を「in_fで指定した入力ファイル中の行の並び」に変更
rank_Z <- rank(-abs(out[,5])) #Zスコアの絶対値でランキングした結果をrank_Zに格納
out <- cbind(out, rank_Z) #rank_Zの情報もoutの右側に追加
colnames(out) <- c("sum(A)", "sum(B)", "log2(A/B)", "log2(A/B)_normalized", "z-score", "p-value", "FDR(BH)", "FDR(Storey)", "rank(z-score)")#列名情報を与えている
tmp2 <- cbind(rownames(out), out) #おまじない
write.table(tmp2, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
BioconductorのDEGseqのwebページ
参考文献1(Wang et al., Bioinformatics, 2010)
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | edgeR (Robinson_2010)
2011/12/26にDispersionの計算方法をcommon dispersionからtag-wise dispersionに変更しました。ご注意ください。
参考文献1のedgeRパッケージを用いて解析を行います。参考文献1自体はRのパッケージに関する論文で、参考文献3, 4の方法(経験ベイズ; empirical Bayes)を実装したものです。
(おそらくedgeRの論文が受理された後にTMM法に関する論文が受理されたために、少なくとも)edgeRパッケージの使用例中ではTMM法で得られた正規化係数(normalization factor)をどのように組み込むかについては明示されていませんが、ここで示した位置に組み込めばいいです。
また、参考文献1と5では、TMM法開発のモチベーションとなった偏りのあるデータセットでの計算例が示されていますが、このような極端な例でなくても常にTMM法(ここではcalcNormFactors関数)を適用しても問題ありません。
なぜなら極端でない場合はTMM法で得られた正規化係数は1に近い値となるので結果として計算結果に与える影響がごくわずかとなるからです。
入力ファイルは、"遺伝子発現行列"形式のものです。
ここでは、サンプルデータ2 (つまりSupplementaryTable2_changed.txt)を取り扱います。
ここで記述している「estimateCommonDisp関数やestimateTagwiseDisp関数を用いて解析を行う手続き」は"single factor"の実験デザインの場合です。multi-factorの場合はedgeR中の"GLM" というやり方で行うそうです(参考文献6)。(2012/08/28追加)
edgeR ver. 3.0.0(2012/10/01)ではestimateTagwiseDisp関数のオプションが変わっていたので、ここの記述も「prop.used=0.5, grid.length=500」の部分を削除しました。(2012/10/24)
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. 基本形
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge1.txt" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
#必要なパッケージなどをロード
library(DEGseq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データの型をmatrixにしている
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#edgeRを用いてDEGの検出を実行
d <- DGEList(counts=data, group=data.cl) #DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d) #TMM正規化(参考文献5)を実行
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に格納
stat_edgeR <- p.adjust(out$table$PValue, method="BH") #False Discovery Rate (FDR)を計算し、結果をstat_edgeRに格納
tmp <- cbind(rownames(data), data, out$table, stat_edgeR) #入力データの右側に、「logConc (M-A plotのAに相当するもの;全体的な発現レベルに相当)」、「logFC (M-A plotのMに相当するもの;いわゆるlog ratioと同じもの)」、「p値」、「(Benjamini and Hochbergの方法で計算した)FDR値」を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
------ ここまで ------
2. MA-plotも描く場合
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge2.txt" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
#必要なパッケージなどをロード
library(DEGseq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データの型をmatrixにしている
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#edgeRを用いてDEGの検出を実行
d <- DGEList(counts=data, group=data.cl) #DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d) #TMM正規化(参考文献5)を実行
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に格納
stat_edgeR <- p.adjust(out$table$PValue, method="BH") #False Discovery Rate (FDR)を計算し、結果をstat_edgeRに格納
tmp <- cbind(rownames(data), data, out$table, stat_edgeR) #入力データの右側に、「logConc (M-A plotのAに相当するもの;全体的な発現レベルに相当)」、「logFC (M-A plotのMに相当するもの;いわゆるlog ratioと同じもの)」、「p値」、「(Benjamini and Hochbergの方法で計算した)FDR値」を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
#MA-plotを描画
plotSmear(d) #MA-plotの基本形(縦軸(M):log-ratio, 横軸(A):全体的な発現レベル)
------ ここまで ------
3. MA-plotも描く場合(FDR < 0.05を満たすものを赤色で示す)
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge3.txt" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 0.05 #MA-plot描画時のFDRの閾値を指定
#必要なパッケージなどをロード
library(DEGseq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データの型をmatrixにしている
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#edgeRを用いてDEGの検出を実行
d <- DGEList(counts=data, group=data.cl) #DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d) #TMM正規化(参考文献5)を実行
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に格納
stat_edgeR <- p.adjust(out$table$PValue, method="BH") #False Discovery Rate (FDR)を計算し、結果をstat_edgeRに格納
tmp <- cbind(rownames(data), data, out$table, stat_edgeR) #入力データの右側に、「logConc (M-A plotのAに相当するもの;全体的な発現レベルに相当)」、「logFC (M-A plotのMに相当するもの;いわゆるlog ratioと同じもの)」、「p値」、「(Benjamini and Hochbergの方法で計算した)FDR値」を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
#MA-plotを描画
obj <- rownames(data)[stat_edgeR < param3] #param3で指定したFDRの閾値を満たす遺伝子名情報をobjに格納
plotSmear(d, de.tags=obj) #MA-plotの基本形に加え、発現変動遺伝子に相当する
length(obj) #発現変動遺伝子数を表示
length(obj)/nrow(data) #発現変動遺伝子の全遺伝子数に占める割合を表示
------ ここまで ------
4. MA-plotも描く場合(FDR値で発現変動順に並べた上位300個を赤色で示す)
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge4.txt" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 300 #MA-plot描画時の赤色で示す上位遺伝子数の閾値を指定
#必要なパッケージなどをロード
library(DEGseq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データの型をmatrixにしている
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#edgeRを用いてDEGの検出を実行
d <- DGEList(counts=data, group=data.cl) #DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d) #TMM正規化(参考文献5)を実行
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に格納
stat_edgeR <- p.adjust(out$table$PValue, method="BH") #False Discovery Rate (FDR)を計算し、結果をstat_edgeRに格納
tmp <- cbind(rownames(data), data, out$table, stat_edgeR) #入力データの右側に、「logConc (M-A plotのAに相当するもの;全体的な発現レベルに相当)」、「logFC (M-A plotのMに相当するもの;いわゆるlog ratioと同じもの)」、「p値」、「(Benjamini and Hochbergの方法で計算した)FDR値」を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
#MA-plotを描画
obj <- rownames(data)[rank(stat_edgeR) <= param3] #param3で指定した個数の上位遺伝子の遺伝子名情報をobjに格納
plotSmear(d, de.tags=obj) #MA-plotの基本形に加え、発現変動遺伝子に相当する
length(obj) #発現変動遺伝子数を表示
length(obj)/nrow(data) #発現変動遺伝子の全遺伝子数に占める割合を表示
------ ここまで ------
5. MA-plotも描く場合(2倍以上発現変化しているものを赤色で示す)
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f <- "hoge5.txt" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 2 #MA-plot描画時の倍率変化の閾値を指定
#必要なパッケージなどをロード
library(DEGseq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データの型をmatrixにしている
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#edgeRを用いてDEGの検出を実行
d <- DGEList(counts=data, group=data.cl) #DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d) #TMM正規化(参考文献5)を実行
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に格納
stat_edgeR <- p.adjust(out$table$PValue, method="BH") #False Discovery Rate (FDR)を計算し、結果をstat_edgeRに格納
tmp <- cbind(rownames(data), data, out$table, stat_edgeR) #入力データの右側に、「logConc (M-A plotのAに相当するもの;全体的な発現レベルに相当)」、「logFC (M-A plotのMに相当するもの;いわゆるlog ratioと同じもの)」、「p値」、「(Benjamini and Hochbergの方法で計算した)FDR値」を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
#MA-plotを描画
obj <- rownames(data)[abs(out$table$logFC) >= log2(param3)] #param3で指定した倍率変化の閾値を満たす遺伝子名情報をobjに格納
plotSmear(d, de.tags=obj) #MA-plotの基本形に加え、発現変動遺伝子に相当する
length(obj) #発現変動遺伝子数を表示
length(obj)/nrow(data) #発現変動遺伝子の全遺伝子数に占める割合を表示
------ ここまで ------
6. MA-plotも描く場合(5.のMA-plotで大きさを指定してpng形式ファイルに保存したいとき)
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge6.txt" #出力ファイル名を指定
out_f2 <- "hoge6.png" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 2 #MA-plot描画時の倍率変化の閾値を指定
param4 <- c(600, 400) #MA-plotのファイル出力時の横幅(単位はピクセル)と縦幅を指定
#必要なパッケージなどをロード
library(DEGseq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データの型をmatrixにしている
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#edgeRを用いてDEGの検出を実行
d <- DGEList(counts=data, group=data.cl) #DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d) #TMM正規化(参考文献5)を実行
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に格納
stat_edgeR <- p.adjust(out$table$PValue, method="BH") #False Discovery Rate (FDR)を計算し、結果をstat_edgeRに格納
tmp <- cbind(rownames(data), data, out$table, stat_edgeR) #入力データの右側に、「logConc (M-A plotのAに相当するもの;全体的な発現レベルに相当)」、「logFC (M-A plotのMに相当するもの;いわゆるlog ratioと同じもの)」、「p値」、「(Benjamini and Hochbergの方法で計算した)FDR値」を結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
#MA-plotを描画
png(out_f2, width=param4[1], height=param4[2]) #出力ファイルの各種パラメータを指定
obj <- rownames(data)[abs(out$table$logFC) >= log2(param3)] #param3で指定した倍率変化の閾値を満たす遺伝子名情報をobjに格納
plotSmear(d, de.tags=obj) #MA-plotの基本形に加え、発現変動遺伝子に相当する
dev.off() #おまじない
length(obj) #発現変動遺伝子数を表示
length(obj)/nrow(data) #発現変動遺伝子の全遺伝子数に占める割合を表示
------ ここまで ------
7. MA-plotも描く場合(FDR < 0.01を満たすものを赤色で示したMA-plotをファイルに保存)
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge7.txt" #出力ファイル名を指定
out_f2 <- "hoge7.png" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 0.01 #MA-plot描画時のFDRの閾値を指定
param4 <- c(600, 400) #MA-plotのファイル出力時の横幅(単位はピクセル)と縦幅を指定
#必要なパッケージなどをロード
library(DEGseq) #パッケージの読み込み
library(edgeR) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データの型をmatrixにしている
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#edgeRを用いてDEGの検出を実行
d <- DGEList(counts=data, group=data.cl) #DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d) #TMM正規化(参考文献5)を実行
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に格納
stat_edgeR <- p.adjust(out$table$PValue, method="BH") #False Discovery Rate (FDR)を計算し、結果をstat_edgeRに格納
rank_edgeR <- rank(stat_edgeR) #FDR値でランキングした結果をrank_edgeRに格納
hoge <- cbind(rownames(data), data, out$table, stat_edgeR, rank_edgeR) #入力データの右側に、「logConc (M-A plotのAに相当するもの;全体的な発現レベルに相当)」、「logFC (M-A plotのMに相当するもの;いわゆるlog ratioと同じもの)」、「p値」、「(Benjamini and Hochbergの方法で計算した)FDR値」、「順位」を結合した結果をhogeに格納
tmp <- hoge[order(rank_edgeR),] #発現変動の度合いでソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
#MA-plotを描画
png(out_f2, width=param4[1], height=param4[2]) #出力ファイルの各種パラメータを指定
obj <- rownames(data)[stat_edgeR < param3] #param3で指定したFDRの閾値を満たす遺伝子名情報をobjに格納
plotSmear(d, de.tags=obj) #MA-plotの基本形に加え、発現変動遺伝子に相当する
dev.off() #おまじない
#おまけ
length(obj) #発現変動遺伝子数を表示
length(obj)/nrow(data) #発現変動遺伝子の全遺伝子数に占める割合を表示
------ ここまで ------
8. MA-plotも描く場合(基本は7と同じで、MA-plotの描画をplotSmear関数を用いないで行うやり方)
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge8.txt" #出力ファイル名を指定
out_f2 <- "hoge8.png" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 0.01 #MA-plot描画時のFDRの閾値を指定
param4 <- c(600, 400) #MA-plotのファイル出力時の横幅(単位はピクセル)と縦幅を指定
#必要なパッケージなどをロード
library(edgeR) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データの型をmatrixにしている
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
RAW <- data #dataをRAWに格納
#edgeRを用いてDEGの検出を実行
d <- DGEList(counts=data, group=data.cl) #DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d) #TMM正規化(参考文献5)を実行
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に格納
stat_edgeR <- p.adjust(out$table$PValue, method="BH") #False Discovery Rate (FDR)を計算し、結果をstat_edgeRに格納
rank_edgeR <- rank(stat_edgeR) #FDR値でランキングした結果をrank_edgeRに格納
hoge <- cbind(rownames(data), data, out$table, stat_edgeR, rank_edgeR) #入力データの右側に、「logConc (M-A plotのAに相当するもの;全体的な発現レベルに相当)」、「logFC (M-A plotのMに相当するもの;いわゆるlog ratioと同じもの)」、「p値」、「(Benjamini and Hochbergの方法で計算した)FDR値」、「順位」を結合した結果をhogeに格納
tmp <- hoge[order(rank_edgeR),] #発現変動の度合いでソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
#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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_edgeR < param3) #param3で指定した閾値未満のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param4[1], height=param4[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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. MA-plotも描く場合(基本は8と同じで、MA-plotの描画をRPMではなくTMM正規化後のデータで行うやり方)
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
out_f1 <- "hoge9.txt" #出力ファイル名を指定
out_f2 <- "hoge9.png" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 0.01 #MA-plot描画時のFDRの閾値を指定
param4 <- c(600, 400) #MA-plotのファイル出力時の横幅(単位はピクセル)と縦幅を指定
#必要なパッケージなどをロード
library(edgeR) #パッケージの読み込み
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data <- as.matrix(data) #データの型をmatrixにしている
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
RAW <- data #dataをRAWに格納
#edgeRを用いてDEGの検出を実行
d <- DGEList(counts=data, group=data.cl) #DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d) #TMM正規化(参考文献5)を実行
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に格納
stat_edgeR <- p.adjust(out$table$PValue, method="BH") #False Discovery Rate (FDR)を計算し、結果をstat_edgeRに格納
rank_edgeR <- rank(stat_edgeR) #FDR値でランキングした結果をrank_edgeRに格納
hoge <- cbind(rownames(data), data, out$table, stat_edgeR, rank_edgeR) #入力データの右側に、「logConc (M-A plotのAに相当するもの;全体的な発現レベルに相当)」、「logFC (M-A plotのMに相当するもの;いわゆるlog ratioと同じもの)」、「p値」、「(Benjamini and Hochbergの方法で計算した)FDR値」、「順位」を結合した結果をhogeに格納
tmp <- hoge[order(rank_edgeR),] #発現変動の度合いでソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存。
#RPM正規化後のデータでM-A plotを描画(するための基礎情報取得)
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に格納
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に格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_edgeR < param3) #param3で指定した閾値未満のものの位置情報をDEG_posiに格納
#MA-plotを描画(本番)
png(out_f2, width=param4[1], height=param4[2]) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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) #発現変動遺伝子の全遺伝子数に占める割合を表示
------ ここまで ------
BioconductorのedgeRのwebページ
参考文献1(Robinson et al., Bioinformatics, 2010)
参考文献3(Robinson and Smyth, Bioinformatics, 2007)
参考文献4(Robinson and Smyth, Biostatistics, 2008)
参考文献5(Robinson and Oshlack, Genome Biol., 2010)
参考文献6(McCarthy et al., Nucleic Acids Res., 2012)
参考文献5のsupplementary materialsのwebsite
解析 | NGS(RNA-seq) | 発現変動エクソン | 二群間 | DEXSeq
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
------ ここまで ------
DEXSeq:Anders et al., Genome Res., 2012
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 時系列データ | Bayesian model-based clustering (Nascimento_2012)
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
------ ここまで ------
Rコードのあるウェブサイト
参考文献1(Nascimento et al., Bioinformatics, 2012)
NGS(RNA-seq) | 選択的スプライシング | Solas (Richard_2010)
alternative isoformsの予測や定量化を行ってくれるRパッケージのようです。
選択的スプライシング(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 exonsの予測」や「alternative splice formsの定量化」を、二つのサンプルを入力として与えた場合には、「differential alternative exonsの予測」をしてくれるようです。これら三つの予測はそれぞれCell type-specific Alternative uSage Index (CASI), PrOportion EstiMation (POEM), and Differential Alternative uSage Index (DASI)という提案手法で行うようです。
Solasのwebページ
参考文献1(Richard et al., Nucleic Acids Res., 2010)
NGS(RNA-seq) | Gene Ontology解析 | Gao's method (Gao_2011)
配列長補正を行って遺伝子オントロジー(Gene Ontology; GO)解析を行うためのRパッケージです。
原著論文では、遺伝子レベルで配列長補正を行うやり方と、遺伝子セットレベルで配列長補正を行うやり方の二つが提案されています。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
------ ここまで ------
Rスクリプトのwebページ
Gao et al., Bioinformatics, 2011
NGS(RNA-seq) | Gene Ontology解析 | GOseq (Young_2010)
配列長補正を行って遺伝子オントロジー(Gene Ontology; GO)解析を行うためのRパッケージです。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
------ ここまで ------
Bioconductorのgoseqのwebページ
Young et al., Genome Biol., 2010
解析 | NGS(ChIP-seq) | について
私はこのあたりはほとんどノータッチですが、一応見かけた論文をリストアップする程度はしておきます。
PeakSeq法:Rozowsky et al., Nat Biotechnol., 2009
CSAR:Kaufmann et al., PLoS Biol., 2009
ChIPpeakAnno:Zhu et al., BMC Bioinformatics, 2010
解析 | NGS(ChIP-seq) | DiffBind
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
library(DiffBind) #パッケージの読み込み
------ ここまで ------
BioconductorのDiffBindのwebページ
解析 | NGS(ChIP-seq) | ChIPseqR
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
library(ChIPseqR) #パッケージの読み込み
------ ここまで ------
BioconductorのChIPseqRのwebページ
解析 | NGS(ChIP-seq) | chipseq
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
library(chipseq) #パッケージの読み込み
------ ここまで ------
Bioconductorのchipseqのwebページ
解析 | NGS(ChIP-seq) | PICS (Zhang_2011)
参考文献1のRパッケージです。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
library(PICS) #パッケージの読み込み
------ ここまで ------
BioconductorのPICSのwebページ
参考文献1(Zhang et al., Biometrics, 2011)
解析 | NGS(ChIP-seq) | ChIPpeakAnno (Zhu_2010)
参考文献1のRパッケージです。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
library(ChIPpeakAnno) #パッケージの読み込み
------ ここまで ------
BioconductorのChIPpeakAnnoのwebページ
参考文献1(Zhu et al., BMC Bioinformatics, 2010)
解析 | NGS(ChIP-seq) | rMAT (Droit_2010)
参考文献1で用いられた方法だそうです。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
library(rMAT) #パッケージの読み込み
------ ここまで ------
BioconductorのrMATのwebページ
参考文献1(Droit et al., Bioinformatics, 2010)
解析 | NGS(ChIP-seq) | CSAR (Kaufmann_2009)
参考文献1で用いられた方法だそうです。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
library(CSAR) #パッケージの読み込み
------ ここまで ------
BioconductorのCSARのwebページ
参考文献1(Kaufmann et al., PLoS Biol., 2009)
解析 | NGS(ChIP-seq) | ChIPsim (Zhang_2008)
参考文献1のRパッケージです。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
library(ChIPsim) #パッケージの読み込み
------ ここまで ------
BioconductorのChIPsimのwebページ
参考文献1(Zhang et al., PLoS Comput. Biol., 2008)
解析 | NGS(ChIP-seq) | 新規モチーフ | rGADEM (Li_2009)
参考文献1の方法のRパッケージ版です。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
library(rGADEM) #パッケージの読み込み
------ ここまで ------
BioconductorのrGADEMのwebページ
参考文献1(Li L, J. Comput. Biol., 2009)
解析 | NGS | 長距離ゲノム間相互作用の検出 | r3Cseq (Thongjuea_201X)
chromosome conformation captureに伴う長距離ゲノム間相互作用(long-range genomic interactions)を検出するためのRパッケージだそうです。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
library(r3Cseq) #パッケージの読み込み
------ ここまで ------
Bioconductorのr3Cseqのwebページ
解析 | NGS | 制限酵素切断部位(RECS)地図 | REDseq (Zhu_201X)
制限酵素消化(restriction enzyme digestion; RED)でアプローチ可能なところと不可能なところを区別できるとうれしいようです。
この制限酵素認識部位を調べるためのRパッケージだそうです。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
library(REDseq) #パッケージの読み込み
------ ここまで ------
BioconductorのREDseqのwebページ
参考文献1(Zhu et al., 準備中だそうで)
解析 | NGS(small RNA) | segmentSeq (Hardcastle_submitted)
HardcastleらのRパッケージです。ゲノム上のsmall RNA (miRNA or micro RNA)が結合?!する場所を探してくれるようです。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
library(segmentSeq) #パッケージの読み込み
------ ここまで ------
BioconductorのsegmentSeqのwebページ
参考文献1(Hardcastle et al., Bioinformatics, Dec. 6, 2011 accepted)
作図 | について
ggplot2という美しい図を作成できるパッケージが存在します。私自身はまだ使ったことがありませんが、デフォルトの作図で気に入らない方は是非お試しください。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
library(ggplot2) #パッケージの読み込み
------ ここまで ------
作図 | M-A plot
マイクロアレイ解析のときにもよく見かけましたが、NGSデータでもデータの分布を示す目的などで用いられます。
解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | DESeq (Anders_2010)中でもM-A plotの描画法を示していますが、
ここではサンプルデータ2のSupplementaryTable2_changed.txtの
「A群 5サンプル vs. B群 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_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#M-A plot本番
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 600 #横幅(単位はピクセル)を指定
param4 <- 400 #縦幅(単位はピクセル)を指定
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#M-A plot本番
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
png(out_f, width=param3, height=param4) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 600 #横幅(単位はピクセル)を指定
param4 <- 400 #縦幅(単位はピクセル)を指定
param5 <- c(-5, 5) #y軸の任意の範囲を指定
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#M-A plot本番
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
png(out_f, width=param3, height=param4) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 600 #横幅(単位はピクセル)を指定
param4 <- 400 #縦幅(単位はピクセル)を指定
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="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#M-A plot本番
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
png(out_f, width=param3, height=param4) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 600 #横幅(単位はピクセル)を指定
param4 <- 400 #縦幅(単位はピクセル)を指定
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="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#M-A plot本番
obj <- is.element(rownames(data), param8) #param8で指定したIDの位置情報をobjに格納
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
png(out_f, width=param3, height=param4) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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%))を駆使することは非常に大事です:
a) 一つのgene symbolが複数のEnsembl Gene IDsに対応することがよくある。
b) BioMartなどから取得したIDの対応関係情報を含むアノテーションファイル(ens_gene_48.txt)中に、原著論文で言及されparam8で指定したgene symbolsが存在しない。
c) 読み込んだ発現データファイル中にはあるがアノテーションファイル中には存在しないIDがある。
------ ここから ------
in_f1 <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_f1に格納
in_f2 <- "ens_gene_48.txt" #アノテーション情報ファイルを指定してin_f2に格納
out_f <- "hoge6.png" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 600 #横幅(単位はピクセル)を指定
param4 <- 400 #縦幅(単位はピクセル)を指定
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_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
tmp <- read.table(in_f2, header=TRUE, sep="\t", quote="") #アノテーション情報ファイルの読み込み
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」と同じ意味)
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
png(out_f, width=param3, height=param4) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", 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" #出力ファイル名を指定
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
param3 <- 600 #横幅(単位はピクセル)を指定
param4 <- 400 #縦幅(単位はピクセル)を指定
#発現データの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#RPM補正とM-A plot本番
RPM <- sweep(data, 2, 1000000/colSums(data), "*") #RPM補正した結果をRPMに格納
data <- RPM #オブジェクトRPMの情報をdataに代入している
meanA <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean)) #遺伝子ごとにA群の平均の対数を計算した結果をmeanAに格納
meanB <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean)) #遺伝子ごとにB群の平均の対数を計算した結果をmeanBに格納
x_axis <- (meanA + meanB)/2 #「A群の平均値」と「B群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- meanB - meanA #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
png(out_f, width=param3, height=param4) #出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(B)+log2(A))/2", ylab="M = log2(B)-log2(A)", pch=20, cex=.1)#MA-plotを描画
grid() #grid線を追加している
dev.off() #おまじない
------ ここまで ------
参考文献1(Marioni et al., Genome Res., 2008)
作図 | ROC曲線
私の2008,2009年の論文では、
主にRT-PCRで発現変動が確認された遺伝子を「真の発現変動遺伝子」とし、どの発現変動遺伝子のランキング法が「真の発現変動遺伝子」をより上位にすることができるかを示す指標として、
「ROC曲線の下部面積(Area Under the ROC curve; AUC)」で方法の比較を行っています(参考文献1,2)。
このAUC値を計算するための基礎情報がROC曲線です。よって、
ここではサンプルデータ2のSupplementaryTable2_changed.txtの
「A群 5サンプル vs. B群 5サンプル」の二群間比較データ(raw count; 特定の遺伝子領域にいくつリードがマップされたかをただカウントした数値データ)を用いていくつかの例を示します。
必要な情報は二つのベクトルです。一つは何らかのランキング法を用いて発現変動の度合いで遺伝子をランキングした順位情報、そしてもう一つはどの遺伝子が「真の発現変動遺伝子」かを示す0 or 1の情報です。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
1. 「真の発現変動遺伝子」の情報をparam3で指定し、解析 | NGS(RNA-seq) | 発現変動遺伝子 | 二群間 | baySeq (Hardcastle_2010)の「1.配列長情報なし」の順位情報を用いた場合:
------ ここから ------
in_f <- "SupplementaryTable2_changed.txt" #読み込みたい発現データファイルを指定してin_fに格納
param_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
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="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#Step1: 任意のランキング法を用いて順位情報を取得
groups <- list(NDE=rep(1, (param_A+param_B)), 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_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
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="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#Step1-1: 任意のランキング法1(baySeq)を用いて順位情報を取得
groups <- list(NDE=rep(1, (param_A+param_B)), 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_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
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="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#Step1-1: 任意のランキング法1(baySeq)を用いて順位情報を取得
groups <- list(NDE=rep(1, (param_A+param_B)), 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_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
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="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#Step1-1: 任意のランキング法1(baySeq)を用いて順位情報を取得
groups <- list(NDE=rep(1, (param_A+param_B)), 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_A <- 5 #A群のサンプル数を指定
param_B <- 5 #B群のサンプル数を指定
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="")#発現データファイルの読み込み
data.cl <- c(rep(1, param_A), rep(2, param_B)) #A群を1、B群を2としたベクトルdata.clを作成
#Step1-1: 任意のランキング法1(baySeq)を用いて順位情報を取得
groups <- list(NDE=rep(1, (param_A+param_B)), 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値を計算
------ ここまで ------
参考文献1(Kadota et al., AMB, 2008)
参考文献2(Kadota et al., AMB, 2009)
解析パイプラインゲノム配列へのマップ用1(発現変動までの一連のコマンド群; 方向性無視)
備忘録のようなものです。私がLinux上で実際に使ったことのあるシェルスクリプトを一般化して示します。
もちろんこの中で利用するプログラムは予めインストールなりしておく必要があります。
また、以下はRのスクリプトは一部しか含みませんのでご注意ください。
環境:
Linux
手持ちの情報:
ある程度既知(コンティグレベルでもよい)のmulti-FASTA形式のゲノム配列ファイル(ファイル名:ref_genome.fa)と、
比較したいIlluminaで行われたqseq形式のsample Aの塩基配列を含むフォルダ(フォルダ名:sampleAと
sample Bの塩基配列を含むフォルダ(フォルダ名:sampleB。
また、以下のスクリプトは、データが+鎖にマップされるのか-鎖かというのは意味をもたないデータとして取り扱う場合を想定しています。
方向性を考慮したスクリプトは解析パイプラインゲノム配列へのマップ用2のほうで示す予定です。
目的:
ゲノム配列にマッピングして発現変動している領域を見つけたい。
が、RefSeqのようなtranscriptome sequencesにマップするわけではないので、発現している領域もどうにかして決めておいてから、発現変動領域を同定したい。
感覚的には、エクソン領域みたいなのをざっと決めておいて、発現変動エクソン領域を同定するような感じ。
どのエクソンとどのエクソンが同じ転写物なのか、といったことやってくれるCufflinksは完璧なわけではないし、そこまでやらなくてもよい(という思想)。
その他:
以下のスクリプトの緑色の部分は任意に変更するところです。
------ ここから ------
############################
### 1. Illuminaのqseq形式のファイルを含むフォルダを指定してfastq形式ファイルで保存
############################
qseq2fastq.pl sampleA sampleA.fq
qseq2fastq.pl sampleB sampleB.fq
############################
### 2. おまじない(マップするゲノム配列の前処理)
############################
bowtie-build -f ref_genome.fa ref_genome
############################
### 3. ゲノムにマッピング(mismatchを許容しないで、複数個所にマップされず一か所にのみマップされるものを採用)
############################
( bowtie --offrate 3 -p 8 -a --best --strata -v 0 -m 1 -t --sam ref_genome -q sampleA.fq > sampleA.sam ) >& sampleA.samlog
( bowtie --offrate 3 -p 8 -a --best --strata -v 0 -m 1 -t --sam ref_genome -q sampleB.fq > sampleB.sam ) >& sampleB.samlog
############################
### 4. ファイル形式の変換
############################
sam2bed.pl sampleA.sam sampleA.bed
sam2bed.pl sampleB.sam sampleB.bed
############################
### 5. マップされた領域の和集合領域を「発現している領域(エクソン領域のようなイメージ)」としている
############################
cat sampleA.bed sampleB.bed | mergeBed -i stdin > data_merge.bed
############################
### 6. 各「発現している領域」中に何リードマップされたかカウントしている
############################
intersectBed -a data_merge.bed -b sampleA.bed -c > sampleA.count
intersectBed -a data_merge.bed -b sampleB.bed -c > sampleB.count
############################
### 7. Linux上でRを実行して6のところで作成した*.countファイルを一つずつ読み込んでRPKM値を計算し、結果を*.rpkmというファイル名で保存
############################
R #Rの起動
in_f <- list.files(pattern=".count") #"*.count"という名前をファイルをin_fに格納(「ls -1 *.count > in_f」みたいなイメージ)
for(i in 1:length(in_f)){ #in_fの要素数(*.countのファイル数)分だけループを回す
out_f <- paste(unlist(strsplit(in_f[i], ".", fixed=TRUE))[1], "rpkm", sep=".")#出力ファイルを"*.rpkm"に変えてout_fに格納
data <- read.table(in_f[i], header=FALSE, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
raw_counts <- data[,4] #dataの4列目の情報をraw_countsに格納
all_reads <- as.numeric(sum(data[,4])) #dataの4列目の数値の和を実数(as.numeric)としてall_readsに格納
gene_length <- data[,3] - data[,2] #dataの(3列目 - 2列目)の結果ををgene_lengthに格納(BED形式なのでこの計算式でよい)
RPKM <- raw_counts*1000000000/(gene_length*all_reads) #RPKM値を計算してRPKMに格納
gene_name <- paste(data[,1], data[,2]+1, data[,3], sep="_") #ゲノム(or コンティグ)上の座標情報をgene_nameとして格納
tmp <- cbind(gene_name, raw_counts, gene_length, all_reads, RPKM)#「gene_name, raw_counts, gene_length, all_reads, RPKM」の順番で、計5列を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
} #一連の作業をin_fの要素数(*.countのファイル数)分だけループを回す
q() #Rの終了コマンド
n #保存しないで終了
############################
### 8. 発現変動遺伝子のランキング (RのDESeqパッケージとWAD法のランキング結果を出力)
### DESeqは内部的に独自の正規化を行っており、配列長由来の偏りに関する補正は行っていない。
### WADはRPKMのデータを用いてランキングを行っているが、MA-plotで表示させているのは
### DESeq内部補正後のデータなので若干異なった結果となっている。
############################
R #Rの起動
out_f1 <- "result_DEG.txt" #出力ファイル名を指定
param1 <- 1 #A群のサンプル数を指定
param2 <- 1 #B群のサンプル数を指定
library(DESeq) #パッケージの読み込み
data_raw <- NULL #(DESeqはraw countsデータを入力とするので)raw countsデータ格納用プレースホルダ
data_rpkm <- NULL #(WADやADはRPKMデータを入力とするので)RPKMデータ格納用プレースホルダ
in_f <- list.files(pattern=".rpkm") #"*.rpkm"という名前をファイルをin_fに格納
for(i in 1:length(in_f)){ #in_fの要素数(*.rpkmのファイル数)分だけループを回す
data <- read.table(in_f[i], header=TRUE, row.names=1, sep="\t", quote="") #入力ファイルを読み込んでdataに格納
data_raw <- cbind(data_raw, data[,1]) #raw_countsに相当する列の情報をdata_rawの右側の列に追加
data_rpkm <- cbind(data_rpkm, data[,4]) #RPKM値に相当する列の情報をdata_rpkmの右側の列に追加
} #一連の作業をin_fの要素数(*.rpkmのファイル数)分だけループを回す
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
### 8-1. DESeqのランキング結果を取得 ###
cds <- newCountDataSet(data_raw, data.cl) #おまじない(CountDataSetというクラスを作成している
cds <- estimateSizeFactors(cds) #おまじない(サンプル間でマップされたread数が異なるのを補正するための正規化係数を計算している;いわゆるRPMの計算をしているような認識で差し支えない)
cds <- estimateVarianceFunctions(cds, method="blind") #おまじない(ばらつきを計算している)
out <- nbinomTest(cds, 1, 2) #発現変動の各種統計量を計算し、結果をoutに格納
logratio <- out$log2FoldChange #log2(B/A)統計量をlogratioに格納
FDR <- out$padj #p値をBenjamini-Hochberg procedureで補正したFDR値をFDRに格納
rank_DESeq <- rank(FDR) #FDR値でランキングした結果をrank_DESeqに格納
### 8-2. WADのランキング結果を取得 ###
datalog <- log2(data_rpkm + 1) #data_rpkmに1足して対数をとったものをdatalogに格納
aveA <- datalog[,data.cl==1] #datalogの行列からdata.clが1に相当する列をaveAに格納
aveB <- datalog[,data.cl==2] #datalogの行列からdata.clが2に相当する列をaveBに格納
average <- (aveA + aveB)/2 #logスケールでの遺伝子(行)ごとの平均発現レベルを計算しaverageに格納
weight <- (average - min(average))/(max(average) - min(average)) #遺伝子(行)ごとの相対発現レベルをweightに格納
stat_WAD <- (aveB - aveA)*weight #WAD統計量を計算してstat_WADに格納
rank_WAD <- rank(-abs(stat_WAD)) #WAD統計量をの順位を計算してrank_WADに格納
tmp <- cbind(rownames(data), data_raw, logratio, FDR, rank_DESeq, stat_WAD, rank_WAD)#raw countsデータの右側に、「lograio」、「DESeqで計算したFDR」、「その順位」、「WAD統計量」、「その順位」を結合した結果をtmpに格納
colnames(tmp) <- c("expressed_resion_ID", "raw_count(sampleA)", "raw_count(sampleB)", "log2(B/A)", "FDR(DESeq)", "rank(DESeq)", "WAD_statistics", "rank(WAD)")
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身をout_fで指定したファイル名で保存
### 8-3. FDRの任意の閾値を満たす遺伝子(行)数を調べたりMA-plotを描画したり... ###
param3 <- 0.01 #FDRの閾値を指定
param4 <- 600 #図のx軸の長さを指定
param5 <- 400 #図のy軸の長さを指定
out_f2 <- "result_DEG.png" #MA-plot用出力ファイル名を指定
png(out_f2, width=param4, height=param5*2) #出力ファイルの各種パラメータを指定
par(mfcol= c(2,1)) #二分割して2行1列でMA-plotを描画
plot(out$baseMean, logratio, log="x", pch=20, cex=.1, col=ifelse(FDR < param3, "red", "black"), xlab="Average expression level", main="DESeq_result")#DESeqの結果を表示
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
DEG_num <- sum(FDR < param3, na.rm=TRUE) #"NA"のものを無視して条件を満たす要素数をDEG_numに格納
legend("topleft", "DEG", col="red", pch=20) #左上のlegendを描画している
legend("bottomright", paste("FDR < ", param3, ":", DEG_num)) #右下のlegendを描画している
plot(out$baseMean, logratio, log="x", pch=20, cex=.1, col=ifelse(rank_WAD < DEG_num, "red", "black"), xlab="Average expression level", main="WAD_result")#WADの結果を表示
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
dev.off() #おまじない(作図終了宣言)
q() #Rの終了コマンド
n #保存しないで終了
------ ここまで ------
qseq2fastq.pl
sam2bed.pl
Bowtie (Langmead et al., Genome Biol., 2009)
BEDTools (Quinlan and Hall, Bioinformatics, 2010)
Cufflinks (Trapnell et al., Nature Biotechnol., 2010)
DESeq (Anders and Huber, Genome Biol, 2010)
WAD (Kadota et al., Algorithms Mol. Biol., 2008)
解析パイプラインゲノム配列へのマップ用2(発現変動までの一連のコマンド群; 方向性考慮)
備忘録のようなものです。私がLinux上で実際に使ったことのあるシェルスクリプトを一般化して示します。
もちろんこの中で利用するプログラムは予めインストールなりしておく必要があります。
また、以下はRのスクリプトは一部しか含みませんのでご注意ください。
環境:
Linux
手持ちの情報:
ある程度既知(コンティグレベルでもよい)のmulti-FASTA形式のゲノム配列ファイル(ファイル名:ref_genome.fa)と、
比較したいIlluminaで行われたqseq形式のsample Aの塩基配列を含むフォルダ(フォルダ名:sampleAと
sample Bの塩基配列を含むフォルダ(フォルダ名:sampleB。
また、解析パイプラインゲノム配列へのマップ用1のスクリプトは、データが+鎖にマップされるのか-鎖かというのは意味をもたないデータとして取り扱う場合でしたが、
以下のスクリプトはマップされたリードの向きを考慮したものになっており、違いはStep5 and 6のところだけです。
目的:
ゲノム配列にマッピングして発現変動している領域を見つけたい。
が、RefSeqのようなtranscriptome sequencesにマップするわけではないので、発現している領域もどうにかして決めておいてから、発現変動領域を同定したい。
感覚的には、エクソン領域みたいなのをざっと決めておいて、発現変動エクソン領域を同定するような感じ。
どのエクソンとどのエクソンが同じ転写物なのか、といったことやってくれるCufflinksは完璧なわけではないし、そこまでやらなくてもよい(という思想)。
その他:
以下のスクリプトの緑色の部分は任意に変更するところです。
------ ここから ------
############################
### 1. Illuminaのqseq形式のファイルを含むフォルダを指定してfastq形式ファイルで保存
############################
qseq2fastq.pl sampleA sampleA.fq
qseq2fastq.pl sampleB sampleB.fq
############################
### 2. おまじない(マップするゲノム配列の前処理)
############################
bowtie-build -f ref_genome.fa ref_genome
############################
### 3. ゲノムにマッピング(mismatchを許容しないで、複数個所にマップされず一か所にのみマップされるものを採用)
############################
( bowtie --offrate 3 -p 8 -a --best --strata -v 0 -m 1 -t --sam ref_genome -q sampleA.fq > sampleA.sam ) >& sampleA.samlog
( bowtie --offrate 3 -p 8 -a --best --strata -v 0 -m 1 -t --sam ref_genome -q sampleB.fq > sampleB.sam ) >& sampleB.samlog
############################
### 4. ファイル形式の変換
############################
sam2bed.pl sampleA.sam sampleA.bed
sam2bed.pl sampleB.sam sampleB.bed
############################
### 5. マップされた領域の和集合領域を「発現している領域(エクソン領域のようなイメージ)」としている
### "-s"というオプションを加えることで、同じ座標上にマップされたものでも
### +鎖にマップされたものと-鎖にマップされたものを区別することができる
############################
cat sampleA.bed sampleB.bed | mergeBed -i stdin -s > data_merge.bed
############################
### 6. 各「発現している領域」中に何リードマップされたかカウントしている
### step5のところでstrandの向きを考慮した結果ファイルは、BED形式でなくなっている。
### そのため、以下は若干ややこしくなっている
############################
grep "+" data_merge.bed > hoge_m
grep "+" sampleA.bed > hoge_A
intersectBed -a hoge_m -b hoge_A -c > sampleA.count
grep "-" data_merge.bed > hoge_m
grep "-" sampleA.bed > hoge_A
intersectBed -a hoge_m -b hoge_A -c >> sampleA.count
grep "+" data_merge.bed > hoge_m
grep "+" sampleB.bed > hoge_B
intersectBed -a hoge_m -b hoge_B -c > sampleB.count
grep "-" data_merge.bed > hoge_m
grep "-" sampleB.bed > hoge_B
intersectBed -a hoge_m -b hoge_B -c >> sampleB.count
############################
### 7. Linux上でRを実行して6のところで作成した*.countファイルを一つずつ読み込んでRPKM値を計算し、結果を*.rpkmというファイル名で保存
############################
R #Rの起動
in_f <- list.files(pattern=".count") #"*.count"という名前をファイルをin_fに格納(「ls -1 *.count > in_f」みたいなイメージ)
for(i in 1:length(in_f)){ #in_fの要素数(*.countのファイル数)分だけループを回す
out_f <- paste(unlist(strsplit(in_f[i], ".", fixed=TRUE))[1], "rpkm", sep=".")#出力ファイルを"*.rpkm"に変えてout_fに格納
data <- read.table(in_f[i], header=FALSE, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
raw_counts <- data[,4] #dataの4列目の情報をraw_countsに格納
all_reads <- as.numeric(sum(data[,4])) #dataの4列目の数値の和を実数(as.numeric)としてall_readsに格納
gene_length <- data[,3] - data[,2] #dataの(3列目 - 2列目)の結果ををgene_lengthに格納(BED形式なのでこの計算式でよい)
RPKM <- raw_counts*1000000000/(gene_length*all_reads) #RPKM値を計算してRPKMに格納
gene_name <- paste(data[,1], data[,2]+1, data[,3], sep="_") #ゲノム(or コンティグ)上の座標情報をgene_nameとして格納
tmp <- cbind(gene_name, raw_counts, gene_length, all_reads, RPKM)#「gene_name, raw_counts, gene_length, all_reads, RPKM」の順番で、計5列を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
} #一連の作業をin_fの要素数(*.countのファイル数)分だけループを回す
q() #Rの終了コマンド
n #保存しないで終了
############################
### 8. 発現変動遺伝子のランキング (RのDESeqパッケージとWAD法のランキング結果を出力)
### DESeqは内部的に独自の正規化を行っており、配列長由来の偏りに関する補正は行っていない。
### WADはRPKMのデータを用いてランキングを行っているが、MA-plotで表示させているのは
### DESeq内部補正後のデータなので若干異なった結果となっている。
############################
R #Rの起動
out_f1 <- "result_DEG.txt" #出力ファイル名を指定
param1 <- 1 #A群のサンプル数を指定
param2 <- 1 #B群のサンプル数を指定
library(DESeq) #パッケージの読み込み
data_raw <- NULL #(DESeqはraw countsデータを入力とするので)raw countsデータ格納用プレースホルダ
data_rpkm <- NULL #(WADやADはRPKMデータを入力とするので)RPKMデータ格納用プレースホルダ
in_f <- list.files(pattern=".rpkm") #"*.rpkm"という名前をファイルをin_fに格納
for(i in 1:length(in_f)){ #in_fの要素数(*.rpkmのファイル数)分だけループを回す
data <- read.table(in_f[i], header=TRUE, row.names=1, sep="\t", quote="") #入力ファイルを読み込んでdataに格納
data_raw <- cbind(data_raw, data[,1]) #raw_countsに相当する列の情報をdata_rawの右側の列に追加
data_rpkm <- cbind(data_rpkm, data[,4]) #RPKM値に相当する列の情報をdata_rpkmの右側の列に追加
} #一連の作業をin_fの要素数(*.rpkmのファイル数)分だけループを回す
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
### 8-1. DESeqのランキング結果を取得 ###
cds <- newCountDataSet(data_raw, data.cl) #おまじない(CountDataSetというクラスを作成している
cds <- estimateSizeFactors(cds) #おまじない(サンプル間でマップされたread数が異なるのを補正するための正規化係数を計算している;いわゆるRPMの計算をしているような認識で差し支えない)
cds <- estimateVarianceFunctions(cds, method="blind") #おまじない(ばらつきを計算している)
out <- nbinomTest(cds, 1, 2) #発現変動の各種統計量を計算し、結果をoutに格納
logratio <- out$log2FoldChange #log2(B/A)統計量をlogratioに格納
FDR <- out$padj #p値をBenjamini-Hochberg procedureで補正したFDR値をFDRに格納
rank_DESeq <- rank(FDR) #FDR値でランキングした結果をrank_DESeqに格納
### 8-2. WADのランキング結果を取得 ###
datalog <- log2(data_rpkm + 1) #data_rpkmに1足して対数をとったものをdatalogに格納
aveA <- datalog[,data.cl==1] #datalogの行列からdata.clが1に相当する列をaveAに格納
aveB <- datalog[,data.cl==2] #datalogの行列からdata.clが2に相当する列をaveBに格納
average <- (aveA + aveB)/2 #logスケールでの遺伝子(行)ごとの平均発現レベルを計算しaverageに格納
weight <- (average - min(average))/(max(average) - min(average)) #遺伝子(行)ごとの相対発現レベルをweightに格納
stat_WAD <- (aveB - aveA)*weight #WAD統計量を計算してstat_WADに格納
rank_WAD <- rank(-abs(stat_WAD)) #WAD統計量をの順位を計算してrank_WADに格納
tmp <- cbind(rownames(data), data_raw, logratio, FDR, rank_DESeq, stat_WAD, rank_WAD)#raw countsデータの右側に、「lograio」、「DESeqで計算したFDR」、「その順位」、「WAD統計量」、「その順位」を結合した結果をtmpに格納
colnames(tmp) <- c("expressed_resion_ID", "raw_count(sampleA)", "raw_count(sampleB)", "log2(B/A)", "FDR(DESeq)", "rank(DESeq)", "WAD_statistics", "rank(WAD)")
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身をout_fで指定したファイル名で保存
### 8-3. FDRの任意の閾値を満たす遺伝子(行)数を調べたりMA-plotを描画したり... ###
param3 <- 0.01 #FDRの閾値を指定
param4 <- 600 #図のx軸の長さを指定
param5 <- 400 #図のy軸の長さを指定
out_f2 <- "result_DEG.png" #MA-plot用出力ファイル名を指定
png(out_f2, width=param4, height=param5*2) #出力ファイルの各種パラメータを指定
par(mfcol= c(2,1)) #二分割して2行1列でMA-plotを描画
plot(out$baseMean, logratio, log="x", pch=20, cex=.1, col=ifelse(FDR < param3, "red", "black"), xlab="Average expression level", main="DESeq_result")#DESeqの結果を表示
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
DEG_num <- sum(FDR < param3, na.rm=TRUE) #"NA"のものを無視して条件を満たす要素数をDEG_numに格納
legend("topleft", "DEG", col="red", pch=20) #左上のlegendを描画している
legend("bottomright", paste("FDR < ", param3, ":", DEG_num)) #右下のlegendを描画している
plot(out$baseMean, logratio, log="x", pch=20, cex=.1, col=ifelse(rank_WAD < DEG_num, "red", "black"), xlab="Average expression level", main="WAD_result")#WADの結果を表示
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
dev.off() #おまじない(作図終了宣言)
q() #Rの終了コマンド
n #保存しないで終了
------ ここまで ------
qseq2fastq.pl
sam2bed.pl
Bowtie (Langmead et al., Genome Biol., 2009)
BEDTools (Quinlan and Hall, Bioinformatics, 2010)
Cufflinks (Trapnell et al., Nature Biotechnol., 2010)
DESeq (Anders and Huber, Genome Biol, 2010)
WAD (Kadota et al., Algorithms Mol. Biol., 2008)
解析パイプラインゲノム配列へのマップ用3(発現変動までの一連のコマンド群; 方向性無視でpaired-endの場合)
備忘録のようなものです。私がLinux上で実際に使ったことのあるシェルスクリプトを一般化して示します。
もちろんこの中で利用するプログラムは予めインストールなりしておく必要があります。
また、以下はRのスクリプトは一部しか含みませんのでご注意ください。
環境:
Linux
手持ちの情報:
ある程度既知(コンティグレベルでもよい)のmulti-FASTA形式のゲノム配列ファイル(ファイル名:ref_genome.fa)と、
FASTQ形式のpaired-endの二つのファイル(sample_read1.fqとsample_read2.fq)。
目的:
paired-endのデータをゲノム配列にマッピングしたい。
その他:
以下のスクリプトの緑色の部分は任意に変更するところです。
------ ここから ------
############################
### 1. おまじない(マップするゲノム配列の前処理)
############################
bowtie-build -f ref_genome.fa ref_genome
############################
### 2. Bowtieでマッピング
############################
( bowtie --offrate 3 -p 8 -a -t -S ref_genome sample_read1.fq,sample_read2.fq -q > sample.sam ) >& sample.samlog
------ ここまで ------
解析パイプライントランスクリプトーム配列へのマップ用1(発現変動までの一連のコマンド群; 方向性無視)
備忘録のようなものです。私がLinux上で実際に使ったことのあるシェルスクリプトを一般化して示します。
もちろんこの中で利用するプログラムは予めインストールなりしておく必要があります。
また、以下はRのスクリプトは一部しか含みませんのでご注意ください。
環境:
Linux
手持ちの情報:
RefSeqのHumanのmulti-fastaファイルのようなmulti-FASTA形式のトランスクリプトーム配列ファイル(ファイル名:human.rna.fna)と、
比較したいIlluminaで行われたqseq形式のsample Aの塩基配列を含むフォルダ(フォルダ名:sampleAと
sample Bの塩基配列を含むフォルダ(フォルダ名:sampleB。
また、以下のスクリプトは、データが+鎖にマップされるのか-鎖かというのは意味をもたないデータとして取り扱う場合を想定しています。
方向性を考慮したスクリプトは解析パイプライントランスクリプトーム配列へのマップ用2のほうで示す予定です。
目的:
トランスクリプトーム配列にマッピングして発現変動している転写物を見つけたい。
ゲノム配列にマップするわけではないので、発現している領域を決めるなどという作業は基本的に必要ない。
その他:
以下のスクリプトの緑色の部分は任意に変更するところです。
------ ここから ------
############################
### 0. トランスクリプトーム配列ファイルhuman.rna.fnaの前処理を行って、description部分を必要最小限に変更したref_transcriptome.faというファイルの作成、
### およびその後の解析で必要となる情報も別ファイル(ref_transcriptome.bed)として保存しておく
############################
in_f <- "human.rna.fna" #解凍後のmulti-fastaファイルのファイル名human.rna.fnaを指定
out_f1 <- "ref_transcriptome.fa" #出力ファイル名を指定
out_f2 <- "ref_transcriptome.bed" #出力ファイル名を指定
library(Biostrings) #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta") #in_fで指定したファイルをFASTA形式で読み込み
hoge <- strsplit(names(reads), "|", fixed=TRUE) #names(reads)中の文字列を"|"で区切った結果をリスト形式でhogeに格納
refseq_with_v <- sapply(hoge, "[[", 4) #hogeのリスト中の4番目の要素(RefSeq accession number部分に相当)のみ抽出してrefseq_with_vに格納
hoge2 <- strsplit(refseq_with_v, ".", fixed=TRUE) #refseq_with_v中の文字列を"."で区切った結果をリスト形式でhoge2に格納
refseq_without_v <- sapply(hoge2, "[[", 1) #hoge2のリスト中の1番目の要素(RefSeq accession numberのバージョン番号でない部分に相当)のみ抽出してrefseq_without_vに格納
reads #今現在のreadsオブジェクトを眺めているだけ(namesという列の部分がオリジナルのdescriptionのままになっていることがわかる)
names(reads) <- refseq_with_v #names(reads)の中身をrefseq_with_vで置換(バージョン番号なしにしたければrefseq_without_vにすればいい)
reads #今現在のreadsオブジェクトを眺めているだけ(namesという列の部分がrefseq_with_vでちゃんと置換されていることがわかる)
writeXStringSet(reads, file=out_f1, format="fasta", width=60) #一行あたりの塩基数を60にして、out_f1で指定したファイル名でreadsというオブジェクトをfasta形式で保存
tmp <- cbind(refseq_with_v, 0, width(reads)) #5.で使うためのファイルを作成している。「バージョン情報なしのRefSeq accession number (refseq_without_v)」、0、「配列長情報(width(reads))」を結合してtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身をout_f2で指定したファイル名で保存。
############################
### 1. Illuminaのqseq形式のファイルを含むフォルダを指定してfastq形式ファイルで保存
############################
qseq2fastq.pl sampleA sampleA.fq
qseq2fastq.pl sampleB sampleB.fq
############################
### 2. おまじない(マップするトランスクリプトーム配列の前処理)
############################
bowtie-build -f ref_transcriptome.fa ref_transcriptome
############################
### 3. ゲノムにマッピング(mismatchを許容しないで、複数個所にマップされず一か所にのみマップされるものを採用)
############################
( bowtie --offrate 3 -p 8 -a --best --strata -v 0 -m 1 -t --sam ref_transcriptome -q sampleA.fq > sampleA.sam ) >& sampleA.samlog
( bowtie --offrate 3 -p 8 -a --best --strata -v 0 -m 1 -t --sam ref_transcriptome -q sampleB.fq > sampleB.sam ) >& sampleB.samlog
############################
### 4. ファイル形式の変換
############################
sam2bed.pl sampleA.sam sampleA.bed
sam2bed.pl sampleB.sam sampleB.bed
############################
### 5. 各転写物配列中に何リードマップされたかカウントしている
############################
intersectBed -a ref_transcriptome.bed -b sampleA.bed -c > ref_transcriptome_A.count
intersectBed -a ref_transcriptome.bed -b sampleB.bed -c > ref_transcriptome_B.count
############################
### 6. Linux上でRを実行して6のところで作成した*.countファイルを一つずつ読み込んでRPKM値を計算し、結果を*.rpkmというファイル名で保存
############################
R #Rの起動
in_f <- list.files(pattern=".count") #"*.count"という名前をファイルをin_fに格納(「ls -1 *.count > in_f」みたいなイメージ)
for(i in 1:length(in_f)){ #in_fの要素数(*.countのファイル数)分だけループを回す
out_f <- paste(unlist(strsplit(in_f[i], ".", fixed=TRUE))[1], "rpkm", sep=".")#出力ファイルを"*.rpkm"に変えてout_fに格納
data <- read.table(in_f[i], header=FALSE, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
raw_counts <- data[,4] #dataの4列目の情報をraw_countsに格納
all_reads <- as.numeric(sum(data[,4])) #dataの4列目の数値の和を実数(as.numeric)としてall_readsに格納
gene_length <- data[,3] - data[,2] #dataの(3列目 - 2列目)の結果ををgene_lengthに格納(BED形式なのでこの計算式でよい)
RPKM <- raw_counts*1000000000/(gene_length*all_reads) #RPKM値を計算してRPKMに格納
gene_name <- paste(data[,1], data[,2]+1, data[,3], sep="_") #ゲノム(or コンティグ)上の座標情報をgene_nameとして格納
tmp <- cbind(gene_name, raw_counts, gene_length, all_reads, RPKM)#「gene_name, raw_counts, gene_length, all_reads, RPKM」の順番で、計5列を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
} #一連の作業をin_fの要素数(*.countのファイル数)分だけループを回す
q() #Rの終了コマンド
n #保存しないで終了
############################
### 7. 発現変動遺伝子のランキング (RのDESeqパッケージとWAD法のランキング結果を出力)
### DESeqは内部的に独自の正規化を行っており、配列長由来の偏りに関する補正は行っていない。
### WADはRPKMのデータを用いてランキングを行っているが、MA-plotで表示させているのは
### DESeq内部補正後のデータなので若干異なった結果となっている。
############################
R #Rの起動
out_f1 <- "result_DEG.txt" #出力ファイル名を指定
param1 <- 1 #A群のサンプル数を指定
param2 <- 1 #B群のサンプル数を指定
library(DESeq) #パッケージの読み込み
data_raw <- NULL #(DESeqはraw countsデータを入力とするので)raw countsデータ格納用プレースホルダ
data_rpkm <- NULL #(WADやADはRPKMデータを入力とするので)RPKMデータ格納用プレースホルダ
in_f <- list.files(pattern=".rpkm") #"*.rpkm"という名前をファイルをin_fに格納
for(i in 1:length(in_f)){ #in_fの要素数(*.rpkmのファイル数)分だけループを回す
data <- read.table(in_f[i], header=TRUE, row.names=1, sep="\t", quote="") #入力ファイルを読み込んでdataに格納
data_raw <- cbind(data_raw, data[,1]) #raw_countsに相当する列の情報をdata_rawの右側の列に追加
data_rpkm <- cbind(data_rpkm, data[,4]) #RPKM値に相当する列の情報をdata_rpkmの右側の列に追加
} #一連の作業をin_fの要素数(*.rpkmのファイル数)分だけループを回す
data.cl <- c(rep(1, param1), rep(2, param2)) #A群を1、B群を2としたベクトルdata.clを作成
### 8-1. DESeqのランキング結果を取得 ###
cds <- newCountDataSet(data_raw, data.cl) #おまじない(CountDataSetというクラスを作成している
cds <- estimateSizeFactors(cds) #おまじない(サンプル間でマップされたread数が異なるのを補正するための正規化係数を計算している;いわゆるRPMの計算をしているような認識で差し支えない)
cds <- estimateVarianceFunctions(cds, method="blind") #おまじない(ばらつきを計算している)
out <- nbinomTest(cds, 1, 2) #発現変動の各種統計量を計算し、結果をoutに格納
logratio <- out$log2FoldChange #log2(B/A)統計量をlogratioに格納
FDR <- out$padj #p値をBenjamini-Hochberg procedureで補正したFDR値をFDRに格納
rank_DESeq <- rank(FDR) #FDR値でランキングした結果をrank_DESeqに格納
### 8-2. WADのランキング結果を取得 ###
datalog <- log2(data_rpkm + 1) #data_rpkmに1足して対数をとったものをdatalogに格納
aveA <- datalog[,data.cl==1] #datalogの行列からdata.clが1に相当する列をaveAに格納
aveB <- datalog[,data.cl==2] #datalogの行列からdata.clが2に相当する列をaveBに格納
average <- (aveA + aveB)/2 #logスケールでの遺伝子(行)ごとの平均発現レベルを計算しaverageに格納
weight <- (average - min(average))/(max(average) - min(average)) #遺伝子(行)ごとの相対発現レベルをweightに格納
stat_WAD <- (aveB - aveA)*weight #WAD統計量を計算してstat_WADに格納
rank_WAD <- rank(-abs(stat_WAD)) #WAD統計量をの順位を計算してrank_WADに格納
tmp <- cbind(rownames(data), data_raw, logratio, FDR, rank_DESeq, stat_WAD, rank_WAD)#raw countsデータの右側に、「lograio」、「DESeqで計算したFDR」、「その順位」、「WAD統計量」、「その順位」を結合した結果をtmpに格納
colnames(tmp) <- c("expressed_resion_ID", "raw_count(sampleA)", "raw_count(sampleB)", "log2(B/A)", "FDR(DESeq)", "rank(DESeq)", "WAD_statistics", "rank(WAD)")
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身をout_fで指定したファイル名で保存
### 8-3. FDRの任意の閾値を満たす遺伝子(行)数を調べたりMA-plotを描画したり... ###
param3 <- 0.01 #FDRの閾値を指定
param4 <- 600 #図のx軸の長さを指定
param5 <- 400 #図のy軸の長さを指定
out_f2 <- "result_DEG.png" #MA-plot用出力ファイル名を指定
png(out_f2, width=param4, height=param5*2) #出力ファイルの各種パラメータを指定
par(mfcol= c(2,1)) #二分割して2行1列でMA-plotを描画
plot(out$baseMean, logratio, log="x", pch=20, cex=.1, col=ifelse(FDR < param3, "red", "black"), xlab="Average expression level", main="DESeq_result")#DESeqの結果を表示
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
DEG_num <- sum(FDR < param3, na.rm=TRUE) #"NA"のものを無視して条件を満たす要素数をDEG_numに格納
legend("topleft", "DEG", col="red", pch=20) #左上のlegendを描画している
legend("bottomright", paste("FDR < ", param3, ":", DEG_num)) #右下のlegendを描画している
plot(out$baseMean, logratio, log="x", pch=20, cex=.1, col=ifelse(rank_WAD < DEG_num, "red", "black"), xlab="Average expression level", main="WAD_result")#WADの結果を表示
grid(col="gray", lty="dotted") #指定したパラメータでグリッドを表示
dev.off() #おまじない(作図終了宣言)
q() #Rの終了コマンド
n #保存しないで終了
------ ここまで ------
qseq2fastq.pl
sam2bed.pl
Bowtie (Langmead et al., Genome Biol., 2009)
BEDTools (Quinlan and Hall, Bioinformatics, 2010)
Cufflinks (Trapnell et al., Nature Biotechnol., 2010)
DESeq (Anders and Huber, Genome Biol, 2010)
WAD (Kadota et al., Algorithms Mol. Biol., 2008)
配列モチーフ(cosmo)
参考文献1の方法です。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。
------ ここから ------
library(cosmo) #パッケージの読み込み
------ ここまで ------
Bioconductorのcosmoのwebページ
参考文献1(Bembom et al., SAGMB, 2007)
リンク集