(Rで)塩基配列解析 (last modified 2023/05/24, since 2010)

このページは、RStudio (R含む)で生命科学系のデータ解析を行うためのテンプレート集です。このページに特化したチュートリアル(インストール | について基本的な利用法)を一通り実践した上でご利用ください。より一般的なチュートリアルは、教科書の付録ページ(←読込に時間がかからなくなりました)にあるR1.010とR1.020で提供しています(2023/04/01)。

アグリバイオインフォマティクス@Agribio_utokyoアグリバイオの教科書(Rで)塩基配列解析のサブページ

What's new? (過去のお知らせはこちら)

はじめに

このページは、主にNGS機器などから得られた塩基配列データ解析をRで行うための一連の手続きをまとめているものです。

Maintainerは東京大学・大学院農学生命科学研究科アグリバイオインフォマティクス教育研究ユニット門田幸二と寺田朋子です。 ボスである清水謙多郎教授をはじめ、 TCCパッケージ開発実働部隊でもあるbiopapyrus氏、 およびバグレポートや各種インストール手順書作成などで尽力いただいた諸氏のおかげでかなり規模の大きなサイトになっています (デカくなりすぎたので、2018年7月に一部がサブページに移行しました)。 しかしながら、このサイトは2010年頃から提供しているため、(私も不具合を発見したら随時修正をしてはいますが)それでもリンク切れや内容が古いものも多々あります。 リンクも自由、講義資料などとして使うのも自由です。前もっての連絡なども必要ありません。 しかし、本当に正しいやり方かどうかなど一切の保証はできませんし、必要に応じて随時変更していますので全て自己責任でご利用ください。 間違いや修正点、また「このような解析をやりたいがどうすればいいか?」などのリクエストがあればメール(koji.kadota@gmail.com)してください。 もちろん、アグリバイオインフォマティクス教育研究プログラム受講生からのリクエストは優先的に対応します。 もし私のメアドに送ったヒトで、2勤務日以内に返事をもらってないヒトは、 アグリバイオ事務局(info あっと iu.a.u-tokyo.ac.jp)宛にも送って催促してください。

このウェブサイトは、アグリバイオインフォマティクス教育研究プログラム はもちろんのこと、外部資金のサポートも一部受けています(過去・現在・未来)。 特に18K11521は、このウェブページの更新に特化したものです。 私のポジションがある限り、多くのユーザの効率的な研究推進の裏方として、地味~な活動を継続していければと思っております。 今後ともご支援のほど、よろしくお願いいたします。

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

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

過去のお知らせ

インストール | について

以下は、「インストール | R本体とRStudio | 最新版」と「インストール | Rパッケージ | 必要最小限プラスアルファ」の推奨インストール手順をまとめたものです。 私の環境は、Windows PCは(Windows 10; 64 bit)、Macintosh PCはMacBook Pro (MacOS Monterey Ver.12.3.1; 64 bit)です。

インストール | R本体とRStudio | 最新版 | Win用

最新版(リリース版のこと)は、下記手順を実行します。インストールが無事完了したら、 デスクトップに「R x64 4.X.Y」アイコンが作成されます(XY中の数値はバージョンによって異なります)。 2022年05月01日現在の最新版は、R-4.2.0-win.exeです。

  1. Rのインストーラを「実行」
  2. 基本的には「次へ」などを押しながらインストールを完了させる
  3. 「コントロールパネル」−「デスクトップのカスタマイズ」−「フォルダオプション」−「表示(タブ)」−「詳細設定」のところで、 「登録されている拡張子は表示しない」のチェックを外してください。
  4. RStudioのダウンロードサイトをクリックし、 「RStudio-2022.02.1-461.exe」と酷似したファイル名のものをクリック。

インストール | R本体とRStudio | 最新版 | Mac用

最新版(リリース版のこと)は、下記手順を実行します。インストールが無事完了したら、 Finderを起動して、左のメニューの「アプリケーション」をクリックすると、Rのアイコンが作成されていることが確認できます。 2022年05月16日現在の最新版は、R-4.2.0.pkgです。

  1. http://cran.r-project.org/bin/macosx/の「R-4.X.Y.pkg」をクリック。 (XY中の数値はバージョンによって異なります)
  2. ダウンロードしたファイルをダブルクリックして、基本的には「次へ」などを押しながらインストールを完了させる
  3. 「Finder」-「環境設定」-「詳細」タブのところで「すべてのファイル名拡張子を表示」にチェックを入れる。
  4. RStudioのダウンロードサイトをクリックし、 「RStudio-2022.02.1-461.dmg」と酷似したファイル名のものをクリック。
  5. XQuartzをインストール(2022/05/16追加)

インストール | R本体 | 過去版 | Win用

昔のバージョンをインストールしたい局面もごく稀にあると思います。 その場合は、ここをクリックして、 任意のバージョンのものをインストールしてください。例えば、2014年10月リリースのver. 3.1.2をインストールしたい場合は、 3.1.2をクリックして、 「Download R 3.1.2 for Windows」 をクリックすれば、後は最新版と同じです。

インストール | R本体 | 過去版 | Mac用

昔のバージョンをインストールしたい局面もごく稀にあると思います。 その場合は、http://cran.r-project.org/bin/macosx/old/またはhttps://cran.r-project.org/bin/macosx/base/をクリックして、 任意のバージョンのものをインストールしてください。例えば、2014年10月リリースのver. 3.1.2をインストールしたい場合は、 ページ下部の「R-3.1.2-marvericks.pkg」 をクリックすれば、後は最新版と同じです。2022年12月03日現在、Windowsの場合はR本体のバージョンがver. 4シリーズもver. 3シリーズもここの同じリンク先から見られます。しかし、Macの場合はhttp://cran.r-project.org/bin/macosx/old/だとver. 3シリーズのみしか見られませんのでご注意ください。https://cran.r-project.org/bin/macosx/base/にはver. 4シリーズがリストアップされています(2022.12.03追加)。

インストール | Rパッケージ | について

アグリバイオで所有するノートPCは、基本的に 「インストール | Rパッケージ | 必要最小限プラスアルファ」 を利用してパッケージ群を一度にインストールしています。しかし、コロナ禍や講義で用いるパッケージの変遷などを経て、多少の不具合を許容しつつシンプルにインストールできる方針に変更しました(2022年3月30日)。 「インストール | Rパッケージ | 個別(2018年11月以降)」のところは、 インストールされていない(or されなかった)パッケージを個別にインストールする際に利用してください。

インストール | Rパッケージ | 必要最小限プラスアルファ

アグリバイオで所有するノートPCは、Rパッケージの2大リポジトリであるCRANBioconductor(およびGithub)から提供されている以下のパッケージ群をインストールしています。 30分程度でインストールが完了します(自宅の光の無線LAN環境)。

1. RStudioを起動

2. パッケージ群のインストール

以下を「R コンソール画面」上でコピー&ペースト。 どこからダウンロードするか?と聞かれるので、その場合は自分から近いサイトを指定。 「no」の行に対するエラーは気にしなくて大丈夫です(Mac対応です)。

#前処理(BiocManagerがなければインストール)
if (!requireNamespace("BiocManager", quietly=T))#BiocManagerパッケージがインストールされてなければ...
    install.packages("BiocManager")    #BiocManagerをインストールせよ
    
#本番1(CRANから提供されているパッケージ群)
BiocManager::install("ape", update=F)
BiocManager::install("bio3d", update=F)
BiocManager::install("blockmodeling", update=F)
BiocManager::install("bit", update=F)
BiocManager::install("cclust", update=F)
BiocManager::install("class", update=F)
BiocManager::install("cluster", update=F)
BiocManager::install("clValid", update=F)
BiocManager::install("corrplot", update=F)
BiocManager::install("data.table", update=F)
BiocManager::install("devtools", update=F)
BiocManager::install("dplyr", update=F)
BiocManager::install("DT", update=F)
BiocManager::install("e1071", update=F)
BiocManager::install("fansi", update=F)
BiocManager::install("ff", update=F)
BiocManager::install("fields", update=F)
BiocManager::install("FinePop", update=F)
BiocManager::install("FinePop2", update=F)
BiocManager::install("FIT", update=F)
BiocManager::install("fitdistrplus", update=F)
BiocManager::install("GeneCycle", update=F)
BiocManager::install("GGally", update=F)
BiocManager::install("glmnet", update=F)
BiocManager::install("gptk", update=F)
BiocManager::install("GSA", update=F)
BiocManager::install("heatmaply", update=F)
BiocManager::install("kernlab", update=F)
BiocManager::install("KernSmooth", update=F)
BiocManager::install("knitr", update=F)
BiocManager::install("mapdata", update=F)
BiocManager::install("maps", update=F)
BiocManager::install("MASS", update=F)
BiocManager::install("microseq", update=F)
BiocManager::install("mixOmics", update=F)
BiocManager::install("MVA", update=F)
BiocManager::install("openxlsx", update=F)
BiocManager::install("Peptides", update=F)
BiocManager::install("phateR", update=F)
BiocManager::install("plotly", update=F)
BiocManager::install("PoissonSeq", update=F)
BiocManager::install("pvclust", update=F)
BiocManager::install("qqman", update=F)
BiocManager::install("R6", update=F)
BiocManager::install("randomForest", update=F)
BiocManager::install("RColorBrewer", update=F)
BiocManager::install("rclipboard", update=F)
BiocManager::install("RCurl", update=F)
BiocManager::install("rentrez", update=F)
BiocManager::install("rgl", update=F)
BiocManager::install("rmarkdown", update=F)
BiocManager::install("rrBLUP", update=F)
BiocManager::install("Rtsne", update=F)
BiocManager::install("samr", update=F)
BiocManager::install("scatterplot3d", update=F)
BiocManager::install("seqinr", update=F)
BiocManager::install("shiny", update=F)
BiocManager::install("shinyBS", update=F)
BiocManager::install("shinycssloaders", update=F)
BiocManager::install("shinydashboard", update=F)
BiocManager::install("shinyWidgets", update=F)
BiocManager::install("som", update=F)
BiocManager::install("st", update=F)
BiocManager::install("survminer", update=F)
BiocManager::install("tidyverse", update=F)
BiocManager::install("umap", update=F)
BiocManager::install("varSelRF", update=F)
BiocManager::install("xfun", update=F)
BiocManager::install("zeallot", update=F)
BiocManager::install("zoo", update=F)

#本番2(Bioconductorから提供されているゲノム配列以外のパッケージ群)
BiocManager::install("affy", update=F)
BiocManager::install("agilp", update=F)
BiocManager::install("annotate", update=F)
BiocManager::install("ArrayExpress", update=F)
BiocManager::install("baySeq", update=F)
BiocManager::install("beadarray", update=F)
BiocManager::install("BeadDataPackR", update=F)
BiocManager::install("betr", update=F)
BiocManager::install("BHC", update=F)
BiocManager::install("biomaRt", update=F)
BiocManager::install("Biostrings", update=F)
BiocManager::install("BSgenome", update=F)
BiocManager::install("bsseq", update=F)
BiocManager::install("Category", update=F)
BiocManager::install("ChIPpeakAnno", update=F)
BiocManager::install("chipseq", update=F)
BiocManager::install("ChIPseqR", update=F)
BiocManager::install("ChIPsim", update=F)
BiocManager::install("clusterStab", update=F)
BiocManager::install("cosmo", update=F)
BiocManager::install("CSAR", update=F)
BiocManager::install("dada2", update=F)
BiocManager::install("DECIPHER", update=F)
BiocManager::install("DEGseq", update=F)
BiocManager::install("DESeq", update=F)
BiocManager::install("DESeq2", update=F)
BiocManager::install("DiffBind", update=F)
BiocManager::install("doMC", update=F)
BiocManager::install("EDASeq", update=F)
BiocManager::install("edgeR", update=F)
BiocManager::install("EGSEA", update=F)
BiocManager::install("EGSEAdata", update=F)
BiocManager::install("gage", update=F)
BiocManager::install("genefilter", update=F)
BiocManager::install("GenomicAlignments", update=F)
BiocManager::install("GenomicFeatures", update=F)
BiocManager::install("GEOquery", update=F)
BiocManager::install("ggplot2", update=F)
BiocManager::install("girafe", update=F)
BiocManager::install("GLAD", update=F)
BiocManager::install("golubEsets", update=F)
BiocManager::install("GSAR", update=F)
BiocManager::install("GSEABase", update=F)
BiocManager::install("GSVA", update=F)
BiocManager::install("GSVAdata", update=F)
BiocManager::install("Heatplus", update=F)
BiocManager::install("illuminaMousev2.db", update=F)
BiocManager::install("impute", update=F)
BiocManager::install("limma", update=F)
BiocManager::install("lumi", update=F)
BiocManager::install("marray", update=F)
BiocManager::install("maSigPro", update=F)
BiocManager::install("MBCluster.Seq", update=F)
BiocManager::install("MLSeq", update=F)
BiocManager::install("msa", update=F)
BiocManager::install("Mulcom", update=F)
BiocManager::install("multtest", update=F)
BiocManager::install("NOISeq", update=F)
BiocManager::install("htSeqTools", update=F)
BiocManager::install("NBPSeq", update=F)
BiocManager::install("OCplus", update=F)
BiocManager::install("org.Hs.eg.db", update=F)
BiocManager::install("parathyroidSE", update=F)
BiocManager::install("pathview", update=F)
BiocManager::install("pcaMethods", update=F)
BiocManager::install("pcot2", update=F)
BiocManager::install("pd.rat230.2", update=F)
BiocManager::install("PGSEA", update=F)
BiocManager::install("phyloseq", update=F)
BiocManager::install("PICS", update=F)
BiocManager::install("plier", update=F)
BiocManager::install("puma", update=F)
BiocManager::install("qrqc", update=F)
BiocManager::install("QuasR", update=F)
BiocManager::install("r3Cseq", update=F)
BiocManager::install("RankProd", update=F)
BiocManager::install("recount", update=F)
BiocManager::install("REDseq", update=F)
BiocManager::install("rMAT", update=F)
BiocManager::install("Rsamtools", update=F)
BiocManager::install("rtracklayer", update=F)
BiocManager::install("safe", update=F)
BiocManager::install("SAGx", update=F)
BiocManager::install("segmentSeq", update=F)
BiocManager::install("seqLogo", update=F)
BiocManager::install("ShortRead", update=F)
BiocManager::install("sigPathway", update=F)
BiocManager::install("SpeCond", update=F)
BiocManager::install("SPIA", update=F)
BiocManager::install("splatter", update=F)
BiocManager::install("SplicingGraphs", update=F)
BiocManager::install("SRAdb", update=F)
BiocManager::install("tweeDEseqCountData", update=F)
BiocManager::install("TCC", update=F)
BiocManager::install("topGO", update=F)
BiocManager::install("TxDb.Hsapiens.UCSC.hg38.knownGene", update=F)
BiocManager::install("vsn", update=F)

#本番2.5(上記以外の手段でインストールするパッケージ)
#devtools::install_github("andrewsali/plotlyBars", upgrade=F)
#devtools::install_github("aroneklund/beeswarm", upgrade=F)
#no
#devtools::install_github("edwindj/ffbase", subdir="pkg", upgrade=F)
#no
#reticulate::py_install("phate", pip=TRUE)
#no

#本番3(Bioconductorから提供されているゲノム配列パッケージ群)
BiocManager::install("BSgenome.Hsapiens.UCSC.hg38", update=F)#ヒトゲノム(hg38)
BiocManager::install("BSgenome.Hsapiens.NCBI.GRCh38", update=F)#ヒトゲノム(hg38)機能ゲノム学の講義で利用するため2022.05.11にコメントアウトを外した
############
	

3. インストール確認

以下を「R コンソール画面」上でコピー&ペースト。 代表的なパッケージ群が正しくインストールされたかを確認しています。 ここの実行結果(特に2回目)で何のエラーメッセージも出なければOK。もし出たら、 「インストール | Rパッケージ | 個別(2018年11月以降)」 を参考にして、エラーが出たパッケージのインストールを個別に行ってください。

#1回目
library(ape)
library(baySeq)
library(beeswarm)
library(bio3d)
library(biomaRt)
library(Biostrings)
library(bit)
library(BSgenome)
library(BSgenome.Hsapiens.UCSC.hg38)
library(BSgenome.Hsapiens.NCBI.GRCh38)
library(cclust)
library(cluster)
library(clusterStab)
library(corrplot)
library(dada2)
library(data.table)
library(DESeq2)
library(devtools)
library(dplyr)
library(DT)
library(e1071)
library(edgeR)
library(ff)
library(fields)
library(FinePop)
library(FinePop2)
library(FIT)
library(fitdistrplus)
library(GenomicAlignments)
library(GenomicFeatures)
library(GGally)
library(ggplot2)
library(glmnet)
library(GSAR)
library(GSVA)
library(GSVAdata)
library(heatmaply)
library(KernSmooth)
library(knitr)
library(limma)
library(mapdata)
library(maps)
library(MASS)
library(MBCluster.Seq)
library(microseq)
library(msa)
library(MVA)
library(openxlsx)
library(org.Hs.eg.db)
library(pcaMethods)
library(Peptides)
library(phateR)
library(phyloseq)
library(plotly)
library(qqman)
library(qrqc)
library(QuasR)
library(R6)
library(randomForest)
library(RColorBrewer)
library(RCurl)
library(recount)
library(rgl)
library(rmarkdown)
library(rrBLUP)
library(Rsamtools)
library(rentrez)
library(rtracklayer)
library(Rtsne)
library(scatterplot3d)
library(seqinr)
library(seqLogo)
library(shiny)
library(shinydashboard)
library(shinyWidgets)
library(ShortRead)
library(som)
library(splatter)
library(SRAdb)
library(TCC)
library(tidyverse)
library(TxDb.Hsapiens.UCSC.hg38.knownGene)
library(BSgenome.Hsapiens.NCBI.GRCh38)
library(umap)
library(zoo)

#2回目(ここの実行結果でエラーが出てなければOK)
library(ape)
library(baySeq)
library(beeswarm)
library(bio3d)
library(biomaRt)
library(Biostrings)
library(bit)
library(BSgenome)
library(BSgenome.Hsapiens.UCSC.hg38)
library(cclust)
library(cluster)
library(clusterStab)
library(corrplot)
library(dada2)
library(data.table)
library(DESeq2)
library(devtools)
library(dplyr)
library(DT)
library(e1071)
library(edgeR)
library(ff)
library(fields)
library(FinePop)
library(FinePop2)
library(FIT)
library(fitdistrplus)
library(GenomicAlignments)
library(GenomicFeatures)
library(GGally)
library(ggplot2)
library(glmnet)
library(GSAR)
library(GSVA)
library(GSVAdata)
library(heatmaply)
library(KernSmooth)
library(knitr)
library(limma)
library(mapdata)
library(maps)
library(MASS)
library(MBCluster.Seq)
library(microseq)
library(msa)
library(MVA)
library(openxlsx)
library(org.Hs.eg.db)
library(pcaMethods)
library(phyloseq)
library(Peptides)
library(phateR)
library(plotly)
library(qqman)
library(qrqc)
library(QuasR)
library(R6)
library(randomForest)
library(RColorBrewer)
library(RCurl)
library(recount)
library(rgl)
library(rmarkdown)
library(rrBLUP)
library(Rsamtools)
library(rentrez)
library(rtracklayer)
library(Rtsne)
library(scatterplot3d)
library(seqinr)
library(seqLogo)
library(shiny)
library(shinydashboard)
library(shinyWidgets)
library(ShortRead)
library(som)
library(splatter)
library(SRAdb)
library(TCC)
library(tidyverse)
library(TxDb.Hsapiens.UCSC.hg38.knownGene)
library(umap)
library(zoo)
############
	

インストール | Rパッケージ | 個別(2018年11月以降)

文字通り、Rのパッケージを個別にインストールするやり方を示します。 このウェブページでは、Bioconductorから提供されているパッケージを数多く利用しています。 2018年10月31日リリースのBioconductor 3.8より、インストール方法が変更されましたのでご注意ください。 具体的には、biocLiteから、BiocManager::installを利用するやり方に変更されました。 「BiocManager::install」は「BiocManagerというパッケージ中にあるinstall関数」という意味です。 intallという関数は他のパッケージでも提供されている可能性があるため、「どのパッケージが提供するinstall関数か」を明示したい場合に玄人がよく利用します。

1. ゼブラフィッシュゲノムのパッケージ(BSgenome.Drerio.UCSC.danRer7)をインストールしたい場合:

400MB程度あります...。

param <- "BSgenome.Drerio.UCSC.danRer7"#パッケージ名を指定

#本番
BiocManager::install(param, update=F)  #paramで指定したパッケージのインストール

#後処理(ウェブサイト上で見えているバージョンとの比較)
BiocManager::valid(param)              #TRUEはOK、too newでもまあOK、out-of-dateなら注意
packageVersion(param)                  #バージョン情報を表示
	

2. TxDb.Rnorvegicus.UCSC.rn5.refGeneパッケージのインストールをしたい場合:

param <- "TxDb.Rnorvegicus.UCSC.rn5.refGene"#パッケージ名を指定

#本番
BiocManager::install(param, update=F)  #paramで指定したパッケージのインストール

#後処理(ウェブサイト上で見えているバージョンとの比較)
BiocManager::valid(param)              #TRUEはOK、too newでもまあOK、out-of-dateなら注意
packageVersion(param)                  #バージョン情報を表示
	

3. TxDb.Hsapiens.UCSC.hg38.knownGeneパッケージのインストールをしたい場合:

param <- "TxDb.Hsapiens.UCSC.hg38.knownGene"#パッケージ名を指定

#本番
BiocManager::install(param, update=F)  #paramで指定したパッケージのインストール

#後処理(ウェブサイト上で見えているバージョンとの比較)
BiocManager::valid(param)              #TRUEはOK、too newでもまあOK、out-of-dateなら注意
packageVersion(param)                  #バージョン情報を表示
	

4. 線虫ゲノムのパッケージ(BSgenome.Celegans.UCSC.ce6)をインストールしたい場合:

20MB程度です。

param <- "BSgenome.Celegans.UCSC.ce6"  #パッケージ名を指定

#本番
BiocManager::install(param, update=F)  #paramで指定したパッケージのインストール

#後処理(ウェブサイト上で見えているバージョンとの比較)
BiocManager::valid(param)              #TRUEはOK、too newでもまあOK、out-of-dateなら注意
packageVersion(param)                  #バージョン情報を表示
	

5. TxDb.Celegans.UCSC.ce6.ensGeneパッケージのインストールをしたい場合:

param <- "TxDb.Celegans.UCSC.ce6.ensGene"#パッケージ名を指定

#本番
BiocManager::install(param, update=F)  #paramで指定したパッケージのインストール

#後処理(ウェブサイト上で見えているバージョンとの比較)
BiocManager::valid(param)              #TRUEはOK、too newでもまあOK、out-of-dateなら注意
packageVersion(param)                  #バージョン情報を表示
	

6. 大腸菌ゲノムのパッケージ(BSgenome.Ecoli.NCBI.20080805)をインストールしたい場合:

20MB程度です。

param <- "BSgenome.Ecoli.NCBI.20080805"#パッケージ名を指定

#本番
BiocManager::install(param, update=F)  #paramで指定したパッケージのインストール

#後処理(ウェブサイト上で見えているバージョンとの比較)
BiocManager::valid(param)              #TRUEはOK、too newでもまあOK、out-of-dateなら注意
packageVersion(param)                  #バージョン情報を表示
	

7. イヌゲノムのパッケージ(BSgenome.Cfamiliaris.UCSC.canFam3)をインストールしたい場合:

550MB程度です。

param <- "BSgenome.Cfamiliaris.UCSC.canFam3"#パッケージ名を指定

#本番
BiocManager::install(param, update=F)  #paramで指定したパッケージのインストール

#後処理(ウェブサイト上で見えているバージョンとの比較)
BiocManager::valid(param)              #TRUEはOK、too newでもまあOK、out-of-dateなら注意
packageVersion(param)                  #バージョン情報を表示
	

8. ショウジョウバエゲノムのパッケージ(BSgenome.Dmelanogaster.UCSC.dm2)をインストールしたい場合:

30MB程度です。

param <- "BSgenome.Dmelanogaster.UCSC.dm2"#パッケージ名を指定

#本番
BiocManager::install(param, update=F)  #paramで指定したパッケージのインストール

#後処理(ウェブサイト上で見えているバージョンとの比較)
BiocManager::valid(param)              #TRUEはOK、too newでもまあOK、out-of-dateなら注意
packageVersion(param)                  #バージョン情報を表示
	

9. イネゲノムのパッケージ(BSgenome.Osativa.MSU.MSU7)をインストールしたい場合:

100MB程度です。

param <- "BSgenome.Osativa.MSU.MSU7"#パッケージ名を指定

#本番
BiocManager::install(param, update=F)  #paramで指定したパッケージのインストール

#後処理(ウェブサイト上で見えているバージョンとの比較)
BiocManager::valid(param)              #TRUEはOK、too newでもまあOK、out-of-dateなら注意
packageVersion(param)                  #バージョン情報を表示
	

インストール | Rパッケージ | 個別(2018年11月以前)

このウェブページでは、Bioconductorから提供されているパッケージを数多く利用していますが、 2018年10月31日リリースのBioconductor 3.8よりインストール方法が変更されました。 ここでは、2018年11月までの主な「Rパッケージを個別にインストールするやり方」を示します。

1. ゼブラフィッシュゲノムのパッケージ(BSgenome.Drerio.UCSC.danRer7)をインストールしたい場合:

400MB程度あります...。

param <- "BSgenome.Drerio.UCSC.danRer7"#パッケージ名を指定

#本番
source("http://bioconductor.org/biocLite.R")#おまじない
biocLite(param, suppressUpdates=TRUE)  #おまじない
	

2. TxDb.Rnorvegicus.UCSC.rn5.refGeneパッケージのインストールをしたい場合:

param <- "TxDb.Rnorvegicus.UCSC.rn5.refGene"#パッケージ名を指定

#本番
source("http://bioconductor.org/biocLite.R")#おまじない
biocLite(param, suppressUpdates=TRUE)  #おまじない
	

基本的な利用法

以下は、インストール | についてを参考にして必要なパッケージのインストールが完了済みのヒトを対象として、 このウェブページの基本的な利用法を簡単に解説したものです。

サンプルデータ

  1. Illumina/36bp/single-end/human (SRA000299) data (Marioni et al., Genome Res., 2008)

    「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からもわかります):

  2. 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)
    
  3. Illumina/36bp/single-end/human (SRA000299) data (Marioni et al., Genome Res., 2008)

    Supplementary table 2のデータを取り扱いやすく加工したデータです。 オリジナルのものは最初の6列が発現データ以外のものだったり、7列目以降も二種類のサンプルが交互に出てくるなど若干R上で表現しずらかったため、以下のようにわかりやすくしたものです。 つまり、サンプルを3pMのものだけにして、「1列目:Genename, 2-6列目:Kidney群, 7-11列目:Liver群」と変更したSupplementaryTable2_changed.txtです:

  4. 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)
    
  5. Illumina/36bp/single-end/human (SRA000299) data (Marioni et al., Genome Res., 2008)

    上記SupplementaryTable2_changed.txtをさらに加工したデータ。 NGSデータは(マイクロアレイの黎明期と同じく)金がかかりますので(technical and/or biological) replicatesを簡単には増やせませんので、「1サンプル vs. 1サンプル」比較の局面がまだまだあろうかと思います。 そこで、上記ファイルの2-6列目と7-11列目をそれぞれまとめた(総和をとった)ものSupplementaryTable2_changed2.txtです。

  6. カウントデータ(SupplementaryTable2_changed.txt)と長さ情報ファイル(ens_gene_46_length.txt)を読み込んで、 以下を実行して、「配列長情報を含み、カウント数の和が0より大きい行のみ抽出した結果」です。カウントデータファイル(data_marioni.txt)と配列長情報ファイル(length_marioni.txt)。
    in_f1 <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_f1に格納(カウントデータファイル)
    in_f2 <- "ens_gene_46_length.txt"      #入力ファイル名を指定してin_f2に格納(長さ情報ファイル)
    out_f1 <- "data_marioni.txt"           #出力ファイル名を指定してout_f1に格納
    out_f2 <- "length_marioni.txt"         #出力ファイル名を指定してout_f2に格納
    
    #入力ファイルの読み込み
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
    len <- read.table(in_f2, header=TRUE, sep="\t", quote="")#in_f2で指定したファイルの読み込み
    dim(data)                              #行数と列数を表示
    dim(len)                               #行数と列数を表示
    
    #本番(共通IDのもののみ抽出)
    rownames(len) <- len[,1]               #行の名前としてIDを与えている
    common <- intersect(rownames(len), rownames(data))#共通IDをcommonに格納
    data <- data[common,]                  #共通IDのもののみ抽出
    len <- len[common,]                    #共通IDのもののみ抽出
    dim(data)                              #行数と列数を表示
    dim(len)                               #行数と列数を表示
    head(data)                             #確認してるだけです
    head(len)                              #確認してるだけです
    
    #本番(ゼロカウントデータのフィルタリング)
    obj <- (rowSums(data) > 0)             #条件を満たすかどうかを判定した結果をobjに格納
    data <- data[obj,]                     #objがTRUEとなる要素のみ抽出した結果をdataに格納
    len <- len[obj,]                       #objがTRUEとなる要素のみ抽出した結果をlenに格納
    dim(data)                              #行数と列数を表示
    dim(len)                               #行数と列数を表示
    head(data)                             #確認してるだけです
    head(len)                              #確認してるだけです
    
    #ファイルに保存
    tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
    write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    write.table(len, out_f2, sep="\t", append=F, quote=F, row.names=F)#lenの中身を指定したファイル名で保存
    	
  7. ABI_SOLiD/25-35bp/single-end/mouse (SRA000306; EB vs. ES) data (Cloonan et al., Nat Methods, 2008)
  8. Illumina/50bp/paired-end/mouse (SRA012213; liver) data (Robertson et al., Nat Methods, 2010)
  9. Illumina/35bp/single-end/human (SRA010153; MAQC) data (Bullard et al., BMC Bioinformatics, 2010)

    SRR037439から得られるFASTQファイルの最初の2000行分を抽出したMAQC2 brainデータ

    非圧縮版:SRR037439.fastq

    gzip圧縮版:SRR037439.fastq.gz

  10. NBPSeqパッケージ(Di et al., SAGMB, 10:art24, 2011)中の ArabidopsisのBiological replicatesデータ(G1群3サンプル vs. G2群3サンプル; Cumbie et al., PLoS One, 2011)です。

    26,221 genes×6 samplesの「複製あり」タグカウントデータ(data_arab.txt)

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

  11. ReCountデータベース(Frazee et al., BMC Bioinformatics, 2011)

    マッピング済みの遺伝子発現行列形式のデータセットを多数提供しています。

  12. Yeastの二群間比較用データ(2 mutant strains vs. 2 wild-types; technical replicates)

    7065行 × 4列のyeast RNA-seqデータ(data_yeast_7065.txt)

    yeastRNASeq (Lee et al., PLoS Genet., 2008)がインストールされていれば、R Console画面上で以下のコマンドのコピペでも取得可能です:

    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の中身を指定したファイル名で保存
    	
  13. 上記Yeastの二群間比較用データを用いてGC-content normalizationなどを行う場合に必要な情報

    yeast genes (SGD ver. r64)のGC含量(yeastGC_6717.txt)やlength情報(yeastLength_6717.txt)。
      EDASeq (Risso et al., BMC Bioinformatics, 2011)がインストールされていれば、R Console画面上で以下のコマンドのコピペでも取得可能です:

    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の中身を指定したファイル名で保存
    	
  14. 「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)     #保存したい情報を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の中身を指定したファイル名で保存
    	
  15. TCCパッケージ中のBiological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。
      10,000 genes×6 samplesの「複製あり」タグカウントデータ(data_hypodata_3vs3.txt)
      「G1_rep1, G1_rep2, G1_rep3, G2_rep1, G2_rep2, G2_rep3」の計6サンプル分からなります。
      全10,000遺伝子中の最初の2,000個(gene_1〜gene_2000まで)が発現変動遺伝子(DEG)です。
      全2,000 DEGsの内訳:最初の90%分(gene_1〜gene_1800)がG1群で4倍高発現、残りの10%分(gene_1801〜gene_2000)がG2群で4倍高発現
      以下のコピペでも(数値は違ってきますが)同じ条件のシミュレーションデータを作成可能です。:
    library(TCC)                           #パッケージの読み込み
    set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
    tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.2,#シミュレーションデータの作成
                 DEG.assign = c(0.9, 0.1), #シミュレーションデータの作成
                 DEG.foldchange = c(4, 4), #シミュレーションデータの作成
                 replicates = c(3, 3))     #シミュレーションデータの作成
    plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
    
    #ファイルに保存
    tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
    write.table(tmp, "data_hypodata_3vs3.txt", sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  16. 上記のTCCパッケージ中のBiological replicatesを模倣した 「G1_rep1, G1_rep2, G1_rep3, G2_rep1, G2_rep2, G2_rep3」の計6サンプルからなるシミュレーションデータから、1列目と4列目のデータを抽出した「複製なし」タグカウントデータ(data_hypodata_1vs1.txt)
      よって、「G1_rep1, G2_rep1」の計2サンプル分のみからなります。
      以下のコピペでも(数値は違ってきますが)同じ条件のシミュレーションデータを作成可能です。:
    library(TCC)                           #パッケージの読み込み
    set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
    tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.2,#シミュレーションデータの作成
                 DEG.assign = c(0.9, 0.1), #シミュレーションデータの作成
                 DEG.foldchange = c(4, 4), #シミュレーションデータの作成
                 replicates = c(1, 1))     #シミュレーションデータの作成
    plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
    
    #ファイルに保存
    tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
    write.table(tmp, "data_hypodata_1vs1.txt", sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  17. TCCパッケージ中のBiological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 10,000 genes×9 samplesの「複製あり」タグカウントデータ(data_hypodata_3vs3vs3.txt) 「G1_rep1, G1_rep2, G1_rep3, G2_rep1, G2_rep2, G2_rep3, G3_rep1, G3_rep2, G3_rep3」の計9サンプル分からなります。 全10,000遺伝子中の最初の3,000個(gene_1〜gene_3000まで)が発現変動遺伝子(DEG)です。 全3,000 DEGsの内訳:(1)最初の70%分(gene_1〜gene_2100)がG1群で3倍高発現、(2)次の20%分(gene_2101〜gene_2700)がG2群で10倍高発現、(3)残りの10%分(gene_2701〜gene_3000)がG3群で6倍高発現 以下のコピペでも取得可能です。

    out_f <- "data_hypodata_3vs3vs3.txt"   #出力ファイル名を指定してout_fに格納
    param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
    param_Ngene <- 10000                   #全遺伝子数を指定
    param_PDEG <- 0.3                      #発現変動遺伝子の割合を指定    
    param_FC <- c(3, 10, 6)                #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
    param_DEGassign <- c(0.7, 0.2, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
    
    #必要なパッケージをロード
    library(TCC)                           #パッケージの読み込み
    
    #シミュレーションデータの作成
    set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
    tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
                PDEG=param_PDEG,           #シミュレーションデータの作成
                DEG.assign=param_DEGassign,#シミュレーションデータの作成
                DEG.foldchange=param_FC,   #シミュレーションデータの作成
                replicates=param_replicates)#シミュレーションデータの作成
    plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
    
    #ファイルに保存(テキストファイル)
    tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  18. TCCパッケージ中のBiological replicatesを模倣したシミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 10,000 genes×9 samplesの「複製あり」タグカウントデータ(data_hypodata_2vs4vs3.txt) 「G1_rep1, G1_rep2, G2_rep1, G2_rep2, G2_rep3, G2_rep4, G3_rep1, G3_rep2, G3_rep3」の計9サンプル分からなります。 全10,000遺伝子中の最初の3,000個(gene_1〜gene_3000まで)が発現変動遺伝子(DEG)です。 全3,000 DEGsの内訳:(1)最初の70%分(gene_1〜gene_2100)がG1群で3倍高発現、(2)次の20%分(gene_2101〜gene_2700)がG2群で10倍高発現、(3)残りの10%分(gene_2701〜gene_3000)がG3群で6倍高発現 以下のコピペでも取得可能です。

    library(TCC)                           #パッケージの読み込み
    set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
    tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
                 DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
                 DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
                 replicates = c(2, 4, 3))  #各群のサンプル数を指定
    plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
    
    #ファイルに保存
    tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
    write.table(tmp, "data_hypodata_2vs4vs3.txt", sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  19. Illumina/35bp/single-end/human (SRA000299; kidney vs. liver) data (Marioni et al., Genome Res., 2008)
  20. ランダムな塩基配列から生成したリファレンスゲノム配列データ(ref_genome.fa)。 48, 160, 100, 123, 100 bpの配列長をもつ、計5つの塩基配列を生成しています。 description行は"contig"という記述を基本としています。塩基の存在比はAが28%, Cが22%, Gが26%, Tが24%にしています。 set.seed関数を利用し、chr3の配列と同じものをchr5としてコピーして作成したのち、2番目と7番目の塩基置換を行っています。 そのため、実際に指定するのは最初の4つ分の配列長のみです。

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

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

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

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

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

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

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

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

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

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

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

  27. Illumina HiSeq 2000/100bp/paired-end/human (GSE42960) data (Chan et al., Hum. Mol. Genet., 2013)

    ヒトPBMCというサンプルの2群間比較用データ:未処理群2サンプル (FRDA05-UT and FRDA19.UTB) vs. ニコチンアミド処理群2サンプル(FRDA05-NicoとFRDA19.NB)。 原著論文中では、GSE42960のみが示されていますが、 日米欧三極のDB( SRP017580 by SRA; SRP017580 by DRA; SRP017580 by ENA) からも概観できます。

    ペアエンドデータのSRR633902_1.fastqを入力として、最初の1000リード分を抽出することで、 SRR633902_1_sub.fastqを作成しています。 writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。 ここではcompress=Fとして非圧縮ファイルを出力しています。

    in_f <- "SRR633902_1.fastq.gz"         #入力ファイル名を指定してin_fに格納
    out_f <- "SRR633902_1_sub.fastq"       #出力ファイル名を指定してout_fに格納
    param <- 1000                          #抽出したいリード数を指定
    
    #必要なパッケージをロード
    library(ShortRead)                     #パッケージの読み込み
    
    #入力ファイルの読み込み
    fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
    fastq                                  #fastq情報を表示
    
    #本番(サブセットの抽出)
    fastq <- fastq[1:param]                #サブセットを抽出
    fastq                                  #fastq情報を表示
    
    #ファイルに保存
    writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
    	
  28. Illumina Genome Analyzer II/54bp/single-end/human (SRP017142; GSE42212) data (Neyret-Kahn et al., Genome Res., 2013)

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

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

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

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

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

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

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

    原著論文中では、GSE36469のみが示されていますが、 日米欧三極のDB( SRP011435 by SRA; SRP011435 by DRA; SRP011435 by ENA) からも概観できます。

  32. PacBio/xxx bp/Human (ERP003225) data (Sharon et al., Nat Biotechnol., 2013)

    ヒトの長鎖RNA-seqデータです。配列長はリードによって異なります。

  33. PacBio/xxx bp/Chicken (SRP038897 by DRA; SRP038897 by ENA; SRP038897 by SRA) data (Sharon et al., PLoS One, 2014)

    ニワトリの長鎖RNA-seqデータです。配列長はリードによって異なります。

  34. k-mer解析用のランダム配列から生成したFASTA形式ファイル(sample32_ref.fastasample32_ngs.fasta)です。

    50塩基の長さのリファレンス配列を生成したのち、20塩基長の部分配列を10リード分だけランダム抽出したものです。 塩基の存在比はAが22%, Cが28%, Gが28%, Tが22%にしています。 リファレンス配列(仮想ゲノム配列)がsample32_ref.fastaで、 10リードからなる仮想NGSデータがsample32_ngs.fastaです。 リード長20塩基で10リードなのでトータル200塩基となり、50塩基からなる元のゲノム配列の4倍シーケンスしていることになります(4X coverageに相当)。 イントロ | NGS | 配列取得 | シミュレーションデータ | ランダムな塩基配列の生成からと基本的に同じです。

    out_f1 <- "sample32_ref.fasta"         #出力ファイル名を指定してout_f1に格納
    out_f2 <- "sample32_ngs.fasta"         #出力ファイル名を指定してout_f2に格納
    param_len_ref <- 50                    #リファレンス配列の長さを指定
    narabi <- c("A","C","G","T")           #以下の数値指定時にACGTの並びを間違えないようにするために表示(内部的にも使用してます)
    param_composition <- c(22, 28, 28, 22) #(A,C,G,Tの並びで)各塩基の存在比率を指定
    param_len_ngs <- 20                    #リード長を指定
    param_num_ngs <- 10                    #リード数を指定
    param_desc <- "kkk"                    #FASTA形式ファイルのdescription行に記述する内容
    
    #必要なパッケージをロード
    library(Biostrings)                    #パッケージの読み込み
    
    #本番(リファレンス配列生成)
    set.seed(1010)                         #おまじない(同じ乱数になるようにするため)
    ACGTset <- rep(narabi, param_composition)#narabi中の塩基がparam_compositionで指定した数だけ存在する文字列ベクトルACGTsetを作成
    reference <- paste(sample(ACGTset, param_len_ref, replace=T), collapse="")#ACGTsetからparam_len_ref回分だけ復元抽出して得られた塩基配列をreferenceに格納
    reference <- DNAStringSet(reference)   #DNA塩基配列だと認識させるDNAStringSet関数を適用した結果をreferenceに格納
    names(reference) <- param_desc         #description行に相当する記述を追加している
    reference                              #確認してるだけです
    
    #本番(シミュレーションデータ生成)
    s_posi <- sample(1:(param_len_ref-param_len_ngs), param_num_ngs, replace=T)#部分塩基配列抽出時のstart position情報として用いる乱数ベクトルをs_posiに格納
    s_posi                                 #確認してるだけです
    hoge <- NULL                           #最終的に得る結果を格納するためのプレースホルダhogeを作成しているだけ
    for(i in 1:length(s_posi)){            #length(s_posi)回だけループを回す
        hoge <- append(hoge, subseq(reference, start=s_posi[i], width=param_len_ngs))#subseq関数を用いてs_posi[i]からparam_len_ngsで与えた配列長に対応する部分配列をhogeに格納
    }
    fasta <- hoge                          #hogeの中身をfastaに格納
    
    #後処理(description部分の作成)
    description <- paste(param_desc, s_posi, (s_posi+param_len_ngs-1), sep="_")#param_descやs_posiなどを"_"で結合したものをdescriptionに格納
    names(fasta) <- description            #description行に相当する記述を追加している
    fasta                                  #確認してるだけです
    
    #ファイルに保存(仮想リファレンス配列と仮想NGS配列)
    writeXStringSet(reference, file=out_f1, format="fasta", width=50)#referenceの中身を指定したファイル名で保存
    writeXStringSet(fasta, file=out_f2, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
    	
  35. k-mer解析用のランダム配列から生成したFASTA形式ファイル(sample33_ref.fastasample33_ngs.fasta)です。

    1000塩基の長さのリファレンス配列を生成したのち、20塩基長の部分配列を200リード分だけランダム抽出したものです。 塩基の存在比はAが22%, Cが28%, Gが28%, Tが22%にしています。 リファレンス配列(仮想ゲノム配列)がsample33_ref.fastaで、 200リードからなる仮想NGSデータがsample33_ngs.fastaです。 リード長20塩基で200リードなのでトータル4,000塩基となり、1,000塩基からなる元のゲノム配列の4倍シーケンスしていることになります(4X coverageに相当)。 イントロ | NGS | 配列取得 | シミュレーションデータ | ランダムな塩基配列の生成からと基本的に同じです。 2014年から提供していたものと下記のコピペ実行結果が異なっていることがわかったので、2020年3月16日に中身を変更しました(おそらく昔はset.seedを付けていなかったのだと思われます)。

    out_f1 <- "sample33_ref.fasta"         #出力ファイル名を指定してout_f1に格納
    out_f2 <- "sample33_ngs.fasta"         #出力ファイル名を指定してout_f2に格納
    param_len_ref <- 1000                  #リファレンス配列の長さを指定
    narabi <- c("A","C","G","T")           #以下の数値指定時にACGTの並びを間違えないようにするために表示(内部的にも使用してます)
    param_composition <- c(22, 28, 28, 22) #(A,C,G,Tの並びで)各塩基の存在比率を指定
    param_len_ngs <- 20                    #リード長を指定
    param_num_ngs <- 200                   #リード数を指定
    param_desc <- "kkk"                    #FASTA形式ファイルのdescription行に記述する内容
    
    #必要なパッケージをロード
    library(Biostrings)                    #パッケージの読み込み
    
    #本番(リファレンス配列生成)
    set.seed(1010)                         #おまじない(同じ乱数になるようにするため)
    ACGTset <- rep(narabi, param_composition)#narabi中の塩基がparam_compositionで指定した数だけ存在する文字列ベクトルACGTsetを作成
    reference <- paste(sample(ACGTset, param_len_ref, replace=T), collapse="")#ACGTsetからparam_len_ref回分だけ復元抽出して得られた塩基配列をreferenceに格納
    reference <- DNAStringSet(reference)   #DNA塩基配列だと認識させるDNAStringSet関数を適用した結果をreferenceに格納
    names(reference) <- param_desc         #description行に相当する記述を追加している
    reference                              #確認してるだけです
    
    #本番(シミュレーションデータ生成)
    s_posi <- sample(1:(param_len_ref-param_len_ngs), param_num_ngs, replace=T)#部分塩基配列抽出時のstart position情報として用いる乱数ベクトルをs_posiに格納
    s_posi                                 #確認してるだけです
    hoge <- NULL                           #最終的に得る結果を格納するためのプレースホルダhogeを作成しているだけ
    for(i in 1:length(s_posi)){            #length(s_posi)回だけループを回す
        hoge <- append(hoge, subseq(reference, start=s_posi[i], width=param_len_ngs))#subseq関数を用いてs_posi[i]からparam_len_ngsで与えた配列長に対応する部分配列をhogeに格納
    }
    fasta <- hoge                          #hogeの中身をfastaに格納
    
    #後処理(description部分の作成)
    description <- paste(param_desc, s_posi, (s_posi+param_len_ngs-1), sep="_")#param_descやs_posiなどを"_"で結合したものをdescriptionに格納
    names(fasta) <- description            #description行に相当する記述を追加している
    fasta                                  #確認してるだけです
    
    #ファイルに保存(仮想リファレンス配列と仮想NGS配列)
    writeXStringSet(reference, file=out_f1, format="fasta", width=50)#referenceの中身を指定したファイル名で保存
    writeXStringSet(fasta, file=out_f2, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
    	
  36. k-mer解析用のランダム配列から生成したFASTA形式ファイル(sample34_ref.fastasample34_ngs.fasta)です。

    1000塩基の長さのリファレンス配列を生成したのち、20塩基長の部分配列を500リード分だけランダム抽出したものです。 塩基の存在比はAが22%, Cが28%, Gが28%, Tが22%にしています。 リファレンス配列(仮想ゲノム配列)がsample34_ref.fastaで、 500リードからなる仮想NGSデータがsample34_ngs.fastaです。 リード長20塩基で500リードなのでトータル10,000塩基となり、1,000塩基からなる元のゲノム配列の10倍シーケンスしていることになります(10X coverageに相当)。 イントロ | NGS | 配列取得 | シミュレーションデータ | ランダムな塩基配列の生成からと基本的に同じです。 2014年から提供していたものと下記のコピペ実行結果が異なっていることがわかったので、2020年3月16日に中身を変更しました(おそらく昔はset.seedを付けていなかったのだと思われます)。

    out_f1 <- "sample34_ref.fasta"         #出力ファイル名を指定してout_f1に格納
    out_f2 <- "sample34_ngs.fasta"         #出力ファイル名を指定してout_f2に格納
    param_len_ref <- 1000                  #リファレンス配列の長さを指定
    narabi <- c("A","C","G","T")           #以下の数値指定時にACGTの並びを間違えないようにするために表示(内部的にも使用してます)
    param_composition <- c(22, 28, 28, 22) #(A,C,G,Tの並びで)各塩基の存在比率を指定
    param_len_ngs <- 20                    #リード長を指定
    param_num_ngs <- 500                   #リード数を指定
    param_desc <- "kkk"                    #FASTA形式ファイルのdescription行に記述する内容
    
    #必要なパッケージをロード
    library(Biostrings)                    #パッケージの読み込み
    
    #本番(リファレンス配列生成)
    set.seed(1010)                         #おまじない(同じ乱数になるようにするため)
    ACGTset <- rep(narabi, param_composition)#narabi中の塩基がparam_compositionで指定した数だけ存在する文字列ベクトルACGTsetを作成
    reference <- paste(sample(ACGTset, param_len_ref, replace=T), collapse="")#ACGTsetからparam_len_ref回分だけ復元抽出して得られた塩基配列をreferenceに格納
    reference <- DNAStringSet(reference)   #DNA塩基配列だと認識させるDNAStringSet関数を適用した結果をreferenceに格納
    names(reference) <- param_desc         #description行に相当する記述を追加している
    reference                              #確認してるだけです
    
    #本番(シミュレーションデータ生成)
    s_posi <- sample(1:(param_len_ref-param_len_ngs), param_num_ngs, replace=T)#部分塩基配列抽出時のstart position情報として用いる乱数ベクトルをs_posiに格納
    s_posi                                 #確認してるだけです
    hoge <- NULL                           #最終的に得る結果を格納するためのプレースホルダhogeを作成しているだけ
    for(i in 1:length(s_posi)){            #length(s_posi)回だけループを回す
        hoge <- append(hoge, subseq(reference, start=s_posi[i], width=param_len_ngs))#subseq関数を用いてs_posi[i]からparam_len_ngsで与えた配列長に対応する部分配列をhogeに格納
    }
    fasta <- hoge                          #hogeの中身をfastaに格納
    
    #後処理(description部分の作成)
    description <- paste(param_desc, s_posi, (s_posi+param_len_ngs-1), sep="_")#param_descやs_posiなどを"_"で結合したものをdescriptionに格納
    names(fasta) <- description            #description行に相当する記述を追加している
    fasta                                  #確認してるだけです
    
    #ファイルに保存(仮想リファレンス配列と仮想NGS配列)
    writeXStringSet(reference, file=out_f1, format="fasta", width=50)#referenceの中身を指定したファイル名で保存
    writeXStringSet(fasta, file=out_f2, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
    	
  37. k-mer解析用のランダム配列から生成したFASTA形式ファイル(sample35_ref.fastasample35_ngs.fasta)です。

    10000塩基の長さのリファレンス配列を生成したのち、40塩基長の部分配列を2500リード分だけランダム抽出したものです。 塩基の存在比はAが22%, Cが28%, Gが28%, Tが22%にしています。 リファレンス配列(仮想ゲノム配列)がsample35_ref.fastaで、 2500リードからなる仮想NGSデータがsample35_ngs.fastaです。 リード長40塩基で2500リードなのでトータル100,000塩基となり、10,000塩基からなる元のゲノム配列の10倍シーケンスしていることになります(10X coverageに相当)。 イントロ | NGS | 配列取得 | シミュレーションデータ | ランダムな塩基配列の生成からと基本的に同じです。

    out_f1 <- "sample35_ref.fasta"         #出力ファイル名を指定してout_f1に格納
    out_f2 <- "sample35_ngs.fasta"         #出力ファイル名を指定してout_f2に格納
    param_len_ref <- 10000                 #リファレンス配列の長さを指定
    narabi <- c("A","C","G","T")           #以下の数値指定時にACGTの並びを間違えないようにするために表示(内部的にも使用してます)
    param_composition <- c(22, 28, 28, 22) #(A,C,G,Tの並びで)各塩基の存在比率を指定
    param_len_ngs <- 40                    #リード長を指定
    param_num_ngs <- 2500                  #リード数を指定
    param_desc <- "kkk"                    #FASTA形式ファイルのdescription行に記述する内容
    
    #必要なパッケージをロード
    library(Biostrings)                    #パッケージの読み込み
    
    #本番(リファレンス配列生成)
    set.seed(1010)                         #おまじない(同じ乱数になるようにするため)
    ACGTset <- rep(narabi, param_composition)#narabi中の塩基がparam_compositionで指定した数だけ存在する文字列ベクトルACGTsetを作成
    reference <- paste(sample(ACGTset, param_len_ref, replace=T), collapse="")#ACGTsetからparam_len_ref回分だけ復元抽出して得られた塩基配列をreferenceに格納
    reference <- DNAStringSet(reference)   #DNA塩基配列だと認識させるDNAStringSet関数を適用した結果をreferenceに格納
    names(reference) <- param_desc         #description行に相当する記述を追加している
    reference                              #確認してるだけです
    
    #本番(シミュレーションデータ生成)
    s_posi <- sample(1:(param_len_ref-param_len_ngs), param_num_ngs, replace=T)#部分塩基配列抽出時のstart position情報として用いる乱数ベクトルをs_posiに格納
    s_posi                                 #確認してるだけです
    hoge <- NULL                           #最終的に得る結果を格納するためのプレースホルダhogeを作成しているだけ
    for(i in 1:length(s_posi)){            #length(s_posi)回だけループを回す
        hoge <- append(hoge, subseq(reference, start=s_posi[i], width=param_len_ngs))#subseq関数を用いてs_posi[i]からparam_len_ngsで与えた配列長に対応する部分配列をhogeに格納
    }
    fasta <- hoge                          #hogeの中身をfastaに格納
    
    #後処理(description部分の作成)
    description <- paste(param_desc, s_posi, (s_posi+param_len_ngs-1), sep="_")#param_descやs_posiなどを"_"で結合したものをdescriptionに格納
    names(fasta) <- description            #description行に相当する記述を追加している
    fasta                                  #確認してるだけです
    
    #ファイルに保存(仮想リファレンス配列と仮想NGS配列)
    writeXStringSet(reference, file=out_f1, format="fasta", width=50)#referenceの中身を指定したファイル名で保存
    writeXStringSet(fasta, file=out_f2, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
    	
  38. k-mer解析用のランダム配列から生成したFASTA形式ファイル(sample36_ref.fastasample36_ngs.fasta)です。

    10000塩基の長さのリファレンス配列を生成したのち、80塩基長の部分配列を5000リード分だけランダム抽出したものです。 塩基の存在比はAが22%, Cが28%, Gが28%, Tが22%にしています。 リファレンス配列(仮想ゲノム配列)がsample36_ref.fastaで、 5,000リードからなる仮想NGSデータがsample36_ngs.fastaです。 リード長80塩基で5,000リードなのでトータル400,000塩基となり、10,000塩基からなる元のゲノム配列の40倍シーケンスしていることになります(40X coverageに相当)。 イントロ | NGS | 配列取得 | シミュレーションデータ | ランダムな塩基配列の生成からと基本的に同じです。

    out_f1 <- "sample36_ref.fasta"         #出力ファイル名を指定してout_f1に格納
    out_f2 <- "sample36_ngs.fasta"         #出力ファイル名を指定してout_f2に格納
    param_len_ref <- 10000                 #リファレンス配列の長さを指定
    narabi <- c("A","C","G","T")           #以下の数値指定時にACGTの並びを間違えないようにするために表示(内部的にも使用してます)
    param_composition <- c(22, 28, 28, 22) #(A,C,G,Tの並びで)各塩基の存在比率を指定
    param_len_ngs <- 80                    #リード長を指定
    param_num_ngs <- 5000                  #リード数を指定
    param_desc <- "kkk"                    #FASTA形式ファイルのdescription行に記述する内容
    
    #必要なパッケージをロード
    library(Biostrings)                    #パッケージの読み込み
    
    #本番(リファレンス配列生成)
    set.seed(1010)                         #おまじない(同じ乱数になるようにするため)
    ACGTset <- rep(narabi, param_composition)#narabi中の塩基がparam_compositionで指定した数だけ存在する文字列ベクトルACGTsetを作成
    reference <- paste(sample(ACGTset, param_len_ref, replace=T), collapse="")#ACGTsetからparam_len_ref回分だけ復元抽出して得られた塩基配列をreferenceに格納
    reference <- DNAStringSet(reference)   #DNA塩基配列だと認識させるDNAStringSet関数を適用した結果をreferenceに格納
    names(reference) <- param_desc         #description行に相当する記述を追加している
    reference                              #確認してるだけです
    
    #本番(シミュレーションデータ生成)
    s_posi <- sample(1:(param_len_ref-param_len_ngs), param_num_ngs, replace=T)#部分塩基配列抽出時のstart position情報として用いる乱数ベクトルをs_posiに格納
    s_posi                                 #確認してるだけです
    hoge <- NULL                           #最終的に得る結果を格納するためのプレースホルダhogeを作成しているだけ
    for(i in 1:length(s_posi)){            #length(s_posi)回だけループを回す
        hoge <- append(hoge, subseq(reference, start=s_posi[i], width=param_len_ngs))#subseq関数を用いてs_posi[i]からparam_len_ngsで与えた配列長に対応する部分配列をhogeに格納
    }
    fasta <- hoge                          #hogeの中身をfastaに格納
    
    #後処理(description部分の作成)
    description <- paste(param_desc, s_posi, (s_posi+param_len_ngs-1), sep="_")#param_descやs_posiなどを"_"で結合したものをdescriptionに格納
    names(fasta) <- description            #description行に相当する記述を追加している
    fasta                                  #確認してるだけです
    
    #ファイルに保存(仮想リファレンス配列と仮想NGS配列)
    writeXStringSet(reference, file=out_f1, format="fasta", width=50)#referenceの中身を指定したファイル名で保存
    writeXStringSet(fasta, file=out_f2, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
    	
  39. k-mer解析用のランダム配列から生成したFASTA形式ファイル(sample37_ref.fastasample37_ngs.fasta)です。

    10000塩基の長さのリファレンス配列を生成したのち、100塩基長の部分配列を10000リード分だけランダム抽出したものです。 塩基の存在比はAが22%, Cが28%, Gが28%, Tが22%にしています。 リファレンス配列(仮想ゲノム配列)がsample37_ref.fastaで、 10,000リードからなる仮想NGSデータがsample37_ngs.fastaです。 リード長100塩基で10,000リードなのでトータル1,000,000塩基となり、10,000塩基からなる元のゲノム配列の100倍シーケンスしていることになります(100X coverageに相当)。 イントロ | NGS | 配列取得 | シミュレーションデータ | ランダムな塩基配列の生成からと基本的に同じです。

    out_f1 <- "sample37_ref.fasta"         #出力ファイル名を指定してout_f1に格納
    out_f2 <- "sample37_ngs.fasta"         #出力ファイル名を指定してout_f2に格納
    param_len_ref <- 10000                 #リファレンス配列の長さを指定
    narabi <- c("A","C","G","T")           #以下の数値指定時にACGTの並びを間違えないようにするために表示(内部的にも使用してます)
    param_composition <- c(22, 28, 28, 22) #(A,C,G,Tの並びで)各塩基の存在比率を指定
    param_len_ngs <- 100                   #リード長を指定
    param_num_ngs <- 10000                 #リード数を指定
    param_desc <- "kkk"                    #FASTA形式ファイルのdescription行に記述する内容
    
    #必要なパッケージをロード
    library(Biostrings)                    #パッケージの読み込み
    
    #本番(リファレンス配列生成)
    set.seed(1010)                         #おまじない(同じ乱数になるようにするため)
    ACGTset <- rep(narabi, param_composition)#narabi中の塩基がparam_compositionで指定した数だけ存在する文字列ベクトルACGTsetを作成
    reference <- paste(sample(ACGTset, param_len_ref, replace=T), collapse="")#ACGTsetからparam_len_ref回分だけ復元抽出して得られた塩基配列をreferenceに格納
    reference <- DNAStringSet(reference)   #DNA塩基配列だと認識させるDNAStringSet関数を適用した結果をreferenceに格納
    names(reference) <- param_desc         #description行に相当する記述を追加している
    reference                              #確認してるだけです
    
    #本番(シミュレーションデータ生成)
    s_posi <- sample(1:(param_len_ref-param_len_ngs), param_num_ngs, replace=T)#部分塩基配列抽出時のstart position情報として用いる乱数ベクトルをs_posiに格納
    s_posi                                 #確認してるだけです
    hoge <- NULL                           #最終的に得る結果を格納するためのプレースホルダhogeを作成しているだけ
    for(i in 1:length(s_posi)){            #length(s_posi)回だけループを回す
        hoge <- append(hoge, subseq(reference, start=s_posi[i], width=param_len_ngs))#subseq関数を用いてs_posi[i]からparam_len_ngsで与えた配列長に対応する部分配列をhogeに格納
    }
    fasta <- hoge                          #hogeの中身をfastaに格納
    
    #後処理(description部分の作成)
    description <- paste(param_desc, s_posi, (s_posi+param_len_ngs-1), sep="_")#param_descやs_posiなどを"_"で結合したものをdescriptionに格納
    names(fasta) <- description            #description行に相当する記述を追加している
    fasta                                  #確認してるだけです
    
    #ファイルに保存(仮想リファレンス配列と仮想NGS配列)
    writeXStringSet(reference, file=out_f1, format="fasta", width=50)#referenceの中身を指定したファイル名で保存
    writeXStringSet(fasta, file=out_f2, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
    	
  40. PacBio/xxx bp/Human (SRP036136) data (Tilgner et al., PNAS, 2014)

    ヒトの長鎖RNA-seqデータです。配列長はリードによって異なります。

  41. TCCパッケージ中のBiological replicatesを模倣したシミュレーションデータ (G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル vs. G4群3サンプル vs. G5群3サンプル)です。

    10,000 genes×15 samplesの「複製あり」タグカウントデータ(data_hypodata_3vs3vs3vs3vs3.txt) 「G1_rep1, G1_rep2, G1_rep3, G2_rep1, G2_rep2, G2_rep3, G3_rep1, G3_rep2, G3_rep3, G4_rep1, G4_rep2, G4_rep3, G5_rep1, G5_rep2, G5_rep3」の計15サンプル分からなります。 全10,000遺伝子(Ngene=10000)中の最初の2,000個(gene_1〜gene_2000まで; 20%なのでPDEG=0.2)が発現変動遺伝子(DEG)です。 全2,000 DEGsの内訳:(1)最初の50%分(gene_1〜gene_1000)がG1群で5倍高発現、 (2)次の20%分(gene_1001〜gene_1400)がG2群で10倍高発現、 (3)次の15%分(gene_1401〜gene_1700)がG3群で8倍高発現、 (4)次の10%分(gene_1701〜gene_1900)がG4群で12倍高発現、 (5)残りの5%分(gene_1901〜gene_2000)がG5群で7倍高発現。 以下のコピペでも取得可能です。

    library(TCC)                           #パッケージの読み込み
    set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
    tcc <- simulateReadCounts(Ngene=10000,PDEG=0.2,#全遺伝子数とDEGの割合を指定
             DEG.assign=c(0.5,0.2,0.15,0.1,0.05),#DEGの内訳(G1が50%,G2が20%,G3が15%,G4が10%,G5が5%)を指定
             DEG.foldchange=c(5,10,8,12,7),#DEGの発現変動度合い(G1が5倍,G2が10倍,G3が8倍,G4が12倍,G5が7倍)を指定
             replicates=c(3, 3, 3, 3, 3))  #各群のサンプル数を指定
    plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
    
    #ファイルに保存
    tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
    write.table(tmp, "data_hypodata_3vs3vs3vs3vs3.txt", sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  42. TCCパッケージ中のBiological replicatesを模倣したシミュレーションデータ (G1群4サンプル vs. G2群4サンプル vs. G3群4サンプル)です。

    10,000 genes×12 samplesの「複製あり」タグカウントデータ(data_hypodata_4vs4vs4.txt) 「G1_rep1, G1_rep2, G1_rep3, G1_rep4, G2_rep1, G2_rep2, G2_rep3, G2_rep4, G3_rep1, G3_rep2, G3_rep3, G3_rep4」の計12サンプル分からなります。 全10,000遺伝子中の最初の3,000個(gene_1〜gene_3000まで)が発現変動遺伝子(DEG)です。 全3,000 DEGsの内訳:(1)最初の33.3%分(gene_1〜gene_1000)がG1群で5倍高発現、(2)次の33.3%分(gene_1001〜gene_2000)がG2群で5倍高発現、(3)残りの33.3%分(gene_2001〜gene_3000)がG3群で5倍高発現 以下のコピペでも取得可能です。

    out_f <- "data_hypodata_4vs4vs4.txt"   #出力ファイル名を指定してout_fに格納
    param_replicates <- c(4, 4, 4)         #G1, G2, G3群のサンプル数をそれぞれ指定
    param_Ngene <- 10000                   #全遺伝子数を指定
    param_PDEG <- 0.3                      #発現変動遺伝子の割合を指定    
    param_FC <- c(5, 5, 5)                 #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
    param_DEGassign <- c(1/3, 1/3, 1/3)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
    
    #必要なパッケージをロード
    library(TCC)                           #パッケージの読み込み
    
    #シミュレーションデータの作成
    set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
    tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
                PDEG=param_PDEG,           #シミュレーションデータの作成
                DEG.assign=param_DEGassign,#シミュレーションデータの作成
                DEG.foldchange=param_FC,   #シミュレーションデータの作成
                replicates=param_replicates)#シミュレーションデータの作成
    plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
    
    #ファイルに保存(テキストファイル)
    tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  43. Blekhman et al., Genome Res., 2010のリアルカウントデータです。 Supplementary Table1で提供されているエクセルファイル(http://genome.cshlp.org/content/suppl/2009/12/16/gr.099226.109.DC1/suppTable1.xls; 約4.3MB) からカウントデータのみ抽出し、きれいに整形しなおしたものがここでの出力ファイルになります。 20,689 genes×36 samplesのカウントデータ(sample_blekhman_36.txt)です。 実験デザインの詳細はFigure S1中に描かれていますが、 ヒト(Homo Sapiens; HS), チンパンジー(Pan troglodytes; PT), アカゲザル(Rhesus macaque; RM)の3種類の生物種の肝臓サンプル(liver sample)の比較を行っています。 生物種ごとにオス3個体メス3個体の計6個体使われており(six individuals; six biological replicates)、 技術的なばらつき(technical variation)を見積もるべく各個体は2つに分割されてデータが取得されています(duplicates; two technical replicates)。 それゆえ、ヒト12サンプル、チンパンジー12サンプル、アカゲザル12サンプルの計36サンプル分のデータということになります。 以下で行っていることはカウントデータの列のみ「ヒトのメス(HSF1, HSF2, HSF3)」, 「ヒトのオス(HSM1, HSM2, HSM3)」,「チンパンジーのメス(PTF1, PTF2, PTF3)」, 「チンパンジーのオス(PTM1, PTM2, PTM3)」, 「アカゲザルのメス(RMF1, RMF2, RMF3)」, 「アカゲザルのオス(RMM1, RMM2, RMM3)」の順番で並び替えたものをファイルに保存しています。 もう少し美しくやることも原理的には可能ですが、そこは本質的な部分ではありませんので、ここではアドホック(その場しのぎ、の意味)な手順で行っています。 当然ながら、エクセルなどでファイルの中身を眺めて完全に列名を把握しているという前提です。 尚、"R1L4.HSF1"と"R4L2.HSF1"が「HSF1というヒトのメス一個体のtechnical replicates」であることは列名や文脈から読み解けます。

    #in_f <- "http://genome.cshlp.org/content/suppl/2009/12/16/gr.099226.109.DC1/suppTable1.xls"#入力ファイル名を指定してin_fに格納
    in_f <- "suppTable1.xls"               #入力ファイル名を指定してin_fに格納
    out_f <- "sample_blekhman_36.txt"      #出力ファイル名を指定してout_fに格納
    
    #入力ファイルの読み込み
    hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
    dim(hoge)                              #行数と列数を表示
    
    #サブセットの取得
    data <- cbind(                         #必要な列名の情報を取得したい列の順番で結合した結果をdataに格納
      hoge$R1L4.HSF1, hoge$R4L2.HSF1, hoge$R2L7.HSF2, hoge$R3L2.HSF2, hoge$R8L1.HSF3, hoge$R8L2.HSF3,
      hoge$R1L1.HSM1, hoge$R5L2.HSM1, hoge$R2L3.HSM2, hoge$R4L8.HSM2, hoge$R3L6.HSM3, hoge$R4L1.HSM3,
      hoge$R1L2.PTF1, hoge$R4L4.PTF1, hoge$R2L4.PTF2, hoge$R6L6.PTF2, hoge$R3L7.PTF3, hoge$R5L3.PTF3,
      hoge$R1L6.PTM1, hoge$R3L3.PTM1, hoge$R2L8.PTM2, hoge$R4L6.PTM2, hoge$R6L2.PTM3, hoge$R6L4.PTM3,
      hoge$R1L7.RMF1, hoge$R5L1.RMF1, hoge$R2L2.RMF2, hoge$R5L8.RMF2, hoge$R3L4.RMF3, hoge$R4L7.RMF3,
      hoge$R1L3.RMM1, hoge$R3L8.RMM1, hoge$R2L6.RMM2, hoge$R5L4.RMM2, hoge$R3L1.RMM3, hoge$R4L3.RMM3)
    colnames(data) <- c(                   #列名を付加
      "R1L4.HSF1", "R4L2.HSF1", "R2L7.HSF2", "R3L2.HSF2", "R8L1.HSF3", "R8L2.HSF3",
      "R1L1.HSM1", "R5L2.HSM1", "R2L3.HSM2", "R4L8.HSM2", "R3L6.HSM3", "R4L1.HSM3",
      "R1L2.PTF1", "R4L4.PTF1", "R2L4.PTF2", "R6L6.PTF2", "R3L7.PTF3", "R5L3.PTF3",
      "R1L6.PTM1", "R3L3.PTM1", "R2L8.PTM2", "R4L6.PTM2", "R6L2.PTM3", "R6L4.PTM3",
      "R1L7.RMF1", "R5L1.RMF1", "R2L2.RMF2", "R5L8.RMF2", "R3L4.RMF3", "R4L7.RMF3",
      "R1L3.RMM1", "R3L8.RMM1", "R2L6.RMM2", "R5L4.RMM2", "R3L1.RMM3", "R4L3.RMM3")
    rownames(data)<- rownames(hoge)        #行名を付加
    dim(data)                              #行数と列数を表示
    
    #ファイルに保存(テキストファイル)
    tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  44. Blekhman et al., Genome Res., 2010のリアルカウントデータです。

    1つ前の例題41とは違って、technical replicatesの2列分のデータは足して1列分のデータとしています。 20,689 genes×18 samplesのカウントデータ(sample_blekhman_18.txt)です。

    #in_f <- "http://genome.cshlp.org/content/suppl/2009/12/16/gr.099226.109.DC1/suppTable1.xls"#入力ファイル名を指定してin_fに格納
    in_f <- "suppTable1.xls"               #入力ファイル名を指定してin_fに格納
    out_f <- "sample_blekhman_18.txt"      #出力ファイル名を指定してout_fに格納
    
    #入力ファイルの読み込み
    hoge <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
    dim(hoge)                              #行数と列数を表示
    
    #サブセットの取得
    data <- cbind(                         #必要な列名の情報を取得したい列の順番で結合した結果をdataに格納
      hoge$R1L4.HSF1 + hoge$R4L2.HSF1, hoge$R2L7.HSF2 + hoge$R3L2.HSF2, hoge$R8L1.HSF3 + hoge$R8L2.HSF3,
      hoge$R1L1.HSM1 + hoge$R5L2.HSM1, hoge$R2L3.HSM2 + hoge$R4L8.HSM2, hoge$R3L6.HSM3 + hoge$R4L1.HSM3,
      hoge$R1L2.PTF1 + hoge$R4L4.PTF1, hoge$R2L4.PTF2 + hoge$R6L6.PTF2, hoge$R3L7.PTF3 + hoge$R5L3.PTF3,
      hoge$R1L6.PTM1 + hoge$R3L3.PTM1, hoge$R2L8.PTM2 + hoge$R4L6.PTM2, hoge$R6L2.PTM3 + hoge$R6L4.PTM3,
      hoge$R1L7.RMF1 + hoge$R5L1.RMF1, hoge$R2L2.RMF2 + hoge$R5L8.RMF2, hoge$R3L4.RMF3 + hoge$R4L7.RMF3,
      hoge$R1L3.RMM1 + hoge$R3L8.RMM1, hoge$R2L6.RMM2 + hoge$R5L4.RMM2, hoge$R3L1.RMM3 + hoge$R4L3.RMM3)
    colnames(data) <- c(                   #列名を付加
      "HSF1", "HSF2", "HSF3", "HSM1", "HSM2", "HSM3",
      "PTF1", "PTF2", "PTF3", "PTM1", "PTM2", "PTM3",
      "RMF1", "RMF2", "RMF3", "RMM1", "RMM2", "RMM3")
    rownames(data)<- rownames(hoge)        #行名を付加
    dim(data)                              #行数と列数を表示
    
    #ファイルに保存(テキストファイル)
    tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  45. TCCパッケージ中のシミュレーションデータ(G1群1サンプル vs. G2群1サンプル vs. G3群1サンプル)です。 10,000 genes×3 samplesの「複製なし」タグカウントデータ(data_hypodata_1vs1vs1.txt) 「G1_rep1, G2_rep1, G3_rep1」の計3サンプル分からなります。 全10,000遺伝子中の最初の3,000個(gene_1〜gene_3000まで)が発現変動遺伝子(DEG)です。 全3,000 DEGsの内訳:(1)最初の70%分(gene_1〜gene_2100)がG1群で3倍高発現、(2)次の20%分(gene_2101〜gene_2700)がG2群で10倍高発現、 (3)残りの10%分(gene_2701〜gene_3000)がG3群で6倍高発現。 以下のコピペでも取得可能です。

    out_f <- "data_hypodata_1vs1vs1.txt"   #出力ファイル名を指定してout_fに格納
    library(TCC)                           #パッケージの読み込み
    set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
    tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
                 DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
                 DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
                 replicates = c(1, 1, 1))  #各群のサンプル数を指定
    plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
    
    #ファイルに保存
    tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  46. recount2Collado-Torres et al., Nat Biotechnol., 2017

    ReCount(Frazee et al., BMC Bioinformatics, 2011)の後継版です。 Bioconductor上でもrecountというRパッケージが提供されています。

  47. pasillaパッケージ中の複製あり2群間比較用カウントデータです(孫建強氏 提供情報)。

    14,599 genes×7 samplesの「複製あり」タグカウントデータ(sample_pasilla_4vs3.txt)です。 処理前4サンプル(4 untreated) vs. 処理後3サンプル(3 treated)の2群間比較用です。 データの原著論文はBrooks et al., Genome Res., 2011です。 手順としては、pasillaパッケージ中のタブ区切りテキストファイルpasilla_gene_counts.tsvを呼び出し、 それをsample_pasilla_4vs3.txtというファイル名で保存しているだけです。 以下のコピペでも取得可能です。

    out_f <- "sample_pasilla_4vs3.txt"     #出力ファイル名を指定してout_fに格納
    library(pasilla)                       #パッケージの読み込み
    
    #本番
    hoge <- system.file("extdata",         #pasillaパッケージ中の目的ファイルのフルパス情報を取得
               "pasilla_gene_counts.tsv",  #pasillaパッケージ中の目的ファイルのフルパス情報を取得
               package="pasilla", mustWork=TRUE)#pasillaパッケージ中の目的ファイルのフルパス情報を取得
    data <- read.csv(hoge, sep="\t", row.names="gene_id")#gene_id列の情報を行名部分としてread.csv関数で読み込む
    
    #ファイルに保存
    tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  48. pasillaパッケージ中の複製なし2群間比較用カウントデータです(孫建強氏 提供情報)。

    14,599 genes×2 samplesの「複製なし」タグカウントデータ(sample_pasilla_1vs1.txt)です。 1つ上の例題の4 untreated vs. 3 treatedのオリジナルデータから、1列目と5列目の情報を抽出して、sample_pasilla_1vs1.txtというファイル名で保存しているだけです。 以下のコピペでも取得可能です。

    out_f <- "sample_pasilla_1vs1.txt"     #出力ファイル名を指定してout_fに格納
    param_subset <- c(1, 5)                #取り扱いたいサブセット情報を指定
    library(pasilla)                       #パッケージの読み込み
    
    #本番
    hoge <- system.file("extdata",         #pasillaパッケージ中の目的ファイルのフルパス情報を取得
               "pasilla_gene_counts.tsv",  #pasillaパッケージ中の目的ファイルのフルパス情報を取得
               package="pasilla", mustWork=TRUE)#pasillaパッケージ中の目的ファイルのフルパス情報を取得
    data <- read.csv(hoge, sep="\t", row.names="gene_id")#gene_id列の情報を行名部分としてread.csv関数で読み込む
    data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
    
    #ファイルに保存
    tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  49. FASTA形式ファイル(Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.dna.chromosome.Chromosome.fa) に対してbasic alignerでマッピングする際の動作確認用RNA-seqデータ(sample_RNAseq4.fa)。 リファレンス配列を読み込んで、list_sub9.txtで与えた部分配列を抽出したものです。 GFF3形式ののアノテーションファイル(Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.chromosome.Chromosome.gff3) を用いてマッピング結果からカウント情報を取得する際に、どの領域にマップされたリードがOKなのかを検証するためのリードファイルです。

    in_f1 <- "Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f1に格納(multi-FASTAファイル)
    in_f2 <- "list_sub9.txt"               #入力ファイル名を指定してin_f2に格納(リストファイル)
    out_f <- "sample_RNAseq4.fa"           #出力ファイル名を指定してout_fに格納
    
    #必要なパッケージをロード
    library(Biostrings)                    #パッケージの読み込み
    
    #入力ファイルの読み込み
    fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
    posi <- read.table(in_f2)              #in_f2で指定したファイルの読み込み
    fasta                                  #確認してるだけです
    
    #前処理(description部分をスペースで区切り、分割された中から1番目の要素で置き換える)
    hoge <- strsplit(names(fasta), " ", fixed=TRUE)#names(fasta)中の文字列を" "で区切った結果をリスト形式でhogeに格納
    hoge2 <- unlist(lapply(hoge, "[[", 1)) #hogeのリスト中の1番目の要素を抽出してhoge2に格納
    names(fasta) <- hoge2                  #names(fasta)の中身をhoge2で置換
    fasta                                  #確認してるだけです
    
    #本番
    hoge <- NULL                           #最終的に得る結果を格納するためのプレースホルダhogeを作成しているだけ
    for(i in 1:nrow(posi)){                #length(posi)回だけループを回す
        obj <- names(fasta) == posi[i,1]   #条件を満たすかどうかを判定した結果をobjに格納
        hoge <- append(hoge, subseq(fasta[obj], start=posi[i,2], end=posi[i,3]))#subseq関数を用いてobjがTRUEとなるもののみに対して、posi[i,2]とposi[i,3]で与えた範囲に対応する部分配列を抽出した結果をhogeに格納
    }
    fasta <- hoge                          #hogeの中身をfastaに格納
    fasta                                  #確認してるだけです
    
    #後処理(description部分の作成)
    description <- paste(posi[,1], posi[,2], posi[,3], sep="_")#行列posiの各列を"_"で結合したものをdescriptionに格納
    names(fasta) <- description            #description行に相当する記述を追加している
    fasta                                  #確認してるだけです
    
    #ファイルに保存
    writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
    	
  50. MASSパッケージから提供されている gehanという名前の生存時間解析用データ(sample48.txt;タブ区切りテキストファイル)です。 カプランマイヤー(Kaplan-Meier)法による生存曲線(カプランマイヤー曲線;生存率曲線)作成時の入力ファイルです。 Rと生存時間分析(1)や、 MASSのリファレンスマニュアル56ページ目のgehanの説明部分でも解説されていますが、 これは(ヘッダー行を除く)42行×4列からなる数値行列データです。42行の行数は、42人の白血病患者(leukemia patients)数に相当します。 2人ずつのペアになっており、片方には6-mercaptopurine (6-MP)という薬を投与、もう片方にはプラセボ(control)を投与しています。
      行列データの各列には以下に示す情報が格納されています:
    1列目(列名:pair)は、患者のid情報が示されています。 例えば1-2行目が1番目のペア、3-4行目が2番目のペアだと読み解きます。
      2列目(列名:time)は、寛解時間(単位は週)です。MASSのリファレンスマニュアル56ページ目では、 remission time in weeksと書いてあります。大まかには「元気に過ごせた時間」とか「生存時間」のように解釈しちゃって構いません。
      3列目(列名:cens)は、打ち切り(censoring)があったかなかったかという 0 or 1の情報からなります。打ち切りがあったら0、なかったら1です。 このデータの場合は、3列目の0が12個、1が30個です。したがって、12人の患者さんのデータが打ち切りのあるデータ(「上完全データ」と呼ぶそうです)、 30人の患者さんのデータが打ち切りのないデータ(「完全データ」と呼ぶそうです。)ということになります。打ち切りデータというのは、 患者さんとの連絡が取れなくなったなど、何らかの理由で患者さんの状況を把握する手段がなくなったデータのことを指します。 観察期間終了まで生存されている患者さんの場合も、「打ち切りありで0」ということになります。 ちなみに、亡くなったという情報が分かっているデータは打ち切りのないデータに相当します。
      4列目(列名:treat)には、プラセボ(control)投与群か6-MP投与群かという「どのような処理を行ったかという処理(treatment)情報」が記載されています。

    out_f <- "sample48.txt"                #出力ファイル名を指定してout_fに格納
    
    #必要なパッケージをロード
    library(MASS)                          #パッケージの読み込み
    
    #本番(目的のデータセットをロード)
    data(gehan)                            #gehanデータのロード
    tmp <- gehan                           #名前をtmpに変更
    head(tmp)                              #確認してるだけです
    dim(tmp)                               #確認してるだけです
    
    #ファイルに保存
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  51. survivalパッケージから提供されている kidneyという名前の生存時間解析用データ(sample49.txt;タブ区切りテキストファイル)です。 カプランマイヤー(Kaplan-Meier)法による生存曲線(カプランマイヤー曲線;生存率曲線)作成時の入力ファイルです。 survivalのリファレンスマニュアル48ページ目のkidneyの説明部分でも解説されています。 これは(ヘッダー行を除く)76行×7列からなる数値行列データです。 これは、ポータブル透析装置(portable dialysis equipment)を使用している腎臓病患者(kidney patients)向けの、 カテーテル(catheter)挿入時点での感染までの再発時間に関するデータです(McGilchrist and Aisbett, Biometrics, 1991)。 カテーテルは感染以外の理由で除去される場合があります。その場合、観察は打ち切られます。 患者1人につき、2つの観察結果(2 observations)があります。 このデータは76行ありますので、76/2 = 38人分の腎臓病患者のデータがあることになります。 このデータは、生存モデルでのランダム効果(フレイル)を説明するためによく使用されているようです。
      行列データの各列には以下に示す情報が格納されています:
      1列目(列名:id)は、患者のid情報が示されています。 例えば、(ヘッダー行を除く)最初の1-2行がid = 1の最初の患者さん、次の3-4行がid = 2の患者さん、という風に解釈します。
      2列目(列名:time)は、時間です(単位不明)。
      3列目(列名:status)は、event statusです。 0 or 1ですが、何が0で何が1かは記載されていません。 Rと生存時間分析(2) によると、「打ち切りは0、その他は1」となっています。
      4列目(列名:age)は、年令情報(in years)です。
      5列目(列名:sex)は、性別情報です。1が男性、2が女性です。
      6列目(列名:disease)は、「disease type」に関する情報が含まれています。 「0=GN, 1=AN, 2=PKD, 3=Other」だそうです。PKDはほぼ間違いなくpolycystic kidney diseaseの略で、多発性囊胞腎です。 ANは、おそらくacute nephritis (急性腎炎)のこと。GNは、glomerular nephritis (糸球体腎炎)の略なんだろうとは思いますが...。 実際には、数値ではなく「GN or AN or PKD or Other」のいずれかが記載されています。
      7列目(列名:frail)は、「frailty estimate from original paper」に関する情報が含まれています。 原著論文(McGilchrist and Aisbett, Biometrics, 1991)から推定した フレイル(frailty;加齢により心身が老い衰えた状態)の度合いを数値で示したもののようです。数値が大きいほど衰えの度合いが高い?!。

    out_f <- "sample49.txt"                #出力ファイル名を指定してout_fに格納
    
    #必要なパッケージをロード
    library(survival)                      #パッケージの読み込み
    
    #本番(目的のデータセットをロード)
    data(kidney)                           #kidneyデータのロード
    tmp <- kidney                          #名前をtmpに変更
    head(tmp)                              #確認してるだけです
    dim(tmp)                               #確認してるだけです
    
    #ファイルに保存
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  52. survivalパッケージから提供されている colonという名前の生存時間解析用データ(sample50.txt;タブ区切りテキストファイル)です。 カプランマイヤー(Kaplan-Meier)法による生存曲線(カプランマイヤー曲線;生存率曲線)作成時の入力ファイルです。 survivalのリファレンスマニュアル23ページ目のcolonの説明部分でも解説されていますが、 これは(ヘッダー行を除く)1858行×16列からなる数値行列データです。 これは、大腸がんに対する術後補助化学療法(adjuvant chemotherapy)の有効性を示したデータです (Laurie et al., J Clin Oncol., 1989)。 化学療法としては、低毒性のレバミゾール(Levamisole; 線虫駆虫薬の1種)と、 中程度の毒性のフルオロウラシル(fluorouracil; 5-FU)が使われています。 患者は、何もせずに経過観察(Obsavation)のみのObs群、Levamisole単独投与群(Lev群)、そして2種類の抗がん剤の併用群(Lev+5-FU群)の3種類に分けられます。 患者1人につき、2つの記録(two records)があります。再発(recurrence)が1で、死亡(death)が2です。 このデータは1858行ありますので、1858/2 = 929人分の大腸がん患者(colon cancer patients)のデータがあることになります。 それぞれのイベントの種類(event type; etype)ごとに、時間(time)の情報があります。 例えば、idが1の患者さんは、再発(etype = 1)までの時間が968 days、死亡(etype = 2)までの時間が1521 daysだったと解釈します。 データ全体を眺める(特にtime列とetype列を見比べる)とわかりますが、死亡までの時間のほうが再発までの時間よりも短いデータはアリエマセン。 「再発までの時間 <= 死亡までの時間」ということになります。
      行列データの各列には以下に示す情報が格納されています:
      1列目(列名:id)は、患者のid情報が示されています。 例えば、(ヘッダー行を除く)最初の1-2行がid = 1の最初の患者さん、次の3-4行がid = 2の患者さん、という風に解釈します。
      2列目(列名:study)は、全て1であり特に意味はありません。
      3列目(列名:rx)は、患者に対してどのような処置(Treatment)を行ったのかという情報が含まれています。 経過観察のみのObs群、Levamisole単独投与群(Lev群)、そして2種類の抗がん剤の併用群(Lev+5-FU群)の3種類です。
      4列目(列名:sex)は、性別情報です。0が女性、1が男性です。
      5列目(列名:age)は、年令情報(in years)です。
      6列目(列名:obstruct)は、「obstruction of colon by tumour」に関する情報が含まれています。 おそらく癌によって腸閉塞が行ったかどうかという0 or 1の情報からなるのだろうと思います。この列をざっと眺めると、0のほうが多いこと、 そしてそれほど腸閉塞の頻度は多くないだろうという素人判断から、0が腸閉塞なし、1が腸閉塞ありなのだろうと思います。
      7列目(列名:perfor)は、「perforation of colon」に関する情報が含まれています。 おそらく結腸(大腸のこと)に穴(穿孔)があいちゃったかどうかという0 or 1の情報からなるのだろうと思います。この列をざっと眺めると、0のほうが多いこと、 そしてそれほど穿孔の頻度は多くないだろうという素人判断から、0が穿孔なし、1が穿孔ありなのだろうと思います。
      8列目(列名:adhere)は、「adherence to nearby organs」に関する情報が含まれています。 近くの臓器への癒着があったかどうかという0 or 1の情報からなるのだろうと思います。この列をざっと眺めると、0のほうが多いこと、 そしてそれほど癒着の頻度は多くないだろうという素人判断から、0が癒着なし、1が癒着ありなのだろうと思います。
      9列目(列名:nodes)は、「number of lymph nodes with detectable cancer」に関する情報が含まれています。 リンパ節への転移に関する情報で、転移のあったリンパ節数(多いほどよくない)です。
      10列目(列名:status)は、「censoring status」に関する情報が含まれています。 打ち切り(censoring)があったかなかったかという 0 or 1の情報からなります。打ち切りがあったら0、なかったら1です。 打ち切りデータというのは、患者さんとの連絡が取れなくなったなど、何らかの理由で患者さんの状況を把握する手段がなくなったデータのことを指します。 観察期間終了まで生存されている患者さんの場合は、「打ち切りありで0」ということになります。 ちなみに、亡くなったという情報が分かっているデータは打ち切りのないデータに相当します。
      11列目(列名:differ)は、「differentiation of tumour」に関する情報が含まれています。 分化度(differentiation)のことですね。「1=well, 2=moderate, 3=poor」です。高分化型が1、中分化型が2、低分化型が3です。 数値が大きいほど悪性度が高いと解釈します。
      12列目(列名:extent)は、「Extent of local spread」に関する情報が含まれています。 「腫瘍の局所的拡大の範囲」と解釈すればよいのでしょうか。「1=submucosa, 2=muscle, 3=serosa, 4=contiguous structures)」です。 大腸粘膜(mucosa)の次の層がsubmucosa、その次が筋層(muscle layer)、その次がserosa (serous membrane;漿膜)、 最後にcontiguous structures (直接隣接する組織)となります。数値が大きいほど深層まで達していると解釈できるので、悪性度が高いと解釈します。
      13列目(列名:surg)は、「time from surgery to registration」に関する情報が含まれています。 来訪してから手術までの期間であり、「0=short, 1=long」です。
      14列目(列名:node4)は、「more than 4 positive lymph nodes」に関する情報が含まれています。 nodes列が4よりも大きいものが1、4以下が0となっているようですね。
      15列目(列名:time)は、「days until event or censoring」に関する情報が含まれています。 イベント(再発 or 死亡)または打ち切り(censoring)までの日数です。数値の大きさは、生存時間の長さを表します。
      16列目(列名:etype)は、「event type」に関する情報が含まれています。 再発(recurrence)が1で、死亡(death)が2です。

    out_f <- "sample50.txt"                #出力ファイル名を指定してout_fに格納
    
    #必要なパッケージをロード
    library(survival)                      #パッケージの読み込み
    
    #本番(目的のデータセットをロード)
    data(colon)                            #colonデータのロード
    tmp <- colon                           #名前をtmpに変更
    head(tmp)                              #確認してるだけです
    dim(tmp)                               #確認してるだけです
    
    #ファイルに保存
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	
  53. MLSeqパッケージ(Goksuluk et al., 2019)から提供されている cervicalという名前の2群間比較用データ(sample51.txt;タブ区切りテキストファイル)です。 714行×58列からなる数値行列データ(ヘッダー行を除く)です。データの原著論文は、Witten et al., 2010です。 子宮頸がん患者29例の正常組織と癌組織のペアサンプルであり、714のmicroRNA (714 miRNAs)の発現を調べたデータです。 (行名情報の列を除く)最初の29列分が正常サンプル(N1, N2, ..., N29)、残りの29列分が癌サンプル(T1, T2, ..., T29)のデータです。 MLSeqパッケージマニュアル 中にも書かれていますが、以下のようなコマンドでも取得可能です。 MLSeqパッケージのインストールが完了していれば、以下のfilepath情報を頼りにしてcervical.txtというファイルを見つければよいだけですが、 filapath情報からたどり着けるのはある程度経験を積んでからというのが現実だと思いますので、わざわざ記載しているのです。

    out_f <- "sample51.txt"                #出力ファイル名を指定してout_fに格納
    
    #必要なパッケージをロード
    library(MLSeq)                         #パッケージの読み込み
    
    #前処理(ファイルパス情報を取得)
    filepath <- system.file("extdata/cervical.txt", package="MLSeq")#ファイルパス情報を取得
    filepath                               #確認してるだけです
    
    #本番(数値行列情報を取得)
    data <- read.table(filepath, row.names=1, header=TRUE)#filepathで指定したファイルの読み込み
    dim(data)                              #確認してるだけです
    
    #ファイルに保存
    tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    	

バイオインフォマティクス人材育成カリキュラム(次世代シークエンサ) | NGSハンズオン講習会2017

ここの情報は、サブページの「NGSハンズオン講習会2017」に移動しました。

バイオインフォマティクス人材育成カリキュラム(次世代シークエンサ) | NGSハンズオン講習会2016

ここの情報は、サブページの「NGSハンズオン講習会2016」に移動しました。

バイオインフォマティクス人材育成カリキュラム(次世代シークエンサ) | NGSハンズオン講習会2015

ここの情報は、サブページの「NGSハンズオン講習会2015」に移動しました。

バイオインフォマティクス人材育成カリキュラム(次世代シークエンサ) | NGS速習コース2014

ここの情報は、サブページの「NGS速習コース2014」に移動しました。

書籍 | 日本乳酸菌学会誌 | について

ここの情報は、サブページの「書籍 | 日本乳酸菌学会誌 | について」に移動しました。

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

ここの情報は、サブページの「書籍 | 日本乳酸菌学会誌 | 第1回イントロダクション」に移動しました。

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

ここの情報は、サブページの「書籍 | 日本乳酸菌学会誌 | 第2回GUI環境からコマンドライン環境へ」に移動しました。

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

ここの情報は、サブページの「書籍 | 日本乳酸菌学会誌 | 第3回Linux環境構築からNGSデータ取得まで」に移動しました。

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

ここの情報は、サブページの「書籍 | 日本乳酸菌学会誌 | 第4回クオリティコントロールとプログラムのインストール」に移動しました。

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

ここの情報は、サブページの「書籍 | 日本乳酸菌学会誌 | 第5回アセンブル、マッピング、そしてQC」に移動しました。

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

ここの情報は、サブページの「書籍 | 日本乳酸菌学会誌 | 第6回ゲノムアセンブリ」に移動しました。

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

ここの情報は、サブページの「書籍 | 日本乳酸菌学会誌 | 第7回ロングリードアセンブリ」に移動しました。

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

ここの情報は、サブページの「書籍 | 日本乳酸菌学会誌 | 第8回アセンブリ後の解析」に移動しました。

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

ここの情報は、サブページの「書籍 | 日本乳酸菌学会誌 | 第9回ゲノムアノテーションとその可視化、DDBJへの登録」に移動しました。

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

ここの情報は、サブページの「書籍 | 日本乳酸菌学会誌 | 第10回DDBJへの塩基配列の登録(後編)」に移動しました。

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

ここの情報は、サブページの「書籍 | 日本乳酸菌学会誌 | 第11回統合データ解析環境Galaxy」に移動しました。

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

ここの情報は、サブページの「書籍 | 日本乳酸菌学会誌 | 第12回Galaxy:ヒストリーとワークフロー」に移動しました。

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

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

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

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

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

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

in_f <- "annotation.txt"               #入力ファイル名(目的のタブ区切りテキストファイル)を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param <- 5                             #ランダム抽出したい行数を指定

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

#本番
hoge <- sample(1:nrow(data), param, replace=F)#入力ファイルの行数からparamで指定した数だけ非復元抽出した結果をhogeに格納

out <- data[sort(hoge),]               #hogeで指定した行のみ抽出した結果をoutに格納
dim(out)                               #オブジェクトoutの行数と列数を表示

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

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

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

in_f <- "annotation.txt"               #入力ファイル名(目的のタブ区切りテキストファイル)を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param <- 5                             #ランダム抽出したい行数を指定

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

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

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

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

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

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

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

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

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

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

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

#本番(文字列挿入)
data[,1] <- paste(param, data[,1], sep="")#dataオブジェクトの1列目の左側にparamで指定した文字列を挿入

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

annotation.txt中にはgene1以外にgene10やgene11もあるため、リストファイル中の文字列(gene1, gene7, gene9)から想定される3行分以外に、 gene10とgene11の行も出力されます。(2016年4月20日追加)

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

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

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

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

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

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

リストファイルgenelist1.txt中の文字列(gene1, gene7, gene9)が、annotation.txt中の1列目にある行の4列目の情報は、全てnuclearです。(2016年4月20日追加)

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

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

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

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

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

unique(hoge)のところをunique(unlist(hoge))に変更しました。出力結果は例題4と同じです。(2016年4月20日追加)

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

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

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

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

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

ラットのアノテーション情報ファイル(GPL1355-14795.txt)と、2群間比較で発現変動が確認された遺伝子IDリストファイル(result_rankprod_BAT_id.txt)です。 unique(hoge)のところをunique(unlist(hoge))に変更しました。約15分。(2016年4月20日追加)

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

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

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

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

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

ラットのアノテーション情報ファイル(GPL1355-14795.txt)と、2群間比較で発現変動が確認された遺伝子IDリストファイル(result_rankprod_BAT_id.txt)です。 unique(hoge)のところをunique(unlist(hoge))に変更しました。約7分。(2016年4月20日追加)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

14. GFF3形式のタブ区切りテキストファイル(Lactobacillus_casei_12a.GCA_000309565.2.25.chromosome.Chromosome.gff3)に対して、"ID=gene"という文字列が含まれる行全体を出力したい場合:

乳酸菌ゲノム(Lactobacillus casei 12A)のアノテーションファイルです。 4.をベースに作成。unique(hoge)のところをunique(unlist(hoge))に変更しました。(2016年4月20日追加)

in_f <- "Lactobacillus_casei_12a.GCA_000309565.2.25.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_fに格納
out_f <- "hoge14.txt"                  #出力ファイル名を指定してout_fに格納
param <- "ID=gene"                     #検索したい文字列を指定

#入力ファイルの読み込み
data <- readLines(in_f)                #in_fで指定したファイルの読み込み
length(data)                           #オブジェクトdataの要素数を表示

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

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

15. GFF3形式ファイル(annotation.gff)に対して、"CDS"という文字列が含まれる行全体を出力したい場合:

2019年5月13日の講義で利用したファイルです。

in_f <- "annotation.gff"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge15.txt"                  #出力ファイル名を指定してout_fに格納
param <- "CDS"                         #検索したい文字列を指定

#入力ファイルの読み込み
data <- readLines(in_f)                #in_fで指定したファイルの読み込み
length(data)                           #オブジェクトdataの要素数を表示

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

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

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

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

1. 50塩基の長さのランダムな塩基配列を生成する場合:

塩基の存在比はAが20%, Cが30%, Gが30%, Tが20%にしています。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

48, 160, 100, 123の配列長をもつ、計4つの塩基配列を生成しています。 description行は"contig"という記述を基本としています。 塩基の存在比はAが28%, Cが22%, Gが26%, Tが24%にしています。 set.seed関数を追加しているだけです。

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

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

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

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

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

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

48, 160, 100, 123の配列長をもつ、計4つの塩基配列を生成しています。 description行は"contig"という記述を基本としています。 塩基の存在比はAが28%, Cが22%, Gが26%, Tが24%にしています。 set.seed関数を追加し、chr3の配列と同じものをchr5としてコピーして作成したのち、一部の塩基置換を行っています。

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

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

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

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

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

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

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

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

Biostringsパッケージを用いて"A", "C", "G", "T"からなる 任意の長さのk塩基(k-mer)からなる全ての塩基配列を作成するやり方を示します。

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

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

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 3                        #k-merのkの値を指定

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

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

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

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

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 5                        #k-merのkの値を指定

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Biostringsは挙動を確認しながら中身を理解したいヒトなどの初心者向け。 慣れてきたら、BEDToolsのmulticovプログラム(根拠はMLSeqパッケージマニュアル)などを用いてサクサクやっていきます。 Galaxyでもできるはずです。

R用:

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

Biostringsパッケージ中のsubseq関数を用いて、 single-FASTA形式やmulti-FASTA形式ファイルから様々な部分配列を取得するやり方を示します。 この項目は、「この染色体の、ここから、ここまで」という指定の仕方になります。 例えば入力ファイルがヒトゲノムだった場合に、chr3の20000から500000の座標の配列取得を行いたい場合などに利用します。 したがって、chr4とchr8の配列のみ抽出といったやり方には対応していませんのでご注意ください。 また、ファイルダウンロード時に、*.fastaという拡張子が*.txtに勝手に変更されることがありますのでご注意ください。 ここでは、

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

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

任意の範囲 (始点が3, 終点が9)の配列を抽出するやり方です。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

6. multi-FASTA形式のファイル (genome.fna)ファイルの場合:

例題5と基本的に同じで、入力ファイルが異なるだけです。 予め用意しておいた「1列目:accession, 2列目:start位置, 3列目:end位置」からなるリストファイル (list_20190513.txt) を読み込ませて、2,311個のCDSからなるmulti-FASTAファイルをゲットするやり方です。

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

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

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

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

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

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

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

例題6と基本的に同じですが、4列目にストランド情報を含むリストファイル (list_20190513_strand.txt) を読み込ませて、ストランドを適切に反映させた2,311個のCDSからなるmulti-FASTAファイルをゲットするやり方です。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

目的のIDが複数ある場合に対応したものです。予め用意しておいたリストファイル (list_sub6.txt) を読み込ませて、目的の配列のmulti-FASTAファイルをゲットするやり方です。 バージョン番号やスペースを含むIDは抽出できないという例です。 リスト中の3つのうち、最後のIDの配列のみ抽出できていることがわかります。

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

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

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

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

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

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

目的のIDが複数ある場合に対応したものです。予め用意しておいたリストファイル (list_sub7.txt) を読み込ませて、目的の配列のmulti-FASTAファイルをゲットするやり方です。 "contig_2"の配列は取得できていますが、"contig_4"の配列は取得できていないことがわかります。 理由は、"contig_4 "とスペースが入っているためです。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

塩基配列を入力として、アミノ酸配列を取得するプログラムです。 Galaxyでもできるはずです。

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

Biostringsパッケージを用いて塩基配列を読み込んでアミノ酸配列に翻訳するやり方を示します。 翻訳のための遺伝コード(genetic code)は、Standard Genetic Codeだそうです。 もちろん生物種?!によって多少違い(variants)があるようで、"Standard", "SGC0", "Vertebrate Mitochondrial", "SGC1"などいろいろ選べるようです。

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

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

multi-FASTAではないsingle-FASTA形式ファイルです。

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

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

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

#本番
fasta <- translate(fasta)              #アミノ酸配列に翻訳した結果をfastaに格納
fasta                                  #確認してるだけです

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

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

配列中にACGT以外のものが存在するためエラーが出る例です。 4番目の配列(つまりgene_4)の17番目のポジションがNなので妥当です。

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

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

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

#本番
fasta <- translate(fasta)              #アミノ酸配列に翻訳した結果をfastaに格納
fasta                                  #確認してるだけです

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

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

エラーへの対策として、ACGTのみからなる配列を抽出したサブセットを抽出しています。 翻訳はそれらのサブセットのみに対して行っているので「文字が塩基ではない」という類のエラーがなくなっていることがわかります。 出力ファイル中の*は終始コドン(stop codon)を表すようですね。

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

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

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

#前処理(ACGTのみからなる配列を抽出)
#hoge <- rowSums(alphabetFrequency(fasta)[,1:4])#A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納(2015年9月12日以前の記述)
hoge <- apply(as.matrix(alphabetFrequency(fasta)[,1:4]), 1, sum)#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以降の記述)
obj <- (width(fasta) == hoge)          #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#本番
fasta <- translate(fasta)              #アミノ酸配列に翻訳した結果をfastaに格納
fasta                                  #確認してるだけです

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

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

配列中にNを含むものが出現したところでエラーが出て止まる例です。 「以下にエラー .Call2("DNAStringSet_translate", x, skip_code, dna_codes[codon_alphabet], : in 'x[[406]]': not a base at pos 498」といったエラーが見られると思います。 これは406番目の配列の498番目のポジションの文字が塩基ではないと文句を言っています。

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

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

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

#本番
fasta <- translate(fasta)              #アミノ酸配列に翻訳した結果をfastaに格納
fasta                                  #確認してるだけです

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

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

エラーへの対策として、ACGTのみからなる配列を抽出したサブセットを抽出しています。 翻訳はそれらのサブセットのみに対して行っているのでエラーは出なくなっていることがわかります。

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

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

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

#前処理(ACGTのみからなる配列を抽出)
#hoge <- rowSums(alphabetFrequency(fasta)[,1:4])#A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納(2015年9月12日以前の記述)
hoge <- apply(as.matrix(alphabetFrequency(fasta)[,1:4]), 1, sum)#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以降の記述)
obj <- (width(fasta) == hoge)          #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#本番
fasta <- translate(fasta)              #アミノ酸配列に翻訳した結果をfastaに格納
fasta                                  #確認してるだけです

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

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

5.と基本的に同じです。translate関数実行時に、genetic.codeオプションのデフォルトを明記しています。

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

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

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

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

#本番
fasta <- translate(fasta, genetic.code=GENETIC_CODE)#アミノ酸配列に翻訳した結果をfastaに格納
fasta                                  #確認してるだけです

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

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

translate関数実行時に、genetic.codeオプションをgetGeneticCode("SGC1")に変更しています。 遺伝コードが変わっているので、6.と異なった結果となります。

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

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

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

#前処理(ACGTのみからなる配列を抽出)
#hoge <- rowSums(alphabetFrequency(fasta)[,1:4])#A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納(2015年9月12日以前の記述)
hoge <- apply(as.matrix(alphabetFrequency(fasta)[,1:4]), 1, sum)#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以降の記述)
obj <- (width(fasta) == hoge)          #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#本番
fasta <- translate(fasta, genetic.code=getGeneticCode("SGC1"))#アミノ酸配列に翻訳した結果をfastaに格納
fasta                                  #確認してるだけです

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

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

seqinrパッケージを用いて塩基配列を読み込んでアミノ酸配列に翻訳するやり方を示します。 本気で翻訳配列を取得する場合にはこちらの利用をお勧めします。翻訳できないコドンはアミノ酸X(不明なアミノ酸)に変換してくれたり、 translate関数のオプションとしてambiguous=Tとすると、翻訳できるものは可能な限り翻訳してくれます(高橋 広夫 氏提供情報)。 lapply関数を用いるやり方(高橋 広夫 氏提供情報)とsapply関数を用いるやり方(甲斐 政親 氏提供情報)を示します。

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

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

multi-FASTAではないsingle-FASTA形式ファイルです。

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

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

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

#本番
hoge <- lapply(hoge, function(x){      #アミノ酸配列に翻訳
              translate(x, ambiguous=T)#アミノ酸配列に翻訳
        })                             #アミノ酸配列に翻訳
hoge                                   #確認してるだけです

#ファイルに保存
write.fasta(hoge, names=names(hoge), file.out=out_f, nbchar=50)#hogeの中身を指定したファイル名で保存
	

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

lapply関数を用いるやり方です。

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

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

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

#本番
hoge <- lapply(hoge, function(x){      #アミノ酸配列に翻訳
              translate(x, ambiguous=T)#アミノ酸配列に翻訳
        })                             #アミノ酸配列に翻訳
hoge                                   #確認してるだけです

#ファイルに保存
write.fasta(hoge, names=names(hoge), file.out=out_f, nbchar=50)#hogeの中身を指定したファイル名で保存
	

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

sapply関数を用いるやり方です。

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

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

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

#本番
hoge <- sapply(hoge, function(x){      #アミノ酸配列に翻訳
              translate(x, ambiguous=T)#アミノ酸配列に翻訳
        })                             #アミノ酸配列に翻訳
hoge                                   #確認してるだけです

#ファイルに保存
write.fasta(hoge, names=names(hoge), file.out=out_f, nbchar=50)#hogeの中身を指定したファイル名で保存
	

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

ファイルの入出力はBiostringsパッケージ、翻訳はseqinrパッケージを利用するやり方です。 Biostringとseqinrで同じtranslate関数が存在するため、 「seqinr::translate」として明示的にseqinrパッケージ中のtranslate関数を利用すると宣言しています。

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

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

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

#本番
hoge2 <- sapply(fasta, function(x){    #アミノ酸配列に翻訳
            hoge <- as.character(x)    #アミノ酸配列に翻訳
            c2s(seqinr::translate(s2c(hoge), ambiguous=T))#アミノ酸配列に翻訳
        })                             #アミノ酸配列に翻訳
fasta <- AAStringSet(hoge2)            #AAStringSet形式に変更
fasta                                  #確認してるだけです

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

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

Biostringsパッケージ中のcomplement関数を用いて、FASTA形式ファイルを読み込んで相補鎖を得るやり方を示します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Biostringsパッケージ中のreverseComplement関数を用いて、FASTA形式ファイルを読み込んで逆相補鎖を得るやり方を示します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Biostringsパッケージ中のreverse関数を用いて、FASTA形式ファイルを読み込んで逆鎖を得るやり方を示します。

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

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

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

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

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

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

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

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

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

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

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

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

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

イントロ | 一般 | k-mer解析 | k=1(塩基ごとの出現頻度解析) | Biostrings

Biostringsパッケージを用いて、multi-FASTA形式ファイルを読み込んで、"A", "C", "G", "T", ..., "N", ...など塩基ごとの出現頻度を調べるやり方を示します。 k-mer解析のk=1の場合に相当します。

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

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

配列ごとに出現頻度をカウントした結果を返すやり方です。

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

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

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

#本番
out <- alphabetFrequency(fasta)        #A,C,G,T,..の数を各配列ごとにカウントした結果をoutに格納
out                                    #outの中身を表示

#ファイルに保存
tmp <- cbind(names(fasta), out)        #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

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

1と基本的に同じで、出力結果を"A", "C", "G", "T", "N"のみに限定するやり方です。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_base <- c("A", "C", "G", "T", "N")#出力させたい塩基を指定

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

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

#本番
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を各配列ごとにカウントした結果をhogeに格納
obj <- is.element(colnames(hoge), param_base)#条件を満たすかどうかを判定した結果をobjに格納
obj                                    #objの中身を表示
out <- hoge[, obj]                     #objで指定した列のみ抽出した結果をoutに格納
out                                    #outの中身を表示

#ファイルに保存
tmp <- cbind(names(fasta), out)        #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

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

配列ごとではなく、全配列をまとめて出現頻度をカウントした結果を返すやり方です。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_base <- c("A", "C", "G", "T", "N")#出力させたい塩基を指定

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

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

#本番
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を各配列ごとにカウントした結果をhogeに格納
obj <- is.element(colnames(hoge), param_base)#条件を満たすかどうかを判定した結果をobjに格納
#out <- colSums(hoge[, obj])           #列ごとの総和をoutに格納
out <- apply(as.matrix(hoge[, obj]), 2, sum)#列ごとの総和をoutに格納

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

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

3と基本的に同じ結果ですが、転置させています。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_base <- c("A", "C", "G", "T", "N")#出力させたい塩基を指定

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

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

#本番
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を各配列ごとにカウントした結果をhogeに格納
obj <- is.element(colnames(hoge), param_base)#条件を満たすかどうかを判定した結果をobjに格納
#out <- colSums(hoge[, obj])           #列ごとの総和をoutに格納
out <- apply(as.matrix(hoge[, obj]), 2, sum)#列ごとの総和をoutに格納

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

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

multi-FASTAではないsingle-FASTA形式ファイルです。 colSums関数は行列データにしか適用できないが、apply(as.matrix...)とすることでmulti-FASTAでもsingle-FASTAでも統一的に取り扱えることがわかります。 と書いてますが挙動が変(R ver. 3.2.3)なので、変更予定です(2016年4月27日追加)。

in_f <- "sample1.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_base <- c("A", "C", "G", "T", "N")#出力させたい塩基を指定

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

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

#本番
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を各配列ごとにカウントした結果をhogeに格納
obj <- is.element(colnames(hoge), param_base)#条件を満たすかどうかを判定した結果をobjに格納
out <- colSums(hoge[, obj])            #列ごとの総和をoutに格納
#out <- apply(as.matrix(hoge[, obj]), 2, sum)#列ごとの総和をoutに格納

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

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

multi-FASTAではないsingle-FASTA形式ファイルです。 colSums関数は行列データにしか適用できないが、apply(as.matrix...)とすることでmulti-FASTAでもsingle-FASTAでも統一的に取り扱えることがわかります。 と書いてますが挙動が変(R ver. 3.2.3)なので、変更予定です(2016年4月27日追加)。

in_f <- "sample1.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_base <- c("A", "C", "G", "T", "N")#出力させたい塩基を指定

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

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

#本番
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を各配列ごとにカウントした結果をhogeに格納
obj <- is.element(colnames(hoge), param_base)#条件を満たすかどうかを判定した結果をobjに格納
#out <- colSums(hoge[, obj])           #列ごとの総和をoutに格納
#out <- apply(as.matrix(hoge[, obj]), 2, sum)#列ごとの総和をoutに格納
out <- hoge[, obj]                     #objがTRUEとなる列のみ抽出した結果をoutに格納

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

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

DDBJ Pipeline (Nagasaki et al., DNA Res., 2013)上で de novoゲノムアセンブリプログラムPlatanus (Kajitani et al., Genome Res., 2014) を実行して得られたmulti-FASTA形式ファイル(out_gapClosed.fa; 約2.4MB)です。

in_f <- "out_gapClosed.fa"             #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納
param_base <- c("A", "C", "G", "T", "N")#出力させたい塩基を指定

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

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

#本番
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を各配列ごとにカウントした結果をhogeに格納
obj <- is.element(colnames(hoge), param_base)#条件を満たすかどうかを判定した結果をobjに格納
#out <- colSums(hoge[, obj])           #列ごとの総和をoutに格納
out <- apply(as.matrix(hoge[, obj]), 2, sum)#列ごとの総和をoutに格納

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

イントロ | 一般 | k-mer解析 | k=2(2連続塩基の出現頻度解析) | Biostrings

Biostringsパッケージを用いて、multi-FASTA形式ファイルを読み込んで、"AA", "AC", "AG", "AT", "CA", "CC", "CG", "CT", "GA", "GC", "GG", "GT", "TA", "TC", "TG", "TT" の計42 = 16通りの2連続塩基の出現頻度を調べるやり方を示します。k-mer解析のk=2の場合に相当します。 ヒトゲノムで"CG"の割合が期待値よりも低い(Lander et al., 2001; Saxonov et al., 2006)ですが、それを簡単に検証できます。

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

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

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

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

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

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

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

#ファイルに保存
tmp <- cbind(names(fasta), out)        #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

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

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

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

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

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

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

#ファイルに保存
tmp <- cbind(names(fasta), out)        #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

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

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

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

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

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

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

#ファイルに保存
tmp <- cbind(names(fasta), out)        #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

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

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

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Hsapiens.UCSC.hg19" #パッケージ名を指定(BSgenome系のゲノムパッケージ)

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

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

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

#ファイルに保存
tmp <- cbind(names(fasta), out)        #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

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

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

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Hsapiens.UCSC.hg19" #パッケージ名を指定(BSgenome系のゲノムパッケージ)

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

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

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

#ファイルに保存
tmp <- cbind(names(fasta), out)        #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

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

出現頻度ではなく、出現確率を得るやり方です。パッケージがインストールされていない場合は、 インストール | Rパッケージ | 個別を参考にしてインストールしてから再度チャレンジ。

out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Athaliana.TAIR.TAIR9"#パッケージ名を指定(BSgenome系のゲノムパッケージ)

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

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

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

#ファイルに保存
tmp <- cbind(names(fasta), out)        #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

7. ヒトゲノム配列パッケージ(BSgenome.Hsapiens.NCBI.GRCh38)の場合:

2013年12月にリリースされたGenome Reference Consortium GRCh38です。出力は出現確率です。

out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Hsapiens.NCBI.GRCh38"#パッケージ名を指定(BSgenome系のゲノムパッケージ)

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

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

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

#ファイルに保存
tmp <- cbind(names(fasta), out)        #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

8. ヒトゲノム配列パッケージ(BSgenome.Hsapiens.NCBI.GRCh38)の場合:

全配列を合算して、連続塩基ごとの出現頻度(frequency)と出現確率(probability)を出力するやり方です。 dinucleotideFrequency関数中の「simplify.as="collapsed"」オプションでも一応実行できますが、 桁が多くなりすぎて「整数オーバーフロー」問題が起きたのでやめてます。

out_f <- "hoge8.txt"                   #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Hsapiens.NCBI.GRCh38"#パッケージ名を指定(BSgenome系のゲノムパッケージ)

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

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

#本番
hoge <- dinucleotideFrequency(fasta, as.prob=F)#連続塩基の出現頻度情報をhogeに格納
frequency <- colSums(hoge)             #列ごとの総和をfrequencyに格納
probability <- frequency / sum(frequency)#出現確率を計算した結果をprobabilityに格納
frequency                              #中身を表示
sort(frequency, decreasing=F)          #値の小さい順にソートした結果を表示

#ファイルに保存
tmp <- cbind(names(frequency), frequency, probability)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

9. ヒトゲノム配列パッケージ(BSgenome.Hsapiens.NCBI.GRCh38)の場合:

基本的に7.と同じです。7.の手順がややこしいと思う人向けの解説用です。 簡単に言えば、パッケージ名を2回書かなくて済むテクニックを用いているだけです。 もう少し詳細に書くと、BSgenomeパッケージはlibrary関数で読み込んだ後にパッケージ名と同じ名前のオブジェクトを利用できるようになります。 例えばBSgenome.Hsapiens.NCBI.GRCh38パッケージの場合は、BSgenome.Hsapiens.NCBI.GRCh38 という名前のオブジェクトを利用できるようになります。 ベタで書くと2回BSgenome.Hsapiens.NCBI.GRCh38を記述する必要性があるため、間違う確率が上昇します。 7.のように一見ややこしく書けば、結果的に一度のみの記述で済むのです。

out_f <- "hoge9.txt"                   #出力ファイル名を指定してout_fに格納

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

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

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

#ファイルに保存
tmp <- cbind(names(fasta), out)        #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

10. ヒトゲノム配列パッケージ(BSgenome.Hsapiens.NCBI.GRCh38)の場合:

7.と基本的に同じですが、box plotのPNGファイルも出力しています。

out_f1 <- "hoge10.txt"                 #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge10.png"                 #出力ファイル名を指定してout_f2に格納
param_bsgenome <- "BSgenome.Hsapiens.NCBI.GRCh38"#パッケージ名を指定(BSgenome系のゲノムパッケージ)
param_fig <- c(700, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

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

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

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

#ファイルに保存(テキストファイル)
tmp <- cbind(names(fasta), out)        #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
boxplot(out, ylab="Probability")       #描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

11. ヒトゲノム配列パッケージ(BSgenome.Hsapiens.NCBI.GRCh38)の場合:

10.と基本的に同じですが、連続塩基の種類ごとの期待値とボックスプロット(box plot)上での色情報を含むファイル (human_2mer.txt)を入力として利用し、色情報のみを取り出して利用しています。

in_f <- "human_2mer.txt"               #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge11.txt"                 #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge11.png"                 #出力ファイル名を指定してout_f2に格納
param_bsgenome <- "BSgenome.Hsapiens.NCBI.GRCh38"#パッケージ名を指定(BSgenome系のゲノムパッケージ)
param_fig <- c(700, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

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

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

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

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

#ファイルに保存(テキストファイル)
tmp <- cbind(names(fasta), out)        #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
boxplot(out, ylab="Probability", col=as.character(data$color))#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

12. ヒトゲノム配列パッケージ(BSgenome.Hsapiens.NCBI.GRCh38)の場合:

11.と基本的に同じですが、human_2mer.txtというファイルを入力として与えて、 連続塩基の種類ごとの期待値とボックスプロット(box plot)上での色情報を利用しています。 また、重要なのは期待値からの差分であり、「プロットも期待値(expected)と同程度の観測値(observed)であればゼロ、 観測値のほうが大きければプラス、観測値のほうが小さければマイナス」といった具合で表現したほうがスマートです。 それゆえ、box plotの縦軸をlog(observed/expected)として表現しています。 CG以外の連続塩基は縦軸上でが0近辺に位置していることが分かります。

in_f <- "human_2mer.txt"               #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge12.txt"                 #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge12.png"                 #出力ファイル名を指定してout_f2に格納
param_bsgenome <- "BSgenome.Hsapiens.NCBI.GRCh38"#パッケージ名を指定(BSgenome系のゲノムパッケージ)
param_fig <- c(700, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

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

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

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

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

#後処理(log(observed/expected)に変換)
logratio <- log2(out/data$expected)    #log(observed/expected)の計算結果をlogratioに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(names(fasta), logratio)   #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
boxplot(logratio, ylab="log2(observed/expected)",#描画
        col=as.character(data$color))  #描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

イントロ | 一般 | k-mer解析 | k=3(3連続塩基の出現頻度解析) | Biostrings

Biostringsパッケージを用いて、43 = 64 通りの3連続塩基の出現頻度を調べるやり方を示します。k-mer解析のk=3の場合に相当します。

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

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

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

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

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

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

#ファイルに保存
tmp <- cbind(names(fasta), out)        #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

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

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

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

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

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

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

#ファイルに保存
tmp <- cbind(names(fasta), out)        #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

イントロ | 一般 | k-mer解析 | k=n(n連続塩基の出現頻度解析) | Biostrings

Biostringsパッケージを用いて、4n通りの任意のn連続塩基の出現頻度を調べるやり方を示します。k-mer解析のk=nの場合に相当します。 例えば2連続塩基の場合はk=2, 3連続塩基の場合はk=3と指定します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2連続塩基(k=2)の全配列をまとめた出現頻度情報を得るやり方です。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 2                        #k-merのkの値を指定

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

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

#本番
out <- oligonucleotideFrequency(fasta, width=param_kmer, simplify.as="collapsed")#k連続塩基の全配列をまとめた出現頻度情報をoutに格納

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

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

2連続塩基(k=2)の全配列をまとめた出現確率情報を得るやり方です。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 2                        #k-merのkの値を指定

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

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

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

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

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

10連続塩基(k=10)の出現頻度情報を得るやり方です。4^10 = 1,048,576(105万)通りのk-merの出現頻度を計算することになります。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 10                       #k-merのkの値を指定

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

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

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

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

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

15連続塩基(k=15)の出現頻度情報を得るやり方です。4^15 = 1,073,741,824(約11億)通りのk-merの出現頻度を計算することになります。 8GBメモリマシンで実行すると、「エラー: サイズ 16.0 Gb のベクトルを割り当てることができません」となります。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 15                       #k-merのkの値を指定

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

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

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

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

7. サンプルデータの例題32を実行して得られたmulti-FASTAファイル(sample32_ngs.fasta)の場合:

2連続塩基(k=2)の出現頻度情報を得るやり方です。4^2 = 16通りのk-merの出現頻度を計算することになります。 リード毎に出現頻度を算出しています。

in_f <- "sample32_ngs.fasta"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 2                        #k-merのkの値を指定

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

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

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

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

8. サンプルデータの例題32を実行して得られたmulti-FASTAファイル(sample32_ngs.fasta)の場合:

2連続塩基(k=2)の出現頻度情報を得るやり方です。4^2 = 16通りのk-merの出現頻度を計算することになります。 全リードを合算した出現頻度を出力するやり方です。

in_f <- "sample32_ngs.fasta"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge8.txt"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 2                        #k-merのkの値を指定

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

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

#本番
hoge <- oligonucleotideFrequency(fasta, width=param_kmer)#k連続塩基の出現頻度情報をhogeに格納
out <- colSums(hoge)                   #列ごとの総和をoutに格納

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

9. サンプルデータの例題32を実行して得られたmulti-FASTAファイル(sample32_ngs.fasta)の場合:

3連続塩基(k=3)の出現頻度情報を得るやり方です。4^3 = 64通りのk-merの出現頻度を計算することになります。 全リードを合算した出現頻度を出力するやり方です。

in_f <- "sample32_ngs.fasta"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge9.txt"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 3                        #k-merのkの値を指定

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

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

#本番
hoge <- oligonucleotideFrequency(fasta, width=param_kmer)#k連続塩基の出現頻度情報をhogeに格納
out <- colSums(hoge)                   #列ごとの総和をoutに格納

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

10. サンプルデータの例題33を実行して得られたmulti-FASTAファイル(sample33_ngs.fasta)の場合:

3連続塩基(k=3)の出現頻度情報を得るやり方です。4^3 = 64通りのk-merの出現頻度を計算することになります。 全リードを合算した出現頻度を出力するやり方です。

in_f <- "sample33_ngs.fasta"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge10.txt"                  #出力ファイル名を指定してout_fに格納
param_kmer <- 3                        #k-merのkの値を指定

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

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

#本番
hoge <- oligonucleotideFrequency(fasta, width=param_kmer)#k連続塩基の出現頻度情報をhogeに格納
out <- colSums(hoge)                   #列ごとの総和をoutに格納

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

11. サンプルデータの例題33を実行して得られたmulti-FASTAファイル(sample33_ngs.fasta)の場合:

10連続塩基(k=10)の出現頻度情報を得るやり方です。4^10 = 1,048,576通りのk-merの出現頻度を計算することになります。 全リードを合算した出現頻度を出力するやり方です。

in_f <- "sample33_ngs.fasta"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge11.txt"                  #出力ファイル名を指定してout_fに格納
param_kmer <- 10                       #k-merのkの値を指定

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

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

#本番
hoge <- oligonucleotideFrequency(fasta, width=param_kmer)#k連続塩基の出現頻度情報をhogeに格納
out <- colSums(hoge)                   #列ごとの総和をoutに格納

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=T, col.names=F)#outの中身を指定したファイル名で保存
length(out)                            #4^param_kmerの値を表示
sum(out > 0)                           #1回以上出現したk-merの種類数を表示
	

12. サンプルデータの例題34を実行して得られたmulti-FASTAファイル(sample34_ngs.fasta)の場合:

10連続塩基(k=10)の出現頻度情報を得るやり方です。4^10 = 1,048,576通りのk-merの出現頻度を計算することになります。 全リードを合算した出現頻度を出力するやり方です。

in_f <- "sample34_ngs.fasta"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge12.txt"                  #出力ファイル名を指定してout_fに格納
param_kmer <- 10                       #k-merのkの値を指定

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

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

#本番
hoge <- oligonucleotideFrequency(fasta, width=param_kmer)#k連続塩基の出現頻度情報をhogeに格納
out <- colSums(hoge)                   #列ごとの総和をoutに格納

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=T, col.names=F)#outの中身を指定したファイル名で保存
length(out)                            #4^param_kmerの値を表示
sum(out > 0)                           #1回以上出現したk-merの種類数を表示
	

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

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

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

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

*.ugeというファイル名で保存するやり方です。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
param <- "uge"                         #拡張子名を指定

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

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

#本番(拡張子を変えた出力ファイル名を作成)
out_f <- paste(unlist(strsplit(in_f, ".", fixed=TRUE))[1], param, sep=".")#出力ファイル名を作成してout_fに格納

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

イントロ | 一般 | Tips | 拡張子は同じで任意の文字を追加して保存

ファイル保存時に、拡張子名は変えずに、拡張子の手前に任意の文字(例:"_processed")を追加するやり方を示します。

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

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

*_processed.faというファイル名で保存するやり方です。

ファイル名中に"."(ドット)が一つしかないという前提です

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
param <- "_processed"                  #追加したい文字列を指定

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

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

#本番()
hoge1 <- paste(".", unlist(strsplit(in_f, ".", fixed=TRUE))[2], sep="")#"."を含む拡張子部分をhoge1に格納
hoge2 <- paste(param, hoge1, sep="")   #置換後の文字列をhoge2に格納
out_f <- sub(hoge1, hoge2, in_f)       #出力ファイル名を作成してout_fに格納

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

イントロ | 一般 | 配列取得 | ゲノム配列 | 公共DBから

イントロ | 一般 | 配列取得 | ゲノム配列 | BSgenome

BSgenomeパッケージを用いて様々な生物種のゲノム配列を取得するやり方を示します。 ミヤマハタザオ (A. lyrata)、セイヨウミツバチ (A. mellifera)、 シロイヌナズナ(A.thaliana)、ウシ(B.taurus)、線虫(C.elegans)、犬(C.familiaris)、キイロショウジョウバエ(D.melanogaster)、 ゼブラフィッシュ(D.rerio)、大腸菌(E.coli)、イトヨ(G.aculeatus)、セキショクヤケイ(G.gallus)、ヒト(H.sapiens)、 アカゲザル(M.mulatta)、マウス(M.musculus)、チンパンジー(P.troglodytes)、ラット(R.norvegicus)、出芽酵母(S.cerevisiae)、 トキソプラズマ(T.gondii)と実に様々な生物種が利用可能であることがわかります。 getSeq関数はBSgenomeオブジェクト中の「single sequences」というあたりにリストアップされているchr...というものを全て抽出しています。 したがって、例えばマウスゲノムは「chr1」以外に「chr1_random」や「chrUn_random」なども等価に取扱っている点に注意してください。

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

1. 利用可能な生物種とRにインストール済みの生物種をリストアップしたい場合:

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

#本番(利用可能なパッケージをリストアップ;インストール済みとは限らない)
available.genomes()                    #このパッケージ中で利用可能なゲノムをリストアップ

#本番(インストール済みの生物種をリストアップ)
installed.genomes()                    #インストール済みの生物種をリストアップ

#後処理(パッケージ名でだいたいわかるがproviderやversionを分割して表示したい場合)
installed.genomes(splitNameParts=TRUE) #インストール済みの生物種をリストアップ
	

2. ゼブラフィッシュ("BSgenome.Drerio.UCSC.danRer7")のゲノム情報をRにインストールしたい場合:

400MB程度あります...

param <- "BSgenome.Drerio.UCSC.danRer7"#パッケージ名を指定

#本番
source("http://bioconductor.org/biocLite.R")#おまじない
biocLite(param)                        #おまじない

#後処理(インストール済みの生物種をリストアップ)
installed.genomes()                    #インストール済みの生物種をリストアップ
	

3. インストール済みのゼブラフィッシュのゲノム配列をmulti-FASTAファイルで保存したい場合:

1.4GB程度のファイルが生成されます...

out_f <- "hoge3.fasta"                 #出力ファイル名を指定してout_fに格納
param <- "BSgenome.Drerio.UCSC.danRer7"#パッケージ名を指定

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

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
genome                                 #確認してるだけです

#本番
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している

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

4. インストール済みのマウス("BSgenome.Mmusculus.UCSC.mm9")のゲノム配列をmulti-FASTAファイルで保存したい場合:

2.8GB程度のファイルが生成されます...

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

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

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
genome                                 #確認してるだけです

#本番
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している

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

5. インストール済みのヒト("BSgenome.Hsapiens.UCSC.hg19")のゲノム配列をmulti-FASTAファイルで保存したい場合:

3.0GB程度のファイルが生成されます...。ヒトゲノムは、まだ完全に22本の常染色体とX, Y染色体の計24本になっているわけではないことがわかります。

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

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

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
genome                                 #確認してるだけです

#本番
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している

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

6. インストール済みのヒト("BSgenome.Hsapiens.UCSC.hg19")のゲノム配列をmulti-FASTAファイルで保存したい場合:

ヒトゲノムは、まだ完全に22本の常染色体とX, Y染色体の計24本になっているわけではないので、最初の主要な24本分のみにするやり方です。

out_f <- "hoge6.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- "BSgenome.Hsapiens.UCSC.hg19"#パッケージ名を指定
param2 <- 24                           #取り出したい染色体数を指定(主要なものから順番に並んでいるので最初の24本に相当)

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

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
#tmp <- unlist(strsplit(param1, ".", fixed=TRUE))[2]#指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param1, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
genome                                 #確認してるだけです

#本番
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している
fasta <- fasta[1:param2]               #染色体のフィルタリング

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

7. シロイヌナズナ("BSgenome.Athaliana.TAIR.TAIR9")のゲノム情報をRにインストールしたい場合:

Rのパッケージをインストール後、ゲノム配列をmulti-FASTAファイルで保存する一連の手順です。 The Arabidopsis Information Resource (TAIR)(Reiser et al., Curr Protoc Bioinformatics., 2017) から得られる最新バージョンはTAIR10ですが、アセンブリ結果自体はTAIR9と同じと明記されています (README_whole_chromosomes.txt)。

param <- "BSgenome.Athaliana.TAIR.TAIR9"#パッケージ名を指定

#本番
source("http://bioconductor.org/biocLite.R")#おまじない
biocLite(param, suppressUpdates=TRUE)  #おまじない

#後処理(インストール済みの生物種をリストアップ)
installed.genomes()                    #インストール済みの生物種をリストアップ
	

8. インストール済みのシロイヌナズナ("BSgenome.Athaliana.TAIR.TAIR9")のゲノム配列をmulti-FASTAファイルで保存したい場合:

The Arabidopsis Information Resource (TAIR)(Reiser et al., Curr Protoc Bioinformatics., 2017) から得られる最新バージョンはTAIR10ですが、アセンブリ結果自体はTAIR9と同じと明記されています (README_whole_chromosomes.txt)。 120MB程度のファイルが生成されます...

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

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

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
genome                                 #確認してるだけです

#本番
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している

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

9. インストール済みのヒト("BSgenome.Hsapiens.NCBI.GRCh38")のゲノム配列をmulti-FASTAファイルで保存したい場合:

2013年12月にリリースされたGenome Reference Consortium GRCh38です。 R ver. 3.1.0とBioconductor ver. 2.14以上の環境で実行可能です。

out_f <- "hoge9.fasta"                 #出力ファイル名を指定してout_fに格納
param <- "BSgenome.Hsapiens.NCBI.GRCh38"#パッケージ名を指定

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

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
genome                                 #確認してるだけです

#本番
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している

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

10. インストール済みのヒト("BSgenome.Hsapiens.NCBI.GRCh38")のゲノム配列のmulti-FASTAファイルで保存したい場合:

一部を抽出して保存するやり方です。このパッケージ中の染色体の並びが既知(chr1, 2, ..., chr22, chrX, chrY, and MT)であるという前提です。

out_f <- "hoge10.fasta"                #出力ファイル名を指定してout_fに格納
param <- "BSgenome.Hsapiens.NCBI.GRCh38"#パッケージ名を指定
param_range <- 1:25                    #抽出したい範囲を指定

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

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
genome                                 #確認してるだけです

#本番
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している

#後処理(フィルタリング)
obj <- param_range                     #抽出したいリードの位置情報をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

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

11. インストール済みのヒト("BSgenome.Hsapiens.UCSC.hg38")のゲノム配列をmulti-FASTAファイルで保存したい場合:

3.0GB程度のファイルが生成されます...。ヒトゲノムは、まだ完全に22本の常染色体とX, Y染色体の計24本になっているわけではないことがわかります。

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

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

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
genome                                 #確認してるだけです

#本番
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している

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

イントロ | 一般 | 配列取得 | プロモーター配列 | について

プロモーター(promoters)の大まかな定義は、遺伝子の転写制御を行う領域(regulatory regions)だと思います。 が、おそらくヒトによって具体的な定義は異なります(Cassiano and Silva-Rocha, mSystems, 2020)。 例えばChuangらは、転写開始点(Transcriptional Start Sites; TSS)の上流1,500塩基から下流500塩基と定義しています(Chuang et al., PLoS One, 2011)。 多くの場合、ヒトやマウスなどの哺乳類ゲノムの場合はこの領域にCpGアイランド(CpG islands or CpG islets; CGIs)をもつことが知られています。 プロモータには、CGIをもつものともたないものの2つのクラスがあるといった報告もあります(Saxonov et al., Proc Natl Acad Sci U S A., 2006)。

Rパッケージ:

R以外:

Review、ガイドライン、パイプライン系:

イントロ | 一般 | 配列取得 | プロモーター配列 | 公共DBから

イントロ | 一般 | 配列取得 | プロモーター配列 | BSgenomeとTxDbから

ゲノム配列(BSgenome)パッケージとアノテーション情報(TxDb)パッケージ を用いて様々な生物種のプロモーター配列(転写開始点近傍配列;上流配列)を取得するやり方を示します。 2014年4月リリースのBioconductor 2.14以降の推奨手順では、ゲノムのパッケージ(例:BSgenome.Hsapiens.UCSC.hg19)と 対応するアノテーションパッケージ(例:TxDb.Hsapiens.UCSC.hg19.knownGene)の両方を読み込ませる必要がありますので、2015年2月に記述内容を大幅に変更しました。 ヒトなどの主要なパッケージ以外はおそらくデフォルトではインストールされていませんので、「パッケージがインストールされていません」的なエラーが出た場合は、 個別パッケージのインストールを参考にして予め利用したいパッケージのインストールを行ってから再挑戦してください。 出力はmulti-FASTAファイルです。 現状では、ゼブラフィッシュ(danRer7)はゲノムパッケージ(BSgenome.Drerio.UCSC.danRer7) は存在しますが、対応するTxDbパッケージが存在しないので、どこかからGFFファイルを取得してmakeTxDbFromGFF関数などを利用してTxDbオブジェクトを得るなどする必要があります。

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

1. ヒト(hg19)の場合:

ゲノムパッケージ(BSgenome.Hsapiens.UCSC.hg19)と 対応するアノテーションパッケージ(TxDb.Hsapiens.UCSC.hg19.knownGene) を読み込んで、転写開始点上流1000塩基分を取得するやり方です。

out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Hsapiens.UCSC.hg19"#パッケージ名を指定(BSgenome系のゲノムパッケージ)
param_txdb <- "TxDb.Hsapiens.UCSC.hg19.knownGene"#パッケージ名を指定(TxDB系のアノテーションパッケージ)
param_upstream <- 1000                 #転写開始点上流の塩基配列数を指定

#前処理(指定したパッケージ中のオブジェクト名をgenomeおよびtxdbに統一)
library(param_bsgenome, character.only=T)#指定したパッケージの読み込み
tmp <- ls(paste("package", param_bsgenome, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納

library(param_txdb, character.only=T)  #指定したパッケージの読み込み
tmp <- ls(paste("package", param_txdb, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納

#本番
gn <- sort(genes(txdb))                #遺伝子の座標情報を取得
hoge <- flank(gn, width=param_upstream)#指定した範囲の座標情報を取得
fasta <- getSeq(genome, hoge)          #指定した範囲の塩基配列情報を取得
fasta                                  #確認してるだけです

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

2. ヒト(hg19)の場合:

ゲノムパッケージ(BSgenome.Hsapiens.UCSC.hg19)と 対応するアノテーションパッケージ(TxDb.Hsapiens.UCSC.hg19.knownGene) を読み込んで、転写開始点上流500塩基から下流20塩基までの範囲を取得するやり方です。

out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Hsapiens.UCSC.hg19"#パッケージ名を指定(BSgenome系のゲノムパッケージ)
param_txdb <- "TxDb.Hsapiens.UCSC.hg19.knownGene"#パッケージ名を指定(TxDB系のアノテーションパッケージ)
param_upstream <- 500                  #転写開始点上流の塩基配列数を指定
param_downstream <- 20                 #転写開始点下流の塩基配列数を指定

#前処理(指定したパッケージ中のオブジェクト名をgenomeおよびtxdbに統一)
library(param_bsgenome, character.only=T)#指定したパッケージの読み込み
tmp <- ls(paste("package", param_bsgenome, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納

library(param_txdb, character.only=T)  #指定したパッケージの読み込み
tmp <- ls(paste("package", param_txdb, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納

#本番
gn <- sort(genes(txdb))                #遺伝子の座標情報を取得
hoge <- promoters(gn, upstream=param_upstream,#指定した範囲の座標情報を取得
           downstream=param_downstream)#指定した範囲の座標情報を取得
fasta <- getSeq(genome, hoge)          #指定した範囲の塩基配列情報を取得
fasta                                  #確認してるだけです

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

3. 線虫(ce6)の場合:

ゲノムパッケージ(BSgenome.Celegans.UCSC.ce6)と 対応するアノテーションパッケージ(TxDb.Celegans.UCSC.ce6.ensGene) を読み込んで、転写開始点上流500塩基から下流20塩基までの範囲を取得するやり方です。

out_f <- "hoge3.fasta"                 #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Celegans.UCSC.ce6"#パッケージ名を指定(BSgenome系のゲノムパッケージ)
param_txdb <- "TxDb.Celegans.UCSC.ce6.ensGene"#パッケージ名を指定(TxDB系のアノテーションパッケージ)
param_upstream <- 500                  #転写開始点上流の塩基配列数を指定
param_downstream <- 20                 #転写開始点下流の塩基配列数を指定

#前処理(指定したパッケージ中のオブジェクト名をgenomeおよびtxdbに統一)
library(param_bsgenome, character.only=T)#指定したパッケージの読み込み
tmp <- ls(paste("package", param_bsgenome, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納

library(param_txdb, character.only=T)  #指定したパッケージの読み込み
tmp <- ls(paste("package", param_txdb, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納

#本番
gn <- sort(genes(txdb))                #遺伝子の座標情報を取得
hoge <- promoters(gn, upstream=param_upstream,#指定した範囲の座標情報を取得
           downstream=param_downstream)#指定した範囲の座標情報を取得
fasta <- getSeq(genome, hoge)          #指定した範囲の塩基配列情報を取得
fasta                                  #確認してるだけです

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

4. マウス(mm10)の場合:

ゲノムパッケージ(BSgenome.Mmusculus.UCSC.mm10)と 対応するアノテーションパッケージ(TxDb.Mmusculus.UCSC.mm10.knownGene) を読み込んで、転写開始点上流500塩基から下流20塩基までの範囲を取得するやり方です。

out_f <- "hoge4.fasta"                 #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Mmusculus.UCSC.mm10"#パッケージ名を指定(BSgenome系のゲノムパッケージ)
param_txdb <- "TxDb.Mmusculus.UCSC.mm10.knownGene"#パッケージ名を指定(TxDB系のアノテーションパッケージ)
param_upstream <- 500                  #転写開始点上流の塩基配列数を指定
param_downstream <- 20                 #転写開始点下流の塩基配列数を指定

#前処理(指定したパッケージ中のオブジェクト名をgenomeおよびtxdbに統一)
library(param_bsgenome, character.only=T)#指定したパッケージの読み込み
tmp <- ls(paste("package", param_bsgenome, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納

library(param_txdb, character.only=T)  #指定したパッケージの読み込み
tmp <- ls(paste("package", param_txdb, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納

#本番
gn <- sort(genes(txdb))                #遺伝子の座標情報を取得
hoge <- promoters(gn, upstream=param_upstream,#指定した範囲の座標情報を取得
           downstream=param_downstream)#指定した範囲の座標情報を取得
fasta <- getSeq(genome, hoge)          #指定した範囲の塩基配列情報を取得
fasta                                  #確認してるだけです

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

5. ヒト(hg38)の場合:

ゲノムパッケージ(BSgenome.Hsapiens.NCBI.GRCh38)と 対応するアノテーションパッケージ(TxDb.Hsapiens.UCSC.hg38.knownGene) を読み込んで、転写開始点上流500塩基から下流20塩基までの範囲を取得するやり方として書いてはいますが、 「sequence chr1 not found」のようなエラーが出ます。この理由は、情報提供元が異なるため同一染色体の対応付けができないことに起因します。

out_f <- "hoge5.fasta"                 #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Hsapiens.NCBI.GRCh38"#パッケージ名を指定(BSgenome系のゲノムパッケージ)
param_txdb <- "TxDb.Hsapiens.UCSC.hg38.knownGene"#パッケージ名を指定(TxDB系のアノテーションパッケージ)
param_upstream <- 500                  #転写開始点上流の塩基配列数を指定
param_downstream <- 20                 #転写開始点下流の塩基配列数を指定

#前処理(指定したパッケージ中のオブジェクト名をgenomeおよびtxdbに統一)
library(param_bsgenome, character.only=T)#指定したパッケージの読み込み
tmp <- ls(paste("package", param_bsgenome, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納

library(param_txdb, character.only=T)  #指定したパッケージの読み込み
tmp <- ls(paste("package", param_txdb, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納

#本番
gn <- sort(genes(txdb))                #遺伝子の座標情報を取得
hoge <- promoters(gn, upstream=param_upstream,#指定した範囲の座標情報を取得
           downstream=param_downstream)#指定した範囲の座標情報を取得
fasta <- getSeq(genome, hoge)          #指定した範囲の塩基配列情報を取得
fasta                                  #確認してるだけです

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

イントロ | 一般 | 配列取得 | プロモーター配列 | GenomicFeatures(Lawrence_2013)

GenomicFeaturesパッケージを主に用いてプロモーター配列(転写開始点近傍配列)を得るやり方を示します。

ここでは、イントロ | 一般 | 配列取得 | ゲノム配列(BSgenomeから)で指定可能なゲノムと イントロ | NGS | アノテーション情報取得 | TxDb | GenomicFeatures(Lawrence_2013)で作成可能なTxDbオブジェクトを入力として、 転写開始点から任意の[上流xxx塩基, 下流yyy塩基]分の塩基配列を取得して、 FASTA形式ファイルで保存するやり方を示しています。makeTxDbFromGFF関数は、どの生物種に対してもデフォルトではChrMのみ環状ゲノムとするようですが、 circ_seqsオプションで任意の染色体の環状・非環状の指定が可能です(高橋 広夫 氏提供情報)。 ちなみに、ゲノムの方の環状・非環状の指定のやり方は、例えば「Chr1, Chr2, Chr3, Chr4, Chr5, ChrM, ChrC」のシロイヌナズナゲノムのオブジェクトgenomeに対して ChrMのみ環状としたい場合は、genome@seqinfo@is_circular <- c(F, F, F, F, F, T, F)のように指定すればよいです。 multi-FASTA形式のゲノム配列ファイルとGFF3形式のアノテーションファイルのみからプロモータ配列を取得するやり方も示しています。 2017年6月23日に、例題12のコードを、コンティグ(配列)数が複数で「FASTAファイルには存在するがGFFファイル中には存在しない配列があった場合」に不都合が生じる問題を回避できるように書き換えました(野間口達洋氏 提供情報)。

1. ヒト("BSgenome.Hsapiens.UCSC.hg19")の[上流200塩基, 下流30塩基]のプロモーター配列を取得する場合:

ヒトゲノム ver. 19 ("hg19"; Genome Reference Consortium GRCh37のことらしい)のUCSC Genes ("knownGene")のTxDbオブジェクトを利用しています。

out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Hsapiens.UCSC.hg19"#ゲノムのパッケージ名を指定
param_txdb1 <- "hg19"                  #TxDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param_txdb2 <- "knownGene"             #TxDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param_upstream <- 200                  #転写開始点上流の塩基配列数を指定
param_downstream <- 30                 #転写開始点下流の塩基配列数を指定

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

#前処理(ゲノム情報を取得)
library(param_bsgenome, character.only=T)#指定したパッケージの読み込み
tmp <- ls(paste("package", param_bsgenome, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納
genome                                 #確認してるだけです

#前処理(アノテーション情報を取得)
txdb <- makeTxDbFromUCSC(genome=param_txdb1, tablename=param_txdb2)#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#本番(配列取得)
out <- getPromoterSeq(transcriptsBy(txdb, by="gene"),#指定した範囲のプロモーター配列を取得してoutに格納
          genome, upstream=param_upstream, downstream=param_downstream)#指定した範囲のプロモーター配列を取得してoutに格納
out                                    #確認してるだけです

#ファイルに保存
fasta <- unlist(out)                   #XStringSetListオブジェクトからXStringSetオブジェクトに変換した結果をfastaに格納
fasta                                  #確認してるだけです
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. ヒト("BSgenome.Hsapiens.UCSC.hg19")の[上流200塩基, 下流30塩基]のプロモーター配列を取得する場合:

ヒトゲノム ver. 19 ("hg19"; Genome Reference Consortium GRCh37のことらしい)のEnsembl Genes ("ensGene")のTxDbオブジェクトを利用しています。

out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Hsapiens.UCSC.hg19"#ゲノムのパッケージ名を指定
param_txdb1 <- "hg19"                  #TxDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param_txdb2 <- "ensGene"               #TxDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param_upstream <- 200                  #転写開始点上流の塩基配列数を指定
param_downstream <- 30                 #転写開始点下流の塩基配列数を指定

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

#前処理(ゲノム情報を取得)
library(param_bsgenome, character.only=T)#指定したパッケージの読み込み
tmp <- ls(paste("package", param_bsgenome, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納
genome                                 #確認してるだけです

#前処理(アノテーション情報を取得)
txdb <- makeTxDbFromUCSC(genome=param_txdb1, tablename=param_txdb2)#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#本番(配列取得)
out <- getPromoterSeq(transcriptsBy(txdb, by="gene"),#指定した範囲のプロモーター配列を取得してoutに格納
          genome, upstream=param_upstream, downstream=param_downstream)#指定した範囲のプロモーター配列を取得してoutに格納
out                                    #確認してるだけです

#ファイルに保存
fasta <- unlist(out)                   #XStringSetListオブジェクトからXStringSetオブジェクトに変換した結果をfastaに格納
fasta                                  #確認してるだけです
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. シロイヌナズナ("BSgenome.Athaliana.TAIR.TAIR9")の[上流500塩基, 下流0塩基]のプロモーター配列を取得する場合:

UCSCからはArabidopsisの遺伝子アノテーション情報が提供されていないため、 TAIR10_GFF3_genes.gffを予めダウンロードしておき、 makeTxDbFromGFF関数を用いてTxDbオブジェクトを作成しています。 この関数は、どの生物種に対してもデフォルトではChrMのみ環状ゲノムとするようですので、 circ_seqsオプションで葉緑体ゲノム(Chloroplast; ChrC)が環状であると認識させるやり方です(高橋 広夫 氏提供情報)。 これでゲノムの環状・非環状に起因するエラーを解決できたので第一段階突破です(2015.03.04追加)。 それでも「以下にエラー loadFUN(x, seqname, ranges) : trying to load regions beyond the boundaries of non-circular sequence "Chr3"」 というエラーに遭遇してしまいます。この解決策は4.に記載しています。(2015.08.03追加)

in_f <- "TAIR10_GFF3_genes.gff"        #入力ファイル名を指定してin_f2に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge3.fasta"                 #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Athaliana.TAIR.TAIR9"#ゲノムのパッケージ名を指定
param_upstream <- 500                  #転写開始点上流の塩基配列数を指定
param_downstream <- 0                  #転写開始点下流の塩基配列数を指定

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

#前処理(ゲノム情報を取得)
library(param_bsgenome, character.only=T)#指定したパッケージの読み込み
tmp <- ls(paste("package", param_bsgenome, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納
genome                                 #確認してるだけです
seqinfo(genome)                        #確認してるだけです

#前処理(アノテーション情報を取得)
txdb <- makeTxDbFromGFF(in_f, format="gff3", circ_seqs=c("ChrC","ChrM"))#txdbオブジェクトの作成
txdb                                   #確認してるだけです
seqinfo(txdb)                          #確認してるだけです

#本番(配列取得)
out <- getPromoterSeq(transcriptsBy(txdb, by="gene"),#指定した範囲のプロモーター配列を取得してoutに格納
          genome, upstream=param_upstream, downstream=param_downstream)#指定した範囲のプロモーター配列を取得してoutに格納
out                                    #確認してるだけです

#ファイルに保存
fasta <- unlist(out)                   #XStringSetListオブジェクトからXStringSetオブジェクトに変換した結果をfastaに格納
fasta                                  #確認してるだけです
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. シロイヌナズナ("BSgenome.Athaliana.TAIR.TAIR9")の[上流500塩基, 下流0塩基]のプロモーター配列を取得する場合:

3.のエラーへの対処法(甲斐政親氏 提供情報)。取得予定の範囲が完全にゲノム配列内に収まっているもののみ抽出してから getSeq関数を用いて配列取得しています。(2015.08.03追加)

in_f <- "TAIR10_GFF3_genes.gff"        #入力ファイル名を指定してin_fに格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge4.fasta"                 #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Athaliana.TAIR.TAIR9"#ゲノムのパッケージ名を指定
param_upstream <- 500                  #転写開始点上流の塩基配列数を指定
param_downstream <- 0                  #転写開始点下流の塩基配列数を指定

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

#前処理(ゲノム情報を取得)
library(param_bsgenome, character.only=T)#指定したパッケージの読み込み
tmp <- ls(paste("package", param_bsgenome, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納
genome                                 #確認してるだけです
seqinfo(genome)                        #確認してるだけです

#前処理(アノテーション情報を取得)
txdb <- makeTxDbFromGFF(in_f, format="gff3", circ_seqs=c("ChrC","ChrM"))#txdbオブジェクトの作成
txdb                                   #確認してるだけです
seqinfo(txdb)                          #確認してるだけです

#前処理(欲しい領域の座標情報取得)
#gn <- sort(genes(txdb))               #遺伝子の座標情報を取得
hoge <- promoters(txdb, upstream=param_upstream,#指定した範囲の座標情報を取得
           downstream=param_downstream)#指定した範囲の座標情報を取得
hoge                                   #確認してるだけです

#前処理(取得予定領域座標がゲノム配列の範囲外にあるものをフィルタリング)
hoge3 <- param_upstream + param_downstream#欲しいプロモーター配列長情報をhoge3に格納
obj <- sapply(hoge,                    #領域座標情報hogeに対して下記関数を実行した結果をobjに格納
  function(hoge2) {                    #関数を定義
    start <- hoge2@ranges[[1]][1]      #start位置情報を取得
    end <- hoge2@ranges[[1]][hoge3]    #end位置情報を取得
    chr_num <- grep(paste(hoge2@seqnames@values, "$", sep=""), hoge@seqnames@values)#調査中の領域が属する染色体の要素番号情報を取得
    chr_length <- genome[[chr_num]]@length#該当染色体の配列長情報を取得
    if ((start >= 0) & (end <= chr_length)){#該当染色体の範囲内にある場合は
        return(TRUE)                   #TRUE
    } else {                           #そうでなければ
        return(FALSE)                  #FALSE
    }
  })
hoge <- hoge[obj]                      #objがTRUEとなる要素のみ抽出した結果をhogeに格納
hoge                                   #確認してるだけです

#本番(配列取得)
fasta <- getSeq(genome, hoge)          #指定した範囲の塩基配列情報を取得
fasta                                  #確認してるだけです

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

5. シロイヌナズナ(TAIR10_chr_all.fas.gz) の[上流500塩基, 下流0塩基]のプロモーター配列を取得する場合:

UCSCからはArabidopsisの遺伝子アノテーション情報が提供されていないため、 TAIR10_GFF3_genes.gffを予めダウンロードしておき、 makeTxDbFromGFF関数を用いてTxDbオブジェクトを作成しています。 イントロ | NGS | 読み込み | FASTA形式 | description行の記述を整形を参考にして、 description行の文字列をgffファイルと対応がとれるように変更しています。 2023年4月に再度実行させると不具合が生じるようになっていることがわかりましたので、「前処理(欲しい領域がゲノム配列の範囲内のもののみ抽出)」の部分を修正しています(2023.04.21追加)。

in_f1 <- "TAIR10_chr_all.fas.gz"       #入力ファイル名を指定してin_f1に格納(リファレンス配列)
in_f2 <- "TAIR10_GFF3_genes.gff"       #入力ファイル名を指定してin_f2に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge5.fasta"                 #出力ファイル名を指定してout_fに格納
param_upstream <- 500                  #転写開始点上流の塩基配列数を指定
param_downstream <- 0                  #転写開始点下流の塩基配列数を指定

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

#前処理(ゲノム情報を取得)
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
fasta                                  #確認してるだけです
uge <- strsplit(x = names(fasta), split = " ")#description部分をスペースで分割した結果をugeに格納
names(fasta) <- sapply(uge, `[`, 1)    #ugeの1番目の要素を抽出し、元のdescription部分に代入
fasta                                  #確認してるだけです
writeXStringSet(fasta, file="hogegege.fa", format="fasta", width=50)#fastaの中身を指定したファイル名で保存

#前処理(アノテーション情報を取得)
txdb <- makeTxDbFromGFF(in_f2, format="gff3", circ_seqs=c("ChrC","ChrM"))#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#前処理(欲しい領域の座標情報取得)
hoge <- promoters(txdb, upstream=param_upstream,#指定した範囲の座標情報を取得
           downstream=param_downstream)#指定した範囲の座標情報を取得
hoge                                   #確認してるだけです

#前処理(欲しい領域がゲノム配列の範囲内のもののみ抽出)
start <- hoge@ranges@start             #欲しい領域のstart情報を取得
end <- start + hoge@ranges@width - 1   #欲しい領域のend情報を取得
chrlen <- unlist(mapply(rep, width(fasta), hoge@seqnames@lengths))#元の転写物上の染色体長情報を取得
obj <- (start >= 0) & (end <= chrlen)  #条件判定(染色体領域内ならTRUE、そうでなければFALSE)
hoge <- hoge[obj]                      #objがTRUEとなる要素のみ抽出した結果をhogeに格納
hoge                                   #確認してるだけです

#本番(配列取得)
fasta <- getSeq(FaFile("hogegege.fa"), hoge)#指定した範囲の塩基配列情報を取得
fasta                                  #確認してるだけです
names(fasta) <- names(hoge)            #description情報を追加している

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

6. ヒト("BSgenome.Hsapiens.NCBI.GRCh38")の[上流200塩基, 下流30塩基]のプロモーター配列を取得する場合:

ヒトゲノム ("hg38"; 2013年12月にリリースされたGenome Reference Consortium GRCh38)です。 現状では、RefSeq Genes ("refGene")を指定するとTxDbオブジェクト作成まではできますがgetPromoterSeq関数実行時にエラーが出ます。 また、Ensembl Genes ("ensGene")を指定するとTxDbオブジェクト作成段階でエラーが出ます...orz

out_f <- "hoge6.fasta"                 #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Hsapiens.NCBI.GRCh38"#ゲノムのパッケージ名を指定
param2 <- "hg38"                       #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param3 <- "refGene"                    #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param_upstream <- 200                  #転写開始点上流の塩基配列数を指定
param_downstream <- 30                 #転写開始点下流の塩基配列数を指定

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

#前処理(ゲノム情報を取得)
library(param_bsgenome, character.only=T)#指定したパッケージの読み込み
tmp <- ls(paste("package", param_bsgenome, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納
genome                                 #確認してるだけです

#前処理(アノテーション情報を取得)
txdb <- makeTxDbFromUCSC(genome=param2, tablename=param3)#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#本番(配列取得)
out <- getPromoterSeq(transcriptsBy(txdb, by="gene"),#指定した範囲のプロモーター配列を取得してoutに格納
          genome, upstream=param_upstream, downstream=param_downstream)#指定した範囲のプロモーター配列を取得してoutに格納
out                                    #確認してるだけです

#ファイルに保存
fasta <- unlist(out)                   #XStringSetListオブジェクトからXStringSetオブジェクトに変換した結果をfastaに格納
fasta                                  #確認してるだけです
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

7. 乳酸菌ゲノム(Lactobacillus casei 12A)の[上流500塩基, 下流20塩基]のプロモーター配列を取得する場合:

Ensembl (Zerbino et al., Nucleic Acids Res., 2018)から提供されている Lactobacillus casei 12Aの multi-FASTA形式ゲノム配列ファイル(Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa)と GFF3形式のアノテーションファイル(Lactobacillus_casei_12a.GCA_000309565.2.25.chromosome.Chromosome.gff3) を読み込むやり方です。「前処理(欲しい領域の座標情報取得)」の部分の条件判定は、start部分のみで中途半端ですのでご注意ください(2023.04.21追加)。

in_f1 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f1に格納(リファレンス配列)
in_f2 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_f2に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge7.fasta"                 #出力ファイル名を指定してout_fに格納
param_upstream <- 500                  #転写開始点上流の塩基配列数を指定
param_downstream <- 20                 #転写開始点下流の塩基配列数を指定

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

#前処理(アノテーション情報を取得)
#txdb <- makeTxDbFromGFF(in_f2,#TranscriptDbオブジェクトを取得してtxdbに格納
#          format="gff3", useGenesAsTranscripts=T)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb <- makeTxDbFromGFF(in_f2, format="gff3")#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#前処理(欲しい領域の座標情報取得)
gn <- sort(genes(txdb))                #遺伝子の座標情報を取得
hoge <- promoters(gn, upstream=param_upstream,#指定した範囲の座標情報を取得
           downstream=param_downstream)#指定した範囲の座標情報を取得
hoge                                   #確認してるだけです
obj <- (ranges(hoge)@start >= 0)       #条件を満たすかどうかを判定した結果をobjに格納(座標が0よりも小さいものを排除するのが目的)
hoge <- hoge[obj]                      #objがTRUEとなる要素のみ抽出した結果をhogeに格納
hoge                                   #確認してるだけです

#本番(配列取得)
fasta <- getSeq(FaFile(in_f1), hoge)   #指定した範囲の塩基配列情報を取得
names(fasta) <- names(hoge)            #description情報を追加している
fasta                                  #確認してるだけです

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

8. 乳酸菌ゲノム(Lactobacillus casei 12A)の[上流100塩基, 下流0塩基]のプロモーター配列を取得する場合:

7.と基本的に同じですが、少なくとも2015年4月リリースのBioconductor ver. 3.1以降で、 GenomicFeatures パッケージが提供するpromoters関数がTxDbオブジェクトをそのまま読み込めることが判明したので、それを反映させています。

in_f1 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f1に格納(リファレンス配列)
in_f2 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_f2に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge8.fasta"                 #出力ファイル名を指定してout_fに格納
param_upstream <- 100                  #転写開始点上流の塩基配列数を指定
param_downstream <- 0                  #転写開始点下流の塩基配列数を指定

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

#前処理(アノテーション情報を取得)
#txdb <- makeTranscriptDbFromGFF(in_f2,#TranscriptDbオブジェクトを取得してtxdbに格納
#          format="gff3", useGenesAsTranscripts=T)#TranscriptDbオブジェクトを取得してtxdbに格納
txdb <- makeTxDbFromGFF(in_f2, format="gff3")#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#前処理(欲しい領域の座標情報取得)
#gn <- sort(genes(txdb))               #遺伝子の座標情報を取得
hoge <- promoters(txdb, upstream=param_upstream,#指定した範囲の座標情報を取得
           downstream=param_downstream)#指定した範囲の座標情報を取得
hoge                                   #確認してるだけです
obj <- (ranges(hoge)@start >= 0)       #条件を満たすかどうかを判定した結果をobjに格納(座標が0よりも小さいものを排除するのが目的)
hoge <- hoge[obj]                      #objがTRUEとなる要素のみ抽出した結果をhogeに格納
hoge                                   #確認してるだけです

#本番(配列取得)
fasta <- getSeq(FaFile(in_f1), hoge)   #指定した範囲の塩基配列情報を取得
names(fasta) <- names(hoge)            #description情報を追加している
fasta                                  #確認してるだけです

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

9. 乳酸菌ゲノム(Lactobacillus casei 12A)の[上流100塩基, 下流0塩基]のプロモーター配列を取得する場合:

8.と基本的に同じですが、環状ゲノムの場合はmakeTxDbFromGFF関数実行時にcirc_seqsオプションで該当染色体(or 配列)を指定する必要があります。 ここに記載する文字列は、基本的にゲノムファイルのdescription行部分に記載されているものと同じ(つまり乳酸菌の場合は"Chromosome")である必要があります。 そのため灰色で「前処理(ゲノムファイルのdescription行情報を把握)」

in_f1 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f1に格納(リファレンス配列)
in_f2 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_f2に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge9.fasta"                 #出力ファイル名を指定してout_fに格納
param_upstream <- 100                  #転写開始点上流の塩基配列数を指定
param_downstream <- 0                  #転写開始点下流の塩基配列数を指定

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

#前処理(ゲノムファイルのdescription行情報を把握)
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
fasta                                  #確認してるだけです

#前処理(アノテーション情報を取得)
txdb <- makeTxDbFromGFF(in_f2, format="gff3", circ_seqs="Chromosome")#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#前処理(欲しい領域の座標情報取得)
hoge <- promoters(txdb, upstream=param_upstream,#指定した範囲の座標情報を取得
           downstream=param_downstream)#指定した範囲の座標情報を取得
hoge                                   #確認してるだけです
obj <- (ranges(hoge)@start >= 0)       #条件を満たすかどうかを判定した結果をobjに格納(座標が0よりも小さいものを排除するのが目的)
hoge <- hoge[obj]                      #objがTRUEとなる要素のみ抽出した結果をhogeに格納
hoge                                   #確認してるだけです

#本番(配列取得)
fasta <- getSeq(FaFile(in_f1), hoge)   #指定した範囲の塩基配列情報を取得
names(fasta) <- names(hoge)            #description情報を追加している
fasta                                  #確認してるだけです

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

10. GFF3形式のアノテーションファイルとFASTA形式のゲノム配列ファイルを読み込む場合:

GFF3形式ファイル(Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.chromosome.Chromosome.gff3) とFASTA形式ファイル(Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.dna.chromosome.Chromosome.fa)を読み込むやり方です。 Ensembl (Zerbino et al., Nucleic Acids Res., 2018)から提供されている Lactobacillus hokkaidonensis JCM 18461 (Tanizawa et al., 2015) のデータです。

in_f1 <- "Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f1に格納(リファレンス配列)
in_f2 <- "Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_f2に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge10.fasta"                #出力ファイル名を指定してout_fに格納
param_upstream <- 100                  #転写開始点上流の塩基配列数を指定
param_downstream <- 10                 #転写開始点下流の塩基配列数を指定

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

#入力ファイルの読み込み
txdb <- makeTxDbFromGFF(in_f2, format="auto")#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#前処理(欲しい領域の座標情報取得)
hoge <- promoters(txdb, upstream=param_upstream,#指定した範囲の座標情報を取得
           downstream=param_downstream)#指定した範囲の座標情報を取得
hoge                                   #確認してるだけです

#本番(配列取得)
fasta <- getSeq(FaFile(in_f1), hoge)   #配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです

#後処理(description部分を変更)
names(fasta) <- paste(seqnames(hoge), start(ranges(hoge)),#"染色体名_start_end"に変更
                      end(ranges(hoge)), sep="_")#"染色体名_start_end"に変更
fasta                                  #確認してるだけです

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

11. GFF3形式のアノテーションファイルとFASTA形式のゲノム配列ファイルを読み込む場合:

10.と基本的に同じでparam_upstreamのところを200に変更しているだけですが、エラーが出ることがわかります。 理由は、存在しないゲノム領域からプロモーター配列を取得しようとしたからです。

in_f1 <- "Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f1に格納(リファレンス配列)
in_f2 <- "Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_f2に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge11.fasta"                #出力ファイル名を指定してout_fに格納
param_upstream <- 200                  #転写開始点上流の塩基配列数を指定
param_downstream <- 10                 #転写開始点下流の塩基配列数を指定

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

#入力ファイルの読み込み
txdb <- makeTxDbFromGFF(in_f2, format="auto")#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#前処理(欲しい領域の座標情報取得)
hoge <- promoters(txdb, upstream=param_upstream,#指定した範囲の座標情報を取得
           downstream=param_downstream)#指定した範囲の座標情報を取得
hoge                                   #確認してるだけです

#本番(配列取得)
fasta <- getSeq(FaFile(in_f1), hoge)   #配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです

#後処理(description部分を変更)
names(fasta) <- paste(seqnames(hoge), start(ranges(hoge)),#"染色体名_start_end"に変更
                      end(ranges(hoge)), sep="_")#"染色体名_start_end"に変更
fasta                                  #確認してるだけです

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

12. GFF3形式のアノテーションファイルとFASTA形式のゲノム配列ファイルを読み込む場合:

11.と基本的に同じですが、取得予定領域座標がゲノム配列の範囲外にあるものをフィルタリングする部分を追加しています(甲斐政親氏 提供情報)。 この例題コードだと問題ないのですが、コンティグ(配列)数が複数で「FASTAファイルには存在するがGFFファイル中には存在しない配列があった場合」に不都合が生じるので、2017年6月23日に "hoge@seqnames@values"だったところを"names(fasta)"に変更しました(野間口達洋 氏提供情報)。

in_f1 <- "Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f1に格納(リファレンス配列)
in_f2 <- "Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_f2に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge12.fasta"                #出力ファイル名を指定してout_fに格納
param_upstream <- 200                  #転写開始点上流の塩基配列数を指定
param_downstream <- 10                 #転写開始点下流の塩基配列数を指定

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

#入力ファイルの読み込み
txdb <- makeTxDbFromGFF(in_f2, format="auto", circ_seqs=c("Chromosome"))#txdbオブジェクトの作成
txdb                                   #確認してるだけです
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み

#前処理(欲しい領域の座標情報取得)
hoge <- promoters(txdb, upstream=param_upstream,#指定した範囲の座標情報を取得
           downstream=param_downstream)#指定した範囲の座標情報を取得
hoge                                   #確認してるだけです

#前処理(取得予定領域座標がゲノム配列の範囲外にあるものをフィルタリング)
hoge3 <- param_upstream + param_downstream#欲しいプロモーター配列長情報をhoge3に格納
obj <- sapply(hoge,                    #領域座標情報hogeに対して下記関数を実行した結果をobjに格納
  function(hoge2) {                    #関数を定義
    start <- hoge2@ranges[[1]][1]      #start位置情報を取得
    end <- hoge2@ranges[[1]][hoge3]    #end位置情報を取得
    chr_num <- grep(paste(hoge2@seqnames@values, "$", sep=""), names(fasta))#調査中の領域が属する染色体の要素番号情報を取得(2017.06.23変更)
    chr_length <- seqlengths(FaFile(in_f1))[chr_num]#該当染色体の配列長情報を取得
    if ((start >= 0) & (end <= chr_length)){#該当染色体の範囲内にある場合は
        return(TRUE)                   #TRUE
    } else {                           #そうでなければ
        return(FALSE)                  #FALSE
    }
  })
hoge <- hoge[obj]                      #objがTRUEとなる要素のみ抽出した結果をhogeに格納
hoge                                   #確認してるだけです

#本番(配列取得)
fasta <- getSeq(FaFile(in_f1), hoge)   #配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです

#後処理(description部分を変更)
names(fasta) <- paste(seqnames(hoge), start(ranges(hoge)),#"染色体名_start_end"に変更
                      end(ranges(hoge)), sep="_")#"染色体名_start_end"に変更
fasta                                  #確認してるだけです

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

イントロ | 一般 | 配列取得 | トランスクリプトーム配列 | 公共DBから

基本はNCBI Reference Sequence (RefSeq; Pruitt et al., Nucleic Acids Res., 2014)だと思います。結構頻繁にアップデートされているようです。 RefSeqの"NM_"や"AC_"などの説明についてはこちらをご覧ください。 基本的には、Refseq下記リンク先の、mRNA_Protディレクトリ中の.rna.fna.gzというファイル群でいいと思います。 対応するアミノ酸配列セットを得たい場合には.protein.faa.gzというファイル群になります。

イントロ | 一般 | 配列取得 | トランスクリプトーム配列 | GenomicFeatures(Lawrence_2013)

GenomicFeaturesパッケージを主に用いてトランスクリプトーム配列を得るやり方を示します。 「?extractTranscriptSeqs」を行うことで、様々な例題を見ることができます。transcriptsBy関数部分は、exonsBy, cdsBy, intronsByTranscript, fiveUTRsByTranscript, threeUTRsByTranscript など様々な他の関数で置き換えることができます。

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

1. ヒト(BSgenome.Hsapiens.UCSC.hg19)から取得する場合:

対応するアノテーションパッケージ(TxDb.Hsapiens.UCSC.hg19.knownGene)を利用しています。基本形です。 2015年3月2日の実行結果は82,960 transcriptsでした。

out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Hsapiens.UCSC.hg19"#ゲノムのパッケージ名を指定
param_txdb <- "TxDb.Hsapiens.UCSC.hg19.knownGene"#パッケージ名を指定(TxDB系のアノテーションパッケージ)

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

#前処理(ゲノム情報を取得)
library(param_bsgenome, character.only=T)#指定したパッケージの読み込み
tmp <- ls(paste("package", param_bsgenome, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納
genome                                 #確認してるだけです

#前処理(アノテーション情報を取得)
library(param_txdb, character.only=T)  #指定したパッケージの読み込み
tmp <- ls(paste("package", param_txdb, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納
txdb                                   #確認してるだけです

#本番(配列取得)
fasta <- extractTranscriptSeqs(genome, txdb)#転写物塩基配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです

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

2. ヒト(BSgenome.Hsapiens.UCSC.hg19)から取得する場合:

extractTranscriptSeqsに与えている情報の形式がtxdbからhogeオブジェクトに変わっているだけです。 2015年3月2日現在、transcriptsBy関数実行段階で「いくつかの転写物が複数の染色体上にまたがるexonを持つ。 現状ではこのようなものに対応していない。」的なエラーメッセージが出ます。

out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Hsapiens.UCSC.hg19"#ゲノムのパッケージ名を指定
param_txdb <- "TxDb.Hsapiens.UCSC.hg19.knownGene"#パッケージ名を指定(TxDB系のアノテーションパッケージ)

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

#前処理(ゲノム情報を取得)
library(param_bsgenome, character.only=T)#指定したパッケージの読み込み
tmp <- ls(paste("package", param_bsgenome, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納
genome                                 #確認してるだけです

#前処理(アノテーション情報を取得)
library(param_txdb, character.only=T)  #指定したパッケージの読み込み
tmp <- ls(paste("package", param_txdb, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納
txdb                                   #確認してるだけです

#本番(配列取得)
hoge <- transcriptsBy(txdb, by="gene") #geneでグループ化された転写物情報をhogeに格納
fasta <- extractTranscriptSeqs(genome, hoge)#転写物塩基配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです

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

3. ヒト(BSgenome.Hsapiens.UCSC.hg19)から取得する場合:

2.とほぼ同じですが、transcriptsBy関数実行時のオプションとしてexonを与えています。 非常に計算が大変らしく、メモリ8GBのノートPCではメモリが足りないと文句を言われて実行できません(爆)。

out_f <- "hoge3.fasta"                 #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Hsapiens.UCSC.hg19"#ゲノムのパッケージ名を指定
param_txdb <- "TxDb.Hsapiens.UCSC.hg19.knownGene"#パッケージ名を指定(TxDB系のアノテーションパッケージ)

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

#前処理(ゲノム情報を取得)
library(param_bsgenome, character.only=T)#指定したパッケージの読み込み
tmp <- ls(paste("package", param_bsgenome, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納
genome                                 #確認してるだけです

#前処理(アノテーション情報を取得)
library(param_txdb, character.only=T)  #指定したパッケージの読み込み
tmp <- ls(paste("package", param_txdb, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納
txdb                                   #確認してるだけです

#本番(配列取得)
hoge <- transcriptsBy(txdb, by="exon") #exonでグループ化された転写物情報をhogeに格納
fasta <- extractTranscriptSeqs(genome, hoge)#転写物塩基配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです

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

4. ヒト(BSgenome.Hsapiens.UCSC.hg19)から取得する場合:

cdsBy関数をby="gene"オプションで実行するやり方ですが、2.の結果と同じくエラーが出ます。

out_f <- "hoge4.fasta"                 #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Hsapiens.UCSC.hg19"#ゲノムのパッケージ名を指定
param_txdb <- "TxDb.Hsapiens.UCSC.hg19.knownGene"#パッケージ名を指定(TxDB系のアノテーションパッケージ)

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

#前処理(ゲノム情報を取得)
library(param_bsgenome, character.only=T)#指定したパッケージの読み込み
tmp <- ls(paste("package", param_bsgenome, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納
genome                                 #確認してるだけです

#前処理(アノテーション情報を取得)
library(param_txdb, character.only=T)  #指定したパッケージの読み込み
tmp <- ls(paste("package", param_txdb, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納
txdb                                   #確認してるだけです

#本番(配列取得)
hoge <- cdsBy(txdb, by="gene")         #geneでグループ化されたCDS情報をhogeに格納
fasta <- extractTranscriptSeqs(genome, hoge)#転写物塩基配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです

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

5. GFF3形式のアノテーションファイルとFASTA形式のゲノム配列ファイルを読み込む場合:

GFF3形式ファイル(Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.chromosome.Chromosome.gff3) とFASTA形式ファイル(Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.dna.chromosome.Chromosome.fa)を読み込むやり方です。 Ensembl (Zerbino et al., Nucleic Acids Res., 2018)から提供されている Lactobacillus hokkaidonensis JCM 18461 (Tanizawa et al., 2015) のデータです。

in_f1 <- "Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f1に格納(リファレンス配列)
in_f2 <- "Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_f2に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge5.fasta"                 #出力ファイル名を指定してout_fに格納

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

#入力ファイルの読み込み
txdb <- makeTxDbFromGFF(in_f2, format="auto")#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#前処理(欲しい領域の座標情報取得)
hoge <- transcripts(txdb)              #指定した範囲の座標情報を取得
hoge                                   #確認してるだけです

#本番(配列取得)
fasta <- getSeq(FaFile(in_f1), hoge)   #配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです

#後処理(description部分を変更)
names(fasta) <- paste(seqnames(hoge), start(ranges(hoge)),#"染色体名_start_end"に変更
                      end(ranges(hoge)), sep="_")#"染色体名_start_end"に変更
fasta                                  #確認してるだけです

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

6. GFF3形式のアノテーションファイルとFASTA形式のゲノム配列ファイルを読み込む場合:

GFF3形式ファイル(Lactobacillus_casei_12a.GCA_000309565.2.25.chromosome.Chromosome.gff3) とFASTA形式ファイル(Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa)を読み込むやり方です。 Ensembl (Zerbino et al., Nucleic Acids Res., 2018)から提供されている Lactobacillus casei 12Aです。

in_f1 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f1に格納(リファレンス配列)
in_f2 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_f2に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge6.fasta"                 #出力ファイル名を指定してout_fに格納

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

#入力ファイルの読み込み
txdb <- makeTxDbFromGFF(in_f2, format="auto")#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#前処理(欲しい領域の座標情報取得)
hoge <- transcripts(txdb)              #指定した範囲の座標情報を取得
hoge                                   #確認してるだけです

#本番(配列取得)
fasta <- getSeq(FaFile(in_f1), hoge)   #配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです

#後処理(description部分を変更)
names(fasta) <- paste(seqnames(hoge), start(ranges(hoge)),#"染色体名_start_end"に変更
                      end(ranges(hoge)), sep="_")#"染色体名_start_end"に変更
fasta                                  #確認してるだけです

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

イントロ | 一般 | 配列取得 | トランスクリプトーム配列 | biomaRt(Durinck_2009)

biomaRtパッケージ (Durinck et al., Nat Protoc., 2009)を用いて様々なIDに対応する転写物(トランスクリプトーム)配列を取得するやり方を示します。

BioMart (Kasprzyk A., Database, 2011)本体のウェブサービスへのアクセスをR経由で行うもの、という理解でいいです。2022.04.26に多少修正しましたが、まだうまく取得できないですのでご注意ください。

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

1. RefSeq mRNAをキーとしてヒトのcDNA配列を取得したい場合:

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

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

#前処理(IDリスト情報を取得)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
hoge <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#指定したIDリスト取得結果をhogeに格納
head(hoge)                             #確認してるだけです
dim(hoge)                              #ID数を表示

#本番(配列取得)
out <- getSequence(id=hoge[,1], type=param_attribute,#指定したパラメータで配列取得した結果をoutに格納
                seqType=param_seqtype, mart=mart)#指定したパラメータで配列取得した結果をoutに格納
dim(out)                               #配列数を表示

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

2. Ensembl Gene IDをキーとしてヒトのcDNA配列を取得したい場合:

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

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

#前処理(IDリスト情報を取得)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
hoge <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#指定したIDリスト取得結果をhogeに格納
head(hoge)                             #確認してるだけです
dim(hoge)                              #ID数を表示

#本番(配列取得)
out <- getSequence(id=hoge[,1], type=param_attribute,#指定したパラメータで配列取得した結果をoutに格納
                seqType=param_seqtype, mart=mart)#指定したパラメータで配列取得した結果をoutに格納
dim(out)                               #配列数を表示

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

3. Ensembl Gene IDをキーとしてヒトのgene_exon_intron配列を取得したい場合:

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

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

#前処理(IDリスト情報を取得)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
hoge <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#指定したIDリスト取得結果をhogeに格納
head(hoge)                             #確認してるだけです
dim(hoge)                              #ID数を表示

#本番(配列取得)
out <- getSequence(id=hoge[,1], type=param_attribute,#指定したパラメータで配列取得した結果をoutに格納
                seqType=param_seqtype, mart=mart)#指定したパラメータで配列取得した結果をoutに格納
dim(out)                               #配列数を表示

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

4. RefSeq mRNAをキーとしてラットのcDNA配列を取得したい場合:

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

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

#前処理(IDリスト情報を取得)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
hoge <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#指定したIDリスト取得結果をhogeに格納
head(hoge)                             #確認してるだけです
dim(hoge)                              #ID数を表示

#本番(配列取得)
out <- getSequence(id=hoge[,1], type=param_attribute,#指定したパラメータで配列取得した結果をoutに格納
                seqType=param_seqtype, mart=mart)#指定したパラメータで配列取得した結果をoutに格納
dim(out)                               #配列数を表示

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

5. EMBL (Genbank) IDをキーとしてモルモット(C. porcellus)の5' UTR配列を取得したい場合:

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

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

#前処理(IDリスト情報を取得)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
hoge <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#指定したIDリスト取得結果をhogeに格納
head(hoge)                             #確認してるだけです
dim(hoge)                              #ID数を表示

#本番(配列取得)
out <- getSequence(id=hoge[,1], type=param_attribute,#指定したパラメータで配列取得した結果をoutに格納
                seqType=param_seqtype, mart=mart)#指定したパラメータで配列取得した結果をoutに格納
dim(out)                               #配列数を表示

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

イントロ | 一般 | 配列取得 | CDS | GenomicFeatures(Lawrence_2013)

GenomicFeaturesパッケージを主に用いてCDS(タンパク質コード領域の配列)を得るやり方を示します。

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

1. GFF3形式のアノテーションファイルとFASTA形式のゲノム配列ファイルを読み込む場合:

GFF3形式ファイル(Lactobacillus_casei_12a.GCA_000309565.2.25.chromosome.Chromosome.gff3) とFASTA形式ファイル(Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa)を読み込むやり方です。 Ensembl (Zerbino et al., Nucleic Acids Res., 2018)から提供されている Lactobacillus casei 12Aです。2,681個の配列が取得できます。

in_f1 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f1に格納(リファレンス配列)
in_f2 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_f2に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納

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

#入力ファイルの読み込み
txdb <- makeTxDbFromGFF(in_f2, format="auto")#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#前処理(欲しい領域の座標情報取得)
hoge <- cds(txdb)                      #指定した範囲の座標情報を取得
hoge                                   #確認してるだけです

#本番(配列取得)
fasta <- getSeq(FaFile(in_f1), hoge)   #配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです

#後処理(description部分を変更)
names(fasta) <- paste(seqnames(hoge), start(ranges(hoge)),#"配列名_start_end"に変更
                      end(ranges(hoge)), sep="_")#"配列名_start_end"に変更
fasta                                  #確認してるだけです

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

2. GFF3形式のアノテーションファイルとFASTA形式のゲノム配列ファイルを読み込む場合:

2019年5月13日の講義で利用した、GFF3形式ファイル(annotation.gff) とFASTA形式ファイル(genome.fna)を読み込むやり方です。 エラーは出ていないものの、GFFファイルをうまく読み込めていないようです。 つまり、txdbのところです。gffをgff3に変えるとか、fnaをfaにするとかそういう問題ではなさそうです。 正解は、(description行部分が異なりますが)cds.fnaです。

in_f1 <- "genome.fna"                  #入力ファイル名を指定してin_f1に格納(リファレンス配列)
in_f2 <- "annotation.gff"              #入力ファイル名を指定してin_f2に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納

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

#入力ファイルの読み込み
txdb <- makeTxDbFromGFF(in_f2, format="auto")#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#前処理(欲しい領域の座標情報取得)
hoge <- cds(txdb)                      #指定した範囲の座標情報を取得
hoge                                   #確認してるだけです

#本番(配列取得)
fasta <- getSeq(FaFile(in_f1), hoge)   #配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです

#後処理(description部分を変更)
names(fasta) <- paste(seqnames(hoge), start(ranges(hoge)),#"配列名_start_end"に変更
                      end(ranges(hoge)), sep="_")#"配列名_start_end"に変更
fasta                                  #確認してるだけです

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

イントロ | 一般 | 読み込み | xlsx形式 | openxlsx

openxlsxパッケージを用いて、Microsoft EXCEL (マイクロソフトエクセル)の .xlsxという拡張子のついたファイルを読み込むやり方を示します。

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

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.xlsx)の場合:

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.xlsx"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

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

#入力ファイルの読み込み
data <- read.xlsx(in_f, colNames=T, rowNames=T)#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです
dim(data)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3_plus.xlsx)の場合:

1.と基本的に同じですが、余分な情報を最初の2行分に含みます。このため、最初の3行目から読み込むやり方です。

in_f <- "data_hypodata_3vs3_plus.xlsx" #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_skip <- 3                        #読み込み始める行番号を指定

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

#入力ファイルの読み込み
data <- read.xlsx(in_f, startRow=param_skip, colNames=T, rowNames=T)#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです
dim(data)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. Rajkumar et al., 2015の26,119 genes×16 samplesのカウントデータ(s12864-015-1767-y-s1.xlsx)の場合:

Additional file 1として提供されているxlsxファイルです。 2群間比較用(8 samples vs. 8 samples)データです。余分な情報を最初の1行分に含みます。 このため、最初の2行目から読み込むやり方です。

#in_f <- "http://www.biomedcentral.com/content/supplementary/s12864-015-1767-y-s1.xlsx" #入力ファイル名を指定してin_fに格納
in_f <- "s12864-015-1767-y-s1.xlsx"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_skip <- 2                        #読み込み始める行番号を指定

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

#入力ファイルの読み込み
data <- read.xlsx(in_f, startRow=param_skip, colNames=T, rowNames=T)#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです
dim(data)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

イントロ | 一般 | ExpressionSet | 1から作成 | Biobase

Biobaseパッケージ中のExpressionSet関数を用いて、 読み込んだ発現行列データをExpressionSet形式にするやり方を示します。

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

1. Blekhman et al., Genome Res., 2010の58,037 genes×6 samplesのカウントデータ(srp001558_count_hoge6.txt)の場合:

「カウント情報取得 | リアルデータ | SRP001558 | recount(Collado-Torres_2017)」 の例題6実行結果ファイルと同じものです。 3 female samples (HSF1-3) vs. 3 male samples (HSM1-3)の2群間比較用データです。

in_f <- "srp001558_count_hoge6.txt"    #入力ファイル名を指定してin_fに格納

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

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

#本番(ExpressionSetオブジェクトの作成)
eset <- ExpressionSet(assayData=as.matrix(data))#ExpressionSetオブジェクトの作成
eset                                   #確認してるだけです
	

2. Blekhman et al., Genome Res., 2010の58,037 genes×6 samplesのカウントデータ(srp001558_count_hoge6.txt)の場合:

例題1と基本的に同じですが、phenoData情報のところを追加しています。

in_f <- "srp001558_count_hoge6.txt"    #入力ファイル名を指定してin_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

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

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#前処理(Phenotypic dataの作成)
labelinfo <- data.frame(gender=as.factor(data.cl))#gender列にクラスラベル情報を格納したlabelinfoオブジェクトを作成
rownames(labelinfo) <- colnames(data)  #labelinfoの行名情報としてcolnames(data)を与える
metadata <- data.frame(labelDescription="nandemoiiyo",#この後使うvarMetadata情報を作成している
                       row.names="gender")#この後使うvarMetadata情報を作成している
phenoData <- new("AnnotatedDataFrame", #AnnotatedDataFrameオブジェクトを作成
                  data=labelinfo,      #AnnotatedDataFrameオブジェクトを作成
                  varMetadata=metadata)#AnnotatedDataFrameオブジェクトを作成
phenoData                              #確認してるだけです
pData(phenoData)                       #確認してるだけです

#本番(ExpressionSetオブジェクトの作成)
eset <- ExpressionSet(assayData=as.matrix(data),#ExpressionSetオブジェクトの作成
                      phenoData=phenoData)#ExpressionSetオブジェクトの作成
eset                                   #確認してるだけです
	

イントロ | 一般 | ExpressionSet | 1から作成 | NOISeq(Tarazona_2015)

NOISeqパッケージ中のreadData関数を用いて、 読み込んだ発現行列データをExpressionSet形式にするやり方を示します。

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

1. Blekhman et al., Genome Res., 2010の58,037 genes×6 samplesのカウントデータ(srp001558_count_hoge6.txt)の場合:

「カウント情報取得 | リアルデータ | SRP001558 | recount(Collado-Torres_2017)」 の例題6実行結果ファイルと同じものです。 3 female samples (HSF1-3) vs. 3 male samples (HSM1-3)の2群間比較用データです。 「イントロ | 一般 | ExpressionSet | 1から作成 | Biobase」の例題2と同様の結果が得られていることが分かります。

in_f <- "srp001558_count_hoge6.txt"    #入力ファイル名を指定してin_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

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

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

#前処理(ExpressionSetオブジェクトの作成; )
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
myfactors <- data.frame(comp=data.cl)  #サンプルラベル情報をデータフレーム形式に変換
eset <- readData(data=data, factors=myfactors)#ExpressionSetオブジェクトを作成
eset                                   #確認してるだけです
	

イントロ | NGS | 様々なプラットフォーム

NGS機器(プラットフォーム)もいくつかあります:

イントロ | NGS | qPCRやmicroarrayなどとの比較

一言でいえば、3者の再現性は高いようですが、全般的にはRNA-seqのほうがダイナミックレンジが広く特に低発現領域で優れているようです。

NGS(RNA-seq) vs. RT-PCR:

NGS(RNA-seq) vs. マイクロアレイ:

マイクロアレイ vs. RT-PCR:

三者比較:

イントロ | NGS | 可視化(ゲノムブラウザやViewer)

可視化ツールも結構あります。

R用:

R以外(ウェブベースのゲノムブラウザ; server-side):

Review(Wang et al., Brief Bioinform., 2013)によるserver-sideと client-sideの分類分けのうち、server-sideに相当するものたちだと思われます。

R以外(ゲノムブラウザ; client-side):

Review(Wang et al., Brief Bioinform., 2013)によるserver-sideと client-sideの分類分けのうち、client-sideに相当するものたちだと思われます。AJAX-based browsersともいうらしいです。

R以外(stand-alone系):

Review、ガイドライン、パイプライン系:

イントロ | NGS | 配列取得 | FASTQ or SRA | 公共DBから

次世代シーケンサ(NGS)から得られる塩基配列データを公共データベースから取得する際には以下を利用します。 マイクロアレイデータ取得のときと同様、NGSデータもArrayExpress経由でダウンロードするのがいいかもしれません。 メタデータの全貌を把握しやすいこと、生データ(raw data)だけでなく加工済みのデータ(processed data)がある場合にはその存在がすぐにわかることなど、 操作性の点で他を凌駕していると思います。上記でも触れているようにFASTQファイルのダウンロードからマッピングまでを行うのはエンドユーザレベルでは大変ですが、 submitterが提供してくれている場合は(まだまだ少ないようですが)リファレンス配列へのマップ後のデータ、つまりBAM形式ファイルの提供もすでに始まっているようです。 2014年6月26日に知りました(DDBJ児玉さんありがとうございますm(_ _)m)。

データの形式は基本的にSanger typeのFASTQ形式です。 FASTA形式はリードあたり二行(idの行と配列の行)で表現します。 FASTQ形式はリードあたり4行(@から始まるidの行と配列の行、および+から始まるidの行とbase callの際のqualityの行)で表現します。 FASTQ形式は、Sangerのものがデファクトスタンダード(業界標準)です。 かつてIlluminaのプラットフォームから得られるのはFASTQ-like formatという表現がなされていたようです(Cock et al., Nucleic Acids Res., 2010)。 しかし少なくとも2013年頃には、IlluminaデータもBaseSpaceやCASAVA1.8のconfigureBclToFastq.plなどを用いることで業界標準のFASTQ形式(つまりSanger typeのデータ)に切り替えられるようですし、 NCBI SRAなどの公共DBから取得するデータは全てはSanger typeのデータになっていたと思います(Kibukawa E., テクニカルサポートウェビナー, 2013)。

イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)

SRAdbパッケージを用いてRNA-seq配列を取得するやり方を示します。 SRA形式ファイルの場合はNCBIからダウンロードしているようですが、FASTQ形式ファイルの場合はEBIからダウンロードしているようです(2014年6月23日、孫建強氏提供情報)。 ここではFASTQファイルをダウンロードするやり方を示します。2015年2月23日までオブジェクトkの中身の一部を取り出して表示させていましたが、 列名などが変わって取り出せなくなっていたのでこの際削除しました。またSRAmetadb.sqliteファイルは現在10GB超になっているようです。(2015年2月24日)。 getFASTQinfoとgetFASTQfile関数の部分にsra_con=sra_conを追加してエラーが出ないようにしました(2019年2月01日)。

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

1. RNA-seqデータ("SRA000299":Marioni et al., Genome Res., 2008)の実験デザインの全体像やファイルサイズを眺める場合:

論文中の記述から腎臓(kidney: SRS000561)と肝臓(liver: SRS000562)サンプルの二群間比較であることがわかったうえで下記情報を眺めるとより理解が深まります。 この2のサンプルはさらに濃度別に2つに分類されています:腎臓3.0pM (SRX000605), 肝臓3.0pM (SRX000571), 腎臓1.5pM (SRX000606), 肝臓1.5pM (SRX000604)。

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

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

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(700Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#本番(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。
getFASTQinfo(in_acc=hoge$run, sra_con=sra_con)#hoge$runで指定したSRRから始まるIDのFASTQファイルサイズ情報などを表示
	

2. ヒトRNA-seqデータ("SRA000299":Marioni et al., Genome Res., 2008)のgzip圧縮済みのFASTQファイルをダウンロードする場合:

計6ファイル、合計7.3Gb程度の容量のファイルがダウンロードされます。東大の有線LANで一時間弱程度かかります。 早く終わらせたい場合は、最後のgetFASTQfile関数のオプションを'ftp'から'fasp'に変更すると時間短縮可能です。

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

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

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(700Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#前処理(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。
getFASTQinfo(in_acc=hoge$run, sra_con=sra_con)#hoge$runで指定したSRRから始まるIDのFASTQファイルサイズ情報などを表示

#本番(FASTQファイルのダウンロード)
#getSRAfile(hoge$run, srcType='ftp', fileType='fastq')#こういう記述の仕方でもいいみたいです。
getFASTQfile(hoge$run, sra_con=sra_con, srcType='ftp')#hoge$runで指定したSRRから始まるIDのFASTQファイルのダウンロード
	

3. RNA-seqデータ("SRP017142":Neyret-Kahn et al., Genome Res., 2013)のgzip圧縮済みのFASTQファイルをダウンロードする場合:

論文中の記述からGSE42213を頼りに、 RNA-seqデータがGSE42212として収められていることを見出し、 その情報からSRP017142にたどり着いています。 計6ファイル、合計6Gb程度の容量のファイルがダウンロードされます。東大の有線LANで一時間弱程度かかります。 早く終わらせたい場合は、最後のgetFASTQfile関数のオプションを'ftp'から'fasp'に変更すると時間短縮可能です。

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

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

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(圧縮状態で700Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#前処理(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。
getFASTQinfo(in_acc=hoge$run, sra_con=sra_con)#hoge$runで指定したSRRから始まるIDのFASTQファイルサイズ情報などを表示

#本番(FASTQファイルのダウンロード)
getFASTQfile(hoge$run, sra_con=sra_con, srcType='ftp')#hoge$runで指定したSRRから始まるIDのFASTQファイルのダウンロード
	

4. シロイヌナズナのRNA-seqデータ("SRP011435":Huang et al., Development, 2012)のgzip圧縮済みのFASTQファイルをダウンロードする場合:

論文中の記述からGSE36469を頼りに、 RNA-seqデータがGSE36469として収められていることを見出し、 その情報からSRP011435にたどり着いています。 計8ファイル、合計10Gb程度の容量のファイルがダウンロードされます。東大の有線LANで2時間程度かかります。

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

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

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(圧縮状態で700Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#前処理(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。
getFASTQinfo(in_acc=hoge$run, sra_con=sra_con)#hoge$runで指定したSRRから始まるIDのFASTQファイルサイズ情報などを表示

#本番(FASTQファイルのダウンロード)
getFASTQfile(hoge$run, sra_con=sra_con, srcType='ftp')#hoge$runで指定したSRRから始まるIDのFASTQファイルのダウンロード
	

5. ニワトリのRNA-seqデータ("SRP038897":Sharon et al., PLoS One, 2014)のgzip圧縮済みのFASTQファイルをダウンロードする場合:

PacBioのデータです。計xファイル、合計x Gb程度の容量のファイルがダウンロードされます。東大の有線LANでx時間程度かかります。

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

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

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(圧縮状態で700Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#前処理(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。
getFASTQinfo(in_acc=hoge$run, sra_con=sra_con)#hoge$runで指定したSRRから始まるIDのFASTQファイルサイズ情報などを表示

#本番(FASTQファイルのダウンロード)
getFASTQfile(hoge$run, sra_con=sra_con, srcType='ftp')#hoge$runで指定したSRRから始まるIDのFASTQファイルのダウンロード
	

6. ヒトのRNA-seqデータ("SRP017580":Chan et al., Hum. Mol. Genet., 2013)のgzip圧縮済みのFASTQファイルをダウンロードする場合:

Illumina HiSeq 2000のpaired-endデータです。計6ファイル、合計8 Gb程度の容量のファイルがダウンロードされます。東大の有線LANで2時間程度かかります。

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

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

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(圧縮状態で700Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#前処理(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。
getFASTQinfo(in_acc=hoge$run, sra_con=sra_con)#hoge$runで指定したSRRから始まるIDのFASTQファイルサイズ情報などを表示

#本番(FASTQファイルのダウンロード)
getFASTQfile(hoge$run, sra_con=sra_con, srcType='ftp')#hoge$runで指定したSRRから始まるIDのFASTQファイルのダウンロード
	

7. カイコのsmall RNA-seqデータ("SRP016842":Nie et al., BMC Genomics, 2013)のgzip圧縮済みのFASTQファイルをダウンロードする場合:

論文中の記述からGSE41841を頼りに、 SRP016842にたどり着いています。 したがって、ここで指定するのは"SRP016842"となります。 以下を実行して得られるsmall RNA-seqファイルは1つ(SRR609266.fastq.gz)で、ファイルサイズは400Mb弱、11928428リードであることがわかります。

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

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

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(圧縮状態で700Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#前処理(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。
getFASTQinfo(in_acc=hoge$run, sra_con=sra_con)#hoge$runで指定したSRRから始まるIDのFASTQファイルサイズ情報などを表示

#本番(FASTQファイルのダウンロード)
getFASTQfile(hoge$run, sra_con=sra_con, srcType='ftp')#hoge$runで指定したSRRから始まるIDのFASTQファイルのダウンロード
	

イントロ | NGS | 配列取得 | シミュレーションデータ | について

NGSのシミュレーションリードデータを作成するプログラムもいくつかあるようです。ここで生成するのは塩基配列データです。 Shcherbina A., BMC Res Notes, 2014のTable 1にin silico read simulatorのまとめがあります。

R用:

R以外:

イントロ | NGS | 配列取得 | シミュレーションデータ | ランダムな塩基配列の生成から

イントロ | 一般 | ランダムな塩基配列を生成と同じ手順でリファレンスとなる塩基配列を生成してから、 指定した配列長からなる部分配列を指定したリード数だけランダム抽出してシミュレーションNGSデータを生成するやり方を示します。

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

1. 50塩基の長さのリファレンス配列を生成したのち、20塩基長の部分配列を10リード分だけランダム抽出してFASTA形式で保存したい場合:

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

out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param_len_ref <- 50                    #リファレンス配列の長さを指定
narabi <- c("A","C","G","T")           #以下の数値指定時にACGTの並びを間違えないようにするために表示(内部的にも使用してます)
param_composition <- c(22, 28, 28, 22) #(A,C,G,Tの並びで)各塩基の存在比率を指定
param_len_ngs <- 20                    #リード長を指定
param_num_ngs <- 10                    #リード数を指定
param_desc <- "kkk"                    #FASTA形式ファイルのdescription行に記述する内容

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

#本番(リファレンス配列生成)
set.seed(1010)                         #おまじない(同じ乱数になるようにするため)
ACGTset <- rep(narabi, param_composition)#narabi中の塩基がparam_compositionで指定した数だけ存在する文字列ベクトルACGTsetを作成
reference <- paste(sample(ACGTset, param_len_ref, replace=T), collapse="")#ACGTsetからparam_len_ref回分だけ復元抽出して得られた塩基配列をreferenceに格納
reference <- DNAStringSet(reference)   #DNA塩基配列だと認識させるDNAStringSet関数を適用した結果をreferenceに格納
names(reference) <- param_desc         #description行に相当する記述を追加している
reference                              #確認してるだけです

#本番(シミュレーションデータ生成)
s_posi <- sample(1:(param_len_ref-param_len_ngs), param_num_ngs, replace=T)#部分塩基配列抽出時のstart position情報として用いる乱数ベクトルをs_posiに格納
s_posi                                 #確認してるだけです
hoge <- NULL                           #最終的に得る結果を格納するためのプレースホルダhogeを作成しているだけ
for(i in 1:length(s_posi)){            #length(s_posi)回だけループを回す
    hoge <- append(hoge, subseq(reference, start=s_posi[i], width=param_len_ngs))#subseq関数を用いてs_posi[i]からparam_len_ngsで与えた配列長に対応する部分配列をhogeに格納
}
fasta <- hoge                          #hogeの中身をfastaに格納

#後処理(description部分の作成)
description <- paste(param_desc, s_posi, (s_posi+param_len_ngs), sep="_")#param_descやs_posiなどを"_"で結合したものをdescriptionに格納
names(fasta) <- description            #description行に相当する記述を追加している
fasta                                  #確認してるだけです

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

イントロ | NGS | アノテーション情報取得 | について

アノテーション情報の取り扱いやGFF形式のアノテーションファイルの読み込みなどは下記パッケージで利用可能です。例えば、 genomeIntervals中のreadGff3関数や、 GenomicFeatures中のmakeTxDbFromGFF関数などです。 実用上は、例えばbiomaRtはEnsembl gene IDのgene symbolを取得できるので、 Ensembl gene IDsをgene symbolsに変換するための基礎情報取得目的でも使えます。

イントロ | NGS | アノテーション情報取得 | GFF/GTF形式ファイル

多くの生物種についてEnsembl (Zerbino et al., Nucleic Acids Res., 2018) のFTPサイトから GTF形式(GFF ver. 2) の遺伝子アノテーションファイルを得ることができます。 2017年4月10日現在、上記のFTPサイトへのアクセス時にユーザ名とパスワードを聞かれますが、 「匿名でログオンする」にチェックを入れればOKです。 GTFはGeneral Transfer FormatまたはGene Transfer Formatの略で、GTFの派生版としてGTF2というフォーマットもあるようです。 また、General Feature Format ver. 3 (GFF3)という形式も存在するなど、 GFF/GTF形式として総称されている中で様々なバリエーションがあります。いずれもrefFlat形式同様、どの領域にどの遺伝子があるのかという座標(Coordinates)情報を含みます。 ゲノム配列のバージョンと同じであることを確認した上で用いましょう。

イントロ | NGS | アノテーション情報取得 | refFlat形式ファイル

数多くの生物種についてはUCSCのSequence and Annotation Downloadsから辿っていけばrefFlat形式の遺伝子アノテーションファイルを得ることができます。 このrefFlat形式のアノテーションファイルは、どの領域にどの遺伝子があるのかという座標(Coordinates)情報を含みます。 マイクロアレイ解析に慣れた人への説明としては、NGS(RNA-seqリード)のゲノムマッピング結果から遺伝子発現行列をお手軽に得るために必要なおまじないのファイル、のようなものだと解釈していただければいいと思います。 例として、ヒトとラットのrefFlatファイルを取得する手順を示します。

Humanの場合:

  1. UCSCのSequence and Annotation Downloadsの"Human"をクリック
  2. Annotation databaseをクリック
  3. (アルファベット順に並んでいるので)refFlat.txt.gzをクリック

得られた圧縮ファイルを解凍するとrefFlat.txtが得られます。

Ratの場合:

  1. UCSCのSequence and Annotation Downloadsの"Rat"をクリック
  2. Annotation databaseをクリック
  3. (アルファベット順に並んでいるので)refFlat.txt.gzをクリック

得られた圧縮ファイルを解凍するとRatのrefFlat.txtが得られます。

UCSC以外にもRefSeq, Ensembl, AceViewなどからも似たような情報を取得可能なようです。

イントロ | NGS | アノテーション情報取得 | biomaRt(Durinck_2009)

biomaRtというRパッケージ(Durinck et al., Nat Protoc., 2009)を用いて、 様々な生物種のアノテーション情報を取得するやり方を示します。一般的にはBioMart (Kasprzyk A., Database, 2011)本体のウェブページ上でやるのでしょうが、私はGUIの変遷についていけませんorz...

ここでは、Ensembl Geneにデータセットを固定した状態で様々な生物種のアノテーション情報を取得するやり方を示します。

尚、Ensembl (Flicek et al., 2013)の遺伝子モデル(gene model)はリファレンスゲノムから直接アノテーションされたものであるのに対して、RefSeqはmRNA配列からアノテーションされたものです。 当然、リファレンスゲノムと個々のmRNA配列は異なりますので、RefSeq mRNA配列の一部はリファレンスゲノム配列にマップされません。

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

1. ラット(Rattus norvegicus; rnorvegicus_gene_ensembl)の場合:

取得する情報を4つ指定しています: (1) "ensembl_gene_id", (2) "ensembl_transcript_id", (3) "affy_rat230_2" (Affymetrix Rat Genome 230 2.0 Array; GPL1355のプローブセットID), (4) "go_id"。

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "rnorvegicus_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- c(                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "ensembl_gene_id",      #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "ensembl_transcript_id",#取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "affy_rat230_2",        #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "go_id"                 #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
                    )                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)

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

#前処理(取得可能なアノテーション情報をリストアップ)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
listAttributes(mart)                   #指定可能な属性名(Attributes)をリストアップ

#本番(アノテーション情報取得)
out <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#アノテーション情報取得結果をhogeに格納
head(out)                              #確認してるだけです
dim(out)                               #行数と列数を表示

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

2. ヒト(Homo Sapiens; hsapiens_gene_ensembl)の場合:

取得する情報を3つ指定しています: (1) "ensembl_transcript_id", (2) "affy_hg_u133_plus_2" (Affymetrix Human Genome U133 Plus 2.0 Array; GPL570のプローブセットID), (3) "refseq_mrna"。

27万行程度のファイルが得られます。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "hsapiens_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- c(                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "ensembl_transcript_id",#取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "affy_hg_u133_plus_2",  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "refseq_mrna"           #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
                    )                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)

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

#前処理(取得可能なアノテーション情報をリストアップ)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
listAttributes(mart)                   #指定可能な属性名(Attributes)をリストアップ

#本番(アノテーション情報取得)
out <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#アノテーション情報取得結果をhogeに格納
head(out)                              #確認してるだけです
dim(out)                               #行数と列数を表示

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

3. ヒト(Homo Sapiens; hsapiens_gene_ensembl)の場合:

取得する情報を3つ指定しています: (1) "refseq_mrna", (2) "hgnc_symbol", (3) "go_id"。

56万行程度のファイルが得られます。

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "hsapiens_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- c(                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "refseq_mrna",          #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "hgnc_symbol",          #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "go_id"                 #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
                    )                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)

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

#前処理(取得可能なアノテーション情報をリストアップ)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
listAttributes(mart)                   #指定可能な属性名(Attributes)をリストアップ

#本番(アノテーション情報取得)
out <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#アノテーション情報取得結果をhogeに格納
head(out)                              #確認してるだけです
dim(out)                               #行数と列数を表示

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

4. ヒト(Homo Sapiens; hsapiens_gene_ensembl)の場合:

取得する情報を3つ指定しています: (1) "refseq_mrna", (2) "hgnc_symbol", (3) "go_id"。

3.と基本的には同じですが、refseq_mrna IDが存在するもののみフィルタリングした結果を出力しています。 42.6万行程度のファイルが得られます。以下では"with_ox_refseq_mrna"をオプションとして与えていますが、 なぜかlistFilters(mart)でリストアップされているので指定可能なはずの"refseq_mrna"でやるとエラーが出てしまいます。。。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "hsapiens_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- c(                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "refseq_mrna",          #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "hgnc_symbol",          #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "go_id"                 #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
                    )                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
param_filter <- "with_ox_refseq_mrna"  #フィルタリング条件を指定(「listFilters(mart)」にリストアップされているものを指定可能)

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

#前処理(取得可能なアノテーション情報をリストアップ)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
listAttributes(mart)                   #指定可能な属性名(Attributes)をリストアップ

#本番(アノテーション情報取得)
out <- getBM(attributes=param_attribute, filters=param_filter, values=list(TRUE), mart=mart)#アノテーション情報取得結果をhogeに格納
head(out)                              #確認してるだけです
dim(out)                               #行数と列数を表示

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

5. ヒト(Homo Sapiens; hsapiens_gene_ensembl)の場合:

取得する情報を3つ指定しています: (1) "refseq_mrna", (2) "hgnc_symbol", (3) "go_id"。

4.と同じ結果を得るべく、「refseq_mrna IDが存在するもののみフィルタリング」のところをgetBM関数のfiltersオプション使用以外の手段で行っています。

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_dataset <- "hsapiens_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_attribute <- c(                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "refseq_mrna",          #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "hgnc_symbol",          #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
               "go_id"                 #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)
                    )                  #取得したい属性名を指定(「listAttributes(mart)」にリストアップされているものを指定可能)

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

#前処理(取得可能なアノテーション情報をリストアップ)
mart <- useMart("ensembl",dataset=param_dataset)#データベース名("ensembl")とparam_datasetで指定したデータセット名を与えてmartに格納
listAttributes(mart)                   #指定可能な属性名(Attributes)をリストアップ

#本番(アノテーション情報取得)
out <- getBM(attributes=param_attribute, filters="", values="", mart=mart)#アノテーション情報取得結果をhogeに格納
head(out)                              #確認してるだけです
dim(out)                               #行数と列数を表示

#後処理(行列outの1列目の情報が存在するもののみフィルタリング:「out <- subset(out, refseq_mrna != "")」でもよい)
obj <- out[,1] != ""                   #条件を満たすかどうかを判定した結果をobjに格納
out <- out[obj,]                       #objがTRUEとなる行のみ抽出した結果をoutに格納
dim(out)                               #行数と列数を表示

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

イントロ | NGS | アノテーション情報取得 | TxDb | について

アノテーション情報を取り扱うためにRでよく利用されるオブジェクトは、TxDb以外に、RangedData、GRangesListなどなどが挙げられますが、 このウェブページでは、TxDbというオブジェクトをアノテーション情報の基本オブジェクトとし、txdbというオブジェクト名で統一して取り扱っています。 このtxdbに対して、GenomicFeaturesで利用可能な transcripts, exons, cds, genes, promoters, disjointExons, microRNAs, tRNAsなどの関数を適用して、GRanges形式のオブジェクトを得ることができます。 出力情報を制限したい場合には、 transcriptsByOverlaps, exonsByOverlaps, cdsByOverlapsなどの関数が利用可能です。 GRanges形式やGRangesList形式オブジェクトの取り扱いはGenomicRangesに記載されています。

イントロ | NGS | アノテーション情報取得 | TxDb | TxDb.*から

QuasRパッケージを用いてゲノムへのマッピング結果からカウント情報を得たいときに、 "TxDb"という形式のオブジェクトを利用する必要があります。TxDbオブジェクトは、makeTxDbFromGFF関数を用いてGTF形式ファイルを入力として作成することも可能ですが、 最も手っ取り早いやり方はTxDbオブジェクト形式で格納されている"TxDb.*"という名前のパッケージを利用することです。 利用可能なTxDb.*パッケージはここにリストアップされているものたちです。

(1)「全パッケージリスト(All Packages)」中の、
  (2)「AnnotationDataの左側のさんかく」、
  (3)「PackageTypeの左側のさんかく」、
  (4)「TxDb」からも辿れます。

ここでは、いくつかのパッケージの読み込みまでを示します。

1. TxDb.Hsapiens.UCSC.hg19.knownGene(ヒト)の場合:

hg19 (Genome Reference Consortium GRCh37のことらしい)です。

param <- "TxDb.Hsapiens.UCSC.hg19.knownGene"#パッケージ名を指定

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

#前処理
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
txdb                                   #確認してるだけです
	

2. TxDb.Rnorvegicus.UCSC.rn5.refGene(ラット)の場合:

2015年2月現在、Rで取得可能なラットの最新版です。

param <- "TxDb.Rnorvegicus.UCSC.rn5.refGene"#パッケージ名を指定

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

#前処理
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
txdb                                   #確認してるだけです
	

3. TxDb.Hsapiens.UCSC.hg38.knownGene(ヒト)の場合:

hg38 (Genome Reference Consortium GRCh38のことらしい)です。

param <- "TxDb.Hsapiens.UCSC.hg38.knownGene"#パッケージ名を指定

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

#前処理
#tmp <- unlist(strsplit(param, ".", fixed=TRUE))[2]#paramで指定した文字列からオブジェクト名を取得した結果をtmpに格納
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
txdb                                   #確認してるだけです
	

イントロ | NGS | アノテーション情報取得 | TxDb | GenomicFeatures(Lawrence_2013)

QuasRパッケージを用いてゲノムへのマッピング結果からカウント情報を得たいときに、 "TxDb"という形式のオブジェクトを利用する必要があります。ここでは、GenomicFeatures パッケージを用いてTxDbオブジェクトを得るやり方を示します。

得られるTxDbオブジェクトの元データのバージョンは、当然この項目で作成されたもののほうが新しいです。 したがって、慣れてきたら、予め作成された"TxDb.*"パッケージのものを使うよりもここで直接作成してしまうほうがいいでしょう。 しかし、逆に言えば作成するたびに転写物数("transcript_nrow"のところの数値など)が異なってきますので、"RSQLite version at creation time"のところの情報は気にしたほうがいいでしょう。

1. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

どういうものを取得可能かリストアップしているだけです。

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

#前処理(UCSCから取得可能なゲノム情報をリストアップ)
ucscGenomes()                          #ゲノム情報をリストアップ

#前処理(makeTxDbFromUCSC関数で取得可能なtable情報をリストアップ)
supportedUCSCtables()                  #table情報をリストアップ
	

2. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

ヒトゲノム ver. 19 ("hg19"; Genome Reference Consortium GRCh37のことらしい)のUCSC Genes ("knownGene")のTxDbオブジェクトを取得するやり方です。

実質的に、"TxDb.Hsapiens.UCSC.hg19.knownGene"パッケージから取得可能なものと同じ(はず)です。

param1 <- "hg19"                       #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "knownGene"                  #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

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

#前処理
txdb <- makeTxDbFromUCSC(genome=param1, tablename=param2)#txdbオブジェクトの作成
txdb                                   #確認してるだけです
	

3. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

ヒトゲノム ver. 19 ("hg19")のEnsembl Genes ("ensGene")のTxDbオブジェクトを取得するやり方です。

IDはEntrez Gene IDのままで、配列長情報などがEnsembl Genesのものになるだけのようです。

param1 <- "hg19"                       #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

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

#前処理
txdb <- makeTxDbFromUCSC(genome=param1, tablename=param2)#txdbオブジェクトの作成
txdb                                   #確認してるだけです
transcripts(txdb)                      #確認してるだけです
	

4. Ensemblから遺伝子アノテーション情報を取得する場合:

ヒト("hsapiens_gene_ensembl")のTxDbオブジェクトを取得するやり方です。

param <- "hsapiens_gene_ensembl"       #データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)

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

#前処理
txdb <- makeTxDbFromBiomart(dataset=param)#txdbオブジェクトの作成
txdb                                   #確認してるだけです
transcripts(txdb)                      #確認してるだけです
	

5. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

マウスゲノム ("mm10"; Genome Reference Consortium GRCm38)のEnsembl Genes ("ensGene")のTxDbオブジェクトを取得するやり方です。

param1 <- "mm10"                       #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

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

#前処理
txdb <- makeTxDbFromUCSC(genome=param1, tablename=param2)#txdbオブジェクトの作成
txdb                                   #確認してるだけです
transcripts(txdb)                      #確認してるだけです
	

6. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

ラットゲノム ("rn5"; RGSC Rnor_5.0)のEnsembl Genes ("ensGene")のTxDbオブジェクトを取得するやり方です。

param1 <- "rn5"                        #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

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

#前処理
txdb <- makeTxDbFromUCSC(genome=param1, tablename=param2)#txdbオブジェクトの作成
txdb                                   #確認してるだけです
transcripts(txdb)                      #確認してるだけです
	

7. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

ヒツジゲノム ("oviAri3"; ISGC Oar_v3.1)のEnsembl Genes ("ensGene")のTxDbオブジェクトを取得するやり方です。

param1 <- "oviAri3"                    #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

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

#前処理
txdb <- makeTxDbFromUCSC(genome=param1, tablename=param2)#txdbオブジェクトの作成
txdb                                   #確認してるだけです
transcripts(txdb)                      #確認してるだけです
	

8. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

ニワトリゲノム ("galGal4"; ICGC Gallus-gallus-4.0)のEnsembl Genes ("ensGene")のTxDbオブジェクトを取得するやり方です。

param1 <- "galGal4"                    #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

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

#前処理
txdb <- makeTxDbFromUCSC(genome=param1, tablename=param2)#txdbオブジェクトの作成
txdb                                   #確認してるだけです
transcripts(txdb)                      #確認してるだけです
	

9. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

ヒトゲノム("hg38"; Genome Reference Consortium GRCh38のことらしい)のUCSC Genes ("knownGene")のTxDbオブジェクトを取得するやり方です。

param1 <- "hg38"                       #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "knownGene"                  #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

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

#前処理
txdb <- makeTxDbFromUCSC(genome=param1, tablename=param2)#txdbオブジェクトの作成
txdb                                   #確認してるだけです
	

10. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

ヒトゲノム("hg38"; Genome Reference Consortium GRCh38のことらしい)のEnsembl Genes ("ensGene")のTxDbオブジェクトを取得するやり方です。

エラーが出ます。

param1 <- "hg38"                       #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

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

#前処理
txdb <- makeTxDbFromUCSC(genome=param1, tablename=param2)#txdbオブジェクトの作成
txdb                                   #確認してるだけです
	

11. UCSC Genome Bioinformaticsから遺伝子アノテーション情報を取得する場合:

ヒトゲノム("hg38"; Genome Reference Consortium GRCh38のことらしい)のRefSeq Genes ("refGene")のTxDbオブジェクトを取得するやり方です。

param1 <- "hg38"                       #リファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "refGene"                    #table名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

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

#前処理
txdb <- makeTxDbFromUCSC(genome=param1, tablename=param2)#txdbオブジェクトの作成
txdb                                   #確認してるだけです
	

イントロ | NGS | アノテーション情報取得 | TxDb | GFF/GTF形式ファイルから

QuasRパッケージを用いてゲノムへのマッピング結果からカウント情報を得たいときに、 "TxDb"という形式のオブジェクトを利用する必要があります。ここでは、GenomicFeatures パッケージを用いて手元にあるGFF/GTF形式ファイルを入力としてTxDbオブジェクトを得るやり方を示します。 基本的にはGenomicFeaturesパッケージ中のmakeTxDbFromGFF関数を用いてGFF/GTF形式ファイルを読み込むことで TxDbオブジェクトをエラーなく読み込むこと自体は簡単にできます。しかし、得られたTxDbオブジェクトとゲノムマッピング結果ファイルを用いてカウント情報を得る場合に、 ゲノム配列提供元とアノテーション情報提供元が異なっているとエラーとなります。具体的には、GFF/GTFファイル中にゲノム配列中にない染色体名があるとエラーが出る場合があります。

1. TAIR(Reiser et al., Curr Protoc Bioinformatics., 2017) から提供されているArabidopsisのGFF3形式ファイル(TAIR10_GFF3_genes.gff)の場合:

基本形です。エラーは出ませんが、2015年3月4日現在、ChrCが環状ではないと認識されてしまっています。

in_f <- "TAIR10_GFF3_genes.gff"        #入力ファイル名を指定してin_fに格納(GFF/GTFファイル)

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

#本番(TxDbオブジェクトの作成)
txdb <- makeTxDbFromGFF(in_f)          #txdbオブジェクトの作成
txdb                                   #確認してるだけです
	

2. サンプルデータ23のヒトGTFファイル(human_annotation_sub3.gtf)の場合:

基本形です。2019年4月19日に動作確認した結果、エラーが出て読み込めなくなっているようです。

in_f <- "human_annotation_sub3.gtf"    #入力ファイル名を指定してin_fに格納(GFF/GTFファイル)

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

#本番(TxDbオブジェクトの作成)
txdb <- makeTxDbFromGFF(in_f, format="gtf")#txdbオブジェクトの作成
txdb                                   #確認してるだけです
	

3. サンプルデータ23のヒトGTFファイル(human_annotation_sub3.gtf)の場合:

うまくいく例です。

in_f1 <- "human_annotation_sub3.gtf"   #入力ファイル名を指定してin_f1に格納(GFF/GTFファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)

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

#前処理(リファレンス配列の染色体名を抽出)
param <- in_f2                         #paramという名前で取り扱いたいだけです
library(param, character.only=T)       #paramで指定したパッケージの読み込み
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
hoge <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてhogeに格納
chrominfo <- data.frame(chrom=as.character(seqnames(hoge)),#染色体情報をchrominfoに格納
                        length=as.vector(seqlengths(hoge)),#染色体情報をchrominfoに格納
                      is_circular=hoge@seqinfo@is_circular)#染色体情報をchrominfoに格納

#本番(TxDbオブジェクトの作成)
txdb <- makeTxDbFromGFF(file=in_f1, format="gtf",#txdbオブジェクトの作成
                   chrominfo=chrominfo,#txdbオブジェクトの作成
                species=organism(hoge))#txdbオブジェクトの作成
txdb                                   #確認してるだけです
	

4. サンプルデータ22のヒトGTFファイル(human_annotation_sub2.gtf)の場合:

うまくいかない例です。

in_f1 <- "human_annotation_sub2.gtf"   #入力ファイル名を指定してin_f1に格納(GFF/GTFファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)

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

#前処理(リファレンス配列の染色体名を抽出)
param <- in_f2                         #paramという名前で取り扱いたいだけです
library(param, character.only=T)       #paramで指定したパッケージの読み込み
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
hoge <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてhogeに格納
chrominfo <- data.frame(chrom=as.character(seqnames(hoge)),#染色体情報をchrominfoに格納
                        length=as.vector(seqlengths(hoge)),#染色体情報をchrominfoに格納
                      is_circular=hoge@seqinfo@is_circular)#染色体情報をchrominfoに格納

#本番(TxDbオブジェクトの作成)
txdb <- makeTxDbFromGFF(file=in_f1, format="gtf",#txdbオブジェクトの作成
                   chrominfo=chrominfo,#txdbオブジェクトの作成
                species=organism(hoge))#txdbオブジェクトの作成
txdb                                   #確認してるだけです
	

5. サンプルデータ21のヒトGTFファイル(human_annotation_sub1.gtf)の場合:

うまくいかない例です。

in_f1 <- "human_annotation_sub1.gtf"   #入力ファイル名を指定してin_f1に格納(GFF/GTFファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)

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

#前処理(リファレンス配列の染色体名を抽出)
param <- in_f2                         #paramという名前で取り扱いたいだけです
library(param, character.only=T)       #paramで指定したパッケージの読み込み
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
hoge <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてhogeに格納
chrominfo <- data.frame(chrom=as.character(seqnames(hoge)),#染色体情報をchrominfoに格納
                        length=as.vector(seqlengths(hoge)),#染色体情報をchrominfoに格納
                      is_circular=hoge@seqinfo@is_circular)#染色体情報をchrominfoに格納

#本番(TxDbオブジェクトの作成)
txdb <- makeTxDbFromGFF(file=in_f1, format="gtf",#txdbオブジェクトの作成
            exonRankAttributeName="exon_number",#txdbオブジェクトの作成
            gffGeneIdAttributeName="gene_name",#txdbオブジェクトの作成
            chrominfo=chrominfo,       #txdbオブジェクトの作成
            species=organism(hoge))    #txdbオブジェクトの作成
txdb                                   #確認してるだけです
	

6. ArabidopsisのGFF3形式ファイル(TAIR10_GFF3_genes.gff)の場合:

TAIR(Lamesch et al., 2012) から提供されているものです。 1.と基本的に同じですが、どの生物種に対してもデフォルトではChrMのみ環状ゲノムであるとしてしまうようですので、 circ_seqsオプションでChrCが環状であると認識させるやり方です(高橋 広夫 氏提供情報)。

in_f <- "TAIR10_GFF3_genes.gff"        #入力ファイル名を指定してin_fに格納(GFF/GTFファイル)

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

#本番(TxDbオブジェクトの作成)
txdb <- makeTxDbFromGFF(in_f, format="gff3",#txdbオブジェクトの作成
            circ_seqs=c("ChrC","ChrM"))#txdbオブジェクトの作成
txdb                                   #確認してるだけです
seqinfo(txdb)                          #確認してるだけです
	

7. GFF3形式ファイル(Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.chromosome.Chromosome.gff3)の場合:

Ensembl (Zerbino et al., Nucleic Acids Res., 2018)から提供されている Lactobacillus hokkaidonensis JCM 18461 (Tanizawa et al., 2015) のデータです。

in_f <- "Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_fに格納

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

#本番(TxDbオブジェクトの作成)
txdb <- makeTxDbFromGFF(in_f, format="auto")#txdbオブジェクトの作成
txdb                                   #確認してるだけです
	

イントロ | NGS | 読み込み | BSgenome | 基本情報を取得

BSgenomeパッケージを読み込んで、 Total lengthやaverage lengthなどの各種情報取得を行うためのやり方を示します。 パッケージがインストールされていない場合は、インストール | Rパッケージ | 個別 を参考にしてインストールしておく必要があります。 マウスやヒトゲノム解析の場合に「整数オーバーフロー」問題が生じていましたが、Total_lenのところで「sum(width(fasta))」を「sum(as.numeric(width(fasta)))」に、 そしてsortedのところで「rev(sort(width(fasta)))」を「rev(sort(as.numeric(width(fasta))))」などと書き換えることで回避可能であるという情報をいただきましたので、 2015年5月27日にそのように変更しました(野間口達洋 氏提供情報)。

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

1. ヒトゲノム配列パッケージ(BSgenome.Hsapiens.NCBI.GRCh38)の場合:

GC含量は約41%となります。 これは、GとCが各20.5%を占め、残りのAとTが各29.5%を占めることを意味します。

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Hsapiens.NCBI.GRCh38"#パッケージ名を指定(BSgenome系のゲノムパッケージ)

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

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

#本番(基本情報取得)
Total_len <- sum(as.numeric(width(fasta)))#配列の「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「配列数」を取得
Average_len <- mean(width(fasta))      #配列の「平均長」を取得
Median_len <- median(width(fasta))     #配列の「中央値」を取得
Max_len <- max(width(fasta))           #配列の長さの「最大値」を取得
Min_len <- min(width(fasta))           #配列の長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(as.numeric(width(fasta))))#長さ情報を降順にソートした結果をsortedに格納
obj <- (cumsum(sorted) >= Total_len*0.5)#条件を満たすかどうかを判定した結果をobjに格納(長い配列長のものから順番に足していってTotal_lenの50%以上かどうか)
N50 <- sorted[obj][1]                  #objがTRUEとなる1番最初の要素のみ抽出した結果をN50に格納

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- sum(as.numeric(CG))/sum(as.numeric(ACGT))#トータルのGC含量の情報を取得(2016年4月22日に修正)

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

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

ゲノムサイズが約120MB、GC含量が約36%であることがわかります。 これは、GとCが各18%を占め、残りのAとTが各32%を占めることを意味します。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Athaliana.TAIR.TAIR9"#パッケージ名を指定(BSgenome系のゲノムパッケージ)

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

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

#本番(基本情報取得)
Total_len <- sum(as.numeric(width(fasta)))#配列の「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「配列数」を取得
Average_len <- mean(width(fasta))      #配列の「平均長」を取得
Median_len <- median(width(fasta))     #配列の「中央値」を取得
Max_len <- max(width(fasta))           #配列の長さの「最大値」を取得
Min_len <- min(width(fasta))           #配列の長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(as.numeric(width(fasta))))#長さ情報を降順にソートした結果をsortedに格納
obj <- (cumsum(sorted) >= Total_len*0.5)#条件を満たすかどうかを判定した結果をobjに格納(長い配列長のものから順番に足していってTotal_lenの50%以上かどうか)
N50 <- sorted[obj][1]                  #objがTRUEとなる1番最初の要素のみ抽出した結果をN50に格納

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- sum(as.numeric(CG))/sum(as.numeric(ACGT))#トータルのGC含量の情報を取得(2016年4月22日に修正)

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. 線虫ゲノム配列パッケージ(BSgenome.Celegans.UCSC.ce6)の場合:

ゲノムサイズが約100MB、GC含量が約35.4%であることがわかります。 これは、GとCが各17.7%を占め、残りのAとTが各32.3%を占めることを意味します。

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Celegans.UCSC.ce6"#パッケージ名を指定(BSgenome系のゲノムパッケージ)

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

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

#本番(基本情報取得)
Total_len <- sum(as.numeric(width(fasta)))#配列の「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「配列数」を取得
Average_len <- mean(width(fasta))      #配列の「平均長」を取得
Median_len <- median(width(fasta))     #配列の「中央値」を取得
Max_len <- max(width(fasta))           #配列の長さの「最大値」を取得
Min_len <- min(width(fasta))           #配列の長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(as.numeric(width(fasta))))#長さ情報を降順にソートした結果をsortedに格納
obj <- (cumsum(sorted) >= Total_len*0.5)#条件を満たすかどうかを判定した結果をobjに格納(長い配列長のものから順番に足していってTotal_lenの50%以上かどうか)
N50 <- sorted[obj][1]                  #objがTRUEとなる1番最初の要素のみ抽出した結果をN50に格納

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- sum(as.numeric(CG))/sum(as.numeric(ACGT))#トータルのGC含量の情報を取得(2016年4月22日に修正)

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. ゼブラフィッシュゲノム配列パッケージ(BSgenome.Drerio.UCSC.danRer7)の場合:

ゲノムサイズが約1.357GB、GC含量が約36.6%であることがわかります。 これは、GとCが各18.3%を占め、残りのAとTが各31.7%を占めることを意味します。

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

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

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

#本番(基本情報取得)
Total_len <- sum(as.numeric(width(fasta)))#配列の「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「配列数」を取得
Average_len <- mean(width(fasta))      #配列の「平均長」を取得
Median_len <- median(width(fasta))     #配列の「中央値」を取得
Max_len <- max(width(fasta))           #配列の長さの「最大値」を取得
Min_len <- min(width(fasta))           #配列の長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(as.numeric(width(fasta))))#長さ情報を降順にソートした結果をsortedに格納
obj <- (cumsum(sorted) >= Total_len*0.5)#条件を満たすかどうかを判定した結果をobjに格納(長い配列長のものから順番に足していってTotal_lenの50%以上かどうか)
N50 <- sorted[obj][1]                  #objがTRUEとなる1番最初の要素のみ抽出した結果をN50に格納

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- sum(as.numeric(CG))/sum(as.numeric(ACGT))#トータルのGC含量の情報を取得(2016年4月22日に修正)

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. マウスゲノム配列パッケージ(BSgenome.Mmusculus.UCSC.mm10)の場合:

GC含量は約41.667%という値が得られています。 これは、GとCが各20.8335%を占め、残りのAとTが各29.1665%を占めることを意味します。

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Mmusculus.UCSC.mm10"#パッケージ名を指定(BSgenome系のゲノムパッケージ)

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

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

#本番(基本情報取得)
Total_len <- sum(as.numeric(width(fasta)))#配列の「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「配列数」を取得
Average_len <- mean(width(fasta))      #配列の「平均長」を取得
Median_len <- median(width(fasta))     #配列の「中央値」を取得
Max_len <- max(width(fasta))           #配列の長さの「最大値」を取得
Min_len <- min(width(fasta))           #配列の長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(as.numeric(width(fasta))))#長さ情報を降順にソートした結果をsortedに格納
obj <- (cumsum(sorted) >= Total_len*0.5)#条件を満たすかどうかを判定した結果をobjに格納(長い配列長のものから順番に足していってTotal_lenの50%以上かどうか)
N50 <- sorted[obj][1]                  #objがTRUEとなる1番最初の要素のみ抽出した結果をN50に格納

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- sum(as.numeric(CG))/sum(as.numeric(ACGT))#トータルのGC含量の情報を取得(2016年4月22日に修正)

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

6. 大腸菌ゲノム配列パッケージ(BSgenome.Ecoli.NCBI.20080805)の場合:

GC含量は約50.631%という値が得られています。 これは、GとCが各25.316%を占め、残りのAとTが各24.684%を占めることを意味します。

out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Ecoli.NCBI.20080805"#パッケージ名を指定(BSgenome系のゲノムパッケージ)

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

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

#本番(基本情報取得)
Total_len <- sum(as.numeric(width(fasta)))#配列の「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「配列数」を取得
Average_len <- mean(width(fasta))      #配列の「平均長」を取得
Median_len <- median(width(fasta))     #配列の「中央値」を取得
Max_len <- max(width(fasta))           #配列の長さの「最大値」を取得
Min_len <- min(width(fasta))           #配列の長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(as.numeric(width(fasta))))#長さ情報を降順にソートした結果をsortedに格納
obj <- (cumsum(sorted) >= Total_len*0.5)#条件を満たすかどうかを判定した結果をobjに格納(長い配列長のものから順番に足していってTotal_lenの50%以上かどうか)
N50 <- sorted[obj][1]                  #objがTRUEとなる1番最初の要素のみ抽出した結果をN50に格納

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- sum(as.numeric(CG))/sum(as.numeric(ACGT))#トータルのGC含量の情報を取得(2016年4月22日に修正)

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

7. イヌゲノム配列パッケージ(BSgenome.Cfamiliaris.UCSC.canFam3)の場合:

GC含量は約41.057%という値が得られています。 これは、GとCが各20.528%を占め、残りのAとTが各29.472%を占めることを意味します。

out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Cfamiliaris.UCSC.canFam3"#パッケージ名を指定(BSgenome系のゲノムパッケージ)

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

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

#本番(基本情報取得)
Total_len <- sum(as.numeric(width(fasta)))#配列の「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「配列数」を取得
Average_len <- mean(width(fasta))      #配列の「平均長」を取得
Median_len <- median(width(fasta))     #配列の「中央値」を取得
Max_len <- max(width(fasta))           #配列の長さの「最大値」を取得
Min_len <- min(width(fasta))           #配列の長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(as.numeric(width(fasta))))#長さ情報を降順にソートした結果をsortedに格納
obj <- (cumsum(sorted) >= Total_len*0.5)#条件を満たすかどうかを判定した結果をobjに格納(長い配列長のものから順番に足していってTotal_lenの50%以上かどうか)
N50 <- sorted[obj][1]                  #objがTRUEとなる1番最初の要素のみ抽出した結果をN50に格納

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- sum(as.numeric(CG))/sum(as.numeric(ACGT))#トータルのGC含量の情報を取得(2016年4月22日に修正)

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

8. ショウジョウバエゲノム配列パッケージ(BSgenome.Dmelanogaster.UCSC.dm2)の場合:

GC含量は約42.21%という値が得られています。 これは、GとCが各21.11%を占め、残りのAとTが各28.89%を占めることを意味します。

out_f <- "hoge8.txt"                   #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Dmelanogaster.UCSC.dm2"#パッケージ名を指定(BSgenome系のゲノムパッケージ)

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

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

#本番(基本情報取得)
Total_len <- sum(as.numeric(width(fasta)))#配列の「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「配列数」を取得
Average_len <- mean(width(fasta))      #配列の「平均長」を取得
Median_len <- median(width(fasta))     #配列の「中央値」を取得
Max_len <- max(width(fasta))           #配列の長さの「最大値」を取得
Min_len <- min(width(fasta))           #配列の長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(as.numeric(width(fasta))))#長さ情報を降順にソートした結果をsortedに格納
obj <- (cumsum(sorted) >= Total_len*0.5)#条件を満たすかどうかを判定した結果をobjに格納(長い配列長のものから順番に足していってTotal_lenの50%以上かどうか)
N50 <- sorted[obj][1]                  #objがTRUEとなる1番最初の要素のみ抽出した結果をN50に格納

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- sum(as.numeric(CG))/sum(as.numeric(ACGT))#トータルのGC含量の情報を取得(2016年4月22日に修正)

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

9. イネゲノム配列パッケージ(BSgenome.Osativa.MSU.MSU7)の場合:

GC含量は約43.57%という値が得られています。 これは、GとCが各21.78%を占め、残りのAとTが各28.22%を占めることを意味します。

out_f <- "hoge9.txt"                   #出力ファイル名を指定してout_fに格納
param_bsgenome <- "BSgenome.Osativa.MSU.MSU7"#パッケージ名を指定(BSgenome系のゲノムパッケージ)

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

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

#本番(基本情報取得)
Total_len <- sum(as.numeric(width(fasta)))#配列の「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「配列数」を取得
Average_len <- mean(width(fasta))      #配列の「平均長」を取得
Median_len <- median(width(fasta))     #配列の「中央値」を取得
Max_len <- max(width(fasta))           #配列の長さの「最大値」を取得
Min_len <- min(width(fasta))           #配列の長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(as.numeric(width(fasta))))#長さ情報を降順にソートした結果をsortedに格納
obj <- (cumsum(sorted) >= Total_len*0.5)#条件を満たすかどうかを判定した結果をobjに格納(長い配列長のものから順番に足していってTotal_lenの50%以上かどうか)
N50 <- sorted[obj][1]                  #objがTRUEとなる1番最初の要素のみ抽出した結果をN50に格納

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- sum(as.numeric(CG))/sum(as.numeric(ACGT))#トータルのGC含量の情報を取得(2016年4月22日に修正)

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

イントロ | NGS | 読み込み | FASTA形式 | 基本情報を取得

multi-FASTAファイルを読み込んで、Total lengthやaverage lengthなどの各種情報取得を行うためのやり方を示します。 例題6以降は、ヒトやマウスレベルの巨大ファイルを取り扱うためのコードです。具体的には、 塩基数を整数(integer)ではなく実数(real number)として取り扱うためのas.numeric関数を追加しています。

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

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

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

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

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

#本番(基本情報取得)
Total_len <- sum(width(fasta))         #配列の「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「配列数」を取得
Average_len <- mean(width(fasta))      #配列の「平均長」を取得
Median_len <- median(width(fasta))     #配列の「中央値」を取得
Max_len <- max(width(fasta))           #配列の長さの「最大値」を取得
Min_len <- min(width(fasta))           #配列の長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(width(fasta)))      #長さ情報を降順にソートした結果をsortedに格納
obj <- (cumsum(sorted) >= Total_len*0.5)#条件を満たすかどうかを判定した結果をobjに格納(長い配列長のものから順番に足していってTotal_lenの50%以上かどうか)
N50 <- sorted[obj][1]                  #objがTRUEとなる1番最初の要素のみ抽出した結果をN50に格納

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- sum(CG)/sum(ACGT)        #トータルのGC含量の情報を取得

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

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

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

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

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

#本番(基本情報取得)
Total_len <- sum(width(fasta))         #配列の「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「配列数」を取得
Average_len <- mean(width(fasta))      #配列の「平均長」を取得
Median_len <- median(width(fasta))     #配列の「中央値」を取得
Max_len <- max(width(fasta))           #配列の長さの「最大値」を取得
Min_len <- min(width(fasta))           #配列の長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(width(fasta)))      #長さ情報を降順にソートした結果をsortedに格納
obj <- (cumsum(sorted) >= Total_len*0.5)#条件を満たすかどうかを判定した結果をobjに格納(長い配列長のものから順番に足していってTotal_lenの50%以上かどうか)
N50 <- sorted[obj][1]                  #objがTRUEとなる1番最初の要素のみ抽出した結果をN50に格納

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- sum(CG)/sum(ACGT)        #トータルのGC含量の情報を取得

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

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

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

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

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

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

#本番(基本情報取得)
Total_len <- sum(width(fasta))         #配列の「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「配列数」を取得
Average_len <- mean(width(fasta))      #配列の「平均長」を取得
Median_len <- median(width(fasta))     #配列の「中央値」を取得
Max_len <- max(width(fasta))           #配列の長さの「最大値」を取得
Min_len <- min(width(fasta))           #配列の長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(width(fasta)))      #長さ情報を降順にソートした結果をsortedに格納
obj <- (cumsum(sorted) >= Total_len*0.5)#条件を満たすかどうかを判定した結果をobjに格納(長い配列長のものから順番に足していってTotal_lenの50%以上かどうか)
N50 <- sorted[obj][1]                  #objがTRUEとなる1番最初の要素のみ抽出した結果をN50に格納

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- sum(CG)/sum(ACGT)        #トータルのGC含量の情報を取得

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. 120MB程度のシロイヌナズナゲノムのmulti-FASTAファイル(TAIR10_chr_all.fas.gz)の場合:

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

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

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

#本番(基本情報取得)
Total_len <- sum(width(fasta))         #配列の「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「配列数」を取得
Average_len <- mean(width(fasta))      #配列の「平均長」を取得
Median_len <- median(width(fasta))     #配列の「中央値」を取得
Max_len <- max(width(fasta))           #配列の長さの「最大値」を取得
Min_len <- min(width(fasta))           #配列の長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(width(fasta)))      #長さ情報を降順にソートした結果をsortedに格納
obj <- (cumsum(sorted) >= Total_len*0.5)#条件を満たすかどうかを判定した結果をobjに格納(長い配列長のものから順番に足していってTotal_lenの50%以上かどうか)
N50 <- sorted[obj][1]                  #objがTRUEとなる1番最初の要素のみ抽出した結果をN50に格納

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- sum(CG)/sum(ACGT)        #トータルのGC含量の情報を取得

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. Ensembl Genomesから取得した乳酸菌ゲノムのmulti-FASTAファイル(Lactobacillus_casei_12a.GCA_000309565.1.22.dna.toplevel.fa)の場合:

Lactobacillus casei 12A (Taxonomy ID: 1051650)Broadbent et al., BMC Genomics, 2012のゲノム配列です。

Lactobacillus casei 12A - Download DNA sequence - Lactobacillus_casei_12a.GCA_000309565.1.22.dna.toplevel.fa.gzをダウンロード後に解凍すれば、同じファイル名のものが得られます。

in_f <- "Lactobacillus_casei_12a.GCA_000309565.1.22.dna.toplevel.fa"#入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

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

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

#本番(基本情報取得)
Total_len <- sum(width(fasta))         #配列の「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「配列数」を取得
Average_len <- mean(width(fasta))      #配列の「平均長」を取得
Median_len <- median(width(fasta))     #配列の「中央値」を取得
Max_len <- max(width(fasta))           #配列の長さの「最大値」を取得
Min_len <- min(width(fasta))           #配列の長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(width(fasta)))      #長さ情報を降順にソートした結果をsortedに格納
obj <- (cumsum(sorted) >= Total_len*0.5)#条件を満たすかどうかを判定した結果をobjに格納(長い配列長のものから順番に足していってTotal_lenの50%以上かどうか)
N50 <- sorted[obj][1]                  #objがTRUEとなる1番最初の要素のみ抽出した結果をN50に格納

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- sum(CG)/sum(ACGT)        #トータルのGC含量の情報を取得

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

6. ヒトやマウスレベルのmulti-FASTAファイルの場合:

例題5までのコードは、マウスやヒトゲノム解析の場合に「整数オーバーフロー」問題が生じてうまくいきませんが、それを回避するやり方です。 具体的には、Total_lenのところで「sum(width(fasta))」を「sum(as.numeric(width(fasta)))」に、 そしてsortedのところで「rev(sort(width(fasta)))」を「rev(sort(as.numeric(width(fasta))))」と書き換えています(野間口達洋 氏提供情報)。

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

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

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

#本番(基本情報取得)
Total_len <- sum(as.numeric(width(fasta)))#配列の「トータルの長さ」を取得
Number_of_contigs <- length(fasta)     #「配列数」を取得
Average_len <- mean(width(fasta))      #配列の「平均長」を取得
Median_len <- median(width(fasta))     #配列の「中央値」を取得
Max_len <- max(width(fasta))           #配列の長さの「最大値」を取得
Min_len <- min(width(fasta))           #配列の長さの「最小値」を取得

#本番(N50情報取得)
sorted <- rev(sort(as.numeric(width(fasta))))#長さ情報を降順にソートした結果をsortedに格納
obj <- (cumsum(sorted) >= Total_len*0.5)#条件を満たすかどうかを判定した結果をobjに格納(長い配列長のものから順番に足していってTotal_lenの50%以上かどうか)
N50 <- sorted[obj][1]                  #objがTRUEとなる1番最初の要素のみ抽出した結果をN50に格納

#本番(GC含量情報取得)
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- sum(as.numeric(CG))/sum(as.numeric(ACGT))#トータルのGC含量の情報を取得(2016年4月22日に修正)

#ファイルに保存
tmp <- NULL
tmp <- rbind(tmp, c("Total length (bp)", Total_len))
tmp <- rbind(tmp, c("Number of contigs", Number_of_contigs))
tmp <- rbind(tmp, c("Average length", Average_len))
tmp <- rbind(tmp, c("Median length", Median_len))
tmp <- rbind(tmp, c("Max length", Max_len))
tmp <- rbind(tmp, c("Min length", Min_len))
tmp <- rbind(tmp, c("N50", N50))
tmp <- rbind(tmp, c("GC content", GC_content))
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

イントロ | NGS | 読み込み | FASTA形式 | description行の記述を整形

multi-FASTAファイルのdescription行の記述はものによってまちまちです。ここでは何種類かのmulti-FASTA形式ファイルに対して、 「目的の記述部分のみ抽出し、それを新たなdescription」とするやり方や、まるごと指定した文字列に置換するやり方などを示します。

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

1. ラットの上流配列(1000bp)ファイル(rat_upstream_1000.fa)からRefSeq IDの部分のみを抽出したい場合:

抽出例:「NM_022953_up_1000_chr1_268445091_r chr1:268445091-268446090」--> 「NM_022953」

戦略:"_up_"を区切り文字として分割("NM_022953"と"1000_chr1_268445091_r chr1:268445091-268446090")し、分割後の1つ目の要素を抽出

例題ファイルのダウンロード時に、なぜか拡張子の.faが.txtに勝手に変更されていたりする場合がありますのでご注意ください。

in_f <- "rat_upstream_1000.fa"         #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- "_up_"                       #区切り文字を指定
param2 <- 1                            #分割後に抽出したい要素番号を指定

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

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

#本番
hoge <- strsplit(names(fasta), param1, fixed=TRUE)#names(fasta)中の文字列をparam1で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", param2))#hogeのリスト中の(param2)番目の要素(これがRefSeq IDに相当)を抽出してhoge2に格納
names(fasta) <- hoge2                  #names(fasta)の中身をhoge2で置換
fasta                                  #確認してるだけです

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

2. Trinity.fastaから最初のスペースで区切られる前の文字列のみにしたい場合:

抽出例:「comp59_c0_seq1 len=537 ~FPKM=305.1 path=[0:0-536]」--> 「comp59_c0_seq1」

戦略:" "を区切り文字として分割("comp59_c0_seq1", "len=537", "~FPKM=305.1", "path=[0:0-536]")し、分割後の1つ目の要素を抽出

in_f <- "Trinity.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- " "                          #区切り文字を指定
param2 <- 1                            #分割後に抽出したい要素番号を指定

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

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

#本番
hoge <- strsplit(names(fasta), param1, fixed=TRUE)#names(fasta)中の文字列をparam1で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", param2))#hogeのリスト中の(param2)番目の要素を抽出してhoge2に格納
names(fasta) <- hoge2                  #names(fasta)の中身をhoge2で置換
fasta                                  #確認してるだけです

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

3. DHFR.fastaからRefSeq ID部分のみ抽出したい場合:

抽出例:「gi|68303806|ref|NM_000791.3| Homo sapiens dihydrofolate reductase (DHFR), mRNA」--> 「NM_000791.3」

戦略:"|"を区切り文字として分割("gi", "68303806", "ref", "NM_000791.3", " Homo sapiens dihydrofolate reductase (DHFR), mRNA")し、分割後の4番目の要素を抽出

in_f <- "DHFR.fasta"                   #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- "|"                          #区切り文字を指定
param2 <- 4                            #分割後に抽出したい要素番号を指定

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

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

#本番
hoge <- strsplit(names(fasta), param1, fixed=TRUE)#names(fasta)中の文字列をparam1で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", param2))#hogeのリスト中の(param2)番目の要素(これがRefSeq IDに相当)を抽出してhoge2に格納
names(fasta) <- hoge2                  #names(fasta)の中身をhoge2で置換
fasta                                  #確認してるだけです

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

4. DHFR.fastaからバージョン番号を除いたRefSeq ID部分のみ抽出したい場合:

抽出例:「gi|68303806|ref|NM_000791.3| Homo sapiens dihydrofolate reductase (DHFR), mRNA」--> 「NM_000791」

戦略:"|"を区切り文字として分割("gi", "68303806", "ref", "NM_000791.3", " Homo sapiens dihydrofolate reductase (DHFR), mRNA")し、分割後の4番目の要素を抽出。 次に、"."を区切り文字として分割("NM_000791", "3")し、分割後の1番目の要素を抽出。

in_f <- "DHFR.fasta"                   #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- "|"                          #区切り文字を指定
param2 <- 4                            #分割後に抽出したい要素番号を指定
param3 <- "."                          #区切り文字を指定
param4 <- 1                            #分割後に抽出したい要素番号を指定

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

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

#本番
hoge <- strsplit(names(fasta), param1, fixed=TRUE)#names(fasta)中の文字列をparam1で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", param2))#hogeのリスト中の(param2)番目の要素(これがバージョン番号つきのRefSeq IDに相当)を抽出してhoge2に格納
hoge3 <- strsplit(hoge2, param3, fixed=TRUE)#hoge2中の文字列をparam3で区切った結果をリスト形式でhoge3に格納
hoge4 <- unlist(lapply(hoge3, "[[", param4))#hoge3のリスト中の(param4)番目の要素(これがRefSeq IDのバージョン部分以外に相当)を抽出してhoge4に格納
names(fasta) <- hoge4                  #names(fasta)の中身をhoge4で置換
fasta                                  #確認してるだけです

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

5. sample_100.fastaからバージョン番号を除いたRefSeq ID部分のみ抽出したい場合:

抽出例:「gi|239744030|ref|XR_017086.3| PREDICTED: Homo sapiens supervillin-like (LOC645954), miscRNA」--> 「XR_017086」

戦略:"|"を区切り文字として分割("gi", "239744030", "ref", "XR_017086.3", " PREDICTED: Homo sapiens supervillin-like (LOC645954), miscRNA")し、分割後の4番目の要素を抽出。 次に、"."を区切り文字として分割("XR_017086", "3")し、分割後の1番目の要素を抽出。

in_f <- "sample_100.fasta"             #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- "|"                          #区切り文字を指定
param2 <- 4                            #分割後に抽出したい要素番号を指定
param3 <- "."                          #区切り文字を指定
param4 <- 1                            #分割後に抽出したい要素番号を指定

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

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

#本番
hoge <- strsplit(names(fasta), param1, fixed=TRUE)#names(fasta)中の文字列をparam1で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", param2))#hogeのリスト中の(param2)番目の要素(これがこれがバージョン番号つきのRefSeq IDに相当)を抽出してhoge2に格納
hoge3 <- strsplit(hoge2, param3, fixed=TRUE)#hoge2中の文字列をparam3で区切った結果をリスト形式でhoge3に格納
hoge4 <- unlist(lapply(hoge3, "[[", param4))#hoge3のリスト中の(param4)番目の要素(これがRefSeq IDのバージョン部分以外に相当)を抽出してhoge4に格納
names(fasta) <- hoge4                  #names(fasta)の中身をhoge4で置換
fasta                                  #確認してるだけです

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

6. シロイヌナズナのゲノム配列ファイル(TAIR10_chr_all.fas.gz; Reiser et al., Curr Protoc Bioinformatics., 2017)のdescription部分をまるまる任意の文字列に置換したい場合:

染色体の並びがparamで指定したものと同じであることが既知という前提です。ゲノム配列ファイル自体は120MB程度あります。

in_f <- "TAIR10_chr_all.fas.gz"        #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.fasta"                 #出力ファイル名を指定してout_fに格納
param <- c("Chr1","Chr2","Chr3","Chr4","Chr5","ChrM","ChrC")#置換したい文字列を指定

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

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

#本番
names(fasta) <- param                  #names(fasta)の中身をparamで置換
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | NGS | 読み込み | FASTQ形式 | 基礎

Sanger FASTQ形式ファイルを読み込むやり方を示します。「基礎」では、FASTQファイルの中身を全て読み込む手順を示します。 入力、出力形式は、ともに非圧縮(.fastq)、gzip圧縮(.fastq.gz)ファイルが可能です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

quality情報を除く塩基配列情報のみ読み込むやり方です。配列長が同じ場合のみ読み込めます。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです
	

2. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

quality情報も読み込むやり方です。配列長が異なっていても読み込めます。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
fastq                                  #確認してるだけです

showClass("ShortReadQ")                #ShortReadQ"というクラスのオブジェクトからどのように情報を取得するかを調べたい場合
sread(fastq)                           #塩基配列情報を表示
quality(fastq)                         #quality情報を表示
id(fastq)                              #description情報を表示
	

3. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

quality情報も読み込むやり方です。配列長が異なっていても読み込めます。 description行の" "以降の文字を削除して、またFASTQ形式で保存するやり方です。 writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。 ここではcompress=Fとして非圧縮ファイルを出力しています。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.fastq"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
id(fastq)                              #description情報を表示

#前処理
hoge <- strsplit(as.character(id(fastq)), " ", fixed=TRUE)#id(fasta)中の文字列を" "で区切った結果をリスト形式でhogeに格納
description <- BStringSet(sapply(hoge,"[[", 1))#hogeのリスト中の一番目の要素のみ取り出してdescriptionに格納

#本番
fastq <- ShortReadQ(sread(fastq), quality(fastq), description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
id(fastq)                              #description情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

4. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

quality情報も読み込むやり方です。配列長が異なっていても読み込めます。 description行の" "以降の文字を削除して、またFASTQ形式で保存するやり方です。 writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.fastq.gz"              #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
id(fastq)                              #description情報を表示

#前処理
hoge <- strsplit(as.character(id(fastq)), " ", fixed=TRUE)#id(fasta)中の文字列を" "で区切った結果をリスト形式でhogeに格納
description <- BStringSet(sapply(hoge,"[[", 1))#hogeのリスト中の一番目の要素のみ取り出してdescriptionに格納

#本番
fastq <- ShortReadQ(sread(fastq), quality(fastq), description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
id(fastq)                              #description情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=T)   #fastqの中身を指定したファイル名で保存
	

5. small RNA-seqのgzip圧縮FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の7を実行して得られた カイコsmall RNA-seqデータ(Nie et al., BMC Genomics, 2013)です。 入力ファイルサイズは400Mb弱、11,928,428リードです。 この中から100000リード分をランダムに非復元抽出した結果をgzip圧縮なしで出力しています。 出力ファイルはSRR609266_sub.fastqと同じもの(100000リード; 約16MB)になります。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.fastq"                 #出力ファイル名を指定してout_fに格納
param <- 100000                        #ランダム抽出したいリード数を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
id(fastq)                              #確認してるだけです(description情報を表示)

#本番
set.seed(1010)                         #おまじない(同じ乱数になるようにするため)
obj <- sample(1:length(fastq), param, replace=F)#リード数の数値の中からparamで指定した数だけ非復元抽出した結果をobjに格納
fastq <- fastq[sort(obj)]              #objで指定したリードのみ抽出した結果をfastqに格納
id(fastq)                              #確認してるだけです(description情報を表示)

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

6. small RNA-seqのgzip圧縮FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の7を実行して得られた カイコsmall RNA-seqデータ(Nie et al., BMC Genomics, 2013)です。 入力ファイルサイズは400Mb弱、11,928,428リードです。この中から最初の100000リード分をgzip圧縮なしで出力しています。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.fastq"                 #出力ファイル名を指定してout_fに格納
param <- 100000                        #抽出したいリード数を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
id(fastq)                              #確認してるだけです(description情報を表示)

#本番
fastq <- fastq[1:param]                #指定したリード数を抽出した結果をfastqに格納
id(fastq)                              #確認してるだけです(description情報を表示)

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

7. small RNA-seqのgzip圧縮FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の7を実行して得られた カイコsmall RNA-seqデータ(Nie et al., BMC Genomics, 2013)です。 入力ファイルサイズは400Mb弱、11,928,428リードです。 これまでの例題とは毛色が異なり、ただのTipsです。リード数と長さを知りたいときには、fastq.geometry関数が便利です。 「11928428 49」という結果が返されます。リード長が49 bpであることが分かります。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#本番(リード数とリード長を表示)
fastq.geometry(in_f)                   #リード数とリード長を表示
	

8. FASTQ形式ファイル(SRR616268sub_1.fastq.gz)の場合:

乳酸菌RNA-seqデータSRR616268の最初の100万リード分(約73MB)です。長さは全て107 bpです。 NAを含む場合への各種対応策を2015年6月24日に追加しました(茂木朋貴氏、野間口達洋氏、他多くの受講生提供情報)。

in_f <- "SRR616268sub_1.fastq.gz"      #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#以下はおまけ(部分配列を抽出し出現頻度上位を概観)
hoge <- subseq(fasta, start=1, end=7)  #指定した始点と終点の範囲の配列を抽出
hoge                                   #確認してるだけです
head(table(hoge))                      #出現頻度を順番に表示
head(sort(table(hoge), decreasing=T))  #出現頻度上位を表示
table(hoge)["CGGGCCT"]                 #CGGGCCTの出現頻度を表示

hoge <- subseq(fasta, start=3, width=7)#指定した始点から一定範囲の配列を抽出
hoge                                   #確認してるだけです
table(hoge)["CGGGCCT"]                 #CGGGCCTの出現頻度を表示

hoge <- subseq(fasta, start=5, width=7)#指定した始点から一定範囲の配列を抽出
table(hoge)["CGGGCCT"]                 #CGGGCCTの出現頻度を表示

#以下はおまけ(コツが分かったので、可能なポジションを全て調査)
table(subseq(fasta, start=1, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=2, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=3, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=4, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=5, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=6, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=7, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=8, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=9, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=10, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=11, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=12, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=13, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=14, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=15, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=16, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=17, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=18, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=19, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=20, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=21, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=22, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=23, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=24, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=25, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=26, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=27, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=28, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=29, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=30, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=31, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=32, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=33, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=34, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=35, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=36, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=37, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=38, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=39, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=40, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=41, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=42, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=43, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=44, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=45, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=46, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=47, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=48, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=49, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=50, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=51, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=52, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=53, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=54, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=55, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=56, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=57, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=58, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=59, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=60, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=61, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=62, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=63, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=64, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=65, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=66, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=67, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=68, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=69, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=70, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=71, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=72, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=73, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=74, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=75, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=76, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=77, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=78, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=79, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=80, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=81, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=82, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=83, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=84, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=85, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=86, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=87, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=88, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=89, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=90, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=91, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=92, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=93, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=94, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=95, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=96, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=97, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=98, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=99, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=100, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=101, width=7))["CGGGCCT"]#一気に計算

#以下はおまけ(forループを用いて美しく...初級)
param_kmer <- 7                        #k-merのkの値を指定
param_obj <- "CGGGCCT"                 #調べたいk-merを指定
Obs <- NULL                            #おまじない
for(i in 1:101){                       #ループを回す
    Obs <- c(Obs, table(subseq(fasta, start=i, width=param_kmer))[param_obj])#出現回数算出結果を格納
}
Obs[is.na(Obs)] <- 0                   #NAの位置に0を代入
head(Obs)                              #最初の6個の要素を表示
mean(Obs, na.rm=TRUE)                  #平均値
Exp <- mean(Obs, na.rm=TRUE)           #平均値をExpとして取り扱う
head(Obs/Exp)
plot(Obs/Exp, type="l", col="red")

#以下はおまけ(forループを用いて美しく...中級)
param_obj <- "CGGGCCT"                 #調べたいk-merを指定
Obs <- NULL                            #おまじない
for(i in 1:101){                       #ループを回す
    Obs <- c(Obs, table(subseq(fasta, start=i, width=nchar(param_obj)))[param_obj])#出現回数算出結果を格納
}
Obs[is.na(Obs)] <- 0                   #NAの位置に0を代入
head(Obs)                              #最初の6個の要素を表示
mean(Obs, na.rm=TRUE)                  #平均値
Exp <- mean(Obs, na.rm=TRUE)           #平均値をExpとして取り扱う
head(Obs/Exp)
plot(Obs/Exp, type="l", col="red")

#以下はおまけ(forループを用いて美しく...上級1)
param_len_ngs <- 107                   #リード長を指定
param_obj <- "CGGGCCT"                 #調べたいk-merを指定
Obs <- NULL                            #おまじない
hoge <- param_len_ngs - nchar(param_obj) + 1#positionの右端の値を計算してhogeに格納
for(i in 1:hoge){                      #ループを回す
    Obs <- c(Obs, table(subseq(fasta, start=i, width=nchar(param_obj)))[param_obj])#出現回数算出結果を格納
}
Obs[is.na(Obs)] <- 0                   #NAの位置に0を代入
head(Obs)                              #最初の6個の要素を表示
mean(Obs, na.rm=TRUE)                  #平均値
Exp <- mean(Obs, na.rm=TRUE)           #平均値をExpとして取り扱う
head(Obs/Exp)
plot(Obs/Exp, type="l", col="red")

#以下はおまけ(forループを用いて美しく...上級2)
param_obj <- "CGGGCCT"                 #調べたいk-merを指定
Obs <- NULL                            #おまじない
hoge <- width(fasta)[1] - nchar(param_obj) + 1#positionの右端の値を計算してhogeに格納
for(i in 1:hoge){                      #ループを回す
    Obs <- c(Obs, table(subseq(fasta, start=i, width=nchar(param_obj)))[param_obj])#出現回数算出結果を格納
}
Obs[is.na(Obs)] <- 0                   #NAの位置に0を代入
head(Obs)                              #最初の6個の要素を表示
mean(Obs, na.rm=TRUE)                  #平均値
Exp <- mean(Obs, na.rm=TRUE)           #平均値をExpとして取り扱う
head(Obs/Exp)
plot(Obs/Exp, type="l", col="red")
	

9. FASTQ形式ファイル(SRR616268sub_1.fastq.gz)の場合:

乳酸菌RNA-seqデータSRR616268の最初の100万リード分(約73MB)です。長さは全て107 bpです。 NAを含む場合への各種対応策を2015年6月24日に追加しました(茂木朋貴氏、野間口達洋氏、他多くの受講生提供情報)。 8.と基本的に同じですが、入力ファイルの12%分(120,000リード)のみで解析するとFastQC実行結果と同じになることがわかったので、そのサブセットのみで再解析しています。/p>

in_f <- "SRR616268sub_1.fastq.gz"      #入力ファイル名を指定してin_fに格納
param <- 120000                        #抽出したいリード数を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#前処理(サブセットの抽出)
fasta <- fasta[1:param]                #サブセット抽出結果をfastaに格納
fasta                                  #確認してるだけです

#以下はおまけ(部分配列を抽出し出現頻度上位を概観)
hoge <- subseq(fasta, start=1, end=7)  #指定した始点と終点の範囲の配列を抽出
hoge                                   #確認してるだけです
head(table(hoge))                      #出現頻度を順番に表示
head(sort(table(hoge), decreasing=T))  #出現頻度上位を表示
table(hoge)["CGGGCCT"]                 #CGGGCCTの出現頻度を表示

hoge <- subseq(fasta, start=3, width=7)#指定した始点から一定範囲の配列を抽出
hoge                                   #確認してるだけです
table(hoge)["CGGGCCT"]                 #CGGGCCTの出現頻度を表示

hoge <- subseq(fasta, start=5, width=7)#指定した始点から一定範囲の配列を抽出
table(hoge)["CGGGCCT"]                 #CGGGCCTの出現頻度を表示

#以下はおまけ(コツが分かったので、可能なポジションを全て調査)
table(subseq(fasta, start=1, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=2, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=3, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=4, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=5, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=6, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=7, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=8, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=9, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=10, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=11, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=12, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=13, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=14, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=15, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=16, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=17, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=18, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=19, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=20, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=21, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=22, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=23, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=24, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=25, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=26, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=27, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=28, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=29, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=30, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=31, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=32, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=33, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=34, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=35, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=36, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=37, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=38, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=39, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=40, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=41, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=42, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=43, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=44, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=45, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=46, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=47, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=48, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=49, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=50, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=51, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=52, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=53, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=54, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=55, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=56, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=57, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=58, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=59, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=60, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=61, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=62, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=63, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=64, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=65, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=66, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=67, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=68, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=69, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=70, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=71, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=72, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=73, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=74, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=75, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=76, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=77, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=78, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=79, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=80, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=81, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=82, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=83, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=84, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=85, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=86, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=87, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=88, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=89, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=90, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=91, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=92, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=93, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=94, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=95, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=96, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=97, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=98, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=99, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=100, width=7))["CGGGCCT"]#一気に計算
table(subseq(fasta, start=101, width=7))["CGGGCCT"]#一気に計算

#以下はおまけ(forループを用いて美しく...初級)
param_kmer <- 7                        #k-merのkの値を指定
param_obj <- "CGGGCCT"                 #調べたいk-merを指定
Obs <- NULL                            #おまじない
for(i in 1:101){                       #ループを回す
    Obs <- c(Obs, table(subseq(fasta, start=i, width=param_kmer))[param_obj])#出現回数算出結果を格納
}
Obs[is.na(Obs)] <- 0                   #NAの位置に0を代入
head(Obs)                              #最初の6個の要素を表示
mean(Obs, na.rm=TRUE)                  #平均値
Exp <- mean(Obs, na.rm=TRUE)           #平均値をExpとして取り扱う
head(Obs/Exp)
plot(Obs/Exp, type="l", col="red")

#以下はおまけ(forループを用いて美しく...中級)
param_obj <- "CGGGCCT"                 #調べたいk-merを指定
Obs <- NULL                            #おまじない
for(i in 1:101){                       #ループを回す
    Obs <- c(Obs, table(subseq(fasta, start=i, width=nchar(param_obj)))[param_obj])#出現回数算出結果を格納
}
Obs[is.na(Obs)] <- 0                   #NAの位置に0を代入
head(Obs)                              #最初の6個の要素を表示
mean(Obs, na.rm=TRUE)                  #平均値
Exp <- mean(Obs, na.rm=TRUE)           #平均値をExpとして取り扱う
head(Obs/Exp)
plot(Obs/Exp, type="l", col="red")

#以下はおまけ(forループを用いて美しく...上級1)
param_len_ngs <- 107                   #リード長を指定
param_obj <- "CGGGCCT"                 #調べたいk-merを指定
Obs <- NULL                            #おまじない
hoge <- param_len_ngs - nchar(param_obj) + 1#positionの右端の値を計算してhogeに格納
for(i in 1:hoge){                      #ループを回す
    Obs <- c(Obs, table(subseq(fasta, start=i, width=nchar(param_obj)))[param_obj])#出現回数算出結果を格納
}
Obs[is.na(Obs)] <- 0                   #NAの位置に0を代入
head(Obs)                              #最初の6個の要素を表示
mean(Obs, na.rm=TRUE)                  #平均値
Exp <- mean(Obs, na.rm=TRUE)           #平均値をExpとして取り扱う
head(Obs/Exp)
plot(Obs/Exp, type="l", col="red")

#以下はおまけ(forループを用いて美しく...上級2)
param_obj <- "CGGGCCT"                 #調べたいk-merを指定
Obs <- NULL                            #おまじない
hoge <- width(fasta)[1] - nchar(param_obj) + 1#positionの右端の値を計算してhogeに格納
for(i in 1:hoge){                      #ループを回す
    Obs <- c(Obs, table(subseq(fasta, start=i, width=nchar(param_obj)))[param_obj])#出現回数算出結果を格納
}
Obs[is.na(Obs)] <- 0                   #NAの位置に0を代入
head(Obs)                              #最初の6個の要素を表示
mean(Obs, na.rm=TRUE)                  #平均値
Exp <- mean(Obs, na.rm=TRUE)           #平均値をExpとして取り扱う
head(Obs/Exp)
plot(Obs/Exp, type="l", col="red")
	

イントロ | NGS | 読み込み | FASTQ形式 | 応用

FASTQ形式ファイルを読み込むやり方を示します。ファイルサイズが数GBというレベルになってきてますので、 圧縮ファイルでの読み込みが基本となりつつあります。 しかし、一度に圧縮ファイル中の中身を一旦全て読み込むことも厳しい、あるいはもはやできない状態になってきています。 この背景を踏まえ、「応用」では、圧縮FASTQファイルを入力として、メモリオーバーフロー(スタックオーバーフロー;stack overflow) にならないように一部だけを読み込む手順を示します。まだ途中段階ですが、野間口達洋 氏提供情報をもとにいくつか試しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. small RNA-seqのgzip圧縮FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の7を実行して得られた カイコsmall RNA-seqデータ(Nie et al., BMC Genomics, 2013)です。 入力ファイルサイズは400Mb弱、11,928,428リードです。この中から最初の100000リード分をgzip圧縮ファイルとして出力しています。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta.gz"              #出力ファイル名を指定してout_fに格納
param <- 100000                        #抽出したいリード数を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq",#in_fで指定したファイルの読み込み
            skip=0, nrec=param)        #in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f,     #fastaの中身を指定したファイル名で保存
    format="fasta", compress=T, width=50)#fastaの中身を指定したファイル名で保存
	

2. small RNA-seqのgzip圧縮FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の7を実行して得られた 2015年6月18日現在(R ver. 3.2.0; Biostrings ver. 2.36.1)、エラーを吐かずにFASTQ形式のgzip圧縮ファイルは得られるのですが、、、 クオリティスコア部分が変です。つまり、このやり方はダメです。 おそらくreadDNAStringSet関数で読み込んだ情報の中にクオリティスコアが含まれていないため、 ダミーの「;」というスコアがそのまま表示されているだけだと思います。 readDNAStringSet関数でクオリティスコアを読み込むやり方(あるいは取り出し方)が分かった方は教えて下さいm(_ _)m

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fastq.gz"              #出力ファイル名を指定してout_fに格納
param <- 100000                        #抽出したいリード数を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readDNAStringSet(in_f, format="fastq",#in_fで指定したファイルの読み込み
            skip=0, nrec=param)        #in_fで指定したファイルの読み込み
fastq                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fastq, file=out_f,     #fastqの中身を指定したファイル名で保存
    format="fastq", compress=T)        #fastqの中身を指定したファイル名で保存
	

3. small RNA-seqのgzip圧縮FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

原始的なやり方ですが、とりあえずうまく動きます。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.fastq"                 #出力ファイル名を指定してout_fに格納
param <- 100000                        #抽出したいリード数を指定

#入力ファイルの読み込み
fastq <- readLines(in_f, n=param*4)    #in_fで指定したファイルの読み込み

#ファイルに保存
writeLines(fastq, con=out_f)           #fastqの中身を指定したファイル名で保存
	

イントロ | NGS | 読み込み | FASTQ形式 | description行の記述を整形

FASTQ形式ファイルに対して、 「目的の記述部分のみ抽出し、それを新たなdescription」としてFASTQ形式で保存するやり方などを示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

抽出例:「SRR037439.1 HWI-E4_6_30ACL:2:1:0:176 length=35」-->「SRR037439.1」

戦略:description行の" "を区切り文字として分割("SRR037439.1"と"HWI-E4_6_30ACL:2:1:0:176"と"length=35")し、分割後の1つ目の要素を抽出

writeFastq関数実行時にcompress=Fとして非圧縮FASTQ形式ファイルを出力しています。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fastq"                 #出力ファイル名を指定してout_fに格納
param1 <- " "                          #区切り文字を指定
param2 <- 1                            #分割後に抽出したい要素番号を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
id(fastq)                              #description情報を表示

#前処理
hoge <- strsplit(as.character(id(fastq)), param1, fixed=TRUE)#id(fastq)中の文字列をparam1で区切った結果をリスト形式でhogeに格納
description <- BStringSet(sapply(hoge,"[[", param2))#hogeのリスト中の(param2)番目の要素のみ取り出してdescriptionに格納

#本番
fastq <- ShortReadQ(sread(fastq), quality(fastq), description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
id(fastq)                              #description情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

2. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

抽出例:「SRR037439.1 HWI-E4_6_30ACL:2:1:0:176 length=35」-->「SRR037439.1」

戦略:description行の" "を区切り文字として分割("SRR037439.1"と"HWI-E4_6_30ACL:2:1:0:176"と"length=35")し、分割後の1つ目の要素を抽出

writeFastq関数実行時にcompress=Tとしてgzip圧縮FASTQ形式ファイルを出力しています。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fastq.gz"              #出力ファイル名を指定してout_fに格納
param1 <- " "                          #区切り文字を指定
param2 <- 1                            #分割後に抽出したい要素番号を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
id(fastq)                              #description情報を表示

#前処理
hoge <- strsplit(as.character(id(fastq)), param1, fixed=TRUE)#id(fastq)中の文字列をparam1で区切った結果をリスト形式でhogeに格納
description <- BStringSet(sapply(hoge,"[[", param2))#hogeのリスト中の(param2)番目の要素のみ取り出してdescriptionに格納

#本番
fastq <- ShortReadQ(sread(fastq), quality(fastq), description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
id(fastq)                              #description情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=T)   #fastqの中身を指定したファイル名で保存
	

3. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

抽出例:「SRR037439.1 HWI-E4_6_30ACL:2:1:0:176 length=35」-->「SRR037439.1」

戦略:description行の" "を区切り文字として分割("SRR037439.1"と"HWI-E4_6_30ACL:2:1:0:176"と"length=35")し、分割後の1つ目の要素を抽出

writeXStringSet関数実行時にcompress=Fとして非圧縮FASTA形式ファイルを出力しています。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- " "                          #区切り文字を指定
param2 <- 1                            #分割後に抽出したい要素番号を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
id(fastq)                              #description情報を表示

#前処理
hoge <- strsplit(as.character(id(fastq)), param1, fixed=TRUE)#id(fastq)中の文字列をparam1で区切った結果をリスト形式でhogeに格納
description <- BStringSet(sapply(hoge,"[[", param2))#hogeのリスト中の(param2)番目の要素のみ取り出してdescriptionに格納

#本番
fasta <- sread(fastq)                  #fastqの配列情報部分をfastaに格納
names(fasta) <- description            #description情報部分をfastaに追加
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

抽出例:「SRR037439.1 HWI-E4_6_30ACL:2:1:0:176 length=35」-->「SRR037439.1」

戦略:description行の" "を区切り文字として分割("SRR037439.1"と"HWI-E4_6_30ACL:2:1:0:176"と"length=35")し、分割後の1つ目の要素を抽出

writeXStringSet関数実行時にcompress=Tとしてgzip圧縮FASTA形式ファイルを出力しています。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.fasta.gz"              #出力ファイル名を指定してout_fに格納
param1 <- " "                          #区切り文字を指定
param2 <- 1                            #分割後に抽出したい要素番号を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
id(fastq)                              #description情報を表示

#前処理
hoge <- strsplit(as.character(id(fastq)), param1, fixed=TRUE)#id(fastq)中の文字列をparam1で区切った結果をリスト形式でhogeに格納
description <- BStringSet(sapply(hoge,"[[", param2))#hogeのリスト中の(param2)番目の要素のみ取り出してdescriptionに格納

#本番
fasta <- sread(fastq)                  #fastqの配列情報部分をfastaに格納
names(fasta) <- description            #description情報部分をfastaに追加
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", compress=T, width=50)#fastaの中身を指定したファイル名で保存
	

5. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

抽出例:「SRR037439.1 HWI-E4_6_30ACL:2:1:0:176 length=35」-->「SRR037439.1」

戦略:description行の" "を区切り文字として分割("SRR037439.1"と"HWI-E4_6_30ACL:2:1:0:176"と"length=35")し、分割後の1つ目の要素を抽出。 次に、"."を区切り文字として分割("SRR037439"と"1")し、分割後の2つ目の要素を抽出

writeFastq関数実行時にcompress=Fとして非圧縮FASTQ形式ファイルを出力しています。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.fastq"                 #出力ファイル名を指定してout_fに格納
param1 <- " "                          #区切り文字を指定
param2 <- 1                            #分割後に抽出したい要素番号を指定
param3 <- "."                          #区切り文字を指定
param4 <- 2                            #分割後に抽出したい要素番号を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
id(fastq)                              #description情報を表示

#前処理
hoge <- strsplit(as.character(id(fastq)), param1, fixed=TRUE)#id(fastq)中の文字列をparam1で区切った結果をリスト形式でhogeに格納
description <- BStringSet(sapply(hoge,"[[", param2))#hogeのリスト中の(param2)番目の要素のみ取り出してdescriptionに格納
hoge <- strsplit(as.character(description), param3, fixed=TRUE)#description中の文字列をparam3で区切った結果をリスト形式でhogeに格納
description <- BStringSet(sapply(hoge,"[[", param4))#hogeのリスト中の(param4)番目の要素のみ取り出してdescriptionに格納

#本番
fastq <- ShortReadQ(sread(fastq), quality(fastq), description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
id(fastq)                              #description情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

6. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

抽出例:「SRR037439.1 HWI-E4_6_30ACL:2:1:0:176 length=35」-->「SRR037439.1」

戦略:description行の" "を区切り文字として分割("SRR037439.1"と"HWI-E4_6_30ACL:2:1:0:176"と"length=35")し、分割後の1つ目の要素を抽出。 次に、"."を区切り文字として分割("SRR037439"と"1")し、分割後の2つ目の要素を抽出

writeXStringSet関数実行時にcompress=Fとして非圧縮FASTA形式ファイルを出力しています。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- " "                          #区切り文字を指定
param2 <- 1                            #分割後に抽出したい要素番号を指定
param3 <- "."                          #区切り文字を指定
param4 <- 2                            #分割後に抽出したい要素番号を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
id(fastq)                              #description情報を表示

#前処理
hoge <- strsplit(as.character(id(fastq)), param1, fixed=TRUE)#id(fastq)中の文字列をparam1で区切った結果をリスト形式でhogeに格納
description <- BStringSet(sapply(hoge,"[[", param2))#hogeのリスト中の(param2)番目の要素のみ取り出してdescriptionに格納
hoge <- strsplit(as.character(description), param3, fixed=TRUE)#description中の文字列をparam3で区切った結果をリスト形式でhogeに格納
description <- BStringSet(sapply(hoge,"[[", param4))#hogeのリスト中の(param4)番目の要素のみ取り出してdescriptionに格納

#本番
fasta <- sread(fastq)                  #fastqの配列情報部分をfastaに格納
names(fasta) <- description            #description情報部分をfastaに追加
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", compress=F, width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | NGS | 読み込み | SAM/BAM形式

マップ後 | 出力ファイルの読み込み | BAM形式 | についてをご覧ください。

イントロ | NGS | 読み込み | Illuminaの*_seq.txt

Illuminaの出力ファイルで、初期のものは*_seq.txtというものらしいです。実際の生の配列データファイルは数百程度に分割されています。 ここでは、そのファイル群がおさめられているディレクトリ(例:tmp)を指定して、その中の「*_seq.txt」ファイル群について一気に行う方法を示します。 ここでは、(s_1_0001_seq.txts_1_0007_seq.txtの二つのファイルを含む; それぞれ1394行および826行からなる)フォルダを指定して読み込み、multi-FASTA形式で出力するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 指定したディレクトリ中に*_seq.txtという形式のファイルしかないという前提のもとで行う場合:

out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param <- "kkk"                         #FASTA形式ファイルのdescription行に記述する内容を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- c(rep(list(NULL), 4), "DNAString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。最初の4列には"NULL"を、最後の5列目には"DNAString"というベクトルを作成してcolClassesに格納している
fasta <- readXStringColumns(getwd(), pattern="", colClasses = colClasses)[[1]]#colClassesで指定した列(この場合5列目)をreadXStringColumns関数を用いて読み込むことでXStringSetオブジェクト(この場合"X"は"DNA"に相当)にした結果をfastaに格納
names(fasta) <- paste(param, 1:length(fasta), sep="_")#(multi-)FASTA形式のdescription部分を作成している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. param2で指定した"s_1_*_seq.txt"という感じのファイル名のもののみ読み込む場合:

out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- "kkk"                        #FASTA形式ファイルのdescription行に記述する内容
param2 <- "s_1_.*_seq.txt"             #"s_1_*_seq.txt"という感じのファイル名のものを読み込みたい場合("."の有無に注意!!)

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
files <- list.files(getwd(), pattern=param2)#param2で指定した正規表現にマッチする文字列を含むファイルのリストをfilesに格納
strsplit(readLines(files[[1]],1), "\t")#filesで読み込んだファイルのリストについて、最初のファイルの一行目をタブで区切って表示させているだけ。5列目のデータが塩基配列情報だということを確認しているにすぎない。
colClasses <- c(rep(list(NULL), 4), "DNAString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。最初の4列には"NULL"を、最後の5列目には"DNAString"というベクトルを作成してcolClassesに格納している
fasta <- readXStringColumns(getwd(), pattern=param2, colClasses=colClasses)[[1]]#colClassesで指定した列(この場合5列目)をreadXStringColumns関数を用いて読み込むことでXStringSetオブジェクト(この場合"X"は"DNA"に相当)にした結果をfastaに格納
names(fasta) <- paste(param1, 1:length(fasta), sep="_")#(multi-)FASTA形式のdescription部分を作成している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | NGS | 読み込み | Illuminaの*_qseq.txt

Illuminaの出力ファイルで、比較的最近のは*_qseq.txtというものらしいです。実際の生の配列データファイルは数百程度に分割されています。ここでは、そのファイル群がおさめられているディレクトリ(例:tmp)を指定して、その中の「*_qseq.txt」ファイル群について一気に行う方法を示します。ここでは、(s_1_1_0005_qseq.txts_1_1_0015_qseq.txtの二つのファイルを含む; それぞれ114行および73行からなる)フォルダを指定して読み込み、multi-FASTA形式で出力するやり方を示します。

*_qseq.txtファイルは全部で11列あり、9列目が塩基配列情報、10列目がquality情報を含んでいるので、その列の部分のみを抽出しているだけです。尚、指定したディレクトリ中に*_qseq.txtという形式のファイルしかなく、全てのファイルを取り扱いたいという前提となっています。

FASTQ形式といっても様々なバリエーション(Illumina FASTQやSanger FASTQなど)があります。Illumina *_qseq.txt中のquality scoreの値をそのまま用いてFASTQ形式で保存すればIllumina FASTQ形式ファイル上で取り扱うスコアとなります。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 配列情報のみ抽出したい場合:

param1 <- "kkk"                        #description行に記述する内容を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[9] <- c("DNAString")        #9列目が"DNAString"だという情報を与えている
fasta <- readXStringColumns(getwd(), pattern="", colClasses = colClasses)[[1]]#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をfastaに格納

#後処理(description部分を追加)
names(fasta) <- paste(param1, 1:length(fasta), sep="_")#description部分を作成している
fasta                                  #確認してるだけです
	

2. Illumina FASTQ形式でdescription行が"kkk_..."のようにしたい場合:

param1 <- "kkk"                        #description行に記述する内容

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[9:10] <- c("DNAString", "BString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。9, 10列目がそれぞれ"DNAString", "BString"だという情報を与えている
hoge <- readXStringColumns(getwd(), pattern="", colClasses = colClasses)#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をhogeに格納

#前処理(description部分を作成)
description <- paste(param1, 1:length(hoge[[1]]), sep="_")#description部分を作成している
description <- BStringSet(description) #型変換をしている

#本番(FASTQ形式のオブジェクトに変換)
fastq <- ShortReadQ(hoge[[1]], hoge[[2]], description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示
id(fastq)                              #description情報を表示
	

3. Illumina FASTQ形式で、descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしたい場合:

つまり、descriptionのところをqseq形式ファイルの「3列目(レーン番号)」:「4列目」:「5列目」:「6列目」:「11列目(pass filterフラグ情報)」で表すということ。

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[c(3:6,9:11)] <- c("BString","BString","BString","BString","DNAString", "BString", "BString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。例えば9列目が"DNAString"だという情報を与えている
hoge <- readXStringColumns(getwd(), pattern="", colClasses=colClasses)#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をhogeに格納

#前処理(description部分を作成)
description <- paste(hoge[[1]], hoge[[2]], hoge[[3]], hoge[[4]], hoge[[7]], sep=":")#description部分を作成している
description <- BStringSet(description) #型変換をしている

#本番(FASTQ形式のオブジェクトに変換)
fastq <- ShortReadQ(hoge[[5]], hoge[[6]], description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示
id(fastq)                              #description情報を表示
	

イントロ | ファイル形式の変換 | について

少し整理しました。(2018.05.30)。R内で用いるオブジェクトの型変換については、 「解析 | 前処理 | 型変換 | について」 をご覧ください。

R用:

R以外:

イントロ | ファイル形式の変換 | BAM --> BED

BAM形式のマッピング結果ファイル(拡張子が"bam"という前提です)を読み込んでBED形式に変換するやり方を示します。拡張子が"bed"の出力ファイルが自動生成されます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. sample_RNAseq1.bamの場合(GenomicAlignmentsパッケージ利用):

in_f <- "sample_RNAseq1.bam"           #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(GenomicAlignments)             #パッケージの読み込み

#入力ファイルの読み込み
hoge <- readGAlignments(in_f)          #BAM形式ファイルを読み込んだ結果をhogeに格納
hoge <- as.data.frame(hoge)            #データフレーム形式に変換

#本番(BED形式ファイルの最初の3列分に相当する情報を抽出)
tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納

#ファイルに保存
out_f <- sub(".bam", ".bed", in_f)     #BED形式ファイル名を作成した結果をout_fに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
	

2. sample_RNAseq1.bamの場合(Rsamtoolsパッケージ利用):

in_f <- "sample_RNAseq1.bam"           #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(Rsamtools)                     #パッケージの読み込み

#入力ファイルの読み込み
param_what <- c("rname", "pos", "qwidth", "strand")#左記の情報のみ読み込むという指令をparam_whatに格納
param_flag <- scanBamFlag(isUnmappedQuery=FALSE)#mappedされたもののみ読み込むという指令をparam_flagに格納
param_bam <- ScanBamParam(what=param_what, flag=param_flag)#BAM形式ファイルを読み込んだ結果をhogeに格納
hoge <- scanBam(in_f, param=param_bam)[[1]]#BAM形式ファイルを読み込んだ結果をhogeに格納

#ファイルに保存
tmp <- cbind(as.character(hoge$rname), #BED形式ファイルの1列目に相当する情報と
            hoge$pos,                  #BED形式ファイルの2列目に相当する情報と
            (hoge$qwidth+hoge$pos-1))  #BED形式ファイルの3列目に相当する情報を列方向で結合した結果をtmpに格納
out_f <- sub(".bam", ".bed", in_f)     #BED形式ファイル名を作成した結果をout_fに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
	

イントロ | ファイル形式の変換 | FASTQ --> FASTA

Sanger FASTQ形式ファイルを読み込んでFASTA形式で出力するやり方を示します。 gzip圧縮FASTQファイルを読み込んでgzip圧縮FASTAファイル出力することもできます(WindowsはできるがMacはできないらしい)。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。 配列長が同じであることが既知の場合です。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. 配列長が異なるsample2.fastqの場合:

うまくいかない例です

in_f <- "sample2.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. 配列長が異なるsample2.fastqの場合:

うまくいく例です。

in_f <- "sample2.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.fasta"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
fasta <- sread(fastq)                  #fastqの配列情報部分をfastaに格納
names(fasta) <- id(fastq)              #description情報部分をfastaに追加
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。 配列長が同じであってもreadFastq関数で読み込むことができます。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.fasta"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
fasta <- sread(fastq)                  #fastqの配列情報部分をfastaに格納
names(fasta) <- id(fastq)              #description情報部分をfastaに追加
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

5. サンプルデータ7のgzip圧縮FASTQ形式ファイル(SRR037439.fastq.gz)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。 配列長が同じであることが既知の場合です。 gzip圧縮FASTQファイルを読み込んで非圧縮FASTAファイルで出力するやり方です。

in_f <- "SRR037439.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.fasta"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

6. サンプルデータ7のgzip圧縮FASTQ形式ファイル(SRR037439.fastq.gz)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。 配列長が同じであることが既知の場合です。 gzip圧縮FASTQファイルを読み込んでgzip圧縮FASTAファイルで出力するやり方です。

in_f <- "SRR037439.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.fasta.gz"              #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", compress=T, width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | ファイル形式の変換 | Genbank --> FASTA

Genbank形式ファイルを読み込んでFASTA形式で出力するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. NM_138957.gbkの場合:

NM_138957のページからGenbank形式で保存したものですが、 デフォルトの拡張子が.gbではうまく保存できなかったので*.gbkと変更しています。

in_f <- "NM_138957.gbk"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(seqinr)                        #パッケージの読み込み

#本番
gb2fasta(source.file=in_f, destination.file=out_f)#in_fで指定したファイルを読み込んでout_fで指定したファイルで出力
	

イントロ | ファイル形式の変換 | GFF3 --> GTF

GFFはGeneral Feature Formatの略で、version 3とversion 2があります。 私の認識では、version 3がGFF3で、version 2がGTFです。しかしながら、GFF version 2を少し改良したものがGTF形式という意見もあるようです。 ここでは、rtracklayerパッケージを用いて、GFF3形式ファイルを読み込んでGTF形式(GFF version 2)で出力するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.chromosome.Chromosome.gff3の場合:

出力ファイルはhoge1.gtfです。

in_f <- "Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_fに格納
out_f <- "hoge1.gtf"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(rtracklayer)                   #パッケージの読み込み

#本番
export(import(in_f), out_f, format="gtf")#GTFに変換
	

イントロ | ファイル形式の変換 | qseq --> FASTA

Illuminaの*_qseq.txtファイル群がおさめられている(例:s_1_1_0005_qseq.txts_1_1_0015_qseq.txtの二つのファイルを含む; それぞれ114行および73行からなる)フォルダを指定して読み込むやり方を示します。

*_qseq.txtファイルは全部で11列あり、9列目が塩基配列情報、10列目がquality情報を含んでいます。尚、指定したディレクトリ中に*_qseq.txtという形式のファイルしかなく、全てのファイルを取り扱いたいという前提となっています。また、descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしています。

FASTQ形式といっても様々なバリエーション(Illumina FASTQやSanger FASTQなど)があります。Illumina *_qseq.txt中のquality scoreの値をそのまま用いてFASTQ形式で保存すればIllumina FASTQ形式ファイルとなります。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. description行が"kkk_..."のようにしたい場合:

out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- "kkk"                        #description行に記述する内容

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[9] <- c("DNAString")        #9列目が"DNAString"だという情報を与えている
fasta <- readXStringColumns(getwd(), pattern="", colClasses = colClasses)[[1]]#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をfastaに格納
names(fasta) <- paste(param1, 1:length(fasta), sep="_")#description部分を作成している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしたい場合:

つまり、descriptionのところをqseq形式ファイルの「3列目(レーン番号)」:「4列目」:「5列目」:「6列目」:「11列目(pass filterフラグ情報)」で表すということ。

out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[c(3:6,9:11)] <- c("BString","BString","BString","BString","DNAString", "BString", "BString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。例えば9列目が"DNAString"だという情報を与えている
hoge <- readXStringColumns(getwd(), pattern="", colClasses=colClasses)#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をhogeに格納

#前処理(description部分を作成)
description <- paste(hoge[[1]], hoge[[2]], hoge[[3]], hoge[[4]], hoge[[7]], sep=":")#description部分を作成している
description <- BStringSet(description) #型変換をしている

#本番(FASTA形式のオブジェクトに変換)
fasta <- hoge[[5]]                     #配列情報部分をfastaに格納
names(fasta) <- description            #description情報部分をfastaに追加
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

イントロ | ファイル形式の変換 | qseq --> Illumina FASTQ

Illuminaの*_qseq.txtファイル群がおさめられている(例:s_1_1_0005_qseq.txts_1_1_0015_qseq.txtの二つのファイルを含む; それぞれ114行および73行からなる)フォルダを指定して読み込むやり方を示します。

*_qseq.txtファイルは全部で11列あり、9列目が塩基配列情報、10列目がquality情報を含んでいます。 尚、指定したディレクトリ中に*_qseq.txtという形式のファイルしかなく、全てのファイルを取り扱いたいという前提となっています。 また、descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしています。 FASTQ形式といっても様々なバリエーション(Illumina FASTQやSanger FASTQなど)があります。 Illumina *_qseq.txt中のquality scoreの値をそのまま用いてFASTQ形式で保存すればIllumina FASTQ形式ファイルとなります。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしたい場合:

descriptionのところをqseq形式ファイルの「3列目(レーン番号)」:「4列目」:「5列目」:「6列目」:「11列目(pass filterフラグ情報)」で表すやり方です。 writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。 ここではcompress=Fとして非圧縮ファイルを出力しています。

out_f <- "hoge1.fastq"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[c(3:6,9:11)] <- c("BString","BString","BString","BString","DNAString", "BString", "BString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。例えば9列目が"DNAString"だという情報を与えている
hoge <- readXStringColumns(getwd(), pattern="", colClasses=colClasses)#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をhogeに格納

#前処理(description部分を作成)
description <- paste(hoge[[1]], hoge[[2]], hoge[[3]], hoge[[4]], hoge[[7]], sep=":")#description部分を作成している
description <- BStringSet(description) #型変換をしている

#本番(FASTQ形式のオブジェクトに変換)
fastq <- ShortReadQ(hoge[[5]], hoge[[6]], description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示
id(fastq)                              #description情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

2. descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしつつ、一番右側に"/2"の記述を追加したい場合:

writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。 ここではcompress=Fとして非圧縮ファイルを出力しています。

out_f <- "hoge2.fastq"                 #出力ファイル名を指定してout_fに格納
param <- "/2"                          #description行に追加したい情報を格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[c(3:6,9:11)] <- c("BString","BString","BString","BString","DNAString", "BString", "BString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。例えば9列目が"DNAString"だという情報を与えている
hoge <- readXStringColumns(getwd(), pattern="", colClasses=colClasses)#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をhogeに格納

#前処理(description部分を作成)
description <- paste(hoge[[1]], hoge[[2]], hoge[[3]], hoge[[4]], hoge[[7]], sep=":")#description部分を作成している
description <- BStringSet(paste(description, param, sep=""))#paramで指定した記述内容を追加している

#本番(FASTQ形式のオブジェクトに変換)
fastq <- ShortReadQ(hoge[[5]], hoge[[6]], description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示
id(fastq)                              #description情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

イントロ | ファイル形式の変換 | qseq --> Sanger FASTQ

Illuminaの*_qseq.txtファイル群がおさめられている(例:s_1_1_0005_qseq.txts_1_1_0015_qseq.txtの二つのファイルを含む; それぞれ114行および73行からなる)フォルダを指定して読み込むやり方を示します。

*_qseq.txtファイルは全部で11列あり、9列目が塩基配列情報、10列目がquality情報を含んでいます。 尚、指定したディレクトリ中に*_qseq.txtという形式のファイルしかなく、全てのファイルを取り扱いたいという前提となっています。また、descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしています。

2013/08/18までは、例えば「Illumina ASCII 64」に相当する"@"を「Sanger ASCII 33」に相当する"!"などと一文字ずつ変換していましたが、forループを用いて一度に変換する美しいスクリプトに変更しました。

基本的にはIllumina ASCIIコードに「-31」することでSanger ASCIIコードに変換できるので、Phred score = 0に相当する「Illumina ASCII 64」から、Phred score = 61に相当する「Illumina ASCII 126」までの範囲をSanger ASCIIコードに変換しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしたい場合:

descriptionのところをqseq形式ファイルの「3列目(レーン番号)」:「4列目」:「5列目」:「6列目」:「11列目(pass filterフラグ情報)」で表すやり方です。 writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。 ここではcompress=Fとして非圧縮ファイルを出力しています。

out_f <- "hoge1.fastq"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[c(3:6,9:11)] <- c("BString","BString","BString","BString","DNAString", "BString", "BString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。例えば9列目が"DNAString"だという情報を与えている
hoge <- readXStringColumns(getwd(), pattern="", colClasses=colClasses)#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をhogeに格納

#前処理(description部分を作成)
description <- paste(hoge[[1]], hoge[[2]], hoge[[3]], hoge[[4]], hoge[[7]], sep=":")#description部分を作成している
description <- BStringSet(description) #型変換をしている

#本番(Illumina qualityスコアをSanger qualityスコアに変換)
qscore <- hoge[[6]]                    #readのquality情報部分をqscoreに格納
for(i in 64:126){                      #Illumina ASCIIコードの64-126の範囲をSanger ASCIIコードの33-95に変換するループ
   qscore <- chartr(rawToChar(as.raw(i)), rawToChar(as.raw(i - 31)), qscore)#qscore中の文字列を置換(as.raw関数で整数をASCIIコードに変換し、rawToChar関数でASCIIコードをASCII文字に変換しています)
}

#後処理(FASTQ形式のオブジェクトに変換)
fastq <- ShortReadQ(hoge[[5]], qscore, description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示
id(fastq)                              #description情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

2. descriptionのところが通常のqseq2fastq.plの出力結果とほぼ同等の形式にしつつ、一番右側に"/2"の記述を追加したい場合:

writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。 ここではcompress=Fとして非圧縮ファイルを出力しています。

out_f <- "hoge2.fastq"                 #出力ファイル名を指定してout_fに格納
param <- "/2"                          #description行に追加したい情報を格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
colClasses <- rep(list(NULL), 11)      #DNAStringSetというオブジェクト形式にするための情報を予め作成している。初期値として全11列に"NULL"を与えている
colClasses[c(3:6,9:11)] <- c("BString","BString","BString","BString","DNAString", "BString", "BString")#DNAStringSetというオブジェクト形式にするための情報を予め作成している。例えば9列目が"DNAString"だという情報を与えている
hoge <- readXStringColumns(getwd(), pattern="", colClasses=colClasses)#colClassesで指定した列を読み込んでXStringSetオブジェクトにした結果をhogeに格納

#前処理(description部分を作成)
description <- paste(hoge[[1]], hoge[[2]], hoge[[3]], hoge[[4]], hoge[[7]], sep=":")#description部分を作成している
description <- BStringSet(paste(description, param, sep=""))#paramで指定した記述内容を追加している

#本番(Illumina qualityスコアをSanger qualityスコアに変換)
qscore <- hoge[[6]]                    #readのquality情報部分をqscoreに格納
for(i in 64:126){                      #Illumina ASCIIコードの64-126の範囲をSanger ASCIIコードの33-95に変換するループ
   qscore <- chartr(rawToChar(as.raw(i)), rawToChar(as.raw(i - 31)), qscore)#qscore中の文字列を置換(as.raw関数で整数をASCIIコードに変換し、rawToChar関数でASCIIコードをASCII文字に変換しています)
}

#後処理(FASTQ形式のオブジェクトに変換)
fastq <- ShortReadQ(hoge[[5]], qscore, description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示
id(fastq)                              #description情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

前処理 | クオリティコントロール | について

数億~数十億リードからなるNGSデータの全体的な精度チェック、クオリティの低いリードのフィルタリング、 リードに含まれるアダプター/プライマー配列(adapters/primers)やクオリティの低い配列部分の除去(トリミング; trimming)などを実行する様々な方法をリストアップします。 Krakenなどアダプター配列除去などが行えるものも含みます。 2014年ごろまでは、FASTQファイルに対するQuality Control (QC)用プログラムをリストアップしていましたが、 Lun et al., F1000Res., 2016のようなsingle-cell RNA-seq (scRNA-seq)のカウントデータのQCなども含めています。(2019年3月28日追加)。

R用:

R以外:

Review、ガイドライン、パイプライン系:

前処理 | クオリティチェック | QuasR(Gaidatzis_2015)

QuasRパッケージを用いてQCレポートファイルを出力するやり方を示します。 FastQCのR版のようなものです。 qrqcよりも相当ストイックな出力結果です...。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ7のgzip圧縮FASTQ形式ファイル(SRR037439.fastq.gz)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

in_f <- "SRR037439.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.pdf"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番
qQCReport(in_f, pdfFilename=out_f)     #pdfレポートファイルの作成
	

2. サンプルデータ7の非圧縮FASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.pdf"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番
qQCReport(in_f, pdfFilename=out_f)     #pdfレポートファイルの作成
	

3. FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

カイコsmall RNA-seqデータ(Nie et al., BMC Genomics, 2013; 約375MB)です。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.pdf"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番
qQCReport(in_f, pdfFilename=out_f)     #pdfレポートファイルの作成
	

4. FASTQ形式ファイル(SRR616268sub_1.fastq.gz)の場合:

乳酸菌RNA-seqデータSRR616268の最初の100万リード分(約73MB)です。

in_f <- "SRR616268sub_1.fastq.gz"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.pdf"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番
qQCReport(in_f, pdfFilename=out_f)     #pdfレポートファイルの作成
	

前処理 | クオリティチェック | qrqc

FastQCのR版のようなものです。 Sanger FASTQ形式ファイルを読み込んで、positionごとの「クオリティスコア(quality score)」、 「どんな塩基が使われているのか(base frequency and base proportion)」、「リード長の分布」、 「GC含量」、「htmlレポート」などを出力してくれます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです (Bullard et al., 2010)。 下記を実行すると「SRR037439-report」という名前のフォルダが作成されます。 中にあるreport.htmlをダブルクリックするとhtmlレポートを見ることができます。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(qrqc)                          #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readSeqFile(in_f, quality="sanger")#in_fで指定したファイルの読み込み

#本番
makeReport(fastq)                      #htmlレポートの作成
	

2. サンプルデータ25のFASTQ形式ファイル(SRR633902_1_sub.fastq)の場合:

SRR633902から得られるFASTQファイルの最初の2,000行分を抽出したヒトデータです (Chan et al., Hum. Mol. Genet., 2013)。 下記を実行すると「SRR633902_1_sub」という名前のフォルダが作成されます。中にあるreport.htmlをダブルクリックするとhtmlレポートを見ることができます。 「Error : Insufficient values in manual scale. 2 needed but only 1 provided.」というエラーが出ることは確認済みですが、htmlファイルは作成されます。

in_f <- "SRR633902_1_sub.fastq"        #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(qrqc)                          #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readSeqFile(in_f, quality="sanger")#in_fで指定したファイルの読み込み

#本番
makeReport(fastq)                      #htmlレポートの作成
	

3. FASTQ形式ファイル(SRR609266_sub.fastq)の場合:

前処理 | フィルタリング | 任意のリード(サブセット)を抽出の8を実行して得られた カイコsmall RNA-seqデータ(Nie et al., BMC Genomics, 2013; 100000リード; 約16MB)です。 下記を実行すると「SRR609266_sub」という名前のフォルダが作成されます。中にあるreport.htmlをダブルクリックするとhtmlレポートを見ることができます。 元のgzip圧縮FASTQファイルはNCBI SRAから取得したものであるため、本来はSanger Quality Scoreなはずです。 つまり、readSeqFile関数で読み込む際のデフォルトはquality="sanger"でよいはずです。 しかし、スコア分布的に用いたIllumina pipelineのバージョンが 1.3から1.7なんじゃないかなと思った(スコア分布が概ね30-40近辺にあるはずだという思想)ので、+33のSangerではなく+64のilluminaに独断で行っています。 このあたりの判定は現実問題としては、結構厄介です(Cock et al., 2010)。

in_f <- "SRR609266_sub.fastq"          #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(qrqc)                          #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readSeqFile(in_f, quality="illumina")#in_fで指定したファイルの読み込み

#本番
makeReport(fastq)                      #htmlレポートの作成
	

4. サンプルデータ7のgzip圧縮FASTQ形式ファイル(SRR037439.fastq.gz)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。 gzip圧縮ファイルの入力に対応していないのでエラーが出ます。

in_f <- "SRR037439.fastq.gz"           #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(qrqc)                          #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readSeqFile(in_f, quality="sanger")#in_fで指定したファイルの読み込み

#本番
makeReport(fastq)                      #htmlレポートの作成
	

4. FASTQ形式ファイル(SRR616268sub_1.fastq.gz)の場合:

乳酸菌RNA-seqデータSRR616268の最初の100万リード分(gzip圧縮状態で約73MB)です。 qrqcパッケージはgzip圧縮ファイルの入力に対応していないので、自力でどうにかして解凍してください。 下記を実行すると「SRR609266_sub」という名前のフォルダが作成されます。中にあるreport.htmlをダブルクリックするとhtmlレポートを見ることができます。 元のgzip圧縮FASTQファイルはNCBI SRAから取得したものであるため、本来はSanger Quality Scoreなはずです。 つまり、readSeqFile関数で読み込む際のデフォルトはquality="sanger"でよいはずです。 しかし、スコア分布的に用いたIllumina pipelineのバージョンが 1.3から1.7なんじゃないかなと思った(スコア分布が概ね30-40近辺にあるはずだという思想)ので、+33のSangerではなく+64のilluminaに独断で行っています。 このあたりの判定は現実問題としては、結構厄介です(Cock et al., 2010)。

in_f <- "SRR616268sub_1.fastq"      #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(qrqc)                          #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readSeqFile(in_f, quality="illumina")#in_fで指定したファイルの読み込み

#本番
makeReport(fastq)                      #htmlレポートの作成
	

前処理 | クオリティチェック | PHREDスコアに変換

ここでは、NCBI Sequence Read Archive (SRA)から得られる(従ってSanger FASTQ形式)FASTQ形式ファイルを読み込んでPHREDスコアに変換したり、そのboxplotを描画するやり方を示します。

PHREDスコアは、ベースコール(A, C, G, Tの四種類の塩基のうちのどの塩基かを決めること)のクオリティを示すp値(低ければ低いほどそのベースコールの信頼性が高いことを意味する)を二桁の整数値に変換したものであり、PHRED score = -10 * log10(p)で計算されます。

例えば、

のように計算されますので、PHREDスコアが高いほどそのベースコールの信頼性が高いことを意味します。

例題で解析しているファイルは全リードのほんの一部なので、ばらつきはありますが、5'側のベースコールのクオリティは高く、3'側に読み進んでいくほどPHREDスコアが低くなる傾向にあることが読み取れます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

PHREDスコア変換後、その数値情報をタブ区切りテキストファイルで保存するやり方です。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み

#本番(PHREDスコアに変換)
out <- as(quality(fastq), "matrix")    #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をoutに格納
dim(out)                               #行数と列数を確認しているだけ
colnames(out) <- 1:ncol(out)           #列名を付与
rownames(out) <- as.character(id(fastq))#行名を付与

#ファイルに保存
tmp <- cbind(rownames(out), out)       #outの左側に行名を結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

PHREDスコア変換後、スコア分布をboxplotで描くやり方です。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み

#本番(PHREDスコアに変換)
out <- as(quality(fastq), "matrix")    #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をoutに格納
dim(out)                               #行数と列数を確認しているだけ
colnames(out) <- 1:ncol(out)           #列名を付与
rownames(out) <- as.character(id(fastq))#行名を付与

#本番(boxplot)
boxplot(as.data.frame(out), outline=FALSE, xlab="cycle number", ylab="PHRED score")#outをdata.frame形式にしてboxplotを描画(outline=FALSEの意味は、外れ値を描画しない、です。)
	

3. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

PHREDスコア変換後、スコア分布のboxplotをpngファイルに保存するやり方です。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み

#本番(PHREDスコアに変換)
out <- as(quality(fastq), "matrix")    #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をoutに格納
dim(out)                               #行数と列数を確認しているだけ
colnames(out) <- 1:ncol(out)           #列名を付与
rownames(out) <- as.character(id(fastq))#行名を付与

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
boxplot(as.data.frame(out), outline=FALSE, xlab="cycle number", ylab="PHRED score")#outをdata.frame形式にしてboxplotを描画(outline=FALSEの意味は、外れ値を描画しない、です。)
dev.off()                              #おまじない
	

4. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

例題3と基本的に同じですが、y軸のPhredスコアの範囲を任意に指定するやり方です。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_yrange <- c(5, 40)               #表示したい縦軸の範囲を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み

#本番(PHREDスコアに変換)
out <- as(quality(fastq), "matrix")    #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をoutに格納
dim(out)                               #行数と列数を確認しているだけ
colnames(out) <- 1:ncol(out)           #列名を付与
rownames(out) <- as.character(id(fastq))#行名を付与

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
boxplot(as.data.frame(out), outline=FALSE, xlab="cycle number", ylab="PHRED score", ylim=param_yrange)#outをdata.frame形式にしてboxplotを描画(outline=FALSEの意味は、外れ値を描画しない、です。)
dev.off()                              #おまじない
	

前処理 | クオリティチェック | 配列長分布を調べる

FASTAまたはFASTQ形式ファイルを読み込んで配列長分布を得るやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample2.fasta)の場合:

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
out <- table(width(fasta))             #長さごとの出現頻度情報を得た結果をoutに格納
out                                    #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

2. FASTQ形式ファイル(sample2.fastq)の場合:

in_f <- "sample2.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
out <- table(width(fastq))             #長さごとの出現頻度情報を得た結果をoutに格納
out                                    #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

3. gzip圧縮FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

small RNA-seqデータ(ファイルサイズは400Mb弱、11,928,428リード、配列長49 bp)です。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
out <- table(width(fastq))             #長さごとの出現頻度情報を得た結果をoutに格納
out                                    #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

4. gzip圧縮FASTQ形式ファイル(hoge4.fastq.gz)の場合:

配列長の異なる仮想データファイルです。param_nbinsで50と指定すると、 1 bpおきに、1-50 bpまでのリード数が格納されます。

in_f <- "hoge4.fastq.gz"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_nbins <- 50                      #分割数(binの数)を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
out <- tabulate(width(fastq), param_nbins)#出現頻度情報を得た結果をoutに格納
out                                    #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

5. gzip圧縮FASTQ形式ファイル(hoge4.fastq.gz)の場合:

配列長の異なる仮想データファイルです。param_nbinsで50と指定すると、 1 bpおきに、1-50 bpまでのリード数が格納されます。 QuasRパッケージ(Gaidatzis et al., 2015) マニュアル中のbarplotを用いた作図形式に似せています。

in_f <- "hoge4.fastq.gz"               #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge5.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge5.png"                  #出力ファイル名を指定してout_f2に格納
param_nbins <- 50                      #分割数(binの数)を指定
param_fig <- c(700, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
out <- tabulate(width(fastq), param_nbins)#出現頻度情報を得た結果をoutに格納
out                                    #確認してるだけです

#ファイルに保存(テキストファイル)
names(out) <- 1:param_nbins            #x軸の数値情報取得
tmp <- cbind(names(out), out)          #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
barplot(out/sum(out)*100, xlab="Read length", ylab="Percent of reads")#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

前処理 | クオリティチェック | Overrepresented sequences | ShortRead(Morgan_2009)

ShortReadパッケージを用いてリードの種類ごとの出現回数をを得るやり方を示します。FastQCの Overrepresented sequencesの項目と同じような結果が得られます。 前処理 | フィルタリング | 重複のない配列セットを作成も基本的にやっていることは同じです。 ファイルに保存部分で「tmp <- cbind(names(out), out)」と書くのは冗長であるとの指摘を受けたので修正しました(野間口達洋 氏提供情報; 2015/07/29追加)。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. gzip圧縮FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

small RNA-seqデータ(ファイルサイズは400Mb弱、11,928,428リード、配列長49 bp)です。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
out <- table(sread(fastq))             #リードごとの出現頻度情報を得た結果をoutに格納
out <- sort(out, decreasing=T)         #出現頻度を降順にソートした結果をoutに格納
head(out)                              #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=T, col.names=F)#outの中身を指定したファイル名で保存
	

2. gzip圧縮FASTQ形式ファイル(hoge4.fastq.gz)の場合:

配列長の異なる仮想データファイルです。

in_f <- "hoge4.fastq.gz"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
out <- table(sread(fastq))             #リードごとの出現頻度情報を得た結果をoutに格納
out <- sort(out, decreasing=T)         #出現頻度を降順にソートした結果をoutに格納
head(out)                              #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=T, col.names=F)#outの中身を指定したファイル名で保存
	

3. gzip圧縮FASTQ形式ファイル(SRR616268sub_1.fastq.gz)の場合:

乳酸菌RNA-seqデータSRR616268の最初の100万リード分(約73MB)です。長さは全て107 bpです。

in_f <- "SRR616268sub_1.fastq.gz"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
out <- table(sread(fastq))             #リードごとの出現頻度情報を得た結果をoutに格納
out <- sort(out, decreasing=T)         #出現頻度を降順にソートした結果をoutに格納
head(out)                              #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=T, col.names=F)#outの中身を指定したファイル名で保存
	

4. gzip圧縮FASTQ形式ファイル(SRR616268sub_1.fastq.gz)の場合:

乳酸菌RNA-seqデータSRR616268の最初の100万リード分(約73MB)です。長さは全て107 bpです。 3.と基本的に同じですが、FastQCのデフォルトと同じく、最初の50bp分のみで解析するやり方です。 「イントロ | 一般 | 指定した範囲の配列を取得」のテクニックとの併用になります。

in_f <- "SRR616268sub_1.fastq.gz"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param <- c(1, 50)                      #抽出したい範囲の始点と終点を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
fasta <- sread(fastq)                  #fastaとして取り扱う
fasta                                  #確認してるだけです

#前処理(指定した範囲のみ抽出)
fasta <- subseq(fasta, start=param[1], end=param[2])#paramで指定した始点と終点の範囲の配列を抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#本番
out <- table(fasta)                    #リードごとの出現頻度情報を得た結果をoutに格納
out <- sort(out, decreasing=T)         #出現頻度を降順にソートした結果をoutに格納
head(out)                              #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=T, col.names=F)#outの中身を指定したファイル名で保存
	

前処理 | トリミング | ポリA配列除去 | ShortRead(Morgan_2009)

ShortReadパッケージを用いたmRNAの3'末端に存在するpoly A配列部分をトリムするやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample3.fasta)の場合:

許容するミスマッチ数を0としています。

in_f <- "sample3.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"#トリムしたい配列情報を指定してparam1に格納
param_mismatch <- 0                    #許容するミスマッチ数を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- trimLRPatterns(Rpattern=param1, subject=fasta, max.Rmismatch=rep(param_mismatch, nchar(param1)))#アダプター配列除去を行った結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. FASTA形式ファイル(sample3.fasta)の場合:

許容するミスマッチ数を1としています。

in_f <- "sample3.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"#トリムしたい配列情報を指定してparam1に格納
param_mismatch <- 1                    #許容するミスマッチ数を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- trimLRPatterns(Rpattern=param1, subject=fasta, max.Rmismatch=rep(param_mismatch, nchar(param1)))#アダプター配列除去を行った結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | トリミング | アダプター配列除去(基礎) | QuasR(Gaidatzis_2015)

QuasRパッケージを用いたアダプター/プライマー配列除去の基本形を示します。 param_nrecオプションは、一度に処理するリード数を指定しているところですが、基本的に無視で構いません。 デフォルトの1000000のときに、メモリ不足でフリーズしたので、デフォルトの半分の500000リードにしています。 処理時間はおそらく長くなりますが、エラーなく動くことのほうが重要です。 それでもフリーズするヒトは、ここの数値を200000などさらに小さくして対処してください。 2015年6月24日にparam_nrecが適切に反映されるように修正しました(中村浩正 氏提供情報)。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. gzip圧縮FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

small RNA-seqデータ(ファイルサイズは400Mb弱、11928428リード)です。 原著論文(Nie et al., BMC Genomics, 2013)中の記述から GSE41841を頼りに、 SRP016842にたどりつき、 イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の7を実行して得られたものが入力ファイルです。 原著論文の情報から、おそらくアダプター配列は"TGGAATTCTCGGGTGCCAAGGAACTCCAGTC..."という感じだろうと推測できます。 ここでは、アダプター配列以外はデフォルトで実行しています。 アダプター配列の位置は5'側(左側)ではなく3'側(右側)にあるという前提であり、右側のアダプター配列しかトリムしないやり方です。 それが、preprocessReads関数実行時にRpatternのみ記載している理由です。約5分。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_adapter <- "TGGAATTCTCGGGTGCCAAGGAACTCCAGTC"#アダプター配列を指定
param_nrec <- 500000                   #一度に処理するリード数を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(アダプター配列除去)
res <- preprocessReads(filename=in_f,  #in_fを入力とする
             outputFilename=out_f,     #out_fを出力とする
             Rpattern=param_adapter,   #リードの右側(Right)のアダプターを除去
             nrec=param_nrec)          #一度に処理するリード数
res                                    #確認してるだけです
	

2. gzip圧縮FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

small RNA-seqデータ(ファイルサイズは400Mb弱、11928428リード)です。 このファイルに対するFastQC実行結果として 「RNA PCR Primer, Index 1」(RPI1)が含まれているとレポートされました。これでググると塩基配列情報は "CAAGCAGAAGACGGCATACGAGATCGTGATGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA" と書いてあったので、これを入力として与えます。 アダプター配列の位置は5'側(左側)ではなく3'側(右側)にあるという前提であり、右側のアダプター配列しかトリムしないやり方です。 それが、preprocessReads関数実行時にRpatternのみ記載している理由です。約5分。 このやり方では、結論としてはうまくいきません。 理由はおそらくparam_adapterで指定している配列はプライマー配列なので、これの逆相補鎖(reverse complement)を与えないといけないんだと思います。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_adapter <- "CAAGCAGAAGACGGCATACGAGATCGTGATGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"#アダプター配列を指定
param_nrec <- 500000                   #一度に処理するリード数を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(アダプター配列除去)
res <- preprocessReads(filename=in_f,  #in_fを入力とする
             outputFilename=out_f,     #out_fを出力とする
             Rpattern=param_adapter,   #リードの右側(Right)のアダプターを除去
             nrec=param_nrec)          #一度に処理するリード数
res                                    #確認してるだけです
	

3. gzip圧縮FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

2.の対策としてparam_adapterとして与える配列は同じで、内部的に逆相補鎖(reverse complement)を作成して与えるやり方です。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_adapter <- "CAAGCAGAAGACGGCATACGAGATCGTGATGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"#アダプター配列を指定
param_nrec <- 500000                   #一度に処理するリード数を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(Biostrings)                    #パッケージの読み込み

#前処理(reverse complementの作成)
hoge <- reverseComplement(DNAString(param_adapter))#逆相補鎖(reverse complement)を作成

#本番(アダプター配列除去)
res <- preprocessReads(filename=in_f,  #in_fを入力とする
             outputFilename=out_f,     #out_fを出力とする
             Rpattern=as.character(hoge),#リードの右側(Right)のアダプターを除去
             nrec=param_nrec)          #一度に処理するリード数
res                                    #確認してるだけです
	

4. gzip圧縮FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

small RNA-seqデータ(ファイルサイズは400Mb弱、11928428リード)です。 このファイルに対するFastQC実行結果として 「RNA PCR Primer, Index 1」(RPI1)が含まれているとレポートされた49 bpをアダプター配列として入力しています。 ここでは、アダプター配列以外はデフォルトで実行しています。 アダプター配列の位置は5'側(左側)ではなく3'側(右側)にあるという前提であり、右側のアダプター配列しかトリムしないやり方です。 それが、preprocessReads関数実行時にRpatternのみ記載している理由です。約5分。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_adapter <- "TGGAATTCTCGGGTGCCAAGGAACTCCAGTCACATCACGATCTCGTATG"#アダプター配列を指定
param_nrec <- 500000                   #一度に処理するリード数を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(アダプター配列除去)
res <- preprocessReads(filename=in_f,  #in_fを入力とする
             outputFilename=out_f,     #out_fを出力とする
             Rpattern=param_adapter,   #リードの右側(Right)のアダプターを除去
             nrec=param_nrec)          #一度に処理するリード数
res                                    #確認してるだけです
file.size(in_f)                        #入力ファイルのサイズを表示
file.size(out_f)                       #出力ファイルのサイズを表示
	

5. gzip圧縮FASTQ形式ファイル(SRR616268sub_1.fastq.gz)の場合:

乳酸菌RNA-seqデータSRR616268の最初の100万リード分です。paired-endデータのforward側、約75MB(74,906,576 bytes)、全リード107 bpです。 FastQC実行結果(SRR616268sub_1_fastqc.html)として 「TruSeq Adapter, Index 3」が含まれているとレポートされました。これでググると塩基配列情報は "GATCGGAAGAGCACACGTCTGAACTCCAGTCACTTAGGCATCTCGTATGCCGTCTTCTGCTTG" と書いてあったので、これを入力として与えます。 アダプター配列の位置は5'側(左側)にあるという前提であり、左側のアダプター配列しかトリムしないやり方です。 それが、preprocessReads関数実行時にLpatternのみ記載している理由です。約2分。 出力ファイル(998,664リード、71,426,499 bytes)でもう一度FastQCを実行すると、「TruSeq Adapter, Index 3」がOverrepresented sequencesの項目から消えていることまでは確認しました。 しかし、まだ「TruSeq Adapter, Index 2」が残っています。 許容するN数(nBases)は1、最短配列長(minLength)は18がデフォルトなのでそれが自動的に適用されます。

in_f <- "SRR616268sub_1.fastq.gz"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_adapter <- "GATCGGAAGAGCACACGTCTGAACTCCAGTCACTTAGGCATCTCGTATGCCGTCTTCTGCTTG"#アダプター配列を指定
param_nrec <- 500000                   #一度に処理するリード数を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(アダプター配列除去)
res <- preprocessReads(filename=in_f,  #in_fを入力とする
             outputFilename=out_f,     #out_fを出力とする
             Lpattern=param_adapter,   #リードの左側(Left)のアダプターを除去
             nrec=param_nrec)          #一度に処理するリード数
res                                    #確認してるだけです
file.size(in_f)                        #入力ファイルのサイズを表示
file.size(out_f)                       #出力ファイルのサイズを表示
	

6. gzip圧縮FASTQ形式ファイル(SRR616268sub_1.fastq.gz)の場合:

このファイルに対するFastQC実行結果 (Overrepresented sequencesの項目)中には「TruSeq Adapter, Index 3」と「TruSeq Adapter, Index 2」が含まれているとレポートされました。 TruSeq Adapter, Index 1-27の塩基配列は、任意の一文字を表す「.」を用いることで "GATCGGAAGAGCACACGTCTGAACTCCAGTCAC......ATCTCGTATGCCGTCTTCTGCTTG" とすることができますので、これを入力として与えます。約2分。 現状ではエラーは吐きませんが、うまくトリムできないようです。正規表現に対応していないか、 ミスマッチとしてカウントされてしまっているか、、、でしょうか。

in_f <- "SRR616268sub_1.fastq.gz"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_adapter <- "GATCGGAAGAGCACACGTCTGAACTCCAGTCAC......ATCTCGTATGCCGTCTTCTGCTTG"#アダプター配列を指定
param_nrec <- 500000                   #一度に処理するリード数を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(アダプター配列除去)
res <- preprocessReads(filename=in_f,  #in_fを入力とする
             outputFilename=out_f,     #out_fを出力とする
             Lpattern=param_adapter,   #リードの左側(Left)のアダプターを除去
             nrec=param_nrec)          #一度に処理するリード数
res                                    #確認してるだけです
file.size(in_f)                        #入力ファイルのサイズを表示
file.size(out_f)                       #出力ファイルのサイズを表示
	

7. gzip圧縮FASTQ形式ファイル(hoge5.fastq.gz)の場合:

5.で得られたhoge5.fastq.gzファイル中には、 まだ「TruSeq Adapter, Index 2」が残っています。 「TruSeq Adapter, Index 2」の塩基配列情報は "GATCGGAAGAGCACACGTCTGAACTCCAGTCACCGATGTATCTCGTATGCCGTCTTCTGCTTG" と書いてあったので、これを入力として与えます。約2分。 この出力ファイル(hoge7.fastq.gz)と同じものが SRR616268sub_trim_1.fastq.gz(998,658リード、71,227,695 bytes)です。 FastQC実行結果はSRR616268sub_trim_1_fastqc.htmlです。 許容するN数(nBases)は1、最短配列長(minLength)は18がデフォルトなのでそれが自動的に適用されます。

in_f <- "hoge5.fastq.gz"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_adapter <- "GATCGGAAGAGCACACGTCTGAACTCCAGTCACCGATGTATCTCGTATGCCGTCTTCTGCTTG"#アダプター配列を指定
param_nrec <- 500000                   #一度に処理するリード数を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(アダプター配列除去)
res <- preprocessReads(filename=in_f,  #in_fを入力とする
             outputFilename=out_f,     #out_fを出力とする
             Lpattern=param_adapter,   #リードの左側(Left)のアダプターを除去
             nrec=param_nrec)          #一度に処理するリード数
res                                    #確認してるだけです
file.size(in_f)                        #入力ファイルのサイズを表示
file.size(out_f)                       #出力ファイルのサイズを表示
	

8. gzip圧縮FASTQ形式ファイル(SRR616268sub_2.fastq.gz)の場合:

乳酸菌RNA-seqデータSRR616268の最初の100万リード分です。paired-endデータのreverse側、約67MB、全リード93 bpです。 FastQC実行結果(SRR616268sub_2_fastqc.html)として 「Illumina Single End PCR Primer 1」が含まれているとレポートされました。これでググると塩基配列情報は "AATGATACGGCGACCACCGAGATCTACACTCTTTCCCTACACGACGCTCTTCCGATCT" と書いてあったので、これを入力として与えます。 アダプター配列の位置は5'側(左側)にあるという前提であり、左側のアダプター配列しかトリムしないやり方です。 それが、preprocessReads関数実行時にLpatternのみ記載している理由です。約2分。 この出力ファイル(hoge8.fastq.gz)と同じものが SRR616268sub_trim_2.fastq.gz(999,136リード、63,442,904 bytes)です。 FastQC実行結果はSRR616268sub_trim_2_fastqc.htmlです。 許容するN数(nBases)は1、最短配列長(minLength)は18がデフォルトなのでそれが自動的に適用されます。

in_f <- "SRR616268sub_2.fastq.gz"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge8.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_adapter <- "AATGATACGGCGACCACCGAGATCTACACTCTTTCCCTACACGACGCTCTTCCGATCT"#アダプター配列を指定
param_nrec <- 500000                   #一度に処理するリード数を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(Biostrings)                    #パッケージの読み込み

#前処理(reverse complementの作成)
hoge <- reverseComplement(DNAString(param_adapter))#逆相補鎖(reverse complement)を作成

#本番(アダプター配列除去)
res <- preprocessReads(filename=in_f,  #in_fを入力とする
             outputFilename=out_f,     #out_fを出力とする
             Lpattern=as.character(hoge),#リードの左側(Left)のアダプターを除去
             nrec=param_nrec)          #一度に処理するリード数
res                                    #確認してるだけです
file.size(in_f)                        #入力ファイルのサイズを表示
file.size(out_f)                       #出力ファイルのサイズを表示
	

前処理 | トリミング | アダプター配列除去(基礎) | girafe(Toedling_2010)

girafeパッケージを用いたアダプター配列除去を行うやり方を示します。アダプター配列除去を行うやり方を示します。

注意点1としては、実際に塩基配列長が短くなっていてもdescription行の記述(特に配列長情報の記述)は変わりませんので、「なんかおかしい」と気にしなくて大丈夫です。

注意点2としては、例えば、アダプター配列の5'側が「CATCG...」となっているにも関わらずなぜ二番目の配列の3'側「...CATAG」の最後の5塩基がトリムされているのだろう?と疑問に思われる方がいらっしゃるかもしれませんが、これは。R Console上で「?trimAdapter」と打ち込んでデフォルトのオプションを眺めることで理由がわかります。つまり、アラインメントスコア計算時に、この関数はデフォルトで一致に1点、不一致に-1点を与えて一塩基ずつオーバーラップの度合いを上げていく、という操作をしているからです。 したがって、もし完全一致のみに限定したい場合は、trimAdapter関数のところで、不一致に対して大幅に減点するようなパラメータを与えればいいんです。例えば「mismatch.score = -1000」とか。。。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

デフォルトのパラメータ(一致に1点、不一致に-1点)でトリムし、FASTQ形式で保存するやり方です。 writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。 ここではcompress=Fとして非圧縮ファイルを出力しています。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fastq"                 #出力ファイル名を指定してout_fに格納
param_adapter <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列を指定

#必要なパッケージをロード
library(girafe)                        #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長ごとの出現頻度情報を表示

#本番
fastq <- trimAdapter(fastq, param_adapter)#trimAdapter関数を用いてアダプター配列除去した結果をfastqに格納
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長ごとの出現頻度情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

2. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

アダプター配列と完全一致のみで2塩基以上一致するものだけをトリムし、FASTQ形式で保存するやり方です。 writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。 ここではcompress=Fとして非圧縮ファイルを出力しています。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fastq"                 #出力ファイル名を指定してout_fに格納
param_adapter <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列を指定
param2 <- 2                            #アダプター配列との最低一致塩基数をparam2に格納

#必要なパッケージをロード
library(girafe)                        #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長ごとの出現頻度情報を表示

#本番
mismatch <- nchar(param_adapter) + 100 #不一致に対して大幅に減点するための値を「アダプター配列長+100」としている(100を足しているのは念のため)
fastq <- trimAdapter(fastq, param_adapter,#trimAdapter関数を用いてアダプター配列除去した結果をfastqに格納
           mismatch.score = -mismatch, #trimAdapter関数を用いてアダプター配列除去した結果をfastqに格納
           score.threshold = param2)   #trimAdapter関数を用いてアダプター配列除去した結果をfastqに格納
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長ごとの出現頻度情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

3. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

アダプター配列と完全一致のみで2塩基以上一致するものだけをトリムし、FASTA形式で保存するやり方です。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.fasta"                 #出力ファイル名を指定してout_fに格納
param_adapter <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列を指定
param2 <- 2                            #アダプター配列との最低一致塩基数をparam2に格納

#必要なパッケージをロード
library(girafe)                        #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長ごとの出現頻度情報を表示

#本番
mismatch <- nchar(param_adapter) + 100 #不一致に対して大幅に減点するための値を「アダプター配列長+100」としている(100を足しているのは念のため)
fastq <- trimAdapter(fastq, param_adapter,#trimAdapter関数を用いてアダプター配列除去した結果をfastqに格納
           mismatch.score = -mismatch, #trimAdapter関数を用いてアダプター配列除去した結果をfastqに格納
           score.threshold = param2)   #trimAdapter関数を用いてアダプター配列除去した結果をfastqに格納
fasta <- sread(fastq)                  #fastqの配列情報部分をfastaに格納
names(fasta) <- id(fastq)              #description情報部分をfastaに追加
fasta                                  #確認してるだけです
table(width(fasta))                    #配列長ごとの出現頻度情報を表示

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

アダプター配列と完全一致のみで2塩基以上一致するものだけをトリムし、gzip圧縮FASTQ形式ファイルで保存するやり方です。 writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_adapter <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列を指定
param2 <- 2                            #アダプター配列との最低一致塩基数をparam2に格納

#必要なパッケージをロード
library(girafe)                        #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長ごとの出現頻度情報を表示

#本番
mismatch <- nchar(param_adapter) + 100 #不一致に対して大幅に減点するための値を「アダプター配列長+100」としている(100を足しているのは念のため)
fastq <- trimAdapter(fastq, param_adapter,#trimAdapter関数を用いてアダプター配列除去した結果をfastqに格納
           mismatch.score = -mismatch, #trimAdapter関数を用いてアダプター配列除去した結果をfastqに格納
           score.threshold = param2)   #trimAdapter関数を用いてアダプター配列除去した結果をfastqに格納
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長ごとの出現頻度情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=T)   #fastqの中身を指定したファイル名で保存
	

前処理 | トリミング | アダプター配列除去(基礎) | ShortRead(Morgan_2009)

ShortReadパッケージを用いたアダプター配列除去を行うやり方を示します。 smallRNA-seqから得られる配列データにはアダプター配列(例:CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG; Oligonucleotide sequences (c) 2007-2009 Illumina, Inc. All rights reserved.) が含まれ、アダプター配列を含んだままの状態でゲノムなどのリファレンス配列にマッピングすることはできません。 ここでは、許容するミスマッチ数を指定して、RNA-seqデータの右側にあるアダプター配列を除去するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample3.fasta)の場合:

アダプター配列既知("ACGTACGTAA")で、許容するミスマッチ数が0 (param_mismatch <- 0)、 でアダプター配列除去を行い、FASTA形式で保存するやり方です。

in_f <- "sample3.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param_adapter <- "ACGTACGTAA"          #アダプター配列を指定
param_mismatch <- 0                    #許容するミスマッチ数を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- trimLRPatterns(Rpattern=param_adapter,#アダプター配列除去を行った結果をfastaに格納
            subject=fasta,             #アダプター配列除去を行った結果をfastaに格納
            max.Rmismatch=rep(param_mismatch, nchar(param_adapter)))#アダプター配列除去を行った結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. FASTQ形式ファイル(sample1.fastq)の場合:

アダプター配列既知("CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG")で、 許容するミスマッチ数が2 (param_mismatch <- 2)でアダプター配列除去を行い、FASTA形式で保存するやり方です。

in_f <- "sample1.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納
param_adapter <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列を指定
param_mismatch <- 2                    #許容するミスマッチ数を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- trimLRPatterns(Rpattern=param_adapter,#アダプター配列除去を行った結果をfastaに格納
            subject=fasta,             #アダプター配列除去を行った結果をfastaに格納
            max.Rmismatch=rep(param_mismatch, nchar(param_adapter)))#アダプター配列除去を行った結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. FASTQ形式ファイル(sample1.fastq)の場合:

アダプター配列既知("CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG")で、 許容するミスマッチ数が2 (param_mismatch <- 2)でアダプター配列除去を行い、FASTQ形式で保存するやり方です。 writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。 ここではcompress=Fとして非圧縮ファイルを出力しています。

in_f <- "sample1.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.fastq"                 #出力ファイル名を指定してout_fに格納
param_adapter <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列を指定
param_mismatch <- 2                    #許容するミスマッチ数を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み

#本番
hoge1 <- trimLRPatterns(Rpattern=param_adapter,#アダプター配列除去を行った結果をhoge1に格納
            subject=sread(fastq),      #アダプター配列除去を行った結果をhoge1に格納
            max.Rmismatch=rep(param_mismatch, nchar(param_adapter)))#アダプター配列除去を行った結果をhoge1に格納
hoge2 <- BStringSet(quality(quality(fastq)), start=1, end=width(hoge1))#quality(fastq)オブジェクトをトリムしてhoge2に格納
fastq <- ShortReadQ(hoge1, hoge2, id(fastq))#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

4. FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

small RNA-seqデータ(400Mb弱、11928428リード)です。 原著論文(Nie et al., BMC Genomics, 2013)中の記述から GSE41841を頼りに、 SRP016842にたどりつき、 イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の7を実行して得られたものが入力ファイルです。 原著論文中では、アダプター配列やクオリティの低いリードを除去したのち、ゲノムにマッピングしたと書いてあります。 アダプター配列情報はどこにも書かれていませんでしたが、Table S2中のアダプター配列除去後の最も短いリードが18 nt (例:"GCAGTCGTGGCCGAGCGG")であり、 「この18 nt」と「この配列を含む生リード配列の差分」がアダプター配列ということになります。 詳細な情報は書かれていませんでしたが、おそらくアダプター配列は"TGGAATTCTCGGGTGCCAAGGAACTCCAGTC..."という感じだろうと推測して、 許容するミスマッチ数が1という条件でアダプタ配列除去を行っています。 最後のwriteFastq関数実行時にcompress=Tとしてgzip圧縮FASTQ形式で保存しています。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納(RNA-seqファイル)
out_f <- "hoge4.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_adapter <- "TGGAATTCTCGGGTGCCAAGGAACTCCAGTC"#アダプター配列を指定
param_mismatch <- 1                    #許容するミスマッチ数を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み

#本番
hoge1 <- trimLRPatterns(Rpattern=param_adapter,#アダプター配列除去を行った結果をhoge1に格納
            subject=sread(fastq),      #アダプター配列除去を行った結果をhoge1に格納
            max.Rmismatch=rep(param_mismatch, nchar(param_adapter)))#アダプター配列除去を行った結果をhoge1に格納
hoge2 <- BStringSet(quality(quality(fastq)), start=1, end=width(hoge1))#quality(fastq)オブジェクトをトリムしてhoge2に格納
fastq <- ShortReadQ(hoge1, hoge2, id(fastq))#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=T)   #fastqの中身を指定したファイル名で保存
	

前処理 | トリミング | アダプター配列除去(応用) | QuasR(Gaidatzis_2015)

QuasRパッケージを用いたアダプター/プライマー配列除去とそれに付随する様々な組み合わせのやり方を示します。 エラーが発生してR Guiが終了することがありますが、この原因はメモリ不足だそうです(孫建強 氏提供情報)。 それゆえ、2015年6月21日にparam_nrecを追加しました。これは一度に処理するリード数を指定しているところですが、基本的に無視で構いません。。 デフォルトの1000000のときに、メモリ不足でフリーズしたので、デフォルトの半分のリード数にしています。 処理時間は長くなりますが、エラーなく動くことのほうが重要です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. gzip圧縮FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

small RNA-seqデータ(ファイルサイズは400Mb弱、11928428リード)です。 原著論文(Nie et al., BMC Genomics, 2013)中の記述から GSE41841を頼りに、 SRP016842にたどりつき、 イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の7を実行して得られたものが入力ファイルです。 原著論文中では、アダプター配列やクオリティの低いリードを除去したのち、ゲノムにマッピングしたと書いてあります。 アダプター配列情報はどこにも書かれていませんでしたが、Table S2中のアダプター配列除去後の最も短いリードが18 nt (例:"GCAGTCGTGGCCGAGCGG")であり、 「この18 nt」と「この配列を含む生リード配列の差分」がアダプター配列ということになります。 詳細な情報は書かれていませんでしたが、おそらくアダプター配列は"TGGAATTCTCGGGTGCCAAGGAACTCCAGTC..."という感じだろうと推測できます。 ここでは、1塩基ミスマッチまで許容して(推定)アダプター配列除去を行ったのち、 "ACGT"のみからなる配列(許容するN数が0)で、 配列長が18nt以上のものをフィルタリングして出力しています。 アダプター配列の位置は5'側(左側)ではなく3'側(右側)にあるという前提であり、右側のアダプター配列しかトリムしないやり方です。 それが、preprocessReads関数実行時にRpatternとmax.Rmismatchのみ記載している理由です。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_adapter <- "TGGAATTCTCGGGTGCCAAGGAACTCCAGTC"#アダプター配列を指定
param_mismatch <- 1                    #許容するミスマッチ数を指定
param_nBases <- 0                      #許容するNの数を指定
param_minLength <- 18                  #アダプター配列除去後の許容する最短配列長を指定
param_nrec <- 500000                   #一度に処理するリード数を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(前処理)
res <- preprocessReads(filename=in_f,  #in_fを入力とする
             outputFilename=out_f,     #out_fを出力とする
             Rpattern=param_adapter,   #リードの右側(Right)のアダプターを除去
             max.Rmismatch=rep(param_mismatch, nchar(param_adapter)),#許容するミスマッチ数
             nBases=param_nBases,      #許容するNの数
             minLength=param_minLength,#アダプター配列除去後の許容する最短配列長
             nrec=param_nrec)          #一度に処理するリード数
res                                    #確認してるだけです
	

2. gzip圧縮FASTQ形式ファイル(SRR616268sub_1.fastq.gzSRR616268sub_2.fastq.gz)の場合:

乳酸菌RNA-seqデータSRR616268の最初の100万リード分です。paired-endデータです。 SRR616268sub_1.fastq.gzは、約75MB、全リード107 bpです。 SRR616268sub_2.fastq.gzは、約67MB、全リード93 bpです。 FastQC実行結果として 「TruSeq Adapter, Index 3」が含まれているとレポートされました。これでググると塩基配列情報は "GATCGGAAGAGCACACGTCTGAACTCCAGTCACTTAGGCATCTCGTATGCCGTCTTCTGCTTG" と書いてあったので、これを入力として与えます。 アダプター配列の位置は5'側(左側)にあるという前提であり、左側のアダプター配列しかトリムしないやり方です。 それが、preprocessReads関数実行時にLpatternのみ記載している理由です。 残念ながら、QuasR (ver. 1.8.2)では「Removing adapters from paired-end samples is not yet supported」と出ます。 2015年6月23日に開発者に実装を心待ちにしているとメールをしたら、翌日に対処法を指南していただきました(Thanks to Dr. Stadler)。

in_f1 <- "SRR616268sub_1.fastq.gz"     #入力ファイル名を指定してin_f1に格納
in_f2 <- "SRR616268sub_2.fastq.gz"     #入力ファイル名を指定してin_f2に格納
out_f1 <- "hoge1_1.fastq.gz"           #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1_2.fastq.gz"           #出力ファイル名を指定してout_f2に格納
param_adapter <- "GATCGGAAGAGCACACGTCTGAACTCCAGTCACTTAGGCATCTCGTATGCCGTCTTCTGCTTG"#アダプター配列を指定
param_nrec <- 500000                   #一度に処理するリード数を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(前処理)
res <- preprocessReads(filename=in_f1, #in_f1を入力とする
             filenameMate=in_f2,       #paired-endのもう片方(メイト)をin_f2とする
             outputFilename=out_f1,    #out_f1を出力とする
             outputFilenameMate=out_f2,#paired-endのもう片方(メイト)の出力をin_f2とする
             Lpattern=param_adapter,   #リードの左側(Left)のアダプターを除去
             nrec=param_nrec)          #一度に処理するリード数
res                                    #確認してるだけです
	

3. gzip圧縮FASTQ形式ファイル(SRR616268sub_1.fastq.gz)の場合:

乳酸菌RNA-seqデータSRR616268の最初の100万リード分です。paired-endデータのforward側、約75MB、全リード107 bpです。 FastQC実行結果(SRR616268sub_1_fastqc.html)として 「TruSeq Adapter, Index 3」が含まれているとレポートされました。これでググると塩基配列情報は "GATCGGAAGAGCACACGTCTGAACTCCAGTCACTTAGGCATCTCGTATGCCGTCTTCTGCTTG" と書いてあったので、これを入力として与えます。 アダプター配列の位置は5'側(左側)にあるという前提であり、左側のアダプター配列しかトリムしないやり方です。 この例題では、アダプター配列除去のみしか行わず出力ファイル中のリード数が入力ファイルと同じになるようにしています。 これを確実に実現するために、許容するNの数としてトテツモナイ大きさの1000をparam_nBasesで与え、 アダプター配列除去後の許容する最短配列長として全てが残る0をparam_minLengthで与えています。 それが、preprocessReads関数実行時にLpatternのみ記載している理由です。約1分。 出力ファイルでもう一度FastQCを実行すると、「TruSeq Adapter, Index 3」がOverrepresented sequencesの項目から消えていることまでは確認しました。 しかし、まだ「TruSeq Adapter, Index 2」が残っています。 ファイルサイズが、74,906,576 bytesから71,542,907 bytesに若干減っていることがわかります。

in_f <- "SRR616268sub_1.fastq.gz"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_adapter <- "GATCGGAAGAGCACACGTCTGAACTCCAGTCACTTAGGCATCTCGTATGCCGTCTTCTGCTTG"#アダプター配列を指定
param_nBases <- 1000                   #許容するNの数を指定
param_minLength <- 0                   #アダプター配列除去後の許容する最短配列長を指定
param_nrec <- 500000                   #一度に処理するリード数を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(アダプター配列除去)
res <- preprocessReads(filename=in_f,  #in_fを入力とする
             outputFilename=out_f,     #out_fを出力とする
             Lpattern=param_adapter,   #リードの左側(Left)のアダプターを除去
             nBases=param_nBases,      #許容するNの数
             minLength=param_minLength,#アダプター配列除去後の許容する最短配列長
             nrec=param_nrec)          #一度に処理するリード数
res                                    #確認してるだけです
file.size(in_f)                        #入力ファイルのサイズを表示
file.size(out_f)                       #出力ファイルのサイズを表示
	

4. gzip圧縮FASTQ形式ファイル(hoge3.fastq.gz)の場合:

3.で得られたhoge3.fastq.gzファイル中には、 まだ「TruSeq Adapter, Index 2」が残っています。 「TruSeq Adapter, Index 2」の塩基配列情報は "GATCGGAAGAGCACACGTCTGAACTCCAGTCACCGATGTATCTCGTATGCCGTCTTCTGCTTG" と書いてあったので、これを入力として与えます。約1分。 ファイルサイズが、71,542,907 bytesから71,343,605 bytesに若干減っていることがわかります。 この出力ファイル(hoge4.fastq.gz)と同じものが SRR616268sub_trim2_1.fastq.gz(1,000,000リード、71,343,605 bytes)です。 FastQC実行結果はSRR616268sub_trim2_1_fastqc.htmlです。

in_f <- "hoge3.fastq.gz"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_adapter <- "GATCGGAAGAGCACACGTCTGAACTCCAGTCACCGATGTATCTCGTATGCCGTCTTCTGCTTG"#アダプター配列を指定
param_nBases <- 1000                   #許容するNの数を指定
param_minLength <- 0                   #アダプター配列除去後の許容する最短配列長を指定
param_nrec <- 500000                   #一度に処理するリード数を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(アダプター配列除去)
res <- preprocessReads(filename=in_f,  #in_fを入力とする
             outputFilename=out_f,     #out_fを出力とする
             Lpattern=param_adapter,   #リードの左側(Left)のアダプターを除去
             nBases=param_nBases,      #許容するNの数
             minLength=param_minLength,#アダプター配列除去後の許容する最短配列長
             nrec=param_nrec)          #一度に処理するリード数
res                                    #確認してるだけです
file.size(in_f)                        #入力ファイルのサイズを表示
file.size(out_f)                       #出力ファイルのサイズを表示
	

5. gzip圧縮FASTQ形式ファイル(SRR616268sub_2.fastq.gz)の場合:

乳酸菌RNA-seqデータSRR616268の最初の100万リード分です。paired-endデータのreverse側、約67MB、全リード93 bpです。 FastQC実行結果(SRR616268sub_2_fastqc.html)として 「Illumina Single End PCR Primer 1」が含まれているとレポートされました。これでググると塩基配列情報は "AATGATACGGCGACCACCGAGATCTACACTCTTTCCCTACACGACGCTCTTCCGATCT" と書いてあったので、これを入力として与えます。 アダプター配列の位置は5'側(左側)にあるという前提であり、左側のアダプター配列しかトリムしないやり方です。 それが、preprocessReads関数実行時にLpatternのみ記載している理由です。約1分。 ファイルサイズが、67,158,462 bytesから63,524,791 bytesに若干減っていることがわかります。 この出力ファイル(hoge5.fastq.gz)と同じものが SRR616268sub_trim2_2.fastq.gz(1,000,000リード、63,524,791 bytes)です。 FastQC実行結果はSRR616268sub_trim2_2_fastqc.htmlです。

in_f <- "SRR616268sub_2.fastq.gz"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_adapter <- "AATGATACGGCGACCACCGAGATCTACACTCTTTCCCTACACGACGCTCTTCCGATCT"#アダプター配列を指定
param_nBases <- 1000                   #許容するNの数を指定
param_minLength <- 0                   #アダプター配列除去後の許容する最短配列長を指定
param_nrec <- 500000                   #一度に処理するリード数を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(Biostrings)                    #パッケージの読み込み

#前処理(reverse complementの作成)
hoge <- reverseComplement(DNAString(param_adapter))#逆相補鎖(reverse complement)を作成

#本番(アダプター配列除去)
res <- preprocessReads(filename=in_f,  #in_fを入力とする
             outputFilename=out_f,     #out_fを出力とする
             Lpattern=as.character(hoge),#リードの左側(Left)のアダプターを除去
             nBases=param_nBases,      #許容するNの数
             minLength=param_minLength,#アダプター配列除去後の許容する最短配列長
             nrec=param_nrec)          #一度に処理するリード数
res                                    #確認してるだけです
file.size(in_f)                        #入力ファイルのサイズを表示
file.size(out_f)                       #出力ファイルのサイズを表示
	

前処理 | トリミング | アダプター配列除去(応用) | ShortRead(Morgan_2009)

ShortReadパッケージを用いたアダプター配列除去とそれに付随する様々な組み合わせのやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample3.fasta)の場合:

アダプター配列既知("ACGTACGTAA")で、許容するミスマッチ数が0 (param_mismatch <- 0)、 ACGTのみからなる配列(param_nBases <- 0)、配列長の範囲指定(20:30) の組み合わせです。

in_f <- "sample3.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param_adapter <- "ACGTACGTAA"          #アダプター配列を指定
param_mismatch <- 0                    #許容するミスマッチ数を指定
param_nBases <- 0                      #許容するACGT以外の文字数(実質的にはNの許容数に相当)を指定
param_range <- 20:30                   #配列長の範囲を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番1(アダプター配列除去)
fasta <- trimLRPatterns(Rpattern=param_adapter,#アダプター配列除去を行った結果をfastaに格納
            subject=fasta,             #アダプター配列除去を行った結果をfastaに格納
            max.Rmismatch=rep(param_mismatch, nchar(param_adapter)))#アダプター配列除去を行った結果をfastaに格納
fasta                                  #確認してるだけです

#本番2(ACGTのみの配列を抽出)
#hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以前の記述)
hoge <- apply(as.matrix(alphabetFrequency(DNAStringSet(fasta))[,1:4]), 1, sum)#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以降の記述)
obj <- (width(fasta) - hoge) <= param_nBases#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#本番3(指定した長さの範囲の配列を抽出)
obj <- (width(fasta) >= min(param_range)) & (width(fasta) <= max(param_range))#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. FASTQ形式ファイル(sample1.fastq)の場合:

アダプター配列既知("CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG")で、許容するミスマッチ数が2 (param_mismatch <- 2)、 ACGTのみからなる配列(param_nBases <- 0)、配列長の範囲指定(20:30) の組み合わせです。

in_f <- "sample1.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納
param_adapter <- "CATCGATCCTGCAGGCTAGAGACAGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"#アダプター配列を指定
param_mismatch <- 2                    #許容するミスマッチ数を指定
param_nBases <- 0                      #許容するACGT以外の文字数(実質的にはNの許容数に相当)を指定
param_range <- 20:30                   #配列長の範囲を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番1(アダプター配列除去)
fasta <- trimLRPatterns(Rpattern=param_adapter,#アダプター配列除去を行った結果をfastaに格納
            subject=fasta,             #アダプター配列除去を行った結果をfastaに格納
            max.Rmismatch=rep(param_mismatch, nchar(param_adapter)))#アダプター配列除去を行った結果をfastaに格納
fasta                                  #確認してるだけです

#本番2(ACGTのみの配列を抽出)
#hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以前の記述)
hoge <- apply(as.matrix(alphabetFrequency(DNAStringSet(fasta))[,1:4]), 1, sum)#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以降の記述)
obj <- (width(fasta) - hoge) <= param_nBases#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#本番3(指定した長さの範囲の配列を抽出)
obj <- (width(fasta) >= min(param_range)) & (width(fasta) <= max(param_range))#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. FASTQ形式ファイル(SRR609266.fastq)の場合:

small RNA-seqデータ(ファイルサイズは1.8GB、圧縮後で400Mb弱、11928428リード)です。 原著論文(Nie et al., BMC Genomics, 2013)中の記述から GSE41841を頼りに、 SRP016842にたどりつき、 イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の7を実行して得られたものが入力ファイルです。

原著論文中では、アダプター配列やクオリティの低いリードを除去したのち、ゲノムにマッピングしたと書いてあります。 アダプター配列情報はどこにも書かれていませんでしたが、Table S2中のアダプター配列除去後の最も短いリードが18 nt (例:"GCAGTCGTGGCCGAGCGG")であり、 「この18 nt」と「この配列を含む生リード配列の差分」がアダプター配列ということになります。 詳細な情報は書かれていませんでしたが、おそらくアダプター配列は"TGGAATTCTCGGGTGCCAAGGAACTCCAGTC..."という感じだろうと推測できます。

アダプター配列既知("TGGAATTCTCGGGTGCCAAGGAACTCCAGTC")で、許容するミスマッチ数が2、 ACGTのみからなる配列(param_nBases <- 0)、配列長の範囲指定(20:30) の組み合わせです。

in_f <- "SRR609266.fastq"              #入力ファイル名を指定してin_fに格納(RNA-seqファイル)
out_f <- "hoge3.fasta"                 #出力ファイル名を指定してout_fに格納
param_adapter <- "TGGAATTCTCGGGTGCCAAGGAACTCCAGTC"#アダプター配列を指定
param_mismatch <- 2                    #許容するミスマッチ数を指定
param_nBases <- 0                      #許容するACGT以外の文字数(実質的にはNの許容数に相当)を指定
param_range <- 20:30                   #配列長の範囲を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番1(アダプター配列除去)
fasta <- trimLRPatterns(Rpattern=param_adapter,#アダプター配列除去を行った結果をfastaに格納
            subject=fasta,             #アダプター配列除去を行った結果をfastaに格納
            max.Rmismatch=rep(param_mismatch, nchar(param_adapter)))#アダプター配列除去を行った結果をfastaに格納
fasta                                  #確認してるだけです

#本番2(ACGTのみの配列を抽出)
#hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以前の記述)
hoge <- apply(as.matrix(alphabetFrequency(DNAStringSet(fasta))[,1:4]), 1, sum)#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以降の記述)
obj <- (width(fasta) - hoge) <= param_nBases#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#本番3(指定した長さの範囲の配列を抽出)
obj <- (width(fasta) >= min(param_range)) & (width(fasta) <= max(param_range))#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

small RNA-seqデータ(400Mb弱、11928428リード)です。圧縮ファイルもreadDNAStringSet関数で通常手順で読み込めます。 原著論文(Nie et al., BMC Genomics, 2013)中の記述から GSE41841を頼りに、 SRP016842にたどりつき、 イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の7を実行して得られたものが入力ファイルです。

原著論文中では、アダプター配列やクオリティの低いリードを除去したのち、ゲノムにマッピングしたと書いてあります。 アダプター配列情報はどこにも書かれていませんでしたが、Table S2中のアダプター配列除去後の最も短いリードが18 nt (例:"GCAGTCGTGGCCGAGCGG")であり、 「この18 nt」と「この配列を含む生リード配列の差分」がアダプター配列ということになります。 詳細な情報は書かれていませんでしたが、おそらくアダプター配列は"TGGAATTCTCGGGTGCCAAGGAACTCCAGTC..."という感じだろうと推測できます。

アダプター配列既知("TGGAATTCTCGGGTGCCAAGGAACTCCAGTC")で、許容するミスマッチ数が2、 ACGTのみからなる配列(param_nBases <- 0)、配列長の範囲指定(20:30) の組み合わせです。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納(RNA-seqファイル)
out_f <- "hoge4.fasta.gz"              #出力ファイル名を指定してout_fに格納
param_adapter <- "TGGAATTCTCGGGTGCCAAGGAACTCCAGTC"#アダプター配列を指定
param_mismatch <- 2                    #許容するミスマッチ数を指定
param_nBases <- 0                      #許容するACGT以外の文字数(実質的にはNの許容数に相当)を指定
param_range <- 20:30                   #配列長の範囲を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番1(アダプター配列除去)
fasta <- trimLRPatterns(Rpattern=param_adapter,#アダプター配列除去を行った結果をfastaに格納
            subject=fasta,             #アダプター配列除去を行った結果をfastaに格納
            max.Rmismatch=rep(param_mismatch, nchar(param_adapter)))#アダプター配列除去を行った結果をfastaに格納
fasta                                  #確認してるだけです

#本番2(ACGTのみの配列を抽出)
#hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以前の記述)
hoge <- apply(as.matrix(alphabetFrequency(DNAStringSet(fasta))[,1:4]), 1, sum)#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以降の記述)
obj <- (width(fasta) - hoge) <= param_nBases#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#本番3(指定した長さの範囲の配列を抽出)
obj <- (width(fasta) >= min(param_range)) & (width(fasta) <= max(param_range))#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50, compress=T)#fastaの中身を指定したファイル名で保存
	

前処理 | トリミング | 指定した末端塩基数だけ除去

3'末端を指定塩基数分だけトリムするやり方を示します。 トリム後の出力ファイルでdescription行部分の記述は不変ですのでご注意ください。理由は、この部分がただの文字列だからです。 2017.11.08の変更はこの部分の注意書きのみであり、コード自体はどこもいじってません。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. multi-FASTAファイル(hoge4.fa)の場合:

イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたファイルです。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param_trim <- 5                        #3'末端のトリムしたい塩基数を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- width(fasta) - param_trim      #トリム後のend位置情報を取得
hoge[hoge < 1] <- 1                    #トリム後のend位置が1未満の場合には1にしている
fasta <- DNAStringSet(fasta, start=1, end=hoge)#指定した塩基数分だけトリムした結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです (Bullard et al., 2010)。 FASTQ形式ファイルを読み込んでFASTQ形式で保存するやり方です。 writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。 ここではcompress=Fとして非圧縮ファイルを出力しています。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fastq"                 #出力ファイル名を指定してout_fに格納
param_trim <- 2                        #3'末端のトリムしたい塩基数を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
hoge <- width(sread(fastq)) - param_trim#トリム後のend位置情報を取得
hoge[hoge < 1] <- 1                    #トリム後のend位置が1未満の場合には1にしている
hoge1 <- DNAStringSet(sread(fastq), start=1, end=hoge)#sread(fastq)から指定した範囲を抽出した結果をDNAStringSet形式で格納
hoge2 <- BStringSet(quality(quality(fastq)), start=1, end=hoge)#quality(quality(fastq))から指定した範囲を抽出した結果をBStringSet形式で格納
fastq <- ShortReadQ(hoge1, hoge2, id(fastq))#ShortReadQというクラスオブジェクトを作成してfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

3. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです (Bullard et al., 2010)。FASTQ形式ファイルを読み込んでFASTA形式で保存するやり方です。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.fasta"                 #出力ファイル名を指定してout_fに格納
param_trim <- 4                        #3'末端のトリムしたい塩基数を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- width(fasta) - param_trim      #トリム後のend位置情報を取得
hoge[hoge < 1] <- 1                    #トリム後のend位置が1未満の場合には1にしている
fasta <- DNAStringSet(fasta, start=1, end=hoge)#指定した塩基数分だけトリムした結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. FASTQ形式ファイル(SRR616268sub_1.fastq.gz)の場合:

乳酸菌RNA-seqデータSRR616268の最初の100万リード分(約73MB; 74,906,576 bytes)です。 paired-endのforward側です。長さは全て107 bpです。 3'側の7 bp分をトリムするので、出力ファイル中の長さは100 bpになります。

in_f <- "SRR616268sub_1.fastq.gz"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_trim <- 7                        #3'末端のトリムしたい塩基数を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
hoge <- width(sread(fastq)) - param_trim#トリム後のend位置情報を取得
hoge[hoge < 1] <- 1                    #トリム後のend位置が1未満の場合には1にしている
hoge1 <- DNAStringSet(sread(fastq), start=1, end=hoge)#sread(fastq)から指定した範囲を抽出した結果をDNAStringSet形式で格納
hoge2 <- BStringSet(quality(quality(fastq)), start=1, end=hoge)#quality(quality(fastq))から指定した範囲を抽出した結果をBStringSet形式で格納
fastq <- ShortReadQ(hoge1, hoge2, id(fastq))#ShortReadQというクラスオブジェクトを作成してfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=T)   #fastqの中身を指定したファイル名で保存
	

5. FASTQ形式ファイル(SRR616268sub_2.fastq.gz)の場合:

乳酸菌RNA-seqデータSRR616268の最初の100万リード分(約67MB; 67,158,462 bytes)です。 paired-endのforward側です。長さは全て93 bpです。 3'側の2 bp分をトリムするので、出力ファイル中の長さは91 bpになります。

in_f <- "SRR616268sub_2.fastq.gz"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_trim <- 2                        #3'末端のトリムしたい塩基数を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
hoge <- width(sread(fastq)) - param_trim#トリム後のend位置情報を取得
hoge[hoge < 1] <- 1                    #トリム後のend位置が1未満の場合には1にしている
hoge1 <- DNAStringSet(sread(fastq), start=1, end=hoge)#sread(fastq)から指定した範囲を抽出した結果をDNAStringSet形式で格納
hoge2 <- BStringSet(quality(quality(fastq)), start=1, end=hoge)#quality(quality(fastq))から指定した範囲を抽出した結果をBStringSet形式で格納
fastq <- ShortReadQ(hoge1, hoge2, id(fastq))#ShortReadQというクラスオブジェクトを作成してfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=T)   #fastqの中身を指定したファイル名で保存
	

6. FASTQ形式ファイル(SRR616268sub_trim2_1.fastq.gz)の場合:

前処理 | トリミング | アダプター配列除去(応用) | QuasR(Gaidatzis_2015)の例題4実行結果ファイルです。 乳酸菌RNA-seqデータSRR616268の最初の100万リード分(約71MB; 71,343,605 bytes)です。 paired-endのforward側です。長さはリードによって異なります。 3'側の7 bp分をトリムしています。 現状では、hoge1作成段階で、14023番目のリードのサブセットを抽出できないという理由でこけます。 この塩基配列とクオリティスコア情報は空なので、そこからサブセットを得ようとしているからです。

in_f <- "SRR616268sub_trim2_1.fastq.gz"#入力ファイル名を指定してin_fに格納
out_f <- "hoge6.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_trim <- 7                        #3'末端のトリムしたい塩基数を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
hoge <- width(sread(fastq)) - param_trim#トリム後のend位置情報を取得
hoge[hoge < 1] <- 1                    #トリム後のend位置が1未満の場合には1にしている
hoge1 <- DNAStringSet(sread(fastq), start=1, end=hoge)#sread(fastq)から指定した範囲を抽出した結果をDNAStringSet形式で格納
hoge2 <- BStringSet(quality(quality(fastq)), start=1, end=hoge)#quality(quality(fastq))から指定した範囲を抽出した結果をBStringSet形式で格納
fastq <- ShortReadQ(hoge1, hoge2, id(fastq))#ShortReadQというクラスオブジェクトを作成してfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=T)   #fastqの中身を指定したファイル名で保存
	

7. FASTQ形式ファイル(SRR616268sub_trim2_2.fastq.gz)の場合:

前処理 | トリミング | アダプター配列除去(応用) | QuasR(Gaidatzis_2015)の例題5実行結果ファイルです。 乳酸菌RNA-seqデータSRR616268の最初の100万リード分(約64MB; 63,524,791 bytes)です。 paired-endのreverse側です。長さはリードによって異なります。 3'側の2 bp分をトリムしています。

in_f <- "SRR616268sub_trim2_2.fastq.gz"#入力ファイル名を指定してin_fに格納
out_f <- "hoge7.fastq.gz"              #出力ファイル名を指定してout_fに格納
param_trim <- 2                        #3'末端のトリムしたい塩基数を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
hoge <- width(sread(fastq)) - param_trim#トリム後のend位置情報を取得
hoge[hoge < 1] <- 1                    #トリム後のend位置が1未満の場合には1にしている
hoge1 <- DNAStringSet(sread(fastq), start=1, end=hoge)#sread(fastq)から指定した範囲を抽出した結果をDNAStringSet形式で格納
hoge2 <- BStringSet(quality(quality(fastq)), start=1, end=hoge)#quality(quality(fastq))から指定した範囲を抽出した結果をBStringSet形式で格納
fastq <- ShortReadQ(hoge1, hoge2, id(fastq))#ShortReadQというクラスオブジェクトを作成してfastqに格納
sread(fastq)                           #配列情報を表示
quality(fastq)                         #quality情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=T)   #fastqの中身を指定したファイル名で保存
	

前処理 | フィルタリング | について

ここでは、主に塩基配列データ(リードデータ)の前処理について、特にクオリティの低いリードのフィルタリングを中心にリストアップしています。 発現変動解析を行う前に低発現遺伝子やサンプル間で発現変動のない遺伝子を予め除去するという意味でのフィルタリングについては、 「解析 | 前処理 | について 」のあたりをご覧ください。

R用:

R以外:

前処理 | フィルタリング | PHREDスコアが低い塩基をNに置換

Sanger FASTQ形式ファイルを読み込んで、PHREDスコアが任意の閾値未満の塩基を"N"に置換するやり方を紹介します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。 writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。 ここではcompress=Fとして非圧縮ファイルを出力しています。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fastq"                 #出力ファイル名を指定してout_fに格納
param1 <- 20                           #PHREDスコアの閾値を指定
param2 <- "N"                          #置換後の文字を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
hoge1 <- as(quality(fastq), "matrix")  #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をhoge1に格納
obj <- hoge1 < param1                  #条件を満たすかどうかを判定した結果をobjに格納
hoge2 <- DNAString(paste(rep(param2, max(width(fastq))), collapse=""))#「最長配列の長さ」で「全ての塩基がparam2で指定した文字」からなるDNAStringオブジェクトを作成してhoge2に格納
hoge3 <- as(Views(hoge2, start=1, end=rowSums(obj)), "DNAStringSet")#rowSums(at)で各リードごとのPHREDスコアが閾値未満の塩基数がわかるので、その塩基数分からなるparam2の文字のDNAStringSetオブジェクトを作成してhoge3に格納
fasta <- replaceLetterAt(sread(fastq), obj, hoge3)#objがTRUEの位置の塩基をhoge3中の塩基で置換した結果をfastaに格納
fastq <- ShortReadQ(fasta, quality(fastq), id(fastq))#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成したものをfastqに格納
sread(fastq)                           #配列情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

前処理 | フィルタリング | PHREDスコアが低い配列(リード)を除去

Sanger FASTQ形式ファイルを読み込んで、PHREDスコアが低いリードを除去するやり方を紹介します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。 PHREDスコアが20未満のものがリード長に占める割合が0.1以上のリードを除去するやり方です。 (例題のファイル中のリードは全て35bpのリードである。その10%以上ということで実質的にPHREDスコアが閾値未満のものが4塩基以上あるリードはダメということ) writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。 ここではcompress=Fとして非圧縮ファイルを出力しています。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fastq"                 #出力ファイル名を指定してout_fに格納
param1 <- 20                           #PHREDスコアの閾値を指定
param2 <- 0.1                          #指定した閾値未満のものが配列長に占める割合を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
hoge <- as(quality(fastq), "matrix")   #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をhogeに格納
obj <- (rowSums(hoge < param1) <= width(fastq)*param2)#条件を満たすかどうかを判定した結果をobjに格納
fastq <- fastq[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastqに格納
sread(fastq)                           #配列情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

2. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。 PHREDスコアが20以上の塩基数が0.9より多いリードのみ抽出するやり方です。 1と同じことを別の言葉で表現しているだけです。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fastq"                 #出力ファイル名を指定してout_fに格納
param1 <- 20                           #PHREDスコアの閾値を指定
param2 <- 0.9                          #指定した閾値以上の塩基数の配列長に占める割合を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
hoge <- as(quality(fastq), "matrix")   #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をhogeに格納
obj <- (rowSums(hoge >= param1) > width(fastq)*param2)#条件を満たすかどうかを判定した結果をobjに格納
fastq <- fastq[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastqに格納
sread(fastq)                           #配列情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

3. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。 PHREDスコアが20以上の塩基数と配列長に占める割合(%)を出力させるやり方です。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 20                           #PHREDスコアの閾値を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み

#本番
hoge <- as(quality(fastq), "matrix")   #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をhogeに格納
obj_num <- rowSums(hoge >= param1)     #param1で指定した条件を満たすリードごとの塩基数をobj_numに格納
obj_percent <- 100*obj_num/width(fastq)#obj_num中の塩基数をパーセンテージに変換したものをobj_percentに格納

#後処理(description行をシンプルにしている)
hoge <- strsplit(as.character(id(fastq)), " ", fixed=TRUE)#id(reads)中の文字列を" "で区切った結果をリスト形式でhogeに格納
description <- sapply(hoge,"[[", 1)    #hogeのリスト中の一番目の要素のみ取り出してdescriptionに格納

#ファイルに保存
tmp <- cbind(description, width(fastq), obj_num, obj_percent)#「description」、「配列長」、「閾値を満たす塩基数」、「その割合」を列方向に結合したものをtmpに格納
colnames(tmp) <- c("description", "read_length", "nucleotide_number", "percentage")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。 PHREDスコアが20未満のものがリード長に占める割合が0.8以上のリードを除去するやり方です。 あるチュートリアル(Short Reads Quality Control and Preprocessingの6ページ目) に書いてあったフィルタリング条件(less than 20 over the 80%)です。 writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。 ここではcompress=Fとして非圧縮ファイルを出力しています。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.fastq"                 #出力ファイル名を指定してout_fに格納
param1 <- 20                           #PHREDスコアの閾値を指定
param2 <- 0.8                          #指定した閾値未満のものが配列長に占める割合を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示

#本番
hoge <- as(quality(fastq), "matrix")   #ASCIIコードのquality scoreをPHRED scoreに変換し、データ構造をmatrixにした結果をhogeに格納
obj <- (rowSums(hoge < param1) <= width(fastq)*param2)#条件を満たすかどうかを判定した結果をobjに格納
fastq <- fastq[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastqに格納
sread(fastq)                           #配列情報を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

前処理 | フィルタリング | ACGTのみからなる配列を抽出

FASTQファイルやFASTAファイルを読み込んで"N"などの文字を含まず、ACGTのみからなる配列のみ抽出して、(multi-)FASTA形式ファイルに出力するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
#hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以前の記述)
hoge <- apply(as.matrix(alphabetFrequency(DNAStringSet(fasta))[,1:4]), 1, sum)#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以降の記述)
obj <- (width(fasta) == hoge)          #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

出力ファイルのdescription行を「kkk_...」に変更するやり方です。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- "kkk"                        #(multi-)FASTA形式のdescription部分(の一部)を指定してparam1に格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
#hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以前の記述)
hoge <- apply(as.matrix(alphabetFrequency(DNAStringSet(fasta))[,1:4]), 1, sum)#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以降の記述)
obj <- (width(fasta) == hoge)          #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
names(fasta) <- paste(param1, 1:length(fasta), sep="_")#description部分を作成している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

配列中にNを含まないので、入力ファイルと同じ結果が返されることがわかります。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.fasta"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
#hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以前の記述)
hoge <- apply(as.matrix(alphabetFrequency(DNAStringSet(fasta))[,1:4]), 1, sum)#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以降の記述)
obj <- (width(fasta) == hoge)          #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. FASTA形式ファイル(sample2.fasta)の場合:

配列中に"-"を含むcontig_1と配列中に"N"を含むcontig_8, ..., 12が消えていることがわかります。

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.fasta"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
#hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以前の記述)
hoge <- apply(as.matrix(alphabetFrequency(DNAStringSet(fasta))[,1:4]), 1, sum)#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以降の記述)
obj <- (width(fasta) == hoge)          #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

5. FASTA形式ファイル(sample2.fasta)の場合:

4.と同じ結果になりますが、やり方を変えています。

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.fasta"                 #出力ファイル名を指定してout_fに格納
param <- 0                             #許容するACGT以外の文字数(実質的にはNの許容数に相当)を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
#hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以前の記述)
hoge <- apply(as.matrix(alphabetFrequency(DNAStringSet(fasta))[,1:4]), 1, sum)#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以降の記述)
obj <- (width(fasta) - hoge) <= param  #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

6. (multi-)FASTA形式ファイル(sample4.fasta)の場合:

gene_4が消えていることが分かります。

in_f <- "sample4.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.fasta"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
#hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以前の記述)
hoge <- apply(as.matrix(alphabetFrequency(DNAStringSet(fasta))[,1:4]), 1, sum)#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以降の記述)
obj <- (width(fasta) == hoge)          #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | フィルタリング | ACGT以外のcharacter"-"をNに変換

sample2.fastaファイル中のcontig_1のように、なぜか文字列以外のcharacter(例:"-")が含まれることがたまにあります。 ここでは、"-"を"N"に変換するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample2.fasta)の場合:

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param <- "-"                           #Nに変換したいcharacterを指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
fasta <- chartr(param, "N", fasta)     #paramで指定したcharacterを"N"に変換した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | フィルタリング | ACGT以外の文字数が閾値以下の配列を抽出

(multi-)FASTAファイルを読み込んでACGT以外の文字(実質的にNに相当)数がparam1で指定した閾値以下の配列のみ抽出するやり方を示します。この値を0にすれば、ACGTのみからなる配列の抽出を行うのと同じ意味になります。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample2.fasta)を読み込んでACGTのみからなる配列を抽出したい(Nが0個に相当)場合:

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- 0                            #許容するACGT以外の文字数(実質的にはNの許容数に相当)を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
#hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以前の記述)
hoge <- apply(as.matrix(alphabetFrequency(DNAStringSet(fasta))[,1:4]), 1, sum)#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以降の記述)
obj <- (width(fasta) - hoge) <= param1 #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. FASTA形式ファイル(sample2.fasta)を読み込んでNが1個含むものまで許容してフィルタリングしたい場合:

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- 1                            #許容するACGT以外の文字数(実質的にはNの許容数に相当)を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
#hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以前の記述)
hoge <- apply(as.matrix(alphabetFrequency(DNAStringSet(fasta))[,1:4]), 1, sum)#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以降の記述)
obj <- (width(fasta) - hoge) <= param1 #条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. FASTA形式ファイル(sample2.fasta)を読み込んでNが1個含むものまで許容してフィルタリングしたい場合:

QuasRパッケージ中のpreprocessReads関数を用いるやり方です。

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 1                            #許容するACGT以外の文字数(実質的にはNの許容数に相当)を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番
out <- preprocessReads(filename=in_f,  #フィルタリングの実行
                       outputFilename=out_f,#フィルタリングの実行
                       minLength=0,    #フィルタリングの実行
                       nBases=param1)  #フィルタリングの実行
out                                    #確認してるだけです
	

前処理 | フィルタリング | 重複のない配列セットを作成

ユニークな配列からなるセットにするやり方を紹介します。ちなみに、ユニークとはいっても例えば"AACGTTGCA"と"AACGTTGCAG"は独立な配列として取り扱われます。

出力ファイルのdescription行は「kkk_X_Y」に変更しています。重複配列同士のdescription行が異なっていた場合に、どれを使うかという問題があることと、description行部分の記述をすっきりさせて、Xに相当する部分に配列のシリアル番号、そしてYに相当する部分にその配列の出現回数を示すようにしています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample2.fasta)の場合:

contig_8, 11, 12の三つの配列がまとめられていることなどがわかります。

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- "kkk"                        #(multi-)FASTA形式のdescription部分(の一部)を指定してparam1に格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- tables(fasta, n=length(unique(fasta)))#読まれた頻度順にsequenceをソートして結果をhogeに格納
fasta <- DNAStringSet(names(hoge$top)) #sequenceの配列情報(「names(hoge$top)」)をDNAStringSetオブジェクトとしてreadsに格納
fasta                                  #確認してるだけです

#後処理(description部分を作成)
names(fasta) <- paste(param1, 1:length(fasta), hoge$top, sep="_")#description部分を作成している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- "kkk"                        #(multi-)FASTA形式のdescription部分(の一部)を指定してparam1に格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- tables(fasta, n=length(unique(fasta)))#読まれた頻度順にsequenceをソートして結果をhogeに格納
fasta <- DNAStringSet(names(hoge$top)) #sequenceの配列情報(「names(hoge$top)」)をDNAStringSetオブジェクトとしてreadsに格納
fasta                                  #確認してるだけです

#後処理(description部分を作成)
names(fasta) <- paste(param1, 1:length(fasta), hoge$top, sep="_")#description部分を作成している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

配列中にNを含まず重複配列も存在しないので、順番のみ入れ替わった結果が返されていることがわかります。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- "kkk"                        #(multi-)FASTA形式のdescription部分(の一部)を指定してparam1に格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- tables(fasta, n=length(unique(fasta)))#読まれた頻度順にsequenceをソートして結果をhogeに格納
fasta <- DNAStringSet(names(hoge$top)) #sequenceの配列情報(「names(hoge$top)」)をDNAStringSetオブジェクトとしてreadsに格納
fasta                                  #確認してるだけです

#後処理(description部分を作成)
names(fasta) <- paste(param1, 1:length(fasta), hoge$top, sep="_")#description部分を作成している
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | フィルタリング | 指定した長さ以上の配列を抽出

FASTA形式やFASTQ形式ファイルを入力として、指定した配列長以上の配列を抽出するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. multi-FASTAファイル(hoge4.fa)の場合:

イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたファイルです。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param_length <- 50                     #配列長の閾値を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- as.logical(width(fasta) >= param_length)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. FASTA形式ファイル(sample2.fasta)の場合:

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納
param_length <- 16                     #配列長の閾値を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです
table(width(fasta))                    #配列長分布を表示

#本番
obj <- as.logical(width(fasta) >= param_length)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです
table(width(fasta))                    #配列長分布を表示

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. FASTQ形式ファイル(sample2.fastq)を読み込んでFASTQ形式で保存する場合:

writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。 ここではcompress=Fとして非圧縮ファイルを出力しています。

in_f <- "sample2.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.fastq"                 #出力ファイル名を指定してout_fに格納
param_length <- 26                     #配列長の閾値を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長分布を表示

#本番
obj <- as.logical(width(fastq) >= param_length)#条件を満たすかどうかを判定した結果をobjに格納
fastq <- fastq[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastqに格納
sread(fastq)                           #配列情報を表示
table(width(fastq))                    #配列長分布を表示

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

4. FASTQ形式ファイル(sample2.fastq)を読み込んでFASTA形式で保存する場合:

in_f <- "sample2.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.fasta"                 #出力ファイル名を指定してout_fに格納
param_length <- 26                     #配列長の閾値を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
fasta <- sread(fastq)                  #塩基配列情報をfastaに格納
fasta                                  #確認してるだけです
table(width(fasta))                    #配列長分布を表示

#本番
obj <- as.logical(width(fasta) >= param_length)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです
table(width(fasta))                    #配列長分布を表示

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

5. FASTA形式ファイル(out_gapClosed.fa)の場合:

DDBJ Pipeline (Nagasaki et al., DNA Res., 2013)上で de novoゲノムアセンブリプログラムPlatanus (Kajitani et al., Genome Res., 2014) を実行して得られたmulti-FASTA形式ファイル(out_gapClosed.fa; 約2.4MB)です。

in_f <- "out_gapClosed.fa"             #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.fasta"                 #出力ファイル名を指定してout_fに格納
param_length <- 300                    #配列長の閾値を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- as.logical(width(fasta) >= param_length)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | フィルタリング | 任意のリード(サブセット)を抽出

FASTA形式やFASTQ形式ファイルを入力として、任意の配列(リード)を抽出するやり方を示します。 ここのコードをテンプレートにして、マッピングなどを行う際に動作確認用として指定したリード数からなるサブセットを作成できます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. multi-FASTAファイル(hoge4.fa)の場合:

イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたものです。 最初の3リードを抽出するやり方です。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param <- 3                             #抽出したいリード数を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- 1:param                         #抽出したいリードの位置情報をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. multi-FASTAファイル(hoge4.fa)の場合:

(全部で4リードからなることが既知という前提で)2-4番目のリードを抽出するやり方です。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納
param_range <- 2:4                     #抽出したいリードの範囲を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- param_range                     #抽出したいリードの位置情報をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. multi-FASTAファイル(hoge4.fa)の場合:

1.と同じで最初の3リードを抽出するやり方ですが、表現方法が異なります。

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.fasta"                 #出力ファイル名を指定してout_fに格納
param_range <- 1:3                     #抽出したいリードの範囲を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
obj <- param_range                     #抽出したいリードの位置情報をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. FASTQ形式ファイル(sample2.fastq)を読み込んでFASTQ形式で保存する場合:

writeFastq関数のデフォルトオプションはcompress=Tで、gzip圧縮ファイルを出力します。 ここではcompress=Fとして非圧縮ファイルを出力しています。 (全部で187リードからなることが既知という前提で)5-20番目のリードを抽出するやり方です。

in_f <- "sample2.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.fastq"                 #出力ファイル名を指定してout_fに格納
param_range <- 5:20                    #抽出したいリードの範囲を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #確認してるだけです(塩基配列情報を表示)

#本番
obj <- param_range                     #抽出したいリードの位置情報をobjに格納
fastq <- fastq[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastqに格納
sread(fastq)                           #確認してるだけです(塩基配列情報を表示)

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

5. FASTQ形式ファイル(sample2.fastq)を読み込んでFASTQ形式で保存する場合:

(全部で187リードからなることが既知という前提でそれよりも少ない)30リード分をランダムに非復元抽出するやり方です。 writeFastq関数実行時にcompress=Fとしてgzip圧縮前のファイルを出力しています

in_f <- "sample2.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.fastq"                 #出力ファイル名を指定してout_fに格納
param <- 30                            #ランダム抽出したいリード数を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #確認してるだけです(塩基配列情報を表示)

#本番
set.seed(1010)                         #おまじない(同じ乱数になるようにするため)
obj <- sample(1:length(fastq), param, replace=F)#リード数の数値の中からparamで指定した数だけ非復元抽出した結果をobjに格納
fastq <- fastq[sort(obj)]              #objで指定したリードのみソートして抽出した結果をfastqに格納
sread(fastq)                           #確認してるだけです(塩基配列情報を表示)

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

6. FASTQ形式ファイル(sample2.fastq)を読み込んでFASTQ形式で保存する場合:

(全部で187リードからなることが既知という前提でそれよりも少ない)30リード分をランダムに非復元抽出するやり方です。 5.と実質的に同じですが、gzip圧縮ファイルとして保存するやり方です。Macintoshではうまくいかないかもしれません。

in_f <- "sample2.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.fastq.gz"              #出力ファイル名を指定してout_fに格納
param <- 30                            #ランダム抽出したいリード数を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #確認してるだけです(塩基配列情報を表示)

#本番
set.seed(1010)                         #おまじない(同じ乱数になるようにするため)
obj <- sample(1:length(fastq), param, replace=F)#リード数の数値の中からparamで指定した数だけ非復元抽出した結果をobjに格納
fastq <- fastq[sort(obj)]              #objで指定したリードのみソートして抽出した結果をfastqに格納
sread(fastq)                           #確認してるだけです(塩基配列情報を表示)

#ファイルに保存
writeFastq(fastq, out_f, compress=T)   #fastqの中身を指定したファイル名で保存
	

7. FASTQ形式ファイル(sample2.fastq)を読み込んでFASTA形式で保存する場合:

(全部で187リードからなることが既知という前提でそれよりも少ない)30リード分をランダムに非復元抽出するやり方です。

in_f <- "sample2.fastq"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.fasta"                 #出力ファイル名を指定してout_fに格納
param <- 30                            #ランダム抽出したいリード数を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
fasta <- sread(fastq)                  #塩基配列情報をfastaに格納
names(fasta) <- id(fastq)              #description情報をnames(fasta)に格納
fasta                                  #確認してるだけです

#本番
set.seed(1010)                         #おまじない(同じ乱数になるようにするため)
obj <- sample(1:length(fasta), param, replace=F)#リード数の数値の中からparamで指定した数だけ非復元抽出した結果をobjに格納
fasta <- fasta[sort(obj)]              #objで指定したリードのみソートして抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

8. small RNA-seqのgzip圧縮FASTQ形式ファイル(SRR609266.fastq.gz)を読み込んでFASTQ形式で保存する場合:

イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の7を実行して得られた カイコsmall RNA-seqデータ(Nie et al., BMC Genomics, 2013)です。 入力ファイルサイズは400Mb弱、11,928,428リードです。 この中から100000リード分をランダムに非復元抽出した結果をgzip圧縮なしで出力しています。 出力ファイルはSRR609266_sub.fastqと同じもの(100000リード; 約16MB)になります。 Macintoshではうまくいかないかもしれません。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge8.fastq"                 #出力ファイル名を指定してout_fに格納
param <- 100000                        #ランダム抽出したいリード数を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
id(fastq)                              #確認してるだけです(description情報を表示)

#本番
set.seed(1010)                         #おまじない(同じ乱数になるようにするため)
obj <- sample(1:length(fastq), param, replace=F)#リード数の数値の中からparamで指定した数だけ非復元抽出した結果をobjに格納
fastq <- fastq[sort(obj)]              #objで指定したリードのみソートして抽出した結果をfastqに格納
id(fastq)                              #確認してるだけです(description情報を表示)

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

9. small RNA-seqのgzip圧縮FASTQ形式ファイル(SRR609266.fastq.gz)を読み込んでFASTQ形式で保存する場合:

イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の7を実行して得られた カイコsmall RNA-seqデータ(Nie et al., BMC Genomics, 2013)です。 入力ファイルサイズは400Mb弱、11,928,428リードです。 この中から最初の100000リード分をgzip圧縮なしで出力しています。 Macintoshではうまくいかないかもしれません。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge9.fastq"                 #出力ファイル名を指定してout_fに格納
param <- 100000                        #ランダム抽出したいリード数を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
id(fastq)                              #確認してるだけです(description情報を表示)

#本番
fastq <- fastq[1:param]                #指定したリード数を抽出した結果をfastqに格納
id(fastq)                              #確認してるだけです(description情報を表示)

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

10. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。 (全部で500リードからなることが既知という前提で)5-20番目のリードを抽出するやり方です。

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge10.fastq"                #出力ファイル名を指定してout_fに格納
param_range <- 5:20                    #抽出したいリードの範囲を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #確認してるだけです(塩基配列情報を表示)

#本番
obj <- param_range                     #抽出したいリードの位置情報をobjに格納
fastq <- fastq[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastqに格納
sread(fastq)                           #確認してるだけです(塩基配列情報を表示)

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

11. サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の場合:

SRR037439から得られるFASTQファイルの最初の2,000行分を抽出したMAQC2 brainデータです(Bullard et al., 2010)。 (全部で500リードからなることが既知という前提で)30リード分をランダムに非復元抽出するやり方です。 writeFastq関数実行時にcompress=Fとしてgzip圧縮前のファイルを出力しています

in_f <- "SRR037439.fastq"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge11.fastq"                #出力ファイル名を指定してout_fに格納
param <- 30                            #ランダム抽出したいリード数を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
sread(fastq)                           #確認してるだけです(塩基配列情報を表示)

#本番
set.seed(1010)                         #おまじない(同じ乱数になるようにするため)
obj <- sample(1:length(fastq), param, replace=F)#リード数の数値の中からparamで指定した数だけ非復元抽出した結果をobjに格納
fastq <- fastq[sort(obj)]              #objで指定したリードのみソートして抽出した結果をfastqに格納
sread(fastq)                           #確認してるだけです(塩基配列情報を表示)

#ファイルに保存
writeFastq(fastq, out_f, compress=F)   #fastqの中身を指定したファイル名で保存
	

前処理 | フィルタリング | 指定した長さの範囲の配列

指定した長さの範囲の配列を抽出するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample2.fasta)の場合:

長さの範囲が20-30bpの配列を抽出するやり方を示します。

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param_range <- 20:30                   #配列長の範囲を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番(指定した長さの範囲の配列を抽出)
obj <- (width(fasta) >= min(param_range)) & (width(fasta) <= max(param_range))#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | フィルタリング | 任意のIDを含む配列を抽出

二つのファイル(multi-FASTA形式ファイルとIDリストファイル)を読み込んで、IDリストファイル中のRefSeq IDに対応する配列のサブセットを抽出するやり方を示します。 multi-FASTAファイルのdescription行の記述中にIDリストファイル中の文字列が存在することが大前提であることはいうまでもありませんが一応言っときます。 また、同一文字列としてうまく認識させるために、(description行の記述の中からIDリスト中の文字列と完全一致させるべく) description部分の記述をうまく分割(例:"_up_"など)してIDと一致する部分のみにする必要があり、このあたりは、自分でdescription行を眺めて適宜改変しなければなりません。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. multi-FASTAファイル(rat_upstream_1000.fa)の中からIDリスト(sample_IDlist1.txt)を含む配列を抽出したい場合:

(multi-FASTAファイルのほうのdescription行を"_up_"を区切り文字として分割し、分割後の1番目の要素を抽出することでIDリストとの対応付けを可能としている)

in_f1 <- "rat_upstream_1000.fa"        #入力ファイル名(multi-FASTAファイル)を指定してin_f1に格納
in_f2 <- "sample_IDlist1.txt"          #入力ファイル名(IDリストファイル)を指定してin_f2に格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです

#前処理(reads中のdescription部分を改変)
hoge <- strsplit(names(fasta), "_up_", fixed=TRUE)#names(fasta)中の文字列を"_up_"で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", 1)) #hogeのリスト中の1番目の要素(これがRefSeq IDに相当)を抽出してhoge2に格納
names(fasta) <- hoge2                  #names(fasta)の中身をhoge2で置換
fasta                                  #確認してるだけです

#本番
obj <- is.element(names(fasta), keywords)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. multi-FASTAファイル(sample_100.fastaの中からIDリスト(sample_IDlist2.txt)を含む配列を抽出したい場合:

(multi-FASTAファイルのほうのdescription行を"|"を区切り文字として分割し、分割後の4番目の要素を抽出することでIDリストとの対応付けを可能としているつもりだが、バージョン番号が残っているのでうまくいかない例)

in_f1 <- "sample_100.fasta"            #入力ファイル名(multi-FASTAファイル)を指定してin_f1に格納
in_f2 <- "sample_IDlist2.txt"          #入力ファイル名(IDリストファイル)を指定してin_f2に格納
out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです

#前処理(reads中のdescription部分を改変して対応付け可能にしたつもり...)
hoge <- strsplit(names(fasta), "|", fixed=TRUE)#names(fasta)中の文字列を"|"で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", 4)) #hogeのリスト中の4番目の要素(これがRefSeq IDに相当)を抽出してhoge2に格納
names(fasta) <- hoge2                  #names(fasta)の中身をhoge2で置換
fasta                                  #確認してるだけです

#本番
obj <- is.element(names(fasta), keywords)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. multi-FASTAファイル(sample_100.fastaの中からIDリスト(sample_IDlist2.txt)を含む配列を抽出したい場合:

(バージョン番号つきRefSeq IDをさらに"."を区切り文字として分割し、分割後の1番目の要素を抽出することでIDリストとの対応付けを可能としている)

in_f1 <- "sample_100.fasta"            #入力ファイル名(multi-FASTAファイル)を指定してin_f1に格納
in_f2 <- "sample_IDlist2.txt"          #入力ファイル名(IDリストファイル)を指定してin_f2に格納
out_f <- "hoge3.fasta"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
keywords <- readLines(in_f2)           #in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです

#前処理(fasta中のdescription部分を改変して対応付け)
hoge <- strsplit(names(fasta), "|", fixed=TRUE)#names(fasta)中の文字列を"|"で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", 4)) #hogeのリスト中の4番目の要素(これがRefSeq IDに相当)を抽出してhoge2に格納
hoge3 <- strsplit(hoge2, ".", fixed=TRUE)#hoge2中の文字列を"."で区切った結果をリスト形式でhoge3に格納
hoge4 <- unlist(lapply(hoge3, "[[", 1))#hoge3のリスト中の1番目の要素(これがRefSeq IDのバージョン部分以外に相当)を抽出してhoge4に格納
names(fasta) <- hoge4                  #names(fasta)の中身をhoge4で置換
fasta                                  #確認してるだけです

#本番
obj <- is.element(names(fasta), keywords)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | フィルタリング | Illuminaのpass filtering

ここはまだ未完成です。。。

二つのpaired-endファイル(read1.fqread2.fq)があるという前提で二つのファイル中で両方ともpass filteringフラグが1となっているものを抽出するやり方を示します。ここで読み込む二つのファイルは同一行に同一IDが位置するファイルであるという前提で行います。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

in_f1 <- "read1.fq"                    #読み込みたいFASTQ形式のファイル名を指定してin_f1に格納
in_f2 <- "read2.fq"                    #読み込みたいFASTQ形式のファイル名を指定してin_f2に格納
out_f1 <- "read1_pf.fastq"             #出力ファイル名を指定してout_f1に格納
out_f2 <- "read2_pf.fastq"             #出力ファイル名を指定してout_f2に格納

library(ShortRead)                     #パッケージの読み込み

#read1について基本情報取得
reads1 <- readFastq(in_f1)             #in_f1で指定したファイルの読み込み
hoge <- strsplit(as.character(id(reads1)), "/", fixed=TRUE)#id(reads1)中の文字列を"/"で区切った結果をリスト形式でhogeに格納
hoge2 <- sapply(hoge,"[[", 1)          #hogeのリスト中の一番目の要素のみ取り出してhoge2に格納
hoge3 <- strsplit(hoge2, ":", fixed=TRUE)#hoge2中の文字列を":"で区切った結果をリスト形式でhoge3に格納
pass_filter1 <- sapply(hoge3,"[[", length(hoge3[[1]]))#hoge3のリスト中の最後の要素のみ取り出してpass_filter1に格納
tmp_serial1 <- hoge2                   #入力ファイルのIDの順番がファイル間で同じかどうかを確かめるためにhoge2情報をtmp_serial1に格納

#read2について基本情報取得
reads2 <- readFastq(in_f2)             #in_f2で指定したファイルの読み込み
hoge <- strsplit(as.character(id(reads2)), "/", fixed=TRUE)#id(reads2)中の文字列を"/"で区切った結果をリスト形式でhogeに格納
hoge2 <- sapply(hoge,"[[", 1)          #hogeのリスト中の一番目の要素のみ取り出してhoge2に格納
hoge3 <- strsplit(hoge2, ":", fixed=TRUE)#hoge2中の文字列を":"で区切った結果をリスト形式でhoge3に格納
pass_filter2 <- sapply(hoge3,"[[", length(hoge3[[1]]))#hoge3のリスト中の最後の要素のみ取り出してpass_filter2に格納
tmp_serial2 <- hoge2                   #入力ファイルのIDの順番がファイル間で同じかどうかを確かめるためにhoge2情報をtmp_serial2に格納

#入力ファイルの状態を念のため確認している
#Step1:二つのファイル間でIDの総数が同じかどうかをチェック
#Step2:二つのファイル間でID情報のpass filterの部分より左側のところのみが同じかどうかをチェック
flag <- 0
if(length(tmp_serial1) == length(tmp_serial2)){
    print("Step1:OK")
    flag <- 1
    if(length(tmp_serial1) == sum(tmp_serial1 == tmp_serial2)){
        print("Step2:OK")
        flag <- 2
    }else{
        print("Step2:IDs between two paired-end files are not ideltical!")
    }
}else{
    print("Step1:The two files are not paired-end!")
}

#本番:二つのファイル間でpass filteringフラグが1のもののみ抽出する
if(flag == 2){
    hoge_flag <- as.integer(pass_filter1) + as.integer(pass_filter2)#IDごとにpass filteringフラグの和を計算した結果をhoge_flagに格納(両方で1のものは2になる)
    length(hoge_flag)                  #フィルタリング前のリード数を表示
    sum(hoge_flag == 2)                #フィルタリング後のリード数を表示
    writeFastq(reads1[hoge_flag == 2], out_f1)#reads1の中からhoge_flagの値が2となるもののみ指定したファイル名で保存
    writeFastq(reads2[hoge_flag == 2], out_f2)#reads2の中からhoge_flagの値が2となるもののみ指定したファイル名で保存
}
	

前処理 | フィルタリング | GFF/GTF形式ファイル

QuasRパッケージを用いてゲノムへのマッピング結果からカウント情報を得たいときに、 "TxDb"という形式のオブジェクトを利用する必要があります。 この形式のオブジェクトは、Rで提供されていない生物種の遺伝子アノテーションパッケージ以外のものについても、GFF/GTF形式のファイルがあれば、 それを入力としてTxDbオブジェクトを作成するための関数(GenomicFeaturesパッケージ中のmakeTxDbFromGFF関数)が提供されています。 しかし現実には、GFF/GTF形式ファイルは提供元によって微妙に異なるため、エラーを吐いてmakeTxDbFromGFF関数を実行できない場合が多いです。 それゆえイントロ | 一般 | 任意の文字列を行の最初に挿入のような小細工をして、 染色体名を同じ文字列として認識できるようにしたファイル(human_annotation_sub2.gtf)を用意する必要があるのですが、それでもまだだめな場合があります。 それは、EnsemblのFTPサイトから提供されているGFF/GTFファイル中には、 例えばヒトの場合「chr1, chr2, ...chr22, chrX, chrY, chrMT」以外に"HSCHR6_MHC_APD"や"HSCHR6_MHC_COX"などの記述があるためです。 例えばリファレンス配列を"BSgenome.Hsapiens.UCSC.hg19"に指定して行った場合には、"HSCHR6_MHC_APD"がリファレンス配列中に存在しないため、 GTFファイルに存在する"HSCHR6_MHC_APD"コンティグ?!上の特定の領域にマップされたリード数をカウントできるはずもなく、結果的に「そんなものはない!」とmakeTxDbFromGFF関数実行中に怒られるわけです。

この問題への最も合理的な対処法は、GFF/GTFファイルの中から、自分がマッピングに用いたリファレンス配列中の染色体名と同じ文字列の行だけを抽出した新たなGFF/GTFファイルを作成することです。 したがって、ここではGFF/GTFファイルとリファレンス配列を読み込んで、リファレンス配列中に存在する染色体名を含む行だけを抽出するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ヒトゲノム配列("BSgenome.Hsapiens.UCSC.hg19")中の染色体名と一致する遺伝子アノテーション情報のみGTFファイル (human_annotation_sub2.gtf)から抽出したい場合:

in_f1 <- "human_annotation_sub2.gtf"   #入力ファイル名を指定してin_f1に格納(GFF/GTFファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み(GFF/GTFファイル)
data <- read.table(in_f1, header=FALSE, sep="\t", quote="")#in_f1で指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(リファレンス配列の染色体名を抽出)
param <- in_f2                         #paramという名前で取り扱いたいだけです
library(param, character.only=T)       #paramで指定したパッケージの読み込み
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
hoge <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてhogeに格納
keywords <- seqnames(hoge)             #染色体名情報を抽出した結果をkeywordsに格納
keywords                               #確認してるだけです

#本番
obj <- is.element(as.character(data[,1]), keywords)#条件を満たすかどうかを判定した結果をobjに格納
out <- data[obj,]                      #objがTRUEとなる行のみ抽出した結果をoutに格納
dim(out)                               #オブジェクトoutの行数と列数を表示

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

前処理 | フィルタリング | 組合せ | ACGTのみ & 指定した長さの範囲の配列

フィルタリングを組み合わせるやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. FASTA形式ファイル(sample2.fasta)の場合:

ACGTのみからなる配列を抽出したのち、さらに指定した長さの範囲(20-30bp)の配列を抽出するやり方を示します。

in_f <- "sample2.fasta"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param_nBases <- 0                      #許容するACGT以外の文字数(実質的にはNの許容数に相当)を指定
param_range <- 20:30                   #配列長の範囲を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番1(ACGTのみの配列を抽出)
#hoge <- rowSums(alphabetFrequency(DNAStringSet(fasta))[,1:4])#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以前の記述)
hoge <- apply(as.matrix(alphabetFrequency(DNAStringSet(fasta))[,1:4]), 1, sum)#A,C,G,Tの総数を計算してhogeに格納(2015年9月12日以降の記述)
obj <- (width(fasta) - hoge) <= param_nBases#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#本番2(指定した長さの範囲の配列を抽出)
obj <- (width(fasta) >= min(param_range)) & (width(fasta) <= max(param_range))#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなる要素のみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

前処理 | フィルタリング | paired-end | 配列長とN数 | QuasR(Gaidatzis_2015)

QuasRパッケージを用いて、 リード数が同じpaired-endデータの2つのファイルを入力として、配列長やN数でのフィルタリング例を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. gzip圧縮FASTQ形式ファイル(SRR616268sub_trim2_1.fastq.gzSRR616268sub_trim2_2.fastq.gz)の場合:

前処理 | トリミング | アダプター配列除去(応用) | QuasR(Gaidatzis_2015)の例題4と5の実行結果ファイルで、paired-endデータです。 SRR616268sub_trim2_1.fastq.gzは、1,000,000リード、71,343,605 bytes (約71MB)です。 SRR616268sub_trim2_2.fastq.gzは、1,000,000リード、63,524,791 bytes (約64MB)です。 tooShortが107、tooManyNが1,551リードあったことがわかります。結果として、998,431リードからなるファイルが出力されています。 尚、998,431 + 107 + 1,551 = 1,000,089リードであったことから、 tooShort且つtooManyNのものの和集合(union)は(1,000,000 - 998,431) = 1,569リードなのだろうと解釈しました。 約2分。

in_f1 <- "SRR616268sub_trim2_1.fastq.gz"#入力ファイル名を指定してin_f1に格納
in_f2 <- "SRR616268sub_trim2_2.fastq.gz"#入力ファイル名を指定してin_f2に格納
out_f1 <- "hoge1_1.fastq.gz"           #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1_2.fastq.gz"           #出力ファイル名を指定してout_f2に格納
param_nrec <- 500000                   #一度に処理するリード数を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(前処理)
res <- preprocessReads(filename=in_f1, #前処理を実行
             filenameMate=in_f2,       #前処理を実行
             outputFilename=out_f1,    #前処理を実行
             outputFilenameMate=out_f2,#前処理を実行
             nrec=param_nrec)          #一度に処理するリード数
res                                    #確認してるだけです
	

2. gzip圧縮FASTQ形式ファイル(SRR616268sub_trim2_1.fastq.gzSRR616268sub_trim2_2.fastq.gz)の場合:

許容するN数(param_nBases)と最短配列長(param_minLength)を明示的に与えるやり方です。 tooShortが119、tooManyNが1,762リードあったことがわかります。結果として、998,208リードからなるファイルが出力されています。 例題6に比べて若干生き残るリード数が減るのは、param_nBases(デフォルトは2)と param_minLength(デフォルトは14)での条件がデフォルトよりも若干厳しめ (118)だからです。約2分。

in_f1 <- "SRR616268sub_trim2_1.fastq.gz"#入力ファイル名を指定してin_f1に格納
in_f2 <- "SRR616268sub_trim2_2.fastq.gz"#入力ファイル名を指定してin_f2に格納
out_f1 <- "hoge2_1.fastq.gz"           #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge2_2.fastq.gz"           #出力ファイル名を指定してout_f2に格納
param_nBases <- 1                      #許容するNの数を指定
param_minLength <- 18                  #アダプター配列除去後の許容する最短配列長を指定
param_nrec <- 500000                   #一度に処理するリード数を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(前処理)
res <- preprocessReads(filename=in_f1, #前処理を実行
             filenameMate=in_f2,       #前処理を実行
             outputFilename=out_f1,    #前処理を実行
             outputFilenameMate=out_f2,#前処理を実行
             nBases=param_nBases,      #許容するNの数
             minLength=param_minLength,#アダプター配列除去後の許容する最短配列長
             nrec=param_nrec)          #一度に処理するリード数
res                                    #確認してるだけです
	

前処理 | フィルタリング | paired-end | 共通リード抽出 | ShortRead(Morgan_2009)

ShortReadパッケージを用いて、 ファイル内での配列長とリード数が異なるpaired-endデータの2つのファイルを入力として、 両方に共通して存在するリードのみ抽出するやり方を示します。 QuasRは入力ファイルのリード数が揃ってないと受けつけないので、 ShortReadパッケージで別々に読み込む戦略を採用しています。

1. gzip圧縮FASTQ形式ファイル(SRR616268sub_trim_1.fastq.gzSRR616268sub_trim_2.fastq.gz)の場合:

前処理 | トリミング | アダプター配列除去(基礎) | QuasR(Gaidatzis_2015) の例題7と8の実行結果ファイルで、100万リード弱のpaired-endデータです。 SRR616268sub_trim_1.fastq.gzは、998,658リード、71,227,695 bytes (約71MB)です。 SRR616268sub_trim_2.fastq.gzは、999,136リード、63,442,904 bytes (約63MB)です。 前処理のところで長ったらしい作業をしているのは、FASTQファイル中のdescription行でリードのIDの対応付けがそのままではできないので、 対応付け可能な部分文字列を抽出しているためです。 イントロ | NGS | 読み込み | FASTQ形式 | description行の記述を整形のコードをテンプレートにしています。 共通リードは998,428個です。リード数がほとんど減っていないにもかかわらず、ファイルサイズが(71,227,695 bytes -> 63,446,240 bytes; 63,442,904 bytes -> 56,019,410 bytes)と大幅に減っているのは、description部分の記述内容が減っていることに起因します。

in_f1 <- "SRR616268sub_trim_1.fastq.gz"#入力ファイル名を指定してin_f1に格納
in_f2 <- "SRR616268sub_trim_2.fastq.gz"#入力ファイル名を指定してin_f2に格納
out_f1 <- "hoge1_1.fastq.gz"           #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1_2.fastq.gz"           #出力ファイル名を指定してout_f2に格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
fastq1 <- readFastq(in_f1)             #in_f1で指定したファイルの読み込み
fastq2 <- readFastq(in_f2)             #in_f2で指定したファイルの読み込み
head(id(fastq1), n=4)                  #description部分を表示
head(id(fastq2), n=4)                  #description部分を表示

#前処理(FASTQのdescription行を整形; in_f1)
fastq <- fastq1                        #fastqとして取り扱う
hoge <- strsplit(as.character(id(fastq)), " ", fixed=TRUE)#id(fastq)中の文字列を" "で区切った結果をリスト形式でhogeに格納
description <- BStringSet(sapply(hoge,"[[", 1))#hogeのリスト中の1番目の要素のみ取り出してdescriptionに格納
fastq <- ShortReadQ(sread(fastq), quality(fastq), description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成
head(id(fastq), n=4)                   #description部分を表示
fastq1 <- fastq                        #元に戻す

#前処理(FASTQのdescription行を整形; in_f2)
fastq <- fastq2                        #fastqとして取り扱う
hoge <- strsplit(as.character(id(fastq)), " ", fixed=TRUE)#id(fastq)中の文字列を" "で区切った結果をリスト形式でhogeに格納
description <- BStringSet(sapply(hoge,"[[", 1))#hogeのリスト中の1番目の要素のみ取り出してdescriptionに格納
fastq <- ShortReadQ(sread(fastq), quality(fastq), description)#ReadFastQ関数を用いてReadFastQというクラスオブジェクトを一から作成
head(id(fastq), n=4)                   #description部分を表示
fastq2 <- fastq                        #元に戻す

#本番
common <- intersect(id(fastq1), id(fastq2))#共通して現れるリードID情報を抽出
length(fastq1)                         #fastq1のリード数を表示
length(fastq2)                         #fastq2のリード数を表示
length(common)                         #共通リード数を表示
obj1 <- is.element(as.character(id(fastq1)), as.character(common))#共通リードの位置をTRUE、それ以外をFALSEとしたベクトルを作成
obj2 <- is.element(as.character(id(fastq2)), as.character(common))#共通リードの位置をTRUE、それ以外をFALSEとしたベクトルを作成

#ファイルに保存
writeFastq(fastq1[obj1], out_f1, compress=T)#fastqの中身を指定したファイル名で保存
writeFastq(fastq2[obj2], out_f2, compress=T)#fastqの中身を指定したファイル名で保存
file.size(in_f1)                       #入力ファイルのサイズを表示
file.size(in_f2)                       #入力ファイルのサイズを表示
file.size(out_f1)                      #出力ファイルのサイズを表示
file.size(out_f2)                      #出力ファイルのサイズを表示
	

アセンブル | について

アセンブルという言葉がなかなか理解しずらい人は、単純に「多重配列アラインメント(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という表現もなされるようです。

アセンブリを行う際に問題となるのは「リピート配列の取り扱い」や「アセンブルの際に設定する閾値」です。 前者については、ペアードエンド(paired-end)の一部がリピート配列の末端部分だったり、ペアードエンドの片方がリピート配列そのものであればリピート配列の素性がかなりわかります。

後者については、いわゆる感度・特異度の議論と本質的に同じで、combined total lengthをより長くする(つまり感度を上げたい)ためには多少ミスアセンブル(特異度が下がること; chimeric assembly)を許容する必要があります。

デノボゲノムアセンブリ(de novo genome assembly):

ゲノムアセンブリの手順は、以下に示すように大きく4つのステージに分けられるそうです(El-Metwally et al., PLoS Comput Biol., 2013):

  1. 前処理(pre-processing filtering; error correction)
  2. グラフ構築(graph construction process)
  3. グラフ簡易化(graph simplification process)
  4. 後処理(post-processing filtering)

1. 前処理(pre-processing filtering; error correction):

ここで行う処理は、塩基置換(substitution; mismatch)、インデル(indels; insertion/deletion)、曖昧な塩基(N)を含むリードの除去や補正です。 基本的な戦略は「エラーの頻度は低い」ですが、原理的に高頻度で出現するリピート配列の悪影響を受けるようです。

シークエンスエラー(sequencing error)と多型(polymorphism)の違いはグラフ構築後でないとわからないので、2.のグラフ構築ステップ時に行う場合もあるようです。 また、アセンブルプログラムの中に完全に組み込まれていたりなど切り分けは若干ややこしいですがざっとリストアップしておきます。 エラー補正プログラムとほぼ同義です。ちなみに、初期のアセンブラはこのエラー補正ステップがないようです(El-Metwally et al., PLoS Comput Biol., 2013)。 この理由は、ABI3730のような800bp程度まで読めるロングリードのアセンブリの場合は配列一致部分も長い(long overlap)ので、一致部分に多少のエラーを含もうが影響は限定的だったからです。

エラー補正は大きく4つのアプローチに分けられるそうです:K-spectrum (k-mer), Suffix Tree/Array (STA), Multiple Sequence Alignment (MSA), Hybrid。

2. グラフ構築(graph construction process):

ここで行うのは、前処理後のリードを用いてリード間のオーバーラップ(overlap)を頼りにつなげていく作業です。 シークエンスエラー(sequencing error)と多型(polymorphism)の違いを見るべく、グラフ構築時にエラー補正を行うものもあります。 おそらく全てのアセンブルプログラムはグラフ理論(Graph theory)を用いています。 一筆書きの問題をグラフ化して解くような学問です。 それらはさらに4つのアプローチに大別できます: Overlap (OLC), de Bruign (k-mer), Greedy, Hybrid。

2-1. Overlap-Layout-Consensus (OLC)アプローチ。アセンブル問題をハミルトンパス(Hamiltonian path)問題として解く、ABI3730 sequencerの頃から存在する伝統的な方法。 overlap, layout, and consensusの3つのステップからなるためOLCと略される。 454など比較的長い配列(数百塩基程度)のアセンブルを目的としたものが多いようですが、最近ではSGAやReadjoinerなどショートリードにもうまく対応したものが出てきているようです。

2-2. de Bruign (k-mer)アプローチ。これは、de Bruijn graph (DBG)中のオイラーパス探索(DBG approach; Eulerian approach; Euler approach; Eulerian path approach)に基づくもので、 グラフは頂点(ノード; nodes or vertices; 一つ一つの配列に相当)と辺(エッジ; edges or arcs)で表されますが、 リードを1塩基ずつずらして全ての可能なk-mer (all possible fixed k length strings; k個の連続塩基のことでkは任意の正の整数)を生成し各k-merをノードとした有向グラフ(k-merグラフ)を作成します。 全リードに対して同様の作業を行い、完全一致ノードをマージして得られるグラフがDBGです。 そしてこのグラフは各エッジを一度だけ通るオイラーパス(Eulerian path)をもつことが分かっているので、あとは既知のオイラーパス問題専用アルゴリズムを適用するというアプローチです。 どのk-merの値を用いればいいかはなかなか難しいようですが、KmerGenie (Chikh et al., Bioinformatics, 2014)という最適なkの値を見積もってくれるプログラムもあるようです。

2-3. Greedyアプローチ。貪欲法(Greedy algorithm)に基づくものですが、paired-endなどのリード全体の関係を考慮しないため、 あまり広くは使われていないようです。single-endリードを入力とし、比較的小さいサイズのゲノムに対して適しているとのことです (El-Metwally et al., PLoS Comput Biol., 2013)。

2-4. Hybridアプローチ。上記の異なる方法を組み合わせたhybridと、異なるシーケンサーを組み合わせたhybridの2種類あります。おそらく後者がhybrid assemblyと言われるものに相当します。

3. グラフ簡易化(graph simplification process):

ここで行うのは、グラフ構築後に複雑化したグラフをシンプルにしていく作業です。連続したノード(consecutive node) やバブル (bubble)のマージ作業に相当します。 Dead endの除去やリピート領域で形成されるX-cutを2つのパスに切り分ける作業なども含みます。

4. 後処理(post-processing filtering):

ここで行うのは、簡易化後のグラフを一筆書き(渡り歩く、とか横切る、というイメージでよい;これがトラバース)してコンティグを得る作業です。 paired-endリード情報を用いて、コンティグ同士を連結させたスーパーコンティグ(super-contigs)またはスカッフォールド(scaffolds)構築や、ミスアセンブリの同定も含みます。 2.のアセンブラの中にscaffolderを書いてあるのはscaffolding moduleを持っているものたちです(El-Metwally et al., PLoS Comput Biol., 2013)。 記載もれもあるとは思います。以下に示すのは、scaffoldingのみを単独で行うプログラムたちです。

評価体系:

アセンブリの精度評価(確からしさの見積もり)は一般に難しいようですが、メイトペア(mate pair)による制約(constraint)を一般に利用してアセンブルしますので、 それを満たしている(satisfaction)のがどの程度あるかやその制約に反した(vaiolation)結果がどの程度あったかということを精度評価に用いるというやり方も提案されています。 リファレンスとなるゲノム配列が既知の場合にはそれとの比較が有用だろうと思いますが、このあたりは私の守備範囲ではありません。 どのアセンブラがいいかについての評価を行う枠組みもあるようです。

トランスクリプトーム用アセンブラ:

どの方法も基本的にアセンブルする(配列同士を連結する)かどうかの判断基準として、k-mer (k個の連続塩基が)一致しているかどうかで判断しますが、 ゲノム用を改良して作成した初期のもののは、このkについて複数の値を利用するという戦略(de novo transcriptome assembly with multiple k-mer values)をとっているようです。 背景としては、ゲノム配列のアセンブリはゲノム全体でcoverageが一般に一定である(or 一定であることを仮定している)のに対して、 トランスクリプトームは転写物によってかなりcoverageが異なります。これは、遺伝子ごとに発現レベルが違うということをcoverageという別の言葉で説明しているだけです。 一般に、kの値を大きくすると高発現遺伝子(高発現転写物)からなるより長い"contig"が得られ、他方kを小さくすると低発現遺伝子がちゃんと"contig"として得られるといった感じになります。 もう少し別な言い方をすると、「kを大きくするとより長いcontig (transcript fragment; 転写物断片)が得られ、kを小さくすると転写物断片がさらに断片化されたようなものが得られる」というイメージです。 kの範囲についてですが、例えばTrans-ABySSはリードの長さがLだとするとL/2からL-1の範囲にしています。

ちなみに一般にkは奇数(odd number)を採用しますが、これはパリンドローム(palindrome)を回避するためらしいです。 例えば5'-ACGTTGCA-3'という配列でk=8を考えてみるとこの相補鎖も全く同じ(そういう配列がパリンドロームだから)で混乱してしまいますが、 kが例えば7や9のような奇数なら相補鎖にマッチすることはないのでパリンドローム問題にぶち当たることはないわけです。

アセンブル | ゲノム用

Rパッケージはおそらくありません。

プログラム:

Review、ガイドライン、パイプライン系:

アセンブル | トランスクリプトーム(転写物)用

Rパッケージはおそらくありません。

プログラム:

Review、ガイドライン、パイプライン系:

マッピング | について

リファレンス配列にマッピングを行うプログラム達です。 basic aligner (unspliced aligner)はsplice-aware aligner (spliced aligner)内部で使われていたりします。

R用:

R以外(basic aligner; unspliced aligner):

R以外(splice-aware aligner; spliced aligner):

R以外(Bisulfite sequencing (BS-seq)用):

Review、ガイドライン、パイプライン系:

マッピング | basic aligner

アルゴリズム的な観点から、Seed-and-extend系とBurrows-Wheeler transform (BWT)系の大きく2種類に大別可能です。 そのアルゴリズムの特性によって得手不得手があるようですのでご注意ください。 また、論文自体は古くても、プログラムを頻繁にバージョンアップさせてよりよくなっている場合もありますので、出版年にこだわる必要はあまりないのではと思っています。

プログラム:

Review、ガイドライン、パイプライン系:

以下は、2012年頃に書いたものですので情報自体は若干古いですが分類別にリストアップしています。

(BLASTやFASTA的な昔からある)Seed-and-extend methods

このカテゴリに含まれる方法は、マップするshort readよりもさらに短い配列(これがいわゆる"seed"; 種)の完全一致(perfect match)領域をリファレンス配列から探し、このseed領域を拡張(extend)させてアラインメントするというスタンスのものたちです。特徴としては、マップするリファレンス配列(ゲノム配列 or トランスクリプトーム配列)のクオリティが低い場合にも対応可能です。したがって、近縁種のゲノムにマップしたいような場合には、内部的にこのカテゴリに含まれるプログラムを採用しているほうがより多くマップさせることができることが期待されます。また、polymorphism (or sequence variation)の割合が高いようなものについても、こちらのカテゴリの方法のほうがよりよい結果を得られると期待されます。

以下のプログラムたちがこのカテゴリに含まれます:

Burrows-Wheeler transform (BWT) methods

このカテゴリに含まれる方法は、文字通りBWTというアルゴリズムを用いて効率的にマップしたいshort readsと完全一致(perfect match)する領域を探すものたちです。基本的にperfect matchを探すのに向いているため、ミスマッチを許容すると劇的に計算が遅くなります。したがって、比較的きれいなトランスクリプトーム配列に対してマップさせたい場合には、このカテゴリに含まれるプログラムを用いるほうが計算時間的に有利だと思います。short readのころには、このアルゴリズムを実装したプログラムがどんどんpublishされていたような印象がありますが、最近はどうなんでしょうね。こっち方面はあまりサーベイしていないのですが、プログラムのバージョンアップで多少のindelsに対しても頑健なものになっているのかもしれません。。。

以下のプログラムたちがこのカテゴリに含まれます:

マッピング | splice-aware aligner

basic alignerはジャンクションリード(junciton reads; spliced reads)のマッピングができません。 splice-aware alignerは計算に時間がかかるものの、それらもマッピングしてくれます。 SpliceMapは、リードの半分の長さをマップさせておいてそのアラインメントを拡張(extend)させる戦略を採用しています。 いずれの方法も、バージョンアップがどんどんなされるプログラムは、アルゴリズム(計算手順)自体も変わっていたりしますので参考程度にしてください。 大きな分類としては、seed-and-extend系とexon-first系に分けられるようです。 exon-first系は、内部的にbasic-alignerを用いてざっくりとマップできるものをマップし、マップされなかったものがジャンクションリード候補としてリードを分割してマップされる場所を探すイメージです。 seed-and-extend系は、前者に比べて計算時間がかかるものの、全リードを等価に取り扱うため、exon-first系にありがちな 「本当はジャンクションリードなんだけどbasic alignerでのマッピング時にpseudogeneにマップされてしまう」ということはないようです(Garber et al., 2011)。 その後multi-seed系の方法も提案されているようです(Gatto et al., 2014)。HISAT2というHISATとTopHat2の後継プログラムもあるようです(高橋 広夫 氏提供情報)。

プログラム:

Review、ガイドライン、パイプライン系:

マッピング | Bisulfite sequencing用

Bisulfite sequencingデータ専用のマッピングプログラムも結構あります。

プログラム:

Review、ガイドライン、パイプライン系:

マッピング | (ESTレベルの長さの) contig

NGSというよりは一般的なものですが、いくつか挙げておきます。 Trans-ABySSの論文中では、exonerate(のest2genomeというモード)でcontigをマウスゲノムにマップしています(Robertson et al., Nat Methods, 2010)。 また、SPALNはcDNA配列をゲノムにマップするものですが、私自身がEST配列をゲノムにマップする目的で使用した経験があります。

マッピング | 基礎

マッピングの基本形を示します。出力はBED形式と似ています(理解しやすいので...)。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. hoge4.faをリファレンス配列(マップされる側)として、data_reads.fasta中の4リードのマッピングを行う場合:

イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)です。

in_f1 <- "hoge4.fa"                    #入力ファイル名を指定してin_f1に格納(マップされる側)
in_f2 <- "data_reads.fasta"            #入力ファイル名を指定してin_f2に格納(マップする側)
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
reads <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み

#本番
out <- c("in_f2", "in_f1", "start", "end")#最終的に得る出力ファイルのヘッダー情報を指定してoutに格納(4列のデータを得る)
for(i in 1:length(reads)){             #リード数分だけループを回す
    hoge <- vmatchPattern(pattern=as.character(reads[i]), subject=fasta)#オブジェクトreads中の各塩基配列と100%マッチの領域を探索して結果をhogeに格納
    hoge1 <- cbind(start(unlist(hoge)), end(unlist(hoge)))#一致領域の(start, end)の位置情報をhoge1に格納
    hoge2 <- names(unlist(hoge))       #ヒットしたリファレンス配列中のIDをhoge2に格納
    hoge3 <- rep(as.character(reads[i]), length(hoge2))#hoge2の要素数分だけ、マップする側の配列(in_f2で指定するものに相当)のIDをhoge3に格納
    out <- rbind(out, cbind(hoge3, hoge2, hoge1))#cbind(hoge3, hoge2, hoge1)で表される欲しい情報をどんどんオブジェクトoutの下に追加している(ループが回るたびにどんどん行数が増えていっているイメージ)
}
head(out)                              #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#outの中身を指定したファイル名で保存
	

マッピング | single-end | ゲノム | basic aligner(基礎) | QuasR(Gaidatzis_2015)

QuasRパッケージを用いてsingle-end RNA-seqデータのリファレンスゲノム配列へのマッピングを行うやり方を示します。 basic alignerの一つであるBowtie (Langmead et al., Genome Biol., 2009)を実装した Rbowtieパッケージを内部的に使っています。 入力として与えるRNA-seqデータファイルはFASTA形式でもFASTQ形式でも構いません。ただし、拡張子が".fa", ".fna", ".fasta", ".fq", ".fastq"のいずれかでないといけないようです。 例えば".txt"だとエラーになります。また、圧縮ファイルでも構わないようです。".gz", ".bz2", ".xz"を認識できるようです。 リファレンスゲノムは、BSgenomeパッケージで利用可能なものをそのまま指定することができるようです。 つまり、available.genomes()でみられるパッケージ名を指定可能だということです。もし指定したパッケージがインストールされていなかった場合でも、自動でインストールしてくれるようです。 マッピングプログラム(aligner)のデフォルトは、ジャンクションリードのマッピングができないが高速なBowtie (Langmead et al., Genome Biol., 2009)です。 Bowtieプログラム自体は、複数個所にマップされるリードの取り扱い(uniquely mapped reads or multi-mapped reads)を"-m"オプションで指定したり、 許容するミスマッチ数を指定する"-v"などの様々なオプションを利用可能ですが、QuasR中では、"-m 1 -–best -–strata"オプションを基本として、内部的に自動選択するらしいです。 実際に用いられたオプションは下記スクリプト中のoutオブジェクトの出力結果から知ることができます。 この項目では、マッピングのオプションについては変更を加えずに、一つのRNA-seqファイルのマッピングを行う基本的なやり方を示しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1.サンプルデータ18,19のRNA-seqデータ(sample_RNAseq1.fa)のref_genome.faへのマッピングの場合:

mapping_single_genome1.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(sample_RNAseq1.fa)、 そして2行目の2列目に「任意のサンプル名」(例:namae)を記載したタブ区切りテキストファイルを用意した上で行います。 1行目の文字列は変えてはいけません(つまり"FileName"と"SampleName"のままにしておくということです) マッピング後に得られるBAM形式ファイルは、"sample_RNAseq1_XXXXXXXXXX.bam"というファイル名で作業ディレクトリ上に自動で生成されます。 ここで、XXXXXXXXXXはランダムな文字列からなります。 理由は、同じRNA-seqファイルを異なるパラメータやリファレンス配列にマッピングしたときに、同じ名前だと上書きしてしまう恐れがあるためです。 また、Quality Controlレポートも"sample_RNAseq1_XXXXXXXXXX_QC.pdf"というファイル名で作業ディレクトリ上に自動で生成されます。 マッピングに用いたパラメータは"-m 1 --best --strata -v 2"であったことがわかります。

in_f1 <- "mapping_single_genome1.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです
	

2.サンプルデータ18,19のRNA-seqのgzip圧縮ファイル(sample_RNAseq1.fa.gz)のref_genome.faへのマッピングの場合:

mapping_single_genome2.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(sample_RNAseq1.fa.gz)、 そして2行目の2列目に「任意のサンプル名」(例:asshuku)を記載したタブ区切りテキストファイルを用意した上で行います。 1行目の文字列は変えてはいけません(つまり"FileName"と"SampleName"のままにしておくということです) 圧縮ファイルをそのまま読み込ませることもできる例です。

in_f1 <- "mapping_single_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです
	

3.サンプルデータ18,19のRNA-seqのgzip圧縮ファイル(sample_RNAseq1.fa.gz)のref_genome.faへのマッピングの場合:

mapping_single_genome2.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(sample_RNAseq1.fa.gz)、 そして2行目の2列目に「任意のサンプル名」(例:asshuku)を記載したタブ区切りテキストファイルを用意した上で行います。 1行目の文字列は変えてはいけません(つまり"FileName"と"SampleName"のままにしておくということです) マッピング結果をBED形式ファイルとして保存するやり方です。GenomicAlignmentsパッケージを用いて内部的にBAM形式ファイルを読み込み、 BED形式に変換してから保存しています。qQCReport関数実行時に警告メッセージ(compressed 'fasta' input is not yet supported)が出ることを確認していますが、 単純にgzip圧縮FASTA形式ファイルはまだサポートされていないということだけで、マッピング自体はうまくいっているので問題ありません。

in_f1 <- "mapping_single_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

4.サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)のhoge4.faへのマッピングの場合:

mapping_single_genome3.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(SRR037439.fastq)、 そして2行目の2列目に「任意のサンプル名」(例:human_brain)を記載したタブ区切りテキストファイルを用意した上で行います。 1行目の文字列は変えてはいけません(つまり"FileName"と"SampleName"のままにしておくということです) 一つもマップされるものがない例であり、FASTQを入力ファイルとして読み込めるという例でもあります。もちろん圧縮ファイル形式でもOKです。

in_f1 <- "mapping_single_genome3.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "hoge4.fa"                    #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

5.サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)のトキソプラズマゲノムBSgenome.Tgondii.ToxoDB.7.0へのマッピングの場合:

mapping_single_genome3.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(SRR037439.fastq)、 そして2行目の2列目に「任意のサンプル名」(例:human_brain)を記載したタブ区切りテキストファイルを用意した上で行います。 1行目の文字列は変えてはいけません(つまり"FileName"と"SampleName"のままにしておくということです) ヒトRNA-seqデータをBSgenomeパッケージで利用可能な生物種のリファレンスゲノム配列にマッピングするやり方の一例です。 計算時間短縮のためゲノムサイズの小さいトキソプラズマゲノムBSgenome.Tgondii.ToxoDB.7.0を指定しています。 BSgenome.Hsapiens.UCSC.hg19を指定すると(おそらく数時間程度かかるかもしれませんが...)マップされる確率は当然上がります(同じ生物種なので)。

in_f1 <- "mapping_single_genome3.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Tgondii.ToxoDB.7.0" #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

マッピング | single-end | ゲノム | basic aligner(応用) | QuasR(Gaidatzis_2015)

QuasRパッケージを用いてsingle-end RNA-seqデータのリファレンスゲノム配列へのマッピングを行うやり方を示します。 basic alignerの1つであるBowtie (Langmead et al., Genome Biol., 2009)を実装した Rbowtieパッケージを内部的に使っています。 Bowtie自体は、複数個所にマップされるリードの取り扱い(uniquely mapped reads or multi-mapped reads)を"-m"オプションで指定したり、 許容するミスマッチ数を指定する"-v"などの様々なオプションを利用可能ですが、「基礎」のところではやり方を示しませんでした。 ここでは、マッピングのオプションをいくつか変更して挙動を確認したり、複数のRNA-seqファイルを一度にマッピングするやり方を示します。 尚、出力ファイルは、"*.bam", "*_QC.pdf", "*.bed"の3つです。それ以外のファイルは基本無視で大丈夫です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1.サンプルデータ18,19のRNA-seqデータ(sample_RNAseq1.fa)のref_genome.faへのマッピングの場合(mapping_single_genome1.txt):

オプションを"-m 1 --best --strata -v 0"とした例です。 sample_RNAseq1.faでマップされないのは計3リードです。 2リード("chr3_11_45"と"chr3_15_49")はchr5にもマップされるので、"-m 1"オプションで落とされます。 1リード("chr5_1_35")は該当箇所と完全一致ではない(4番目の塩基にミスマッチをいれている)ので落とされます。

in_f1 <- "mapping_single_genome1.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 0"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

2.サンプルデータ18,19のRNA-seqデータ(sample_RNAseq1.fa)のref_genome.faへのマッピングの場合(mapping_single_genome1.txt):

オプションを"-m 1 --best --strata -v 1"とした例です。 sample_RNAseq1.faでマップされないのは計2リードです。 chr5にもマップされる2リード("chr3_11_45"と"chr3_15_49")が"-m 1"オプションで落とされます。

in_f1 <- "mapping_single_genome1.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 1"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

3.サンプルデータ18,19のRNA-seqデータ(sample_RNAseq1.fa)のref_genome.faへのマッピングの場合(mapping_single_genome1.txt):

オプションを"-m 1 -v 1"とした例です。 sample_RNAseq1.faでマップされないのは計3リードです。 2リード("chr3_11_45"と"chr3_15_49")はchr5にもマップされるので、"-m 1"オプションで落とされます。 1リード("chr3_3_37")は該当箇所と完全一致ですが、chr5_3_37とは1塩基ミスマッチでマップ可能です。 "--best --strata"は最小のミスマッチ数でヒットした結果のみ出力するオプションなので、 これをつけておかないと"chr3_3_37"は2か所にマップされるリードということで"-m 1"オプションで落とされる、という例です。

in_f1 <- "mapping_single_genome1.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 -v 1"           #マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

4.サンプルデータ18-20の複数のRNA-seqデータ(sample_RNAseq1.fasample_RNAseq2.fa)をref_genome.faにマッピングする場合(mapping_single_genome4.txt):

複数のRNA-seqデータファイルを一度にマッピングするときに用意するファイルの記述例です。 下の行にどんどんマップしたいファイルを追加していくだけです。リード長が異なっていても大丈夫なようです。 sample_RNAseq1.faでマップされないのは計2リードです。 chr5にもマップされる2リード("chr3_11_45"と"chr3_15_49")が"-m 1"オプションで落とされます。 sample_RNAseq2.faでマップされないのは、2-4番目のジャンクションリードです。

in_f1 <- "mapping_single_genome4.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 1"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

5. gzip圧縮FASTQ形式ファイル(SRR609266.fastq.gz)のカイコゲノム(integretedseq.fa)へのマッピングの場合(mapping_single_genome7.txt):

small RNA-seqデータ(400Mb弱、11928428リード)です。 イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の7を実行して得られたものが SRR609266.fastq.gz (Nie et al., BMC Genomics, 2013)です。 カイコゲノム配列は、農業生物資源研究所(NIAS)が提供しているカイコゲノム配列のウェブページからIntegrated sequences (integretedseq.txt.gz) をダウンロードし、解凍します。解凍後のファイル名は"integretedseq.txt"となりますが、拡張子を".txt"から".fa"に変更して、"integretedseq.fa"としたものを使用しています。 ちなみに、イントロ | 一般 | 配列取得 | ゲノム配列 | 公共DBからを参考にして、 Ensemblから取得したBombyx_mori.GCA_000151625.1.22.dna.toplevel.fa.gzを解凍したものだと、 qAlign関数実行中に「これはfastaファイルではない」とエラーが出て実行できませんでした。20分強かかります。

in_f1 <- "mapping_single_genome7.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "integretedseq.fa"            #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 1"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

6. 2つのgzip圧縮FASTQ形式ファイル(SRR609266.fastq.gzhoge4.fastq.gz)のカイコゲノム(integretedseq.fa)へのマッピングの場合(mapping_single_genome8.txt):

small RNA-seqデータ(400Mb弱; 11928428リード; Nie et al., BMC Genomics, 2013)です。 イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の7を実行して得られたものがSRR609266.fastq.gzです。 また、前処理 | トリミング | アダプター配列除去(基礎) | ShortRead(Morgan_2009)の4を実行して得られたものがhoge4.fastq.gzです。 カイコゲノム配列は、農業生物資源研究所(NIAS)が提供しているカイコゲノム配列のウェブページ からIntegrated sequences (integretedseq.txt.gz) をダウンロードし、解凍します。解凍後のファイル名は"integretedseq.txt"となりますが、拡張子を".txt"から".fa"に変更して、"integretedseq.fa"としたものを使用しています。30分強かかります。

in_f1 <- "mapping_single_genome8.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "integretedseq.fa"            #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

7.srp017142_samplename.txt中のFASTQファイル群をBSgenome.Hsapiens.UCSC.hg19にマッピングする場合:

マップしたいFASTQファイルリストおよびそのサンプル名を記述したsrp017142_samplename.txtを作業ディレクトリに保存したうえで、下記を実行します。 BSgenomeパッケージで利用可能なBSgenome.Hsapiens.UCSC.hg19へマッピングしています。 名前から推測できるように"UCSC"の"hg19"にマップしているのと同じです。 basic alignerの一つであるBowtieを内部的に用いており、 ここではマッピング時のオプションを"-m 1 --best --strata -v 2"にしています。10時間程度かかります。

in_f1 <- "srp017142_samplename.txt"    #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

8.srp017142_samplename.txt中のFASTQファイル群をBSgenome.Hsapiens.UCSC.hg19にマッピングする場合:

7.と基本的に同じですが、parallelパッケージを用いて並列計算するやり方(高橋 広夫 氏提供情報) です。

in_f1 <- "srp017142_samplename.txt"    #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み
library(parallel)                      #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
cl <- makeCluster(detectCores()/2)     #実装されている最大スレッド数を検出し、その半分を利用(Hyper-Threadingでコア数の2倍のスレッド数が検出されるため)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
stopCluster(cl)                        #スレッドを停止
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

マッピング | single-end | ゲノム | splice-aware aligner | QuasR(Gaidatzis_2015)

QuasRパッケージを用いてsingle-end RNA-seqデータのリファレンスゲノム配列へのマッピングを行うやり方を示します。 splice-aware alignerの一つであるSpliceMap (Au et al., Nucleic Acids Res., 2010)を実装した Rbowtieパッケージを内部的に使っています。

(QuasRパッケージ中の)SpliceMap利用時は、リード長が50bp以上あることが条件のようです。 したがって、35bpのsample_RNAseq1.faを入力ファイルに含めるとエラーが出ます。

尚、出力ファイルは、"*.bam", "*_QC.pdf", "*.bed"の3つです。それ以外のファイルは基本無視で大丈夫です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1.サンプルデータ18と20のRNA-seqデータ(sample_RNAseq2.fa)をref_genome.faにマッピングする場合(mapping_single_genome5.txt):

デフォルトのオプションで実行する例です。

リード長が50bp以上ありますが、なぜか「failed while generating 25mers」という類のエラーが出ます。

in_f1 <- "mapping_single_genome5.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2,            #マッピングを行うqAlign関数を実行した結果をoutに格納
              splicedAlignment=T)      #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

2.サンプルデータ18と20のRNA-seqデータ(sample_RNAseq2.fa)をref_genome.faにマッピングする場合(mapping_single_genome5.txt):

オプションを"-max_intron 200 -min_intron 5 -max_multi_hit 5 -selectSingleHit TRUE -seed_mismatch 1 -read_mismatch 2 -try_hard yes"とした例です。

リード長が50bp以上ありますが、なぜか「failed while generating 25mers」という類のエラーが出ます。

in_f1 <- "mapping_single_genome5.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-max_intron 200 -min_intron 5 -max_multi_hit 5 -selectSingleHit TRUE -seed_mismatch 1 -read_mismatch 2 -try_hard yes"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2,            #マッピングを行うqAlign関数を実行した結果をoutに格納
              alignmentParameter=param_mapping,#マッピングを行うqAlign関数を実行した結果をoutに格納
              splicedAlignment=T)      #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

3.QuasRパッケージ中のサンプルRNA-seqデータ(rna_1_1.fq)の最初の5リードからなるファイル(sample_RNAseq3.fa)をref_genome.faにマッピングする場合(mapping_single_genome6.txt):

オプションを"-max_intron 200 -min_intron 5 -max_multi_hit 5 -selectSingleHit TRUE -seed_mismatch 1 -read_mismatch 2 -try_hard yes"とした例です。

リード長が50bp以上ありますが、なぜか「failed while generating 25mers」という類のエラーが出ます。

in_f1 <- "mapping_single_genome6.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-max_intron 200 -min_intron 5 -max_multi_hit 5 -selectSingleHit TRUE -seed_mismatch 1 -read_mismatch 2 -try_hard yes"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2,            #マッピングを行うqAlign関数を実行した結果をoutに格納
              alignmentParameter=param_mapping,#マッピングを行うqAlign関数を実行した結果をoutに格納
              splicedAlignment=T)      #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

4.QuasRパッケージ中のサンプルRNA-seqデータ(rna_1_1.fq)の最初の5リードからなるファイル(sample_RNAseq3.fa)をref_genome.faにマッピングする場合(mapping_single_genome6.txt):

デフォルトのオプションで実行する例です。 実際に用いられたオプションが"-max_intron 400000 -min_intron 20000 -max_multi_hit 10 -selectSingleHit TRUE -seed_mismatch 1 -read_mismatch 2 -try_hard yes"となっているのがわかります。

エラーが出なくなりますが当然?!マップされません。

in_f1 <- "mapping_single_genome6.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2,            #マッピングを行うqAlign関数を実行した結果をoutに格納
              splicedAlignment=T)      #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

5.QuasRパッケージ中のサンプルRNA-seqデータ(rna_1_1.fq)の最初の5リードからなるファイル(sample_RNAseq3.fa)をref_genome.faにマッピングする場合(mapping_single_genome6.txt):

オプションを"-max_intron 400000 -min_intron 20000 -max_multi_hit 10 -selectSingleHit TRUE -seed_mismatch 1 -read_mismatch 2 -try_hard yes"とした例です。

4.と同じ結果(エラーは出ないがマップされない)になります。

in_f1 <- "mapping_single_genome6.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-max_intron 400000 -min_intron 20000 -max_multi_hit 10 -selectSingleHit TRUE -seed_mismatch 1 -read_mismatch 2 -try_hard yes"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2,            #マッピングを行うqAlign関数を実行した結果をoutに格納
              alignmentParameter=param_mapping,#マッピングを行うqAlign関数を実行した結果をoutに格納
              splicedAlignment=T)      #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

マッピング | paired-end | ゲノム | basic aligner(基礎) | QuasR(Gaidatzis_2015)

QuasRパッケージを用いてpaired-end RNA-seqデータのリファレンスゲノム配列へのマッピングを行うやり方を示します。 basic alignerの1つであるBowtie (Langmead et al., Genome Biol., 2009)を実装した Rbowtieパッケージを内部的に使っています。 mapping_paired_genome1.txtのような2行目の1列目と2列目に「マッピングしたいRNA-seqファイル名1と2」 (例:sample_RNAseq_1.fasample_RNAseq_2.fa)、 そして2行目の3列目に「任意のサンプル名」(例:namae)を記載したタブ区切りテキストファイルを用意した上で行います。 1行目の文字列は変えてはいけません(つまり"FileName1", "FileName2",および"SampleName"のままにしておくということです)

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. mapping_paired_genome1.txt中のFASTQ形式ファイルを乳酸菌ゲノムにマッピングする場合:

乳酸菌RNA-seqデータSRR616268の最初の100万リード分です。 SRR616268sub_1.fastq.gzは、74,906,576 bytes、全リード107 bpです。 SRR616268sub_2.fastq.gzは、67,158,462 bytes、全リード93 bpです。 Ensembl (Zerbino et al., Nucleic Acids Res., 2018)から提供されている Lactobacillus casei 12Aの multi-FASTA形式ゲノム配列ファイル(Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa) がリファレンス配列です。マッピングオプションはデフォルトです。

in_f1 <- "mapping_paired_genome1.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqリストファイル)
in_f2 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

2. mapping_paired_genome2.txt中のFASTQ形式ファイルを乳酸菌ゲノムにマッピングする場合:

1.の入力ファイルから5'および3'側をrcode_20150707_preprocessing.txtに書いてある手順でトリム して得られた998,521リードからなるpaired-endのファイルです。 SRR616268sub_trim3_1.fastq.gz (59,092,219 bytes)と SRR616268sub_trim3_2.fastq.gz (54,667,920 bytes)です。 Ensembl (Zerbino et al., Nucleic Acids Res., 2018)から提供されている Lactobacillus casei 12Aの multi-FASTA形式ゲノム配列ファイル(Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa) がリファレンス配列です。マッピングオプションはデフォルトです。

in_f1 <- "mapping_paired_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqリストファイル)
in_f2 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

マッピング | paired-end | ゲノム | basic aligner(応用) | QuasR(Gaidatzis_2015)

QuasRパッケージを用いてpaired-end RNA-seqデータのリファレンスゲノム配列へのマッピングを行うやり方を示します。 basic alignerの1つであるBowtie (Langmead et al., Genome Biol., 2009)を実装した Rbowtieパッケージを内部的に使っています。 Bowtie自体は、複数個所にマップされるリードの取り扱い(uniquely mapped reads or multi-mapped reads)を"-m"オプションで指定したり、 許容するミスマッチ数を指定する"-v"などの様々なオプションを利用可能ですが、「基礎」のところではやり方を示しませんでした。 ここでは、マッピングのオプションをいくつか変更して挙動を確認したり、複数のRNA-seqファイルを一度にマッピングするやり方を示します。 尚、出力ファイルは、"*.bam", "*_QC.pdf", "*.bed"の3つです。それ以外のファイルは基本無視で大丈夫です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. mapping_paired_genome2.txt中のFASTQ形式ファイルを乳酸菌ゲノムにマッピングする場合:

998,521リードからなるpaired-endのファイルです。 SRR616268sub_trim3_1.fastq.gz (59,092,219 bytes)と SRR616268sub_trim3_2.fastq.gz (54,667,920 bytes)です。 Ensembl (Zerbino et al., Nucleic Acids Res., 2018)から提供されている Lactobacillus casei 12Aの multi-FASTA形式ゲノム配列ファイル(Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa) がリファレンス配列です。 オプションを"-m 1 --best --strata -v 0"とした例です。 -m 1で1か所にのみマップされるリード、 -v 0で許容するミスマッチ数を0個にしています。 --best --strataは、許容するミスマッチ数が1以上の場合に効果を発揮します。 ここでは意味をなしませんが、つけておいて悪さをするものではないので、通常は無条件でつけます。

in_f1 <- "mapping_paired_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqリストファイル)
in_f2 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 0"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

2. mapping_paired_genome2.txt中のFASTQ形式ファイルを乳酸菌ゲノムにマッピングする場合:

1.と基本的に同じで、オプションを"-m 1 --best --strata -v 2"とした例です。 -m 1で1か所にのみマップされるリード、 -v 2で許容するミスマッチ数を2個にしています。 --best --strataをつけておくことで、例えば同じリードがミスマッチ数0個(perfect match)でマップされるのが1か所のみだったにもかかわらず、 ミスマッチ数1 or 2個でもマップされるされる別の場所があったときに-m 1の効果で複数個所にマップされるとして出力されなくなる不幸をなくすことができます。 もっともよい層(best strata)のみで評価するという捉え方でいいでしょう。これがどうしても嫌だというヒトは普通はいませんので、通常は無条件でつけます。

in_f1 <- "mapping_paired_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqリストファイル)
in_f2 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

マッピング | paired-end | トランスクリプトーム | basic aligner(基礎) | QuasR(Gaidatzis_2015)

QuasRパッケージを用いてpaired-end RNA-seqデータのリファレンスゲノム配列へのマッピングを行うやり方を示します。 basic alignerの1つであるBowtie (Langmead et al., Genome Biol., 2009)を実装した Rbowtieパッケージを内部的に使っています。 mapping_paired_genome1.txtのような2行目の1列目と2列目に「マッピングしたいRNA-seqファイル名1と2」 (例:sample_RNAseq_1.fasample_RNAseq_2.fa)、 そして2行目の3列目に「任意のサンプル名」(例:namae)を記載したタブ区切りテキストファイルを用意した上で行います。 1行目の文字列は変えてはいけません(つまり"FileName1", "FileName2",および"SampleName"のままにしておくということです)

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. mapping_paired_genome2.txt中のFASTQ形式ファイルを乳酸菌トランスクリプトーム配列(transcriptome_Lcasei12A.fasta)にマッピングする場合:

乳酸菌RNA-seqデータSRR616268の998,521リードからなるpaired-endのファイルです。 SRR616268sub_trim3_1.fastq.gz (59,092,219 bytes)と SRR616268sub_trim3_2.fastq.gz (54,667,920 bytes)です。 リファレンス配列は「イントロ | 一般 | 配列取得 | トランスクリプトーム配列 | GenomicFeatures(Lawrence_2013)」 の例題6を実行して得られたもの(transcriptome_Lcasei12A.fasta)を利用します。 マッピングオプションはデフォルトです。

in_f1 <- "mapping_paired_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqリストファイル)
in_f2 <- "transcriptome_Lcasei12A.fasta"#入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

マッピング | paired-end | トランスクリプトーム | basic aligner(応用) | QuasR(Gaidatzis_2015)

QuasRパッケージを用いてpaired-end RNA-seqデータのリファレンスゲノム配列へのマッピングを行うやり方を示します。 basic alignerの1つであるBowtie (Langmead et al., Genome Biol., 2009)を実装した Rbowtieパッケージを内部的に使っています。 mapping_paired_genome1.txtのような2行目の1列目と2列目に「マッピングしたいRNA-seqファイル名1と2」 (例:sample_RNAseq_1.fasample_RNAseq_2.fa)、 そして2行目の3列目に「任意のサンプル名」(例:namae)を記載したタブ区切りテキストファイルを用意した上で行います。 1行目の文字列は変えてはいけません(つまり"FileName1", "FileName2",および"SampleName"のままにしておくということです)

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. mapping_paired_genome2.txt中のFASTQ形式ファイルを乳酸菌トランスクリプトーム配列(transcriptome_Lcasei12A.fasta)にマッピングする場合:

乳酸菌RNA-seqデータSRR616268の998,521リードからなるpaired-endのファイルです。 SRR616268sub_trim3_1.fastq.gz (59,092,219 bytes)と SRR616268sub_trim3_2.fastq.gz (54,667,920 bytes)です。 リファレンス配列は「イントロ | 一般 | 配列取得 | トランスクリプトーム配列 | GenomicFeatures(Lawrence_2013)」 の例題6を実行して得られたもの(transcriptome_Lcasei12A.fasta)を利用します。 オプションを"-m 1 --best --strata -v 0"とした例です。 -m 1で1か所にのみマップされるリード、 -v 0で許容するミスマッチ数を0個にしています。 --best --strataは、許容するミスマッチ数が1以上の場合に効果を発揮します。 ここでは意味をなしませんが、つけておいて悪さをするものではないので、通常は無条件でつけます。

in_f1 <- "mapping_paired_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqリストファイル)
in_f2 <- "transcriptome_Lcasei12A.fasta"#入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 0"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

マップ後 | について

(ゲノムやトランスクリプトーム配列へのマッピング時には問題にならないと思いますが、おそらく)RNA-seqのアセンブルを行う場合には、sequencing errorの除去以外にも「アダプター配列」や「low-complexity reads (低複雑性のリード;繰り返し配列)」や「PCR duplicates(ロングインサートライブラリによくあるらしい...)」の除去を行うのが普通なようです。(私がTrinityでアセンブルを行う場合にはそんなことやったこともないのですが、やったら大分違うのでしょうか。。。)ここではこれらのerror除去を行うプログラムを列挙しておきます:

入力ファイルがリファレンス配列へのマップ後のファイル(SAM/BAM, BED, GFF形式など)(Rパッケージ):

入力ファイルがリファレンス配列へのマップ後のファイル(SAM/BAM, BED, GFF形式など)(R以外):

(おそらく)454 platform用:

その他:

マップ後 | 出力ファイル形式について

様々ないろいろな出力ファイル形式があることがわかります。

注目すべきは、Sequence Alignment/Map (SAM) formatです。この形式は国際共同研究の1000人のゲノムを解析するという1000 Genomes Projectで採用された(開発された)フォーマットで、("@"から始まる)header sectionと(そうでない)alignment sectionから構成されています。このヒトの目で解読可能な形式がSAMフォーマットで、このバイナリ版がBinary Alignment/Map (BAM)フォーマットというものです。今後SAM/BAM formatという記述をよく見かけるようになることでしょう。

代表的な出力ファイル形式:

マップ後 | 出力ファイルの読み込み | BAM形式 | について

マッピング結果の標準出力ファイルは、SAM/BAM形式と呼ばれるファイルです(Li et al., Bioinformatics, 2009)。 2016年頃からは、PacBioの生の出力ファイルもBAM形式になっています。 ここではSAM/BAM形式ファイルを読み込めるものをリストアップします。

R用:

R以外:

Review、ガイドライン、パイプライン系:

マップ後 | 出力ファイルの読み込み | BAM形式 | rbamtools(Kaisers_2015)

rbamtoolsパッケージを用いてBAM形式ファイルを読み込むやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. sample_RNAseq1.bamの場合:

in_f <- "sample_RNAseq1.bam"           #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(rbamtools)                     #パッケージの読み込み

#入力ファイルの読み込み
hoge <- bamReader(in_f)                #BAM形式ファイルを読み込んだ結果をhogeに格納
hoge                                   #確認してるだけです
	

マップ後 | 出力ファイルの読み込み | BAM形式 | GenomicAlignments(Lawrence_2013)

GenomicAlignmentsパッケージを用いてBAM形式ファイルを読み込むやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. sample_RNAseq1.bamの場合:

in_f <- "sample_RNAseq1.bam"           #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(GenomicAlignments)             #パッケージの読み込み

#入力ファイルの読み込み
hoge <- readGAlignments(in_f)          #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
hoge                                   #確認してるだけです
	

マップ後 | 出力ファイルの読み込み | Bowtie形式

Bowtie形式出力ファイルを読み込むやり方を、yeastRNASeqパッケージ中にある(このパッケージがインストールされていることが前提です)wt_1_f.bowtie.gzファイルを例として解説します。yeastRNASeqというパッケージがインストールされていれば、(例えば私のWindows 7, 64bitマシン環境だと)「コンピュータ - OS(C:) - Program Files - R - R-3.0.1 - library - yeastRNASeq - reads」から目的のファイルにたどり着きます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ディレクトリの変更をちゃんとやった場合:

in_f <- "wt_1_f.bowtie.gz"             #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
aligned <- readAligned(in_f, type="Bowtie")#in_fで指定したファイルの読み込み
aligned                                #確認してるだけです
	

2. yeastRNASeqパッケージ中のreadsフォルダ中に目的のファイルがあることが既知の場合:

in_f <- "wt_1_f.bowtie.gz"             #入力ファイル名を指定してin_fに格納
param1 <- "yeastRNASeq"                #パッケージ名を指定
param2 <- "reads"                      #フォルダ名を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
path <- file.path(system.file(package=param1, param2))#ファイルパスの指定
aligned <- readAligned(path, in_f, type="Bowtie")#in_fで指定したファイルの読み込み
aligned                                #確認してるだけです
	

マップ後 | 出力ファイルの読み込み | SOAP形式

basic alignerの一つであるSOAPを実行して得られたSOAP形式ファイルの読み込み例をいくつか示します。

SOAP以外のフォーマットも「マッピング | 出力ファイルの読み込み |」を参考にして、必要な情報さえ読み込んでおけば、それ以降は同じです。 SOAP形式ファイルの場合、param1に相当するのは入力ファイルの8列目の記述に、そしてparam2に相当するのは7列目の記述に相当します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. output.soapの場合:

885リードからなるファイルです。8番染色体上の+鎖のみにマップされたリードのみFASTAファイルで保存するやり方1です。

in_f <- "output.soap"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- "chr08"                      #染色体の条件を指定
param2 <- "+"                          #strandの条件を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
aligned <- readAligned(in_f, type="SOAP")#in_fで指定したファイルの読み込み
aligned                                #確認してるだけです

#本番(フィルタリング)
aligned <- aligned[aligned@chromosome == param1]#param1で指定した染色体の情報のみ抽出して、alignedに格納
aligned                                #確認してるだけです
aligned <- aligned[aligned@strand == "+"]#param2で指定したstrandのもののみ抽出して、alignedに格納
aligned                                #確認してるだけです

#後処理(FASTA形式に変換)
fasta <- sread(aligned)                #alignedで得られたオブジェクトから塩基配列情報をDNAStringSetオブジェクトとして得たい場合
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

2. output.soapの場合:

885リードからなるファイルです。8番染色体上の+鎖のみにマップされたリードのみFASTAファイルで保存するやり方2です。

in_f <- "output.soap"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- "chr08"                      #染色体の条件を指定
param2 <- "+"                          #strandの条件を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
aligned <- readAligned(in_f, type="SOAP")#in_fで指定したファイルの読み込み
aligned                                #確認してるだけです

#本番(フィルタリング)
hoge <- compose(chromosomeFilter(param1), strandFilter(param2))#param1 and param2で指定したフィルタリング条件をまとめてhogeに格納
aligned <- aligned[hoge(aligned)]      #フィルタリングを実行して、その結果をalignedに格納

#後処理(FASTA形式に変換)
fasta <- sread(aligned)                #alignedで得られたオブジェクトから塩基配列情報をDNAStringSetオブジェクトとして得たい場合
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

3. output.soapの場合:

885リードからなるファイルです。strandは気にせずに10番染色体上にマップされたリードのみFASTAファイルで保存するやり方です。

in_f <- "output.soap"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.fasta"                 #出力ファイル名を指定してout_fに格納
param1 <- "chr10"                      #染色体の条件を指定

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
aligned <- readAligned(in_f, type="SOAP")#in_fで指定したファイルの読み込み
aligned                                #確認してるだけです

#本番(フィルタリング)
hoge <- compose(chromosomeFilter(param1))#param1で指定したフィルタリング条件をまとめてhogeに格納
aligned <- aligned[hoge(aligned)]      #フィルタリングを実行して、その結果をalignedに格納

#後処理(FASTA形式に変換)
fasta <- sread(aligned)                #alignedで得られたオブジェクトから塩基配列情報をDNAStringSetオブジェクトとして得たい場合
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	

4. output.soapの場合:

染色体ごとにマップされたリード数情報を取得するやり方です。

in_f <- "output.soap"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
aligned <- readAligned(in_f, type="SOAP")#in_fで指定したファイルの読み込み
aligned                                #確認してるだけです

#本番
out <- as.data.frame(table(aligned@chromosome))#頻度情報をカウントした結果をoutに格納
colnames(out) <- c("chromosome", "frequency")#列名を付与
head(out)                              #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

5. output.soapの場合:

染色体およびstrandごとにマップされたリード数情報を取得するやり方です。

in_f <- "output.soap"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
aligned <- readAligned(in_f, type="SOAP")#in_fで指定したファイルの読み込み

#本番
hoge <- paste(aligned@chromosome, aligned@strand, sep="___")#染色体名とstrand情報を(区切り文字を"___"として)一時的に連結させた結果をhogeに格納
out <- as.data.frame(table(hoge))      #頻度情報をカウントした結果をoutに格納
colnames(out) <- c("chromosome___strand", "frequency")#列名を付与
head(out)                              #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

マップ後 | 出力ファイルの読み込み | htSeqTools (Planet_2012)

比較解析などの場合に「複数のサンプル間のクラスタリングをまず行う」ことをトランスクリプトーム解析の基本手順として行ったほうがよい、ということを私の講義でも述べていますが、このパッケージでも1) サンプル間の類似度をMDSプロットで表現する機能があるようですね。

また、2) PCR biasに起因する一部のリードが大量にシークエンスされてしまったようなものも、BIC (Bayesian Information Criterion)を用いたリピート数のモデル化ややFDR (False Discovery Rate)の閾値を設けて取り除くようなこともできるようです。

ChIP-seq (or MeDIP, DNase-seq)などの場合には、controlに対してimmuno-precipitation (IP)サンプルにおける特定の領域中のリード数(coverage)が増大します。このcoverageの標準偏差(standard deviation; SD)はリード数nのルートに比例するらしいです。なのでもしIPサンプルのSDn (=SD/sqrt(n))がcontrolサンプルのSDnと同程度であればIPがうまくいっていないことを意味します。このパッケージでは、この3) enrichment efficiencyの評価もできるようです。

その他には、ゲノムにマップされた領域のスクリーニングや、領域ごとにマップされたリード数をカウントしたり、複数サンプル間でのリード数の比較をlikelihod ratioやpermutationカイ二乗検定で行ってくれるようです。

ちなみに、入力ファイルの形式はBAM形式ファイル(Rsamtools or ShortReadパッケージで読み込み可能)かBED, GFF, WIG形式ファイル(rtracklayerパッケージで読み込み可能)で、マップ後のファイルということになります。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

in_f <- ""                             #読み込みたいファイル名を指定してin_fに格納

#必要なパッケージをロード
library(htSeqTools)                    #パッケージの読み込み
	

マップ後 | カウント情報取得 | について

BAM形式などのマッピング結果ファイルからカウントデータを取得するためのパッケージや関数もいくつかあります。 htSeqToolsのislandCounts関数、 Rsubread(Windows版はなし)のfeatureCounts関数(Liao et al., Bioinformatics, 2014)、 GenomicRangesのsummarizeOverlaps関数などです。 QuasRは、内部的にGenomicRangesのsummarizeOverlaps関数を利用しています。 scaterは、内部的にkallisto (Bray et al., Nat Biotechnol., 2016)を利用しており、トランスクリプトーム配列へのマッピングからカウント情報取得まで行ってくれるようです。

Rパッケージ:

R以外:

マップ後 | カウント情報取得 | single-end | ゲノム | アノテーション有 | QuasR(Gaidatzis_2015)

QuasRパッケージを用いたsingle-end RNA-seqデータのリファレンスゲノム配列へのBowtieによるマッピングから、 カウントデータ取得までの一連の流れを示します。アノテーション情報は、GenomicFeatures パッケージ中の関数を利用してTxDbオブジェクトをネットワーク経由で取得するのを基本としつつ、 TxDbパッケージを読み込むやり方も示しています。 マッピングのやり方やオプションの詳細については マッピング | single-end | ゲノム | basic aligner(応用) | QuasR(Gaidatzis_2015)などを参考にしてください。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1.サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の BSgenome.Hsapiens.UCSC.hg19 へのマッピング結果の場合:

mapping_single_genome3.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(SRR037439.fastq)、 そして2行目の2列目に「任意のサンプル名」(例:human_brain)を記載したタブ区切りテキストファイルを用意した上で(オプションを"-m 1 --best --strata -v 2"として)行っています。 hg19にマップした結果なので、TxDbオブジェクト取得時のゲノム情報もそれを基本として、 UCSC Genes ("knownGene")を指定しているので、Entrez Gene IDに対するカウントデータ取得になっています。

in_f1 <- "mapping_single_genome3.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param_txdb1 <- "hg19"                  #TxDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param_txdb2 <- "knownGene"             #TxDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param_reportlevel <- "gene"            #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#前処理(マッピング)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#前処理(TxDbオブジェクト作成)
txdb <- makeTxDbFromUCSC(genome=param_txdb1, tablename=param_txdb2)#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param_reportlevel)#カウントデータ行列を取得してcountに格納
dim(count)                             #行数と列数を表示
head(count)                            #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(count), count)   #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2.サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の BSgenome.Hsapiens.UCSC.hg19 へのマッピング結果の場合:

mapping_single_genome3.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(SRR037439.fastq)、 そして2行目の2列目に「任意のサンプル名」(例:human_brain)を記載したタブ区切りテキストファイルを用意した上で (オプションを"-m 1 --best --strata -v 2"として)行っています。 hg19にマップした結果なので、TxDbオブジェクト取得時のゲノム情報もそれを基本として、 RefSeq Genes ("refGene")を指定しているのでRefSeq Gene IDに対するカウントデータ取得になっていますはずですが、そうはなっていません。 この理由は(バグか開発者のポリシーかは不明ですが)おそらくRefSeqが転写物単位のIDなためゲノムマッピング結果の取り扱いとは相性が悪いためでしょう。 ちなみに長さ情報は変わっているので、なんらかの形でRefSeqの情報が反映されているのでしょう。

in_f1 <- "mapping_single_genome3.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param_txdb1 <- "hg19"                  #TxDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param_txdb2 <- "refGene"               #TxDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param_reportlevel <- "gene"            #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#前処理(マッピング)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#前処理(TxDbオブジェクト作成)
txdb <- makeTxDbFromUCSC(genome=param_txdb1, tablename=param_txdb2)#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param_reportlevel)#カウントデータ行列を取得してcountに格納
dim(count)                             #行数と列数を表示
head(count)                            #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(count), count)   #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3.サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の BSgenome.Hsapiens.UCSC.hg19へのマッピング結果の場合:

mapping_single_genome3.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(SRR037439.fastq)、 そして2行目の2列目に「任意のサンプル名」(例:human_brain)を記載したタブ区切りテキストファイルを用意した上で (オプションを"-m 1 --best --strata -v 2"として)行っています。 hg19にマップした結果なので、TxDbオブジェクト取得時のゲノム情報もそれを基本として Ensembl Genes ("ensGene")を指定しているので、Ensembl Gene IDに対するカウントデータ取得になっています。

in_f1 <- "mapping_single_genome3.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param_txdb1 <- "hg19"                  #TxDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param_txdb2 <- "ensGene"               #TxDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param_reportlevel <- "gene"            #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#前処理(マッピング)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#前処理(TxDbオブジェクト作成)
txdb <- makeTxDbFromUCSC(genome=param_txdb1, tablename=param_txdb2)#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param_reportlevel)#カウントデータ行列を取得してcountに格納
dim(count)                             #行数と列数を表示
head(count)                            #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(count), count)   #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4.サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の BSgenome.Hsapiens.UCSC.hg19へのマッピング結果の場合:

mapping_single_genome3.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(SRR037439.fastq)、 そして2行目の2列目に「任意のサンプル名」(例:human_brain)を記載したタブ区切りテキストファイルを用意した上で (オプションを"-m 1 --best --strata -v 2"として)行っています。 hg19にマップした結果なので、TxDbオブジェクト取得時のゲノム情報もそれを基本として Ensembl Genes ("ensGene")を指定しているので、Ensembl Gene IDに対するカウントデータ取得になっています。

基本は3と同じですが、一般的なカウントデータ行列の形式(2列目以降がカウント情報)にし、配列長情報と別々のファイルにして保存するやり方です。

in_f1 <- "mapping_single_genome3.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f1 <- "hoge4_count.txt"            #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge4_genelength.txt"       #出力ファイル名を指定してout_f2に格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param_txdb1 <- "hg19"                  #TxDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param_txdb2 <- "ensGene"               #TxDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param_reportlevel <- "gene"            #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#前処理(マッピング)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#前処理(TxDbオブジェクト作成)
txdb <- makeTxDbFromUCSC(genome=param_txdb1, tablename=param_txdb2)#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param_reportlevel)#カウントデータ行列を取得してcountに格納
dim(count)                             #行数と列数を表示
head(count)                            #確認してるだけです

#ファイルに保存(カウント情報)
data <- count[,-1]                     #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(遺伝子配列長情報)
genelength <- count[,1]                #遺伝子配列長情報をgenelengthに格納
tmp <- cbind(names(genelength), genelength)#保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5.サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の BSgenome.Hsapiens.UCSC.hg19へのマッピング結果の場合:

mapping_single_genome3.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(SRR037439.fastq)、 そして2行目の2列目に「任意のサンプル名」(例:human_brain)を記載したタブ区切りテキストファイルを用意した上で (オプションを"-m 1 --best --strata -v 2"として)行っています。 3.と違って、TxDbオブジェクト取得時に、Ensemblにアクセスしてhsapiens_gene_ensembl をデータベース名として指定しています。

ちなみにこれは、txdbオブジェクトの作成まではうまくいきますが、最後のqCount関数の実行のところでエラーが出ます。 理由は、Ensemblで提供されている染色体名seqnames(transcripts(txdb))の中にBSgenome.Hsapiens.UCSC.hg19で提供されている染色体名以外の名前のものが含まれているためです。 データ提供元が異なるとうまくいかない例です。

in_f1 <- "mapping_single_genome3.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param_txdb_ds <- "hsapiens_gene_ensembl"#データセット名を指定(「listDatasets(useMart("ensembl"))」にリストアップされているものを指定可能)
param_reportlevel <- "gene"            #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#前処理(マッピング)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#前処理(TxDbオブジェクト作成)
txdb <- makeTxDbFromBiomart(dataset=param_txdb_ds)#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param_reportlevel)#カウントデータ行列を取得してcountに格納
data <- count[,-1]                     #カウント情報をdataに格納

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

6.srp017142_samplename.txt中のFASTQファイル群をBSgenome.Hsapiens.UCSC.hg19にマッピングする場合:

マップしたいFASTQファイルリストおよびそのサンプル名を記述したsrp017142_samplename.txtを作業ディレクトリに保存したうえで、下記を実行します。 BSgenome.Hsapiens.UCSC.hg19へマッピングしています。 名前から推測できるように"UCSC"の"hg19"にマップしているのと同じです。 basic alignerの一つであるBowtieを内部的に用いており、 ここではマッピング時のオプションを"-m 1 --best --strata -v 2"にしています。 ここでの目的はUCSC known genesのgene-levelのカウントデータを得ることです。10時間程度かかります。 TxDbオブジェクトのバージョン次第で行数やカウント数は若干変化しますがhoge6.txtのような感じになっていれば正解です。

in_f1 <- "srp017142_samplename.txt"    #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_txdb <- "TxDb.Hsapiens.UCSC.hg19.knownGene"#パッケージ名を指定(TxDB系のアノテーションパッケージ)
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param_reportlevel <- "gene"            #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#前処理(マッピング)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#前処理(TxDbオブジェクト作成)
library(param_txdb, character.only=T)  #指定したパッケージの読み込み
tmp <- ls(paste("package", param_txdb, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param_reportlevel)#カウントデータ行列を取得してcountに格納
data <- count[,-1]                     #カウント情報をdataに格納

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

7.srp017142_samplename.txt中のFASTQファイル群をBSgenome.Hsapiens.UCSC.hg19にマッピングする場合:

6と基本的に同じです。UCSC known genesのgene-levelとexon-levelの両方のカウントデータを同時に得るやり方です。 TxDbオブジェクトのバージョン次第で行数やカウント数は若干変化しますがhoge7_count_gene.txthoge7_count_exon.txtのような感じになっていれば正解です。

in_f1 <- "srp017142_samplename.txt"    #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f1 <- "hoge7_count_gene.txt"       #出力ファイル名を指定してout_f1に格納(カウントデータ)
out_f2 <- "hoge7_count_exon.txt"       #出力ファイル名を指定してout_f2に格納(カウントデータ)
param_txdb <- "TxDb.Hsapiens.UCSC.hg19.knownGene"#パッケージ名を指定(TxDB系のアノテーションパッケージ)
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#前処理(マッピング)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#前処理(TxDbオブジェクト作成)
library(param_txdb, character.only=T)  #指定したパッケージの読み込み
tmp <- ls(paste("package", param_txdb, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納

#本番(カウントデータ取得と保存; gene-level)
count <- qCount(out, txdb, reportLevel="gene")#カウントデータ行列を取得してcountに格納
data <- count[,-1]                     #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
data_gene <- data                      #dataをdata_geneに格納

#本番(カウントデータ取得と保存; exon-level)
count <- qCount(out, txdb, reportLevel="exon")#カウントデータ行列を取得してcountに格納
data <- count[,-1]                     #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
data_exon <- data                      #dataをdata_exonに格納
	

8.srp017142_samplename.txt中のFASTQファイル群をBSgenome.Hsapiens.UCSC.hg19にマッピングする場合:

7と基本的に同じです。Quality Control (QC)レポートファイルも作成するやり方です。 TxDbオブジェクトのバージョン次第で行数やカウント数は若干変化しますがhoge8_QC.pdfhoge8_count_gene.txthoge8_count_exon.txtのような感じになっていれば正解です。

in_f1 <- "srp017142_samplename.txt"    #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f1 <- "hoge8_count_gene.txt"       #出力ファイル名を指定してout_f1に格納(カウントデータ)
out_f2 <- "hoge8_count_exon.txt"       #出力ファイル名を指定してout_f2に格納(カウントデータ)
out_f3 <- "hoge8_QC.pdf"               #出力ファイル名を指定してout_f3に格納(QCファイル)
param_txdb <- "TxDb.Hsapiens.UCSC.hg19.knownGene"#パッケージ名を指定(TxDB系のアノテーションパッケージ)
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#前処理(マッピング)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数
qQCReport(out, pdfFilename=out_f3)     #QCレポート結果をファイルに保存

#前処理(TxDbオブジェクト作成)
library(param_txdb, character.only=T)  #指定したパッケージの読み込み
tmp <- ls(paste("package", param_txdb, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
txdb <- eval(parse(text=tmp))          #文字列tmpをRオブジェクトとしてtxdbに格納

#本番(カウントデータ取得と保存; gene-level)
count <- qCount(out, txdb, reportLevel="gene")#カウントデータ行列を取得してcountに格納
data <- count[,-1]                     #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
data_gene <- data                      #dataをdata_geneに格納

#本番(カウントデータ取得と保存; exon-level)
count <- qCount(out, txdb, reportLevel="exon")#カウントデータ行列を取得してcountに格納
data <- count[,-1]                     #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
data_exon <- data                      #dataをdata_exonに格納
	

9.srp017142_samplename.txt中のFASTQファイル群をBSgenome.Hsapiens.UCSC.hg19にマッピングする場合:

4と8を組み合わせたようなやり方です。数値だけのUCSC gene IDではなくEnsembl Gene IDで取り扱うやり方です。 TxDbオブジェクトのバージョン次第で行数やカウント数は若干変化しますがhoge9_QC.pdfhoge9_count_gene.txthoge9_count_exon.txtのような感じになっていれば正解です。

in_f1 <- "srp017142_samplename.txt"    #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f1 <- "hoge9_count_gene.txt"       #出力ファイル名を指定してout_f1に格納(カウントデータ)
out_f2 <- "hoge9_count_exon.txt"       #出力ファイル名を指定してout_f2に格納(カウントデータ)
out_f3 <- "hoge9_QC.pdf"               #出力ファイル名を指定してout_f3に格納(QCファイル)
param_txdb1 <- "hg19"                  #TxDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param_txdb2 <- "ensGene"               #TxDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#前処理(マッピング)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数
qQCReport(out, pdfFilename=out_f3)     #QCレポート結果をファイルに保存

#前処理(TxDbオブジェクト作成)
txdb <- makeTxDbFromUCSC(genome=param_txdb1, tablename=param_txdb2)#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#本番(カウントデータ取得と保存; gene-level)
count <- qCount(out, txdb, reportLevel="gene")#カウントデータ行列を取得してcountに格納
data <- count[,-1]                     #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
data_gene <- data                      #dataをdata_geneに格納

#本番(カウントデータ取得と保存; exon-level)
count <- qCount(out, txdb, reportLevel="exon")#カウントデータ行列を取得してcountに格納
data <- count[,-1]                     #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
data_exon <- data                      #dataをdata_exonに格納
	

10.mapping_single_genome7.txt中のFASTA形式ファイルを乳酸菌ゲノムにマッピングする場合:

マップする側のファイルは、サンプルデータ47のFASTA形式ファイル(sample_RNAseq4.fa)です。 マップされる側のファイルは、Ensembl (Zerbino et al., Nucleic Acids Res., 2018)から提供されている Lactobacillus casei 12Aの multi-FASTA形式ゲノム配列ファイル(Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.dna.chromosome.Chromosome.fa) です。マッピング結果に対して、GFF3形式のアノテーションファイル(Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.chromosome.Chromosome.gff3) を読み込んでカウント情報を取得しています。

in_f1 <- "mapping_single_genome7.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.dna.chromosome.Chromosome.fa" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
in_f3 <- "Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_f3に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge10.txt"                  #出力ファイル名を指定してout_fに格納
param_reportlevel <- "gene"            #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#前処理(アノテーション情報を取得)
txdb <- makeTxDbFromGFF(in_f3, format="auto")#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#前処理(マッピング)
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param_reportlevel)#カウントデータ行列を取得してcountに格納
dim(count)                             #行数と列数を表示
head(count)                            #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(count), count)   #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

11.mapping_single_genome7.txt中のFASTA形式ファイルを乳酸菌ゲノムにマッピングする場合:

例題10と基本的に同じですが、カウント情報を取得するqCount関数の実行時に、shift = 1オプションを付けています。

in_f1 <- "mapping_single_genome7.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.dna.chromosome.Chromosome.fa" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
in_f3 <- "Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_f3に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge11.txt"                  #出力ファイル名を指定してout_fに格納
param_reportlevel <- "gene"            #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能
param_shift <- 1                       #カウントデータ取得時の領域からの許容するずれの度合い?!を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#前処理(アノテーション情報を取得)
txdb <- makeTxDbFromGFF(in_f3, format="auto")#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#前処理(マッピング)
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param_reportlevel,#カウントデータ行列を取得してcountに格納
               shift=param_shift)      #カウントデータ行列を取得してcountに格納
dim(count)                             #行数と列数を表示
head(count)                            #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(count), count)   #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

マップ後 | カウント情報取得 | single-end | ゲノム | アノテーション有 | HTSeq(Anders_2015)

HTSeqというPythonプログラムを用いてカウント情報を得るやり方を示します。 ここでは、「マップ後 | カウント情報取得 | single-end | ゲノム | アノテーション有 | QuasR(Gaidatzis_2015)」 の例題10を実行して得られたマッピング結果(sample_RNAseq4_3b6c652a602a.bam)を利用します。 これは、Bowtieをデフォルトオプションで実行したものです。 マップする側のファイルは、サンプルデータ47のFASTA形式ファイル(sample_RNAseq4.fa)です。 マップされる側のファイルは、Ensembl Bacteriaから提供されている Lactobacillus casei 12Aの multi-FASTA形式ゲノム配列ファイル(Lactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.dna.chromosome.Chromosome.fa) です。

対応するGFF3形式のアノテーションファイルはLactobacillus_hokkaidonensis_jcm_18461.GCA_000829395.1.30.chromosome.Chromosome.gff3ですが、 ファイル名が長いと見づらいので、hoge.gff3として取り扱います。 対応するGTF形式のアノテーションファイル(hoge1.gtf)は、「イントロ | ファイル形式の変換 | GFF3 --> GTF」の例題1で作成したものです。 また、sample_RNAseq4_3b6c652a602a.bamも長いので、hoge.bamとして取り扱います。

1. GFF3でgeneレベルのカウントデータを取得する場合:

アノテーションファイルがGFF3形式であるという前提です。 hoge.gff3の3列目のgeneでレベル指定、9列目のgene_idでfeature IDを指定 (gene_idの代わりにIDでもOK)しています 。 マッピング結果がBAMファイル(hoge.bam)なので-f bamとしています(SAMの場合はsam)。 出力ファイルはoutput_GFF3_gene.txtです。2,194 genesですね。

htseq-count -t gene -i gene_id -f bam hoge.bam hoge.gff3 > output_GFF3_gene.txt
	

2. GFF3でtranscriptレベルのカウントデータを取得する場合:

アノテーションファイルがGFF3形式であるという前提です。 hoge.gff3の3列目のtranscriptでレベル指定、9列目のtranscript_idでfeature IDを指定 (transcript_idの代わりにIDParentでもOK)しています。 マッピング結果がBAMファイル(hoge.bam)なので-f bamとしています(SAMの場合はsam)。 出力ファイルはoutput_GFF3_transcript.txtです。2,250 transcriptsですね。

htseq-count -t transcript -i transcript_id -f bam hoge.bam hoge.gff3 > output_GFF3_transcript.txt
	

3. GFF3でexonレベルのカウントデータを取得する場合:

アノテーションファイルがGFF3形式であるという前提です。 hoge.gff3の3列目のexonでレベル指定、9列目のexon_idでfeature IDを指定 (exon_idの代わりにParentNameでもOK)しています。 マッピング結果がBAMファイル(hoge.bam)なので-f bamとしています(SAMの場合はsam)。 出力ファイルはoutput_GFF3_exon.txtです。2,262 exonsですね。

htseq-count -t exon -i exon_id -f bam hoge.bam hoge.gff3 > output_GFF3_exon.txt
	

4. GFF3でCDSレベルのカウントデータを取得する場合:

アノテーションファイルがGFF3形式であるという前提です。 hoge.gff3の3列目のCDSでレベル指定、9列目のprotein_idでfeature IDを指定 (protein_idの代わりにIDParentでもOK)しています。 マッピング結果がBAMファイル(hoge.bam)なので-f bamとしています(SAMの場合はsam)。 出力ファイルはoutput_GFF3_CDS.txtです。2,194 CDSsですね。

htseq-count -t CDS -i protein_id -f bam hoge.bam hoge.gff3 > output_GFF3_CDS.txt
	

5. GTFでgeneレベルのカウントデータを取得する場合:

アノテーションファイルがGTF形式であるという前提です。 hoge1.gtfの3列目のgeneでレベル指定、9列目のgene_idでfeature IDを指定 (gene_idの代わりにIDでもOK)しています。 マッピング結果がBAMファイル(hoge.bam)なので-f bamとしています(SAMの場合はsam)。 出力ファイルはoutput_GTF_gene.txtです。2,194 genesですね。

htseq-count -t gene -i gene_id -f bam hoge.bam hoge1.gtf > output_GTF_gene.txt
	

6. GTFでtranscriptレベルのカウントデータを取得する場合:

アノテーションファイルがGTF形式であるという前提です。 hoge1.gtfの3列目のtranscriptでレベル指定、9列目のtranscript_idでfeature IDを指定 (transcript_idの代わりにIDParentでもOK)しています。 マッピング結果がBAMファイル(hoge.bam)なので-f bamとしています(SAMの場合はsam)。 出力ファイルはoutput_GTF_transcript.txtです。2,250 transcriptsですね。

htseq-count -t transcript -i transcript_id -f bam hoge.bam hoge1.gtf > output_GTF_transcript.txt
	

7. GTFでexonレベルのカウントデータを取得する場合:

アノテーションファイルがGTF形式であるという前提です。 hoge1.gtfの3列目のexonでレベル指定、9列目のexon_idでfeature IDを指定 (exon_idの代わりにParentでもOK)しています。 マッピング結果がBAMファイル(hoge.bam)なので-f bamとしています(SAMの場合はsam)。 出力ファイルはoutput_GTF_exon.txtです。2,262 exonsですね。

htseq-count -t exon -i exon_id -f bam hoge.bam hoge1.gtf > output_GTF_exon.txt
	

8. GTFでCDSレベルのカウントデータを取得する場合:

アノテーションファイルがGTF形式であるという前提です。 hoge1.gtfの3列目のCDSでレベル指定、9列目のIDでfeature IDを指定 (IDの代わりにprotein_idParentでもOKだが、protein_idだとちょっと変)しています。 マッピング結果がBAMファイル(hoge.bam)なので-f bamとしています(SAMの場合はsam)。 出力ファイルはoutput_GTF_CDS.txtです。2,194 CDSsですね。

htseq-count -t CDS -i ID -f bam hoge.bam hoge1.gtf > output_GTF_CDS.txt
	

マップ後 | カウント情報取得 | single-end | ゲノム | アノテーション無 | QuasR(Gaidatzis_2015)

QuasRパッケージを用いたsingle-end RNA-seqデータのリファレンスゲノム配列へのBowtieによるマッピングから、 カウントデータ取得までの一連の流れを示します。アノテーション情報がない場合を想定しているので、GenomicAlignments パッケージを利用して、マップされたリードの和集合領域(union range)を得たのち、領域ごとにマップされたリード数をカウントしています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1.サンプルデータ18,19のRNA-seqデータ(sample_RNAseq1.fa)のref_genome.faへのマッピングの場合(mapping_single_genome1.txt):

オプションを"-m 1 --best --strata -v 0"とした例です。

in_f1 <- "mapping_single_genome1.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 0"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#前処理(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(マップされたリードの和集合領域同定)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
tmpsname <- out@alignments[,2]         #サンプル名(in_f1の2列目に相当)をtmpsnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  if(i == 1){
    k <- readGAlignments(tmpfname[i])  #BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  } else{
    k <- c(k, readGAlignments(tmpfname[i]))#BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  }
}
m <- reduce(granges(k))                #GRangesオブジェクトへの変換および和集合領域情報を得た結果のGRangesオブジェクトをmに格納

#本番(カウント情報取得)
tmp <- as.data.frame(m)                #出力ファイルのカウントデータ以外の情報をtmpに格納
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  tmpcount <- summarizeOverlaps(m, tmpfname[i])#GRangesオブジェクトmに対するBAMファイルのマップ結果のカウント情報取得結果をtmpcountに格納
  count <- assays(tmpcount)$counts     #SummarizedExperimentクラスオブジェクトのtmpcountからカウントデータ行列部分を抽出した結果をcountに格納
  colnames(count) <- tmpsname[i]       #行列countの列名を変更
  tmp <- cbind(tmp, count)             #保存したい情報を連結してtmpに格納(和集合領域とカウント)
}

#ファイルに保存
out_f <- sub(".bam", "_range.txt", tmpfname[i])#変更したファイル名を作成した結果をout_fに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

2.サンプルデータ7のFASTQ形式ファイル(SRR037439.fastq)の BSgenomeパッケージで利用可能なBSgenome.Hsapiens.UCSC.hg19 へのマッピング結果の場合:

mapping_single_genome3.txtのような2行目の1列目に「マッピングしたいRNA-seqファイル名」(SRR037439.fastq)、 そして2行目の2列目に「任意のサンプル名」(例:human_brain)を記載したタブ区切りテキストファイルを用意した上で(オプションを"-m 1 --best --strata -v 2"として)行っています。 RNA-seqデータのほうのリード数は少ないですが、リファレンス配列の前処理でかなり時間がかかるようです(2時間とか...)。

in_f1 <- "mapping_single_genome3.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#前処理(マッピング)
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(マップされたリードの和集合領域およびその領域に対するカウント情報取得)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
tmpsname <- out@alignments[,2]         #サンプル名(in_f1の2列目に相当)をtmpsnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  k <- readGAlignments(tmpfname[i])    #BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  m <- reduce(granges(k))              #GRangesオブジェクトへの変換および和集合領域情報を得た結果のGRangesオブジェクトをmに格納
  tmpcount <- summarizeOverlaps(m, tmpfname[i])#GRangesオブジェクトmに対するBAMファイルのマップ結果のカウント情報取得結果をtmpcountに格納
  count <- assays(tmpcount)$counts     #SummarizedExperimentクラスオブジェクトのtmpcountからカウントデータ行列部分を抽出した結果をcountに格納
  colnames(count) <- tmpsname[i]       #行列countの列名を変更
  tmp <- cbind(as.data.frame(m), count)#和集合領域情報とカウント情報を結合した結果をtmpに格納
  out_f <- sub(".bam", "_range.txt", tmpfname[i])#変更したファイル名を作成した結果をout_fに格納
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
}
	

3.サンプルデータ18-20の複数のRNA-seqデータ(sample_RNAseq1.fasample_RNAseq2.fa)をref_genome.faにマッピングする場合(mapping_single_genome4.txt):

複数のRNA-seqデータファイルごとに和集合領域を定めてカウント情報を得るやり方です。"*_range.txt"という2つの出力ファイルが生成されます。

in_f1 <- "mapping_single_genome4.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
param_mapping <- "-m 1 --best --strata -v 1"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#前処理(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(マップされたリードの和集合領域およびその領域に対するカウント情報取得)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
tmpsname <- out@alignments[,2]         #サンプル名(in_f1の2列目に相当)をtmpsnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  k <- readGAlignments(tmpfname[i])    #BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  m <- reduce(granges(k))              #GRangesオブジェクトへの変換および和集合領域情報を得た結果のGRangesオブジェクトをmに格納
  tmpcount <- summarizeOverlaps(m, tmpfname[i])#GRangesオブジェクトmに対するBAMファイルのマップ結果のカウント情報取得結果をtmpcountに格納
  count <- assays(tmpcount)$counts     #SummarizedExperimentクラスオブジェクトのtmpcountからカウントデータ行列部分を抽出した結果をcountに格納
  colnames(count) <- tmpsname[i]       #行列countの列名を変更
  tmp <- cbind(as.data.frame(m), count)#和集合領域情報とカウント情報を結合した結果をtmpに格納
  out_f <- sub(".bam", "_range.txt", tmpfname[i])#変更したファイル名を作成した結果をout_fに格納
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
}
	

4.サンプルデータ18-20の複数のRNA-seqデータ(sample_RNAseq1.fasample_RNAseq2.fa)をref_genome.faにマッピングする場合(mapping_single_genome4.txt):

全部のマッピング結果をまとめて和集合領域を定め、カウント情報を得るやり方です。サンプル間比較の際に便利。

in_f1 <- "mapping_single_genome4.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_mapping <- "-m 1 --best --strata -v 1"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#前処理(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(マップされたリードの和集合領域同定)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
tmpsname <- out@alignments[,2]         #サンプル名(in_f1の2列目に相当)をtmpsnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  if(i == 1){
    k <- readGAlignments(tmpfname[i])  #BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  } else{
    k <- c(k, readGAlignments(tmpfname[i]))#BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  }
}
m <- reduce(granges(k))                #GRangesオブジェクトへの変換および和集合領域情報を得た結果のGRangesオブジェクトをmに格納

#本番(カウント情報取得)
tmp <- as.data.frame(m)                #出力ファイルのカウントデータ以外の情報をtmpに格納
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  tmpcount <- summarizeOverlaps(m, tmpfname[i])#GRangesオブジェクトmに対するBAMファイルのマップ結果のカウント情報取得結果をtmpcountに格納
  count <- assays(tmpcount)$counts     #SummarizedExperimentクラスオブジェクトのtmpcountからカウントデータ行列部分を抽出した結果をcountに格納
  colnames(count) <- tmpsname[i]       #行列countの列名を変更
  tmp <- cbind(tmp, count)             #和集合領域情報とカウント情報を結合した結果をtmpに格納
}

#ファイルに保存
out_f <- sub(".bam", "_range.txt", tmpfname[i])#変更したファイル名を作成した結果をout_fに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

5.サンプルデータ18-20の複数のRNA-seqデータ(sample_RNAseq1.fasample_RNAseq2.fa)をref_genome.faにマッピングする場合(mapping_single_genome4.txt):

全部のマッピング結果をまとめて和集合領域を定め、カウント情報を得るやり方です。一般的なカウントデータ行列の形式(2列目以降がカウント情報)にし、配列長情報と別々のファイルにして保存するやり方です。

in_f1 <- "mapping_single_genome4.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "ref_genome.fa"               #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f1 <- "hoge5_count.txt"            #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge5_genelength.txt"       #出力ファイル名を指定してout_f2に格納
param_mapping <- "-m 1 --best --strata -v 1"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#前処理(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(マップされたリードの和集合領域同定)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
tmpsname <- out@alignments[,2]         #サンプル名(in_f1の2列目に相当)をtmpsnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  if(i == 1){
    k <- readGAlignments(tmpfname[i])  #BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  } else{
    k <- c(k, readGAlignments(tmpfname[i]))#BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  }
}
m <- reduce(granges(k))                #GRangesオブジェクトへの変換および和集合領域情報を得た結果のGRangesオブジェクトをmに格納

#本番(カウント情報取得)
h <- as.data.frame(m)                  #出力ファイルのカウントデータ以外の情報をhに格納(この情報を結合して行名を作成している)
tmp <- paste(h[,1],h[,2],h[,3],h[,4],h[,5], sep="_")#出力ファイルの行名部分を作成
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  tmpcount <- summarizeOverlaps(m, tmpfname[i])#GRangesオブジェクトmに対するBAMファイルのマップ結果のカウント情報取得結果をtmpcountに格納
  count <- assays(tmpcount)$counts     #SummarizedExperimentクラスオブジェクトのtmpcountからカウントデータ行列部分を抽出した結果をcountに格納
  colnames(count) <- tmpsname[i]       #行列countの列名を変更
  tmp <- cbind(tmp, count)             #列名とカウント情報を結合した結果をtmpに格納
}

#ファイルに保存(カウント情報および配列長情報)
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
tmp <- paste(h[,1],h[,2],h[,3],h[,4],h[,5], sep="_")#出力ファイルの行名部分を作成
tmp <- cbind(tmp, h$width)             #和集合領域情報とカウント情報を結合した結果をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

マップ後 | カウント情報取得 | paired-end | ゲノム | アノテーション有 | QuasR(Gaidatzis_2015)

QuasRパッケージを用いたpaired-end RNA-seqデータ のリファレンスゲノム配列へのBowtieによるマッピングから、 カウントデータ取得までの一連の流れを示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. mapping_paired_genome2.txt中のFASTQ形式ファイルを乳酸菌ゲノムにマッピングする場合:

乳酸菌RNA-seqデータSRR616268の最初の100万リード分のpaired-endファイル(SRR616268sub_1.fastq.gzSRR616268sub_2.fastq.gz)から5'および3'側を rcode_20150707_preprocessing.txtに書いてある手順でトリム して得られた998,521リードからなるpaired-endのファイルです。 SRR616268sub_trim3_1.fastq.gz (59,092,219 bytes)と SRR616268sub_trim3_2.fastq.gz (54,667,920 bytes)です。 Ensembl (Zerbino et al., Nucleic Acids Res., 2018)から提供されている Lactobacillus casei 12Aの multi-FASTA形式ゲノム配列ファイル(Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa) とGFF3形式のアノテーションファイル(Lactobacillus_casei_12a.GCA_000309565.2.25.chromosome.Chromosome.gff3) を読み込むやり方です。マッピングオプションはデフォルトです。

in_f1 <- "mapping_paired_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqリストファイル)
in_f2 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f2に格納(リファレンス配列)
in_f3 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_f3に格納(GFF3またはGTF形式のアノテーションファイル)
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_reportlevel <- "gene"            #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#前処理(アノテーション情報を取得)
txdb <- makeTxDbFromGFF(in_f3, format="auto")#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param_reportlevel)#カウントデータ行列を取得してcountに格納
dim(count)                             #行数と列数を表示
head(count)                            #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(count), count)   #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです
	

2. mapping_paired_genome2.txt中のFASTQ形式ファイルを乳酸菌ゲノムにマッピングする場合:

1.の出力ファイルは2列目が配列長、3列目がカウント情報でしたが、これを2つのファイルに分割して出力させるやり方を示します。

in_f1 <- "mapping_paired_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqリストファイル)
in_f2 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f2に格納(リファレンス配列)
in_f3 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_f3に格納(GFF3またはGTF形式のアノテーションファイル)
out_f1 <- "hoge2_count.txt"            #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge2_length.txt"           #出力ファイル名を指定してout_f2に格納
param_reportlevel <- "gene"            #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#前処理(アノテーション情報を取得)
txdb <- makeTxDbFromGFF(in_f3, format="auto")#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param_reportlevel)#カウントデータ行列を取得してcountに格納
dim(count)                             #行数と列数を表示
head(count)                            #確認してるだけです

#ファイルに保存(カウント情報)
data <- as.data.frame(count[,-1])      #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(遺伝子配列長情報)
genelength <- count[,1]                #遺伝子配列長情報をgenelengthに格納
tmp <- cbind(names(genelength), genelength)#保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです
	

3. mapping_paired_genome2.txt中のFASTQ形式ファイルを乳酸菌ゲノムにマッピングする場合:

2.と基本的に同じですが、BEDファイルも出力させています。GenomicAlignmentsパッケージが提供するreadGAlignments関数を利用しています。

in_f1 <- "mapping_paired_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqリストファイル)
in_f2 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f2に格納(リファレンス配列)
in_f3 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_f3に格納(GFF3またはGTF形式のアノテーションファイル)
out_f1 <- "hoge3_count.txt"            #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge3_length.txt"           #出力ファイル名を指定してout_f2に格納
param_reportlevel <- "gene"            #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#前処理(アノテーション情報を取得)
txdb <- makeTxDbFromGFF(in_f3, format="auto")#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param_reportlevel)#カウントデータ行列を取得してcountに格納
dim(count)                             #行数と列数を表示
head(count)                            #確認してるだけです

#ファイルに保存(カウント情報)
data <- as.data.frame(count[,-1])      #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(遺伝子配列長情報)
genelength <- count[,1]                #遺伝子配列長情報をgenelengthに格納
tmp <- cbind(names(genelength), genelength)#保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

4. mapping_paired_genome2.txt中のFASTQ形式ファイルを乳酸菌ゲノムにマッピングする場合:

3.と基本的に同じですが、マッピング時のオプションを"-m 1 --best --strata -v 0"とした例です。 -m 1で1か所にのみマップされるリード、 -v 0で許容するミスマッチ数を0個にしています。 --best --strataは、許容するミスマッチ数が1以上の場合に効果を発揮します。 ここでは意味をなしませんが、つけておいて悪さをするものではないので、通常は無条件でつけます。

in_f1 <- "mapping_paired_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqリストファイル)
in_f2 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f2に格納(リファレンス配列)
in_f3 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_f3に格納(GFF3またはGTF形式のアノテーションファイル)
out_f1 <- "hoge4_count.txt"            #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge4_length.txt"           #出力ファイル名を指定してout_f2に格納
param_reportlevel <- "gene"            #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能
param_mapping <- "-m 1 --best --strata -v 0"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#前処理(アノテーション情報を取得)
txdb <- makeTxDbFromGFF(in_f3, format="auto")#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param_reportlevel)#カウントデータ行列を取得してcountに格納
dim(count)                             #行数と列数を表示
head(count)                            #確認してるだけです

#ファイルに保存(カウント情報)
data <- as.data.frame(count[,-1])      #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(遺伝子配列長情報)
genelength <- count[,1]                #遺伝子配列長情報をgenelengthに格納
tmp <- cbind(names(genelength), genelength)#保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

5. mapping_paired_genome2.txt中のFASTQ形式ファイルを乳酸菌ゲノムにマッピングする場合:

4.と基本的に同じですが、マッピング時のオプションを"-m 1 --best --strata -v 2"とした例です。 -v 2で許容するミスマッチ数を2個にしているので、マップされるリード数やカウントの総和が増えるはずです。

in_f1 <- "mapping_paired_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqリストファイル)
in_f2 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f2に格納(リファレンス配列)
in_f3 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.chromosome.Chromosome.gff3"#入力ファイル名を指定してin_f3に格納(GFF3またはGTF形式のアノテーションファイル)
out_f1 <- "hoge5_count.txt"            #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge5_length.txt"           #出力ファイル名を指定してout_f2に格納
param_reportlevel <- "gene"            #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#前処理(アノテーション情報を取得)
txdb <- makeTxDbFromGFF(in_f3, format="auto")#txdbオブジェクトの作成
txdb                                   #確認してるだけです

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(カウントデータ取得)
count <- qCount(out, txdb, reportLevel=param_reportlevel)#カウントデータ行列を取得してcountに格納
dim(count)                             #行数と列数を表示
head(count)                            #確認してるだけです

#ファイルに保存(カウント情報)
data <- as.data.frame(count[,-1])      #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(遺伝子配列長情報)
genelength <- count[,1]                #遺伝子配列長情報をgenelengthに格納
tmp <- cbind(names(genelength), genelength)#保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

マップ後 | カウント情報取得 | paired-end | ゲノム | アノテーション無 | QuasR(Gaidatzis_2015)

QuasRパッケージを用いたpaired-end RNA-seqデータのリファレンスゲノム配列へのBowtieによるマッピングから、 カウントデータ取得までの一連の流れを示します。アノテーション情報がない場合を想定しているので、GenomicAlignments パッケージを利用して、マップされたリードの和集合領域(union range)を得たのち、領域ごとにマップされたリード数をカウントしています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. mapping_paired_genome2.txt中のFASTQ形式ファイルを乳酸菌ゲノムにマッピングする場合:

乳酸菌RNA-seqデータSRR616268の最初の100万リード分のpaired-endファイル(SRR616268sub_1.fastq.gzSRR616268sub_2.fastq.gz)から5'および3'側を rcode_20150707_preprocessing.txtに書いてある手順でトリム して得られた998,521リードからなるpaired-endのファイルです。 SRR616268sub_trim3_1.fastq.gz (59,092,219 bytes)と SRR616268sub_trim3_2.fastq.gz (54,667,920 bytes)です。 Ensembl (Zerbino et al., Nucleic Acids Res., 2018)から提供されている Lactobacillus casei 12Aの multi-FASTA形式ゲノム配列ファイル(Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa) がリファレンス配列です。マッピングオプションはデフォルトです。

in_f1 <- "mapping_paired_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqリストファイル)
in_f2 <- "Lactobacillus_casei_12a.GCA_000309565.2.25.dna.chromosome.Chromosome.fa"#入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f1 <- "hoge1_count.txt"            #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1_genelength.txt"       #出力ファイル名を指定してout_f2に格納

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#本番(マップされたリードの和集合領域同定)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
tmpsname <- out@alignments[,2]         #サンプル名(in_f1の2列目に相当)をtmpsnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  if(i == 1){
    k <- readGAlignments(tmpfname[i])  #BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  } else{
    k <- c(k, readGAlignments(tmpfname[i]))#BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  }
}
m <- reduce(granges(k))                #GRangesオブジェクトへの変換および和集合領域情報を得た結果のGRangesオブジェクトをmに格納

#本番(カウント情報取得)
h <- as.data.frame(m)                  #出力ファイルのカウントデータ以外の情報をhに格納(この情報を結合して行名を作成している)
tmp <- paste(h[,1],h[,2],h[,3],h[,4],h[,5], sep="_")#出力ファイルの行名部分を作成
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  tmpcount <- summarizeOverlaps(m, tmpfname[i])#GRangesオブジェクトmに対するBAMファイルのマップ結果のカウント情報取得結果をtmpcountに格納
  count <- assays(tmpcount)$counts     #SummarizedExperimentクラスオブジェクトのtmpcountからカウントデータ行列部分を抽出した結果をcountに格納
  colnames(count) <- tmpsname[i]       #行列countの列名を変更
  tmp <- cbind(tmp, count)             #列名とカウント情報を結合した結果をtmpに格納
}

#ファイルに保存(カウント情報および配列長情報)
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
tmp <- paste(h[,1],h[,2],h[,3],h[,4],h[,5], sep="_")#出力ファイルの行名部分を作成
tmp <- cbind(tmp, h$width)             #和集合領域情報とカウント情報を結合した結果をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

マップ後 | カウント情報取得 | paired-end | トランスクリプトーム | QuasR(Gaidatzis_2015)

QuasRパッケージを用いてpaired-end RNA-seqデータのリファレンストランスクリプトーム配列へのマッピングを行うやり方を示します。 basic alignerの1つであるBowtie (Langmead et al., Genome Biol., 2009)を実装した Rbowtieパッケージを内部的に使っています。 mapping_paired_genome1.txtのような2行目の1列目と2列目に「マッピングしたいRNA-seqファイル名1と2」 (例:sample_RNAseq_1.fasample_RNAseq_2.fa)、 そして2行目の3列目に「任意のサンプル名」(例:namae)を記載したタブ区切りテキストファイルを用意した上で行います。 1行目の文字列は変えてはいけません(つまり"FileName1", "FileName2",および"SampleName"のままにしておくということです)

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. mapping_paired_genome2.txt中のFASTQ形式ファイルを乳酸菌トランスクリプトーム配列(transcriptome_Lcasei12A.fasta)にマッピングする場合:

乳酸菌RNA-seqデータSRR616268の998,521リードからなるpaired-endのファイルです。 SRR616268sub_trim3_1.fastq.gz (59,092,219 bytes)と SRR616268sub_trim3_2.fastq.gz (54,667,920 bytes)です。 リファレンス配列は「イントロ | 一般 | 配列取得 | トランスクリプトーム配列 | GenomicFeatures(Lawrence_2013)」 の例題6を実行して得られたもの(transcriptome_Lcasei12A.fasta)を利用します。 マッピングオプションはデフォルトです。

in_f1 <- "mapping_paired_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqリストファイル)
in_f2 <- "transcriptome_Lcasei12A.fasta"#入力ファイル名を指定してin_f2に格納(リファレンス配列)

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2)            #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}
	

2. mapping_paired_genome2.txt中のFASTQ形式ファイルを乳酸菌トランスクリプトーム配列(transcriptome_Lcasei12A.fasta)にマッピングする場合:

1.と基本的に同じですが、マッピング時のオプションを"-m 1 --best --strata -v 0"とした例です。 -m 1で1か所にのみマップされるリード、 -v 0で許容するミスマッチ数を0個にしています。 --best --strataは、許容するミスマッチ数が1以上の場合に効果を発揮します。 ここでは意味をなしませんが、つけておいて悪さをするものではないので、通常は無条件でつけます。

in_f1 <- "mapping_paired_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqリストファイル)
in_f2 <- "transcriptome_Lcasei12A.fasta"#入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f1 <- "hoge2_count.txt"            #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge2_length.txt"           #出力ファイル名を指定してout_f2に格納
param_mapping <- "-m 1 --best --strata -v 0"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}

#ファイルに保存(配列長情報)
tmp_name <- seqnames(seqinfo(FaFile(in_f2)))#リファレンス配列のdescription情報を取得してtmp_nameに格納
tmp_length <- seqlengths(seqinfo(FaFile(in_f2)))#リファレンス配列の長さ情報を取得してtmp_lengthに格納
tmp <- cbind(tmp_name, tmp_length)     #保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(カウント情報)
tmp <- tmp_name                        #保存したい情報のプレースホルダの作成
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  count <- rep(0, length(tmp_name))    #カウント情報の初期値を0にしておく
  names(count) <- tmp_name             #tmp_nameをcountのnames属性として利用
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  hoge2 <- hoge[, c("seqnames")]       #必要な列の情報のみ抽出した結果をhoge2に格納
  count[names(table(hoge2))] <- table(hoge2)#カウント情報をcountに代入
  tmp <- cbind(tmp, count)             #カウント情報を列の右側に追加
}
colnames(tmp) <- c("name", out@alignments[,2])#列名を付与
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. mapping_paired_genome2.txt中のFASTQ形式ファイルを乳酸菌トランスクリプトーム配列(transcriptome_Lcasei12A.fasta)にマッピングする場合:

2.と基本的に同じですが、マッピング時のオプションを"-m 1 --best --strata -v 2"とした例です。 -v 2で許容するミスマッチ数を2個にしているので、マップされるリード数やカウントの総和が増えるはずです。

in_f1 <- "mapping_paired_genome2.txt"  #入力ファイル名を指定してin_f1に格納(RNA-seqリストファイル)
in_f2 <- "transcriptome_Lcasei12A.fasta"#入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f1 <- "hoge3_count.txt"            #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge3_length.txt"           #出力ファイル名を指定してout_f2に格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み

#本番(マッピング)
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
out                                    #マッピングに用いたパラメータや入力ファイルの情報などを表示
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数

#ファイルに保存(QCレポート用のpdfファイル作成)
out_f <- sub(".bam", "_QC.pdf", out@alignments[,1])#Quqlity Controlレポートのpdfファイル名を作成した結果をout_fに格納
qQCReport(out, pdfFilename=out_f)      #QCレポート結果をファイルに保存
out_f                                  #ファイル名を表示してるだけです

#ファイルに保存(BED形式ファイル)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  tmp <- hoge[, c("seqnames","start","end")]#必要な列の情報のみ抽出した結果をtmpに格納
  out_f <- sub(".bam", ".bed", tmpfname[i])#BED形式ファイル名を作成した結果をout_fに格納
  out_f                                #ファイル名を表示してるだけです
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
}

#ファイルに保存(配列長情報)
tmp_name <- seqnames(seqinfo(FaFile(in_f2)))#リファレンス配列のdescription情報を取得してtmp_nameに格納
tmp_length <- seqlengths(seqinfo(FaFile(in_f2)))#リファレンス配列の長さ情報を取得してtmp_lengthに格納
tmp <- cbind(tmp_name, tmp_length)     #保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(カウント情報)
tmp <- tmp_name                        #保存したい情報のプレースホルダの作成
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  count <- rep(0, length(tmp_name))    #カウント情報の初期値を0にしておく
  names(count) <- tmp_name             #tmp_nameをcountのnames属性として利用
  hoge <- readGAlignments(tmpfname[i]) #BAM形式ファイルを読み込んだ結果をhogeに格納(これはGAlignmentsオブジェクト)
  hoge <- as.data.frame(hoge)          #データフレーム形式に変換
  hoge2 <- hoge[, c("seqnames")]       #必要な列の情報のみ抽出した結果をhoge2に格納
  count[names(table(hoge2))] <- table(hoge2)#カウント情報をcountに代入
  tmp <- cbind(tmp, count)             #カウント情報を列の右側に追加
}
colnames(tmp) <- c("name", out@alignments[,2])#列名を付与
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

マップ後 | カウント情報取得 | トランスクリプトーム | BED形式ファイルから

BED形式のマップ後のファイルと(マップされる側の)リファレンス配列ファイルを読み込んでリファレンス配列の並びで配列長とカウント情報を取得するやり方を示します。 出力ファイルの並びは「リファレンス配列のdescription行」「配列長」「カウント情報」です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. マップされる側の配列(hoge4.fa)中のIDの並びでBED形式ファイル(sample_1.bed)中の出現回数をカウントする場合:

in_f1 <- "sample_1.bed"                #入力ファイル名を指定してin_f1に格納(BED形式ファイル)
in_f2 <- "hoge4.fa"                    #入力ファイル名を指定してin_f2に格納(リファレンス配列ファイル)
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, sep="\t")    #in_f1で指定したファイルの読み込み
fasta <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです
head(data)                             #確認してるだけです

#本番
hoge <- table(data[,1])                #出現頻度をカウントした結果をhogeに格納
head(hoge)                             #確認してるだけです
out <- rep(0, length(fasta))           #最終的に欲しいカウント情報の初期値を0にしておく
names(out) <- names(fasta)             #names(fasta)をnames(out)に格納
out[names(hoge)] <- hoge               #生リードカウントを代入
head(out)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(names(out), width(fasta), out)#「ID, 配列長, カウント情報」の並びにしたものをtmpに格納
colnames(tmp) <- c("ID", "Length", "Count")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

2. マップされる側の配列(hoge4.fa)中のIDをソートした並びでBED形式ファイル(sample_1.bed)中の出現回数をカウントする場合:

in_f1 <- "sample_1.bed"                #入力ファイル名を指定してin_f1に格納(BED形式ファイル)
in_f2 <- "hoge4.fa"                    #入力ファイル名を指定してin_f2に格納(リファレンス配列ファイル)
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, sep="\t")    #in_f1で指定したファイルの読み込み
fasta <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです
head(data)                             #確認してるだけです

#本番
hoge <- table(data[,1])                #出現頻度をカウントした結果をhogeに格納
head(hoge)                             #確認してるだけです
out <- rep(0, length(fasta))           #最終的に欲しいカウント情報の初期値を0にしておく
names(out) <- sort(names(fasta))       #アルファベット順にソートしたnames(fasta)をnames(out)に格納
out[names(hoge)] <- hoge               #生リードカウントを代入
head(out)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(names(out), width(fasta[names(out)]), out)#「ID, 配列長, カウント情報」の並びにしたものをtmpに格納
colnames(tmp) <- c("ID", "Length", "Count")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

3. マップされる側の配列(h_rna.fasta)中のIDの並びでBED形式ファイル(SRR002324_t.bed)中の出現回数をカウントする場合:

in_f1 <- "SRR002324_t.bed"             #入力ファイル名を指定してin_f1に格納(BED形式ファイル)
in_f2 <- "h_rna.fasta"                 #入力ファイル名を指定してin_f2に格納(リファレンス配列ファイル)
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, sep="\t")    #in_f1で指定したファイルの読み込み
fasta <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです
head(data)                             #確認してるだけです

#本番
hoge <- table(data[,1])                #出現頻度をカウントした結果をhogeに格納
head(hoge)                             #確認してるだけです
out <- rep(0, length(fasta))           #最終的に欲しいカウント情報の初期値を0にしておく
names(out) <- names(fasta)             #names(fasta)をnames(out)に格納
out[names(hoge)] <- hoge               #生リードカウントを代入
head(out)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(names(out), width(fasta), out)#「ID, 配列長, カウント情報」の並びにしたものをtmpに格納
colnames(tmp) <- c("ID", "Length", "Count")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

4. マップされる側の配列(h_rna.fasta)中のIDをソートした並びでBED形式ファイル(SRR002324_t.bed)中の出現回数をカウントする場合:

in_f1 <- "SRR002324_t.bed"             #入力ファイル名を指定してin_f1に格納(BED形式ファイル)
in_f2 <- "h_rna.fasta"                 #入力ファイル名を指定してin_f2に格納(リファレンス配列ファイル)
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, sep="\t")    #in_f1で指定したファイルの読み込み
fasta <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み
fasta                                  #確認してるだけです
head(data)                             #確認してるだけです

#本番
hoge <- table(data[,1])                #出現頻度をカウントした結果をhogeに格納
head(hoge)                             #確認してるだけです
out <- rep(0, length(fasta))           #最終的に欲しいカウント情報の初期値を0にしておく
names(out) <- sort(names(fasta))       #アルファベット順にソートしたnames(fasta)をnames(out)に格納
out[names(hoge)] <- hoge               #生リードカウントを代入
head(out)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(names(out), width(fasta[names(out)]), out)#「ID, 配列長, カウント情報」の並びにしたものをtmpに格納
colnames(tmp) <- c("ID", "Length", "Count")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

カウント情報取得 | リアルデータ | について

ここではSAM/BAMなどのマッピング結果ファイルからのカウント情報取得ではなく、最初からカウント情報になっているもののありかや、 それらを提供しているデータベースから取得するプログラムを示します。

R用:

R以外:

カウント情報取得 | リアルデータ | SRP061240 | recount(Collado-Torres_2017)

recountパッケージを用いて、 SRP061240(Yuan et al., Sci Rep., 2016;ブラウザはIE以外を推奨) のカウント情報を含むRangedSummarizedExperimentクラスオブジェクトという形式の.Rdataをダウンロードしたり、 カウントデータの数値行列にした状態で保存するやり方を示します。 2016年の原著論文では、100 colon cancer (大腸がん)、36 prostate cancer (膀胱がん)、6 pancreatic cancer (膵臓がん)、 50 healthy individuals (健常者)の計192サンプルから得られたplasma extracellular vesicles (血漿中の細胞外小胞)の発現データを取得しています。 例題4までで得られるのは計384サンプルの発現データです。これは各サンプルにつき2つのtechnical replicatesがあるためです。

「ファイル」−「ディレクトリの変更」でダウンロードしたいディレクトリに移動し以下をコピペ。

1. geneレベルカウントデータ情報を得たい場合:

SRP061240という名前のフォルダが作成されます。 中にあるrse-gene.Rdataをロードして読み込むとrse-geneというオブジェクト名で取り扱えます。 ウェブサイトrecount2上でSRP061240で検索し、 gene列のRSE v2をダウンロードして得られるrse_gene.Rdataと同じです。

param_ID <- "SRP061240"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataをダウンロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
	

2. geneレベルカウントデータ情報を得たい場合:

1.の発展形として、ダウンロードも行い、さらにカウントの数値行列情報(58,037 genes×384 samples)のみをタブ区切りテキストファイルで保存するやり方です。 出力ファイルはhoge2.txt(約46MB)です。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_ID <- "SRP061240"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataのダウンロードとロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
load(file.path(param_ID, 'rse_gene.Rdata'))#作成されたparam_IDという名前のディレクトリ中の.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

ウェブサイトrecount2上でSRP061240で検索し、 gene列のRSE v2のところからダウンロードして得られた geneレベルカウントデータ(rse_gene.Rdata; 約24MB)を読み込んで、 カウントの数値行列情報のみをタブ区切りテキストファイルで保存するやり方です。出力ファイルの中身はhoge2.txtと同じです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題3と基本的に同じですが、サンプル名をcolData(rse)$titleで見えているものに変更するやり方です。 理由はここにHealthy Controlが"N"で計50サンプル, Colorectal Cancerが1-4期("1S", "2S", "3S", and "4S")のステージごとに25サンプルずつの計100サンプル、 Pancreatic Cancerが"Pan"で計6サンプル、Prostate Cancerが"PC"で計36サンプルです。種類ごとにソートされてはいません。 サンプルごとに2 technical replicatesがあるので計384サンプル。 出力ファイルはhoge4.txt(58,037 genes×384 samples)です。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
colnames(data)                         #列名を表示

#後処理(列名変更)
identical(colnames(data), rownames(colData(rse)))#2つのオブジェクトの同一性を確認(同じならTRUE)
colnames(data) <- colData(rse)$title   #列名を変更
colnames(data)                         #列名を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題4と基本的に同じですが、サンプル名中に共通して含まれる"Sample_"を除去しています。 出力ファイルはhoge5.txt(58,037 genes×384 samples)です。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
colnames(data)                         #列名を表示

#後処理(列名変更)
identical(colnames(data), rownames(colData(rse)))#2つのオブジェクトの同一性を確認(同じならTRUE)
hoge <- colData(rse)$title             #colData(rse)$titleの中身をhogeに格納
hoge2 <- gsub("Sample_", "", hoge)     #hoge中の"Sample_"を削除
colnames(data) <- hoge2                #列名をhoge2で置換
colnames(data)                         #列名を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

6. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題5と基本的に同じですが、サンプル名でソートしているので、結果的にグループごとにソートされます。 出力ファイルはhoge6.txt(58,037 genes×384 samples)です。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
colnames(data)                         #列名を表示

#後処理(列名変更)
identical(colnames(data), rownames(colData(rse)))#2つのオブジェクトの同一性を確認(同じならTRUE)
hoge <- colData(rse)$title             #colData(rse)$titleの中身をhogeに格納
hoge2 <- gsub("Sample_", "", hoge)     #hoge中の"Sample_"を削除
colnames(data) <- hoge2                #列名をhoge2で置換
colnames(data)                         #列名を表示

#後処理(列名でソート)
data <- data[, order(colnames(data))]  #列名でソート
colnames(data)                         #列名を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

7. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題6の発展形として、technical replicatesのデータをマージしています。 出力ファイルはhoge7.txt(58,037 genes×192 samples)です。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
colnames(data)                         #列名を表示

#後処理(列名変更)
identical(colnames(data), rownames(colData(rse)))#2つのオブジェクトの同一性を確認(同じならTRUE)
hoge <- colData(rse)$title             #colData(rse)$titleの中身をhogeに格納
hoge2 <- gsub("Sample_", "", hoge)     #hoge中の"Sample_"を削除
colnames(data) <- hoge2                #列名をhoge2で置換
colnames(data)                         #列名を表示

#後処理(列名でソート)
data <- data[, order(colnames(data))]  #列名でソート
colnames(data)                         #列名を表示

#後処理(technical replicatesをマージ)
unique_sample <- unique(colnames(data))#ユニーク(non-redundant)なサンプル名からなる文字列ベクトルを作成
hoge <- NULL                           #最終的に欲しい情報を格納するためのプレースホルダ
for(i in 1:length(unique_sample)){     #non-redundantなサンプル数分だけループを回す
  posi <- which(colnames(data) == unique_sample[i])#dataの中からi番目のサンプル名と同じ列の番号情報を抽出
  if(length(posi) > 1){                #同一サンプルが複数個存在する場合
    hoge <- cbind(hoge, apply(data[, posi], 1, "sum", na.rm=TRUE))#dataの中からposi番目の列のデータを抽出し、sumした結果をhogeの右側の列として追加
  } else {                             #同一サンプルが1個しかない場合
    hoge <- cbind(hoge, data[, posi])  #dataの中からposi番目の列のデータを抽出した結果をhogeの右側の列として追加
  }
}                                      #non-redundantなサンプル数分だけループを回す
colnames(hoge) <- unique_sample        #unique_sampleをhogeの列名として利用
dim(hoge)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(hoge), hoge)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

カウント情報取得 | リアルデータ | SRP056295 | recount(Collado-Torres_2017)

recountパッケージを用いて、 SRP056295(Lavallée et al., Nat Genet., 2015;ブラウザはIE以外を推奨) のカウント情報を含むRangedSummarizedExperimentクラスオブジェクトという形式の.Rdataをダウンロードしたり、 カウントデータの数値行列にした状態で保存するやり方を示します。 2015年の原著論文では、計415サンプルの急性骨髄性白血病(acute myeloid leukemia; AML)の発現データを取得しており、 そこで示されている生データのID情報は計3つ( GSE62190, GSE66917, and GSE67039)ですが、 ここでダウンロードするSRP056295のデータはGSE67039に相当します。 原著論文では、31 MLL-F AML samplesと384 controls (non–MLL-F AML samples)で、実際31 vs. 384で2群間比較もなされているようです SRP056295のオリジナルは525サンプルのようですが、例題4までで得られるのは計520サンプルの発現データです。 これは、カウントデータ取得時にrecount内でのクオリティ基準を満たさなかったため、5サンプル分(SRR1918519, SRR1918416, SRR1918413, SRR1918382, and SRR1918259)が落とされているからです。 520サンプルから同一サンプルの重複除去を行うと、263サンプルになります。 31 MLL-F AML samplesの情報は、原著論文中のSupplementary Table 1にあります。

「ファイル」−「ディレクトリの変更」でダウンロードしたいディレクトリに移動し以下をコピペ。

1. geneレベルカウントデータ情報を得たい場合:

SRP056295という名前のフォルダが作成されます。 中にあるrse-gene.Rdataをロードして読み込むとrse-geneというオブジェクト名で取り扱えます。 ウェブサイトrecount2上でSRP056295で検索し、 gene列のRSE v2を ダウンロードして得られるrse_gene.Rdataと同じです。

param_ID <- "SRP056295"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataをダウンロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
	

2. geneレベルカウントデータ情報を得たい場合:

1.の発展形として、ダウンロードも行い、さらにカウントの数値行列情報(58,037 genes×520 samples)のみをタブ区切りテキストファイルで保存するやり方です。 出力ファイルはhoge2.txt(約80MB)です。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_ID <- "SRP056295"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataのダウンロードとロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
load(file.path(param_ID, 'rse_gene.Rdata'))#作成されたparam_IDという名前のディレクトリ中の.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

ウェブサイトrecount2上でSRP056295で検索し、 gene列のRSE v2のところからダウンロードして得られた geneレベルカウントデータ(rse_gene.Rdata; 約71MB)を読み込んで、 カウントの数値行列情報のみをタブ区切りテキストファイルで保存するやり方です。出力ファイルの中身はhoge2.txtと同じです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題3と基本的に同じですが、サンプル名をcolData(rse)$titleで見えているものに変更するやり方です。 出力ファイルはhoge4.txt(58,037 genes×520 samples)です。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
colnames(data)                         #列名を表示

#後処理(列名変更)
identical(colnames(data), rownames(colData(rse)))#2つのオブジェクトの同一性を確認(同じならTRUE)
colnames(data) <- colData(rse)$title   #列名を変更
colnames(data)                         #列名を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題4の発展形として、technical replicatesのデータをマージしています。 出力ファイルはhoge5.txt(58,037 genes×263 samples)です。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
colnames(data)                         #列名を表示

#後処理(列名変更)
identical(colnames(data), rownames(colData(rse)))#2つのオブジェクトの同一性を確認(同じならTRUE)
colnames(data) <- colData(rse)$title   #列名を変更
colnames(data)                         #列名を表示

#後処理(technical replicatesをマージ)
unique_sample <- unique(colnames(data))#ユニーク(non-redundant)なサンプル名からなる文字列ベクトルを作成
hoge <- NULL                           #最終的に欲しい情報を格納するためのプレースホルダ
for(i in 1:length(unique_sample)){     #non-redundantなサンプル数分だけループを回す
  posi <- which(colnames(data) == unique_sample[i])#dataの中からi番目のサンプル名と同じ列の番号情報を抽出
  if(length(posi) > 1){                #同一サンプルが複数個存在する場合
    hoge <- cbind(hoge, apply(data[, posi], 1, "sum", na.rm=TRUE))#dataの中からposi番目の列のデータを抽出し、sumした結果をhogeの右側の列として追加
  } else {                             #同一サンプルが1個しかない場合
    hoge <- cbind(hoge, data[, posi])  #dataの中からposi番目の列のデータを抽出した結果をhogeの右側の列として追加
  }
}                                      #non-redundantなサンプル数分だけループを回す
colnames(hoge) <- unique_sample        #unique_sampleをhogeの列名として利用
dim(hoge)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(hoge), hoge)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

カウント情報取得 | リアルデータ | SRP056146 | recount(Collado-Torres_2017)

recountパッケージを用いて、 SRP056146(Costa-Silva et al., Nat Cell Biol., 2015;ブラウザはIE以外を推奨) のカウント情報を含むRangedSummarizedExperimentクラスオブジェクトという形式の.Rdataをダウンロードしたり、 カウントデータの数値行列にした状態で保存するやり方を示します。 2015年の原著論文では、クッパー細胞(Kupffer cells; 肝臓を構成するの微小組織の1つで、マクロファージの一種)に 92の乾癬(psoriatic)サンプルと82の正常の皮膚サンプルからなる、計12サンプルの発現データを取得しています。 が、例題6までで得られるのは計178サンプルの発現データです。これには5つのtechnical replicatesが含まれているためです(SRS544523, SRS544524, SRS544536, SRS544653, and SRS544667)。 これらをマージすると計173 samplesになります(92 lesional psoriatic skin samples and 81 normal skin samples)。原著論文に比べて1サンプル少ないのは、 SRS544686がカウントデータ取得時にrecount内でのクオリティ基準を満たさなかったため落とされているからです。

「ファイル」−「ディレクトリの変更」でダウンロードしたいディレクトリに移動し以下をコピペ。

カウント情報取得 | リアルデータ | SRP035988 | recount(Collado-Torres_2017)

recountパッケージを用いて、 SRP035988(Li et al., J Invest Dermatol., 2014;ブラウザはIE以外を推奨) のカウント情報を含むRangedSummarizedExperimentクラスオブジェクトという形式の.Rdataをダウンロードしたり、 カウントデータの数値行列にした状態で保存するやり方を示します。 2014年の原著論文では、92の乾癬(psoriatic)サンプルと82の正常の皮膚サンプルからなる、計174サンプルの発現データを取得しています。 が、例題6までで得られるのは計178サンプルの発現データです。これには5つのtechnical replicatesが含まれているためです(SRS544523, SRS544524, SRS544536, SRS544653, and SRS544667)。 これらをマージすると計173 samplesになります(92 lesional psoriatic skin samples and 81 normal skin samples)。原著論文に比べて1サンプル少ないのは、 SRS544686がカウントデータ取得時にrecount内でのクオリティ基準を満たさなかったため落とされているからです。

「ファイル」−「ディレクトリの変更」でダウンロードしたいディレクトリに移動し以下をコピペ。

1. geneレベルカウントデータ情報を得たい場合:

SRP035988という名前のフォルダが作成されます。 中にあるrse-gene.Rdataをロードして読み込むとrse-geneというオブジェクト名で取り扱えます。 ウェブサイトrecount2上でSRP035988で検索し、 gene列のRSE v2をダウンロードして得られるrse_gene.Rdataと同じです。

param_ID <- "SRP035988"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataをダウンロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
	

2. geneレベルカウントデータ情報を得たい場合:

1.の発展形として、ダウンロードも行い、さらにカウントの数値行列情報(58,037 genes×178 samples)のみをタブ区切りテキストファイルで保存するやり方です。 出力ファイルはhoge2.txt(約29MB)です。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_ID <- "SRP035988"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataのダウンロードとロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
load(file.path(param_ID, 'rse_gene.Rdata'))#作成されたparam_IDという名前のディレクトリ中の.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

ウェブサイトrecount2上でSRP035988で検索し、 gene列のRSE v2のところからダウンロードして得られた geneレベルカウントデータ(rse_gene.Rdata; 約24MB)を読み込んで、 カウントの数値行列情報のみをタブ区切りテキストファイルで保存するやり方です。出力ファイルの中身はhoge2.txtと同じです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題3と基本的に同じですが、サンプル名をcolData(rse)$characteristicsで見えているものに変更するやり方です。 理由はここに"psoriatic" or "normal"が分かる情報が含まれているからです。 colData(rse)$characteristicsがリスト形式になっており、colnames(data)に直接代入することができないので、as.character関数をつけています。 出力ファイルはhoge4.txt(58,037 genes×178 samples)です。サンプル名がやたらと長いのが難点。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
colnames(data)                         #列名を表示

#後処理(列名変更)
identical(colnames(data), rownames(colData(rse)))#2つのオブジェクトの同一性を確認(同じならTRUE)
colnames(data) <- as.character(colData(rse)$characteristics)#列名を変更
colnames(data)                         #列名を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題4と基本的に同じですが、サンプル名の文字列をスペースで区切り、3番目の要素を抽出しています。 そこが"lesional(病変という意味)" or "normal"のどちらかになるので、必要最小限になるからです。 出力ファイルはhoge5.txt(58,037 genes×178 samples)です。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
colnames(data)                         #列名を表示

#後処理(列名変更)
identical(colnames(data), rownames(colData(rse)))#2つのオブジェクトの同一性を確認(同じならTRUE)
hoge <- as.character(colData(rse)$characteristics)#characteristics列の情報をhogeに格納
hoge2 <- strsplit(hoge, " ", fixed=TRUE)#hoge中の文字列を" "で区切った結果をリスト形式でhoge2に格納
hoge3 <- unlist(lapply(hoge2, "[[", 3))#hoge2のリスト中の3番目の要素を抽出してhoge3に格納
colnames(data) <- hoge3                #colnames(data)の中身をhoge3で置換
colnames(data)                         #列名を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

6. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題5の発展形です。例題5は計178サンプルの並びがグループごとになっていないのでソートしています。 つまり、95 lesional psoriatic samplesと82 normal samplesに分けて出力しています。 出力ファイルはhoge6.txtです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
colnames(data)                         #列名を表示

#後処理(列名変更)
identical(colnames(data), rownames(colData(rse)))#2つのオブジェクトの同一性を確認(同じならTRUE)
hoge <- as.character(colData(rse)$characteristics)#characteristics列の情報をhogeに格納
hoge2 <- strsplit(hoge, " ", fixed=TRUE)#hoge中の文字列を" "で区切った結果をリスト形式でhoge2に格納
hoge3 <- unlist(lapply(hoge2, "[[", 3))#hoge2のリスト中の3番目の要素を抽出してhoge3に格納
colnames(data) <- hoge3                #colnames(data)の中身をhoge3で置換
colnames(data)                         #列名を表示

#後処理(列名でソート)
data <- data[, order(colnames(data))]  #列名でソート
colnames(data)                         #列名を表示
length(grep("lesi", colnames(data)))   #列名ベクトルcolnames(data)から"lesi"を含む要素数を表示
length(grep("norma", colnames(data)))  #列名ベクトルcolnames(data)から"norma"を含む要素数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

7. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

technicla replicatesのデータをマージして、 計173 samplesのデータ(92 lesional psoriatic skin samples and 81 normal skin samples)を群ごとにソートしています。 出力ファイルはhoge6.txtです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
x <- assays(rse)$counts                #カウントデータ行列を取得してxに格納
x <- as.data.frame(x)                  #データの型をデータフレームに変更

#後処理(マージとソート)
data <- cbind(x$SRR1146077, x$SRR1146078, x$SRR1146079,#lesional01-03
              x$SRR1146080, x$SRR1146081, x$SRR1146082,#lesional04-06
              x$SRR1146083 + x$SRR1146084, x$SRR1146087, x$SRR1146089,#lesional07-09
              x$SRR1146090, x$SRR1146091, x$SRR1146092,#lesional10-12
              x$SRR1146093, x$SRR1146094, x$SRR1146095,#lesional13-15
              x$SRR1146097, x$SRR1146098 + x$SRR1146099, x$SRR1146100,#lesional16-18
              x$SRR1146102, x$SRR1146103, x$SRR1146104,#lesional19-21
              x$SRR1146105, x$SRR1146110, x$SRR1146112,#lesional22-24
              x$SRR1146119, x$SRR1146123, x$SRR1146124,#lesional25-27
              x$SRR1146128, x$SRR1146129, x$SRR1146132,#lesional28-30
              x$SRR1146133, x$SRR1146134, x$SRR1146135,#lesional31-33
              x$SRR1146136, x$SRR1146140, x$SRR1146141,#lesional34-36
              x$SRR1146147, x$SRR1146148, x$SRR1146149,#lesional37-39
              x$SRR1146150, x$SRR1146151, x$SRR1146152,#lesional40-42
              x$SRR1146154, x$SRR1146155, x$SRR1146156,#lesional43-45
              x$SRR1146157, x$SRR1146158, x$SRR1146159,#lesional46-48
              x$SRR1146160, x$SRR1146161, x$SRR1146162,#lesional49-51
              x$SRR1146163, x$SRR1146164, x$SRR1146165,#lesional52-54
              x$SRR1146168, x$SRR1146199, x$SRR1146202,#lesional55-57
              x$SRR1146203, x$SRR1146204, x$SRR1146205,#lesional58-60
              x$SRR1146206, x$SRR1146208, x$SRR1146209,#lesional61-63
              x$SRR1146210, x$SRR1146211, x$SRR1146212,#lesional64-66
              x$SRR1146214, x$SRR1146215, x$SRR1146216 + x$SRR1146217,#lesional67-69
              x$SRR1146218, x$SRR1146219, x$SRR1146220,#lesional70-72
              x$SRR1146221, x$SRR1146222, x$SRR1146223,#lesional73-75
              x$SRR1146224, x$SRR1146225, x$SRR1146226,#lesional76-78
              x$SRR1146227, x$SRR1146228, x$SRR1146229,#lesional79-81
              x$SRR1146233, x$SRR1146234, x$SRR1146235,#lesional82-84
              x$SRR1146237, x$SRR1146239, x$SRR1146240,#lesional85-87
              x$SRR1146241, x$SRR1146242, x$SRR1146252,#lesional88-90
              x$SRR1146253, x$SRR1146254,              #lesional91-92
              x$SRR1146076, x$SRR1146085 + x$SRR1146086, x$SRR1146088,#normal01-03
              x$SRR1146096, x$SRR1146101, x$SRR1146106,#normal04-06
              x$SRR1146107, x$SRR1146108, x$SRR1146109,#normal07-09
              x$SRR1146111, x$SRR1146113, x$SRR1146114,#normal10-12
              x$SRR1146115, x$SRR1146116, x$SRR1146117,#normal13-15
              x$SRR1146118, x$SRR1146120, x$SRR1146121,#normal16-18
              x$SRR1146122, x$SRR1146125, x$SRR1146126,#normal19-21
              x$SRR1146127, x$SRR1146130, x$SRR1146131,#normal22-24
              x$SRR1146137, x$SRR1146138, x$SRR1146139,#normal25-27
              x$SRR1146142, x$SRR1146143, x$SRR1146144,#normal28-30
              x$SRR1146145, x$SRR1146146, x$SRR1146153,#normal31-33
              x$SRR1146166, x$SRR1146167, x$SRR1146169,#normal34-36
              x$SRR1146170, x$SRR1146171, x$SRR1146172,#normal37-39
              x$SRR1146173, x$SRR1146174, x$SRR1146175,#normal40-42
              x$SRR1146176, x$SRR1146177, x$SRR1146178,#normal43-45
              x$SRR1146179, x$SRR1146180, x$SRR1146181,#normal46-48
              x$SRR1146182, x$SRR1146183, x$SRR1146184,#normal49-51
              x$SRR1146185, x$SRR1146186, x$SRR1146187,#normal52-54
              x$SRR1146188, x$SRR1146189, x$SRR1146190,#normal55-57
              x$SRR1146191, x$SRR1146192, x$SRR1146193,#normal58-60
              x$SRR1146194, x$SRR1146195, x$SRR1146196,#normal61-63
              x$SRR1146197, x$SRR1146198, x$SRR1146200,#normal64-66
              x$SRR1146201, x$SRR1146207, x$SRR1146213,#normal67-69
              x$SRR1146230, x$SRR1146231 + x$SRR1146232, x$SRR1146236,#normal70-72
              x$SRR1146238, x$SRR1146243, x$SRR1146244,#normal73-75
              x$SRR1146245, x$SRR1146246, x$SRR1146247,#normal76-78
              x$SRR1146248, x$SRR1146249, x$SRR1146250)#normal79-81

colnames(data) <- c(paste("lesional", 1:92, sep=""), paste("normal", 1:81, sep=""))#列名を付加
rownames(data) <- rownames(x)          #行名を付加
dim(data)                              #行数と列数を表示
colnames(data)                         #列名を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

カウント情報取得 | リアルデータ | SRP026126 | recount(Collado-Torres_2017)

recountパッケージを用いて、 SRP026126(Nottingham et al., RNA, 2016;ブラウザはIE以外を推奨) のカウント情報を含むRangedSummarizedExperimentクラスオブジェクトという形式の.Rdataをダウンロードしたり、 カウントデータの数値行列にした状態で保存するやり方を示します。 2016年の原著論文で示されている生データのID情報は、 GSE48035SRP066009です。 ここでダウンロードするSRP026126のデータはGSE48035に相当します。 SRP066009は、原著論文中でも述べられていますがTGIRT-seqのデータ(計12 samples)に相当します。 SRP056295のオリジナルは422サンプルのようですが、例題4までで得られるのは計418サンプルの発現データです。 これは、カウントデータ取得時にrecount内でのクオリティ基準を満たさなかったため、4サンプル分(SRR902979, SRR903120, SRR903123, and SRR903269)が落とされているからです。 418サンプルから同一サンプルの重複除去を行うと、xxxサンプルになります。

「ファイル」−「ディレクトリの変更」でダウンロードしたいディレクトリに移動し以下をコピペ。

1. geneレベルカウントデータ情報を得たい場合:

SRP026126という名前のフォルダが作成されます。 中にあるrse-gene.Rdataをロードして読み込むとrse-geneというオブジェクト名で取り扱えます。 ウェブサイトrecount2上でSRP026126で検索し、 gene列のRSE v2を ダウンロードして得られるrse_gene.Rdataと同じです。

param_ID <- "SRP026126"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataをダウンロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
	

2. geneレベルカウントデータ情報を得たい場合:

1.の発展形として、ダウンロードも行い、さらにカウントの数値行列情報(58,037 genes×418 samples)のみをタブ区切りテキストファイルで保存するやり方です。 出力ファイルはhoge2.txt(約xxMB)です。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_ID <- "SRP026126"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataのダウンロードとロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
load(file.path(param_ID, 'rse_gene.Rdata'))#作成されたparam_IDという名前のディレクトリ中の.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

ウェブサイトrecount2上でSRP026126で検索し、 gene列のRSE v2のところからダウンロードして得られた geneレベルカウントデータ(rse_gene.Rdata; 約68MB)を読み込んで、 カウントの数値行列情報のみをタブ区切りテキストファイルで保存するやり方です。出力ファイルの中身はhoge2.txtと同じです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題3と基本的に同じですが、サンプル名をcolData(rse)$titleで見えているものに変更するやり方です。 出力ファイルはhoge4.txt(58,037 genes×418 samples)です。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
colnames(data)                         #列名を表示

#後処理(列名変更)
identical(colnames(data), rownames(colData(rse)))#2つのオブジェクトの同一性を確認(同じならTRUE)
colnames(data) <- colData(rse)$title   #列名を変更
colnames(data)                         #列名を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題4の発展形として、technical replicatesのデータをマージしています。 出力ファイルはhoge5.txt(58,037 genes×62 samples)です。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
colnames(data)                         #列名を表示

#後処理(列名変更)
identical(colnames(data), rownames(colData(rse)))#2つのオブジェクトの同一性を確認(同じならTRUE)
colnames(data) <- colData(rse)$title   #列名を変更
colnames(data)                         #列名を表示

#後処理(technical replicatesをマージ)
unique_sample <- unique(colnames(data))#ユニーク(non-redundant)なサンプル名からなる文字列ベクトルを作成
hoge <- NULL                           #最終的に欲しい情報を格納するためのプレースホルダ
for(i in 1:length(unique_sample)){     #non-redundantなサンプル数分だけループを回す
  posi <- which(colnames(data) == unique_sample[i])#dataの中からi番目のサンプル名と同じ列の番号情報を抽出
  if(length(posi) > 1){                #同一サンプルが複数個存在する場合
    hoge <- cbind(hoge, apply(data[, posi], 1, "sum", na.rm=TRUE))#dataの中からposi番目の列のデータを抽出し、sumした結果をhogeの右側の列として追加
  } else {                             #同一サンプルが1個しかない場合
    hoge <- cbind(hoge, data[, posi])  #dataの中からposi番目の列のデータを抽出した結果をhogeの右側の列として追加
  }
}                                      #non-redundantなサンプル数分だけループを回す
colnames(hoge) <- unique_sample        #unique_sampleをhogeの列名として利用
dim(hoge)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(hoge), hoge)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

カウント情報取得 | リアルデータ | SRP018853 | recount(Collado-Torres_2017)

recountパッケージを用いて、 SRP018853(Zhang et al., J Autoimmun., 2016;ブラウザはIE以外を推奨) のカウント情報を含むRangedSummarizedExperimentクラスオブジェクトという形式の.Rdataをダウンロードしたり、 カウントデータの数値行列にした状態で保存するやり方を示します。 原著論文では、38 healthy samplesと42 high risk of type 1 diabetes (pre-T1D) samplesからなる、計80サンプルのmiRNA発現データを取得しています。 このうち、SRR764979とSRR765019がカウントデータ取得時にrecount内でのクオリティ基準を満たさなかったようです。 結果として、37 healthy samplesと41 pre-T1D samplesの、計78サンプルからなるカウントデータがここでは得られます。

「ファイル」−「ディレクトリの変更」でダウンロードしたいディレクトリに移動し以下をコピペ。

1. geneレベルカウントデータ情報を得たい場合:

SRP018853という名前のフォルダが作成されます。 中にあるrse-gene.Rdataをロードして読み込むとrse-geneというオブジェクト名で取り扱えます。 ウェブサイトrecount2上でSRP018853で検索し、 gene列のRSE v2をダウンロードして得られるrse_gene.Rdataと同じです。

param_ID <- "SRP018853"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataをダウンロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
	

2. geneレベルカウントデータ情報を得たい場合:

1.の発展形として、ダウンロードも行い、さらにカウントの数値行列情報(58,037 genes×78 samples)のみをタブ区切りテキストファイルで保存するやり方です。 出力ファイルはhoge2.txt(約10MB)です。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_ID <- "SRP018853"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataのダウンロードとロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
load(file.path(param_ID, 'rse_gene.Rdata'))#作成されたparam_IDという名前のディレクトリ中の.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

ウェブサイトrecount2上でSRP018853で検索し、 gene列のRSE v2のところからダウンロードして得られた geneレベルカウントデータ(rse_gene.Rdata; 約2MB)を読み込んで、 カウントの数値行列情報のみをタブ区切りテキストファイルで保存するやり方です。出力ファイルの中身はhoge2.txtと同じです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題3と基本的に同じですが、サンプル名をcolData(rse)$characteristicsで見えているものに変更するやり方です。 出力ファイルはhoge4.txt(58,037 genes×78 samples)です。 内訳は、37 healthy samplesと41 pre-T1D samplesです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#後処理(列名変更)
identical(colnames(data), rownames(colData(rse)))#2つのオブジェクトの同一性を確認(同じならTRUE)
hoge <- colData(rse)$characteristics   #characteristics列の情報をhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", 1)) #hogeのリスト中の1番目の要素を抽出してhoge2に格納
hoge3 <- gsub("status: ", "", hoge2)   #hoge2中の"status: "を削除
colnames(data) <- hoge3                #colnames(data)の中身をhoge3で置換
colnames(data)                         #列名を表示
length(grep("heal", colnames(data)))   #列名ベクトルcolnames(data)から"heal"を含む要素数を表示
length(grep("pre-", colnames(data)))  #列名ベクトルcolnames(data)から"pre-"を含む要素数を表示


#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

カウント情報取得 | リアルデータ | SRP012167 | recount(Collado-Torres_2017)

recountパッケージを用いて、 SRP012167(Haglund et al., J Clin Endocrinol Metab., 2012;ブラウザはIE以外を推奨) のカウント情報を含むRangedSummarizedExperimentクラスオブジェクトという形式の.Rdataをダウンロードしたり、 カウントデータの数値行列にした状態で保存するやり方を示します。

「ファイル」−「ディレクトリの変更」でダウンロードしたいディレクトリに移動し以下をコピペ。

1. geneレベルカウントデータ情報を得たい場合:

SRP012167という名前のフォルダが作成されます。 中にあるrse-gene.Rdataをロードして読み込むとrse-geneというオブジェクト名で取り扱えます。 ウェブサイトrecount2上でSRP012167で検索し、 gene列のRSE v2をダウンロードして得られるrse_gene.Rdataと同じです。

param_ID <- "SRP012167"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataをダウンロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
	

2. geneレベルカウントデータ情報を得たい場合:

1.の発展形として、ダウンロードも行い、さらにカウントの数値行列情報(58,037 genes×25 samples)のみをタブ区切りテキストファイルで保存するやり方です。 出力ファイルはhoge2.txtです。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_ID <- "SRP012167"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataのダウンロードとロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
load(file.path(param_ID, 'rse_gene.Rdata'))#作成されたparam_IDという名前のディレクトリ中の.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

ウェブサイトrecount2上でSRP012167で検索し、 gene列のRSE v2のところからダウンロードして得られた geneレベルカウントデータ(rse_gene.Rdata; 約4MB)を読み込んで、 カウントの数値行列情報のみをタブ区切りテキストファイルで保存するやり方です。出力ファイルはhoge3.txtです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

カウント情報取得 | リアルデータ | SRP012167 | parathyroidSE(Haglund_2012)

parathyroidSEパッケージを用いて、 SRP012167(Haglund et al., J Clin Endocrinol Metab., 2012;ブラウザはIE以外を推奨) のカウント情報を含むRangedSummarizedExperimentオブジェクトという形式のデータセット(parathyroidGenesSEおよびparathyroidExonsSEという名前で格納されています) をdata関数を用いてロードしたり、カウントデータの数値行列にした状態で保存するやり方を示します。

1. parathyroidGenesSEの場合:

gene-levelカウントデータのRangedSummarizedExperimentオブジェクトです。 63,193 Ensembl gene IDs×27 samplesのカウントデータです。

#必要なパッケージをロード
library(parathyroidSE)                 #パッケージの読み込み

#本番(目的のデータセットをロード)
data(parathyroidGenesSE)               #paramで指定したデータセットのロード
ls()                                   #利用可能なオブジェクト名を表示
rse <- parathyroidGenesSE              #rseとして取り扱う
rse                                    #確認してるだけです
	

2. parathyroidExonsSEの場合:

exon-levelカウントデータのRangedSummarizedExperimentオブジェクトです。 626,686 exons×27 samplesのカウントデータです。

#必要なパッケージをロード
library(parathyroidSE)                 #パッケージの読み込み

#本番(目的のデータセットをロード)
data(parathyroidExonsSE)               #paramで指定したデータセットのロード
ls()                                   #利用可能なオブジェクト名を表示
rse <- parathyroidExonsSE              #rseとして取り扱う
rse                                    #確認してるだけです
	

カウント情報取得 | リアルデータ | SRP001558 | recount(Collado-Torres_2017)

recountパッケージを用いて、 SRP001558(Blekhman et al., Genome Res., 2010;ブラウザはIE以外を推奨) のカウント情報を含むRangedSummarizedExperimentクラスオブジェクトという形式の.Rdataをダウンロードしたり、カウントデータの数値行列にした状態で保存するやり方を示します。 原著論文では、3生物種(ヒト12 samples、チンパンジー12 samples、そしてアカゲザル12 samples)のカウントデータを取得しています。 ウェブサイトrecount2上でSRP001558で検索すると、 number of samplesが12、speciesがhumanとなっていることから、提供されているカウントデータはhumanに限定されていることがわかります。 例題2までで、なぜか11 samples分のデータしかないことに気づきます。これは、ウェブサイトrecount2上でSRP001558で検索し、 phenotype列のlinkをダウンロードして得られるSRP001558.tsv を眺めることでなんとなくの理由がわかります。私は、「SRR032117のデータがおかしなことになっており、recount2で提供するクオリティに達しなかった。 このため、recount2のウェブページ上は12 samplesとなっているものの、カウントデータ自体は11 samples分となっているのだろう。」と予想しました。 また、PRJNA119135GSE17274SRA010277はENA上にリンク先がありますが、 ウェブサイトrecount2上では引っかかってきませんでした。 2018年8月7日に、recountWorkflow で推奨されているscale_counts関数実行後のカウントデータとなるように変更しました。

「ファイル」−「ディレクトリの変更」でダウンロードしたいディレクトリに移動し以下をコピペ。

1. geneレベルカウントデータ情報を得たい場合:

SRP001558という名前のフォルダが作成されます。 中にあるrse-gene.Rdataをロードして読み込むとrse-geneというオブジェクト名で取り扱えます。 ウェブサイトrecount2上でSRP001558で検索し、 gene列のRSE v2をダウンロードして得られるrse_gene.Rdataと同じです。

param_ID <- "SRP001558"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataをダウンロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
	

2. geneレベルカウントデータ情報を得たい場合:

1.の発展形として、ダウンロードも行い、さらにカウントの数値行列情報(58,037 genes×11 samples)のみをタブ区切りテキストファイルで保存するやり方です。 出力ファイルはhoge2.txtです。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_ID <- "SRP001558"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataのダウンロードとロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
load(file.path(param_ID, 'rse_gene.Rdata'))#作成されたparam_IDという名前のディレクトリ中の.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

ウェブサイトrecount2上でSRP001558で検索し、 gene列のRSE v2のところからダウンロードして得られた geneレベルカウントデータ(rse_gene.Rdata; 約3MB)を読み込んで、 カウントの数値行列情報(58,037 genes×11 samples)のみをタブ区切りテキストファイルで保存するやり方です。出力ファイルはhoge3.txtです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題3とベースとして、さらにサンプルのメタデータ情報ファイル(srp001558_meta_samples.txt)と、 遺伝子(features)のメタデータ情報ファイル(srp001558_meta_features.txt)も出力するやり方です。 58,037 genes×11 samplesからなるカウントデータファイル(hoge4_counts.txt)は列名をSRR...からSRS...に変更しています。 このデータセットの場合は、なぜかtechnical replicatesのサンプルに対して別々のSRS IDが付与されているので、列名変更はほぼ無意味です。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge4_counts.txt"           #出力ファイル名を指定してout_f1に格納(カウントデータ)
out_f2 <- "srp001558_meta_samples.txt" #出力ファイル名を指定してout_f2に格納(samplesメタデータ)
out_f3 <- "srp001558_meta_features.txt"#出力ファイル名を指定してout_f3に格納(featuresメタデータ)

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#入力ファイルの読み込み
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
colnames(data) <- colData(rse)$sample  #列名をERR...からERS...に変更
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存(カウントデータ)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(サンプルのメタデータ情報)
tmp <- colData(rse)                    #保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(featuresのメタデータ情報)
tmp <- rowData(rse)                    #保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題4で得られたサンプルのメタデータ情報ファイル(hoge4_meta_samples.txt)中のtitle列に相当する情報で置き換えています。 これは、hoge4_meta_samples.txtをExcelで眺めたときに、たまたまtitle列情報がdiscriminable(容易に識別可能である)だと主観的に判断したためです。 このあたりの情報のクオリティというかどのような情報が提供されているかは、submitter依存です。したがって、一筋縄ではいきません。まるで有益な情報のない残念なものも結構あるからです。 58,037 genes×11 samplesからなる出力ファイルはhoge5.txtです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#入力ファイルの読み込み(.Rdata)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#後処理(列名を変更)
colnames(data)<- colData(rse)$title    #列名を変更
head(data)                             #確認してるだけです

#ファイルに保存(カウントデータ)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

6. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題5の続きのようなものですが、technical replicatesのデータをマージした結果を出力しています。 例えば、"Human female 2 rep1"列と"Human female 2 rep2"列のカウント数の和をとり、列名を"HSF2"のようにしています。 この列名の表記法は、「サンプルデータ42の20,689 genes×18 samplesのリアルカウントデータ (sample_blekhman_18.txt)」中のヒトサンプル名と同じにしています。 58,037 genes×6 samplesからなる出力ファイルはsrp001558_count_hoge6.txtです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "srp001558_count_hoge6.txt"   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#入力ファイルの読み込み(.Rdata)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
uge <- assays(rse)$counts              #カウントデータ行列を取得してugeに格納
dim(uge)                               #行数と列数を表示
head(uge)                              #確認してるだけです

#後処理(technical replicatesの列をマージ)
uge <- as.data.frame(uge)              #行列形式からデータフレーム形式に変更
data <- cbind(                         #必要な列名の情報を取得したい列の順番で結合した結果をdataに格納
  uge$SRR032116,                       #HSF1
  uge$SRR032118 + uge$SRR032119,       #HSF2
  uge$SRR032120 + uge$SRR032121,       #HSF3
  uge$SRR032122 + uge$SRR032123,       #HSM1
  uge$SRR032124 + uge$SRR032125,       #HSM2
  uge$SRR032126 + uge$SRR032127)       #HSM3
  
colnames(data) <- c(                   #列名を付加
  "HSF1", "HSF2", "HSF3",              #列名を付加
  "HSM1", "HSM2", "HSM3")              #列名を付加
rownames(data)<- rownames(uge)         #行名を付加
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存(カウントデータ)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

7. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題5と基本的に同じで、scale_counts関数実行前後の違いを表示させているだけです。 58,037 genes×11 samplesからなる出力ファイルはhoge7.txtです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#入力ファイルの読み込み(.Rdata)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
colSums(assays(rse)$counts)            #列ごとの総和を表示

#本番(scaling)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
colSums(assays(rse)$counts)            #列ごとの総和を表示

#後処理(scaling後のカウントデータ取得と列名変更)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
colnames(data)<- colData(rse)$title    #列名を変更

#ファイルに保存(カウントデータ)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

8. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題5の発展形として、recount(R package) のrecount quick start guideのHTML で書かれているgetRPKM関数実行結果を返すやり方です。58,037 genes×11 samplesからなる出力ファイルはhoge8.txtです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge8.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#入力ファイルの読み込み(.Rdata)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
colSums(assays(rse)$counts)            #列ごとの総和を表示

#本番(RPKM値の取得)
data <- getRPKM(rse)                   #getRPKM実行結果をdataに格納
colSums(data)                          #列ごとの総和を表示

#後処理(列名変更)
colnames(data)<- colData(rse)$title    #列名を変更

#ファイルに保存(カウントデータ)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

9. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題8をベースとし、さらに例題4の発展形として、rowRanges関数実行結果に含まれるfeatureのより詳細なメタデータ情報 (遺伝子の染色体上の位置情報などを出力する)をファイルに保存しています。 出力ファイルはhoge9_counts.txthoge9_features.txtです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge9_counts.txt"           #出力ファイル名を指定してout_f1に格納(RPKM値)
out_f2 <- "hoge9_features.txt"         #出力ファイル名を指定してout_f2に格納(featuresメタデータ)

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#入力ファイルの読み込み(.Rdata)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
colSums(assays(rse)$counts)            #列ごとの総和を表示

#本番(RPKM値の取得)
data <- getRPKM(rse)                   #getRPKM実行結果をdataに格納
colSums(data)                          #列ごとの総和を表示

#後処理(列名変更)
colnames(data)<- colData(rse)$title    #列名を変更

#ファイルに保存(RPKMデータ)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(featuresのメタデータ情報)
tmp <- rowRanges(rse)                  #保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

カウント情報取得 | リアルデータ | SRP001540 | recount(Collado-Torres_2017)

recountパッケージを用いて、 SRP001540(Pickrell et al., Nature, 2010;ブラウザはIE以外を推奨) のカウント情報を含むRangedSummarizedExperimentクラスオブジェクトという形式の.Rdataをダウンロードしたり、カウントデータの数値行列にした状態で保存するやり方を示します。 原著論文では、ヒトの69 lymphoblastoid cell linesのRNA-seqデータを取得しています。 このデータはAbsFilterGSEA (Yoon et al., PLoS One, 2016)および GSVA (Hänzelmann et al., BMC Bioinformatics, 2013)中で、 検証用データとして用いられています。 具体的には、MSigDB C1で、 2つのsex-specificな遺伝子セット(chryq11とchrxp22)が発現変動しているという結果を得ているようです。 69 samplesの内訳は40 females and 29 malesのようですが、SRP001540 からは性別情報は不明です。原著論文(Pickrell et al., Nature, 2010)をよく読むと http://eqtl.uchicago.eduからも情報取得可能だと書かれていますが性別情報までは探しきれませんでした。 Yale sequencing centerとArgonne sequencing centerの2か所でデータがとられており、 個体ごとに少なくとも2反復のデータがとられているようです(at least two replicate lanes per individual)。 性別(Gender)情報についてはその後、ウェブサイトrecount2上でSRP001540で検索し、 phenotype列のリンク先(SRP001540.tsv)から得られるcell lineのID情報を、 https://www.coriell.org/上で一つ一つ調べることで得られることがわかりました。 SRP001540.tsvの右側に gender情報を追加したExcelファイルは、SRP001540_gender.xlsxです。 2018年8月7日に、recountWorkflow で推奨されているscale_counts関数実行後のカウントデータとなるように変更しました。

「ファイル」−「ディレクトリの変更」でダウンロードしたいディレクトリに移動し以下をコピペ。

1. geneレベルカウントデータ情報を得たい場合:

SRP001540という名前のフォルダが作成されます。 中にあるrse-gene.Rdataをロードして読み込むとrse-geneというオブジェクト名で取り扱えます。 ウェブサイトrecount2上でSRP001540で検索し、 gene列のRSE v2をダウンロードして得られるrse_gene.Rdataと同じです。

param_ID <- "SRP001540"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataをダウンロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
	

2. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題1で得られたファイル(rse_gene.Rdata; 約16MB)を読み込んで、 カウントの数値行列情報(58,037 genes×160 samples)のみをタブ区切りテキストファイルで保存するやり方です。 出力ファイルはhoge2.txtです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題2と基本的に同じですが、列名を"cell line ID"と"sequencing center名"をマージした情報に置換しています。 出力ファイルはhoge3.txtです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得と列名変更)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
colnames(data)                         #列名を表示
rownames(colData(rse))                 #行名を表示
identical(colnames(data), rownames(colData(rse)))#2つのオブジェクトの同一性を確認(同じならTRUE)
colnames(data) <- colData(rse)$title   #列名を変更
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題3と基本的に同じですが、Yale sequence centerのデータのみ抽出し、technical replicatesをマージし、 40 Femalessと29 Malesが明瞭に分離されるようにソートしています。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
x <- assays(rse)$counts                #カウントデータ行列を取得してxに格納
x <- as.data.frame(x)                  #データの型をデータフレームに変更

#後処理(一部データ抽出、マージ、ソート)
data <- cbind(x$SRR031822, x$SRR031953 + x$SRR031873,#Female1-2
              x$SRR031952 + x$SRR031871, x$SRR031868,#Female3-4
              x$SRR031819, x$SRR031897 + x$SRR031857,#Female5-6
              x$SRR031823, x$SRR031959, x$SRR031955,#Female7-9
              x$SRR031954, x$SRR031956, x$SRR031838,#Female10-12
              x$SRR031918, x$SRR031817, x$SRR031949 + x$SRR031852,#Female13-15
              x$SRR031841, x$SRR031865, x$SRR031896,#Female16-18
              x$SRR031853, x$SRR031820, x$SRR031874,#Female19-21
              x$SRR031895, x$SRR031870, x$SRR031839,#Female22-24
              x$SRR031958, x$SRR031867, x$SRR031848,#Female25-27
              x$SRR031847, x$SRR031818, x$SRR031919,#Female28-30
              x$SRR031866, x$SRR031849, x$SRR031877,#Female31-33
              x$SRR031814, x$SRR031914, x$SRR031812,#Female34-36
              x$SRR031842, x$SRR031843, x$SRR031860, x$SRR031837,#Female37-40
              x$SRR031917, x$SRR031821 + x$SRR031898,#Male1-2
              x$SRR031950 + x$SRR031850, x$SRR031876 + x$SRR031862,#Male3-4
              x$SRR031875, x$SRR031915, x$SRR031878 + x$SRR031863,#Male5-7
              x$SRR031869, x$SRR031864, x$SRR031845,#Male8-10
              x$SRR031951 + x$SRR031851, x$SRR031846,#Male11-12
              x$SRR031916, x$SRR031844, x$SRR031813,#Male13-15
              x$SRR031894, x$SRR031854, x$SRR031858,#Male16-18
              x$SRR031859, x$SRR031872, x$SRR031816,#Male19-21
              x$SRR031815, x$SRR031920 + x$SRR031899,#Male22-23
              x$SRR031957 + x$SRR031855, x$SRR031840,#Male24-25
              x$SRR031948, x$SRR031893, x$SRR031811, x$SRR031861)#Male26-29
colnames(data) <- c(paste("Female", 1:40, sep=""), paste("Male", 1:29, sep=""))#列名を付加
rownames(data) <- rownames(x)          #行名を付加

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題3と基本的に同じですが、Argonne sequence centerのデータのみ抽出し、 technical replicatesをマージし、40 Femalessと29 Malesが明瞭に分離されるようにソートしています。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
x <- assays(rse)$counts                #カウントデータ行列を取得してxに格納
x <- as.data.frame(x)                  #データの型をデータフレームに変更

#後処理(一部データ抽出、マージ、ソート)
data <- cbind(x$SRR031834, x$SRR031962 + x$SRR031903,#Female1-2
              x$SRR031964 + x$SRR031902, x$SRR031904,#Female3-4
              x$SRR031879, x$SRR031926 + x$SRR031925,#Female5-6
              x$SRR031880, x$SRR031941, x$SRR031944,#Female7-9
              x$SRR031945, x$SRR031907, x$SRR031885,#Female10-12
              x$SRR031946, x$SRR031831, x$SRR031940 + x$SRR031967,#Female13-15
              x$SRR031889, x$SRR031931, x$SRR031927,#Female16-18
              x$SRR031968, x$SRR031883, x$SRR031912,#Female19-21
              x$SRR031934, x$SRR031901, x$SRR031882,#Female22-24
              x$SRR031960, x$SRR031900, x$SRR031836,#Female25-27
              x$SRR031832, x$SRR031833, x$SRR031937,#Female28-30
              x$SRR031932, x$SRR031884, x$SRR031942,#Female31-33
              x$SRR031828, x$SRR031936, x$SRR031835,#Female34-36
              x$SRR031888, x$SRR031908, x$SRR031824, x$SRR031886,#Female37-40
              x$SRR031938, x$SRR031881 + x$SRR031933,#Male1-2
              x$SRR031965, x$SRR031909 + x$SRR031928,#Male3-4
              x$SRR031911, x$SRR031947, x$SRR031913 + x$SRR031929,#Male5-7
              x$SRR031906, x$SRR031930, x$SRR031891,#Male8-10
              x$SRR031963 + x$SRR031966, x$SRR031890,#Male11-12
              x$SRR031935, x$SRR031892, x$SRR031826,#Male13-15
              x$SRR031921, x$SRR031969, x$SRR031922,#Male16-18
              x$SRR031923, x$SRR031905, x$SRR031827,#Male19-21
              x$SRR031830, x$SRR031943 + x$SRR031910,#Male22-23
              x$SRR031939 + x$SRR031970, x$SRR031887,#Male24-25
              x$SRR031961 + x$SRR031971, x$SRR031924,#Male26-27
              x$SRR031829, x$SRR031825)#Male28-29
colnames(data) <- c(paste("Female", 1:40, sep=""), paste("Male", 1:29, sep=""))#列名を付加
rownames(data) <- rownames(x)          #行名を付加

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

6. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題4と基本的に同じですが、さらにサンプルのメタデータ情報ファイル(srp001558_meta_samples.txt)と、 遺伝子(features)のメタデータ情報ファイル(srp001540_meta_features.txt)も出力するやり方です。 他の出力ファイルはsrp001540_count_yale.txtです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f1 <- "srp001540_count_yale.txt"   #出力ファイル名を指定してout_f1に格納(カウントデータ)
out_f2 <- "srp001540_meta_samples.txt" #出力ファイル名を指定してout_f2に格納(samplesメタデータ)
out_f3 <- "srp001540_meta_features.txt"#出力ファイル名を指定してout_f3に格納(featuresメタデータ)

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
x <- assays(rse)$counts                #カウントデータ行列を取得してxに格納
x <- as.data.frame(x)                  #データの型をデータフレームに変更

#後処理(一部データ抽出、マージ、ソート)
data <- cbind(x$SRR031822, x$SRR031953 + x$SRR031873,#Female1-2
              x$SRR031952 + x$SRR031871, x$SRR031868,#Female3-4
              x$SRR031819, x$SRR031897 + x$SRR031857,#Female5-6
              x$SRR031823, x$SRR031959, x$SRR031955,#Female7-9
              x$SRR031954, x$SRR031956, x$SRR031838,#Female10-12
              x$SRR031918, x$SRR031817, x$SRR031949 + x$SRR031852,#Female13-15
              x$SRR031841, x$SRR031865, x$SRR031896,#Female16-18
              x$SRR031853, x$SRR031820, x$SRR031874,#Female19-21
              x$SRR031895, x$SRR031870, x$SRR031839,#Female22-24
              x$SRR031958, x$SRR031867, x$SRR031848,#Female25-27
              x$SRR031847, x$SRR031818, x$SRR031919,#Female28-30
              x$SRR031866, x$SRR031849, x$SRR031877,#Female31-33
              x$SRR031814, x$SRR031914, x$SRR031812,#Female34-36
              x$SRR031842, x$SRR031843, x$SRR031860, x$SRR031837,#Female37-40
              x$SRR031917, x$SRR031821 + x$SRR031898,#Male1-2
              x$SRR031950 + x$SRR031850, x$SRR031876 + x$SRR031862,#Male3-4
              x$SRR031875, x$SRR031915, x$SRR031878 + x$SRR031863,#Male5-7
              x$SRR031869, x$SRR031864, x$SRR031845,#Male8-10
              x$SRR031951 + x$SRR031851, x$SRR031846,#Male11-12
              x$SRR031916, x$SRR031844, x$SRR031813,#Male13-15
              x$SRR031894, x$SRR031854, x$SRR031858,#Male16-18
              x$SRR031859, x$SRR031872, x$SRR031816,#Male19-21
              x$SRR031815, x$SRR031920 + x$SRR031899,#Male22-23
              x$SRR031957 + x$SRR031855, x$SRR031840,#Male24-25
              x$SRR031948, x$SRR031893, x$SRR031811, x$SRR031861)#Male26-29
colnames(data) <- c(paste("Female", 1:40, sep=""), paste("Male", 1:29, sep=""))#列名を付加
rownames(data) <- rownames(x)          #行名を付加

#ファイルに保存(カウントデータ)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(サンプルのメタデータ情報)
#tmp <- colData(rse)                   #保存したい情報をtmpに格納
tmp <- apply(colData(rse), 2, as.character)#保存したい情報をtmpに格納(2022.05.13修正)
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(featuresのメタデータ情報)
#tmp <- rowData(rse)                   #保存したい情報をtmpに格納
tmp <- apply(rowData(rse), 2, as.character)#保存したい情報をtmpに格納(2022.05.13修正)
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

7. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題5と基本的に同じですが、さらにサンプルのメタデータ情報ファイル(srp001558_meta_samples.txt)と、 遺伝子(features)のメタデータ情報ファイル(srp001540_meta_features.txt)も出力するやり方です。 他の出力ファイルはsrp001540_count_argonne.txtです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f1 <- "srp001540_count_argonne.txt"#出力ファイル名を指定してout_f1に格納(カウントデータ)
out_f2 <- "srp001540_meta_samples.txt" #出力ファイル名を指定してout_f2に格納(samplesメタデータ)
out_f3 <- "srp001540_meta_features.txt"#出力ファイル名を指定してout_f3に格納(featuresメタデータ)

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
x <- assays(rse)$counts                #カウントデータ行列を取得してxに格納
x <- as.data.frame(x)                  #データの型をデータフレームに変更

#後処理(一部データ抽出、マージ、ソート)
data <- cbind(x$SRR031834, x$SRR031962 + x$SRR031903,#Female1-2
              x$SRR031964 + x$SRR031902, x$SRR031904,#Female3-4
              x$SRR031879, x$SRR031926 + x$SRR031925,#Female5-6
              x$SRR031880, x$SRR031941, x$SRR031944,#Female7-9
              x$SRR031945, x$SRR031907, x$SRR031885,#Female10-12
              x$SRR031946, x$SRR031831, x$SRR031940 + x$SRR031967,#Female13-15
              x$SRR031889, x$SRR031931, x$SRR031927,#Female16-18
              x$SRR031968, x$SRR031883, x$SRR031912,#Female19-21
              x$SRR031934, x$SRR031901, x$SRR031882,#Female22-24
              x$SRR031960, x$SRR031900, x$SRR031836,#Female25-27
              x$SRR031832, x$SRR031833, x$SRR031937,#Female28-30
              x$SRR031932, x$SRR031884, x$SRR031942,#Female31-33
              x$SRR031828, x$SRR031936, x$SRR031835,#Female34-36
              x$SRR031888, x$SRR031908, x$SRR031824, x$SRR031886,#Female37-40
              x$SRR031938, x$SRR031881 + x$SRR031933,#Male1-2
              x$SRR031965, x$SRR031909 + x$SRR031928,#Male3-4
              x$SRR031911, x$SRR031947, x$SRR031913 + x$SRR031929,#Male5-7
              x$SRR031906, x$SRR031930, x$SRR031891,#Male8-10
              x$SRR031963 + x$SRR031966, x$SRR031890,#Male11-12
              x$SRR031935, x$SRR031892, x$SRR031826,#Male13-15
              x$SRR031921, x$SRR031969, x$SRR031922,#Male16-18
              x$SRR031923, x$SRR031905, x$SRR031827,#Male19-21
              x$SRR031830, x$SRR031943 + x$SRR031910,#Male22-23
              x$SRR031939 + x$SRR031970, x$SRR031887,#Male24-25
              x$SRR031961 + x$SRR031971, x$SRR031924,#Male26-27
              x$SRR031829, x$SRR031825)#Male28-29
colnames(data) <- c(paste("Female", 1:40, sep=""), paste("Male", 1:29, sep=""))#列名を付加
rownames(data) <- rownames(x)          #行名を付加

#ファイルに保存(カウントデータ)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(サンプルのメタデータ情報)
#tmp <- colData(rse)                   #保存したい情報をtmpに格納
tmp <- apply(colData(rse), 2, as.character)#保存したい情報をtmpに格納(2022.05.13修正)
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(featuresのメタデータ情報)
#tmp <- rowData(rse)                   #保存したい情報をtmpに格納
tmp <- apply(rowData(rse), 2, as.character)#保存したい情報をtmpに格納(2022.05.13修正)
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

カウント情報取得 | リアルデータ | SRP001540 | GSVAdata(Hänzelmann_2013)

GSVAdataパッケージを用いて、 SRP001540(Pickrell et al., Nature, 2010;ブラウザはIE以外を推奨) のカウント情報を含むExpressionSetオブジェクトという形式のデータセット(commonPickrellHuangという名前で格納されています)をdata関数を用いてロードしたり、カウントデータの数値行列にした状態で保存するやり方を示します。 原著論文では、ヒトの69個体(40 female samples and 29 male samples)のカウントデータを取得しています。 このデータはAbsFilterGSEA (Yoon et al., PLoS One, 2016)、 およびGSVA (Hänzelmann et al., BMC Bioinformatics, 2013)中で、 検証用データとして用いられています。具体的には、MSigDB C1で、 2つのsex-specificな遺伝子セット(chryq11とchrxp22)が発現変動しているという結果を得ているようです。

「ファイル」−「ディレクトリの変更」でダウンロードしたいディレクトリに移動し以下をコピペ。

1. pickrellCountsArgonneCQNcommon_esetの場合:

原著論文(Pickrell et al., Nature, 2010)中で記載されている、 Argonne sequencing centerで取得された正規化後のカウントデータのExpressionSetオブジェクトです。

#必要なパッケージをロード
library(GSVAdata)                      #パッケージの読み込み

#本番(目的のデータセットをロード)
data(commonPickrellHuang)              #paramで指定したデータセットのロード
ls()                                   #利用可能なオブジェクト名を表示
eset <- pickrellCountsArgonneCQNcommon_eset#esetとして取り扱う
eset                                   #確認してるだけです
	

2. pickrellCountsYaleCQNcommon_esetの場合:

原著論文(Pickrell et al., Nature, 2010)中で記載されている、 Yale sequencing centerで取得された正規化後のカウントデータのExpressionSetオブジェクトです。計36サンプル。

#必要なパッケージをロード
library(GSVAdata)                      #パッケージの読み込み

#本番(目的のデータセットをロード)
data(commonPickrellHuang)              #paramで指定したデータセットのロード
ls()                                   #利用可能なオブジェクト名を表示
eset <- pickrellCountsYaleCQNcommon_eset#esetとして取り扱う
eset                                   #確認してるだけです
	

3. pickrellCountsYaleCQNcommon_esetの場合:

例題2の続きで、11,508 genes (正確にはEntrez Gene IDs) × 36 samplesからなるカウントデータ行列をファイルに保存するやり方です。 このデータの最初のEntrez Gene IDは8567で、Gene symbolはMADDであることなどがわかります。

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(GSVAdata)                      #パッケージの読み込み

#本番(目的のデータセットをロード)
data(commonPickrellHuang)              #paramで指定したデータセットのロード
ls()                                   #利用可能なオブジェクト名を表示
eset <- pickrellCountsYaleCQNcommon_eset#esetとして取り扱う
eset                                   #確認してるだけです

#ファイルに保存
write.exprs(eset, file=out_f)          #結果をout_fで指定したファイル名で保存
	

4. pickrellCountsYaleCQNcommon_esetの場合:

例題3と基本的に同じで、write.exprs関数を使わないやり方です。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(GSVAdata)                      #パッケージの読み込み

#本番(目的のデータセットをロード)
data(commonPickrellHuang)              #paramで指定したデータセットのロード
ls()                                   #利用可能なオブジェクト名を表示
eset <- pickrellCountsYaleCQNcommon_eset#esetとして取り扱う
eset                                   #確認してるだけです

#ファイルに保存
data <- exprs(eset)                    #dataとして取り扱う
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. pickrellCountsYaleCQNcommon_esetの場合:

例題4をベースとして、列名のところを性別(Female or Male)に変更しています。

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(GSVAdata)                      #パッケージの読み込み

#本番(目的のデータセットをロード)
data(commonPickrellHuang)              #paramで指定したデータセットのロード
ls()                                   #利用可能なオブジェクト名を表示
eset <- pickrellCountsYaleCQNcommon_eset#esetとして取り扱う
dim(pData(eset))                       #確認してるだけです
head(pData(eset))                      #確認してるだけです
pData(eset)$Gender                     #確認してるだけです
table(pData(eset)$Gender)              #確認してるだけです

#ファイルに保存
data <- exprs(eset)                    #dataとして取り扱う
colnames(data) <- pData(eset)$Gender   #列名を変更
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

6. pickrellCountsYaleCQNcommon_esetの場合:

例題5をベースとして、列名の性別(Female or Male)でソートしています。最初の23列がFemale、残りの13列がMaleになっていることがわかります。 11,508 Entrez gene IDs×36 samplesのカウントデータです。出力ファイルはhoge6.txtです。

out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(GSVAdata)                      #パッケージの読み込み

#本番(目的のデータセットをロード)
data(commonPickrellHuang)              #paramで指定したデータセットのロード
ls()                                   #利用可能なオブジェクト名を表示
eset <- pickrellCountsYaleCQNcommon_eset#esetとして取り扱う
dim(pData(eset))                       #確認してるだけです
head(pData(eset))                      #確認してるだけです
pData(eset)$Gender                     #確認してるだけです
table(pData(eset)$Gender)              #確認してるだけです

#後処理(列名を変更し、列をソート)
data <- exprs(eset)                    #dataとして取り扱う
colnames(data) <- pData(eset)$Gender   #列名を変更
head(data[1:2,])                       #確認してるだけです
data <- data[, order(colnames(data))]  #列名でソート
head(data[1:2,])                       #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

7. pickrellCountsYaleCQNcommon_esetの場合:

例題6をベースとして、重複したEntrez gene IDのものが存在するので、ユニークにしています。 11,482 Entrez gene IDs×36 samplesのカウントデータです。出力ファイルはhoge7.txtです。

out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(GSVAdata)                      #パッケージの読み込み
library(genefilter)                    #パッケージの読み込み

#読込(目的のデータセットをロード)
data(commonPickrellHuang)              #paramで指定したデータセットのロード
ls()                                   #利用可能なオブジェクト名を表示
eset <- pickrellCountsYaleCQNcommon_eset#esetとして取り扱う
dim(pData(eset))                       #確認してるだけです
head(pData(eset))                      #確認してるだけです
pData(eset)$Gender                     #確認してるだけです
table(pData(eset)$Gender)              #確認してるだけです

#本番(重複除去)
length(rownames(exprs(eset)))          #重複除去前の遺伝子数を確認
length(unique(rownames(exprs(eset))))  #重複除去前のユニークな遺伝子数を確認
hoge <- nsFilter(eset, var.filter=F,   #同一IDの重複除去のみを実行
               remove.dupEntrez=T)     #同一IDの重複除去のみを実行
eset <- hoge$eset                      #esetとして取り扱う
length(rownames(exprs(eset)))          #重複除去前の遺伝子数を確認

#後処理(列名を変更し、列をソート)
data <- exprs(eset)                    #dataとして取り扱う
colnames(data) <- pData(eset)$Gender   #列名を変更
head(data[1:2,])                       #確認してるだけです
data <- data[, order(colnames(data))]  #列名でソート
head(data[1:2,])                       #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

カウント情報取得 | リアルデータ | ERP000546 | recount(Collado-Torres_2017)

recountパッケージを用いて、 ERP000546(原著論文なし;ブラウザはIE以外を推奨)のカウント情報を含むRangedSummarizedExperimentクラスオブジェクトという形式の.Rdataをダウンロードしたり、 カウントデータの数値行列にした状態で保存するやり方を示します。 RangedSummarizedExperimentというのがよくわからないとは思いますが、この中にEnsemblなどのgene IDだけでなく gene symbolsや配列長情報なども含まれているので何かと便利なのです。 2018年8月7日に、recountWorkflow で推奨されているscale_counts関数実行後のカウントデータとなるように変更しました。

「ファイル」−「ディレクトリの変更」でダウンロードしたいディレクトリに移動し以下をコピペ。

1. geneレベルカウントデータ情報を得たい場合:

ERP000546という名前のフォルダが作成されます。 中にあるrse-gene.Rdataをロードして読み込むとrse-geneというオブジェクト名で取り扱えます。 ウェブサイトrecount2上でERP000546で検索し、 gene列のRSE v2をダウンロードして得られるrse_gene.Rdataと同じです。

param_ID <- "ERP000546"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataをダウンロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
	

2. geneレベルカウントデータ情報を得たい場合:

1.の発展形として、ダウンロードも行い、さらにカウントの数値行列情報(58,037 genes×47 samples)のみをタブ区切りテキストファイルで保存するやり方です。 出力ファイルはhoge2.txtです。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_ID <- "ERP000546"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(.Rdataのダウンロードとロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
load(file.path(param_ID, 'rse_gene.Rdata'))#作成されたparam_IDという名前のディレクトリ中の.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

ウェブサイトrecount2上でERP000546で検索し、 gene列のRSE v2のところからダウンロードして得られた geneレベルカウントデータ(rse_gene.Rdata; 約8MB)を読み込んで、 カウントの数値行列情報のみをタブ区切りテキストファイルで保存するやり方です。出力ファイルはhoge3.txtです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題3とベースとして、さらにサンプルのメタデータ情報ファイル(erp000546_meta_samples.txt)と、 遺伝子(features)のメタデータ情報ファイル(erp000546_meta_features.txt)も出力するやり方です。 カウントデータファイル(hoge4_counts.txt)は列名をERR...からERS...に変更しています。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge4_counts.txt"           #出力ファイル名を指定してout_f1に格納(カウントデータ)
out_f2 <- "erp000546_meta_samples.txt" #出力ファイル名を指定してout_f2に格納(samplesメタデータ)
out_f3 <- "erp000546_meta_features.txt"#出力ファイル名を指定してout_f3に格納(featuresメタデータ)

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#入力ファイルの読み込み
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
colnames(data) <- colData(rse)$sample  #列名をERR...からERS...に変更
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存(カウントデータ)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(サンプルのメタデータ情報)
tmp <- colData(rse)                    #保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(featuresのメタデータ情報)
tmp <- rowData(rse)                    #保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題4で得られたサンプルのメタデータ情報ファイル(erp000546_meta_samples.txt)中の ERR...からERS...の情報を手がかりにして、erp000546_meta_samples_added.txtの1番右の列で示すような 「これがheartで、これがkidneyで...」という対応関係をENAで1つ1つ調べたもので置き換えています。 出力ファイルはhoge5.txtです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み

#入力ファイルの読み込み(.Rdata)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(カウントデータ取得)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
uge <- assays(rse)$counts              #カウントデータ行列を取得してugeに格納
dim(uge)                               #行数と列数を表示
head(uge)                              #確認してるだけです

#後処理(同一ERS IDの列をマージ)
uge <- as.data.frame(uge)              #行列形式からデータフレーム形式に変更
data <- cbind(                         #必要な列名の情報を取得したい列の順番で結合した結果をdataに格納
  uge$ERR030885 + uge$ERR030893,       #kidney(ERS025081)
  uge$ERR030894 + uge$ERR030886,       #heart(ERS025082)
  uge$ERR030874 + uge$ERR030901,       #ovary(ERS025083)
  uge$ERR030868 + uge$ERR030869 + uge$ERR030871 + uge$ERR030863 + uge$ERR030862 + uge$ERR030870,#mixture1(ERS025084)
  uge$ERR030890 + uge$ERR030882,       #brain(ERS025085)
  uge$ERR030897 + uge$ERR030878,       #lymphnode(ERS025086)
  uge$ERR030859 + uge$ERR030867 + uge$ERR030861 + uge$ERR030866 + uge$ERR030860,#mixture2(ERS025087)
  uge$ERR030891,                       #breast(ERS025088)
  uge$ERR030892 + uge$ERR030884,       #colon(ERS025089)
  uge$ERR030872 + uge$ERR030903,       #thyroid(ERS025090)
  uge$ERR030875 + uge$ERR030900,       #white_blood_cells(ERS025091)
  uge$ERR030889 + uge$ERR030881,       #adrenal(ERS025092)
  uge$ERR030864 + uge$ERR030865 + uge$ERR030857 + uge$ERR030858 + uge$ERR030856,#mixture3(ERS025093)
  uge$ERR030902 + uge$ERR030873,       #testes(ERS025094)
  uge$ERR030877 + uge$ERR030898,       #prostate(ERS025095)
  uge$ERR030895 + uge$ERR030887,       #liver(ERS025096)
  uge$ERR030876 + uge$ERR030899,       #skeletal_muscle(ERS025097)
  uge$ERR030888 + uge$ERR030880,       #adipose(ERS025098)
  uge$ERR030896 + uge$ERR030879)       #lung(ERS025099)
  
colnames(data) <- c(                   #列名を付加
  "kidney", "heart", "ovary",          #列名を付加
  "mixture1", "brain", "lymphnode",    #列名を付加
  "mixture2", "breast", "colon",       #列名を付加
  "thyroid", "white_blood_cells",      #列名を付加
  "adrenal", "mixture3", "testes",     #列名を付加
  "prostate", "liver",                 #列名を付加
  "skeletal_muscle", "adipose", "lung")#列名を付加
rownames(data)<- rownames(uge)         #行名を付加
dim(data)                              #行数と列数を表示

#ファイルに保存(カウントデータ)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

カウント情報取得 | シミュレーションデータ | RNA-seq | について

RNA-seq発現変動解析は、一般にゲノム配列(またはトランスクリプトーム配列)にリードをマップし、 遺伝子領域、エクソン(exon)領域など 特定の領域にマップされたリード数をカウントして得られた「カウントデータ(count data; count matrix)」を入力として用います。 しかし、使い慣れないパッケージだと正しい手順で実行できたかどうか不明なため、不安を覚えることもあると思います。 1つの解決策は「これが発現変動の上位に来ていないと絶対におかしい!」というような人工的なデータを作成し、それを入力として試すのです。 TCCは、2,3, 多群間, multi-factorにも対応しています。 compcodeRは2群間のみだがrandom effectにも対応し、任意の割合のoutlierを導入することができます。 実験系ユーザで動作確認用程度であれば、様々な実験デザインに対応しているTCCで極端なデータを作成して入力として用いるので十分だと思います(2015年4月6日現在)。

Rパッケージ:

R以外:

Review、ガイドライン、パイプライン系:

カウント情報取得 | シミュレーションデータ | RNA-seq | Technical rep.(ポアソン分布)

ポアソン分布(Poisson distribution)に従うデータとは、任意の値(λ)を与えたときに、分散がλとなるような分布になるようなデータのことです。

以下では、1.ポアソン分布の感覚をつかみながら、2.Marioni et al., Genome Res., 2008の実際のデータを 経験分布(empirical distribution of read countsに相当)として与えてシミュレーションカウントデータの作成を行います。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1-1. ポアソン分布の感覚をつかむ(初級):

任意のλ(> 0)を与え、任意の数の乱数を発生させ、その分散がλに近い値になっているかどうか調べる。

param1 <- 8                            #λの値を指定
param2 <- 100                          #発生させる乱数の数を指定
out <- rpois(param2, lambda=param1)    #ポアソン分布に従う乱数を発生させた結果をoutに格納
out                                    #outの中身を表示
var(out)                               #outの分散を計算している
	

1-2. ポアソン分布の感覚をつかむ(中級):

λを1から100までにし、各λの値について発生させる乱数の数を増やし、λの値ごとの平均と分散を計算した結果をプロット

out <- NULL                            #最終的に平均と分散の計算結果を格納するためのプレースホルダを作成している
for(i in 1:100){                       #100回ループを回す
   x <- rpois(n=2000, lambda=i)        #λがiのときのポアソン分布に従う乱数を2000個発生させた結果をxに格納
   out <- rbind(out, c(mean(x), var(x)))#xの平均と分散を計算した結果をどんどんoutの下の行に追加
}                                      #ここまできたら、次のiの値でループの最初からやり直し
colnames(out) <- c("MEAN", "VARIANCE") #100行2列の行列outに列名を付与
plot(out)                              #平均と分散の関係をプロット(傾きが1の直線っぽくなっていることが分かる。つまり平均=分散ってこと)

#λを5, 60, 200の三つの要素からなるベクトルとして与えて各々1000個分の乱数を発生させる
param1 <- c(5, 60, 200)                #λの値を指定
param2 <- 10000                        #各λの値ごとの発生させる乱数の数を指定
out <- rpois(param2*length(param1), lambda=param1)#ポアソン分布に従う乱数を発生させた結果をoutに格納
hist(out)                              #ヒストグラムを描画
	

2. シミュレーションデータの作成本番(7サンプル分の行列データとして作成):

サンプルデータ2のSupplementaryTable2_changed.txtの「kidney 5サンプル vs. liver 5サンプル」のデータに相当しますが、このうちkidneyのデータを入力として与えることにします。

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 7                            #サンプル数を指定

#データファイルの読み込みとλベクトルの作成(kidneyのfive technical replicatesのデータを用いる)
tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
tmp <- rowSums(tmp[,1:5])              #kidneyの5 replicatesのデータの各行の和を計算している
RPM <- tmp*1000000/sum(tmp)            #リード数の総和を100万にしている
LAMBDA <- RPM[RPM > 0]                 #λが0だと意味がないのでそういうものを除いている

#ポアソン分布に従う乱数を生成してシミュレーションデータを得る
out <- NULL                            #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param1){                    #param1回ループを回す
    out <- cbind(out, rpois(n=length(LAMBDA), lambda=LAMBDA))#length(LAMBDA)個の乱数を発生させている(λベクトルはLAMBDAで与えている)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#得られた20921行×param1列からなる行列outがポアソン分布に従っているかを確認
obj <- rowSums(out) > 0                #条件を満たすかどうかを判定した結果をobjに格納(行の和が0より大きいkどうか)
out2 <- out[obj,]                      #objがTRUEのもののみ抽出してout2に格納
MEAN <- apply(out2, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(out2, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy")         #両対数(底は10)プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示

#行列outの中から分散が計算できたもののみ、検証用情報(LAMDA, MEAN, VARIANCE)とともにファイルに出力
tmp <- cbind(out2, LAMBDA[obj], MEAN, VARIANCE)#保存したい情報をtmpに格納(λ, 乱数の平均, 乱数の分散)
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. シミュレーションデータの作成本番(遺伝子数(行数)を任意に与える場合):

サンプルデータ2のSupplementaryTable2_changed.txtの「kidney 5サンプル vs. liver 5サンプル」のデータに相当しますが、このうちkidneyのデータを入力として与えることにします。

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 7                            #サンプル数を指定    
param_Ngene <- 5000                    #全遺伝子数を指定

#データファイルの読み込みとλベクトルの作成(kidneyのfive technical replicatesのデータを用いる)
tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
tmp <- rowSums(tmp[,1:5])              #kidneyの5 replicatesのデータの各行の和を計算している
LAMBDA <- tmp[tmp > 0]                 #λが0だと意味がないのでそういうものを除いている
LAMBDA <- sample(LAMBDA, param_Ngene, replace=TRUE)#param_Ngeneで指定した数だけサンプリングした結果をLAMBDAに格納
LAMBDA <- LAMBDA*1000000/sum(LAMBDA)   #リード数の総和を100万にしている

#ポアソン分布に従う乱数を生成してシミュレーションデータを得る
out <- NULL                            #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param1){                    #param1回ループを回す
    out <- cbind(out, rpois(n=length(LAMBDA), lambda=LAMBDA))#length(LAMBDA)個の乱数を発生させている(λベクトルはLAMBDAで与えている)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#得られたparam2行×param1列からなる行列outがポアソン分布に従っているかを確認
obj <- apply(out, 1, var) > 0          #条件を満たすかどうかを判定した結果をobjに格納(行列outの各行の分散が0より大きいかどうか)
out2 <- out[obj,]                      #objがTRUEのもののみ抽出してout2に格納
MEAN <- apply(out2, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(out2, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy")         #両対数(底は10)プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示

#行列outをファイルに出力
tmp <- cbind(LAMBDA, out)              #保存したい情報をtmpに格納(LAMBDAの数値情報, 行列out)
colnames(tmp) <- c("LAMBDA", paste("replicate",1:param1,sep=""))#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. シミュレーションデータの作成本番(G1群3サンプル vs. G2群3サンプルのデータで、全遺伝子の10%がG1群で2倍高発現というデータにしたい場合):

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.1                      #発現変動遺伝子の割合を指定    
param_FC <- 2                          #発現変動の度合い(fold-change)を指定    

#データファイルの読み込みとλベクトルの作成(kidneyのfive technical replicatesのデータを用いる)
tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
tmp <- rowSums(tmp[,1:5])              #kidneyの5 replicatesのデータの各行の和を計算している
LAMBDA <- tmp[tmp > 0]                 #λが0だと意味がないのでそういうものを除いている
LAMBDA <- sample(LAMBDA, param_Ngene, replace=TRUE)#param_Ngeneで指定した数だけサンプリングした結果をLAMBDAに格納
LAMBDA <- LAMBDA*1000000/sum(LAMBDA)   #リード数の総和を100万にしている

#発現変動遺伝子(DEG)に相当する位置情報の特定、およびG1群用にその部分のみ(param_FC)倍高発現となるようなλに変更
DEG_degree <- rep(1, param_Ngene)      #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree[1:(param_Ngene*param_PDEG)] <- param_FC#param_Ngene個の遺伝子ベクトル中最初の(param_Ngene*param_PDEG)個の発現変動の度合いをparam_FCとしている
DEG_posi <- DEG_degree == param_FC     #DEGの位置情報を取得している
LAMBDA_A <- LAMBDA*DEG_degree          #G1群用のλ(つまりLAMBDA*DEG_degree)をLAMBDA_Aに格納
LAMBDA_B <- LAMBDA                     #G2群用のλ(つまりLAMBDA)をLAMBDA_Bに格納

#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(G1群用)
outA <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G1){                  #param_G1回ループを回す(つまりG1群のサンプル数分だけループを回している)
    outA <- cbind(outA, rpois(n=length(LAMBDA_A), lambda=LAMBDA_A))#length(LAMBDA_A)個の乱数を発生させている(λベクトルはLAMBDA_Aで与えている)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(G2群用)
outB <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G2){                  #param_G2回ループを回す(つまりG2群のサンプル数分だけループを回している)
    outB <- cbind(outB, rpois(n=length(LAMBDA_B), lambda=LAMBDA_B))#length(LAMBDA_B)個の乱数を発生させている(λベクトルはLAMBDA_Bで与えている)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#ファイルに保存
tmp <- cbind(outA, outB)               #保存したい情報をtmpに格納(G1群とG2群のデータ)
colnames(tmp) <- c(paste("G1_rep",1:param_G1,sep=""),paste("G2_rep",1:param_G2,sep=""))#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#M-A plotを描画して確認
data <- tmp                            #シミュレーションデータをdataとして取り扱う
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- mean_G2 - mean_G1            #M-A plotの縦軸に相当する情報(Minus)を計算した結果をy_axisに格納
param_xrange <- c(0.5, 10000)          #横軸の描画範囲を指定したものをparam_xrangeに格納
plot(x_axis, y_axis, pch=20, cex=0.1, xlim=log2(param_xrange), xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)")#M-A plotを描画
points(x_axis[DEG_posi], y_axis[DEG_posi], col="magenta", pch=20, cex=0.1)#DEGに相当するもの(つまりDEG_posiがTRUEの部分)の色をマゼンタにしている
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", c("DEG", "non-DEG"), col=c("magenta", "black"), pch=19)#legendを表示
	

5. シミュレーションデータの作成本番(G1群3サンプル vs. G2群3サンプルのデータで、全遺伝子の10%がDEG。DEGのうちの80%がG1群で高発現、残りの20%がG2群で高発現というデータにしたい場合):

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.1                      #発現変動遺伝子の割合(PDEG)を指定    
param_FC <- 2                          #発現変動の度合い(fold-change)を指定  
param_PG1 <- 0.8                       #DEGのうちG1群で高発現なものの割合(PG1)を指定   

#データファイルの読み込みとλベクトルの作成(kidneyのfive technical replicatesのデータを用いる)
tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
tmp <- rowSums(tmp[,1:5])              #kidneyの5 replicatesのデータの各行の和を計算している
LAMBDA <- tmp[tmp > 0]                 #λが0だと意味がないのでそういうものを除いている
LAMBDA <- sample(LAMBDA, param_Ngene, replace=TRUE)#param_Ngeneで指定した数だけサンプリングした結果をLAMBDAに格納
LAMBDA <- LAMBDA*1000000/sum(LAMBDA)   #リード数の総和を100万にしている

#発現変動遺伝子(DEG)に相当する位置情報の特定、およびその部分のみ(param_FC)倍高発現となるようなλに変更
DEG_degree_A <- rep(1, param_Ngene)    #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree_A[1:(param_Ngene*param_PDEG*param_PG1)] <- param_FC#param_Ngene個の遺伝子ベクトル中最初の(param_Ngene*param_PDEG*param_PG1)個の発現変動の度合いをparam_FCとしている
LAMBDA_A <- LAMBDA*DEG_degree_A        #G1群用のλ(つまりLAMBDA*DEG_degree_A)をLAMBDA_Aに格納
DEG_degree_B <- rep(1, param_Ngene)    #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree_B[(param_Ngene*param_PDEG*param_PG1+1):param_Ngene*param_PDEG)] <- param_FC#param_Ngene個の遺伝子ベクトル中「(param_Ngene*param_PDEG*param_PG1+1):(param_Ngene*param4)」に相当する位置のの発現変動の度合いをparam_FCとしている
LAMBDA_B <- LAMBDA*DEG_degree_B        #G2群用のλ(つまりLAMBDA*DEG_degree_B)をLAMBDA_Bに格納
DEG_posi <- (DEG_degree_A*DEG_degree_B) > 1#DEGの位置情報を取得している

#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(G1群用)
outA <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G1){                    #param_G1回ループを回す(つまりG1群のサンプル数分だけループを回している)
    outA <- cbind(outA, rpois(n=length(LAMBDA_A), lambda=LAMBDA_A))#length(LAMBDA_A)個の乱数を発生させている(λベクトルはLAMBDA_Aで与えている)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(G2群用)
outB <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G2){                    #param_G2回ループを回す(つまりG2群のサンプル数分だけループを回している)
    outB <- cbind(outB, rpois(n=length(LAMBDA_B), lambda=LAMBDA_B))#length(LAMBDA_B)個の乱数を発生させている(λベクトルはLAMBDA_Bで与えている)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#ファイルに保存
tmp <- cbind(outA, outB)               #保存したい情報をtmpに格納(G1群とG2群のデータ)
colnames(tmp) <- c(paste("G1_rep",1:param_G1,sep=""),paste("G2_rep",1:param_G2,sep=""))#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#M-A plotを描画して確認
data <- tmp                            #シミュレーションデータをdataとして取り扱う
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- mean_G2 - mean_G1            #M-A plotの縦軸に相当する情報(Minus)を計算した結果をy_axisに格納
param_xrange <- c(0.5, 10000)          #横軸の描画範囲を指定したものをparam_xrangeに格納
plot(x_axis, y_axis, pch=20, cex=0.1, xlim=log2(param_xrange), xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)")#M-A plotを描画
points(x_axis[DEG_posi], y_axis[DEG_posi], col="magenta", pch=20, cex=0.1)#DEGに相当するもの(つまりDEG_posiがTRUEの部分)の色をマゼンタにしている
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", c("DEG", "non-DEG"), col=c("magenta", "black"), pch=19)#legendを表示
	

6. シミュレーションデータの作成本番:

Robinson and Oshlack, 2010のFig. 2のデータとほとんど同じものを作りたい場合。違いはG1群およびG2群でuniqueに発現しているものを入れてないだけ

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_Ngene <- 20000                   #全遺伝子数を指定
param_PDEG <- 0.1                      #発現変動遺伝子の割合(PDEG)を指定    
param_FC <- 2                          #発現変動の度合い(fold-change)を指定  
param_PG1 <- 0.8                       #DEGのうちG1群で高発現なものの割合(PG1)を指定   

#データファイルの読み込みとλベクトルの作成(kidneyのfive technical replicatesのデータを用いる)
tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
tmp <- rowSums(tmp[,1:5])              #kidneyの5 replicatesのデータの各行の和を計算している
LAMBDA <- tmp[tmp > 0]                 #λが0だと意味がないのでそういうものを除いている
LAMBDA <- sample(LAMBDA, param_Ngene, replace=TRUE)#param_Ngeneで指定した数だけサンプリングした結果をLAMBDAに格納
LAMBDA <- LAMBDA*1000000/sum(LAMBDA)   #リード数の総和を100万にしている

#発現変動遺伝子(DEG)に相当する位置情報の特定、およびその部分のみ(param_FC)倍高発現となるようなλに変更
DEG_degree_A <- rep(1, param_Ngene)    #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree_A[1:(param_Ngene*param_PDEG*param_PG1)] <- param_FC#param_Ngene個の遺伝子ベクトル中最初の(param3*param_PDEG*param_PG1)個の発現変動の度合いをparam_FCとしている
LAMBDA_A <- LAMBDA*DEG_degree_A        #G1群用のλ(つまりLAMBDA*DEG_degree_A)をLAMBDA_Aに格納
DEG_degree_B <- rep(1, param_Ngene)    #DEGの発現変動の度合い情報を格納するプレースホルダを作成している
DEG_degree_B[(param_Ngene*param_PDEG*param_PG1+1):(param_Ngene*param_PDEG)] <- param_FC#param_Ngene個の遺伝子ベクトル中「(param_Ngene*param_PDEG*param_PG1+1):(param_Ngene*param_PDEG)」に相当する位置のの発現変動の度合いをparam_FCとしている
LAMBDA_B <- LAMBDA*DEG_degree_B        #G2群用のλ(つまりLAMBDA*DEG_degree_B)をLAMBDA_Bに格納
DEG_posi <- (DEG_degree_A*DEG_degree_B) > 1#DEGの位置情報を取得している

#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(G1群用)
outA <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G1){                    #param_G1回ループを回す(つまりG1群のサンプル数分だけループを回している)
    outA <- cbind(outA, rpois(n=length(LAMBDA_A), lambda=LAMBDA_A))#length(LAMBDA_A)個の乱数を発生させている(λベクトルはLAMBDA_Aで与えている)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#ポアソン分布に従う乱数を生成してシミュレーションデータを得る(G2群用)
outB <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G2){                    #param_G2回ループを回す(つまりG2群のサンプル数分だけループを回している)
    outB <- cbind(outB, rpois(n=length(LAMBDA_B), lambda=LAMBDA_B))#length(LAMBDA_B)個の乱数を発生させている(λベクトルはLAMBDA_Bで与えている)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#ファイルに保存
tmp <- cbind(outA, outB)               #保存したい情報をtmpに格納(G1群とG2群のデータ)
colnames(tmp) <- c(paste("G1_rep",1:param_G1,sep=""),paste("G2_rep",1:param_G2,sep=""))#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#M-A plotを描画して確認
data <- tmp                            #シミュレーションデータをdataとして取り扱う
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- mean_G2 - mean_G1            #M-A plotの縦軸に相当する情報(Minus)を計算した結果をy_axisに格納
param_xrange <- c(0.5, 10000)          #横軸の描画範囲を指定したものをparam_xrangeに格納
plot(x_axis, y_axis, pch=20, cex=0.1, xlim=log2(param_xrange), xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)")#M-A plotを描画
points(x_axis[DEG_posi], y_axis[DEG_posi], col="magenta", pch=20, cex=0.1)#DEGに相当するもの(つまりDEG_posiがTRUEの部分)の色をマゼンタにしている
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", c("DEG", "non-DEG"), col=c("magenta", "black"), pch=19)#legendを表示
	

カウント情報取得 | シミュレーションデータ | RNA-seq | Biological rep. | 基礎

誰が最初か今のところ把握していませんがBiological replicatesのカウントデータが負の二項分布(negative binomial distribution; NB分布) に従うというのがこの業界のコンセンサスです。つまり、ポアソン分布よりももっとばらつき(dispersion)が大きいということを言っています。 ここではまず、NB modelの一般式としてVARIANCE = MEAN + φ×(MEAN)^2において、MEAN=10 and φ=0.1 のNBモデルに従う乱数を発生させて発現変動解析との関連のイメージをつかみます。 このときのVARIANCEの期待値はVARIANCE = 10 + 0.1×(10)^2 = 20となります。このほかにも様々な例を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. MEAN=10 and φ=0.1の場合(基本形):

(MEAN-VARIANCE plotをファイルpngファイルに保存しています)

out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_MEAN <- 10                       #平均カウント数(MEAN)を指定
param_dispersion <- 0.1                #dispersion parameterの値を指定
param_Ngene <- 1000                    #全遺伝子数を指定
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#NB分布に従う乱数を発生
rnbinom(n=100, mu=param_MEAN, size=1/param_dispersion)#100個の乱数を発生させている
hoge <- rnbinom(n=10000, mu=param_MEAN, size=1/param_dispersion)#10000個の乱数を発生させた結果をhogeに格納
var(hoge)                              #分散を計算した結果を表示(期待値通り)

#NB分布に従うシミュレーションデータを作成
hoge1 <-param_Ngene*(param_G1 + param_G2)#必要な乱数の数を計算している(行数×列数)
hoge2 <- rnbinom(n=hoge1, mu=param_MEAN, size=1/param_dispersion)#指定した数の乱数を発生させた結果をhoge2に格納
data <- matrix(hoge2, nrow=param_Ngene)#(param_Ngene)行からなる行列データに変換した結果をdataに格納
head(data)                             #確認してるだけです
dim(data)                              #行数と列数を表示

#MEAN-VARIANCE plot(ファイルに保存)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
MEAN <- apply(data, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(data, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="black")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)

#指定した平均カウント数における最大の発現変動遺伝子(DEG)を作成してプロット
DEG <- c(rep(0, param_G1), rep(param_MEAN*2, param_G2))#可能な最大のDEGの発現パターンを自作した結果をDEGに格納(G2で高発現にしている)
DEG                                    #発現パターンを表示
mean(DEG)                              #DEGの平均カウント数(MEAN)を表示
var(DEG)                               #DEGの分散(VARIANCE)を表示
points(mean(DEG), var(DEG), col="red", cex=1.0, pch=20)#DEGの点を指定した色で描画
legend("topright", c("DEG", "non-DEG"), col=c("red", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

2. G1群2サンプル vs. G2群2サンプルのデータで、全遺伝子の15%がDEG。DEGのうちの20%がG1群で4倍高発現、残りの80%がG2群で4倍高発現というデータにしたい場合:

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 2                          #G2群のサンプル数を指定
param_Ngene <- 20000                   #全遺伝子数を指定
param_PDEG <- 0.15                     #発現変動遺伝子の割合(PDEG)を指定
param_FC <- 4                          #発現変動の度合い(fold-change)を指定
param_PG1 <- 0.2                       #DEGのうちG1群で高発現なものの割合(PG1)を指定

#必要なパッケージをロード
library(NBPSeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data(arab)                             #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab                           #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
data.cl <- c(rep(1, 3), rep(2, 3))     #G1群を1、G2群を2としたベクトルdata.clを作成(ここのラベル情報は経験分布作成用のデータが3群 vs. 3群のデータだと分かっているため)

#RPM正規化して群ごとのMEANとφの経験分布情報を取得
RPM <- sweep(data, 2, 1000000/colSums(data), "*")#RPM正規化した結果をRPMに格納
RPM_A <- RPM[,data.cl == 1]            #G1群のデータのみ抽出してRPM_Aに格納
RPM_B <- RPM[,data.cl == 2]            #G2群のデータのみ抽出してRPM_Bに格納
RPM_A <- RPM_A[apply(RPM_A, 1, var) > 0,]#分散が0より大きいもののみ抽出
RPM_B <- RPM_B[apply(RPM_B, 1, var) > 0,]#分散が0より大きいもののみ抽出
MEAN <- c(apply(RPM_A, 1, mean), apply(RPM_B, 1, mean))#RPM補正後のread countsの遺伝子ごとの平均値を計算した結果をMEANに格納
VARIANCE <- c(apply(RPM_A, 1, var), apply(RPM_B, 1, var))#RPM補正後のread countsの遺伝子ごとの分散を計算した結果をVARIANCEに格納
DISPERSION <- (VARIANCE - MEAN)/(MEAN*MEAN)#RPM補正後のread countsの遺伝子ごとのφを計算した結果をDISPERSIONに格納
mean_disp_tmp <- cbind(MEAN, DISPERSION)#MEANとDISPERSIONを列方向に結合した結果をmean_disp_tmpに格納
mean_disp_tmp <- mean_disp_tmp[mean_disp_tmp[,2] > 0,]#mean_disp_tmp行列中の二列目(DISPERSION部分)が0より大きいもののみ抽出(理由は後に使うrnbinom関数が負のdispersion parameterの値を許容しないからです)
hoge <- sample(1:nrow(mean_disp_tmp), param_Ngene, replace=TRUE)#最終的にparam_Ngeneで指定した行数分のデータにしたいので、mean_disp_tmp行列の行数から(復元抽出で)ランダムサンプリングするための数値ベクトル情報をhogeに格納
mean_disp <- mean_disp_tmp[hoge,]      #mean_disp_tmp行列からhogeで指定した行を抽出した結果をmean_dispに格納

#指定したDEGの条件にすべく、meanに相当するところの値を群ごとに変更する。また、このときにDEGの位置情報も取得している
mu <- mean_disp[,1]                    #経験分布の平均値に相当する情報をmuに格納(単に文字数を減らして見やすくしたいだけです)
DEG_degree_A <- rep(1, param_Ngene)         #(param_Ngene)で指定した遺伝子数分だけ倍率変化の初期値を1倍としたものをDEG_degree_Aに格納
DEG_degree_A[1:(param_Ngene*param_PDEG*param_PG1)] <- param_FC#DEG_degree_Aのベクトルに対して、最初の行から(param_Ngene*param_PDEG*param_PG1)で表現されるG1群で高発現にする遺伝子数分に相当する位置を(param_FC)倍するという情報に置換する
mu_A <- mu*DEG_degree_A                #G1群で高発現とする位置のmuの値を(param_FC)倍した結果をmu_Aに格納
DEG_degree_B <- rep(1, param_Ngene)         #(param_Ngene)で指定した遺伝子数分だけ倍率変化の初期値を1倍としたものをDEG_degree_Bに格納
DEG_degree_B[(param_Ngene*param_PDEG*param_PG1+1):(param_Ngene*param_PDEG)] <- param_FC#DEG_degree_Bのベクトルに対して、G1群で高発現とした位置情報の次の行(param_Ngene*param_PDEG*param_PG1+1)からG2群で高発現にする遺伝子数分に相当する位置を(param_FC)倍するという情報に置換する
mu_B <- mu*DEG_degree_B                #G2群で高発現とする位置のmuの値を(param_FC)倍した結果をmu_Bに格納
DEG_posi_org <- (DEG_degree_A*DEG_degree_B) > 1#DEGに相当する位置をTRUE、それ以外をFALSEとしたベクトルをDEG_posi_orgに格納
nonDEG_posi_org <- (DEG_degree_A*DEG_degree_B) == 1#non-DEGに相当する位置をTRUE、それ以外をFALSEとしたベクトルをnon-DEG_posi_orgに格納

#負の二項分布に従う乱数を生成して群ごとのシミュレーションデータを得る
outA <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G1){                   #(param_G1)回ループを回す
    outA <- cbind(outA, rnbinom(n=length(mu_A), mu=mu_A, size=1/mean_disp[,2]))#length(mu_A)個の乱数を発生させている(rnbinom関数はVARIANCE=mu + mu^2/sizeとして定義しているので左記のような指定方法でよい)
}                                                                #ここまできたら、次のiの値でループの最初からやり直し
outB <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G2){                   #(param_G2)回ループを回す
    outB <- cbind(outB, rnbinom(n=length(mu_B), mu=mu_B, size=1/mean_disp[,2]))#length(mu_B)個の乱数を発生させている(rnbinom関数はVARIANCE=mu + mu^2/sizeとして定義しているので左記のような指定方法でよい)
}                                                                #ここまできたら、次のiの値でループの最初からやり直し

#(param_Ngene)行(param_G1+param_G2)列のカウント情報からなる行列outから全ての列でゼロカウントの行を削除した行列RAWを作成し、ファイルに出力
out <- cbind(outA, outB)               #G1群のデータとG2群のデータを列方向で結合した結果をoutに格納
obj <- rowSums(out) > 0                #条件を満たすかどうかを判定した結果をobjに格納(行の和が0より大きいかどうか)
RAW <- out[obj,]                       #行列outの中からobjベクトルの値がTRUEとなる行のみを抽出してRAWに格納
DEG_posi <- DEG_posi_org[obj]          #DEG_posi_orgベクトルに対して、objベクトルの値がTRUEとなる要素のみを抽出してDEG_posiに格納
nonDEG_posi <- nonDEG_posi_org[obj]    #nonDEG_posi_orgベクトルに対して、objベクトルの値がTRUEとなる要素のみを抽出してnonDEG_posiに格納
tmp <- cbind(RAW, DEG_posi)            #保存したい情報をtmpに格納(行列RAWとDEGかどうかのフラグ情報)
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#M-A plotを描画して確認
data <- RAW                            #シミュレーションデータRAWをdataとして取り扱う
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- mean_G2 - mean_G1            #M-A plotの縦軸に相当する情報(Minus)を計算した結果をy_axisに格納
#param_xrange <- c(0.5, 10000)         #横軸の描画範囲を指定したものをparam_xrangeに格納
#plot(x_axis, y_axis, pch=20, cex=0.1, xlim=log2(param_xrange), xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)")#M-A plotを描画
plot(x_axis, y_axis, pch=20, cex=0.1, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)")#M-A plotを描画
points(x_axis[DEG_posi], y_axis[DEG_posi], col="magenta", pch=20, cex=0.1)#DEGに相当するもの(つまりDEG_posiがTRUEの部分)の色をマゼンタにしている
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", c("DEG", "non-DEG"), col=c("magenta", "black"), pch=19)#legendを表示
	

3. G1群1サンプル vs. G2群1サンプルのデータで、全遺伝子の15%がDEG。DEGのうちの20%がG1群で4倍高発現、残りの80%がG2群で4倍高発現というデータにしたい場合:

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_Ngene <- 20000                   #全遺伝子数を指定
param_PDEG <- 0.15                     #発現変動遺伝子の割合(PDEG)を指定
param_FC <- 4                          #発現変動の度合い(fold-change)を指定
param_PG1 <- 0.2                       #DEGのうちG1群で高発現なものの割合(PG1)を指定

#必要なパッケージをロード
library(NBPSeq)                        #パッケージの読み込み

#発現データの読み込みとラベル情報の作成
data(arab)                             #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab                           #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
data.cl <- c(rep(1, 3), rep(2, 3))     #G1群を1、G2群を2としたベクトルdata.clを作成

#RPM正規化して群ごとのMEANとφの経験分布情報を取得
RPM <- sweep(data, 2, 1000000/colSums(data), "*")#RPM正規化した結果をRPMに格納
RPM_A <- RPM[,data.cl == 1]            #G1群のデータのみ抽出してRPM_Aに格納
RPM_B <- RPM[,data.cl == 2]            #G2群のデータのみ抽出してRPM_Bに格納
RPM_A <- RPM_A[apply(RPM_A,1,var) > 0,]#分散が0より大きいもののみ抽出
RPM_B <- RPM_B[apply(RPM_B,1,var) > 0,]#分散が0より大きいもののみ抽出
MEAN <- c(apply(RPM_A, 1, mean), apply(RPM_B, 1, mean))#RPM補正後のread countsの遺伝子ごとの平均値を計算した結果をMEANに格納
VARIANCE <- c(apply(RPM_A, 1, var), apply(RPM_B, 1, var))#RPM補正後のread countsの遺伝子ごとの分散を計算した結果をVARIANCEに格納
DISPERSION <- (VARIANCE - MEAN)/(MEAN*MEAN)#RPM補正後のread countsの遺伝子ごとのφを計算した結果をDISPERSIONに格納
mean_disp_tmp <- cbind(MEAN, DISPERSION)#MEANとDISPERSIONを列方向に結合した結果をmean_disp_tmpに格納
mean_disp_tmp <- mean_disp_tmp[mean_disp_tmp[,2] > 0,]#mean_disp_tmp行列中の二列目(DISPERSION部分)が0より大きいもののみ抽出(理由は後に使うrnbinom関数が負のdispersion parameterの値を許容しないからです)
hoge <- sample(1:nrow(mean_disp_tmp), param_Ngene, replace=TRUE)#最終的にparam_Ngeneで指定した行数分のデータにしたいので、mean_disp_tmp行列の行数から(復元抽出で)ランダムサンプリングするための数値ベクトル情報をhogeに格納
mean_disp <- mean_disp_tmp[hoge,]      #mean_disp_tmp行列からhogeで指定した行を抽出した結果をmean_dispに格納

#指定したDEGの条件にすべく、meanに相当するところの値を群ごとに変更する。また、このときにDEGの位置情報も取得している
mu <- mean_disp[,1]                    #経験分布の平均値に相当する情報をmuに格納(単に文字数を減らして見やすくしたいだけです)
DEG_degree_A <- rep(1, param_Ngene)    #(param_Ngene)で指定した遺伝子数分だけ倍率変化の初期値を1倍としたものをDEG_degree_Aに格納
DEG_degree_A[1:(param_Ngene*param_PDEG*param_PG1)] <- param_FC#DEG_degree_Aのベクトルに対して、最初の行から(param_Ngene*param_PDEG*param_PG1)で表現されるG1群で高発現にする遺伝子数分に相当する位置を(param_FC)倍するという情報に置換する
mu_A <- mu*DEG_degree_A                #G1群で高発現とする位置のmuの値を(param_FC)倍した結果をmu_Aに格納
DEG_degree_B <- rep(1, param_Ngene)    #(param_Ngene)で指定した遺伝子数分だけ倍率変化の初期値を1倍としたものをDEG_degree_Bに格納
DEG_degree_B[(param_Ngene*param_PDEG*param_PG1+1):(param_Ngene*param_PDEG)] <- param_FC#DEG_degree_Bのベクトルに対して、G1群で高発現とした位置情報の次の行(param_Ngene*param_PDEG*param_PG1+1)からG2群で高発現にする遺伝子数分に相当する位置を(param_FC)倍するという情報に置換する
mu_B <- mu*DEG_degree_B                #G2群で高発現とする位置のmuの値を(param_FC)倍した結果をmu_Bに格納
DEG_posi_org <- (DEG_degree_A*DEG_degree_B) > 1#DEGに相当する位置をTRUE、それ以外をFALSEとしたベクトルをDEG_posi_orgに格納
nonDEG_posi_org <- (DEG_degree_A*DEG_degree_B) == 1#non-DEGに相当する位置をTRUE、それ以外をFALSEとしたベクトルをDEG_posi_orgに格納

#負の二項分布に従う乱数を生成して群ごとのシミュレーションデータを得る
outA <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G1){                   #(param_G1)回ループを回す
    outA <- cbind(outA, rnbinom(n=length(mu_A), mu=mu_A, size=1/mean_disp[,2]))#length(mu_A)個の乱数を発生させている(rnbinom関数はVARIANCE=mu + mu^2/sizeとして定義しているので左記のような指定方法でよい)
}                                      #ここまできたら、次のiの値でループの最初からやり直し
outB <- NULL                           #最終的に結果を格納するためのプレースホルダを作成している
for(i in 1:param_G2){                   #(param_G2)回ループを回す
    outB <- cbind(outB, rnbinom(n=length(mu_B), mu=mu_B, size=1/mean_disp[,2]))#length(mu_B)個の乱数を発生させている(rnbinom関数はVARIANCE=mu + mu^2/sizeとして定義しているので左記のような指定方法でよい)
}                                      #ここまできたら、次のiの値でループの最初からやり直し

#(param_Ngene)行(param_G1+param_G2)列のカウント情報からなる行列outから全ての列でゼロカウントの行を削除した行列RAWを作成し、ファイルに出力
out <- cbind(outA, outB)               #G1群のデータとG2群のデータを列方向で結合した結果をoutに格納
obj <- rowSums(out) > 0                #条件を満たすかどうかを判定した結果をobjに格納(行の和が0より大きいかどうか)
RAW <- out[obj,]                       #行列outの中からobjベクトルの値がTRUEとなる行のみを抽出してRAWに格納
DEG_posi <- DEG_posi_org[obj]          #DEG_posi_orgベクトルに対して、objベクトルの値がTRUEとなる要素のみを抽出してDEG_posiに格納
nonDEG_posi <- nonDEG_posi_org[obj]    #nonDEG_posi_orgベクトルに対して、objベクトルの値がTRUEとなる要素のみを抽出してnonDEG_posiに格納
tmp <- cbind(RAW, DEG_posi)            #保存したい情報をtmpに格納(行列RAWとDEGかどうかのフラグ情報)
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#M-A plotを描画して確認
data <- RAW                            #シミュレーションデータRAWをdataとして取り扱う
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #M-A plotの横軸に相当する情報(Average)を計算した結果をx_axisに格納
y_axis <- mean_G2 - mean_G1            #M-A plotの縦軸に相当する情報(Minus)を計算した結果をy_axisに格納
#param_xrange <- c(0.5, 10000)         #横軸の描画範囲を指定したものをparam_xrangeに格納
#plot(x_axis, y_axis, pch=20, cex=0.1, xlim=log2(param_xrange), xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)")#M-A plotを描画
plot(x_axis, y_axis, pch=20, cex=0.1, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)")#M-A plotを描画
points(x_axis[DEG_posi], y_axis[DEG_posi], col="magenta", pch=20, cex=0.1)#DEGに相当するもの(つまりDEG_posiがTRUEの部分)の色をマゼンタにしている
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", c("DEG", "non-DEG"), col=c("magenta", "black"), pch=19)#legendを表示
	

カウント情報取得 | シミュレーションデータ | RNA-seq | Biological rep. | 2群間 | 基礎 | LPEseq(Gim_2016)

LPEseqパッケージ中のgenerateData関数を用いて 2群間比較用のシミュレーションカウントデータを作成するやり方を示します。 群ごとの反復数は同じですので、例えば計6 samplesの場合はG1群3サンプル、G2群3サンプルになります。 従って、反復数はparam_Nrepで与えています。 発現変動の度合いに相当するパラメータは、(TCCではfold-changeで与えましたが) LPEseqはカウント情報の差(count value difference)としてparam_effオプションで与えています。 その他、バラツキの度合いを表すdispersionパラメータは、param_dispオプションで与えています。 param_dispに0を与えるとPoisson分布と同じになり、大きな値を与えるほど群間のバラツキが大きくなります。 パッケージのインストールがまだの場合は、最初に例題0のやり方に従ってインストールをしておく必要があります。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

0. パッケージのインストール:

最新版のファイル(2018年7月現在はLPEseq_v0.99.1.tar.gz)を 作業ディレクトリ上に予めダウンロードしておいてから、下記をコピペしてください。

source("http://statgen.snu.ac.kr/software/LPEseq/LPEseq.R")
install.packages("LPEseq_v0.99.1.tar.gz", repos=NULL, type="source")
    

1. 20,000 genes×6 samplesのシミュレーションデータを作成する場合:

Gim et al., 2016Table 2の、 Effect size = 1000, Dispersion = 0.25, # of DEGs = 2000の シミュレーション条件に相当します。デフォルトではDEGの位置はランダムなので、param_NDEGで指定した最初の 2000行分がDEGになるようにソートさせています。 NB_parameter.txtという 経験分布(empirical distribution)情報ファイルを内部的に読み込んでいます。

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_Nrep <- 3                        #反復数を指定
param_Ngene <- 20000                   #全遺伝子数を指定
param_eff <- 1000                      #発現変動の度合い(count value difference)を指定
param_disp <- 0.25                     #dispersionパラメータ(nbinom関数の1/sizeに相当)を指定
param_NDEG <- 2000                     #発現変動遺伝子数を指定

#必要なパッケージをロード
library(LPEseq)                        #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
hoge <- generateData(n.rep=param_Nrep, #シミュレーションデータの作成
             n.gene=param_Ngene,       #シミュレーションデータの作成
             n.deg=param_NDEG,         #シミュレーションデータの作成
             eff=param_eff,            #シミュレーションデータの作成
             disp=param_disp)          #シミュレーションデータの作成

#後処理(DEG情報列の除去とソート)
hoge <- hoge[order(hoge[,ncol(hoge)], decreasing=T), ]#DEGが最初の方の行になるようソート
DEG_posi <- hoge[, ncol(hoge)]         #DEGの位置情報を取得している(一番右側の列なので"ncol(hoge)"としている)
data <- hoge[, -ncol(hoge)]            #DEGの位置情報を除去した結果をdataに格納

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. 20,000 genes×2 samplesのシミュレーションデータを作成する場合:

例題1と基本的に同じで、param_Nrepで指定する反復数の部分のみが異なります。 シミュレーション条件がGim et al., 2016Table 1の、 Effect size = 1000, Dispersion = 0.25, # of DEGs = 2000に相当します。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_Nrep <- 1                        #反復数を指定
param_Ngene <- 20000                   #全遺伝子数を指定
param_eff <- 1000                      #発現変動の度合い(count value difference)を指定
param_disp <- 0.25                     #dispersionパラメータ(nbinom関数の1/sizeに相当)を指定
param_NDEG <- 2000                     #発現変動遺伝子数を指定

#必要なパッケージをロード
library(LPEseq)                        #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
hoge <- generateData(n.rep=param_Nrep, #シミュレーションデータの作成
             n.gene=param_Ngene,       #シミュレーションデータの作成
             n.deg=param_NDEG,         #シミュレーションデータの作成
             eff=param_eff,            #シミュレーションデータの作成
             disp=param_disp)          #シミュレーションデータの作成

#後処理(DEG情報列の除去とソート)
hoge <- hoge[order(hoge[,ncol(hoge)], decreasing=T), ]#DEGが最初の方の行になるようソート
DEG_posi <- hoge[, ncol(hoge)]         #DEGの位置情報を取得している(一番右側の列なので"ncol(hoge)"としている)
data <- hoge[, -ncol(hoge)]            #DEGの位置情報を除去した結果をdataに格納

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. 20,000 genes×2 samplesのシミュレーションデータを作成する場合:

例題2と同じ反復なしデータですが、シミュレーション条件が Gim et al., 2016Table 1の、 Effect size = 500, Dispersion = 0.01, # of DEGs = 1000に相当します。

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_Nrep <- 1                        #反復数を指定
param_Ngene <- 20000                   #全遺伝子数を指定
param_eff <- 500                       #発現変動の度合い(count value difference)を指定
param_disp <- 0.01                     #dispersionパラメータ(nbinom関数の1/sizeに相当)を指定
param_NDEG <- 1000                     #発現変動遺伝子数を指定

#必要なパッケージをロード
library(LPEseq)                        #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
hoge <- generateData(n.rep=param_Nrep, #シミュレーションデータの作成
             n.gene=param_Ngene,       #シミュレーションデータの作成
             n.deg=param_NDEG,         #シミュレーションデータの作成
             eff=param_eff,            #シミュレーションデータの作成
             disp=param_disp)          #シミュレーションデータの作成

#後処理(DEG情報列の除去とソート)
hoge <- hoge[order(hoge[,ncol(hoge)], decreasing=T), ]#DEGが最初の方の行になるようソート
DEG_posi <- hoge[, ncol(hoge)]         #DEGの位置情報を取得している(一番右側の列なので"ncol(hoge)"としている)
data <- hoge[, -ncol(hoge)]            #DEGの位置情報を除去した結果をdataに格納

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. 20,000 genes×6 samplesのシミュレーションデータを作成する場合:

例題3と同じシミュレーション条件で、例題1と同じ反復ありデータです。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_Nrep <- 3                        #反復数を指定
param_Ngene <- 20000                   #全遺伝子数を指定
param_eff <- 500                       #発現変動の度合い(count value difference)を指定
param_disp <- 0.01                     #dispersionパラメータ(nbinom関数の1/sizeに相当)を指定
param_NDEG <- 1000                     #発現変動遺伝子数を指定

#必要なパッケージをロード
library(LPEseq)                        #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
hoge <- generateData(n.rep=param_Nrep, #シミュレーションデータの作成
             n.gene=param_Ngene,       #シミュレーションデータの作成
             n.deg=param_NDEG,         #シミュレーションデータの作成
             eff=param_eff,            #シミュレーションデータの作成
             disp=param_disp)          #シミュレーションデータの作成

#後処理(DEG情報列の除去とソート)
hoge <- hoge[order(hoge[,ncol(hoge)], decreasing=T), ]#DEGが最初の方の行になるようソート
DEG_posi <- hoge[, ncol(hoge)]         #DEGの位置情報を取得している(一番右側の列なので"ncol(hoge)"としている)
data <- hoge[, -ncol(hoge)]            #DEGの位置情報を除去した結果をdataに格納

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

カウント情報取得 | シミュレーションデータ | RNA-seq | Biological rep. | 2群間 | 基礎 | TCC(Sun_2013)

TCCパッケージ中のsimulateReadCounts関数を用いて 2群間比較用のシミュレーションカウントデータを作成するやり方を示します。 特に、以下に示すようなTbT論文(Kadota et al., Algorithms Mol. Biol., 2012) の図1とほぼ同じシミュレーション条件に固定して、TCCパッケージの使い方に慣れることに重点を置きます: G1群 vs. G2群で各群の反復数を3に固定、 、つまり「G1_rep1, G1_rep2, G1_rep3, G2_rep1, G2_rep2, G2_rep3」の計6サンプル。 全10,000遺伝子、最初の20%分(gene_1〜gene_2000)が発現変動遺伝子(DEG)、 全2,000 DEGsの内訳:最初の90%分(gene_1〜gene_1800)がG1群で4倍高発現、残りの10%分(gene_1801〜gene_2000)がG2群で4倍高発現。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13と同じ10,000 genes×6 samplesのシミュレーションデータを作成する場合:

基本形。

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.2                      #発現変動遺伝子の割合を指定    
param_FC <- 4                          #発現変動の度合い(fold-change)を指定    
param_PG1 <- 0.9                       #DEGのうちG1群で高発現なものの割合(PG1)を指定   

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
             PDEG=param_PDEG,          #シミュレーションデータの作成
             DEG.assign=c(param_PG1, 1-param_PG1),#シミュレーションデータの作成
             DEG.foldchange=c(param_FC, param_FC),#シミュレーションデータの作成
             replicates=c(param_G1, param_G2))#シミュレーションデータの作成

#ファイルに保存
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13と同じ10,000 genes×6 samplesのシミュレーションデータを作成する場合:

1. と基本的に同じですが、set.seed(1000)の行頭に#を入れてコメントアウトしているので、得られる数値自体は毎回変わるようになります。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.2                      #発現変動遺伝子の割合を指定    
param_FC <- 4                          #発現変動の度合い(fold-change)を指定    
param_PG1 <- 0.9                       #DEGのうちG1群で高発現なものの割合(PG1)を指定   

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
#set.seed(1000)                        #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
             PDEG=param_PDEG,          #シミュレーションデータの作成
             DEG.assign=c(param_PG1, 1-param_PG1),#シミュレーションデータの作成
             DEG.foldchange=c(param_FC, param_FC),#シミュレーションデータの作成
             replicates=c(param_G1, param_G2))#シミュレーションデータの作成

#ファイルに保存
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. サンプルデータ13と同じ10,000 genes×6 samplesのシミュレーションデータを作成する場合:

1.と同じですが、記述形式を変えてます。

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_replicates <- c(3, 3)            #G1群とG2群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.2                      #発現変動遺伝子の割合を指定    
param_FC <- c(4, 4)                    #G1群とG2群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.9, 0.1)         #DEGのうちG1群とG2群で高発現なものの割合をそれぞれ指定   

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成

#ファイルに保存
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. サンプルデータ13と同じ10,000 genes×6 samplesのシミュレーションデータを作成する場合:

2. と基本的に同じですが、set.seed(1000)の行頭に#を入れてコメントアウトしているので、得られる数値自体は毎回変わるようになります。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_replicates <- c(3, 3)            #G1群とG2群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.2                      #発現変動遺伝子の割合を指定    
param_FC <- c(4, 4)                    #G1群とG2群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.9, 0.1)         #DEGのうちG1群とG2群で高発現なものの割合をそれぞれ指定   

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
#set.seed(1000)                        #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成

#ファイルに保存
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. サンプルデータ13と同じ10,000 genes×6 samplesのシミュレーションデータを作成する場合:

3.と同じですが、それにプラスアルファの情報として、シミュレーション条件の概要が分かるようにpseudo-colorイメージのpngファイルを生成しています。

out_f1 <- "hoge5.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge5.png"                  #出力ファイル名を指定してout_f2に格納
param_replicates <- c(3, 3)            #G1群とG2群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.2                      #発現変動遺伝子の割合を指定    
param_FC <- c(4, 4)                    #G1群とG2群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.9, 0.1)         #DEGのうちG1群とG2群で高発現なものの割合をそれぞれ指定   
param_fig <- c(450, 600)               #pseudo-colorイメージの横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
dev.off()                              #おまじない
	

6. サンプルデータ13と同じ10,000 genes×6 samplesのシミュレーションデータを作成する場合:

3.と同じですが、それにプラスアルファの情報として、M-A plotのpngファイルを生成しています。

out_f1 <- "hoge6.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge6.png"                  #出力ファイル名を指定してout_f2に格納
param_replicates <- c(3, 3)            #G1群とG2群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.2                      #発現変動遺伝子の割合を指定    
param_FC <- c(4, 4)                    #G1群とG2群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.9, 0.1)         #DEGのうちG1群とG2群で高発現なものの割合をそれぞれ指定   
param_fig <- c(602, 450)               #M-A plotの横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, normalize=F, median.lines=T, col=c("black","red"))#M-A plotを描画
dev.off()                              #おまじない
	

7. サンプルデータ13と同じ10,000 genes×6 samplesのシミュレーションデータを作成する場合:

6.と同じですが、それにプラスアルファの情報として、シミュレーション条件の概要を一望できるpseudo-colorイメージのpngファイルも生成しています。

out_f1 <- "hoge7.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge7_MAplot.png"           #出力ファイル名を指定してout_f2に格納(M-A plot)
out_f3 <- "hoge7_pseudo.png"           #出力ファイル名を指定してout_f3に格納(pseudo-colorイメージ)
param_replicates <- c(3, 3)            #G1群とG2群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.2                      #発現変動遺伝子の割合を指定    
param_FC <- c(4, 4)                    #G1群とG2群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.9, 0.1)         #DEGのうちG1群とG2群で高発現なものの割合をそれぞれ指定   
param_fig2 <- c(602, 450)              #M-A plotの横幅と縦幅を指定(単位はピクセル)
param_fig3 <- c(450, 600)              #pseudo-colorイメージの横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig2[1], height=param_fig2[2])#出力ファイルの各種パラメータを指定
plot(tcc, normalize=F, median.lines=T, col=c("black","red"))#M-A plotを描画
dev.off()                              #おまじない

#ファイルに保存(pseudo-colorイメージ)
png(out_f3, pointsize=13, width=param_fig3[1], height=param_fig3[2])#出力ファイルの各種パラメータを指定
plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
dev.off()                              #おまじない
	

カウント情報取得 | シミュレーションデータ | RNA-seq | Biological rep. | 2群間 | 応用 | TCC(Sun_2013)

TCCパッケージ中のsimulateReadCounts関数を用いて 2群間比較用のシミュレーションカウントデータを作成するやり方を示します。 ここでは、基礎の7.のコードを基本として、各群の反復数、全遺伝子数、発現変動遺伝子(DEG)数の割合、各群のDEGの発現変動の度合い、DEG数の各群への割り振りをいろいろ変えます。 試行(trial)ごとに得られる数値が変わるようにしたい場合はset.seed(1000)の前に#を入れましょう。つまり「set.seed(1000)」->「#set.seed(1000)」です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 12,500 genes×6 samplesのシミュレーションデータを作成する場合:

全遺伝子数(12500)、反復数(G1が2, G2が4)、DEGの割合が0.32 (12500*0.32=4000)、 DEGの発現変動の度合い(G1が5.3, G2が0.25)、DEG数の各群への割り振り(G1が0.2, G2が0.8)。 これは全部で4,000 DEGsのうち、gene_1からgene_800までがG1群で5.3倍高発現、gene_801からgene_4000までがG2群で0.25倍高発現(つまりG1群で4倍高発現)を意味し、 事実上全DEGがG1群で高発現というシミュレーション条件になります。M-A plot実行時にmedian.lines=Fとして、水平線や右側に数値が出ないようにしています。

out_f1 <- "hoge1.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1_MAplot.png"           #出力ファイル名を指定してout_f2に格納(M-A plot)
out_f3 <- "hoge1_pseudo.png"           #出力ファイル名を指定してout_f3に格納(pseudo-colorイメージ)
param_replicates <- c(2, 4)            #G1群とG2群のサンプル数をそれぞれ指定
param_Ngene <- 12500                   #全遺伝子数を指定
param_PDEG <- 0.32                     #発現変動遺伝子の割合を指定    
param_FC <- c(5.3, 0.25)               #G1群とG2群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.2, 0.8)         #DEGのうちG1群とG2群で高発現なものの割合をそれぞれ指定   
param_fig2 <- c(602, 450)              #M-A plotの横幅と縦幅を指定(単位はピクセル)
param_fig3 <- c(450, 600)              #pseudo-colorイメージの横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig2[1], height=param_fig2[2])#出力ファイルの各種パラメータを指定
plot(tcc, normalize=F, median.lines=F, col=c("black","red"))#M-A plotを描画
dev.off()                              #おまじない

#ファイルに保存(pseudo-colorイメージ)
png(out_f3, pointsize=13, width=param_fig3[1], height=param_fig3[2])#出力ファイルの各種パラメータを指定
plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
dev.off()                              #おまじない
	

2. 20,023 genes×11 samplesのシミュレーションデータを作成する場合:

全遺伝子数(20023)、反復数(G1が4, G2が7)、DEGの割合が0.27、 DEGの発現変動の度合い(G1が3.2, G2が4.7)、DEG数の各群への割り振り(G1が0.65, G2が0.35)。 これは全部で5,406 DEGsのうち、gene_1からgene_3514までがG1群で3.2倍高発現、gene_3515からgene_5406までがG2群で4.7倍高発現を意味します。 M-A plot実行時にmedian.lines=Tとして、水平線や右側に数値が出るようにしています。

out_f1 <- "hoge2.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge2_MAplot.png"           #出力ファイル名を指定してout_f2に格納(M-A plot)
out_f3 <- "hoge2_pseudo.png"           #出力ファイル名を指定してout_f3に格納(pseudo-colorイメージ)
param_replicates <- c(4, 7)            #G1群とG2群のサンプル数をそれぞれ指定
param_Ngene <- 20023                   #全遺伝子数を指定
param_PDEG <- 0.27                     #発現変動遺伝子の割合を指定    
param_FC <- c(3.2, 4.7)                #G1群とG2群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.65, 0.35)       #DEGのうちG1群とG2群で高発現なものの割合をそれぞれ指定   
param_fig2 <- c(602, 450)              #M-A plotの横幅と縦幅を指定(単位はピクセル)
param_fig3 <- c(450, 600)              #pseudo-colorイメージの横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig2[1], height=param_fig2[2])#出力ファイルの各種パラメータを指定
plot(tcc, normalize=F, median.lines=T, col=c("black","red"))#M-A plotを描画
dev.off()                              #おまじない

#ファイルに保存(pseudo-colorイメージ)
png(out_f3, pointsize=13, width=param_fig3[1], height=param_fig3[2])#出力ファイルの各種パラメータを指定
plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
dev.off()                              #おまじない
	

3. 20,023 genes×2 samplesのシミュレーションデータを作成する場合:

全遺伝子数(20023)、反復数(G1が1, G2が1)、DEGの割合が0.27、 DEGの発現変動の度合い(G1が3.2, G2が4.7)、DEG数の各群への割り振り(G1が0.65, G2が0.35)。 これは全部で5,406 DEGsのうち、gene_1からgene_3514までがG1群で3.2倍高発現、gene_3515からgene_5406までがG2群で4.7倍高発現を意味します。 M-A plot実行時にmedian.lines=Tとして、水平線や右側に数値が出るようにしています。

out_f1 <- "hoge3.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge3_MAplot.png"           #出力ファイル名を指定してout_f2に格納(M-A plot)
out_f3 <- "hoge3_pseudo.png"           #出力ファイル名を指定してout_f3に格納(pseudo-colorイメージ)
param_replicates <- c(1, 1)            #G1群とG2群のサンプル数をそれぞれ指定
param_Ngene <- 20023                   #全遺伝子数を指定
param_PDEG <- 0.27                     #発現変動遺伝子の割合を指定    
param_FC <- c(3.2, 4.7)                #G1群とG2群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.65, 0.35)       #DEGのうちG1群とG2群で高発現なものの割合をそれぞれ指定   
param_fig2 <- c(602, 450)              #M-A plotの横幅と縦幅を指定(単位はピクセル)
param_fig3 <- c(450, 600)              #pseudo-colorイメージの横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig2[1], height=param_fig2[2])#出力ファイルの各種パラメータを指定
plot(tcc, normalize=F, median.lines=T, col=c("black","red"))#M-A plotを描画
dev.off()                              #おまじない

#ファイルに保存(pseudo-colorイメージ)
png(out_f3, pointsize=13, width=param_fig3[1], height=param_fig3[2])#出力ファイルの各種パラメータを指定
plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
dev.off()                              #おまじない
	

カウント情報取得 | シミュレーションデータ | RNA-seq | Biological rep. | 3群間 | 基礎 | TCC(Sun_2013)

TCCパッケージ中のsimulateReadCounts関数を用いて 3群間比較用のシミュレーションカウントデータを作成するやり方を示します。 ここでは、G1, G2, G3群で各群の反復数を3に固定、 、つまり「G1_rep1, G1_rep2, G1_rep3, G2_rep1, G2_rep2, G2_rep3, G3_rep1, G3_rep2, G3_rep3」の計9サンプル。 全10,000遺伝子、最初の25%分(gene_1〜gene_2500)が発現変動遺伝子(DEG)。 試行(trial)ごとに得られる数値が変わるようにしたい場合はset.seed(1000)の前に#を入れましょう。つまり「set.seed(1000)」->「#set.seed(1000)」です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 10,000 genes×9 samplesのシミュレーションデータを作成する場合:

全遺伝子数が10000、反復数(G1が3, G2が3, G3が3)、DEGの割合が0.25 (10000*0.25=2500)、 DEGの発現変動の度合い(G1が4, G2が4, G3が4)、DEG数の各群への割り振り(G1が1/3, G2が1/3, G3が1/3)。 これは全部で2,500 DEGsのうち、gene_1からgene_833までがG1群で4倍高発現、gene_834からgene_1666までがG2群で4倍高発現、gene_1667からgene_2500までがG3群で4倍高発現を意味します。

out_f1 <- "hoge1.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1.png"                  #出力ファイル名を指定してout_f2に格納
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.25                     #発現変動遺伝子の割合を指定    
param_FC <- c(4, 4, 4)                 #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(1/3, 1/3, 1/3)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_fig <- c(450, 600)               #pseudo-colorイメージの横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
dev.off()                              #おまじない
	

2. 10,000 genes×9 samplesのシミュレーションデータを作成する場合:

全遺伝子数が10000、反復数(G1が3, G2が3, G3が3)、 DEGの割合が0.25 (10000*0.25=2500)、 DEGの発現変動の度合い(G1が4, G2が4, G3が4)、 DEG数の各群への割り振り(G1が0.5, G2が0.3, G3が0.2)。 これは全部で2,500 DEGsのうち、gene_1からgene_1250までがG1群で4倍高発現、gene_1251からgene_2000までがG2群で4倍高発現、gene_2001からgene_2500までがG3群で4倍高発現を意味します。

out_f1 <- "hoge2.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge2.png"                  #出力ファイル名を指定してout_f2に格納
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.25                     #発現変動遺伝子の割合を指定    
param_FC <- c(4, 4, 4)                 #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.5, 0.3, 0.2)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_fig <- c(450, 600)               #pseudo-colorイメージの横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
dev.off()                              #おまじない
	

3. 10,000 genes×9 samplesのシミュレーションデータを作成する場合:

全遺伝子数が10000、反復数(G1が3, G2が3, G3が3)、 DEGの割合が0.25 (10000*0.25=2500)、 DEGの発現変動の度合い(G1が4, G2が4, G3が4)、 DEG数の各群への割り振り(G1が0.5, G2が0.4, G3が0.1)。 これは全部で2,500 DEGsのうち、gene_1からgene_1250までがG1群で4倍高発現、gene_1251からgene_2250までがG2群で4倍高発現、gene_2251からgene_2500までがG3群で4倍高発現を意味します。

out_f1 <- "hoge3.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge3.png"                  #出力ファイル名を指定してout_f2に格納
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.25                     #発現変動遺伝子の割合を指定    
param_FC <- c(4, 4, 4)                 #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.5, 0.4, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_fig <- c(450, 600)               #pseudo-colorイメージの横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
dev.off()                              #おまじない
	

4. 10,000 genes×9 samplesのシミュレーションデータを作成する場合:

全遺伝子数が10000、反復数(G1が3, G2が3, G3が3)、 DEGの割合が0.25 (10000*0.25=2500)、 DEGの発現変動の度合い(G1が4, G2が4, G3が4)、 DEG数の各群への割り振り(G1が0.6, G2が0.2, G3が0.2)。 これは全部で2,500 DEGsのうち、gene_1からgene_1500までがG1群で4倍高発現、gene_1501からgene_2000までがG2群で4倍高発現、gene_2001からgene_2500までがG3群で4倍高発現を意味します。

out_f1 <- "hoge4.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge4.png"                  #出力ファイル名を指定してout_f2に格納
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.25                     #発現変動遺伝子の割合を指定    
param_FC <- c(4, 4, 4)                 #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.6, 0.2, 0.2)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_fig <- c(450, 600)               #pseudo-colorイメージの横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
dev.off()                              #おまじない
	

5. 10,000 genes×9 samplesのシミュレーションデータを作成する場合:

全遺伝子数が10000、反復数(G1が3, G2が3, G3が3)、 DEGの割合が0.25 (10000*0.25=2500)、 DEGの発現変動の度合い(G1が4, G2が4, G3が4)、 DEG数の各群への割り振り(G1が0.6, G2が0.3, G3が0.1)。 これは全部で2,500 DEGsのうち、gene_1からgene_1500までがG1群で4倍高発現、gene_1501からgene_2250までがG2群で4倍高発現、gene_2251からgene_2500までがG3群で4倍高発現を意味します。

out_f1 <- "hoge5.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge5.png"                  #出力ファイル名を指定してout_f2に格納
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.25                     #発現変動遺伝子の割合を指定    
param_FC <- c(4, 4, 4)                 #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.6, 0.3, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_fig <- c(450, 600)               #pseudo-colorイメージの横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
dev.off()                              #おまじない
	

6. 10,000 genes×9 samplesのシミュレーションデータを作成する場合:

全遺伝子数が10000、反復数(G1が3, G2が3, G3が3)、 DEGの割合が0.25 (10000*0.25=2500)、 DEGの発現変動の度合い(G1が4, G2が4, G3が4)、 DEG数の各群への割り振り(G1が0.7, G2が0.2, G3が0.1)。 これは全部で2,500 DEGsのうち、gene_1からgene_1750までがG1群で4倍高発現、gene_1751からgene_2250までがG2群で4倍高発現、gene_2251からgene_2500までがG3群で4倍高発現を意味します。

out_f1 <- "hoge6.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge6.png"                  #出力ファイル名を指定してout_f2に格納
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.25                     #発現変動遺伝子の割合を指定    
param_FC <- c(4, 4, 4)                 #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.7, 0.2, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_fig <- c(450, 600)               #pseudo-colorイメージの横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
dev.off()                              #おまじない
	

7. 10,000 genes×9 samplesのシミュレーションデータを作成する場合:

全遺伝子数が10000、反復数(G1が3, G2が3, G3が3)、 DEGの割合が0.25 (10000*0.25=2500)、 DEGの発現変動の度合い(G1が4, G2が4, G3が4)、 DEG数の各群への割り振り(G1が0.8, G2が0.1, G3が0.1)。 これは全部で2,500 DEGsのうち、gene_1からgene_2000までがG1群で4倍高発現、gene_2001からgene_2250までがG2群で4倍高発現、gene_2251からgene_2500までがG3群で4倍高発現を意味します。

out_f1 <- "hoge7.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge7.png"                  #出力ファイル名を指定してout_f2に格納
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.25                     #発現変動遺伝子の割合を指定    
param_FC <- c(4, 4, 4)                 #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.8, 0.1, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_fig <- c(450, 600)               #pseudo-colorイメージの横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotFCPseudocolor(tcc)                 #シミュレーション条件のpseudo-colorイメージを描画
dev.off()                              #おまじない
	

カウント情報取得 | シミュレーションデータ | scRNA-seq | について

single-cell RNA-seq (scRNA-seq)用のシミュレーションデータを作成するものです。

Rパッケージ:

R以外:

Review、ガイドライン、パイプライン系:

カウント情報取得 | シミュレーションデータ | scRNA-seq | 基礎(同一細胞群) | Splatter(Zappia_2017)

Splatterパッケージ中を用いて シミュレーションカウントデータを作成するやり方を示します。原著論文(Zappia et al., Genome Biol., 2017) 中に書かれていますが、Splatterは全部で6つのシミュレーションモデル(Simple, Lun, Lun 2, scDD, BASiCS, and Splat)を実装しています。 この項目ではSplatter原著論文中で新たに提案されたSplatというモデルに基づくシミュレーションデータを生成するやり方を示します。 様々な記述法があります。「基礎(同一細胞群)」の項目では、同一タイプの細胞(cells of same type; one cell type)からなるシミュレーションデータを生成しています。 従来型のRNA-seqカウントデータ解析を知っているヒト向けの説明としては、 「反復あり二群間比較用シミュレーションデータの中で、1つの群のみのデータを生成しており、反復数が100のようなものだ」 と解釈すればよいです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 10,000 genes×100 cellsのシミュレーションデータを作成する場合:

splatSimulate関数のデフォルトのやり方です。

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(splatter)                      #パッケージの読み込み

#本番(シミュレーションデータの作成)
hoge <- splatSimulate()                #シミュレーションデータの作成
hoge                                   #確認してるだけです

#後処理(カウントデータの取り出し)
data <- counts(hoge)                   #カウント情報を抽出した結果をdataに格納
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. 10,000 genes×100 cellsのシミュレーションデータを作成する場合:

例題1と同じ結果が得られます。splatSimulate関数実行時にmethod="single"をつけていますが、 singleがデフォルトであることがわかります。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(splatter)                      #パッケージの読み込み

#本番(シミュレーションデータの作成)
hoge <- splatSimulate(method="single") #シミュレーションデータの作成
hoge                                   #確認してるだけです

#後処理(カウントデータの取り出し)
data <- counts(hoge)                   #カウント情報を抽出した結果をdataに格納
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. 10,000 genes×100 cellsのシミュレーションデータを作成する場合:

例題1-2と同じ結果が得られます。splatSimulateSingle関数をデフォルトで利用するやり方です。 つまり、splatSimulate(method="single")は、splatSimulateSingleと同じ意味だということです。

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(splatter)                      #パッケージの読み込み

#本番(シミュレーションデータの作成)
hoge <- splatSimulateSingle()          #シミュレーションデータの作成
hoge                                   #確認してるだけです

#後処理(カウントデータの取り出し)
data <- counts(hoge)                   #カウント情報を抽出した結果をdataに格納
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. 10,000 genes×100 cellsのシミュレーションデータを作成する場合:

例題1-3と同じ結果が得られます。newSplatParams関数を用いてシミュレーション用パラメータを作成した結果を、 splatSimulateSingle関数実行時のオプションとして与えています。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(splatter)                      #パッケージの読み込み

#本番(シミュレーションデータの作成)
params <- newSplatParams()             #シミュレーション用パラメータの作成
params                                 #確認してるだけです
hoge <- splatSimulateSingle(params=params)#シミュレーションデータの作成
hoge                                   #確認してるだけです

#後処理(カウントデータの取り出し)
data <- counts(hoge)                   #カウント情報を抽出した結果をdataに格納
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. 10,000 genes×100 cellsのシミュレーションデータを作成する場合:

例題1-4と同じ結果が得られます。例題4と似ていますが、splatSimulateSingle関数の代わりにsplatSimulate関数を利用しています。 この場合、method="single"オプションをつけないといけませんが、それを例題2とは少し異なる方法で記載しているだけです。

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_method <- "single"               #シミュレーションの方法を指定:"single", "groups", or "paths"のいずれかを指定可能

#必要なパッケージをロード
library(splatter)                      #パッケージの読み込み

#本番(シミュレーションデータの作成)
params <- newSplatParams()             #シミュレーション用パラメータの作成
params                                 #確認してるだけです
hoge <- splatSimulate(
             method=param_method,      #シミュレーションデータの作成
             params=params)            #シミュレーションデータの作成
hoge                                   #確認してるだけです

#後処理(カウントデータの取り出し)
data <- counts(hoge)                   #カウント情報を抽出した結果をdataに格納
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

6. 10,000 genes×100 cellsのシミュレーションデータを作成する場合:

例題1-5と同じ結果が得られます。遺伝子数と細胞数を指定するオプションを明示するやり方です。 細胞数は、newSplatParams関数実行時にbatchCellsオプションのところで与えています (newSplatParams関数実行時にnCellsオプションのところで与えるとエラーが出ます。)

out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_method <- "single"               #シミュレーションの方法を指定:"single", "groups", or "paths"のいずれかを指定可能
param_Ngene <- 10000                   #遺伝子数を指定
param_Ncell <- 100                     #細胞数を指定

#必要なパッケージをロード
library(splatter)                      #パッケージの読み込み

#本番(シミュレーションデータの作成)
params <- newSplatParams(              #シミュレーション用パラメータの作成
               nGenes=param_Ngene,     #シミュレーション用パラメータの作成
               batchCells=param_Ncell) #シミュレーション用パラメータの作成
params                                 #確認してるだけです
hoge <- splatSimulate(
             method=param_method,      #シミュレーションデータの作成
             params=params)            #シミュレーションデータの作成
hoge                                   #確認してるだけです

#後処理(カウントデータの取り出し)
data <- counts(hoge)                   #カウント情報を抽出した結果をdataに格納
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

7. 10,000 genes×100 cellsのシミュレーションデータを作成する場合:

例題1-6と同じ結果が得られます。例題6と似ていますが、newSplatParams関数を利用せずに、 直接splatSimulate関数内で遺伝子数と細胞数を指定するやり方です。

out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納
param_method <- "single"               #シミュレーションの方法を指定:"single", "groups", or "paths"のいずれかを指定可能
param_Ngene <- 10000                   #遺伝子数を指定
param_Ncell <- 100                     #細胞数を指定

#必要なパッケージをロード
library(splatter)                      #パッケージの読み込み

#本番(シミュレーションデータの作成)
hoge <- splatSimulate(                 #シミュレーションデータの作成
             method=param_method,      #シミュレーションデータの作成
             nGenes=param_Ngene,       #シミュレーションデータの作成
             batchCells=param_Ncell)   #シミュレーションデータの作成
hoge                                   #確認してるだけです

#後処理(カウントデータの取り出し)
data <- counts(hoge)                   #カウント情報を抽出した結果をdataに格納
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

8. 10,000 genes×100 cellsのシミュレーションデータを作成する場合:

例題7と同じです。シミュレーションに用いたパラメータ情報を表示させるところを追加しただけです。 遺伝子についてはrowData(hoge)で取り出せます。splatter.html中のGene informationというのに相当します。 細胞についてはcolData(hoge)で取り出せます。Cell informationというのに相当します。 さらにassays(hoge)でその他の情報も取り出せます。これはGene by cell informationというのに相当しますが、 情報量が多すぎるのでstr(assays(hoge))を示してassays(hoge)の構造(structure)を表示させるに留めています。

out_f <- "hoge8.txt"                   #出力ファイル名を指定してout_fに格納
param_method <- "single"               #シミュレーションの方法を指定:"single", "groups", or "paths"のいずれかを指定可能
param_Ngene <- 10000                   #遺伝子数を指定
param_Ncell <- 100                     #細胞数を指定

#必要なパッケージをロード
library(splatter)                      #パッケージの読み込み

#本番(シミュレーションデータの作成)
hoge <- splatSimulate(                 #シミュレーションデータの作成
             method=param_method,      #シミュレーションデータの作成
             nGenes=param_Ngene,       #シミュレーションデータの作成
             batchCells=param_Ncell)   #シミュレーションデータの作成
hoge                                   #確認してるだけです
rowData(hoge)                          #遺伝子(行)に関する情報を表示
colData(hoge)                          #細胞(列)に関する情報を表示
str(assays(hoge))                      #assays(hoge)の全体像を表示

#後処理(カウントデータの取り出し)
data <- counts(hoge)                   #カウント情報を抽出した結果をdataに格納
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

カウント情報取得 | シミュレーションデータ | scRNA-seq | 基礎(異なる細胞群) | Splatter(Zappia_2017)

Splatterパッケージ中のSplatというモデルを用いて シミュレーションカウントデータを作成するやり方を示します。「異なる細胞群」というのは、細胞の種類数(群数)が2つ以上あることを意味します。 従って、param_methodのところは事実上"groups"で固定です。 従来型のRNA-seqカウントデータ解析を知っているヒト向けの説明としては、例えば例題1は 「反復あり3群間比較用シミュレーションデータの中で、各群の反復数が概ね40のようなものだ」 と解釈すればよいです。概ねを強調している理由は、c(40, 40, 40) という数値ベクトルを与えてはいるものの、実際にはその周辺の数(例えばGroup1が32個、Group2が38個、Group3が50個)が得られるからです。総数は不変のようです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 10,000 genes×120 cellsのシミュレーションデータを作成する場合:

細胞の種類数(群数)は3つで、各種類(各群)につき40細胞という条件です。 細胞名がCell1, Cell2, ..., Cell120となってはいますが、colData(hoge)のGroup列の並びからも想像できるように、細胞の種類(群)ごとに並んでいるわけではないのでご注意ください。 table(colData(hoge)$Group)実行結果からもわかりますが、得られたデータは「Group1の細胞数が32個、Group2の細胞数が38個、Group3の細胞数が50個」みたいな感じになっていることがわかります。

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_method <- "groups"               #シミュレーションの方法を指定:"single", "groups", or "paths"のいずれかを指定可能
param_Ngene <- 10000                   #遺伝子数を指定
param_Ncell <- c(40, 40, 40)           #群ごとの細胞数を指定

#必要なパッケージをロード
library(splatter)                      #パッケージの読み込み

#前処理(各群の細胞数の割合を算出)
param_tmp <- param_Ncell/sum(param_Ncell)#各群の細胞数の割合を算出(group.probオプション部分で利用)

#本番(シミュレーションデータの作成)
hoge <- splatSimulate(                 #シミュレーションデータの作成
             method=param_method,      #シミュレーションデータの作成
             nGenes=param_Ngene,       #シミュレーションデータの作成
             batchCells=sum(param_Ncell),#シミュレーションデータの作成
             group.prob=param_tmp)     #シミュレーションデータの作成
hoge                                   #確認してるだけです
colData(hoge)                          #細胞(列)に関する情報を表示
table(colData(hoge)$Group)             #種類ごとの細胞数情報を表示

#後処理(カウントデータの取り出し)
data <- counts(hoge)                   #カウント情報を抽出した結果をdataに格納
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. 10,000 genes×120 cellsのシミュレーションデータを作成する場合:

例題1と基本的に同じですが、列名を(Group1, Group2, Group3などに)変更してから、細胞の種類(群)ごとにソートしています。 (遺伝子名の列を除く)最初の32列分がGroup1、次の38列分がGroup2、残りの50列分がGroup3みたいになっていることがわかります。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_method <- "groups"               #シミュレーションの方法を指定:"single", "groups", or "paths"のいずれかを指定可能
param_Ngene <- 10000                   #遺伝子数を指定
param_Ncell <- c(40, 40, 40)           #群ごとの細胞数を指定

#必要なパッケージをロード
library(splatter)                      #パッケージの読み込み

#前処理(各群の細胞数の割合を算出)
param_tmp <- param_Ncell/sum(param_Ncell)#各群の細胞数の割合を算出(group.probオプション部分で利用)

#本番(シミュレーションデータの作成)
hoge <- splatSimulate(                 #シミュレーションデータの作成
             method=param_method,      #シミュレーションデータの作成
             nGenes=param_Ngene,       #シミュレーションデータの作成
             batchCells=sum(param_Ncell),#シミュレーションデータの作成
             group.prob=param_tmp)     #シミュレーションデータの作成
hoge                                   #確認してるだけです
colData(hoge)                          #細胞(列)に関する情報を表示
table(colData(hoge)$Group)             #種類ごとの細胞数情報を表示

#後処理(カウントデータの取り出し、列名変更、ソート)
data <- counts(hoge)                   #カウント情報を抽出した結果をdataに格納
colnames(data) <- colData(hoge)$Group  #列名を変更
colnames(data)                         #列名を表示
data <- data[, order(colnames(data))]  #列名でソート
colnames(data)                         #列名を表示
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. 10,000 genes×120 cellsのシミュレーションデータを作成する場合:

トータルの細胞数(=120)は同じですが、細胞の種類数(群数)は6つで、各種類(各群)につき20細胞という条件です。 「Group1が19列、Group2が16列、Group3が22列、Group4が19列、Group5が31列、そしてGroup6が13列」みたいになっていることがわかります。

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_method <- "groups"               #シミュレーションの方法を指定:"single", "groups", or "paths"のいずれかを指定可能
param_Ngene <- 10000                   #遺伝子数を指定
param_Ncell <- c(20, 20, 20, 20, 20, 20)#群ごとの細胞数を指定

#必要なパッケージをロード
library(splatter)                      #パッケージの読み込み

#前処理(各群の細胞数の割合を算出)
param_tmp <- param_Ncell/sum(param_Ncell)#各群の細胞数の割合を算出(group.probオプション部分で利用)

#本番(シミュレーションデータの作成)
hoge <- splatSimulate(                 #シミュレーションデータの作成
             method=param_method,      #シミュレーションデータの作成
             nGenes=param_Ngene,       #シミュレーションデータの作成
             batchCells=sum(param_Ncell),#シミュレーションデータの作成
             group.prob=param_tmp)     #シミュレーションデータの作成
hoge                                   #確認してるだけです
colData(hoge)                          #細胞(列)に関する情報を表示
table(colData(hoge)$Group)             #種類ごとの細胞数情報を表示

#後処理(カウントデータの取り出し、列名変更、ソート)
data <- counts(hoge)                   #カウント情報を抽出した結果をdataに格納
colnames(data) <- colData(hoge)$Group  #列名を変更
colnames(data)                         #列名を表示
data <- data[, order(colnames(data))]  #列名でソート
colnames(data)                         #列名を表示
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. 10,000 genes×120 cellsのシミュレーションデータを作成する場合:

例題3と基本的に同じですが、gsub関数を用いて文字列"Group"を"G"に置換して、群名を「Group1, Group2, ...」から 「G1, G2, ...」に変更しています。 「G1が19列、G2が16列、G3が22列、G4が19列、G5が31列、そしてG6が13列」みたいになっていることがわかります。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_method <- "groups"               #シミュレーションの方法を指定:"single", "groups", or "paths"のいずれかを指定可能
param_Ngene <- 10000                   #遺伝子数を指定
param_Ncell <- c(20, 20, 20, 20, 20, 20)#群ごとの細胞数を指定

#必要なパッケージをロード
library(splatter)                      #パッケージの読み込み

#前処理(各群の細胞数の割合を算出)
param_tmp <- param_Ncell/sum(param_Ncell)#各群の細胞数の割合を算出(group.probオプション部分で利用)

#本番(シミュレーションデータの作成)
hoge <- splatSimulate(                 #シミュレーションデータの作成
             method=param_method,      #シミュレーションデータの作成
             nGenes=param_Ngene,       #シミュレーションデータの作成
             batchCells=sum(param_Ncell),#シミュレーションデータの作成
             group.prob=param_tmp)     #シミュレーションデータの作成
hoge                                   #確認してるだけです
colData(hoge)                          #細胞(列)に関する情報を表示
table(colData(hoge)$Group)             #種類ごとの細胞数情報を表示

#後処理(カウントデータの取り出し、列名変更、ソート、文字列置換)
data <- counts(hoge)                   #カウント情報を抽出した結果をdataに格納
colnames(data) <- colData(hoge)$Group  #列名を変更
colnames(data)                         #列名を表示
data <- data[, order(colnames(data))]  #列名でソート
colnames(data)                         #列名を表示
colnames(data) <- gsub("Group", "G", colnames(data))#文字列置換
colnames(data)                         #列名を表示
table(colnames(data))                  #群ごとの細胞数情報を表示
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. 10,000 genes×120 cellsのシミュレーションデータを作成する場合:

例題4と基本的に同じですが、splatSimulate関数の代わりにsplatSimulateGroups関数を利用しています。 「G1が19列、G2が16列、G3が22列、G4が19列、G5が31列、そしてG6が13列」みたいになっていることがわかります。

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_Ngene <- 10000                   #遺伝子数を指定
param_Ncell <- c(20, 20, 20, 20, 20, 20)#群ごとの細胞数を指定

#必要なパッケージをロード
library(splatter)                      #パッケージの読み込み

#前処理(各群の細胞数の割合を算出)
param_tmp <- param_Ncell/sum(param_Ncell)#各群の細胞数の割合を算出(group.probオプション部分で利用)

#本番(シミュレーションデータの作成)
hoge <- splatSimulateGroups(           #シミュレーションデータの作成
             nGenes=param_Ngene,       #シミュレーションデータの作成
             batchCells=sum(param_Ncell),#シミュレーションデータの作成
             group.prob=param_tmp)     #シミュレーションデータの作成
hoge                                   #確認してるだけです
colData(hoge)                          #細胞(列)に関する情報を表示
table(colData(hoge)$Group)             #種類ごとの細胞数情報を表示

#後処理(カウントデータの取り出し、列名変更、ソート、文字列置換)
data <- counts(hoge)                   #カウント情報を抽出した結果をdataに格納
colnames(data) <- colData(hoge)$Group  #列名を変更
colnames(data)                         #列名を表示
data <- data[, order(colnames(data))]  #列名でソート
colnames(data)                         #列名を表示
colnames(data) <- gsub("Group", "G", colnames(data))#文字列置換
colnames(data)                         #列名を表示
table(colnames(data))                  #群ごとの細胞数情報を表示
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

カウント情報取得 | シミュレーションデータ | scRNA-seq | 応用(異なる細胞群) | Splatter(Zappia_2017)

Splatterパッケージ中のSplatというモデルを用いて シミュレーションカウントデータを作成するやり方を示します。「応用(異なる細胞群)」では、正規化後のデータを取得したり、クラスタリングを直接行ったりする例を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 10,000 genes×120 cellsのシミュレーションデータを作成する場合:

トータルの細胞数(=120)は同じですが、細胞の種類数(群数)は6つで、各種類(各群)につき20細胞という条件です。 G1が19列、G2が16列、G3が22列、G4が19列、G5が31列、そしてG6が13列となっていることがわかります。 「基礎(異なる細胞群)」の例題5をベースとして、 scaterパッケージ中のnormalize関数を実行した結果を出力しています。 log2変換後のデータです。

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_Ngene <- 10000                   #遺伝子数を指定
param_Ncell <- c(20, 20, 20, 20, 20, 20)#群ごとの細胞数を指定

#必要なパッケージをロード
library(splatter)                      #パッケージの読み込み
library(scater)                        #パッケージの読み込み

#前処理(各群の細胞数の割合を算出)
param_tmp <- param_Ncell/sum(param_Ncell)#各群の細胞数の割合を算出(group.probオプション部分で利用)

#本番(シミュレーションデータの作成)
hoge <- splatSimulateGroups(           #シミュレーションデータの作成
             nGenes=param_Ngene,       #シミュレーションデータの作成
             batchCells=sum(param_Ncell),#シミュレーションデータの作成
             group.prob=param_tmp)     #シミュレーションデータの作成
hoge                                   #確認してるだけです
colData(hoge)                          #細胞(列)に関する情報を表示
table(colData(hoge)$Group)             #種類ごとの細胞数情報を表示

#データ正規化(Scaling normalizationとlog2変換)
sizeFactors(hoge) <- librarySizeFactors(hoge)#サイズファクターを計算(おそらくDESeq正規化のやつに相当)
hoge <- normalize(hoge)                #正規化後してlog2変換

#後処理(正規化済みデータの取り出し、列名変更、ソート、文字列置換)
data <- logcounts(hoge)                #カウント情報を抽出した結果をdataに格納
colnames(data) <- colData(hoge)$Group  #列名を変更
colnames(data)                         #列名を表示
data <- data[, order(colnames(data))]  #列名でソート
colnames(data)                         #列名を表示
colnames(data) <- gsub("Group", "G", colnames(data))#文字列置換
colnames(data)                         #列名を表示
table(colnames(data))                  #群ごとの細胞数情報を表示
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. 10,000 genes×120 cellsのシミュレーションデータを作成する場合:

例題1と基本的に同じですが、主成分分析(PCA)も行っています。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_Ngene <- 10000                   #遺伝子数を指定
param_Ncell <- c(20, 20, 20, 20, 20, 20)#群ごとの細胞数を指定

#必要なパッケージをロード
library(splatter)                      #パッケージの読み込み
library(scater)                        #パッケージの読み込み

#前処理(各群の細胞数の割合を算出)
param_tmp <- param_Ncell/sum(param_Ncell)#各群の細胞数の割合を算出(group.probオプション部分で利用)

#本番(シミュレーションデータの作成)
hoge <- splatSimulateGroups(           #シミュレーションデータの作成
             nGenes=param_Ngene,       #シミュレーションデータの作成
             batchCells=sum(param_Ncell),#シミュレーションデータの作成
             group.prob=param_tmp)     #シミュレーションデータの作成
hoge                                   #確認してるだけです
colData(hoge)                          #細胞(列)に関する情報を表示
table(colData(hoge)$Group)             #種類ごとの細胞数情報を表示

#データ正規化(Scaling normalizationとlog2変換)
sizeFactors(hoge) <- librarySizeFactors(hoge)#サイズファクターを計算(おそらくDESeq正規化のやつに相当)
hoge <- normalize(hoge)                #正規化後してlog2変換

#クラスタリング(PCA)
plotPCA(hoge, colour_by = "Group")     #PCA(主成分分析)を実行

#後処理(正規化済みデータの取り出し、列名変更、ソート、文字列置換)
data <- logcounts(hoge)                #カウント情報を抽出した結果をdataに格納
colnames(data) <- colData(hoge)$Group  #列名を変更
colnames(data)                         #列名を表示
data <- data[, order(colnames(data))]  #列名でソート
colnames(data)                         #列名を表示
colnames(data) <- gsub("Group", "G", colnames(data))#文字列置換
colnames(data)                         #列名を表示
table(colnames(data))                  #群ごとの細胞数情報を表示
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. 10,000 genes×120 cellsのシミュレーションデータを作成する場合:

例題1と基本的に同じですが、t-distributed stochastic neighbour embedding (t-SNE)も行っています。

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_Ngene <- 10000                   #遺伝子数を指定
param_Ncell <- c(20, 20, 20, 20, 20, 20)#群ごとの細胞数を指定

#必要なパッケージをロード
library(splatter)                      #パッケージの読み込み
library(scater)                        #パッケージの読み込み

#前処理(各群の細胞数の割合を算出)
param_tmp <- param_Ncell/sum(param_Ncell)#各群の細胞数の割合を算出(group.probオプション部分で利用)

#本番(シミュレーションデータの作成)
hoge <- splatSimulateGroups(           #シミュレーションデータの作成
             nGenes=param_Ngene,       #シミュレーションデータの作成
             batchCells=sum(param_Ncell),#シミュレーションデータの作成
             group.prob=param_tmp)     #シミュレーションデータの作成
hoge                                   #確認してるだけです
colData(hoge)                          #細胞(列)に関する情報を表示
table(colData(hoge)$Group)             #種類ごとの細胞数情報を表示

#データ正規化(Scaling normalizationとlog2変換)
sizeFactors(hoge) <- librarySizeFactors(hoge)#サイズファクターを計算(おそらくDESeq正規化のやつに相当)
hoge <- normalize(hoge)                #正規化後してlog2変換

#クラスタリング(t-SNE)
plotTSNE(hoge, colour_by = "Group")     #t-SNEを実行

#後処理(正規化済みデータの取り出し、列名変更、ソート、文字列置換)
data <- logcounts(hoge)                #カウント情報を抽出した結果をdataに格納
colnames(data) <- colData(hoge)$Group  #列名を変更
colnames(data)                         #列名を表示
data <- data[, order(colnames(data))]  #列名でソート
colnames(data)                         #列名を表示
colnames(data) <- gsub("Group", "G", colnames(data))#文字列置換
colnames(data)                         #列名を表示
table(colnames(data))                  #群ごとの細胞数情報を表示
dim(data)                              #行数と列数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

配列長とカウント数の関係

RNA-seqデータは、原理的に配列長が長い転写物ほどその断片配列のリード数が多い傾向にあります。ここではそれを眺めます。 2014年7月3日に、boxplotで示すためにparam個で分割(20分割など)するテクニックとして「floor(nrow(data)/param)+1」としていましたが、 これだと割り切れる場合でも+1してしまうことが判明したため「ceiling(nrow(data)/param)」に修正しました(佐伯亘平氏提供情報)。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 配列長とカウント情報を含むファイル(sample_length_count.txt)の場合:

1-3列目がそれぞれ、gene ID, 配列長, カウント数からなるファイルです。 横軸:配列長、縦軸:カウント数のシンプルな散布図を作成したい場合です。 (ダイナミックレンジが広いので両軸ともにlog10にしています。したがって、ゼロカウントになるところはlogを計算できないのでプロットされませんよ、という警告が出ます)

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです

#本番(散布図)
plot(data, log="xy")                   #両対数プロット
#plot(Count ~ Length, data=data, log="xy")#表現方法が異なるだけ
#plot(Count ~ Length, data=log10(data), xlab="log10(Length)", ylab="log10(Count)")#表現方法が異なるだけ
	

2. 配列長とカウント情報を含むファイル(sample_length_count.txt)の場合:

1-3列目がそれぞれ、gene ID, 配列長, カウント数からなるファイルです。 横軸:配列長、縦軸:カウント数のシンプルな散布図を作成したい場合です。線形回帰も行っています。 (ダイナミックレンジが広いので両軸ともにlog10にしています。したがって、ゼロカウントになるところはlogを計算できないのでプロットされませんよ、という警告が出ます)

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#本番(両対数プロット図)
plot(data, log="xy")                   #両対数プロット

#線形回帰(Linear Regression Model)
out <- lm(Count ~ Length, data=log10(data))#線形回帰を行っている
abline(out, col="red")                 #回帰直線を赤色で引いている
	

3. 配列長とカウント情報を含むファイル(sample_length_count.txt)の場合:

1-3列目がそれぞれ、gene ID, 配列長, カウント数からなるファイルです。 横軸:配列長、縦軸:カウント数のシンプルな散布図を作成したい場合です。平滑化曲線を追加しています。 (ダイナミックレンジが広いので両軸ともにlog10にしています。したがって、ゼロカウントになるところはlogを計算できないのでプロットされませんよ、という警告が出ます)

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納
param <- 0.2                           #lowess曲線を描くときのwindow幅(0-1の範囲をとり、デフォルトは2/3)を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#本番(両対数プロット図)
plot(data, log="xy")                   #両対数プロット

#平滑化曲線
lines(lowess(data, f=param), col="red")#lowess曲線を赤色で引いている
	

4. 配列長とカウント情報を含むファイル(sample_length_count.txt)の場合:

1-3列目がそれぞれ、gene ID, 配列長, カウント数からなるファイルです。 横軸:配列長、縦軸:カウント数のboxplot(箱ひげ図)を作成したい場合です。

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納
param_bin <- 20                        #boxplotを描くときの水準数(分割数に相当)を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#前処理(配列長の短い順にソート)
data <- data[order(data[,1]),]         #ソート
head(data)                             #確認してるだけです
tail(data)                             #確認してるだけです

#前処理(dataを分割するためのグループラベル情報作成)
f <- gl(param_bin, ceiling(nrow(data)/param_bin), nrow(data))#nrow(data)の要素数からなるベクトルを分割した因子ベクトルfを作成
head(f)                                #確認してるだけです

#本番(boxplot)
plot(f, log10(data[,2]), xlab="Length", ylab="log10(Count)")#boxplot

#解説(配列長が短い上位5%について)
data_shortest <- data[f==1,]           #ラベルが1の要素のみ抽出(配列長が短い最初の5%に相当)
summary(data_shortest)                 #要約統計量を表示
summary(log10(data_shortest))          #要約統計量を表示

#解説(配列長が長い上位5%について)
data_longest <- data[f==param_bin,] #ラベルがparam_binの要素のみ抽出(配列長が短い最後の5%に相当;つまり配列長が長い上位5%)
summary(data_longest)                  #要約統計量を表示
summary(log10(data_longest))           #要約統計量を表示
	

5. 配列長とカウント情報を含むファイル(sample_length_count.txt)の場合:

1-3列目がそれぞれ、gene ID, 配列長, カウント数からなるファイルです。 横軸:配列長、縦軸:カウント数のboxplot(箱ひげ図)をpng形式ファイルで保存したい場合です。

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_bin <- 20                        #boxplotを描くときの水準数(分割数に相当)を指定
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納

#前処理(配列長の短い順にソート)
data <- data[order(data[,1]),]         #ソート

#前処理(dataを分割するためのグループラベル情報作成)
f <- gl(param_bin, ceiling(nrow(data)/param_bin), nrow(data))#nrow(data)の要素数からなるベクトルを分割した因子ベクトルfを作成

#本番(ファイルに保存)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(f, log10(data[,2]), xlab="Length", ylab="log10(Count)")#boxplot
dev.off()                              #おまじない
	

6. カウントデータファイル(srp017142_count_bowtie.txt)と長さ情報ファイル(srp017142_genelength.txt)が別々の場合:

パイプライン | ゲノム | 発現変動 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013)」の出力ファイルです。 カウントデータファイルは全部で6サンプル分のデータが含まれていますが、ここでは(Ensembl Gene ID列を除く)3列目の"Pro_rep3"のカウントデータと配列長との関係を調べています。 横軸:配列長、縦軸:カウント数のboxplot(箱ひげ図)をpng形式ファイルで保存したい場合です。

in_f1 <- "srp017142_count_bowtie.txt"  #入力ファイル名を指定してin_f1に格納(カウント情報ファイル)
in_f2 <- "srp017142_genelength.txt"    #入力ファイル名を指定してin_f2に格納(配列長情報ファイル)
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_bin <- 20                        #boxplotを描くときの水準数(分割数に相当)を指定
param2 <- 3                            #配列長との関係を調べたいサンプルの列番号を指定
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
hoge <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
len <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#in_f2で指定したファイルの読み込み
hoge <- hoge[, param2]                 #指定した列のカウント情報を抽出
data <- cbind(len, hoge)               #配列長ベクトルとカウントベクトルを列方向で結合した結果をdataに格納

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納

#前処理(配列長の短い順にソート)
data <- data[order(data[,1]),]         #ソート

#前処理(dataを分割するためのグループラベル情報作成)
f <- gl(param_bin, ceiling(nrow(data)/param_bin), nrow(data))#nrow(data)の要素数からなるベクトルを分割した因子ベクトルfを作成

#本番(ファイルに保存)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(f, log10(data[,2]), xlab="Length", ylab="log10(Count)")#boxplot
dev.off()                              #おまじない
	

7. RPKM補正後のファイル(srp017142_RPKM_bowtie.txt)と長さ情報ファイル(srp017142_genelength.txt)が別々の場合:

パイプライン | ゲノム | 発現変動 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013)」の出力ファイルです。 RPKMデータファイルは全部で6サンプル分のデータが含まれていますが、ここでは(Ensembl Gene ID列を除く)3列目の"Pro_rep3"のカウントデータと配列長との関係を調べています。 横軸:配列長、縦軸:カウント数のboxplot(箱ひげ図)をpng形式ファイルで保存したい場合です。配列長補正によって、偏りが軽減されていることがわかります。

in_f1 <- "srp017142_RPKM_bowtie.txt"   #入力ファイル名を指定してin_f1に格納(カウント情報ファイル)
in_f2 <- "srp017142_genelength.txt"    #入力ファイル名を指定してin_f2に格納(配列長情報ファイル)
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_bin <- 20                        #boxplotを描くときの水準数(分割数に相当)を指定
param2 <- 3                            #配列長との関係を調べたいサンプルの列番号を指定
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
hoge <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
len <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#in_f2で指定したファイルの読み込み
hoge <- hoge[, param2]                 #指定した列のカウント情報を抽出
data <- cbind(len, hoge)               #配列長ベクトルとカウントベクトルを列方向で結合した結果をdataに格納

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納

#前処理(配列長の短い順にソート)
data <- data[order(data[,1]),]         #ソート

#前処理(dataを分割するためのグループラベル情報作成)
f <- gl(param_bin, ceiling(nrow(data)/param_bin), nrow(data))#nrow(data)の要素数からなるベクトルを分割した因子ベクトルfを作成

#本番(ファイルに保存)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(f, log10(data[,2]), xlab="Length", ylab="log10(Count)")#boxplot
dev.off()                              #おまじない
	

8. 配列長を含むカウントデータファイル(SRA000299_ensgene.txt)の場合:

書籍 | トランスクリプトーム解析 | 2.3.6 カウントデータ取得のp92のコードを実行して得られたファイルです。 (Gene ID列を除く)1列目の配列長と2列目の"Kidney"のカウントデータとの関係を調べています。 横軸:配列長、縦軸:カウント数のboxplot(箱ひげ図)をpng形式ファイルで保存したい場合です。

in_f <- "SRA000299_ensgene.txt"        #入力ファイル名を指定してin_fに格納
out_f <- "hoge8.png"                   #出力ファイル名を指定してout_fに格納
param_bin <- 20                        #boxplotを描くときの水準数(分割数に相当)を指定
param2 <- c(1, 2)                      #配列長との関係を調べたいサンプルの列番号を指定
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込みとサブセットの抽出
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- data[, param2]                 #指定した列のカウント情報を抽出

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納

#前処理(配列長の短い順にソート)
data <- data[order(data[,1]),]         #ソート

#前処理(dataを分割するためのグループラベル情報作成)
f <- gl(param_bin, ceiling(nrow(data)/param_bin), nrow(data))#nrow(data)の要素数からなるベクトルを分割した因子ベクトルfを作成

#本番(ファイルに保存)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(f, log10(data[,2]), xlab="Length", ylab="log10(Count)")#boxplot
dev.off()                              #おまじない
	

9. カウントデータファイル(SRR616268sub_count2.txt)と長さ情報ファイル(SRR616268sub_genelen2.txt)が別々の場合:

「マップ後 | カウント情報取得 | paired-end | ゲノム | アノテーション有 | QuasR(Gaidatzis_2015)」の例題2実行結果ファイル(と同じ)です。 横軸:配列長、縦軸:カウント数のboxplot(箱ひげ図)をpng形式ファイルで保存したい場合です。

in_f1 <- "SRR616268sub_count2.txt"     #入力ファイル名を指定してin_f1に格納(カウント情報ファイル)
in_f2 <- "SRR616268sub_genelen2.txt"   #入力ファイル名を指定してin_f2に格納(配列長情報ファイル)
out_f <- "hoge9.png"                   #出力ファイル名を指定してout_fに格納
param_bin <- 20                        #boxplotを描くときの水準数(分割数に相当)を指定
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
hoge <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
len <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#in_f2で指定したファイルの読み込み
data <- cbind(len, hoge)               #配列長ベクトルとカウントベクトルを列方向で結合した結果をdataに格納

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納

#前処理(配列長の短い順にソート)
data <- data[order(data[,1]),]         #ソート

#前処理(dataを分割するためのグループラベル情報作成)
f <- gl(param_bin, ceiling(nrow(data)/param_bin), nrow(data))#nrow(data)の要素数からなるベクトルを分割した因子ベクトルfを作成

#本番(ファイルに保存)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(f, log10(data[,2]), xlab="Length", ylab="log10(Count)")#boxplot
dev.off()                              #おまじない
	

10. カウントデータファイル(SRR616268sub_count1.txt)と長さ情報ファイル(SRR616268sub_genelen1.txt)が別々の場合:

「マップ後 | カウント情報取得 | paired-end | ゲノム | アノテーション無 | QuasR(Gaidatzis_2015)」の例題1実行結果ファイル(と同じ)です。 横軸:配列長、縦軸:カウント数のboxplot(箱ひげ図)をpng形式ファイルで保存したい場合です。

in_f1 <- "SRR616268sub_count1.txt"     #入力ファイル名を指定してin_f1に格納(カウント情報ファイル)
in_f2 <- "SRR616268sub_genelen1.txt"   #入力ファイル名を指定してin_f2に格納(配列長情報ファイル)
out_f <- "hoge10.png"                  #出力ファイル名を指定してout_fに格納
param_bin <- 20                        #boxplotを描くときの水準数(分割数に相当)を指定
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
hoge <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
len <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#in_f2で指定したファイルの読み込み
data <- cbind(len, hoge)               #配列長ベクトルとカウントベクトルを列方向で結合した結果をdataに格納

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納

#前処理(配列長の短い順にソート)
data <- data[order(data[,1]),]         #ソート

#前処理(dataを分割するためのグループラベル情報作成)
f <- gl(param_bin, ceiling(nrow(data)/param_bin), nrow(data))#nrow(data)の要素数からなるベクトルを分割した因子ベクトルfを作成

#本番(ファイルに保存)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(f, log10(data[,2]), xlab="Length", ylab="log10(Count)")#boxplot
dev.off()                              #おまじない
	

正規化 | について

以下は記述内容が相当古いので参考程度にしてください(2014/06/22)。。。

サンプル内正規化周辺:

一つ上の項目(前処理 | 発現レベルの定量化について)は主にリファレンス配列(ゲノムやトランスクリプトーム)に対して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)ことがわかりつつあります。

正規化 | サンプル間 | 複製あり | DEGES/TbT正規化(Kadota_2012)でも述べていますが、従来のサンプル間正規化法(RPMやTMM法)は比較する二群間(G1群 vs. G2群)でDEG数に大きな偏りがないことを前提にしています。 つまり、「(G1群 >> G2群)のDEG数と(G1群 << G2群)のDEG数が同程度」という前提条件がありますが、実際には大きく偏りがある場合も想定すべきで、偏りがあるなしにかかわらずロバストに正規化を行ってくれるのがTbT正規化法(Kadota et al., 2012)です。 偏りがあるなしの主な原因はDEGの分布にあるわけです。よって、TbT論文では、「正規化中にDEG検出を行い、DEGを除き、non-DEGのみで再度正規化係数を決める」というDEG elimination strategyに基づく正規化法を提案しています。 そして、TbT法を含むDEG elimination strategyに基づくいくつかの正規化法をTCCというRパッケージ中に実装しています(TCC論文中ではこの戦略をDEGES「でげす」と呼んでいます; Sun et al., 2013)。TCCパッケージ中に実装されている主な方法および入力データは以下の通りです:

  1. DEGES/TbT:オリジナルのTbT法そのもの。TMM-baySeq-TMMという3ステップで正規化を行う方法。step 2のDEG同定のところで計算時間のかかるbaySeqを採用しているため、他のパッケージでは数秒で終わる正規化ステップが数十分程度はかかるのがネック。また、biological replicatesがあることを前提としている。(A1, A2, ...) vs. (B1, B2, ...)のようなデータという意味。
  2. iDEGES/edgeR:DEGES/TbT法の超高速版(100倍程度高速)。TMM-(edgeR-TMM)nというステップで正規化を行う方法(デフォルトはn = 3)。step 2のDEG同定のところでedgeRパッケージ中のexact test (Robinson and Smyth, 2008)を採用しているためDEG同定の高速化が可能。
     したがって、(step2 - step3)のサイクルをiterative (それゆえDEGESの頭にiterativeの意味を示すiがついたiDEGESとなっている)に行ってよりロバストな正規化係数を得ることが理論的に可能な方法です。それゆえreplicatesのある二群間比較を行いたい場合にはDEGES/TbTよりもiDEGES/edgeRのほうがおすすめ。
  3. iDEGES/DESeq:一連のmulti-stepの正規化手順をすべてDESeqパッケージ中の関数のみで実装したパイプライン。複製実験のない二群間比較時(i.e., A1 vs. B1など)にはこちらを利用します。

ここでは、主に生のリードカウント(整数値;integer)データを入力として(異なる遺伝子間の発現レベルの大小比較のため)サンプル内で行うGC含量補正やgene length補正を行う方法や、 (サンプル間で同一遺伝子の発現変動比較のため)サンプル間で行うsequence depth関連の補正を行う方法についてリストアップしておきます。なぜ前処理 | 発現レベルの定量化についてで得られた数値データを使わないのか?についてですが、 よく言われることとしては「モデル(Poisson model, generalized Poisson model, negative binomial modelなど)に従わなくなるから取り扱いずらくなる」ということもあるんでしょうね。このあたりはedgeRのマニュアルなどで明記されていたりもします。 spliced read情報を含んだ発現情報を用いた正規化法の開発についてもディスカッションではよく述べられています(Dillies et al., in press)が、、、対応版は近い将来publishされる論文で出てくるでしょう。

また、現在の方法は主に転写物レベルではなく遺伝子レベルの解析です。一歩踏み込んだエクソンレベルの解析用Rパッケージ(正規化法含む)も出てきています(Anders et al., 2012)。

一般によく用いられるカウントデータは「2塩基ミスマッチまで許容して一か所にのみマップされるリードの数(uniquely mapped reads allowing up to two mismatches)」です(Frazee et al., 2011; Risso et al., 2011; Sun and Zhu, 2012)。 どの正規化法がいいかを評価する基準としてよく用いられているのは下記のものなどが挙げられます。 二番目については、gold standardの結果自体も測定誤差(measurement error; ME)を含むのでgold standard非依存のME modelを利用した評価法(Sun and Zhu, 2012)も提案されています:

  1. 複製実験データの再現性が高いかどうか?(reproducibilityとかprecisionという用語が対応します)
  2. qRT-PCRやmicroarrayなどの他の実験技術由来のデータをgold standardとしてそれとの相関係数が高いかどうか?(accuracy; Garmire and Subramaniam, 2012)
  3. シミュレーションデータなど、既知の発現変動遺伝子(DEGs)を発現変動遺伝子として上位にランキングできる正規化法かどうか?(AUC; Kadota et al., 2012)

「方法名」:「Rパッケージ名」:「原著論文」の順番です。(あれば)

また、必ずしも正規化法の原著論文とは対応付いていませんのであしからず。この方法を使いたいがどのパッケージで利用可能?、という視点でご覧になってください。

正規化(サンプル内; GC含量補正):
正規化(サンプル内; GC contents and gene length同時補正):
正規化(サンプル内; 全般;分布系):
正規化(サンプル内; 全般;その他(自分の前後の塩基の使用頻度を考慮, sequencing preference)):
正規化(サンプル間):

他の参考文献:

正規化 | 基礎 | RPK or CPK (配列長補正)

ここでは、遺伝子(転写物)ごとのリード数を「配列長が1000 bp (one kilobase)だったときのリード数; Reads per kilobase (RPK)」に変換するやり方を示します。 「リード数 = カウント数」なのでReadsのところをCountsに置き換えた表現(Counts per kilobase; CPK)もときどき見受けられます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 配列長とカウント情報を含むファイル(sample_length_count.txt)の場合:

1-3列目がそれぞれ、gene ID, 配列長, カウント数からなるファイルです。基本形です。

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param <- 1000                          #「Reads per X」のXの値を指定(デフォルトはRPKなので1000)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです

#本番(正規化)
nf <- param/data[,1]                   #正規化係数を計算した結果をnfに格納
out <- data[,2] * nf                   #正規化係数を各行に掛けた結果をoutに格納

#ファイルに保存
tmp <- cbind(rownames(data), data[,1], out)#「ID, 配列長, カウント情報」の並びにしたものをtmpに格納
colnames(tmp) <- c("ID", "Length", "Count")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. 配列長とカウント情報を含むファイル(sample_length_count.txt)の場合:

1-3列目がそれぞれ、gene ID, 配列長, カウント数からなるファイルです。 横軸:配列長、縦軸:RPK値のboxplot(箱ひげ図)をpng形式ファイルで保存するやり方です。

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_bin <- 20                        #boxplotを描くときの水準数(分割数に相当)を指定
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです

#前処理(ゼロカウントデータのフィルタリング)
data <- data[data[,2]>0,]              #カウントが0より大きい行のみ抽出した結果をdataに格納
head(data)                             #確認してるだけです

#前処理(boxplot用;配列長の短い順にソート)
data <- data[order(data[,1]),]         #ソート
head(data)                             #確認してるだけです

#前処理(boxplot用;dataを分割するためのグループラベル情報作成)
f <- gl(param_bin, ceiling(nrow(data)/param_bin), nrow(data))#nrow(data)の要素数からなるベクトルを分割した因子ベクトルfを作成

#本番(正規化)
nf <- 1000/data[,1]                    #正規化係数を計算した結果をnfに格納
data[,2] <- data[,2] * nf              #正規化係数を各行に掛けた結果を元の位置に代入
head(data)                             #確認してるだけです

#ファイルに保存(boxplot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(f, log10(data[,2]), xlab="Length", ylab="log10(Count)")#boxplot
abline(h=1, col="red")                 #縦軸が1のところに水平線を引いている
dev.off()                              #おまじない
	

3. サンプルデータ4のカウントデータ(data_marioni.txt)と長さ情報(length_marioni.txt)が別々の場合:

18,110 genes×10 samplesのカウントデータファイルを一気に長さ補正するやり方です。

in_f1 <- "data_marioni.txt"            #入力ファイル名を指定してin_f1に格納(カウントデータファイル)
in_f2 <- "length_marioni.txt"          #入力ファイル名を指定してin_f2に格納(長さ情報ファイル)
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
len <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#in_f2で指定したファイルの読み込み
dim(data)                              #行数と列数を表示
dim(len)                               #行数と列数を表示
head(data)                             #確認してるだけです
head(len)                              #確認してるだけです
colSums(data)                          #列ごとの総リード数を表示

#本番(RPK正規化)
nf <- 1000/len[,1]                     #正規化係数(RPK補正用)を計算した結果をnfに格納
data <- sweep(data, 1, nf, "*")        #正規化係数を各行に掛けた結果をdataに格納
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. カウントデータファイル(SRR616268sub_count2.txt)と長さ情報ファイル(SRR616268sub_genelen2.txt)が別々の場合:

「マップ後 | カウント情報取得 | paired-end | ゲノム | アノテーション有 | QuasR(Gaidatzis_2015)」の例題2実行結果ファイル(と同じ)です。

in_f1 <- "SRR616268sub_count2.txt"     #入力ファイル名を指定してin_f1に格納(カウントデータファイル)
in_f2 <- "SRR616268sub_genelen2.txt"   #入力ファイル名を指定してin_f2に格納(長さ情報ファイル)
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
len <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#in_f2で指定したファイルの読み込み
dim(data)                              #行数と列数を表示
dim(len)                               #行数と列数を表示
head(data, n=8)                        #確認してるだけです
head(len, n=8)                         #確認してるだけです
colSums(data)                          #列ごとの総リード数を表示

#本番(RPK正規化)
nf <- 1000/len[,1]                     #正規化係数(RPK補正用)を計算した結果をnfに格納
data <- sweep(data, 1, nf, "*")        #正規化係数を各行に掛けた結果をdataに格納
head(data, n=8)                        #確認してるだけです

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

正規化 | 基礎 | RPM or CPM (総リード数補正)

カウントデータファイルを読み込んで、転写物ごとのリード数を「総リード数が100万 (million)だったときのリード数; Reads per million (RPM)」に変換するやり方を示します。 「リード数 = カウント数」なのでReadsのところをCountsに置き換えた表現(Counts per million; CPM)もときどき見受けられます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 配列長とカウント情報を含むファイル(sample_length_count.txt)の場合:

1-3列目がそれぞれ、gene ID, 配列長, カウント数からなるファイルです。

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 1000000                      #補正後の総リード数を指定(RPMにしたい場合はここの数値はそのまま)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです
sum(data[,2])                          #総リード数を表示

#本番(正規化)
nf <- param1/sum(data[,2])             #正規化係数を計算した結果をnfに格納
out <- data[,2] * nf                   #正規化係数を各列に掛けた結果をoutに格納
head(out)                              #RPM変換後の数値を表示
sum(out)                               #総リード数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data[,1], out)#「ID, 配列長, カウント情報」の並びにしたものをtmpに格納
colnames(tmp) <- c("ID", "Length", "Count")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 1000000                      #補正後の総リード数を指定(RPMにしたい場合はここの数値はそのまま)
param_nonDEG <- 2001:10000             #non-DEGの位置を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです
dim(data)                              #確認してるだけです
colSums(data)                          #総リード数を表示

#前処理(non-DEGデータのみ抽出)
data <- data[param_nonDEG,]            #param_nonDEGで指定した行の情報のみ抽出
head(data)                             #確認してるだけです
dim(data)                              #確認してるだけです
colSums(data)                          #総リード数を表示

#本番(正規化)
nf <- param1/colSums(data)             #正規化係数を計算した結果をnfに格納
data <- sweep(data, 2, nf, "*")        #正規化係数を各列に掛けた結果をdataに格納
head(data)                             #確認してるだけです
colSums(data)                          #総リード数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。non-DEGデータのみを正規化してM-A plotを作成しています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- 1000000                      #補正後の総リード数を指定(RPMにしたい場合はここの数値はそのまま)
param_nonDEG <- 2001:10000             #non-DEGの位置を指定
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(non-DEGデータのみ抽出)
data <- data[param_nonDEG,]            #param_nonDEGで指定した行の情報のみ抽出

#本番(正規化)
nf <- param1/colSums(data)             #正規化係数を計算した結果をnfに格納
data <- sweep(data, 2, nf, "*")        #正規化係数を各列に掛けた結果をdataに格納

#本番(M-A plot)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
G1 <- apply(as.matrix(data[,data.cl==1]), 1, mean)#遺伝子ごとにG1群の平均を計算した結果をG1に格納
G2 <- apply(as.matrix(data[,data.cl==2]), 1, mean)#遺伝子ごとにG2群の平均を計算した結果をG2に格納
M <- log2(G2) - log2(G1)               #M-A plotのM(y軸の値)に相当するものをMに格納)
A <- (log2(G1) + log2(G2))/2           #M-A plotのA(x軸の値)に相当するものをAに格納)
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
median(M, na.rm=TRUE)                  #M値(=log2(G2/G1))の中央値(Inf and -Infを含む)を表示
abline(h=median(M, na.rm=TRUE), col="black")#M値(=log2(G2/G1))の中央値を指定した色で表示

#ファイルに保存
tmp <- cbind(rownames(data), data, G1, G2, log2(G1), log2(G2), M, A)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。non-DEGデータのみを正規化してM-A plotを作成していろいろとハイライトさせるやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
param1 <- 1000000                      #補正後の総リード数を指定(RPMにしたい場合はここの数値はそのまま)
param_nonDEG <- 2001:10000             #non-DEGの位置を指定
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(non-DEGデータのみ抽出)
data <- data[param_nonDEG,]            #param_nonDEGで指定した行の情報のみ抽出

#本番(正規化)
nf <- param1/colSums(data)             #正規化係数を計算した結果をnfに格納
data <- sweep(data, 2, nf, "*")        #正規化係数を各列に掛けた結果をdataに格納

#本番(M-A plot)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
G1 <- apply(as.matrix(data[,data.cl==1]), 1, mean)#遺伝子ごとにG1群の平均を計算した結果をG1に格納
G2 <- apply(as.matrix(data[,data.cl==2]), 1, mean)#遺伝子ごとにG2群の平均を計算した結果をG2に格納
M <- log2(G2) - log2(G1)               #M-A plotのM(y軸の値)に相当するものをMに格納)
A <- (log2(G1) + log2(G2))/2           #M-A plotのA(x軸の値)に相当するものをAに格納)
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示

#後処理(いろいろな条件を満たすものを描画している)
obj <- "gene_2002"                     #ハイライトさせたい遺伝子名"gene_2002"を指定
points(A[obj], M[obj], col="red", cex=1.0, pch=20)#objがTRUEとなる要素のみ指定した色で描画

obj <- (M >= log2(4))                  #条件を満たすかどうかを判定した結果をobjに格納(4倍以上G2群で高発現な遺伝子)
points(A[obj], M[obj], col="blue", cex=0.8, pch=6)#objがTRUEとなる要素のみ指定した色で描画
sum(obj, na.rm=TRUE)                   #objがTRUEとなる要素数を表示させている

obj <- (A > 10)                        #条件を満たすかどうかを判定した結果をobjに格納(Aの値が10より大きい遺伝子)
points(A[obj], M[obj], col="lightblue", cex=0.8, pch=17)#objがTRUEとなる要素のみ指定した色で描画
sum(obj, na.rm=TRUE)                   #objがTRUEとなる要素数を表示させている
	

5. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。上記DEGを色分けするやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
param1 <- 1000000                      #補正後の総リード数を指定(RPMにしたい場合はここの数値はそのまま)
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_DEG_G1 <- 1:1800                 #G1群で高発現のDEGの位置を指定
param_DEG_G2 <- 1801:2000              #G2群で高発現のDEGの位置を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#本番(正規化)
nf <- param1/colSums(data)             #正規化係数を計算した結果をnfに格納
data <- sweep(data, 2, nf, "*")        #正規化係数を各列に掛けた結果をdataに格納

#本番(M-A plot)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
G1 <- apply(as.matrix(data[,data.cl==1]), 1, mean)#遺伝子ごとにG1群の平均を計算した結果をG1に格納
G2 <- apply(as.matrix(data[,data.cl==2]), 1, mean)#遺伝子ごとにG2群の平均を計算した結果をG2に格納
M <- log2(G2) - log2(G1)               #M-A plotのM(y軸の値)に相当するものをMに格納)
A <- (log2(G1) + log2(G2))/2           #M-A plotのA(x軸の値)に相当するものをAに格納)
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
median(M[param_nonDEG], na.rm=TRUE)    #non-DEGデータのM値(=log2(G2/G1))の中央値(Inf and -Infを含む)を表示
abline(h=median(M[param_nonDEG], na.rm=TRUE), col="black")#non-DEGデータのM値(=log2(G2/G1))の中央値を指定した色で表示

#後処理(いろいろな条件を満たすものを描画している)
obj <- param_DEG_G1                    #「G1群で高発現のDEG」という条件を指定
points(A[obj], M[obj], col="blue", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画

obj <- param_DEG_G2                    #「G2群で高発現のDEG」という条件を指定
points(A[obj], M[obj], col="red", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
	

6. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

上記DEGを色分けしてPNG形式ファイルとして保存するやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param1 <- 1000000                      #補正後の総リード数を指定(RPMにしたい場合はここの数値はそのまま)
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_DEG_G1 <- 1:1800                 #G1群で高発現のDEGの位置を指定
param_DEG_G2 <- 1801:2000              #G2群で高発現のDEGの位置を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#本番(正規化)
nf <- param1/colSums(data)             #正規化係数を計算した結果をnfに格納
data <- sweep(data, 2, nf, "*")        #正規化係数を各列に掛けた結果をdataに格納

#後処理(M-A plotのための基礎情報取得)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
G1 <- apply(as.matrix(data[,data.cl==1]), 1, mean)#遺伝子ごとにG1群の平均を計算した結果をG1に格納
G2 <- apply(as.matrix(data[,data.cl==2]), 1, mean)#遺伝子ごとにG2群の平均を計算した結果をG2に格納
M <- log2(G2) - log2(G1)               #M-A plotのM(y軸の値)に相当するものをMに格納)
A <- (log2(G1) + log2(G2))/2           #M-A plotのA(x軸の値)に相当するものをAに格納)

#ファイルに保存(M-A plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)",#M-A plotを描画
     ylim=c(-8, 6), pch=20, cex=.1)    #M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
median(M[param_nonDEG], na.rm=TRUE)    #non-DEGデータのM値(=log2(G2/G1))の中央値(Inf and -Infを含む)を表示
abline(h=median(M[param_nonDEG], na.rm=TRUE), col="black")#non-DEGデータのM値(=log2(G2/G1))の中央値を指定した色で表示
obj <- param_DEG_G1                    #「G1群で高発現のDEG」という条件を指定
points(A[obj], M[obj], col="blue", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
obj <- param_DEG_G2                    #「G2群で高発現のDEG」という条件を指定
points(A[obj], M[obj], col="red", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
legend("topright", c("DEG(G1)", "DEG(G2)", "non-DEG"), col=c("blue", "red", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

7. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

edgeRパッケージ中のcpm関数を用いるやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです
colSums(data)                          #総リード数を表示

#本番(正規化)
data <- cpm(data)                      #RPM正規化を実行した結果をdataに格納
head(data)                             #確認してるだけです
colSums(data)                          #総リード数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#おまけとして、RPM正規化後のデータでM-A plotを描画
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
	

8. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

6.をTCCパッケージを利用して行うやり方です。 各サンプルのリード数を100万ではなく平均リード数に揃えています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge8.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge8.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_DEG_G1 <- 1:1800                 #G1群で高発現のDEGの位置を指定
param_DEG_G2 <- 1801:2000              #G2群で高発現のDEGの位置を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#ファイルに保存(テキストファイル)
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(data), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
obj <- c(rep(1, length(param_DEG_G1)), #DEG or non-DEGの位置情報ベクトルをobjに格納
         rep(2, length(param_DEG_G2)),                           #DEG or non-DEGの位置情報ベクトルをobjに格納 
         rep(3, length(param_nonDEG))) #DEG or non-DEGの位置情報ベクトルをobjに格納
cols <- c("blue", "red", "black")      #色情報を指定してcolsに格納
plot(tcc, col=cols, col.tag=obj, normalize=T)#M-A plot
legend("topright", c("DEG(G1)", "DEG(G2)", "non-DEG"), col=c("blue", "red", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

9. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

2.をTCCパッケージを利用して行うやり方です。 各サンプルのリード数を100万ではなく平均リード数に揃えています。non-DEGデータのみを正規化してM-A plotを作成するやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge9.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge9.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[param_nonDEG,]            #param_nonDEGで指定した行の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#ファイルに保存(テキストファイル)
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(data), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, normalize=T)#M-A plot
dev.off()                              #おまじない
	

10. サンプルデータ41の20,689 genes×36 samplesのカウントデータ(sample_blekhman_36.txt)の場合:

in_f <- "sample_blekhman_36.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge10.txt"                  #出力ファイル名を指定してout_fに格納
param1 <- 1000000                      #補正後の総リード数を指定(RPMにしたい場合はここの数値はそのまま)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)                          #総リード数を表示

#本番(正規化)
nf <- param1/colSums(data)             #正規化係数を計算した結果をnfに格納
data <- sweep(data, 2, nf, "*")        #正規化係数を各列に掛けた結果をdataに格納
colSums(data)                          #総リード数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

正規化 | 基礎 | RPKM(Mortazavi_2008)

遺伝子(転写物)ごとのリード数を「配列長が1000 bp (kilobase)で総リード数が100万だったときのリード数; Reads per kilobase per million (RPKM)」に変換するやり方(Mortazavi et al., 2008)を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 配列長とカウント情報を含むファイル(sample_length_count.txt)の場合:

1-3列目がそれぞれ、gene ID, 配列長, カウント数からなるファイルです。出力ファイルの3列目がRPKMに変更されています。

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです
sum(data[,2])                          #総リード数を表示

#本番(正規化)
nf_RPM <- 1000000/sum(data[,2])        #正規化係数(RPM補正用)を計算した結果をnf_RPMに格納
nf_RPK <- 1000/data[,1]                #正規化係数(RPK補正用)を計算した結果をnf_RPKに格納
data[,2] <- data[,2] * nf_RPM * nf_RPK #正規化係数を各行に掛けた結果を元の位置に代入
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ4のdata_marioni.txtlength_marioni.txtの場合:

18,110 genes×10 samples (G1群5サンプル vs. G2群5サンプル)のカウントデータファイルと長さ情報ファイルです。

in_f1 <- "data_marioni.txt"            #入力ファイル名を指定してin_f1に格納(カウントデータファイル)
in_f2 <- "length_marioni.txt"          #入力ファイル名を指定してin_f2に格納(長さ情報ファイル)
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
len <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#in_f2で指定したファイルの読み込み
dim(data)                              #行数と列数を表示
dim(len)                               #行数と列数を表示
head(data)                             #確認してるだけです
head(len)                              #確認してるだけです
colSums(data)                          #列ごとの総リード数を表示

#本番(RPM正規化)
nf_RPM <- 1000000/colSums(data)        #正規化係数(RPM補正用)を計算した結果をnf_RPMに格納
data <- sweep(data, 2, nf_RPM, "*")    #正規化係数を各列に掛けた結果をdataに格納
head(data)                             #確認してるだけです
colSums(data)                          #列ごとの総リード数を表示

#本番(RPK正規化)
nf_RPK <- 1000/len[,1]                 #正規化係数(RPK補正用)を計算した結果をnf_RPKに格納
data <- sweep(data, 1, nf_RPK, "*")    #正規化係数を各行に掛けた結果をdataに格納
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. カウントデータファイル(SRR616268sub_count2.txt)と長さ情報ファイル(SRR616268sub_genelen2.txt)が別々の場合:

「マップ後 | カウント情報取得 | paired-end | ゲノム | アノテーション有 | QuasR(Gaidatzis_2015)」の例題2実行結果ファイル(と同じ)です。

in_f1 <- "SRR616268sub_count2.txt"     #入力ファイル名を指定してin_f1に格納(カウントデータファイル)
in_f2 <- "SRR616268sub_genelen2.txt"   #入力ファイル名を指定してin_f2に格納(長さ情報ファイル)
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
len <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#in_f2で指定したファイルの読み込み
dim(data)                              #行数と列数を表示
dim(len)                               #行数と列数を表示
head(data)                             #確認してるだけです
head(len)                              #確認してるだけです
colSums(data)                          #列ごとの総リード数を表示

#本番(RPM正規化)
nf_RPM <- 1000000/colSums(data)        #正規化係数(RPM補正用)を計算した結果をnf_RPMに格納
data <- sweep(data, 2, nf_RPM, "*")    #正規化係数を各列に掛けた結果をdataに格納
head(data)                             #確認してるだけです
colSums(data)                          #列ごとの総リード数を表示

#本番(RPK正規化)
nf_RPK <- 1000/len[,1]                 #正規化係数(RPK補正用)を計算した結果をnf_RPKに格納
data <- sweep(data, 1, nf_RPK, "*")    #正規化係数を各行に掛けた結果をdataに格納
head(data)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. 配列長とカウント情報を含むファイル(sample_length_count.txt)の場合:

例題1と同じですが、TPM (Transcripts Per Million) (Li et al., Bioinformatics, 2010)の計算手順との違いがわかるような書き方にしています。

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです
sum(data[,2])                          #総リード数を表示

#本番(RPM正規化)
nf_RPM <- 1000000/sum(data[,2])        #正規化係数(RPM補正用)を計算した結果をnf_RPMに格納
RPM <- data[,2] * nf_RPM               #正規化係数を掛けた結果をRPMに格納

#本番(RPK正規化)
nf_RPK <- 1000/data[,1]                #正規化係数(RPK補正用)を計算した結果をnf_RPKに格納
RPKM <- RPM * nf_RPK                   #正規化係数をRPMの各行に掛けた結果をRPKMに格納
head(RPKM)                             #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data[,1], RPKM)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

正規化 | 基礎 | TPM(Li_2010)

TPM (Transcripts Per Million) (Li et al., Bioinformatics, 2010)補正を行うやり方を示します。 RPKMは理論上RPM補正とRPK補正を同時に行っていますが、TPM補正は先にRPK補正をやってから"RPK補正後のデータを100万(one million)に揃える"やり方です。 補正後の数値の総和は、RPKMだとサンプル間で一致しないのに対して、TPMだと一致するというメリットがあります。 (サンプルごとのRPKM補正後の数値の総和を100万に揃えたものが、TPMという理解でよいはずです。) ちなみにTranscripts Per Millionの略としてTPMになっていますが、実際にはkilobaseに揃える配列長補正も行っています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 配列長とカウント情報を含むファイル(sample_length_count.txt)の場合:

1-3列目がそれぞれ、gene ID, 配列長, カウント数からなるファイルです。出力ファイルの3列目がTPMに変更されています。

in_f <- "sample_length_count.txt"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです
sum(data[,2])                          #総リード数を表示

#本番(RPK正規化)
nf_RPK <- 1000/data[,1]                #正規化係数(RPK補正用)を計算した結果をnf_RPKに格納
RPK <- data[,2] * nf_RPK               #正規化係数を各行に掛けた結果をRPKに格納
head(RPK)                              #確認してるだけです

#本番(RPM正規化)
nf_RPM <- 1000000/sum(RPK)             #正規化係数(RPM補正用)を計算した結果をnf_RPMに格納
TPM <- RPK * nf_RPM                    #正規化係数を掛けた結果をTPMに格納
head(TPM)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), data[,1], TPM)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

正規化 | サンプル内 | EDASeq(Risso_2011)

Risso et al., BMC Bioinformatics, 2011Fig.1を見ればわかりますが、 遺伝子のカウント数(発現量に相当;縦軸)をGC含量で横軸に展開してやるとunimodal(山が一つ、の意味)な分布になる傾向にあります。 つまり、GC含量が低すぎても高すぎてもカウント数が低くなり、中程度のときにタグカウント数が多くなる傾向にある、ということを言っているわけです。 彼らはこの傾向をYeastのRNA-seqデータ(同じgrowth conditionで得られた4つのcultures。これらはbiological replicatesとみなせるそうです。 そしてcultureごとに2 technical replicatesがある。計8列分のデータ; Y1, Y1, Y2, Y2, Y7, Y7, Y4, Y4; SRA048710)で示しています。 このデータから4 replicates vs. 4 replicatesの"null pseudo-dateset"を計choose(8,4)/2 = 35セットの「発現変動遺伝子(DEG)のないデータセット」を作成可能ですが、 GC含量が高いほどDEGとcallされる傾向にある(Fig.6)ことも示しています。 マイクロアレイではこのようなGC biasは見られませんので、library preparation時にこのようなbiasが導入されているんだろう(Benjamini and Speed, Nucleic Acids Res., 2012)と言われています。 Rissoらは、このGC biasを補正するための方法として、EDASeqパッケージ中でloess, median, FQ (full quantile)の三つの正規化法を提案し実装していますが、ここでは彼らの論文中で最もGC biasを補正できたというFQ正規化法のやり方を示します。 もちろんGC biasを補正するわけですから、入力データはいわゆる「遺伝子発現行列データ(count matrix)」以外に「遺伝子ごとのGC含量情報を含むベクトル情報」が必要です。

ここではサンプルデータ10のyeastRNASeqパッケージから取得可能な「2 samples vs 2 samples」のyeast RNA-seq dataset (7065 genes×4列; Lee et al., 2008)、 およびEDASeqパッケージから取得可能なSGD ver. r64に基づくyeast遺伝子のGC含量情報(6717 genes)を用いて一連の解析を行います。 発現情報とGC含量情報の対応付けが若干ややこしいですが、このあたりのテクニックは結構重要です。

尚、以下ではparam1のところで、"full"を指定することでfull quantile正規化(GCのbinごとにカウントの順位が同じものは同じカウントになるような正規化)を実現していますが、ここを以下のように変えることで他に三種類の異なる正規化を実行することができます:

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてある(or 出力ファイルを置きたい)ディレクトリに移動し以下をコピペ。

1. GC含量とカウント情報を含むファイル(sample_gc_count.txt)の場合:

in_f <- "sample_gc_count.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param1 <- "full"                       #正規化法(full quantile正規化の場合はこのまま)を指定
param2 <- 10                           #binの数を指定(デフォルトは10。何等分して正規化するかという意味)

#必要なパッケージをロード
library(EDASeq)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理
count <- as.matrix(data[,2])           #カウント情報部分を抽出
rownames(count) <- rownames(data)      #行名を付加
GC <- data.frame(GC=data[,1]/100)      #1/100してGC含量情報部分を抽出
rownames(GC) <- rownames(data)         #行名を付加
head(count)                            #確認してるだけです
head(GC)                               #確認してるだけです
data.cl <- c(rep(1, ncol(count)))      #行名を付加
es <- newSeqExpressionSet(exprs=count, #SeqExpressionSetというクラスにデータを格納
                   featureData=GC,     #SeqExpressionSetというクラスにデータを格納
                   phenoData=data.frame(conditions=data.cl))#SeqExpressionSetというクラスにデータを格納
es                                     #確認してるだけです

#本番(正規化)
out <- withinLaneNormalization(es, "GC", which=param1, num.bins=param2, round=FALSE)#正規化を実行した結果をoutに格納

#ファイルに保存
tmp <- cbind(rownames(data), GC, exprs(out))#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. GC含量とカウント情報を含むファイル(sample_gc_count.txt)の場合:

(どういう正規化係数がかかっているのかについて詳細な情報を出力している)

in_f <- "sample_gc_count.txt"          #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge2_before.png"           #出力ファイル名を指定してout_f1に格納(正規化前のbias plot)
out_f2 <- "hoge2_after.png"            #出力ファイル名を指定してout_f2に格納(正規化後のbias plot)
out_f3 <- "hoge2.txt"                  #出力ファイル名を指定してout_f3に格納
param1 <- "full"                       #正規化法(full quantile正規化の場合はこのまま)を指定
param2 <- 10                           #binの数を指定(デフォルトは10。何等分して正規化するかという意味)
param_fig <- c(500, 450)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(EDASeq)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理
count <- as.matrix(data[,2])           #カウント情報部分を抽出
rownames(count) <- rownames(data)      #行名を付加
GC <- data.frame(GC=data[,1]/100)      #1/100してGC含量情報部分を抽出
rownames(GC) <- rownames(data)         #行名を付加
head(count)                            #確認してるだけです
head(GC)                               #確認してるだけです
data.cl <- c(rep(1, ncol(count)))      #行名を付加
es <- newSeqExpressionSet(exprs=count, #SeqExpressionSetというクラスにデータを格納
                   featureData=GC,     #SeqExpressionSetというクラスにデータを格納
                   phenoData=data.frame(conditions=data.cl))#SeqExpressionSetというクラスにデータを格納
es                                     #確認してるだけです

#本番(正規化)
out <- withinLaneNormalization(es, "GC", which=param1, num.bins=param2, round=FALSE)#正規化を実行した結果をoutに格納
out2 <- withinLaneNormalization(es, "GC", which=param1, num.bins=param2, offset=TRUE)#正規化係数情報を取得した結果をout2に格納

#ファイルに保存
png(out_f1, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
biasPlot(es, "GC", log = T)            #正規化前のプロット(横軸:GC含量、縦軸:log(カウント))
dev.off()                              #おまじない

png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
biasPlot(out, "GC", log = T)           #正規化後のプロット(横軸:GC含量、縦軸:log(カウント))
dev.off()                              #おまじない

tmp <- cbind(rownames(data), data, exp(offst(out2)), exprs(out))#保存したい情報をtmpに格納
colnames(tmp) <- c("ID", "GC_contents", "Count(before)", "Norm_factor", "Count(after")#列名を付与
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. EDASeqパッケージ中の記述と似たやり方で示した場合:

param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param1 <- "full"                       #正規化法(full quantile正規化の場合は"full"のまま)を指定

#必要なパッケージをロード
library(yeastRNASeq)                   #パッケージの読み込み
library(EDASeq)                        #パッケージの読み込み

#count dataやGC含量情報(SGD ver. r64)の読み込みとラベル情報の作成
data(geneLevelData)                    #yeastRNASeqパッケージ中で提供されているデータをロード
data(yeastGC)                          #EDASeqパッケージ中で提供されているyeastのGC含量情報をロード
dim(geneLevelData)                     #行数と列数を表示
head(geneLevelData)                    #最初の数行を表示
length(yeastGC)                        #要素数を表示
head(yeastGC)                          #最初の数個を表示
head(rownames(geneLevelData))          #geneLevelData行列の行名(rownames)情報の最初の数個を表示
head(names(yeastGC))                   #yeastGCベクトルのnames属性情報の最初の数個を表示
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#カウントデータ情報(geneLevelData)とGC含量情報(yeastGC)から共通して存在するサブセットを(同じ遺伝子名の並びで)取得
common <- intersect(rownames(geneLevelData), names(yeastGC))#二つのベクトルから積集合(intersection)を抽出した結果をcommonに格納
length(common)                         #共通遺伝子数(正確にはcommonベクトルの要素数)を表示
data <- as.matrix(geneLevelData[common, ])#6685個の共通遺伝子分のカウントデータ行列を行列形式でdataに格納
GC <- data.frame(GC = yeastGC[common]) #6685個の共通遺伝子分のGC含量ベクトルをデータフレーム形式でGCに格納
head(rownames(data))                   #data行列の行名(rownames)情報の最初の数個を表示
head(rownames(GC))                     #GC行列の行名(rownames)情報の最初の数個を表示
es <- newSeqExpressionSet(exprs = data,#SeqExpressionSetというクラスにデータを格納
                   featureData = GC,   #SeqExpressionSetというクラスにデータを格納
                   phenoData = data.frame(conditions = data.cl,#SeqExpressionSetというクラスにデータを格納
                                     row.names = colnames(data)))#SeqExpressionSetというクラスにデータを格納
es                                     #esを表示

#横軸:GC含量、縦軸:log(count)のプロットを作成しbiasの有無をチェック
#(GC含量依存性があることがわかる。ちなみにbiasがない場合には水平線になる)
biasPlot(es, "GC", log = T, ylim = c(-1, 4))#プロット。G1群("mut_1" and "mut_2"に相当)のラベルが1, G2群("wt_1" and "wt_2"に相当)のラベルが2としてプロットされている。

#本番(full quantile(FQ)正規化)
out <- withinLaneNormalization(es, "GC", which = param1)#サンプル(列 or レーン)ごとに正規化を実行した結果をoutに格納

#横軸:GC含量、縦軸:log(count)のプロットを作成し正規化後の状態をチェック
#(GC含量依存性が緩和されていることがわかる。full quantileなのになぜ水平にならないんだろう。。。)
biasPlot(out, "GC", log = T, ylim = c(-1, 4))#プロット。G1群("mut_1" and "mut_2"に相当)のラベルが1, G2群("wt_1" and "wt_2"に相当)のラベルが2としてプロットされている。

#GC bias補正前後のカウントデータとGC含量の情報をファイルに出力したい場合
out_f1 <- "data_yeastGCbias_common_before.txt"#出力ファイル名1(補正前のカウントデータ)を指定
out_f2 <- "data_yeastGCbias_common_after.txt"#出力ファイル名2(補正後のカウントデータ)を指定
out_f3 <- "data_yeastGCbias_common_GCcontent.txt"#出力ファイル名3(GC含量のデータ)を指定
tmp <- cbind(rownames(exprs(es)), exprs(es))#補正前のカウント情報exprs(es)の左側にその行名(つまり遺伝子名)を結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
tmp <- cbind(rownames(exprs(out)), exprs(out))#補正前のカウント情報exprs(es)の左側にその行名(つまり遺伝子名)を結合した結果をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
tmp <- cbind(rownames(fData(es)), fData(es))#GC含量情報fData(es)の左側にその行名(つまり遺伝子名)を結合した結果をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#GC bias補正前後のoffset(logスケールでの補正前後の差、正規化係数のlog、に相当)ファイルに出力したい場合
out_f4 <- "data_yeastGCbias_common_offset.txt"#出力ファイル名4(offset情報)を指定
out2 <- withinLaneNormalization(es, "GC", which = param1, offset = TRUE)#サンプル(列 or レーン)ごとに正規化を実行した結果をoutに格納
head(offst(out2))                      #offset値(i.e., 正規化係数のlog)の最初の数行を表示
tmp <- cbind(rownames(offst(out2)), offst(out2))#offset情報offst(out2)の左側にその行名(つまり遺伝子名)を結合した結果をtmpに格納
write.table(tmp, out_f4, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#offsetと正規化前後の数値の関係を簡単に説明
head(exprs(out))                       #a. 正規化のカウントデータの最初の数行を表示
head(exprs(es))                        #b. 正規化のカウントデータの最初の数行を表示
head(exp(offst(out2)))                 #c. (logスケールのなので)オリジナルスケール上でのoffset値にした状態で最初の数行を表示
normalized <- exprs(es) * exp(offst(out2))#d. 「正規化前のカウントデータ」に「オリジナルスケールのoffset値」を掛けた結果をnormalizedに格納
head(normalized)                       #e. 掛け算(b * c)で得た正規化後のカウントデータnormalizedの最初の数行を表示(a.と微妙に異なっていることがわかる)
head(round(normalized))                #f. 「a.の正規化後のデータ」は、e.のnormalizedの実数の数値をround関数で最も近い整数値に丸めたものです。
	

4. 二つのタブ区切りテキストファイルの読み込みからやる場合:

7,065行×4列のyeast RNA-seqデータ(data_yeast_7065.txt; 2 wild-types vs. 2 mutant strains; technical replicates) 6,717 yeast genes (SGD ver. r64)のGC含量(yeastGC_6717.txt)

in_f1 <- "data_yeast_7065.txt"         #入力ファイル名(タグカウントファイル)を指定
in_f2 <- "yeastGC_6717.txt"            #入力ファイル名(GC含量情報を含むファイル)を指定
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param1 <- "full"                       #正規化法(full quantile正規化の場合は"full"のまま)を指定

#必要なパッケージをロード
library(EDASeq)                        #パッケージの読み込み

#count dataやGC含量情報の読み込みとラベル情報の作成
data.tmp <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
gc.tmp <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#in_f2で指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#カウントデータ情報(data.tmp)とGC含量情報(gc.tmp)から共通して存在するサブセットを(同じ遺伝子名の並びで)取得
common <- intersect(rownames(data.tmp), rownames(gc.tmp))#二つのベクトルから積集合(intersection)を抽出した結果をcommonに格納
length(common)                         #共通遺伝子数(正確にはcommonベクトルの要素数)を表示
data <- as.matrix(data.tmp[common, ])  #6685個の共通遺伝子分のカウントデータ行列を行列形式でdataに格納
GC <- data.frame(GC = gc.tmp[common, ])#6685個の共通遺伝子分のGC含量行列を行列形式でGCに格納
rownames(GC) <- common                 #行列GCにrownamesを代入している(消えてしまっているためです)
es <- newSeqExpressionSet(exprs = data,#SeqExpressionSetというクラスにデータを格納
                   featureData = GC,   #SeqExpressionSetというクラスにデータを格納
                   phenoData = data.frame(conditions = data.cl,#SeqExpressionSetというクラスにデータを格納
                                     row.names = colnames(data)))#SeqExpressionSetというクラスにデータを格納
es                                     #esを表示

#横軸:GC含量、縦軸:log(count)のプロットを作成しbiasの有無をチェック
#(GC含量依存性があることがわかる。ちなみにbiasがない場合には水平線になる)
biasPlot(es, "GC", log = T, ylim = c(-1, 4))#プロット。G1群("mut_1" and "mut_2"に相当)のラベルが1, G2群("wt_1" and "wt_2"に相当)のラベルが2としてプロットされている。

#本番(full quantile(FQ)正規化)
out <- withinLaneNormalization(es, "GC", which = param1)#サンプル(列 or レーン)ごとに正規化を実行した結果をoutに格納

#横軸:GC含量、縦軸:log(count)のプロットを作成し正規化後の状態をチェック
#(GC含量依存性が緩和されていることがわかる。full quantileなのになぜ水平にならないんだろう。。。)
biasPlot(out, "GC", log = T, ylim = c(-1, 4))#プロット。G1群("mut_1" and "mut_2"に相当)のラベルが1, G2群("wt_1" and "wt_2"に相当)のラベルが2としてプロットされている。

#GC bias補正前後のカウントデータとGC含量の情報をファイルに出力したい場合
out_f1 <- "data_yeastGCbias_common_before.txt"#出力ファイル名1(補正前のカウントデータ)を指定
out_f2 <- "data_yeastGCbias_common_after.txt"#出力ファイル名2(補正後のカウントデータ)を指定
out_f3 <- "data_yeastGCbias_common_GCcontent.txt"#出力ファイル名3(GC含量のデータ)を指定
tmp <- cbind(rownames(exprs(es)), exprs(es))#補正前のカウント情報exprs(es)の左側にその行名(つまり遺伝子名)を結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
tmp <- cbind(rownames(exprs(out)), exprs(out))#補正前のカウント情報exprs(es)の左側にその行名(つまり遺伝子名)を結合した結果をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
tmp <- cbind(rownames(fData(es)), fData(es))#GC含量情報fData(es)の左側にその行名(つまり遺伝子名)を結合した結果をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

正規化 | サンプル内 | RNASeqBias(Zheng_2011)

RNASeqBiasというRパッケージの正規化法の論文です。論文中では、GAM correction法と呼んでいます。 a simple generalized-additive-model based approachを用いてGC contentやgene lengthの補正を同時に行ってくれるようです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。


	

正規化 | サンプル間 | について

RNA-seqのサンプル間正規化法をまとめます。scRNA-seq用のプログラムは、2019年09月27日に 「正規化 | scRNA-seq | について」に移動させました。

R用:

R以外:

Review、ガイドライン、パイプライン系:

正規化 | サンプル間 | Upper-quartile(Bullard_2010)

Bullardら(2010)の各種統計的解析手法の評価論文で用いられた正規化法です。 マイクロアレイデータのときは「中央値(median)を揃える」などが行われたりしましたが、 「第3四分位数(upper-quartile or 75 percentile rank)の値を揃える」という操作を行うことに相当します。 EDASeqというパッケージを用いて正規化を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "data_hypodata_3vs3_UQ.txt"   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param1 <- "upper"                      #upper-quartile正規化法("upper")を指定

#必要なパッケージをロード
library(EDASeq)                        #パッケージの読み込み

#発現データの読み込みとSeqExpressionSetオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

es <- newSeqExpressionSet(exprs = as.matrix(data),#SeqExpressionSetというクラスにデータを格納
                   phenoData = data.frame(conditions = data.cl,#SeqExpressionSetというクラスにデータを格納
                                     row.names = colnames(data)))#SeqExpressionSetというクラスにデータを格納
es                                     #esを表示
summary(exprs(es))                     #発現データの要約統計量を表示(UQ値が揃っていないことがわかる; 3rd Qu.のところ)

#UQ正規化の実行
hoge <- betweenLaneNormalization(es, which=param1)#正規化を実行した結果をhogeに格納

#正規化後のデータをファイルに出力
normalized.count <- exprs(hoge)        #正規化後のデータを取り出してnormalized.countに格納
summary(normalized.count)              #正規化後のデータの要約統計量を表示(UQ値が75に揃っていることがわかる; 3rd Qu.のところ)
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみを用いて(logスケールで)boxplot
nonDEG <- 2001:10000                   #non-DEGの位置情報をnonDEGに格納
boxplot(log(normalized.count[nonDEG, ]))#boxplot (non-DEGなので分布が揃っているほどよい正規化法であることを意味する。一部0のlogをとろうとしているので警告が出る、、、が気にしない)

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみについて要約統計量を表示(サンプル間の数値が揃っているほどよい)
summary(normalized.count[nonDEG, ])    #各列(つまりサンプル)の要約統計量を表示
apply(normalized.count[nonDEG, ], 2, median)#各列(つまりサンプル)のmedian(中央値)を表示(16      16      16      20      19      19)
	

2. サンプルデータ10の7,065 genes×4 samplesの「複製あり」タグカウントデータ(data_yeast_7065.txt)

technical replicatesのデータ(mut群2サンプル vs. wt群2サンプル)です。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "data_yeast_7065_UQ.txt"      #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群(mut群)のサンプル数を指定
param_G2 <- 2                          #G2群(wt群)のサンプル数を指定
param1 <- "upper"                      #upper-quartile正規化法("upper")を指定

#必要なパッケージをロード
library(EDASeq)                        #パッケージの読み込み

#発現データの読み込みとSeqExpressionSetオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

es <- newSeqExpressionSet(exprs = as.matrix(data),#SeqExpressionSetというクラスにデータを格納
                   phenoData = data.frame(conditions = data.cl,#SeqExpressionSetというクラスにデータを格納
                                     row.names = colnames(data)))#SeqExpressionSetというクラスにデータを格納
es                                     #esを表示
summary(exprs(es))                     #発現データの要約統計量を表示(UQ値が揃っていないことがわかる; 3rd Qu.のところ; 51, 51, 42, 44)

#UQ正規化の実行
hoge <- betweenLaneNormalization(es, which=param1)#正規化を実行した結果をhogeに格納

#正規化後のデータをファイルに出力
normalized.count <- exprs(hoge)        #正規化後のデータを取り出してnormalized.countに格納
summary(normalized.count)              #正規化後のデータの要約統計量を表示(UQ値が47に揃っていることがわかる; 3rd Qu.のところ)
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

正規化 | サンプル間 | Quantile(Bullard_2010)

カウントデータの「サンプル(列)間でカウント数の順位が同じならばカウント数も同じ」になるような操作を行う正規化です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(limma)                         #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#本番
hoge <- normalizeBetweenArrays(as.matrix(data))#Quantile normalizationを実行し、結果をhogeに格納

#ファイルに保存
normalized.count <- exprs(hoge)        #正規化後のデータを取り出してnormalized.countに格納
summary(normalized.count)              #正規化後のデータの要約統計量を表示(分布が完全に揃っていることがわかる)
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

箱ひげ図(box plot)も作成しています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(EDASeq)                        #パッケージの読み込み

#発現データの読み込みとSeqExpressionSetオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

es <- newSeqExpressionSet(exprs=as.matrix(data),#SeqExpressionSetというクラスにデータを格納
              phenoData=data.frame(conditions=data.cl,#SeqExpressionSetというクラスにデータを格納
                             ow.names=colnames(data)))#SeqExpressionSetというクラスにデータを格納
es                                     #esを表示
summary(exprs(es))                     #発現データの要約統計量を表示(分布が揃っていないことがわかる)

#本番
hoge <- betweenLaneNormalization(es, which="full")#正規化を実行した結果をhogeに格納

#ファイルに保存
normalized.count <- exprs(hoge)        #正規化後のデータを取り出してnormalized.countに格納
summary(normalized.count)              #正規化後のデータの要約統計量を表示(分布が完全に揃っていることがわかる)
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#以下は(こんなこともできますという)おまけ
#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみを用いて(logスケールで)boxplot
nonDEG <- 2001:10000                   #non-DEGの位置情報をnonDEGに格納
boxplot(log(normalized.count[nonDEG, ]))#boxplot (non-DEGなので分布が揃っているほどよい正規化法であることを意味する。一部0のlogをとろうとしているので警告が出る、、、が気にしない)

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみについて要約統計量を表示(サンプル間の数値が揃っているほどよい)
summary(normalized.count[nonDEG, ])    #各列(つまりサンプル)の要約統計量を表示
apply(normalized.count[nonDEG, ], 2, median)#各列(つまりサンプル)のmedian(中央値)を表示(16      16      16      20      19      19)
	

3. サンプルデータ10の7,065 genes×4 samplesのカウントデータ(data_yeast_7065.txt)

technical replicatesのデータ(mut群2サンプル vs. wt群2サンプル)です。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(EDASeq)                        #パッケージの読み込み

#発現データの読み込みとSeqExpressionSetオブジェクトの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

es <- newSeqExpressionSet(exprs=as.matrix(data),#SeqExpressionSetというクラスにデータを格納
              phenoData=data.frame(conditions=data.cl,#SeqExpressionSetというクラスにデータを格納
                             ow.names=colnames(data)))#SeqExpressionSetというクラスにデータを格納
es                                     #esを表示
summary(exprs(es))                     #発現データの要約統計量を表示(分布が揃っていないことがわかる)

#本番
hoge <- betweenLaneNormalization(es, which="full")#正規化を実行した結果をhogeに格納

#ファイルに保存
normalized.count <- exprs(hoge)        #正規化後のデータを取り出してnormalized.countに格納
summary(normalized.count)              #正規化後のデータの要約統計量を表示(分布が完全に揃っていることがわかる)
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

正規化 | サンプル間 | 2群間 | 複製あり | iDEGES/edgeR(Sun_2013)

TCCパッケージ(Sun et al., BMC Bioinformatics, 2013)から利用可能なiDEGES/edgeR正規化法の実行手順を示します。 iDEGES/edgeRは、TbT正規化法(Kadota et al., Algorithms Mol. Biol., 2012) 以上の理論性能かつ100倍程度高速(デフォルトの場合)化を実現したお勧めの正規化法です。

ここでは、iDEGES/edgeR法の実体である「TMM-(edgeR-TMM)n」パイプラインのnの値(iterationの回数)を3として実行します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
head(normalized)                       #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

M-A plotを作成したり、non-DEGの分布についても確認しています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_DEG_G1 <- 1:1800                 #G1群で高発現のDEGの位置を指定
param_DEG_G2 <- 1801:2000              #G2群で高発現のDEGの位置を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
data <- getNormalizedData(tcc)         #正規化後のデータを取り出してdataに格納

#本番(M-A plot)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
G1 <- apply(as.matrix(data[,data.cl==1]), 1, mean)#遺伝子ごとにG1群の平均を計算した結果をG1に格納
G2 <- apply(as.matrix(data[,data.cl==2]), 1, mean)#遺伝子ごとにG2群の平均を計算した結果をG2に格納
M <- log2(G2) - log2(G1)               #M-A plotのM(y軸の値)に相当するものをMに格納)
A <- (log2(G1) + log2(G2))/2           #M-A plotのA(x軸の値)に相当するものをAに格納)
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
median(M[param_nonDEG], na.rm=TRUE)    #non-DEGデータのM値(=log2(G2/G1))の中央値(Inf and -Infを含む)を表示
abline(h=median(M[param_nonDEG], na.rm=TRUE), col="black")#non-DEGデータのM値(=log2(G2/G1))の中央値を指定した色で表示

#後処理(いろいろな条件を満たすものを描画している)
obj <- param_DEG_G1                    #「G1群で高発現のDEG」という条件を指定
points(A[obj], M[obj], col="blue", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画

obj <- param_DEG_G2                    #「G2群で高発現のDEG」という条件を指定
points(A[obj], M[obj], col="red", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画

legend("topright", c("DEG(G1)", "DEG(G2)", "non-DEG"), col=c("blue", "red", "black"), pch=20)#凡例を作成

#non-DEGの分布を確認している
summary(data[param_nonDEG,])           #正規化後のnon-DEGデータの要約統計量を表示
apply(data[param_nonDEG,], 2, median)  #正規化後のnon-DEGデータの中央値を表示
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

M-A plotをpng形式ファイルで保存するやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_DEG_G1 <- 1:1800                 #G1群で高発現のDEGの位置を指定
param_DEG_G2 <- 1801:2000              #G2群で高発現のDEGの位置を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
data <- getNormalizedData(tcc)         #正規化後のデータを取り出してdataに格納

#後処理(M-A plotのための基礎情報取得)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
G1 <- apply(as.matrix(data[,data.cl==1]), 1, mean)#遺伝子ごとにG1群の平均を計算した結果をG1に格納
G2 <- apply(as.matrix(data[,data.cl==2]), 1, mean)#遺伝子ごとにG2群の平均を計算した結果をG2に格納
M <- log2(G2) - log2(G1)               #M-A plotのM(y軸の値)に相当するものをMに格納)
A <- (log2(G1) + log2(G2))/2           #M-A plotのA(x軸の値)に相当するものをAに格納)

#ファイルに保存(M-A plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)",#M-A plotを描画
     ylim=c(-8, 6), pch=20, cex=.1)    #M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
median(M[param_nonDEG], na.rm=TRUE)    #non-DEGデータのM値(=log2(G2/G1))の中央値(Inf and -Infを含む)を表示
abline(h=median(M[param_nonDEG], na.rm=TRUE), col="black")#non-DEGデータのM値(=log2(G2/G1))の中央値を指定した色で表示
obj <- param_DEG_G1                    #「G1群で高発現のDEG」という条件を指定
points(A[obj], M[obj], col="blue", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
obj <- param_DEG_G2                    #「G2群で高発現のDEG」という条件を指定
points(A[obj], M[obj], col="red", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
legend("topright", c("DEG(G1)", "DEG(G2)", "non-DEG"), col=c("blue", "red", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

4. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

TCCパッケージ中のplot関数を使ってシンプルにM-A plotをpng形式ファイルで保存するやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_DEG_G1 <- 1:1800                 #G1群で高発現のDEGの位置を指定
param_DEG_G2 <- 1801:2000              #G2群で高発現のDEGの位置を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#ファイルに保存(M-A plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
obj <- c(rep(1, length(param_DEG_G1)), #DEG or non-DEGの位置情報ベクトルをobjに格納
         rep(2, length(param_DEG_G2)),                           #DEG or non-DEGの位置情報ベクトルをobjに格納 
         rep(3, length(param_nonDEG))) #DEG or non-DEGの位置情報ベクトルをobjに格納
cols <- c("blue", "red", "black")      #色情報を指定してcolsに格納
plot(tcc, col=cols, col.tag=obj, ylim=c(-8, 6), median.lines=TRUE)#M-A plot
legend("topright", c("DEG(G1)", "DEG(G2)", "non-DEG"), col=c("blue", "red", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

正規化 | サンプル間 | 2群間 | 複製あり | DEGES/TbT(Kadota_2012)

TbT法の正規化における基本戦略は「正規化時に悪さをするDEGを正規化前に除いてしまえ (DEG elimination strategy; DEGES; でげす)」です。 通常のDEG検出手順は「1.データ正規化( → 2.DEG検出)」の2ステップで完結するため、上記コンセプトを実現することができません。そこで通常の手順を二回繰返す解析パイプラインを提案しています。 つまり「1.データ正規化 → 2.DEG検出 → 3.データ正規化( → 4.DEG検出)」です。この手順で行えばStep3のデータ正規化時にStep2で検出されたDEG候補を除いたデータで正規化を行うことができるのです。 TbT法の実体は、「1.TMM法(Robinson and Oshlack, 2010) → 2.baySeq (Hardcastle and Kelly, 2010) → 3.TMM法」の解析パイプラインです。Step1で既存正規化法の中で高性能なTMM法を採用し、 Step2で(Step1で得られたTMM正規化係数と総リード数(library sizes)を掛けて得られた)effective library sizesを与えてbaySeqを実行してDEG候補を取得し、 Step3でnon-DEGsのみで再度TMM正規化を実行して得られたものがTbT正規化係数です。従って、TbT正規化法を利用する場合は、内部的に用いられた文献も引用するようにお願いします。

以下のスクリプトを実行すると概ね数十分程度はかかります(*_*)...。これは、TbT法の内部で計算時間のかかるbaySeqを利用しているためです。 動作確認のみしたい、という人はparam_samplesizeのところで指定する数値を500とかにして実行してください。おそらく数分で結果を得られると思われます。 ここでは、TbT正規化係数の算出法とTbT正規化後のデータを得る手順などを示しています。 が、基本的に正規化だけで終わることはありませんので、ここの項目のみでは何の役にも立ちませんのであしからず。。。

また、サンプルデータ14 (data_hypodata_1vs1.txt)の1 sample vs. 1 sampleのような「複製なし」データの正規化は実行できません(理由はstep2で用いるbaySeqが複製ありを前提としているためです)のでご注意ください。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_samplesize <- 10000              #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm",#正規化を実行した結果をtccに格納
               test.method="bayseq", samplesize=param_samplesize)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
head(normalized)                       #確認してるだけです

tmp <- cbind(rownames(normalized), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみを用いて(logスケールで)boxplot
nonDEG <- 2001:10000                   #non-DEGの位置情報をnonDEGに格納
boxplot(log(normalized[nonDEG, ]))#boxplot (non-DEGなので分布が揃っているほどよい正規化法であることを意味する。一部0のlogをとろうとしているので警告が出る、、、が気にしない)

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみについて要約統計量を表示(サンプル間の数値が揃っているほどよい)
summary(normalized[nonDEG, ])    #各列(つまりサンプル)の要約統計量を表示
apply(normalized[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のシミュレーション解析の時に用いるfieldを有効にしている
tcc$simulation$trueDEG <- c(rep(1, 1800), rep(2, 200), rep(0, 8000))#真の情報からなるベクトルをtccクラスオブジェクトに格納
plot(tcc, median.lines=TRUE)           #log-ratio(縦軸の値)のmedian値をそれぞれの色で表示:non-DEG(黒; 0.049), G1で高発現のDEG(青; -1.942), G2で高発現のDEG(赤; 2.061)
	

2. サンプルデータ10の7,065 genes×4 samplesのカウントデータ(data_yeast_7065.txt)

technical replicatesのデータ(mut群2サンプル vs. wt群2サンプル)です。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 2                          #G2群のサンプル数を指定
param_samplesize <- 10000              #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm",#正規化を実行した結果をtccに格納
               test.method="bayseq", samplesize=param_samplesize)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(normalized), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#TbT正規化のstep2で検出されたpotential DEGの結果(step3で使われないものたち)を表示
table(tcc$private$DEGES.potentialDEG)  #0 (nonDEGに相当)が3,927個、1 (G1で高発現のDEGに相当)が1,604個、2 (G2で高発現のDEGに相当)が1,534個と判定されていたことがわかる。実に100*(1604+1534)/7065=44.416%がDEGと判定されていることになるがtechnical replicatesのデータなので妥当といえば妥当。

#TbT正規化係数を表示
tcc$norm.factors                       #正規化係数を表示(1.1456801 1.1463897 0.8556477 0.8522824)
	

3. サンプルデータ10の7,065 genes×4 samplesの「複製あり」タグカウントデータ(data_yeast_7065.txt)

このデータはどのサンプルでも発現していない(zero count; ゼロカウント)ものが多いので、 どこかのサンプルで0より大きいカウントのもののみからなるサブセットを抽出して2.と同様の計算を行っています。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 2                          #G2群のサンプル数を指定
param_samplesize <- 10000              #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)
param_lowcount <- 0                    #低発現遺伝子のフィルタリングを行う際の閾値。遺伝子(行)ごとにカウントの総和を計算し、ここで指定した値よりも大きいものだけがその後の解析に用いられる

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
dim(tcc$count)                         #カウント行列の行数と列数を表示(7065行4列)

#フィルタリングの実行(低発現のものを除去)
tcc <- filterLowCountGenes(tcc, low.count = param_lowcount)#param_lowcountで指定した閾値より大きい総カウント数をもつ遺伝子のみを抽出している
dim(tcc$count)                         #カウント行列の行数と列数を表示(6508行4列になっていることがわかる)

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm",#正規化を実行した結果をtccに格納
               test.method="bayseq", samplesize=param_samplesize)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(normalized), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#TbT正規化のstep2で検出されたpotential DEGの結果(step3で使われないものたち)を表示
table(tcc$private$DEGES.potentialDEG)  #0 (nonDEGに相当)が3,285個、1 (G1で高発現のDEGに相当)が1,656個、2 (G2で高発現のDEGに相当)が1,567個と判定されていたことがわかる

#TbT正規化係数を表示
tcc$norm.factors                       #正規化係数を表示(1.1448574 1.1433478 0.8578253 0.8539695)
	

正規化 | サンプル間 | 2群間 | 複製あり | TMM(Robinson_2010)

前処理 | についてでも述べていますがNGSデータはマイクロアレイに比べてダイナミックレンジが広いという利点はあるとは思いますが、 RPM(やRPKM)で実装されているいわゆるグローバル正規化に基づく方法はごく少数の高発現遺伝子の発現レベルの影響をもろに受けます。 そしてこれらが比較するサンプル間で発現変動している場合には結論が大きく変わってしまいます。なぜなら総リード数に占める高発現の発現変動遺伝子(Differentially Expressed Genes; DEGs)のリード数の割合が大きいからです。

RobinsonらはMarioniら(2008)の「腎臓 vs. 肝臓」データの比較において実際にこのような現象が起きていることを(housekeeping遺伝子の分布を真として)示し、 少数の高発現遺伝子の影響を排除するためにtrimmed mean of M values (TMM)という正規化法を提案しています(Robinson and Oshlack, 2010)。

この方法はRのedgeRというパッケージ中にcalcNormFactorsという名前の関数で存在します。 また、この方法はTCCパッケージ中の関数を用いても実行可能です。 TCCパッケージから得られる(TMM)正規化係数は「正規化係数の平均が1になるようにさらに正規化したもの」であるため、両者の正規化係数に若干の違いがありますが細かいことは気にする必要はありません。

ここでは、正規化係数の算出と正規化後のデータを得る手順などを示していますが、基本的に正規化だけで終わることはありませんので、ここの項目のみでは何の役にも立ちませんのであしからず。。。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(normalized), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみを用いて(logスケールで)boxplot
nonDEG <- 2001:10000                   #non-DEGの位置情報をnonDEGに格納
boxplot(log(normalized[nonDEG, ]))#boxplot (non-DEGなので分布が揃っているほどよい正規化法であることを意味する。一部0のlogをとろうとしているので警告が出る、、、が気にしない)

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみについて要約統計量を表示(サンプル間の数値が揃っているほどよい)
summary(normalized[nonDEG, ])    #各列(つまりサンプル)の要約統計量を表示
apply(normalized[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のシミュレーション解析の時に用いるfieldを有効にしている
tcc$simulation$trueDEG <- c(rep(1, 1800), rep(2, 200), rep(0, 8000))#真の情報からなるベクトルをtccクラスオブジェクトに格納
plot(tcc, median.lines=TRUE)           #log-ratio(縦軸の値)のmedian値をそれぞれの色で表示:non-DEG(黒; 0.152), G1で高発現のDEG(青; -1.840), G2で高発現のDEG(赤; 2.164)
	

2. サンプルデータ10の7,065 genes×4 samplesの「複製あり」タグカウントデータ(data_yeast_7065.txt)

technical replicatesのデータ(mut群2サンプル vs. wt群2サンプル)です。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 2                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(normalized), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#TMM正規化係数を表示
tcc$norm.factors                       #正規化係数を表示(1.1391738 1.1395812 0.8596891 0.8615559)
	

3. サンプルデータ10の7,065 genes×4 samplesの「複製あり」タグカウントデータ(data_yeast_7065.txt)

technical replicatesのデータ(mut群2サンプル vs. wt群2サンプル)です。 TCCを使わずにedgeRパッケージ内の関数を用いて2.と同じ結果を出すやり方です。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 2                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#TMM正規化本番
d <- DGEList(counts=data, group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #正規化係数を計算
d$samples$norm.factors                 #edgeRパッケージから得られる正規化係数そのものを表示(1.1504029 1.1508142 0.8681632 0.8700484)
mean(d$samples$norm.factors)           #正規化係数の平均が1でないことがわかる(1.009857)
norm.factors <- d$samples$norm.factors/mean(d$samples$norm.factors)#正規化係数の平均が1になるように正規化したものがTCCパッケージで得られるものと同じです
norm.factors                           #TCCパッケージから得られるTMM正規化係数と同じになっていることがわかる(1.1391738 1.1395812 0.8596891 0.8615559)

#正規化後のデータをファイルに出力
ef.libsizes <- colSums(data)*norm.factors#effective library sizesというのはlibrary sizesに正規化係数を掛けたものなのでそれを計算した結果をef.libsizesに格納
normalized.count <- sweep(data, 2, mean(ef.libsizes)/ef.libsizes, "*")#正規化後のデータを取り出してnormalized.countに格納
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

正規化 | サンプル間 | 2群間 | 複製あり | median(Anders_2010)

DESeqというRパッケージ中で採用されている正規化法を採用して得られた正規化後のデータを得るやり方を示します。

DESeqは正規化係数(normalization factor)という言葉を使わずにsize factorという言葉を使っています。 これはTbTやTMM正規化係数とは異なるものなので、ここでは「DESeqの正規化係数」を得ています。 また、この方法はTCCパッケージ中の関数を用いても実行可能です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1.サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(normalized), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみを用いて(logスケールで)boxplot
nonDEG <- 2001:10000                   #non-DEGの位置情報をnonDEGに格納
boxplot(log(normalized[nonDEG, ]))#boxplot (non-DEGなので分布が揃っているほどよい正規化法であることを意味する。一部0のlogをとろうとしているので警告が出る、、、が気にしない)

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみについて要約統計量を表示(サンプル間の数値が揃っているほどよい)
summary(normalized[nonDEG, ])    #各列(つまりサンプル)の要約統計量を表示
apply(normalized[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のシミュレーション解析の時に用いるfieldを有効にしている
tcc$simulation$trueDEG <- c(rep(1, 1800), rep(2, 200), rep(0, 8000))#真の情報からなるベクトルをtccクラスオブジェクトに格納
plot(tcc, median.lines=TRUE)           #log-ratio(縦軸の値)のmedian値をそれぞれの色で表示:non-DEG(黒; 0.186), G1で高発現のDEG(青; -1.809), G2で高発現のDEG(赤; 2.196)
	

2. サンプルデータ10の7,065 genes×4 samplesの「複製あり」タグカウントデータ(data_yeast_7065.txt)

technical replicatesのデータ(mut群2サンプル vs. wt群2サンプル)です。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 2                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(normalized), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#正規化係数を表示
tcc$norm.factors                       #正規化係数を表示(1.1431946 1.1408795 0.8568723 0.8590536)

#正規化後のデータの列ごとの各種要約統計量を表示
summary(normalized)                    #normalizedの各列(つまりサンプル)の要約統計量を表示
	

3. サンプルデータ10の7,065 genes×4 samplesの「複製あり」タグカウントデータ(data_yeast_7065.txt)

technical replicatesのデータ(mut群2サンプル vs. wt群2サンプル)です。 TCCを使わずにDESeqパッケージ内の関数を用いて2.と同じ結果を出すやり方です。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 2                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(DESeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#Anders and Huberの(AH)正規化本番
cds <- newCountDataSet(data, data.cl)  #CountDataSetオブジェクトを作成してcdsに格納
cds <- estimateSizeFactors(cds)        #size factorを計算し、結果をcdsに格納
sizeFactors(cds)                       #これがDESeqのsize factorsです(1.1365363 1.1272941 0.8835836 0.9287529)
norm.factors <- sizeFactors(cds)/colSums(data)#DESeqのsize factorsから「DESeqの正規化係数(これの平均が1になるとは限らない)」をnorm.factorsに格納
norm.factors <- norm.factors/mean(norm.factors)#正規化係数の平均が1になるように正規化した「これ(norm.factors)」がTCCパッケージで得られる「DESeqの正規化係数」です
norm.factors                           #norm.factorsの中身を表示(1.1431946 1.1408795 0.8568723 0.8590536)。TCCパッケージから得られる「DESeqの正規化係数」と同じになっていることがわかる。

#正規化後のデータをファイルに出力
sizeFactors(cds) <- sizeFactors(cds)/mean(sizeFactors(cds))#正規化後のデータ取得自体は「DESeqの正規化係数」とは無関係に取得可能であるが、TCC経由で得られるものと同じにするためにsize factorsの平均が1になるように正規化している
normalized.count <- counts(cds, normalized=TRUE)#正規化後のデータを取り出してnormalized.countに格納
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータの列ごとの各種要約統計量を表示
summary(normalized.count)              #normalized.countの各列(つまりサンプル)の要約統計量を表示
	

4. サンプルデータ10の7,065 genes×4 samplesの「複製あり」タグカウントデータ(data_yeast_7065.txt)

technical replicatesのデータ(mut群2サンプル vs. wt群2サンプル)です。 DESeqパッケージ内の関数を用いてDESeqパッケージ内のマニュアル通りにやった場合。 若干数値が違ってきます(ということを示したいだけです)が正規化後の値の要約統計量をどこに揃えるか程度の違いなので気にする必要はないです。 実際、ここで得られるsize factorsの平均は1.019042ですが、この定数値を正規化後のデータに掛けるとTCCで得られるデータと同じになります。

in_f <- "data_yeast_7065.txt"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 2                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(DESeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#Anders and Huberの(AH)正規化本番
cds <- newCountDataSet(data, data.cl)  #CountDataSetオブジェクトを作成してcdsに格納
cds <- estimateSizeFactors(cds)        #size factorを計算し、結果をcdsに格納

#正規化後のデータをファイルに出力
normalized.count <- counts(cds, normalized=TRUE)#正規化後のデータを取り出してnormalized.countに格納
tmp <- cbind(rownames(normalized.count), normalized.count)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータの列ごとの各種要約統計量を表示
summary(normalized.count)              #normalized.countの各列(つまりサンプル)の要約統計量を表示
	

正規化 | サンプル間 | 2群間 | 複製なし | iDEGES/DESeq(Sun_2013)

iDEGES/edgeR法(Sun et al., BMC Bioinformatics, 2013)は、サンプルデータ14 (data_hypodata_1vs1.txt)の1 sample vs. 1 sampleのような「複製なし」データの正規化は実行できません。 理由はstep2で用いるexact test(iDEGES/edgeR法の場合)が複製ありを前提としているためです。 iDEGES/DESeq法(Sun et al., BMC Bioinformatics, 2013)は複製なしの二群間比較用データの正規化を「正規化時に悪さをするDEGを正規化前に除いてしまえ (DEG elimination strategy; DEGES; でげす)」というTbT法論文(Kadota et al., 2012)で提唱した戦略を DESeqパッケージ中の関数(正規化法やDEG検出法)のみで実現したDESeq-(DESeq-DESeq)n(デフォルトはn=3)からなるパイプラインです。 ここでは、iDEGES/DESeq正規化係数の算出法とiDEGES/DESeq正規化後のデータを得る手順などを示しています。 が、基本的に正規化だけで終わることはありませんので、ここの項目のみでは何の役にも立ちませんのであしからず。。。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定    
param_G2 <- 1                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, iteration=3)#正規化を実行した結果をtccに格納(iDEGES/edgeRのときと同じコマンドだが、内部的にカウント行列の列数で自動判定してiDEGES/DESeqを採用している)

#正規化後のデータをファイルに出力
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(normalized), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみを用いて(logスケールで)boxplot
nonDEG <- 2001:10000                   #non-DEGの位置情報をnonDEGに格納
boxplot(log(normalized[nonDEG, ]))#boxplot (non-DEGなので分布が揃っているほどよい正規化法であることを意味する。一部0のlogをとろうとしているので警告が出る、、、が気にしない)

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみについて要約統計量を表示(サンプル間の数値が揃っているほどよい)
summary(normalized[nonDEG, ])    #各列(つまりサンプル)の要約統計量を表示
apply(normalized[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のシミュレーション解析の時に用いるfieldを有効にしている
tcc$simulation$trueDEG <- c(rep(1, 1800), rep(2, 200), rep(0, 8000))#真の情報からなるベクトルをtccクラスオブジェクトに格納
plot(tcc, median.lines=TRUE)           #log-ratio(縦軸の値)のmedian値をそれぞれの色で表示:non-DEG(黒; 0.110), G1で高発現のDEG(青; -1.890), G2で高発現のDEG(赤; 2.163)
	

正規化 | サンプル間 | 2群間 | 複製なし | TMM(Robinson_2010)

TMM正規化法をTCCパッケージを用いて行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定    
param_G2 <- 1                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(normalized), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみを用いて(logスケールで)boxplot
nonDEG <- 2001:10000                   #non-DEGの位置情報をnonDEGに格納
boxplot(log(normalized[nonDEG, ]))#boxplot (non-DEGなので分布が揃っているほどよい正規化法であることを意味する。一部0のlogをとろうとしているので警告が出る、、、が気にしない)

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみについて要約統計量を表示(サンプル間の数値が揃っているほどよい)
summary(normalized[nonDEG, ])    #各列(つまりサンプル)の要約統計量を表示
apply(normalized[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のシミュレーション解析の時に用いるfieldを有効にしている
tcc$simulation$trueDEG <- c(rep(1, 1800), rep(2, 200), rep(0, 8000))#真の情報からなるベクトルをtccクラスオブジェクトに格納
plot(tcc, median.lines=TRUE)           #log-ratio(縦軸の値)のmedian値をそれぞれの色で表示:non-DEG(黒; 0.161), G1で高発現のDEG(青; -1.839), G2で高発現のDEG(赤; 2.213)
	

正規化 | サンプル間 | 2群間 | 複製なし | median(Anders_2010)

DESeqというRパッケージ中で採用されている正規化法を採用して得られた正規化後のデータを得るやり方を示します。

DESeqは正規化係数(normalization factor)という言葉を使わずにsize factorという言葉を使っています。 これはTbTやTMM正規化係数とは異なるものなので、ここでは「DESeqの正規化係数」を得ています。 また、この方法はTCCパッケージ中の関数を用いても実行可能です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定    
param_G2 <- 1                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0)#正規化を実行した結果をtccに格納

#正規化後のデータをファイルに出力
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(normalized), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存


#以下は(こんなこともできますという)おまけ
#正規化後のデータでM-A plotを描画
plot(tcc)                              #M-A plotを描画

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみを用いて(logスケールで)boxplot
nonDEG <- 2001:10000                   #non-DEGの位置情報をnonDEGに格納
boxplot(log(normalized[nonDEG, ]))#boxplot (non-DEGなので分布が揃っているほどよい正規化法であることを意味する。一部0のlogをとろうとしているので警告が出る、、、が気にしない)

#正規化後のデータでnon-DEGsに相当する2001-10000行目のデータのみについて要約統計量を表示(サンプル間の数値が揃っているほどよい)
summary(normalized[nonDEG, ])    #各列(つまりサンプル)の要約統計量を表示
apply(normalized[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のシミュレーション解析の時に用いるfieldを有効にしている
tcc$simulation$trueDEG <- c(rep(1, 1800), rep(2, 200), rep(0, 8000))#真の情報からなるベクトルをtccクラスオブジェクトに格納
plot(tcc, median.lines=TRUE)           #log-ratio(縦軸の値)のmedian値をそれぞれの色で表示:non-DEG(黒; 0.186), G1で高発現のDEG(青; -1.809), G2で高発現のDEG(赤; 2.196)
	

正規化 | サンプル間 | 3群間 | 複製あり | iDEGES/edgeR(Sun_2013)

TCCパッケージ(Sun et al., BMC Bioinformatics, 2013)から利用可能なiDEGES/edgeR正規化法の実行手順を示します。

ここでは、iDEGES/edgeR法の実体である「TMM-(edgeR-TMM)n」パイプラインのnの値(iterationの回数)を3として実行します。RPKMのような長さ補正は行っていませんのでご注意ください。ここの出力結果はRPMに相当するものです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で高発現、gene_2101〜gene_2700がG2群で高発現、gene_2701〜gene_3000がG3群で高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
head(normalized)                       #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で高発現、gene_2101〜gene_2700がG2群で高発現、gene_2701〜gene_3000がG3群で高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

non-DEGの分布について確認しています。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_nonDEG <- 3001:10000             #non-DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
head(normalized)                       #確認してるだけです

#non-DEGの分布を確認(揃っているほどよい正規化法)
summary(normalized[param_nonDEG,])     #正規化後のnon-DEGデータの要約統計量を表示
apply(normalized[param_nonDEG,], 2, median)#正規化後のnon-DEGデータの中央値を表示
	

3. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
head(normalized)                       #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

non-DEGの分布について確認しています。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_nonDEG <- 3001:10000             #non-DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
head(normalized)                       #確認してるだけです

#non-DEGの分布を確認(揃っているほどよい正規化法)
summary(normalized[param_nonDEG,])     #正規化後のnon-DEGデータの要約統計量を表示
apply(normalized[param_nonDEG,], 2, median)#正規化後のnon-DEGデータの中央値を表示
	

正規化 | サンプル間 | 3群間 | 複製あり | TMM(Robinson_2010)

edgeRパッケージから利用可能なTMM正規化法(Robinson and Oshlack, Genome Biol., 2010)の実行手順を示します。RPKMのような長さ補正は行っていませんのでご注意ください。ここの出力結果はRPMに相当するものです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で高発現、gene_2101〜gene_2700がG2群で高発現、gene_2701〜gene_3000がG3群で高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
head(normalized)                       #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で高発現、gene_2101〜gene_2700がG2群で高発現、gene_2701〜gene_3000がG3群で高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

non-DEGの分布について確認しています。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_nonDEG <- 3001:10000             #non-DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
head(normalized)                       #確認してるだけです

#non-DEGの分布を確認(揃っているほどよい正規化法)
summary(normalized[param_nonDEG,])     #正規化後のnon-DEGデータの要約統計量を表示
apply(normalized[param_nonDEG,], 2, median)#正規化後のnon-DEGデータの中央値を表示
	

3. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
head(normalized)                       #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(data), normalized)#「rownames情報」と「正規化後のデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

non-DEGの分布について確認しています。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定    
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_nonDEG <- 3001:10000             #non-DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
head(normalized)                       #確認してるだけです

#non-DEGの分布を確認(揃っているほどよい正規化法)
summary(normalized[param_nonDEG,])     #正規化後のnon-DEGデータの要約統計量を表示
apply(normalized[param_nonDEG,], 2, median)#正規化後のnon-DEGデータの中央値を表示
	

正規化 | scRNA-seq | について

bulk RNA-seq用は、「正規化 | サンプル間 | について」をご覧ください。 バッチ効果の補正に特化したもの?!は「batch correction用」としています。 Luecken and Theis, Mol Syst Biol., 2019の論文をベースに情報を追加していますので、 この著者らの思想のバイアスは多少かかっていると思います。 kBETの論文中でも、batch correctionでは scranの性能は高いという報告のようですね。 とりあえず思い付きで正規化の項目を追加してはいますが、「解析 | 前処理 | scRNA-seq | について」もご覧ください。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 一般 | アラインメント | ペアワイズ | について

ペアワイズアラインメント(pair-wise alignment)用プログラムを示します。一応ペアワイズアラインメントの枠組みに含まれると思うので、 ドットプロット(dot plot; dotplot)用のプログラムも示します。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 一般 | アラインメント | ペアワイズ | 基礎1 | Biostrings

グローバルアラインメント(global alignment;EMBOSSのneedleに相当)や ローカルアラインメント(local alignment; EMBOSSのwaterに相当)をやってくれます。 ここでは、3つの塩基配列(seq1, seq2, and seq3)からなるmulti-FASTA形式のファイルtest2.fastaや、 通常のsingle-FASTA形式の2つのファイル(seq2.fastaseq3.fasta)の比較を例題とします。

ちなみにこのページでは、「配列A vs. 配列B」という表記法で、配列Bに相当するほうが"subject"で配列Aに相当するほうが"pattern"です。

また、置換行列(nucleotideSubstitutionMatrix)を指定してやる必要がありますが、ここではEMBOSSの塩基配列比較時にデフォルトで用いている「EDNAFULL」という置換行列を用います。

local alignmentの結果は極めてEMBOSSのものと似ていますが(EMBOSSのスコア=34, Rのスコア=33)、global alignmentの結果は相当違っていることは認識しています(2010/6/8現在)。 おそらくギャップペナルティを計算する際の数式の違いによるものだろうと楽観していますが、もし間違っていればご指摘よろしくお願いします。

BLOSUM62やPAM250などの代表的な置換行列もftp://ftp.ncbi.nih.gov/blast/matrices/から取得することができます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 「seq2.fasta vs. seq3.fasta」のlocal alignmentの場合:

in_f1 <- "seq2.fasta"                  #読み込みたいファイル名を指定してin_f1に格納
in_f2 <- "seq3.fasta"                  #読み込みたいファイル名を指定してin_f2に格納
param1 <- "local"                      #アラインメントのタイプ(local, global, overlap, global-local, local-globalのいずれか)を指定
param2 <- -10                          #gap opening panalty(ギャップ開始ペナルティ)を指定(-10がデフォルト)
param3 <- -0.5                         #gap extension penalty(ギャップ伸長ペナルティ)を指定(-4がデフォルト)

file <- "ftp://ftp.ncbi.nih.gov/blast/matrices/NUC.4.4"#置換行列ファイル(EDNAFULLのものはNUC.4.4に相当)のURLをfileに格納
submat <- as.matrix(read.table(file, check.names=FALSE))#fileを読み込んでsubmatに格納
library(Biostrings)                    #パッケージの読み込み
read1 <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
read2 <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み
out <- pairwiseAlignment(pattern=read1,subject=read2,type=param1,#アラインメントを実行し、結果をoutに格納
           gapOpening=param2,gapExtension=param3,substitutionMatrix=submat)#アラインメントを実行し、結果をoutに格納

#以下は(こんなこともできますという)おまけ
#out中の情報抽出あれこれ:
out@pattern                            #in_f1で指定した配列中のアラインメントされた領域を表示
out@subject                            #in_f2で指定した配列中のアラインメントされた領域を表示
out@score                              #アラインメントスコアを表示

#二つの配列のIDとアラインメントスコアをファイルに出力:
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
tmp <- cbind(names(read1), names(read2), out@score)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
	

2. multi-FASTAファイル中の「seq3 vs. seq1」のglobal alignmentの場合:

in_f <- "test2.fasta"                  #読み込みたいmulti-FASTA形式のファイル名を指定してin_fに格納
param1 <- "global"                     #アラインメントのタイプ(local, global, overlap, global-local, local-globalのいずれか)を指定
param2 <- 3                            #multi-FASTA入力ファイルの何番目の配列かを指定
param3 <- 1                            #multi-FASTA入力ファイルの何番目の配列かを指定
param4 <- -10                          #gap opening panalty(ギャップ開始ペナルティ)を指定(-10がデフォルト)
param5 <- -0.5                         #gap extension penalty(ギャップ伸長ペナルティ)を指定(-4がデフォルト)

file <- "ftp://ftp.ncbi.nih.gov/blast/matrices/NUC.4.4"#置換行列ファイル(EDNAFULLのものはNUC.4.4に相当)のURLをfileに格納
submat <- as.matrix(read.table(file, check.names=FALSE))#fileを読み込んでsubmatに格納
library(Biostrings)                    #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
out <- pairwiseAlignment(pattern=reads[param2],subject=reads[param3],type=param1,#アラインメントを実行し、結果をoutに格納
           gapOpening=param4,gapExtension=param5,substitutionMatrix=submat)#アラインメントを実行し、結果をoutに格納

#以下は(こんなこともできますという)おまけ
#二つの配列のID,アラインメントスコア,%identidyをファイルに出力:
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
tmp <- cbind(names(reads[param2]), names(reads[param3]), score(out), pid(out))#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 一般 | アラインメント | ペアワイズ | 基礎2 | Biostrings

「解析 | 一般 | アラインメント | ペアワイズ | 基礎1 | Biostrings」では、2つの配列間のアラインメントについて、その基本的な利用法とアラインメントスコアを抽出する方法について述べましたが、 他にも配列一致度など様々な情報を抽出することができます。そこで、ここでは「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)を表示
	

解析 | 一般 | アラインメント | ペアワイズ | 応用 | Biostrings

グローバルアラインメント(global alignment;EMBOSSのneedleに相当)や ローカルアラインメント(local alignment; EMBOSSのwaterに相当)をやってくれます。 ここでは、3つの塩基配列(seq1, seq2, and seq3)からなるmulti-FASTA形式のファイルtest2.fastaを入力として、「それ以外 vs. 特定の配列」のペアワイズアラインメントを一気にやる方法を紹介します

ちなみにこのページでは、「配列A vs. 配列B」という表記法で、配列Bに相当するほうが"subject"で配列Aに相当するほうが"pattern"です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 特定の配列が入力multi-FASTAファイルの1番目にある場合:

in_f <- "test2.fasta"                  #読み込みたいmulti-FASTA形式のファイル名を指定してin_fに格納
param1 <- "local"                      #アラインメントのタイプ(local, global, overlap, global-local, local-globalのいずれか)を指定
param2 <- 1                            #multi-FASTA入力ファイルの何番目の配列かを指定
param3 <- -10                          #gap opening panalty(ギャップ開始ペナルティ)を指定(-10がデフォルト)
param4 <- -0.5                         #gap extension penalty(ギャップ伸長ペナルティ)を指定(-4がデフォルト)

file <- "ftp://ftp.ncbi.nih.gov/blast/matrices/NUC.4.4"#置換行列ファイル(EDNAFULLのものはNUC.4.4に相当)のURLをfileに格納
submat <- as.matrix(read.table(file, check.names=FALSE))#fileを読み込んでsubmatに格納
library(Biostrings)                    #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
out <- pairwiseAlignment(pattern=reads[-param2],subject=reads[param2],type=param1,#アラインメントを実行し、結果をoutに格納
           gapOpening=param3,gapExtension=param4,substitutionMatrix=submat)#アラインメントを実行し、結果をoutに格納

#以下は(こんなこともできますという)おまけ
#比較している配列の組み合わせ数などの情報を得たい:
names(reads[param2])                   #param2で指定した特定の配列のIDを表示("subject"に相当)
names(reads[-param2])                  #param2で指定した特定の配列"以外"のID(s)を表示("pattern"に相当)
length(reads[-param2])                 #ペアワイスアラインメント(pairwise alignment)をいくつやっているのか表示

#out中の情報抽出あれこれ:
out[1]                                 #1つ目のペアワイズアラインメント結果を表示
out[1]@score                           #1つ目のペアワイズアラインメント結果のスコアを表示
score(out[1])                          #1つ目のペアワイズアラインメント結果のスコアを表示
out[2]                                 #2つ目のペアワイズアラインメント結果を表示
out[2]@score                           #2つ目のペアワイズアラインメント結果のスコアを表示
score(out[2])                          #2つ目のペアワイズアラインメント結果のスコアを表示
score(out)                             #ペアワイズアラインメント結果のスコアを全て表示

#比較した二配列のIDとアラインメントスコアをファイルに出力:
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
tmp <- NULL
for(i in 1:length(reads[-param2])){
    tmp <- rbind(tmp, c(names(reads[-param2])[i], names(reads[param2]), out[i]@score))#保存したい情報をtmpに格納
}
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
	

2. 特定の配列が入力multi-FASTAファイルの3番目にある場合:

in_f <- "test2.fasta"                  #読み込みたいmulti-FASTA形式のファイル名を指定してin_fに格納
param1 <- "local"                      #アラインメントのタイプ(local, global, overlap, global-local, local-globalのいずれか)を指定
param2 <- 3                            #multi-FASTA入力ファイルの何番目の配列かを指定
param3 <- -10                          #gap opening panalty(ギャップ開始ペナルティ)を指定(-10がデフォルト)
param4 <- -0.5                         #gap extension penalty(ギャップ伸長ペナルティ)を指定(-4がデフォルト)

file <- "ftp://ftp.ncbi.nih.gov/blast/matrices/NUC.4.4"#置換行列ファイル(EDNAFULLのものはNUC.4.4に相当)のURLをfileに格納
submat <- as.matrix(read.table(file, check.names=FALSE))#fileを読み込んでsubmatに格納
library(Biostrings)                    #パッケージの読み込み
reads <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
out <- pairwiseAlignment(pattern=reads[-param2],subject=reads[param2],type=param1,#アラインメントを実行し、結果をoutに格納
           gapOpening=param3,gapExtension=param4,substitutionMatrix=submat)#アラインメントを実行し、結果をoutに格納

#以下は(こんなこともできますという)おまけ
#比較している配列の組み合わせ数などの情報を得たい:
names(reads[param2])                   #param2で指定した特定の配列のIDを表示("subject"に相当)
names(reads[-param2])                  #param2で指定した特定の配列"以外"のID(s)を表示("pattern"に相当)
length(reads[-param2])                 #ペアワイスアラインメント(pairwise alignment)をいくつやっているのか表示

#out中の情報抽出あれこれ:
out[1]                                 #1つ目のペアワイズアラインメント結果を表示
out[1]@score                           #1つ目のペアワイズアラインメント結果のスコアを表示
score(out[1])                          #1つ目のペアワイズアラインメント結果のスコアを表示
out[2]                                 #2つ目のペアワイズアラインメント結果を表示
out[2]@score                           #2つ目のペアワイズアラインメント結果のスコアを表示
score(out[2])                          #2つ目のペアワイズアラインメント結果のスコアを表示
score(out)                             #ペアワイズアラインメント結果のスコアを全て表示

#比較した二配列のIDとアラインメントスコアをファイルに出力:
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
tmp <- NULL
for(i in 1:length(reads[-param2])){
    tmp <- rbind(tmp, c(names(reads[-param2])[i], names(reads[param2]), out[i]@score))#保存したい情報をtmpに格納
}
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 一般 | アラインメント | ペアワイズ | ドットプロット | seqinr(Charif_2005)

seqinrパッケージを用いて2つの配列間のドットプロットを作成するやり方を示します。 ドットプロットとは、比較したい2つの配列をx軸y軸に並べ、同じ塩基の場所にドットをプロットするという非常にシンプルなものです。 その性質上、同一配列同士の比較の場合は対角線上にドットが打たれますが、それと異なる状況を全体的に把握したいときなどによく利用されます。 ここでは、20塩基程度までの長さのもの同士のドットプロットを描画して、乳酸菌NGS連載第13回の図2乳酸菌NGS連載第7回の図2と同じ結果を得るやり方を示します。

1. 同一配列("ACTCGTAGTCTATCATACGA")同士の比較の場合:

乳酸菌NGS連載第13回の図2aと同じ配列です。基本形。

seq1 <- "ACTCGTAGTCTATCATACGA"         #1つめの塩基配列を指定(配列k)
seq2 <- "ACTCGTAGTCTATCATACGA"         #2つめの塩基配列を指定(配列k)

#必要なパッケージをロード
library(seqinr)                        #パッケージの読み込み

#ファイルに保存(pngファイル)
dotPlot(s2c(seq1), s2c(seq2), xlab="", ylab="")#プロット
	

2. 同一配列("ACTCGTAGTCTATCATACGA")同士の比較の場合:

例題1と基本的に同じですが、300×300ピクセルの大きさのpngファイルとして保存するやり方です。 x軸y軸ともに、塩基配列そのものではなく数字のみの位置情報が表示されていることがわかります。 デフォルトの余白だと、本来表示させたいドットプロットの結果が小さくなってしまっています。例題3と比べるとよくわかります。

seq1 <- "ACTCGTAGTCTATCATACGA"         #1つめの塩基配列を指定(配列k)
seq2 <- "ACTCGTAGTCTATCATACGA"         #2つめの塩基配列を指定(配列k)
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(300, 300)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(seqinr)                        #パッケージの読み込み

#ファイルに保存(pngファイル)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
dotPlot(s2c(seq1), s2c(seq2), xlab="", ylab="")#プロット
dev.off()                              #おまじない
	

3. 同一配列("ACTCGTAGTCTATCATACGA")同士の比較の場合:

例題2と基本的に同じですが、余白を全て0にするやり方です。 例題2に比べて、ドットプロットのメインの部分がプロット全体の大部分を占めていることがわかります。 乳酸菌NGS連載第13回の図2aは、ドットプロットのみの図(hoge3.png)をベースとして、 塩基配列情報を手動で追加して作成しています。

seq1 <- "ACTCGTAGTCTATCATACGA"         #1つめの塩基配列を指定(配列k)
seq2 <- "ACTCGTAGTCTATCATACGA"         #2つめの塩基配列を指定(配列k)
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(300, 300)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(seqinr)                        #パッケージの読み込み

#ファイルに保存(pngファイル)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(0, 0, 0, 0))                 #下、左、上、右の順で余白(行)を指定
dotPlot(s2c(seq1), s2c(seq2), xlab="", ylab="")#プロット
dev.off()                              #おまじない
	

4. 異なる配列同士の比較の場合:

配列k("ACTCGTAGTCTATCATACGA")と配列l("ACTCGACTATCTGATTACGA") を比較する場合です。配列kの6番目から15番目の部分配列(TAGTCTATCA)が反転(inverted)したものが配列lです。 乳酸菌NGS連載第13回の図2bと同じです。

seq1 <- "ACTCGTAGTCTATCATACGA"         #1つめの塩基配列を指定(配列k)
seq2 <- "ACTCGACTATCTGATTACGA"         #2つめの塩基配列を指定(配列l)
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(300, 300)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(seqinr)                        #パッケージの読み込み

#ファイルに保存(pngファイル)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(0, 0, 0, 0))                 #下、左、上、右の順で余白(行)を指定
dotPlot(s2c(seq1), s2c(seq2), xlab="", ylab="")#プロット
dev.off()                              #おまじない
	

5. 異なる配列同士の比較の場合:

例題3と基本的に同じですが、配列jは、配列k("ACTCGTAGTCTATCATACGA")の左側に"NN"を無理やり結合させたものです。 それ以外は同じですので、ドットプロットを描くと左下の原点から2塩基分だけ右にずれたようになっていることが分かります。

seq1 <- "NNACTCGTAGTCTATCATACGA"       #1つめの塩基配列を指定(配列j)
seq2 <- "ACTCGTAGTCTATCATACGA"         #2つめの塩基配列を指定(配列k)
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(300, 300)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(seqinr)                        #パッケージの読み込み

#ファイルに保存(pngファイル)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(0, 0, 0, 0))                 #下、左、上、右の順で余白(行)を指定
dotPlot(s2c(seq1), s2c(seq2), xlab="", ylab="")#プロット
dev.off()                              #おまじない
	

解析 | 一般 | アラインメント | マルチプル | について

マルチプルアラインメント(多重配列アラインメント)用です。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 一般 | アラインメント | マルチプル | DECIPHER(Wright_2015)

DECIPHERパッケージを用いて多重配列アラインメント (multiple sequence alignment; MSA)を行うやり方を示します。今のところMSA実行結果ファイルがAASTringSet形式なので距離行列情報にできていないのですが、 距離行列情報になったらIdClusters関数 --> WriteDendrogram関数と実行することで、 Newick formatという一般的な樹形図を描く際に用いるテキストファイルを作成することができます。 Newick形式のテキストファイルは、apeパッケージ中の read.tree関数で読み込むことができます。またunroot関数を用いることでunrootedの樹形図をR上で描くことができ、write.tree関数を用いることでファイルに出力することができます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 10個の配列からなるmulti-FASTAファイル(test3.fasta)の場合:

アミノ酸配列のファイルです。

in_f <- "test3.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(DECIPHER)                      #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readAAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番(MSA)
out <- AlignSeqs(fasta)                #MSAを実行した結果をoutに格納
out                                    #確認してるだけです

#ファイルに保存
writeXStringSet(out, file=out_f, format="fasta", width=50)#outの中身を指定したファイル名で保存
	

解析 | 一般 | アラインメント | マルチプル | msa(Bodenhofer_2015)

msaパッケージを用いて多重配列アラインメント (multiple sequence alignment; MSA)を行うやり方を示します。2016年12月29日現在、 型変換のところでunrooted treeを作成するための適切なオブジェクトにできていないため、unroot関数実行時にエラーがでます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 10個の配列からなるmulti-FASTAファイル(test3.fasta)の場合:

アミノ酸配列のファイルです。

in_f <- "test3.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.fasta"                 #出力ファイル名を指定してout_fに格納
param <- "ape::AAbin"                  #変換したいMSAオブジェクトを指定("ape::AAbin", "seqinr::alignment", "bios2mds::align", ""ape::DNAbin", ""phangorn::phyDat"が指定可能)

#必要なパッケージをロード
library(msa)                           #パッケージの読み込み
library(ape)                           #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readAAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番(MSA)
out <- msa(fasta)                      #MSAを実行した結果をoutに格納
out                                    #確認してるだけです

#後処理(型変換)
hoge <- msaConvert(out, type=param)    #paramで指定した形式に型変換した結果をhogeに格納

#後処理(型変換)
hoge2 <- unroot(hoge)    #unrooted treeを作成

#ファイルに保存
writeXStringSet(out, file=out_f, format="fasta", width=50)#outの中身を指定したファイル名で保存
	

解析 | 一般 | Silhouette scores(シルエットスコア)

Silhouetteスコアの新たな使い道提唱論文(Zhao et al., Biol. Proc. Online, 2018)の利用法を説明します。 入力は「解析 | 発現変動 | 2群間 | 対応なし | 複製あり | TCC(Sun_2013)」などと同じく、 遺伝子発現行列データと比較したいグループラベル情報(Group1が1、Group2が2みたいなやつ)です。 出力は、Average Silhouette(AS値)というスカラー情報(1つの数値)です。 AS値の取り得る範囲は[-1, 1]で、数値が大きいほど指定したグループ間の類似度が低いことを意味し、 発現変動解析結果としてDifferentially Expressed Genes (DEGs)が沢山得られる傾向にあります。 逆に、AS値が低い(通常は-1に近い値になることはほぼ皆無で、相関係数と同じく0に近い)ほど 指定したグループ間の類似度が高いことを意味し、DEGがほとんど得られない傾向にあります。 論文中で提案している使い道としては、「発現変動解析を行ってDEGがほとんど得られなかった場合に、 サンプル間クラスタリング(SC)結果とAS値を提示して、(客観的な数値情報である)AS値が0に近い値だったのでDEGがないのは妥当だね」 みたいなdiscussionに使ってもらえればと思っています。RNA-seqカウントデータでもマイクロアレイデータでも使えます。

例題の多くは、サンプルデータ42の20,689 genes×18 samplesのリアルカウントデータ (sample_blekhman_18.txt)を入力としています。 ヒトHomo sapiens; HS)のメス3サンプル(HSF1-3)とオス3サンプル(HSM1-3), チンパンジー(Pan troglodytes; PT)のメス3サンプル(PTF1-3)とオス3サンプル(PTM1-3), アカゲザル(Rhesus macaque; RM)のメス3サンプル(RMF1-3)とオス3サンプル(RMM1-3)の並びになっています。 つまり、以下のような感じです。FはFemale(メス)、MはMale(オス)を表します。

ヒト(1-6列目): HSF1, HSF2, HSF3, HSM1, HSM2, and HSM3

チンパンジー(7-12列目): PTF1, PTF2, PTF3, PTM1, PTM2, and PTM3

アカゲザル(13-18列目): RMF1, RMF2, RMF3, RMM1, RMM2, and RMM3

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. HSF vs. PTFの場合:

HSF(ヒトメス)データが存在する1-3列目と、 PTF(チンパンジーメス)データが存在する 7-9 列目のデータのみ抽出してAS値を算出しています。Zhao et al., Biol. Proc. Online, 2018 のFig. 1bのHSF vs. PTFのAS値と同じ結果(AS = 0.389)が得られていることが分かります。尚、 このZhao論文中では、先に18サンプルの全データを用いてフィルタリング(低発現遺伝子の除去とユニークパターンのみにする作業)を行ったのち、 解析したい計6サンプルのサブセット抽出を行っているのでその手順に従っています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
param_subset <- c(1:3, 7:9)            #取り扱いたいサブセット情報を指定
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(cluster)                       #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(サブセットの抽出)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出

#本番(AS値の計算)
d <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdに格納
AS <-  mean(silhouette(data.cl, d)[, "sil_width"])#サンプルごとのSilhouette scoreを計算し、その平均値をASに格納
AS                                     #AS値を表示
	

2. PTF vs. PTMの場合:

PTF(チンパンジーメス)データが存在する7-9列目と、 PTM(チンパンジーオス)データが存在する 10-12 列目のデータのみ抽出してAS値を算出しています。Zhao et al., Biol. Proc. Online, 2018 のFig. 1bのPTF vs. PTMのAS値と同じ結果(AS = 0.031)が得られていることが分かります。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
param_subset <- c(7:9, 10:12)          #取り扱いたいサブセット情報を指定
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(cluster)                       #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(サブセットの抽出)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出

#本番(AS値の計算)
d <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdに格納
AS <-  mean(silhouette(data.cl, d)[, "sil_width"])#サンプルごとのSilhouette scoreを計算し、その平均値をASに格納
AS                                     #AS値を表示
	

3. HS vs PT vs. RMの場合:

HS(ヒト)6 samples、PT(チンパンジー)6 samples、RM(アカゲザル)6 samplesの3生物種間のAS値を算出しています。 全サンプルのデータを使っているので、サブセットの抽出は行っていません。 このデータのサンプル間クラスタリング結果(Zhao et al., Biol. Proc. Online, 2018のFig. 1a) でも3生物種明瞭に分離されていますが、高いAS値(= 0.4422661)が得られていることが分かります。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(cluster)                       #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番(AS値の計算)
d <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdに格納
AS <-  mean(silhouette(data.cl, d)[, "sil_width"])#サンプルごとのSilhouette scoreを計算し、その平均値をASに格納
AS                                     #AS値を表示
	

4. HS vs PT vs. RMの場合:

例題3と基本的に同じで、直接グループラベル情報を指し示すdata.clを作成しています。 ここではHSがG1群、PTがG2群、RMがG3群と指定したいので、どの列がどのグループに属するかをベタ書きしています。 例題3と同じAS値(= 0.4422661)が得られます。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
data.cl <- c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3)#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成

#必要なパッケージをロード
library(cluster)                       #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番(AS値の計算)
d <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdに格納
AS <-  mean(silhouette(data.cl, d)[, "sil_width"])#サンプルごとのSilhouette scoreを計算し、その平均値をASに格納
AS                                     #AS値を表示
	

5. 1人目 vs 2人目 vs. 3人目の場合:

3群間比較ですが、生物種やメスオス無関係に、1人目をG1群、2人目をG2群、3人目をG3群としたdata.clを作成しています。 予想通り0に近いAS値(= -0.10115)が得られます。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
data.cl <- c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3)#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成

#必要なパッケージをロード
library(cluster)                       #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番(AS値の計算)
d <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdに格納
AS <-  mean(silhouette(data.cl, d)[, "sil_width"])#サンプルごとのSilhouette scoreを計算し、その平均値をASに格納
AS                                     #AS値を表示
	

6. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。AS = 0.2294556になると思います。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(cluster)                       #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番(AS値の計算)
d <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdに格納
AS <-  mean(silhouette(data.cl, d)[, "sil_width"])#サンプルごとのSilhouette scoreを計算し、その平均値をASに格納
AS                                     #AS値を表示
	

解析 | 一般 | パターンマッチング

リファレンス配列(マップされる側)から文字列検索(マップする側)を行うやり方を示します。マッピングと同じです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. DHFR.fastaを入力として、"AATGCTCAGGTA"でキーワード探索を行う場合(No hitです...):

(Dihydrofolate reductase (DHFR)という塩基配列(NM_000791)のFASTA形式ファイルで、 Zinc Finger Nuclease (ZFN)認識配列(AATGCTCAGGTA)領域の探索の場合をイメージしています)

in_f <- "DHFR.fasta"                   #入力ファイル名を指定してin_fに格納
param <- "AATGCTCAGGTA"                #調べたい配列パターンを指定してparamに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
out <- vmatchPattern(pattern=param, subject=fasta)#paramで指定した配列と100%マッチの領域を探索して結果をoutに格納
out[[1]]                               #outの中身を表示(入力ファイル中には一致領域がないことがわかる)
	

2. DHFR.fastaを入力として、"CCTACTATGT"でキーワード探索を行う場合(存在することが分かっている断片配列):

in_f <- "DHFR.fasta"                   #入力ファイル名を指定してin_fに格納
param <- "CCTACTATGT"                  #調べたい配列パターンを指定してparamに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
out <- vmatchPattern(pattern=param, subject=fasta)#paramで指定した配列と100%マッチの領域を探索して結果をoutに格納
out[[1]]                               #outの中身を表示(入力ファイルの(13,22)の位置に一致領域があることを示している)
unlist(out)                            #outの中身を表示(入力ファイルの(13,22)の位置に一致領域があることを示している)
start(unlist(out))                     #一致領域のstart位置情報の抽出
	

3. DHFR.fastaを入力として、"CCTACTATGT"でキーワード探索を行った結果をファイルに保存する場合:

in_f <- "DHFR.fasta"                   #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param <- "CCTACTATGT"                  #調べたい配列パターンを指定してparamに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- vmatchPattern(pattern=param, subject=fasta)#paramで指定した配列と100%マッチの領域を探索した結果をhogeに格納
out <- cbind(start(unlist(hoge)), end(unlist(hoge)))#一致領域の位置情報をoutに格納
colnames(out) <- c("start", "end")     #列名を付与
out                                    #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#outの中身を指定したファイル名で保存
	

4. multi-FASTAファイルhoge4.faを入力として、"AGG"でキーワード探索を行う場合:

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param <- "AGG"                         #調べたい配列パターンを指定してparamに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- vmatchPattern(pattern=param, subject=fasta)#paramで指定した配列と100%マッチの領域を探索して結果をhogeに格納
out <- cbind(start(unlist(hoge)), end(unlist(hoge)))#一致領域の位置情報をoutに格納
colnames(out) <- c("start", "end")     #列名を付与
rownames(out) <- names(unlist(hoge))   #行名を付与
out                                    #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(out), out)       #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. multi-FASTAファイルhoge4.faをリファレンス配列(マップされる側)として、10リードからなるdata_seqlogo1.fastaでマッピングを行う場合:

in_f1 <- "hoge4.fa"                    #入力ファイル名を指定してin_f1に格納(マップされる側)
in_f2 <- "data_seqlogo1.fasta"         #入力ファイル名を指定してin_f2に格納(マップする側)
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
reads <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み

#本番
out <- c("in_f2", "in_f1", "start", "end")#最終的に得る出力ファイルのヘッダー情報を指定してoutに格納(4列のデータを得る)
for(i in 1:length(reads)){             #リード数分だけループを回す
    hoge <- vmatchPattern(pattern=as.character(reads[i]), subject=fasta)#オブジェクトreads中の各塩基配列と100%マッチの領域を探索して結果をhogeに格納
    hoge1 <- cbind(start(unlist(hoge)), end(unlist(hoge)))#一致領域の(start, end)の位置情報をhoge1に格納
    hoge2 <- names(unlist(hoge))       #ヒットしたリファレンス配列中のIDをhoge2に格納
    hoge3 <- rep(as.character(reads[i]), length(hoge2))#hoge2の要素数分だけ、マップする側の配列(in_f2で指定するものに相当)のIDをhoge3に格納
    out <- rbind(out, cbind(hoge3, hoge2, hoge1))#cbind(hoge3, hoge2, hoge1)で表される欲しい情報をどんどんオブジェクトoutの下に追加している(ループが回るたびにどんどん行数が増えていっているイメージ)
}
head(out)                              #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#outの中身を指定したファイル名で保存
	

6. multi-FASTAファイルhoge4.faをリファレンス配列(マップされる側)として、4リードからなるdata_reads.fastaでマッピングを行う場合:

in_f1 <- "hoge4.fa"                    #入力ファイル名を指定してin_f1に格納(マップされる側)
in_f2 <- "data_reads.fasta"            #入力ファイル名を指定してin_f2に格納(マップする側)
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
reads <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み

#本番
out <- c("in_f2", "in_f1", "start", "end")#最終的に得る出力ファイルのヘッダー情報を指定してoutに格納(4列のデータを得る)
for(i in 1:length(reads)){             #リード数分だけループを回す
    hoge <- vmatchPattern(pattern=as.character(reads[i]), subject=fasta)#オブジェクトreads中の各塩基配列と100%マッチの領域を探索して結果をhogeに格納
    hoge1 <- cbind(start(unlist(hoge)), end(unlist(hoge)))#一致領域の(start, end)の位置情報をhoge1に格納
    hoge2 <- names(unlist(hoge))       #ヒットしたリファレンス配列中のIDをhoge2に格納
    hoge3 <- rep(as.character(reads[i]), length(hoge2))#hoge2の要素数分だけ、マップする側の配列(in_f2で指定するものに相当)のIDをhoge3に格納
    out <- rbind(out, cbind(hoge3, hoge2, hoge1))#cbind(hoge3, hoge2, hoge1)で表される欲しい情報をどんどんオブジェクトoutの下に追加している(ループが回るたびにどんどん行数が増えていっているイメージ)
}
head(out)                              #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#outの中身を指定したファイル名で保存
	

7. multi-FASTAファイルhoge4.faをリファレンス配列(マップされる側)として、4リードからなるdata_reads.fastaでマッピングを行う場合(hoge1オブジェクトの作成のところの記述の仕方が若干異なる):

in_f1 <- "hoge4.fa"                    #入力ファイル名を指定してin_f1に格納(マップされる側)
in_f2 <- "data_reads.fasta"            #入力ファイル名を指定してin_f2に格納(マップする側)
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f1, format="fasta")#in_f1で指定したファイルの読み込み
reads <- readDNAStringSet(in_f2, format="fasta")#in_f2で指定したファイルの読み込み

#本番
out <- c("in_f2", "in_f1", "start", "end")#最終的に得る出力ファイルのヘッダー情報を指定してoutに格納(4列のデータを得る)
for(i in 1:length(fasta)){             #リファレンス配列数分だけループを回す
    hoge <- matchPDict(PDict(reads), fasta[[i]])#リファレンス配列中のi番目の配列に対してオブジェクトreads中の全配列をmatchPDict関数を用いてマッピングした結果をhogeに格納
    hoge1 <- cbind(start(unlist(hoge)), end(unlist(hoge)))#一致領域の(start, end)の位置情報をhoge1に格納
    hoge2 <- names(unlist(hoge))       #ヒットしたリードのIDをhoge2に格納
    hoge3 <- rep(names(fasta[i]), length(hoge2))#hoge2の要素数分だけ、マップされる側のリファレンス配列(in_f1で指定するものに相当)のIDをhoge3に格納
    out <- rbind(out, cbind(hoge3, hoge2, hoge1))#cbind(hoge3, hoge2, hoge1)で表される欲しい情報をどんどんオブジェクトoutの下に追加している(ループが回るたびにどんどん行数が増えていっているイメージ)
    #as.integer(coverage(hoge, 1, width(fasta[i])))
}
head(out)                              #確認してるだけです

#ファイルに保存
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=F)#outの中身を指定したファイル名で保存
	

解析 | 一般 | GC含量 (GC contents)

multi-FASTA形式ファイルやBSgenomeパッケージを読み込んで配列ごとのGC含量 (GC contents)を出力するやり方を示します。 出力ファイルは、「description」「CGの総数」「ACGTの総数」「配列長」「%GC含量」としています。 尚、%GC含量は「CGの総数/ACGTの総数」で計算しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. イントロ | 一般 | ランダムな塩基配列を作成の4.を実行して得られたmulti-FASTAファイル(hoge4.fa)の場合:

in_f <- "hoge4.fa"                     #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を各配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- CG/ACGT*100              #%GC含量を計算してGC_contentに格納

#ファイルに保存
tmp <- cbind(names(fasta), CG, ACGT, width(fasta), GC_content)#保存したい情報をtmpに格納
colnames(tmp) <- c("description", "CG", "ACGT", "Length", "%GC_contents")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

2. h_rna.fastaファイルの場合:

in_f <- "h_rna.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を各配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- CG/ACGT*100              #%GC含量を計算してGC_contentに格納

#ファイルに保存
tmp <- cbind(names(fasta), CG, ACGT, width(fasta), GC_content)#保存したい情報をtmpに格納
colnames(tmp) <- c("description", "CG", "ACGT", "Length", "%GC_contents")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

3. test1.fastaファイルの場合:

in_f <- "test1.fasta"                  #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を各配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- CG/ACGT*100              #%GC含量を計算してGC_contentに格納

#ファイルに保存
tmp <- cbind(names(fasta), CG, ACGT, width(fasta), GC_content)#保存したい情報をtmpに格納
colnames(tmp) <- c("description", "CG", "ACGT", "Length", "%GC_contents")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

4. 120MB程度のシロイヌナズナゲノムのmulti-FASTAファイル(TAIR10_chr_all.fas.gz)の場合:

in_f <- "TAIR10_chr_all.fas"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を各配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- CG/ACGT*100              #%GC含量を計算してGC_contentに格納

#ファイルに保存
tmp <- cbind(names(fasta), CG, ACGT, width(fasta), GC_content)#保存したい情報をtmpに格納
colnames(tmp) <- c("description", "CG", "ACGT", "Length", "%GC_contents")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

5. シロイヌナズナゲノム配列パッケージ(BSgenome.Athaliana.TAIR.TAIR9)の場合:

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param <- "BSgenome.Athaliana.TAIR.TAIR9"#パッケージ名を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(param, character.only=T)       #paramで指定したパッケージの読み込み

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にオブジェクトが一つしかないという前提です)
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している
fasta                                  #確認してるだけです

#本番
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を各配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- CG/ACGT*100              #%GC含量を計算してGC_contentに格納

#ファイルに保存
tmp <- cbind(names(fasta), CG, ACGT, width(fasta), GC_content)#保存したい情報をtmpに格納
colnames(tmp) <- c("description", "CG", "ACGT", "Length", "%GC_contents")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

6. ヒトゲノム配列パッケージ(BSgenome.Hsapiens.NCBI.GRCh38)の場合:

2013年12月にリリースされたGenome Reference Consortium GRCh38です。

out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param <- "BSgenome.Hsapiens.NCBI.GRCh38"#パッケージ名を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(param, character.only=T)       #paramで指定したパッケージの読み込み

#前処理(paramで指定したパッケージ中のオブジェクト名をgenomeに統一)
tmp <- ls(paste("package", param, sep=":"))#paramで指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にオブジェクトが一つしかないという前提です)
fasta <- getSeq(genome)                #ゲノム塩基配列情報を抽出した結果をfastaに格納
names(fasta) <- seqnames(genome)       #description情報を追加している
fasta                                  #確認してるだけです

#本番
hoge <- alphabetFrequency(fasta)       #A,C,G,T,..の数を各配列ごとにカウントした結果をhogeに格納
#CG <- rowSums(hoge[,2:3])             #C,Gの総数を計算してCGに格納(2015年9月12日以前の記述)
#ACGT <- rowSums(hoge[,1:4])           #A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以前の記述)
CG <- apply(as.matrix(hoge[,2:3]), 1, sum)#C,Gの総数を計算してCGに格納(2015年9月12日以降の記述)
ACGT <- apply(as.matrix(hoge[,1:4]), 1, sum)#A,C,G,Tの総数を計算してACGTに格納(2015年9月12日以降の記述)
GC_content <- CG/ACGT*100              #%GC含量を計算してGC_contentに格納

#ファイルに保存
tmp <- cbind(names(fasta), CG, ACGT, width(fasta), GC_content)#保存したい情報をtmpに格納
colnames(tmp) <- c("description", "CG", "ACGT", "Length", "%GC_contents")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

解析 | 一般 | CpGアイランドの同定 | について

脊椎動物(哺乳類)のゲノムでは、CGという2連続塩基(2-mer)の出現頻度がGC含量から予想される期待値よりも少ない (ヒトでは1/4程度)ことがわかっています(Lander et al., Nature, 2001)。 この現象をCG抑制(CG suppression)といいます。 そんな中でもCGという2-merが相対的に多く出現する領域があり、それをCpGアイランド(CpG islands or CpG islets; CGIs)といい、 転写開始点近辺にあることが知られています(Gardiner-Garden and Frommer, J Mol Biol., 1987)。 ここでは、そのようなCGIsを同定するプログラムをリストアップします(一部そうでないものも含む)。基本ヒトゲノム用です。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 一般 | オペロン予測 | について

オペロン(operon)とは、 同じプロモータ(promoter)の制御下にある複数の遺伝子の領域のことです(Jacob et al., C R Hebd Seances Acad Sci., 1960)。 wikiのリンク先では以下のように書かれています。
「現在の状況としては、原義で言うところの1遺伝子のみからなるオペロンは遺伝子と呼び、 構造遺伝子部分はコーディング・リージョンと呼ぶのが比較的正確かつ円滑な意思疎通を産むといえるのかもしれない。」
従ってオペロン予測(operon prediction)は遺伝子予測や構造アノテーションと同じではないかという印象をもちますが、 少なくとも私が最初にみた2010年の論文(Chuang et al., Nucleic Acids Res., 2010) では明確にoperon predictionと書かれているので、一応そのような目的に特化したプログラムをリストアップします。 基本原核生物用です。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 一般 | オペロンDB | について

オペロン予測プログラムは、既知のオペロン情報をベンチマークとして利用します。 ここでは2010年のオペロン予測論文(Chuang et al., Nucleic Acids Res., 2010)を取っ掛かりとして、 オペロン情報を含むデータベース(DB)をリストアップします。

sequence logos (Schneider and Stephens, 1990)を実行するやり方を示します。

R用:

R以外:

Review、ガイドライン、パイプライン系:

seqLogoパッケージを用いてsequence logos (Schneider and Stephens, 1990)を実行するやり方を示します。 ここでは、multi-FASTAファイルを読み込んでポジションごとの出現頻度を調べる目的で利用します。上流-35 bpにTATA boxがあることを示す目的などに利用されます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 入力ファイルがmulti-FASTA形式のファイル(test1.fasta)の場合:

in_f <- "test1.fasta"                  #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番(sequence logoを実行)
hoge <- consensusMatrix(fasta, as.prob=T, baseOnly=T)#各ポジションの塩基組成(probability)を計算してhogeに格納。as.prob=Fにすることで塩基の出現割合ではなく出現頻度にすることもできる
out <- makePWM(hoge[1:4,])             #hogeはACGT以外の塩基(例えばN)のprobabilityもotherという5番目の行に出力するが、makePWM関数はACGTの最初の4行分の行列データのみ許容して受け付け、情報量(information content; ic)などを計算してくれる
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
	

2. 入力ファイルがmulti-FASTA形式のファイル(data_seqlogo1.fasta)の場合:

in_f <- "data_seqlogo1.fasta"          #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番(sequence logoを実行)
hoge <- consensusMatrix(fasta, as.prob=T, baseOnly=T)#各ポジションの塩基組成(probability)を計算してhogeに格納。as.prob=Fにすることで塩基の出現割合ではなく出現頻度にすることもできる
out <- makePWM(hoge[1:4,])             #hogeはACGT以外の塩基(例えばN)のprobabilityもotherという5番目の行に出力するが、makePWM関数はACGTの最初の4行分の行列データのみ許容して受け付け、情報量(information content; ic)などを計算してくれる
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
	

3. 入力ファイルがmulti-FASTA形式のファイル(data_seqlogo1.fasta)の場合:

得られた結果をPNG形式ファイルとして保存するやり方です。

in_f <- "data_seqlogo1.fasta"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み

#本番(sequence logoを実行)
hoge <- consensusMatrix(fasta, as.prob=T, baseOnly=T)#各ポジションの塩基組成(probability)を計算してhogeに格納。as.prob=Fにすることで塩基の出現割合ではなく出現頻度にすることもできる
out <- makePWM(hoge[1:4,])             #hogeはACGT以外の塩基(例えばN)のprobabilityもotherという5番目の行に出力するが、makePWM関数はACGTの最初の4行分の行列データのみ許容して受け付け、情報量(information content; ic)などを計算してくれる

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
dev.off()                              #おまじない
	

4. 入力ファイルが塩基組成のファイル(data_seqlogo2.fasta)の場合:

全部で4行からなり、1行目がA, 2行目がC, 3行目がG, そして4行目がTの並びになっているという前提です。 列数は塩基配列の長さ分だけ長くなってかまいません。

in_f <- "data_seqlogo2.fasta"          #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
hoge <- read.table(in_f)               #in_fで指定したファイルの読み込み

#本番(sequence logoを実行)
out <- makePWM(hoge)                   #情報量(information content; ic)を計算している
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
	

5. 入力ファイルがmulti-FASTA形式のファイル(TAIR10_upstream_500_20101028)の場合:

Arabidopsisの上流500bpの配列セットです。500bpと長いため、461-500bpの範囲のみについて解析し、得られた図をファイルに保存するやり方です。 以下はダウンロードしたファイルの拡張子として、"fasta"を付加しているという前提です。

in_f <- "TAIR10_upstream_500_20101028.fasta"#入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param1 <- c(461, 500)                  #抽出したい範囲の始点と終点を指定
param2 <-  500                         #入力ファイルの配列長を指定
param_fig <- c(700, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#前処理(配列長が500bpのもののみフィルタリング後、解析したいサブセットを抽出)
obj <- as.logical(width(fasta) == param2)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなるもののみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです
fasta <- subseq(fasta, param1[1], param1[2])#解析したい範囲を切り出してfastaに格納
fasta                                  #確認してるだけです

#本番(sequence logoを実行)
hoge <- consensusMatrix(fasta, as.prob=T, baseOnly=T)#各ポジションの塩基組成(probability)を計算してhogeに格納。as.prob=Fにすることで塩基の出現割合ではなく出現頻度にすることもできる
out <- makePWM(hoge[1:4,])             #hogeはACGT以外の塩基(例えばN)のprobabilityもotherという5番目の行に出力するが、makePWM関数はACGTの最初の4行分の行列データのみ許容して受け付け、情報量(information content; ic)などを計算してくれる

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
dev.off()                              #おまじない
	

6. 入力ファイルがmulti-FASTA形式のファイル(TAIR10_upstream_1000_20101104)の場合:

Arabidopsisの上流1000bpの配列セットです。1000bpと長いため、951-1000bpの範囲のみについて解析し、得られた図をファイルに保存するやり方です。 ファイル中の1塩基目が転写開始点からもっとも遠く離れたところで、1000塩基目が転写開始点のすぐ隣ということになります。 以下はダウンロードしたファイルの拡張子として、"fasta"を付加しているという前提です。

in_f <- "TAIR10_upstream_1000_20101104.fasta"#入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param1 <- c(951, 1000)                 #抽出したい範囲の始点と終点を指定
param2 <-  1000                        #入力ファイルの配列長を指定
param_fig <- c(800, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#前処理(配列長が500bpのもののみフィルタリング後、解析したいサブセットを抽出)
obj <- as.logical(width(fasta) == param2)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなるもののみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです
fasta <- subseq(fasta, start=param1[1], end=param1[2])#解析したい範囲を切り出してfastaに格納
fasta                                  #確認してるだけです

#本番(sequence logoを実行)
hoge <- consensusMatrix(fasta, as.prob=T, baseOnly=T)#各ポジションの塩基組成(probability)を計算してhogeに格納。as.prob=Fにすることで塩基の出現割合ではなく出現頻度にすることもできる
out <- makePWM(hoge[1:4,])             #hogeはACGT以外の塩基(例えばN)のprobabilityもotherという5番目の行に出力するが、makePWM関数はACGTの最初の4行分の行列データのみ許容して受け付け、情報量(information content; ic)などを計算してくれる

png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
dev.off()                              #おまじない
	

7. 入力ファイルがmulti-FASTA形式のファイル(TAIR10_upstream_1000_20101104)の場合:

6.と同じ結果が得られますが、転写開始点上流50bpのみを切り出して解析するというオプションにしています。

in_f <- "TAIR10_upstream_1000_20101104.fasta"#入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param1 <- 50                           #切り出したい上流x bpを指定
param2 <-  1000                        #入力ファイルの配列長を指定
param_fig <- c(800, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#前処理(配列長が500bpのもののみフィルタリング後、解析したいサブセットを抽出)
obj <- as.logical(width(fasta) == param2)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなるもののみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです
fasta <- subseq(fasta, width=param1, end=param2)#解析したい範囲を切り出してfastaに格納
fasta                                  #確認してるだけです

#本番(sequence logoを実行)
hoge <- consensusMatrix(fasta, as.prob=T, baseOnly=T)#各ポジションの塩基組成(probability)を計算してhogeに格納。as.prob=Fにすることで塩基の出現割合ではなく出現頻度にすることもできる
out <- makePWM(hoge[1:4,])             #hogeはACGT以外の塩基(例えばN)のprobabilityもotherという5番目の行に出力するが、makePWM関数はACGTの最初の4行分の行列データのみ許容して受け付け、情報量(information content; ic)などを計算してくれる

png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
dev.off()                              #おまじない

#おまけ(配列長分布や配列長がparam2と異なるID情報を取得)
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
table(width(fasta))                    #配列長分布(ほとんどがparam2と同じであることがわかる)
obj <- as.logical(width(fasta) != param2)#条件を満たすかどうかを判定した結果をobjに格納
fasta <- fasta[obj]                    #objがTRUEとなるもののみ抽出した結果をfastaに格納
fasta                                  #確認してるだけです
	

8. FASTQ形式ファイル(SRR609266.fastq.gz)の場合:

small RNA-seqデータ(400Mb弱、11,928,428リード)です。圧縮ファイルもreadDNAStringSet関数で通常手順で読み込めます。 原著論文(Nie et al., BMC Genomics, 2013)中の記述から GSE41841を頼りに、 SRP016842にたどりつき、 イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の7を実行して得られたものが入力ファイルです。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge8.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(800, 370)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み

#本番(sequence logoを実行)
hoge <- consensusMatrix(fasta, as.prob=T, baseOnly=T)#各ポジションの塩基組成(probability)を計算してhogeに格納。as.prob=Fにすることで塩基の出現割合ではなく出現頻度にすることもできる
out <- makePWM(hoge[1:4,])             #hogeはACGT以外の塩基(例えばN)のprobabilityもotherという5番目の行に出力するが、makePWM関数はACGTの最初の4行分の行列データのみ許容して受け付け、情報量(information content; ic)などを計算してくれる

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
dev.off()                              #おまじない
	

9. FASTQ形式ファイル(hoge4.fastq.gz)の場合:

small RNA-seqデータ(280Mb弱、11,928,428リード)です。 原著論文(Nie et al., BMC Genomics, 2013)中の記述から GSE41841を頼りに、 SRP016842にたどりつき、 前処理 | トリミング | アダプター配列除去(応用) | ShortRead(Morgan_2009)の4を実行して得られたものが入力ファイルです。 アダプター配列除去後のデータなので、リードごとに配列長が異なる場合でも読み込めるShortReadパッケージ中の readFastq関数を用いています。

in_f <- "hoge4.fastq.gz"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge9.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(787, 370)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ShortRead)                     #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
fastq <- readFastq(in_f)               #in_fで指定したファイルの読み込み
fasta <- sread(fastq)                  #リード塩基配列情報をfastaに格納

#本番(sequence logoを実行)
hoge <- consensusMatrix(fasta, as.prob=T, baseOnly=T)#各ポジションの塩基組成(probability)を計算してhogeに格納。as.prob=Fにすることで塩基の出現割合ではなく出現頻度にすることもできる
out <- makePWM(hoge[1:4,])             #hogeはACGT以外の塩基(例えばN)のprobabilityもotherという5番目の行に出力するが、makePWM関数はACGTの最初の4行分の行列データのみ許容して受け付け、情報量(information content; ic)などを計算してくれる

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
dev.off()                              #おまじない
	

10. FASTQ形式ファイル(SRR609266_sub.fastq)の場合:

前処理 | フィルタリング | 任意のリード(サブセット)を抽出 の8.を実行して得られたsmall RNA-seqデータ(100,000リード; 約16MB)です。

in_f <- "SRR609266_sub.fastq"          #入力ファイル名を指定してin_fに格納
out_f <- "hoge10.png"                  #出力ファイル名を指定してout_fに格納
param_fig <- c(800, 370)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fastq")#in_fで指定したファイルの読み込み

#本番(sequence logoを実行)
hoge <- consensusMatrix(fasta, as.prob=T, baseOnly=T)#各ポジションの塩基組成(probability)を計算してhogeに格納。as.prob=Fにすることで塩基の出現割合ではなく出現頻度にすることもできる
out <- makePWM(hoge[1:4,])             #hogeはACGT以外の塩基(例えばN)のprobabilityもotherという5番目の行に出力するが、makePWM関数はACGTの最初の4行分の行列データのみ許容して受け付け、情報量(information content; ic)などを計算してくれる

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
dev.off()                              #おまじない
	

11. 入力ファイルがmulti-FASTA形式のファイル(cds.fna)の場合:

2019年5月13日の講義で利用した、2,311個のCDSのファイルです。見やすくすることを目的として、 最初の20塩基分のみ抽出してsequence logosを作成しています。

in_f <- "cds.fna"                      #入力ファイル名を指定してin_fに格納
out_f <- "hoge11.png"                  #出力ファイル名を指定してout_fに格納
param_length <- 20                     #最初の塩基数を指定
param_fig <- c(600, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み
library(seqLogo)                       #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#前処理(最初のparam_length塩基を抽出)
fasta <- subseq(fasta, start=1, end=param_length)#解析したい範囲を切り出してfastaに格納
fasta                                  #確認してるだけです

#本番(sequence logoを実行)
hoge <- consensusMatrix(fasta, as.prob=T, baseOnly=T)#各ポジションの塩基組成(probability)を計算してhogeに格納。as.prob=Fにすることで塩基の出現割合ではなく出現頻度にすることもできる
out <- makePWM(hoge[1:4,])             #hogeはACGT以外の塩基(例えばN)のprobabilityもotherという5番目の行に出力するが、makePWM関数はACGTの最初の4行分の行列データのみ許容して受け付け、情報量(information content; ic)などを計算してくれる

png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
seqLogo(out)                           #塩基組成やicの情報を含むoutを入力としてsequence logoを描画。単に「plot(out)」でも同じ結果が得られる。
dev.off()                              #おまじない
	

ggseqlogoパッケージを用いてsequence logos (Schneider and Stephens, 1990)を実行するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 入力ファイルがmulti-FASTA形式のファイル(test1.fasta)の場合:

in_f <- "test1.fasta"                  #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(ggseqlogo)                    #パッケージの読み込み
	

解析 | 一般 | 上流配列解析 | 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に格納
param_kmer <- 5                        #k-merのkの値を指定
param_fig <- c(1000, 500)              #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込みとフィルタリング
seq <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
seq                                    #seqの中身をざっとみてるだけ(33602個あることがわかる)
seq <- seq[width(seq) == median(width(seq))]#配列長はほとんどが一定長(この場合1000bp)だがときどき存在する異なるものを除去している
seq                                    #seqの中身をざっとみてるだけ(33600個となり、1000bpでなかったものが2個含まれていたことがわかる)

#(param1)-merの可能な全ての塩基配列を作成
reads <- mkAllStrings(c("A", "C", "G", "T"), param_kmer)#k連続塩基の全ての可能な配列情報をreadsに格納

#4^k通りの塩基配列一つ一つについて上流配列セット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]) - param_kmer + 1))#1000bp長の配列からk連続塩基で一致領域を探索しその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のどの行がどの連続塩基由来のものかを割り当てている

#有意なk-merを探索
threshold <- apply(out,1,median) + 5*apply(out,1,mad)#出現頻度の(median+5*MAD)の値を計算してthresholdに格納
obj <- apply(out,1,max) > threshold    #条件を満たすかどうかを判定した結果をobjに格納(出現頻度の最大値がthresholdより大きいかどうか)
baseline <- apply(out,1,median)        #baselineを出現頻度の中央値として与えている
baseline[baseline < 1] <- 1            #baselineが1未満のものを1に置換している
RPH <- apply(out,1,max) / baseline     #出現頻度の最大値をbaselineで割ったものをRPHと定義している
RPA <- apply((out - baseline),1,sum) / apply(out,1,sum)#「(出現頻度 - baseline)の和 / 出現頻度の和」をRPAと定義している

#ファイルに保存
tmp <- cbind(rownames(out), RPH, RPA, obj)#保存したい情報をtmpに格納
colnames(tmp) <- c("k-mer", "Relative Peak Height (RPH)", "Relative Peak Area (RPA)", "Local Distribution")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存

#既知のコアプロモーター領域の分布をチェック
plot(out["TATAA",])                    #TATA-boxのプロット
plot(out["GCCCA",])                    #PPDB中でGCCCA, PLACE(参考文献5)中でGGGCCというモチーフのやつ。転写開始点(右側)近傍にブロードにGCCCAという配列が濃縮して存在していることがわかる。
	

2. 上記を基本としつつ組合せ数分だけ原著論文(参考文献1)Fig.1と同じような図をpngファイルで生成したい場合:

(以下をコピペすると作業ディレクトリ上に1024個のpngファイルが生成されますので注意!!)

in_f <- "TAIR10_upstream_1000_20101104.fasta"#読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
param_kmer <- 5                        #k-merのkの値を指定
param_fig <- c(1000, 500)              #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込みとフィルタリング
seq <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
seq                                    #seqの中身をざっとみてるだけ(33602個あることがわかる)
seq <- seq[width(seq) == median(width(seq))]#配列長はほとんどが一定長(この場合1000bp)だがときどき存在する異なるものを除去している
seq                                    #seqの中身をざっとみてるだけ(33600個となり、1000bpでなかったものが2個含まれていたことがわかる)

#k-merの可能な全ての塩基配列を作成
reads <- mkAllStrings(c("A", "C", "G", "T"), param_kmer)#k連続塩基の全ての可能な配列情報をreadsに格納

#4^k通りの塩基配列一つ一つについて上流配列セット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]) - param_kmer + 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のどの行がどの連続塩基由来のものかを割り当てている

#有意なk-merを探索
threshold <- apply(out,1,median) + 5*apply(out,1,mad)#出現頻度の(median+5*MAD)の値を計算してthresholdに格納
obj <- apply(out,1,max) > threshold    #条件を満たすかどうかを判定した結果をobjに格納(出現頻度の最大値がthresholdより大きいかどうか)
baseline <- apply(out,1,median)        #baselineを出現頻度の中央値として与えている
baseline[baseline < 1] <- 1            #baselineが1未満のものを1に置換している
PH <- apply(out,1,max)                 #出現頻度の最大値をPHに格納
RPH <- PH / baseline                   #出現頻度の最大値をbaselineで割ったものをRPHと定義している
RPA <- apply((out - baseline),1,sum) / apply(out,1,sum)#「(出現頻度 - baseline)の和 / 出現頻度の和」をRPAと定義している

#ファイルに保存
tmp <- cbind(rownames(out), RPH, RPA, obj)#保存したい情報をtmpに格納
colnames(tmp) <- c("k-mer", "Relative Peak Height (RPH)", "Relative Peak Area (RPA)", "Local Distribution")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存

#pngファイルを一気に生成
for(i in 1:length(reads)){
    out_f <- paste("result_", rownames(out)[i], ".png", sep="")#ファイル名を作成
    png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
    plot(out[i,], ylim=c(0, max(c(PH[i], threshold[i]))),#行列outのi番目の行の数値をプロットしている
        ylab="Occurence", xlab="Position", type="p", pch=20, cex=0.8)#行列outのi番目の行の数値をプロットしている
    abline(h=baseline[i], col="red")   #baseline (出現頻度の中央値)を赤線で追加している
    text(0, baseline[i], "baseline", col="red", adj=c(0,0))#baselineを引いたところに"baseline"という文字を追加している
    abline(h=threshold[i], col="red")  #有意かどうかを判定するために採用した閾値(threshold = baseline+5*MAD)の値も赤線で追加している
    text(0, threshold[i], "threshold(= baseline + 5*MAD)", col="red", adj=c(0,0))#閾値を引いたところに"threshold"という文字を追加している
    dev.off()
}
	

3. 2と同じだが入力ファイルがラット上流配列セット(ファイル名:"rat_upstream_1000.fa")の場合:

in_f <- "rat_upstream_1000.fa"         #読み込みたいFASTA形式のファイル名を指定してin_fに格納
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
param_kmer <- 5                        #k-merのkの値を指定
param_fig <- c(1000, 500)              #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込みとフィルタリング
seq <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
seq                                    #seqの中身をざっとみてるだけ(33602個あることがわかる)
seq <- seq[width(seq) == median(width(seq))]#配列長はほとんどが一定長(この場合1000bp)だがときどき存在する異なるものを除去している
seq                                    #seqの中身をざっとみてるだけ(33600個となり、1000bpでなかったものが2個含まれていたことがわかる)

#(param1)-merの可能な全ての塩基配列を作成
reads <- mkAllStrings(c("A", "C", "G", "T"), param1)#k連続塩基の全ての可能な配列情報を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]) - param_kmer + 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のどの行がどの連続塩基由来のものかを割り当てている

#有意なk-merを探索
threshold <- apply(out,1,median) + 5*apply(out,1,mad)#出現頻度の(median+5*MAD)の値を計算してthresholdに格納
obj <- apply(out,1,max) > threshold    #条件を満たすかどうかを判定した結果をobjに格納(出現頻度の最大値がthresholdより大きいかどうか)
baseline <- apply(out,1,median)        #baselineを出現頻度の中央値として与えている
baseline[baseline < 1] <- 1            #baselineが1未満のものを1に置換している
PH <- apply(out,1,max)                 #出現頻度の最大値をPHに格納
RPH <- PH / baseline                   #出現頻度の最大値をbaselineで割ったものをRPHと定義している
RPA <- apply((out - baseline),1,sum) / apply(out,1,sum)#「(出現頻度 - baseline)の和 / 出現頻度の和」をRPAと定義している

#ファイルに保存
tmp <- cbind(rownames(out), RPH, RPA, obj)#保存したい情報をtmpに格納
colnames(tmp) <- c("k-mer", "Relative Peak Height (RPH)", "Relative Peak Area (RPA)", "Local Distribution")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存

#pngファイルを一気に生成
for(i in 1:length(reads)){
    out_f <- paste("result_", rownames(out)[i], ".png", sep="")#ファイル名を作成している
    png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
    plot(out[i,], ylim=c(0, max(c(PH[i], threshold[i]))),#行列outのi番目の行の数値をプロットしている
        ylab="Occurence", xlab="Position", type="p", pch=20, cex=0.8)#行列outのi番目の行の数値をプロットしている
    abline(h=baseline[i], col="red")   #baseline (出現頻度の中央値)を赤線で追加している
    text(0, baseline[i], "baseline", col="red", adj=c(0,0))#baselineを引いたところに"baseline"という文字を追加している
    abline(h=threshold[i], col="red")  #有意かどうかを判定するために採用した閾値(threshold = baseline+5*MAD)の値も赤線で追加している
    text(0, threshold[i], "threshold(= baseline + 5*MAD)", col="red", adj=c(0,0))#閾値を引いたところに"threshold"という文字を追加している
    dev.off()
}
	

解析 | 一般 | 上流配列解析 | Relative Appearance Ratio(Yamamoto_2011)

手元に(Rで)マイクロアレイデータ解析サンプルマイクロアレイデータ21の「発現変動遺伝子(DEG)の転写開始点のFASTA形式の上流配列セット(ファイル名:"seq_BAT_DEG.fa")」と「それ以外(nonDEG)の上流配列セット(ファイル名:"seq_BAT_nonDEG.fa")」 の二つのファイルがあったときに、任意のk-mer(4k通り;k=6のときは4096通り)に対して、どのk-merが発現変動と関連しているかをFisher's Exact Testを用いてp値を計算する手順を示します。 尚、ここで用いている二つのファイルはいずれも「ACGTのみからなり、配列長は1000bp」です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. pentamer(5-mer; 45=1024通り)で各k-merごとにp値とFDR値をリストアップする場合:

in_f1 <- "seq_BAT_DEG.fa"              #読み込みたいFASTA形式のDEGのファイル名を指定してin_f1に格納
in_f2 <- "seq_BAT_nonDEG.fa"           #読み込みたいFASTA形式のnonDEGのファイル名を指定してin_f2に格納
out_f <- "hoge.txt"                    #出力ファイル名を指定してout_fに格納
param_kmer <- 5                        #k-merのkの値を指定

#必要なパッケージをロード
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)#k連続塩基の全ての可能な配列情報をreadsに格納

#4^k通りの塩基配列一つ一つについて上流配列セットに対するパターンマッチングを行う
out <- NULL
for(i in 1:length(reads)){             #readsの要素数分だけループを回す
    tmp <- vmatchPattern(pattern=as.character(reads[i]), subject=seq_DEG)#オブジェクトreads中の各塩基配列と100%マッチの領域を探索し、結果をtmpに格納
    out_DEG <- length(start(unlist(tmp)))#一致領域のstart positionの情報を抽出してout_DEGに格納
    tmp <- vmatchPattern(pattern=as.character(reads[i]), subject=seq_nonDEG)#オブジェクトreads中の各塩基配列と100%マッチの領域を探索し、結果をtmpに格納
    out_nonDEG <- length(start(unlist(tmp)))#一致領域のstart positionの情報を抽出してout_nonDEGに格納
    x <- c(out_nonDEG, length(seq_nonDEG), out_DEG, length(seq_DEG))#Fisher's Exact Testを行うための2×2分割表の基礎情報を作成してxに格納
    data <- matrix(x, ncol=2, byrow=T) #ベクトルxを行列形式に変換した結果をdataに格納
    pvalue <- fisher.test(data)$p.value#Fisher's Exact Testを行って得られたp値をpvalueに格納
    out <- rbind(out, c(x, pvalue))    #必要な情報を行方向で結合することでまとめている
    if(i%%10 == 0) cat(i, "/", length(reads), "finished\n")      #進行状況を表示させてるだけ 
}
rownames(out) <- reads                 #行列outのどの行がどの連続塩基由来のものかを割り当てている(行名を与えている)
p.value <- out[,ncol(out)]             #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納

#ファイルに保存
tmp <- cbind(rownames(out), out, q.value)  #保存したい情報をtmpに格納
colnames(tmp) <- c("k-mer", "Occurence in nonDEG", "# of nonDEG sequences", "Occurence in DEG", "# of DEG sequences", "p.value", "q.value")#列名を付与
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
	

解析 | ゲノム | について

この項目周辺のカテゴライズはもはやメチャクチャですが...探そうと思ったときに意外と見つけるのが大変なものたちなので、見つけたときにリストアップしておきます。 例えば、regioneRは、 ある解析で得られたゲノム上の特定の領域群Aと領域群Bが手元にあったときに、そのオーバーラップが有意かどうかを判定するときに使えるプログラムです。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | ゲノム | 領域の一致の評価 | regioneR(Gel_2016)

regioneRを用いて、 ゲノム上の特定の領域群Aと領域群Bを入力として、そのオーバーラップが有意かどうかを判定します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1.


	

解析 | 基礎 | k-mer | ゲノムサイズ推定(基礎) | qrqc

qrqcパッケージを用いてNGSデータのk-mer解析の基本的な考え方を、ゲノムサイズ推定を例に示します。 ゲノムサイズとは「トータルの塩基数」のことであり、例えばsample32_ref.fastaだと50塩基になります。 NGSデータは断片化されたリードからなり、サンプルデータ32のFASTA形式ファイル (sample32_ngs.fasta)が仮想NGSデータになります。 これは20塩基分の断片配列(リード)を10個ランダム抽出したものだからです。 k-mer解析とは、リード長L(この場合L=20)よりも短いk個の連続塩基 (k < Lなので、L=20の場合はkは19以下になる)を生成させて、 主にその出現頻度を解析するものを指します。 L=20でk=19としたときはk-merの数は2個、 L=20でk=18としたときはk-merの数は3個、 L=20でk=17としたときはk-merの数は4個、... 一般式で書くと、k-merの数は(L-k+1)個と表現できます。1つのリードにつき(L-k+1)個分のk-mer数が生成されますので、 リード数をnとすると、n×(L-k+1)個分のk-merが生成されることになります。 もちろん、総数n×(L-k+1)個のk-merの中には全く同じ配列のものが含まれることもあるでしょう。 例えばACTGTTT, TCGGGGG, ACTGTTT, TCGGGGA, TCCGGGG, TCCGGGG, AAAACCC, TTTTAAAの場合は、k-merの総数は8個(k=7)です。 k-mer解析は、「ACTGTTTが2回, TCGGGGGが1回, TCGGGGAが1回, TCCGGGGが2回, AAAACCCが1回, TTTTAAAが1回出現」というのを調べるものです。 これが例題中の「kmer」というオブジェクトの出力結果に相当します。 k-merの種類数は6個になります。この種類数が例題中の「length(kmer)」というオブジェクトの出力結果に相当し、 ゲノムサイズの「推定値」そのものとして使えるのです。 例題では概念を説明すべく、仮想ゲノム配列の長さを制限していますが、実際にはバクテリアゲノムでも数MBと長いです。 これ(仮想ゲノム配列)を1つの長いリードLとだと考えます。そしてk-merのk値はある程度大きい数値を指定します。例えばk=50とかです。 そうすると、k-merの総数は(L-k+1)個ですが、Lが数MBという長さでk=50という状況(一般式で書くとL >> k)だと、 (L-k+1)個というk-merの総数はL個と近似できるわけです(だってL >> kなんだから)。 そして、k-merの種類数は、最大でも4^k個分だけ存在するわけですので、 そこそこ大きなk値を採用(例えばk=50とか)している限り、1つの長いリードLの塩基数と近似できます。 ここでのLは仮想ゲノム配列に相当します。 ここまでは仮想ゲノム配列をLとしてk-mer解析したときに、ゲノムサイズをk-merの種類数で近似できるという話でした。 ここからはNGSデータを入力として、どうやってゲノムサイズ推定を行うかという話になります。 k-mer解析は、NGSのリード長Lよりも短いk値の出現頻度解析を行うものです。 k=50など、そこそこ大きな値を用いてk-mer解析しますので、 実際ゲノムサイズの何倍読もうが(coverageが50Xだろうが1000Xだろうが、という意味)k-merの種類数には何の影響も与えません。 つまり、リード数をnとすると、k-merの総数はn×(L-k+1)個ですので、読めば読むほどどんどん増えていきますが、 k-merの種類数はゲノムサイズ以上には増えないのです。同じ配列を10回読もうが100回読もうが、種類が増える方向には寄与しないからです。
  この項目の例題では、その感覚を身に着けるところまでを示しています。 例題中の「length(kmer)」というオブジェクトの出力結果と実際の答え(仮想ゲノム配列のサイズ)と比べてみるといいでしょう。 kが小さいときはよくわかりませんが、例題10の「10,000塩基の仮想ゲノム配列(リファレンス配列)で100Xのリードデータでk=11のk-mer解析」 くらいの規模だと実感できるでしょう。もちろん実データの場合は、シークエンスエラーが含まれます。 それはk-merの種類数を増やすネガティブな効果をもたらします。 がシークエンスエラー由来k-merも、「横軸が出現回数(k-merの種類は気にしない)、縦軸がその頻度」からなるグラフを描くことで同定することができます。 例えば、「ACTGTTTが2回, TCGGGGGが1回, TCGGGGAが1回, TCCGGGGが2回, AAAACCCが1回, TTTTAAAが1回出現」の場合は、 1回出現したものが4個(x=1, y=4)、2回出現したものが2個(x=2, y=2)といった具合でプロットできます。 例題10の出力ファイルはシークエンスエラーがない場合です。だいたい40-65回出現したk-merがほとんどを占めていることがわかります。 この分布が真のゲノム配列由来k-merの分布になります。 実際のシークエンスエラーを含むデータの場合は、この分布以外に数回しか出現しないk-merのところにもピークが出ます。 この状況は分布をみれば一目瞭然なので、ゲノムサイズ推定の場合には、例えば(実際のcoverageにも依存しますが概ね) 5回以下しか出現しなかったk-merはシークエンスエラー由来だと判断してk-merの種類数カウントから除外するなどして対応します。 以上は、谷澤靖洋氏提供情報などをもとに2016年1月6日に備忘録的にまとめたものです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ32のFASTA形式ファイル(sample32_ngs.fasta)の場合:

4X coverageであることが分かっているデータです。 理由は、50塩基長のリファレンス配列(仮想ゲノム配列; sample32_ref.fasta)から20塩基長のリードを10個ランダム抽出したものだからです。 k-merのkの値は、リード配列長以下に設定します。この場合は20塩基以下ですので、条件を満たす19を指定しています。

in_f <- "sample32_ngs.fasta"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 19                       #k-merのkの値を指定
param_fig <- c(400, 380)               #ヒストグラム描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(qrqc)                          #パッケージの読み込み

#入力ファイルの読み込み
hoge <- readSeqFile(in_f, type="fasta", kmer=T, k=param_kmer)#in_fで指定したファイルの読み込み
hoge                                   #確認してるだけです

#本番(k-mer出現頻度解析)
kmer <- table(hoge@kmer$kmer)          #k-merごとの出現頻度を抽出
kmer                                   #確認してるだけです
length(kmer)                           #k-merの種類数を表示(sequence errorがない場合にはゲノムサイズに相当)
table(kmer)                            #k-merの出現数ごとの頻度を表示(k-merの種類を問わない)

#ファイルに保存(ヒストグラム)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hist(kmer, ylab="Frequency(number of k-mers)",#ヒストグラムを描画
     xlab=paste("Number of occurences at k=", param_kmer, sep=""))#ヒストグラムを描画
dev.off()                              #おまじない
	

2. サンプルデータ32のFASTA形式ファイル(sample32_ngs.fasta)の場合:

4X coverageであることが分かっているデータです。 理由は、50塩基長のリファレンス配列から20塩基長のリードを10個ランダム抽出したものだからです。 k-merのkの値は、リード配列長以下に設定します。この場合は20塩基以下ですので、条件を満たす11を指定しています。

in_f <- "sample32_ngs.fasta"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 11                       #k-merのkの値を指定
param_fig <- c(400, 380)               #ヒストグラム描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(qrqc)                          #パッケージの読み込み

#入力ファイルの読み込み
hoge <- readSeqFile(in_f, type="fasta", kmer=T, k=param_kmer)#in_fで指定したファイルの読み込み
hoge                                   #確認してるだけです

#本番(k-mer出現頻度解析)
kmer <- table(hoge@kmer$kmer)          #k-merごとの出現頻度を抽出
kmer                                   #確認してるだけです
length(kmer)                           #k-merの種類数を表示(sequence errorがない場合にはゲノムサイズに相当)
table(kmer)                            #k-merの出現数ごとの頻度を表示(k-merの種類を問わない)

#ファイルに保存(ヒストグラム)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hist(kmer, ylab="Frequency(number of k-mers)",#ヒストグラムを描画
     xlab=paste("Number of occurences at k=", param_kmer, sep=""))#ヒストグラムを描画
dev.off()                              #おまじない
	

3. サンプルデータ32のFASTA形式ファイル(sample32_ngs.fasta)の場合:

4X coverageであることが分かっているデータです。 理由は、50塩基長のリファレンス配列から20塩基長のリードを10個ランダム抽出したものだからです。 k-merのkの値は、リード配列長以下に設定します。この場合は20塩基以下ですので、条件を満たす5を指定しています。

in_f <- "sample32_ngs.fasta"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 5                        #k-merのkの値を指定
param_fig <- c(400, 380)               #ヒストグラム描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(qrqc)                          #パッケージの読み込み

#入力ファイルの読み込み
hoge <- readSeqFile(in_f, type="fasta", kmer=T, k=param_kmer)#in_fで指定したファイルの読み込み
hoge                                   #確認してるだけです

#本番(k-mer出現頻度解析)
kmer <- table(hoge@kmer$kmer)          #k-merごとの出現頻度を抽出
kmer                                   #確認してるだけです
length(kmer)                           #k-merの種類数を表示(sequence errorがない場合にはゲノムサイズに相当)
table(kmer)                            #k-merの出現数ごとの頻度を表示(k-merの種類を問わない)

#ファイルに保存(ヒストグラム)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hist(kmer, ylab="Frequency(number of k-mers)",#ヒストグラムを描画
     xlab=paste("Number of occurences at k=", param_kmer, sep=""))#ヒストグラムを描画
dev.off()                              #おまじない
	

4. サンプルデータ33のFASTA形式ファイル(sample33_ngs.fasta)の場合:

4X coverageであることが分かっているデータです。 理由は、1,000塩基長のリファレンス配列から20塩基長のリードを200個ランダム抽出したものだからです。 k-merのkの値は、リード配列長以下に設定します。この場合は20塩基以下ですので、条件を満たす5を指定しています。

in_f <- "sample33_ngs.fasta"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 5                        #k-merのkの値を指定
param_fig <- c(400, 380)               #ヒストグラム描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(qrqc)                          #パッケージの読み込み

#入力ファイルの読み込み
hoge <- readSeqFile(in_f, type="fasta", kmer=T, k=param_kmer)#in_fで指定したファイルの読み込み
hoge                                   #確認してるだけです

#本番(k-mer出現頻度解析)
kmer <- table(hoge@kmer$kmer)          #k-merごとの出現頻度を抽出
kmer                                   #確認してるだけです
length(kmer)                           #k-merの種類数を表示(sequence errorがない場合にはゲノムサイズに相当)
table(kmer)                            #k-merの出現数ごとの頻度を表示(k-merの種類を問わない)

#ファイルに保存(ヒストグラム)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hist(kmer, ylab="Frequency(number of k-mers)",#ヒストグラムを描画
     xlab=paste("Number of occurences at k=", param_kmer, sep=""))#ヒストグラムを描画
dev.off()                              #おまじない
	

5. サンプルデータ34のFASTA形式ファイル(sample34_ngs.fasta)の場合:

10X coverageであることが分かっているデータです。 理由は、1,000塩基長のリファレンス配列から20塩基長のリードを500個ランダム抽出したものだからです。 k-merのkの値は、リード配列長以下に設定します。この場合は20塩基以下ですので、条件を満たす5を指定しています。

in_f <- "sample34_ngs.fasta"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 5                        #k-merのkの値を指定
param_fig <- c(400, 380)               #ヒストグラム描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(qrqc)                          #パッケージの読み込み

#入力ファイルの読み込み
hoge <- readSeqFile(in_f, type="fasta", kmer=T, k=param_kmer)#in_fで指定したファイルの読み込み
hoge                                   #確認してるだけです

#本番(k-mer出現頻度解析)
kmer <- table(hoge@kmer$kmer)          #k-merごとの出現頻度を抽出
kmer                                   #確認してるだけです
length(kmer)                           #k-merの種類数を表示(sequence errorがない場合にはゲノムサイズに相当)
table(kmer)                            #k-merの出現数ごとの頻度を表示(k-merの種類を問わない)

#ファイルに保存(ヒストグラム)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hist(kmer, ylab="Frequency(number of k-mers)",#ヒストグラムを描画
     xlab=paste("Number of occurences at k=", param_kmer, sep=""))#ヒストグラムを描画
dev.off()                              #おまじない
	

6. サンプルデータ35のFASTA形式ファイル(sample35_ngs.fasta)の場合:

10X coverageであることが分かっているデータです。 理由は、10,000塩基長のリファレンス配列から40塩基長のリードを2,500個ランダム抽出したものだからです。 k-merのkの値は、リード配列長以下に設定します。この場合は40塩基以下ですので、条件を満たす15を指定しています。

in_f <- "sample35_ngs.fasta"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 15                       #k-merのkの値を指定
param_fig <- c(400, 380)               #ヒストグラム描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(qrqc)                          #パッケージの読み込み

#入力ファイルの読み込み
hoge <- readSeqFile(in_f, type="fasta", kmer=T, k=param_kmer)#in_fで指定したファイルの読み込み
hoge                                   #確認してるだけです

#本番(k-mer出現頻度解析)
kmer <- table(hoge@kmer$kmer)          #k-merごとの出現頻度を抽出
kmer                                   #確認してるだけです
length(kmer)                           #k-merの種類数を表示(sequence errorがない場合にはゲノムサイズに相当)
table(kmer)                            #k-merの出現数ごとの頻度を表示(k-merの種類を問わない)

#ファイルに保存(ヒストグラム)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hist(kmer, ylab="Frequency(number of k-mers)",#ヒストグラムを描画
     xlab=paste("Number of occurences at k=", param_kmer, sep=""))#ヒストグラムを描画
dev.off()                              #おまじない
	

7. サンプルデータ36のFASTA形式ファイル(sample36_ngs.fasta)の場合:

40X coverageであることが分かっているデータです。 理由は、10,000塩基長のリファレンス配列から80塩基長のリードを5,000個ランダム抽出したものだからです。 k-merのkの値は、リード配列長以下に設定します。この場合は80塩基以下ですので、条件を満たす21を指定しています。 hist関数実行時に分割数を指定すべくbreaksオプションも変更しています。

in_f <- "sample36_ngs.fasta"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 21                       #k-merのkの値を指定
param_fig <- c(400, 380)               #ヒストグラム描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(qrqc)                          #パッケージの読み込み

#入力ファイルの読み込み
hoge <- readSeqFile(in_f, type="fasta", kmer=T, k=param_kmer)#in_fで指定したファイルの読み込み
hoge                                   #確認してるだけです

#本番(k-mer出現頻度解析)
kmer <- table(hoge@kmer$kmer)          #k-merごとの出現頻度を抽出
kmer                                   #確認してるだけです
length(kmer)                           #k-merの種類数を表示(sequence errorがない場合にはゲノムサイズに相当)
table(kmer)                            #k-merの出現数ごとの頻度を表示(k-merの種類を問わない)

#ファイルに保存(ヒストグラム)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hist(kmer, ylab="Frequency(number of k-mers)",#ヒストグラムを描画
     xlab=paste("Number of occurences at k=", param_kmer, sep=""),#ヒストグラムを描画
     breaks=max(kmer))                 #ヒストグラムを描画
dev.off()                              #おまじない
	

8. サンプルデータ37のFASTA形式ファイル(sample37_ngs.fasta)の場合:

100X coverageであることが分かっているデータです。 理由は、10,000塩基長のリファレンス配列から100塩基長のリードを10,000個ランダム抽出したものだからです。 k-merのkの値は、リード配列長以下に設定します。この場合は100塩基以下ですので、条件を満たす21を指定しています。 hist関数実行時に分割数を指定すべくbreaksオプションも変更しています。

in_f <- "sample37_ngs.fasta"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge8.png"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 21                       #k-merのkの値を指定
param_fig <- c(400, 380)               #ヒストグラム描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(qrqc)                          #パッケージの読み込み

#入力ファイルの読み込み
hoge <- readSeqFile(in_f, type="fasta", kmer=T, k=param_kmer)#in_fで指定したファイルの読み込み
hoge                                   #確認してるだけです

#本番(k-mer出現頻度解析)
kmer <- table(hoge@kmer$kmer)          #k-merごとの出現頻度を抽出
kmer                                   #確認してるだけです
length(kmer)                           #k-merの種類数を表示(sequence errorがない場合にはゲノムサイズに相当)
table(kmer)                            #k-merの出現数ごとの頻度を表示(k-merの種類を問わない)

#ファイルに保存(ヒストグラム)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hist(kmer, ylab="Frequency(number of k-mers)",#ヒストグラムを描画
     xlab=paste("Number of occurences at k=", param_kmer, sep=""),#ヒストグラムを描画
     breaks=max(kmer))                 #ヒストグラムを描画
dev.off()                              #おまじない
	

9. サンプルデータ37のFASTA形式ファイル(sample37_ngs.fasta)の場合:

100X coverageであることが分かっているデータです。 理由は、10,000塩基長のリファレンス配列から100塩基長のリードを10,000個ランダム抽出したものだからです。 k-merのkの値は、リード配列長以下に設定します。この場合は100塩基以下ですので、条件を満たす31を指定しています。 hist関数実行時に分割数を指定すべくbreaksオプションも変更しています。

in_f <- "sample37_ngs.fasta"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge9.png"                   #出力ファイル名を指定してout_fに格納
param_kmer <- 31                       #k-merのkの値を指定
param_fig <- c(400, 380)               #ヒストグラム描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(qrqc)                          #パッケージの読み込み

#入力ファイルの読み込み
hoge <- readSeqFile(in_f, type="fasta", kmer=T, k=param_kmer)#in_fで指定したファイルの読み込み
hoge                                   #確認してるだけです

#本番(k-mer出現頻度解析)
kmer <- table(hoge@kmer$kmer)          #k-merごとの出現頻度を抽出
kmer                                   #確認してるだけです
length(kmer)                           #k-merの種類数を表示(sequence errorがない場合にはゲノムサイズに相当)
table(kmer)                            #k-merの出現数ごとの頻度を表示(k-merの種類を問わない)

#ファイルに保存(ヒストグラム)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hist(kmer, ylab="Frequency(number of k-mers)",#ヒストグラムを描画
     xlab=paste("Number of occurences at k=", param_kmer, sep=""),#ヒストグラムを描画
     breaks=max(kmer))                 #ヒストグラムを描画
dev.off()                              #おまじない
	

10. サンプルデータ37のFASTA形式ファイル(sample37_ngs.fasta)の場合:

100X coverageであることが分かっているデータです。 理由は、10,000塩基長のリファレンス配列から100塩基長のリードを10,000個ランダム抽出したものだからです。 k-merのkの値は、リード配列長以下に設定します。この場合は100塩基以下ですので、条件を満たす11を指定しています。 hist関数実行時に分割数を指定すべくbreaksオプションも変更しています。

in_f <- "sample37_ngs.fasta"           #入力ファイル名を指定してin_fに格納
out_f <- "hoge10.png"                  #出力ファイル名を指定してout_fに格納
param_kmer <- 11                       #k-merのkの値を指定
param_fig <- c(400, 380)               #ヒストグラム描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(qrqc)                          #パッケージの読み込み

#入力ファイルの読み込み
hoge <- readSeqFile(in_f, type="fasta", kmer=T, k=param_kmer)#in_fで指定したファイルの読み込み
hoge                                   #確認してるだけです

#本番(k-mer出現頻度解析)
kmer <- table(hoge@kmer$kmer)          #k-merごとの出現頻度を抽出
kmer                                   #確認してるだけです
length(kmer)                           #k-merの種類数を表示(sequence errorがない場合にはゲノムサイズに相当)
table(kmer)                            #k-merの出現数ごとの頻度を表示(k-merの種類を問わない)

#ファイルに保存(ヒストグラム)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hist(kmer, ylab="Frequency(number of k-mers)",#ヒストグラムを描画
     xlab=paste("Number of occurences at k=", param_kmer, sep=""),#ヒストグラムを描画
     breaks=max(kmer))                 #ヒストグラムを描画
dev.off()                              #おまじない
	

解析 | 基礎 | 平均-分散プロット | について

よく統計解析手法の論文で出てくる図で、同一群の反復(複製)データがどれだけばらついているかを示すものです。 素人さんは何のことか分からないでしょうし、私も講習会などでは、この図よりは素人さんでも分かりやすいM-A plotで同一群のばらつきを示しますが、 こちらのほうが一般的です。

解析 | 基礎 | 平均-分散プロット(Technical replicates)

MarioniらはTechnical replicatesのデータがポアソン分布(Poisson distribution)に従うことを報告しています(Marioni et al., Genome Res., 2008)。 つまり「各遺伝子のtechnical replicatesデータの平均と分散が全体として同じ」だと言っているわけです。ここでは、横軸:平均、縦軸:分散としたプロットを描画してその傾向を眺めます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ4の18,110 genes×10 samplesのリアルデータ(data_marioni.txt; kidney 5サンプル vs. liver 5サンプル)の場合:

総リード数補正を行って、群ごとにプロットしています。

in_f <- "data_marioni.txt"             #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge1_G1.txt"               #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1_G1.png"               #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge1_G2.txt"               #出力ファイル名を指定してout_f3に格納
out_f4 <- "hoge1_G2.png"               #出力ファイル名を指定してout_f4に格納
out_f5 <- "hoge1_all.png"              #出力ファイル名を指定してout_f5に格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定    
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)                          #総リード数を表示

#前処理(データ正規化; 群ごとに総リード数の平均値を揃えている)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
hoge <- data[,data.cl==1]              #G1群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G1群の正規化係数を計算した結果をnfに格納
G1 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG1に格納
colSums(G1)                            #総リード数を表示
hoge <- data[,data.cl==2]              #G2群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G2群の正規化係数を計算した結果をnfに格納
G2 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG2に格納
colSums(G2)                            #総リード数を表示

#本番(Mean-Variance plotなど; G1群)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), data[,data.cl==1], hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="blue")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G1", col="blue", pch=20)#凡例を作成

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEからなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#VARIANCEを目的変数、MEANを説明変数としてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が-0.086347, 傾き(MEAN)が0.996054であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.8737と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという説明変数が不要であるという帰無仮説を棄却するに値する、つまり説明変数が目的変数によって説明可能であることを意味する)
dev.off()                              #おまじない

#本番(Mean-Variance plotなど; G2群)
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), data[,data.cl==2], hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f4, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G2", col="red", pch=20)#凡例を作成

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEからなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#VARIANCEを目的変数、MEANを説明変数としてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が-0.09624, 傾き(MEAN)が0.99442であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.8732と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという説明変数が不要であるという帰無仮説を棄却することを意味する)
dev.off()                              #おまじない

#本番(Mean-Variance plot; G1 and G2両方)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
png(out_f5, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="blue")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", c("G1", "G2"), col=c("blue", "red"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

2. サンプルデータ4の18,110 genes×10 samplesのリアルデータ(data_marioni.txt; kidney 5サンプル vs. liver 5サンプル)の場合:

総リード数補正を行って、2つの群をまとめてプロットしています。

in_f <- "data_marioni.txt"             #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge2.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge2.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定    
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)                          #総リード数を表示

#前処理(総リード数補正)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
nf <- mean(colSums(data))/colSums(data)#G1群の正規化係数を計算した結果をnfに格納
normalized.count <- sweep(data, 2, nf, "*")#正規化係数を各列に掛けた結果をnormalized.countに格納
colSums(normalized.count)              #総リード数を表示

#ファイルに保存(テキストファイル)
hoge <- normalized.count               #hogeとして取り扱う
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(Mean-Variance plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="black")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G1+G2", col="black", pch=20)#凡例を作成

#後処理(回帰分析など)
hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEからなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#VARIANCEを目的変数、MEANを説明変数としてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が0.092862, 傾き(MEAN)が1.449496であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.8818と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという説明変数が不要であるという帰無仮説を棄却することを意味する)
dev.off()                              #おまじない
	

3. サンプルデータ4の18,110 genes×10 samplesのリアルデータ(data_marioni.txt; kidney 5サンプル vs. liver 5サンプル)の場合:

総リード数補正を行って、2つの群をまとめてプロットしています。また、G2群のみのプロットも重ね書きしています。

in_f <- "data_marioni.txt"             #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定    
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)                          #総リード数を表示

#前処理(総リード数補正)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
nf <- mean(colSums(data))/colSums(data)#正規化係数を計算した結果をnfに格納
normalized.count <- sweep(data, 2, nf, "*")#正規化係数を各列に掛けた結果をnormalized.countに格納
colSums(normalized.count)              #総リード数を表示

#ファイルに保存(Mean-Variance plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hoge <- normalized.count               #hogeとして取り扱う
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="black")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
MEAN <- apply(hoge[,data.cl==2], 1, mean)#各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge[,data.cl==2], 1, var)#各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("bottomright", c("G1+G2", "G2"), col=c("black", "red"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

4. サンプルデータ4の18,110 genes×10 samplesのリアルデータ(data_marioni.txt; kidney 5サンプル vs. liver 5サンプル)の場合:

TCCパッケージ中のiDEGES/edgeR正規化後のデータを用いて、2つの群をまとめてプロットしています。また、G2群のみのプロットも重ね書きしています。

in_f <- "data_marioni.txt"             #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#ファイルに保存(Mean-Variance plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hoge <- normalized                     #hogeとして取り扱う
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="black")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
MEAN <- apply(hoge[,data.cl==2], 1, mean)#各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge[,data.cl==2], 1, var)#各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("bottomright", c("G1+G2", "G2"), col=c("black", "red"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

5. サンプルデータ4の18,110 genes×10 samplesのリアルデータ(data_marioni.txt; kidney 5サンプル vs. liver 5サンプル)の場合:

TCCパッケージ中のiDEGES/edgeR正規化後のデータを用いて、2つの群をまとめてプロットしています。

iDEGES/edgeR-edgeR解析パイプライン適用後のFDR < 0.05を満たす遺伝子をマゼンタで色づけしています。

in_f <- "data_marioni.txt"             #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
obj <- as.logical(tcc$stat$q.value < param_FDR)#条件を満たすかどうかを判定した結果をobjに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(Mean-Variance plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hoge <- normalized                     #hogeとして取り扱う
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+06), ylim=c(1e-02, 1e+06), col="black")#プロット
points(MEAN[obj], VARIANCE[obj], col="magenta", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("bottomright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

6. サンプルデータ4の18,110 genes×10 samplesのリアルデータ(data_marioni.txt; kidney 5サンプル vs. liver 5サンプル)の場合:

例題1と基本的に同じですが、負の二項分布(Negative Binomial distribution)の式である「分散 = 平均 + Φ×平均^2」に当てはめてΦ(ふぁい、と読む)の値も計算して出力しています。 このデータは「分散 = 平均」で表されるポアソン分布に従うことが分かっているので、Φが0に近い値になることを確認しています。

in_f <- "data_marioni.txt"             #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge6_G1.txt"               #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge6_G2.txt"               #出力ファイル名を指定してout_f2に格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定    
param_G2 <- 5                          #G2群(liver)のサンプル数を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(データ正規化; 群ごとに総リード数の平均値を揃えている)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
hoge <- data[,data.cl==1]              #G1群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G1群の正規化係数を計算した結果をnfに格納
G1 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG1に格納

hoge <- data[,data.cl==2]              #G2群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G2群の正規化係数を計算した結果をnfに格納
G2 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG2に格納

#本番(基本情報取得; G1群)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
PHI <- (VARIANCE - MEAN)/(MEAN^2)      #各行のPHIを計算した結果をPHIに格納
tmp <- cbind(rownames(data), data[,data.cl==1], hoge, MEAN, VARIANCE, PHI)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#本番(基本情報取得; G2群)
hoge <- G2                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
PHI <- (VARIANCE - MEAN)/(MEAN^2)      #各行のPHIを計算した結果をPHIに格納
tmp <- cbind(rownames(data), data[,data.cl==2], hoge, MEAN, VARIANCE, PHI)#保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

	

解析 | 基礎 | 平均-分散プロット(Biological replicates)

Biological replicatesのデータは負の二項分布(negative binomial distribution; 分散 > 平均)に従うことを検証します。 つまり、ポアソン分布(分散 = 平均)よりももっとばらつきが大きいということを言っています。 ここでは、横軸:平均、縦軸:分散としたプロットを描画してその傾向を眺めます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。2020年4月1日に負の二項分布(Negative Binomial distribution)の式である「分散 = 平均 + Φ×平均^2」に当てはめてΦ(ふぁい、と読む)の値も計算して出力するように変更しました。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge1_G1.txt"               #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1_G1.png"               #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge1_G2.txt"               #出力ファイル名を指定してout_f3に格納
out_f4 <- "hoge1_G2.png"               #出力ファイル名を指定してout_f4に格納
out_f5 <- "hoge1_all.png"              #出力ファイル名を指定してout_f5に格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)                          #総リード数を表示

#前処理(データ正規化; 群ごとに総リード数の平均値を揃えている)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
hoge <- data[,data.cl==1]              #G1群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G1群の正規化係数を計算した結果をnfに格納
G1 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG1に格納
colSums(G1)                            #総リード数を表示
hoge <- data[,data.cl==2]              #G2群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G2群の正規化係数を計算した結果をnfに格納
G2 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG2に格納
colSums(G2)                            #総リード数を表示

#本番(Mean-Variance plotなど; G1群)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
PHI <- (VARIANCE - MEAN)/(MEAN^2)      #各行のPHIを計算した結果をPHIに格納
tmp <- cbind(rownames(data), data[,data.cl==1], hoge, MEAN, VARIANCE, PHI)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G1", col="blue", pch=20)#凡例を作成

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEからなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#VARIANCEを目的変数、MEANを説明変数としてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が0.050583, 傾き(MEAN)が1.410874であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.7836と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという説明変数が不要であるという帰無仮説を棄却することを意味する)
dev.off()                              #おまじない

#本番(Mean-Variance plotなど; G2群)
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
PHI <- (VARIANCE - MEAN)/(MEAN^2)      #各行のPHIを計算した結果をPHIに格納
tmp <- cbind(rownames(data), data[,data.cl==2], hoge, MEAN, VARIANCE, PHI)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f4, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G2", col="red", pch=20)#凡例を作成

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEからなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#VARIANCEを目的変数、MEANを説明変数としてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が0.056976, 傾き(MEAN)が1.347954であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.7544と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという説明変数が不要であるという帰無仮説を棄却することを意味する)
dev.off()                              #おまじない

#本番(Mean-Variance plot; G1 and G2両方)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
png(out_f5, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", c("G1", "G2"), col=c("blue", "red"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

non-DEGデータのみで総リード数を揃えてから計6サンプルを一緒にしてプロットしています。これが検定のイメージです。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge2.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge2.png"                  #出力ファイル名を指定してout_f2に格納
param_DEG_G1 <- 1:1800                 #G1群で高発現のDEGの位置を指定
param_DEG_G2 <- 1801:2000              #G2群で高発現のDEGの位置を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)                          #全データの総リード数を表示
colSums(data[param_nonDEG,])           #non-DEGのみの総リード数を表示

#前処理(データ正規化; non-DEGの総リード数の平均値を揃えている)
hoge <- data[param_nonDEG,]            #non-DEGのみのデータを抽出した結果をhogeに格納
nf <- mean(colSums(hoge))/colSums(hoge)#正規化係数を計算した結果をnfに格納
normalized <- sweep(data, 2, nf, "*")  #正規化係数を各列に掛けた結果をnormalizedに格納
colSums(normalized[param_nonDEG,])     #正規化後のデータでnon-DEGのみの総リード数を表示

#本番(平均-分散情報などを保存)
hoge <- normalized                     #正規化後のデータをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), data, hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#本番(平均-分散プロット)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
obj <- param_nonDEG                    #non-DEGの位置情報をobjに格納
plot(MEAN[obj], VARIANCE[obj], log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="black")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
obj <- param_DEG_G1                    #G1群で高発現のDEGの位置情報をobjに格納
plot(MEAN[obj], VARIANCE[obj], log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
obj <- param_DEG_G2                    #G2群で高発現のDEGの位置情報をobjに格納
plot(MEAN[obj], VARIANCE[obj], log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red",#プロット
     xlab="MEAN", ylab="VARIANCE")     #プロット

grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", c("DEG(G1)", "DEG(G2)", "non-DEG"), col=c("blue", "red", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

3. NBPSeqパッケージ中の26,222 genes×6 samplesの場合:

3 Mockサンプル vs. 3 treatedサンプルのデータです。

もう少し具体的には、バクテリアを感染させて防御応答をみたデータで、詳細はCumbie et al., PLoS One, 2011に書かれています。

out_f1 <- "hoge3_G1.txt"               #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge3_G1.png"               #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge3_G2.txt"               #出力ファイル名を指定してout_f3に格納
out_f4 <- "hoge3_G2.png"               #出力ファイル名を指定してout_f4に格納
out_f5 <- "hoge3_all.png"              #出力ファイル名を指定してout_f5に格納
param_G1 <- 3                          #G1群(mock群)のサンプル数を指定    
param_G2 <- 3                          #G2群(hrcc群)のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(NBPSeq)                        #パッケージの読み込み

#(パッケージ中に存在する)発現データのロード
data(arab)                             #このパッケージ中にあるarabというオブジェクト名のデータを取り出している
data <- arab                           #データはarabというオブジェクト名で取り扱えるが、dataという名前で取り扱うことにする
dim(data)                              #行数と列数を表示
head(data)                             #最初の数行分を表示(最初の3列がMockサンプルであることが分かる)
colSums(data)                          #総リード数を表示

#前処理(データ正規化; 群ごとに総リード数の平均値を揃えている)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
hoge <- data[,data.cl==1]              #G1群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G1群の正規化係数を計算した結果をnfに格納
G1 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG1に格納
colSums(G1)                            #総リード数を表示
hoge <- data[,data.cl==2]              #G2群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G2群の正規化係数を計算した結果をnfに格納
G2 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG2に格納
colSums(G2)                            #総リード数を表示

#本番(Mean-Variance plotなど; G1群)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), data[,data.cl==1], hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G1", col="blue", pch=20)#凡例を作成

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEからなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#VARIANCEを目的変数、MEANを説明変数としてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が-0.001173, 傾き(MEAN)が1.349519であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.8149と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという説明変数が不要であるという帰無仮説を棄却することを意味する)
dev.off()                              #おまじない

#本番(Mean-Variance plotなど; G2群)
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), data[,data.cl==1], hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f4, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G2", col="red", pch=20)#凡例を作成

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEからなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#VARIANCEを目的変数、MEANを説明変数としてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が-0.001173, 傾き(MEAN)が1.349519であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.8149と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという説明変数が不要であるという帰無仮説を棄却することを意味する)
dev.off()                              #おまじない

#本番(Mean-Variance plot; G1 and G2両方)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
png(out_f5, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", c("G1", "G2"), col=c("blue", "red"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

4. サンプルデータ8の26,221 genes×6 samplesのリアルデータ(data_arab.txt; mock 3サンプル vs. hrcc 3サンプル)の場合:

3.と基本的に同じデータですが、ファイルの読み込みから行う一般的なやり方です。

in_f <- "data_arab.txt"                #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge4_G1.txt"               #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge4_G1.png"               #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge4_G2.txt"               #出力ファイル名を指定してout_f3に格納
out_f4 <- "hoge4_G2.png"               #出力ファイル名を指定してout_f4に格納
out_f5 <- "hoge4_all.png"              #出力ファイル名を指定してout_f5に格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)                          #総リード数を表示

#前処理(データ正規化; 群ごとに総リード数の平均値を揃えている)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
hoge <- data[,data.cl==1]              #G1群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G1群の正規化係数を計算した結果をnfに格納
G1 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG1に格納
colSums(G1)                            #総リード数を表示
hoge <- data[,data.cl==2]              #G2群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G2群の正規化係数を計算した結果をnfに格納
G2 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG2に格納
colSums(G2)                            #総リード数を表示

#本番(Mean-Variance plotなど; G1群)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), data[,data.cl==1], hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G1", col="blue", pch=20)#凡例を作成

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEからなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#VARIANCEを目的変数、MEANを説明変数としてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が-0.001173, 傾き(MEAN)が1.349519であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.8149と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという説明変数が不要であるという帰無仮説を棄却することを意味する)
dev.off()                              #おまじない

#本番(Mean-Variance plotなど; G2群)
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
tmp <- cbind(rownames(data), data[,data.cl==1], hoge, MEAN, VARIANCE)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f4, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G2", col="red", pch=20)#凡例を作成

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない(1列目がMEAN, 2列目がVARIANCEからなる行列を作成したあとデータフレーム形式にした結果をhogeに格納)
out <- lm(VARIANCE~MEAN, data=log10(hoge))#VARIANCEを目的変数、MEANを説明変数としてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示(切片(Intercept)が-0.001173, 傾き(MEAN)が1.349519であることがわかる。つまり、y=a+bxのaが切片、bが傾きに相当する)
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している(Multiple R-squared(決定係数)の値が0.8149と1に相当近い値が得られていることから線形回帰で十分よいfittingが得られていると判断できる。また、一番下のp-valueが限りなく0に近いことは、MEANという説明変数が不要であるという帰無仮説を棄却することを意味する)
dev.off()                              #おまじない

#本番(Mean-Variance plot; G1 and G2両方)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
png(out_f5, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", c("G1", "G2"), col=c("blue", "red"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

5. サンプルデータ8の26,221 genes×6 samplesのリアルデータ(data_arab.txt; mock 3サンプル vs. hrcc 3サンプル)の場合:

G1とG2群を混ぜてプロットしています。

in_f <- "data_arab.txt"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)                          #総リード数を表示

#前処理(データ正規化; 群ごとに総リード数の平均値を揃えている)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
nf <- mean(colSums(data))/colSums(data)#正規化係数を計算した結果をnfに格納
normalized.count <- sweep(data, 2, nf, "*")#正規化係数を各列に掛けた結果をnormalized.countに格納
colSums(normalized.count)              #総リード数を表示

#本番(Mean-Variance plot; G1 and G2両方)
hoge <- normalized.count               #hogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="black")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
hoge <- normalized.count[,data.cl==1]  #hogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
hoge <- normalized.count[,data.cl==2]  #hogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red")#プロット
     
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", c("(G1+G2)", "G1", "G2"), col=c("black", "blue", "red"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

6. サンプルデータ8の26,221 genes×6 samplesのリアルデータ(data_arab.txt; mock 3サンプル vs. hrcc 3サンプル)の場合:

TCCパッケージ中のiDEGES/edgeR正規化後のデータを用いて、2つの群をまとめてプロットしています。

iDEGES/edgeR-edgeR解析パイプライン適用後のFDR < 0.05を満たす遺伝子をマゼンタで色づけしています。

in_f <- "data_arab.txt"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群(kidney)のサンプル数を指定
param_G2 <- 3                          #G2群(liver)のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
obj <- as.logical(tcc$stat$q.value < param_FDR)#条件を満たすかどうかを判定した結果をobjに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(Mean-Variance plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hoge <- normalized                     #hogeとして取り扱う
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="black")#プロット
points(MEAN[obj], VARIANCE[obj], col="magenta", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("bottomright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

7. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

例題1と基本的に同じですが回帰分析のところを、線形回帰(分散 = a + b×平均)ではなく、 負の二項分布(Negative Binomial distribution)の式である「分散 = 平均 + Φ×平均^2」で行っています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge7_G1.txt"               #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge7_G1.png"               #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge7_G2.txt"               #出力ファイル名を指定してout_f3に格納
out_f4 <- "hoge7_G2.png"               #出力ファイル名を指定してout_f4に格納
out_f5 <- "hoge7_all.png"              #出力ファイル名を指定してout_f5に格納
param_G1 <- 3                          #G1群のサンプル数を指定    
param_G2 <- 3                          #G2群のサンプル数を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

library(MASS)                          #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)                          #総リード数を表示

#前処理(データ正規化; 群ごとに総リード数の平均値を揃えている)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
hoge <- data[,data.cl==1]              #G1群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G1群の正規化係数を計算した結果をnfに格納
G1 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG1に格納
colSums(G1)                            #総リード数を表示
hoge <- data[,data.cl==2]              #G2群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G2群の正規化係数を計算した結果をnfに格納
G2 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG2に格納
colSums(G2)                            #総リード数を表示

#本番(Mean-Variance plotなど; G1群)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
PHI <- (VARIANCE - MEAN)/(MEAN^2)      #各行のPHIを計算した結果をPHIに格納
tmp <- cbind(rownames(data), data[,data.cl==1], hoge, MEAN, VARIANCE, PHI)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G1", col="blue", pch=20)#凡例を作成

obj <- as.logical(PHI > 0)             #条件を満たすかどうかを判定した結果をobjに格納
hoge <- hoge[obj,]                     #回帰分析のときにエラーが出ないようにPHI>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
PHI <- (VARIANCE - MEAN)/(MEAN^2)      #各行のPHIを計算した結果をPHIに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE, PHI))#回帰分析(regression analysis)を行うためののおまじない
out <- glm.nb(VARIANCE~MEAN+PHI, data=hoge)#回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している
dev.off()                              #おまじない

#本番(Mean-Variance plotなど; G2群)
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
PHI <- (VARIANCE - MEAN)/(MEAN^2)      #各行のPHIを計算した結果をPHIに格納
tmp <- cbind(rownames(data), data[,data.cl==2], hoge, MEAN, VARIANCE, PHI)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

png(out_f4, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", "G2", col="red", pch=20)#凡例を作成

hoge <- hoge[apply(hoge, 1, var) > 0,] #回帰分析のときにエラーが出ないように分散>0のもののみ抽出しているだけ
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
hoge <- as.data.frame(cbind(MEAN, VARIANCE))#回帰分析(regression analysis)を行うためののおまじない
out <- lm(VARIANCE~MEAN, data=log10(hoge))#VARIANCEを目的変数、MEANを説明変数としてlog10変換したデータの線形回帰を行った結果をoutに格納
abline(out, col="black")               #回帰直線を追加
out                                    #outの簡単な中身を表示
summary(out)                           #回帰分析結果outのもう少し詳細な結果を表示している
dev.off()                              #おまじない

#本番(Mean-Variance plot; G1 and G2両方)
hoge <- G1                             #G1オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
png(out_f5, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1, ann=F,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="blue")#プロット

par(new=T)                             #図の重ね合わせをするという宣言
hoge <- G2                             #G2オブジェクトをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="red")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
legend("topright", c("G1", "G2"), col=c("blue", "red"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

解析 | 新規転写物同定(ゲノム配列を利用)

reference-based methodsというカテゴリに含まれるものたちです。 ゲノム配列にRNA-seqデータのマッピングを行ってどこに遺伝子領域があるかなどの座標(アノテーション)情報を取得する遺伝子構造推定用です。 実質的にde novo transcriptome assemblyと目指すところは同じですが、 やはりゲノムというリファレンス配列を用いるほうがより正確であるため、ゲノム配列が利用可能な場合は利用するのが一般的です。 一般にこの種のプログラムは遺伝子構造推定だけでなく、発現量推定まで行ってくれます。 とりあえずリストアップしただけのものもあったと思いますので、間違いもいくつか含まれていると思います。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 発現量推定(トランスクリプトーム配列を利用)

新規転写物(新規isoform)の発見などが目的でなく、既知転写物の発現量を知りたいだけの場合には、やたらと時間がかかるゲノム配列へのマッピングを避けるのが一般的です。 有名なCufflinksも一応GTF形式のアノテーションファイルを与えることでゲノム全体にマップするのを避けるモードがあるらしいので、一応リストアップしています。 転写物へのマッピングの場合には、splice-aware alignerを用いたジャンクションリードのマッピングを行う必要がないので、高速にマッピング可能なbasic alignerで十分です。 但し、複数個所にマップされるリードは考慮する必要があり、確率モデルのパラメータを最尤法に基づいて推定するexpectation-maximization (EM)アルゴリズムがよく用いられます。 マッピングを行わずに、k-merを用いてalignment-freeで行う発現量推定を行うSailfishやRNA-Skimは従来法に比べて劇的に高速化がなされているようです。 間違いがいくつか含まれているとは思います。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 融合遺伝子の同定

まずはリストアップ。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 発現量推定(ゲノム配列を利用)

リファレンスとしてゲノム配列にマップして発現量推定を行うものたちです。だんだんカテゴリー分けが厳しくなってきましたが、とりあえず。。。 2016年10月に調べた結果をリストアップします:

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 前処理 | 型変換 | について

発現データの代表的なRの格納形式として、ExpressionSet形式、SummarizedExperiment形式、そしてRangedSummarizedExperiment形式が挙げられます (SummarizedExperimentパッケージの htmlマニュアル)。 htmlマニュアルのリンク先でも書かれているように、 ExpressionSet形式はマイクロアレイデータ解析の頃から使われている昔ながらの形式で、 SummarizedExperimentやRangedSummarizedExperimentはRNA-seqの発現データを取り扱うようになった比較的最近(2015年頃-)の形式です。 パッケージによっては、RNA-seqカウントデータをExpressionSet形式で取り扱ったりしますが、とりあえずここで示した程度の変換例があれば事足りると思われます。 scRNA-seqデータ用の形式としては、SCESet形式やCellDataSet形式が挙げられますが、とりあえず必要最小限の情報のみ記載しています。(2019年04月03日追加)。

解析 | 前処理 | 型変換 | ExpressionSet --> SummarizedExperiment

ExpressionSetをSummarizedExperimentに変換するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. RNA-seqカウントデータファイル(srp001558_count_hoge6.txt)の読込みから行う場合:

ExpressionSetオブジェクトの作成までは、「イントロ | 一般 | ExpressionSet | 1から作成 | Biobase」 の例題1と全く同じです。

in_f <- "srp001558_count_hoge6.txt"    #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(Biobase)                       #パッケージの読み込み
library(SummarizedExperiment)          #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(ExpressionSetオブジェクトの作成)
eset <- ExpressionSet(assayData=as.matrix(data))#ExpressionSetオブジェクトの作成
eset                                   #確認してるだけです

#本番(型変換)
rse <- as(eset, "SummarizedExperiment")#SummarizedExperimentオブジェクトの作成
rse                                    #確認してるだけです
	

解析 | 前処理 | 型変換 | ExpressionSet --> RangedSummarizedExperiment

ExpressionSetをRangedSummarizedExperimentに変換するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. RNA-seqカウントデータファイル(srp001558_count_hoge6.txt)の読込みから行う場合:

ExpressionSetオブジェクトの作成までは、「イントロ | 一般 | ExpressionSet | 1から作成 | Biobase」 の例題1と全く同じです。makeSummarizedExperimentFromExpressionSet関数を利用するやり方です。

in_f <- "srp001558_count_hoge6.txt"    #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(Biobase)                       #パッケージの読み込み
library(SummarizedExperiment)          #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(ExpressionSetオブジェクトの作成)
eset <- ExpressionSet(assayData=as.matrix(data))#ExpressionSetオブジェクトの作成
eset                                   #確認してるだけです

#本番(型変換)
rse <- makeSummarizedExperimentFromExpressionSet(eset)#RangedSummarizedExperimentオブジェクトの作成
rse                                    #確認してるだけです
	

2. RNA-seqカウントデータファイル(srp001558_count_hoge6.txt)の読込みから行う場合:

例題1と基本的に同じですが、型変換に利用する関数が異なります。

in_f <- "srp001558_count_hoge6.txt"    #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(Biobase)                       #パッケージの読み込み
library(SummarizedExperiment)          #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(ExpressionSetオブジェクトの作成)
eset <- ExpressionSet(assayData=as.matrix(data))#ExpressionSetオブジェクトの作成
eset                                   #確認してるだけです

#本番(型変換)
rse <- as(eset, "RangedSummarizedExperiment")#RangedSummarizedExperimentオブジェクトの作成
rse                                    #確認してるだけです
	

解析 | 前処理 | 型変換 | RangedSummarizedExperiment --> ExpressionSet

RangedSummarizedExperimentをExpressionSetに変換するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. SummarizedExperimentパッケージ中の例題を利用する場合:

「asMethod(object) で:No assay named ‘exprs’ found, renaming counts to ‘exprs」 という警告メッセージが出ますが無視で構いません。

#必要なパッケージをロード
library(SummarizedExperiment)          #パッケージの読み込み

#前処理(RangedSummarizedExperimentオブジェクトのロード)
example(RangedSummarizedExperiment)    #RangedSummarizedExperimentオブジェクトの例題データをロード(rseという名前のものが利用可能となる)
rse                                    #確認してるだけです

#本番(型変換)
eset <- as(rse, "ExpressionSet")       #ExpressionSetオブジェクトの作成
eset                                   #確認してるだけです
	

2. recountパッケージでSRP001558データのダウンロードから行う場合:

「カウント情報取得 | リアルデータ | SRP001558 | recount(Collado-Torres_2017)」 の例題2の途中まで(rseオブジェクト取得まで)は基本的に同じです。 「asMethod(object) で:No assay named ‘exprs’ found, renaming counts to ‘exprs」 という警告メッセージが出ますが無視で構いません。

param_ID <- "SRP001558"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み
library(SummarizedExperiment)          #パッケージの読み込み

#本番(.Rdataのダウンロードとロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
load(file.path(param_ID, 'rse_gene.Rdata'))#作成されたparam_IDという名前のディレクトリ中の.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(型変換)
eset <- as(rse, "ExpressionSet")       #ExpressionSetオブジェクトの作成
eset                                   #確認してるだけです
	

3. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

「カウント情報取得 | リアルデータ | SRP001558 | recount(Collado-Torres_2017)」 の例題3をベースに作成しています。 「asMethod(object) で:No assay named ‘exprs’ found, renaming counts to ‘exprs」 という警告メッセージが出ますが無視で構いません。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(SummarizedExperiment)          #パッケージの読み込み

#本番(typeで指定した名前の.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#本番(型変換)
eset <- as(rse, "ExpressionSet")       #ExpressionSetオブジェクトの作成
eset                                   #確認してるだけです
	

解析 | 前処理 | 型変換 | SCESet --> CellDataSet

scranパッケージ中のconvertTo関数を用いて、SCESetをCellDataSetに変換するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:


	

解析 | 前処理 | フィルタリング | 低発現遺伝子 | について

直感的に当たり前ですが、低発現遺伝子は基本的に発現変動遺伝子として検出されない傾向にあります。 ここでは遺伝子発現行列(カウントデータなどの数値行列)を入力として、 発現変動解析を行う前に低発現遺伝子やサンプル間で発現変動のない遺伝子を予め除去する プログラム群をとりあえずリストアップしています。scaterは、scRNA-seq用です。 遺伝子ごとにドロップアウト率(dropout rates)を算出する関数もあるようなので、それをフィルタリングに利用可能です。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 前処理 | フィルタリング | 低発現遺伝子 | 基礎

項目名どおりですが、発現行列データを入力として、低発現遺伝子の行をフィルタリングするやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

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であることが既知です。 全6サンプル全てでカウントの総和が0以下となっている遺伝子(行)を除去する例です。 フィルタリング後に9,941 genesになっていることが分かります。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_thres <- 0                       #除去したい遺伝子の総カウント数の閾値を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番(フィルタリング)
obj <- as.logical(rowSums(data) > param_thres)#条件を満たすかどうかを判定した結果をobjに格納
data <- data[obj,]                     #objがTRUEとなる行のみ抽出した結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

例題1と基本的に同じで、閾値が異なるだけです。 フィルタリング後に9,188 genesになっていることが分かります。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_thres <- 5                       #除去したい遺伝子の総カウント数の閾値を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番(フィルタリング)
obj <- as.logical(rowSums(data) > param_thres)#条件を満たすかどうかを判定した結果をobjに格納
data <- data[obj,]                     #objがTRUEとなる行のみ抽出した結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

どちらかの群で、0カウントよりも大きいサンプル数が2つ以上ある遺伝子を抽出するやり方です。 フィルタリング後に9,315 genesになっていることが分かります。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_thres <- 0                       #除去したい遺伝子の総カウント数の閾値を指定
param_num <- 2                         #条件を満たすサンプル数の閾値を指定

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番(フィルタリング)
out <- (data > param_thres)            #param_thresよりも大きいかどうかを判定
obj1 <- rowSums(out[, data.cl == 1])   #G1群で条件を満たすサンプル数情報をobj1に格納
obj2 <- rowSums(out[, data.cl == 2])   #G2群で条件を満たすサンプル数情報をobj2に格納
obj <- as.logical(apply(cbind(obj1, obj2), 1, max) >= param_num)#「param_thresカウントよりも大きいサンプル数」が多いほうの群で、param_numサンプル以上かどうかを判定
data <- data[obj,]                     #objがTRUEとなる行のみ抽出した結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 前処理 | フィルタリング | 低発現遺伝子 | TCC(Sun_2013)

TCCパッケージ中のfilterLowCountGenes関数を用いて、 発現行列データから低発現遺伝子の行をフィルタリングするやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

「総カウント数がparam_thresで指定した閾値以下となる遺伝子」を除去するやり方です。 フィルタリング後に9,188 genesになっていることが分かります。 例えば、計6サンプルで(0, 0, 0, 2, 0, 0)という発現ベクトルのgene_36は、総カウント数が2なので除去されます。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_thres <- 2                       #除去したいカウント数の閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
dim(tcc$count)                         #オブジェクトdataの行数と列数を表示

#本番(フィルタリング)
tcc <- filterLowCountGenes(tcc, low.count=param_thres)#フィルタリング実行結果をtccに格納
dim(tcc$count)                         #オブジェクトdataの行数と列数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 前処理 | フィルタリング | 低発現遺伝子 | RangedSummarizedExperiment

ここでは、recountパッケージ(Collado-Torres et al., 2017) 経由でダウンロードしたRangedSummarizedExperiment形式の発現データ(このページではrseというオブジェクト名で統一)を出発点として、 低発現遺伝子のフィルタリングを行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. recountパッケージでSRP001558データのダウンロードから行う場合:

「カウント情報取得 | リアルデータ | SRP001558 | recount(Collado-Torres_2017)」 の例題2の途中まで(rseオブジェクト取得まで)は基本的に同じです。 全サンプルの全てのカウントが0になっているものを除去するやり方です。 フィルタリング後に42,633 genesになっていることが分かります。

param_ID <- "SRP001558"                #IDを指定
param_thres <- 0                       #除去したい遺伝子の総カウント数の閾値を指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み
library(SummarizedExperiment)          #パッケージの読み込み

#入力データ取得(.Rdataのロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
load(file.path(param_ID, 'rse_gene.Rdata'))#作成されたparam_IDという名前のディレクトリ中の.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#前処理(データ正規化など)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納

#本番(低発現遺伝子のフィルタリング)
obj <- as.logical(rowSums(data) > param_thres)#条件を満たすかどうかを判定した結果をobjに格納
rse <- rse[obj]                        #objがTRUEとなるもののみ抽出
rse                                    #確認してるだけです
	

2. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

「カウント情報取得 | リアルデータ | SRP001558 | recount(Collado-Torres_2017)」 の例題3をベースに作成しています。フィルタリング後に42,633 genesになっていることが分かります。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
param_thres <- 0                       #除去したい遺伝子の総カウント数の閾値を指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み
library(SummarizedExperiment)          #パッケージの読み込み

#入力ファイルの読み込み(.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#前処理(データ正規化など)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納

#本番(低発現遺伝子のフィルタリング)
obj <- as.logical(rowSums(data) > param_thres)#条件を満たすかどうかを判定した結果をobjに格納
rse <- rse[obj]                        #objがTRUEとなるもののみ抽出
rse                                    #確認してるだけです
	

3. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題2と基本的に同じですが、最後にフィルタリング後のカウントデータをタブ区切りテキストファイルとして保存までするやり方です。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_thres <- 0                       #除去したい遺伝子の総カウント数の閾値を指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み
library(SummarizedExperiment)          #パッケージの読み込み

#入力ファイルの読み込み(.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#前処理(データ正規化など)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納

#本番(低発現遺伝子のフィルタリング)
obj <- as.logical(rowSums(data) > param_thres)#条件を満たすかどうかを判定した結果をobjに格納
rse <- rse[obj]                        #objがTRUEとなるもののみ抽出
rse                                    #確認してるだけです

data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 前処理 | フィルタリング | その他 | gene symbols情報があるもののみ | 基礎

様々なフィルタリング手段の一つとしてというよりは、同一gene symbolsを持つものをまとめる(Ensembl gene ID --> gene symbolsへのID変換)際に注意すべき点や基本的な考え方などを紹介する意味合いのほうが大きいです。 ここでは、「カウント情報取得 | リアルデータ | SRP001558 | recount(Collado-Torres_2017)」の例題6を実行して得られた、 ヒトの58,037 genes×6 samplesからなるカウントデータファイル(srp001558_count_hoge6.txt)と、 同じく例題4を実行して得られた対応表ファイル(srp001558_meta_features.txt)を読込みます。 アノテーションファイルのほうは58,037行×3列からなり、1列目がEnsembl gene ID, 2列目が長さ情報, そして3列目がgene symbols情報です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. gene symbolがNAでないもののみを抽出したい場合:

3列目にgene symbols情報がない場合はNAとなっているので、is.na関数を用いて判定しています。 但し「is.na関数はNAの要素をTRUEそれ以外をFALSEとする」のですが、実際にはNAの要素をFALSEとしたいので!is.naとしてTRUE/FALSEを逆転させています。 出力ファイル中の遺伝子数は25,450個ですね。例えば、 gene symbolsがNAとなっていた入力ファイル中の最後から2行目の"ENSG00000283698.1"が、正しくなくなっていることがわかります。

in_f1 <- "srp001558_count_hoge6.txt"   #入力ファイル名を指定してin_f1に格納(カウントデータファイル)
in_f2 <- "srp001558_meta_features.txt" #入力ファイル名を指定してin_f2に格納(対応表ファイル)
out_f1 <- "hoge1_count.txt"            #出力ファイル名を指定してout_f1に格納(カウントデータファイル)
out_f2 <- "hoge1_features.txt"         #出力ファイル名を指定してout_f2に格納(対応表ファイル)

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
annot <- read.table(in_f2, header=TRUE, sep="\t", quote="")#in_f2で指定したファイルの読み込み
dim(data)                              #確認してるだけです
dim(annot)                             #確認してるだけです

#本番(gene symbolがNAでないものを抽出、カウントデータ側)
obj <- !is.na(annot$symbol)            #annot$symbol中の要素がNA以外ならTRUE、NAならFALSEとした条件判定を行っている
data <- data[obj, ]                    #objがTRUEとなる行のみ抽出
dim(data)                              #確認してるだけです
tail(data)                             #確認してるだけです(最後の6行分を表示)

#本番(gene symbolがNAでないものを抽出、対応表側)
obj <- is.element(annot$gene_id, rownames(data))#annot行列のgene_id列において、rownames(data)中の文字列と一致する箇所をTRUE、それ以外をFALSEとした結果をobjに格納
annot <- annot[obj,]                   #annot行列の情報も低発現遺伝子のフィルタリング後に揃えている
dim(annot)                             #確認してるだけです

#ファイルに保存(カウントデータファイル)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(対応表ファイル)
write.table(annot, out_f2, sep="\t", append=F, quote=F, row.names=F)#annotの中身を指定したファイル名で保存
	

2. 一定の発現があり、且つgene symbolがNAでないものを抽出したい場合:

「解析 | 前処理 | フィルタリング | 低発現遺伝子 | 基礎(の例題1)」 と例題1を組み合わせるやり方です。出力ファイル中の遺伝子数は21,824個ですね。 tail(data)の結果からも全6サンプルの全てのカウントが0になっているものはなくなっているのがわかります。

in_f1 <- "srp001558_count_hoge6.txt"   #入力ファイル名を指定してin_f1に格納(カウントデータファイル)
in_f2 <- "srp001558_meta_features.txt" #入力ファイル名を指定してin_f2に格納(対応表ファイル)
out_f1 <- "hoge2_count.txt"            #出力ファイル名を指定してout_f1に格納(カウントデータファイル)
out_f2 <- "hoge2_features.txt"         #出力ファイル名を指定してout_f2に格納(対応表ファイル)
param_thres <- 0                       #除去したい遺伝子の総カウント数の閾値を指定

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
annot <- read.table(in_f2, header=TRUE, sep="\t", quote="")#in_f2で指定したファイルの読み込み
dim(data)                              #確認してるだけです
dim(annot)                             #確認してるだけです

#本番1(低発現遺伝子のフィルタリング、カウントデータ側)
obj <- as.logical(rowSums(data) > param_thres)#条件を満たすかどうかを判定した結果をobjに格納
data <- data[obj,]                     #objがTRUEとなる行のみ抽出した結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番1(低発現遺伝子のフィルタリング、対応表側)
obj <- is.element(annot$gene_id, rownames(data))#annot行列のgene_id列において、rownames(data)中の文字列と一致する箇所をTRUE、それ以外をFALSEとした結果をobjに格納
annot <- annot[obj,]                   #annot行列の情報も低発現遺伝子のフィルタリング後に揃えている
dim(annot)                             #確認してるだけです

#本番2(gene symbolがNAでないものを抽出、対応表側)
obj <- !is.na(annot$symbol)            #annot$symbol中の要素がNA以外ならTRUE、NAならFALSEとした条件判定を行っている
annot <- annot[obj,]                   #annot行列の情報も低発現遺伝子のフィルタリング後に揃えている
dim(annot)                             #確認してるだけです

#本番2(gene symbolがNAでないものを抽出、カウントデータ側)
obj <- is.element(rownames(data), annot$gene_id)#rownames(data)の文字列ベクトルに対して、annot$gene_id中の文字列と一致する箇所をTRUE、それ以外をFALSEとした結果をobjに格納
data <- data[obj, ]                    #objがTRUEとなる行のみ抽出
dim(data)                              #確認してるだけです
tail(data)                             #確認してるだけです(最後の6行分を表示)

#ファイルに保存(カウントデータファイル)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(対応表ファイル)
write.table(annot, out_f2, sep="\t", append=F, quote=F, row.names=F)#annotの中身を指定したファイル名で保存
	

3. 一定の発現があり、gene symbolがNAでなく、且つ同一IDに単一のgene symbolsが割り当てられているもののみを抽出したい場合:

例題2の結果ファイル(hoge2_features.txt)を眺めると、 同一Ensembl gene IDに対して複数個のgene symbolsが割り当てられているものがあることに気づきます(例:ENSG00000004866.19)。 これらを除去するやり方です。実際の除去手順は、hoge2_features.txtの3列目の情報(annot$symbolに相当)に対して (を含む行番号情報を抽出し(posiに相当)、それ以外の行を抽出しています。 grep関数実行時に"\\("と書いていますが、 \\は(が特別な意味を持たないただの文字として認識させるためのおまじないのようなものです。 出力ファイルはsrp001558_count_hoge3.txtsrp001558_features_hoge3.txtです。遺伝子数は21,329個ですね。

in_f1 <- "srp001558_count_hoge6.txt"   #入力ファイル名を指定してin_f1に格納(カウントデータファイル)
in_f2 <- "srp001558_meta_features.txt" #入力ファイル名を指定してin_f2に格納(対応表ファイル)
out_f1 <- "srp001558_count_hoge3.txt"  #出力ファイル名を指定してout_f1に格納(カウントデータファイル)
out_f2 <- "srp001558_features_hoge3.txt"#出力ファイル名を指定してout_f2に格納(対応表ファイル)
param_thres <- 0                       #除去したい遺伝子の総カウント数の閾値を指定

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
annot <- read.table(in_f2, header=TRUE, sep="\t", quote="")#in_f2で指定したファイルの読み込み
dim(data)                              #確認してるだけです
dim(annot)                             #確認してるだけです

#本番1(低発現遺伝子のフィルタリング、カウントデータ側)
obj <- as.logical(rowSums(data) > param_thres)#条件を満たすかどうかを判定した結果をobjに格納
data <- data[obj,]                     #objがTRUEとなる行のみ抽出した結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番1(低発現遺伝子のフィルタリング、対応表側)
obj <- is.element(annot$gene_id, rownames(data))#annot行列のgene_id列において、rownames(data)中の文字列と一致する箇所をTRUE、それ以外をFALSEとした結果をobjに格納
annot <- annot[obj,]                   #annot行列の情報も低発現遺伝子のフィルタリング後に揃えている
dim(annot)                             #確認してるだけです

#本番2(gene symbolがNAでないものを抽出、アノテーション側)
obj <- !is.na(annot$symbol)            #annot$symbol中の要素がNA以外ならTRUE、NAならFALSEとした条件判定を行っている
annot <- annot[obj,]                   #annot行列の情報も低発現遺伝子のフィルタリング後に揃えている
dim(annot)                             #確認してるだけです

#本番2(gene symbolがNAでないものを抽出、対応表側)
obj <- is.element(rownames(data), annot$gene_id)#rownames(data)の文字列ベクトルに対して、annot$gene_id中の文字列と一致する箇所をTRUE、それ以外をFALSEとした結果をobjに格納
data <- data[obj, ]                    #objがTRUEとなる行のみ抽出
dim(data)                              #確認してるだけです
tail(data)                             #確認してるだけです(最後の6行分を表示)

#本番3(同一IDに単一のgene symbolsが割り当てられているものを抽出、対応表側)
posi <- grep("\\(", annot$symbol, ignore.case=T)#annot$symbolに対して(を含む行番号をposiに格納
annot <- annot[-posi,]                 #posi中の行番号以外の行を抽出
dim(annot)                             #確認してるだけです

#本番3(同一IDに単一のgene symbolsが割り当てられているものを抽出、カウントデータ側)
obj <- is.element(rownames(data), annot$gene_id)#rownames(data)の文字列ベクトルに対して、annot$gene_id中の文字列と一致する箇所をTRUE、それ以外をFALSEとした結果をobjに格納
data <- data[obj, ]                    #objがTRUEとなる行のみ抽出
dim(data)                              #確認してるだけです

#ファイルに保存(カウントデータファイル)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(対応表ファイル)
write.table(annot, out_f2, sep="\t", append=F, quote=F, row.names=F)#annotの中身を指定したファイル名で保存
	

解析 | 前処理 | フィルタリング | その他 | gene symbols情報があるもののみ | RangedSummarizedExperiment

ここでは、recountパッケージ(Collado-Torres et al., 2017) 経由でダウンロードしたRangedSummarizedExperiment形式の発現データ(このページではrseというオブジェクト名で統一)を出発点として、gene symbols情報がある遺伝子のフィルタリングを行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. gene symbolがNAでないもののみを抽出したい場合:

「カウント情報取得 | リアルデータ | SRP001558 | recount(Collado-Torres_2017)」 の例題2の途中まで(rseオブジェクト取得まで)は基本的に同じです。 つまり、SRP001558を与えて、RangedSummarizedExperimentオブジェクトのダウンロードから行っています。 フィルタリング後に25,526 genesになっていることが分かります。 例題2と若干異なる結果になるのは、アノテーション情報のアップデートに起因すると思われます。

param_ID <- "SRP001558"                #IDを指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み
library(SummarizedExperiment)          #パッケージの読み込み

#入力データ取得(.Rdataのロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
load(file.path(param_ID, 'rse_gene.Rdata'))#作成されたparam_IDという名前のディレクトリ中の.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#前処理(データ正規化など;この項目とは直接的な関係はないが念のため)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)

#本番(gene symbolがNAでないもののフィルタリング)
symbols <- as.character(as.vector(rowData(rse)$symbol))#gene symbol情報を文字列ベクトルとして抽出
obj <- !is.na(symbols)                 #gene symbolsがNA以外ならTRUE、NAならFALSEとした条件判定を行っている
rse <- rse[obj]                        #objがTRUEとなるもののみ抽出
rse                                    #確認してるだけです
	

2. gene symbolがNAでないもののみを抽出したい場合:

「カウント情報取得 | リアルデータ | SRP001558 | recount(Collado-Torres_2017)」 の例題3をベースに作成しています。ダウンロード済みのrse_gene.Rdataを入力として読み込むやり方です。 フィルタリング後に25,450 genesになっていることが分かります。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み
library(SummarizedExperiment)          #パッケージの読み込み

#入力ファイルの読み込み(.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#前処理(データ正規化など;この項目とは直接的な関係はないが念のため)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)

#本番(gene symbolがNAでないもののフィルタリング)
symbols <- as.character(as.vector(rowData(rse)$symbol))#gene symbol情報を文字列ベクトルとして抽出
obj <- !is.na(symbols)                 #gene symbolsがNA以外ならTRUE、NAならFALSEとした条件判定を行っている
rse <- rse[obj]                        #objがTRUEとなるもののみ抽出
rse                                    #確認してるだけです
	

3. 一定の発現があり、且つgene symbolがNAでないものを抽出したい場合:

「カウント情報取得 | リアルデータ | SRP001558 | recount(Collado-Torres_2017)」 の例題3をベースに作成しています。ダウンロード済みのrse_gene.Rdataを入力として読み込むやり方です。 例題1と同じく、フィルタリング後に21,880 genesになっていることが分かります。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
param_thres <- 0                       #除去したい遺伝子の総カウント数の閾値を指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み
library(SummarizedExperiment)          #パッケージの読み込み

#入力ファイルの読み込み(.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#前処理(データ正規化など;この項目とは直接的な関係はないが念のため)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)

#本番(低発現遺伝子のフィルタリング)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
obj <- as.logical(rowSums(data) > param_thres)#条件を満たすかどうかを判定した結果をobjに格納
rse <- rse[obj]                        #objがTRUEとなるもののみ抽出
rse                                    #確認してるだけです

#本番(gene symbolがNAでないもののフィルタリング)
symbols <- as.character(as.vector(rowData(rse)$symbol))#gene symbol情報を文字列ベクトルとして抽出
obj <- !is.na(symbols)                 #gene symbolsがNA以外ならTRUE、NAならFALSEとした条件判定を行っている
rse <- rse[obj]                        #objがTRUEとなるもののみ抽出
rse                                    #確認してるだけです
	

解析 | 前処理 | ID変換 | Ensembl Gene ID中のバージョン情報を除去

バージョン情報つきのEnsembl Gene IDを含むファイルを入力として、そのバージョン情報部分のみをトリムしたファイルを出力するやり方を示します。 例えば、入力ファイル中のEnsembl Gene IDがENSG00000000003.14だったものが、出力ファイルではENSG0000000000となるような処理を行います。 これは、よく手元のEnsembl Gene IDはバージョン情報つきであるのに対して、他の情報との対応付けの際はバージョン情報を含まない状態で行わなければならない場合が多いためです。 作業手順としては、バージョン情報つきのEnsembl Gene IDの文字列をまず"."で区切り、2つに分割しています。 分割後は左側(1番目)の要素がバージョン情報のないEnsembl Gene IDに、そして右側(2番目)の要素がバージョン情報に相当します。 従って、分割後の1つ目の要素を取り出して、それを新たな行名として代入するという処理を行っています。 注意点としては、下記コード中のlength(hoge2)実行結果とlength(unique(hoge2))実行結果の違いからも推測できるように、 バージョン情報除去後にEnsembl Gene IDが同一になる行ができてしまうことが挙げられます(例えばENSG00000002586)。 例えば、例題1実行結果ファイルをrow.names=1オプションつきのread.table関数で読み込もうとしても、「重複した 'row.names' は許されません」となりますのでご注意ください。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. Blekhman et al., Genome Res., 2010の58,037 genes×6 samplesのカウントデータ(srp001558_count_hoge6.txt)の場合:

「カウント情報取得 | リアルデータ | SRP001558 | recount(Collado-Torres_2017)」 の例題6実行結果ファイルと同じものです。「rownames(data) <- hoge2」のところでエラーメッセージが出ますが、出力ファイル自体は正しく作成されます。

in_f <- "srp001558_count_hoge6.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(rownames(data))                   #確認してるだけです

#本番(文字列操作)
hoge <- strsplit(rownames(data), ".", fixed=TRUE)#names(fasta)中の文字列を.で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", 1)) #hogeのリスト中の1番目の要素(これがバージョン情報のないEnsembl Gene IDに相当)を抽出してhoge2に格納
rownames(data) <- hoge2                #行名を付加(「重複した 'row.names' は許されません」となります)
length(hoge2)                          #確認してるだけです(要素数を表示)
length(unique(hoge2))                  #確認してるだけです(重複除去後の要素数を表示)

#ファイルに保存(テキストファイル)
tmp <- cbind(hoge2, data)              #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. Blekhman et al., Genome Res., 2010の58,037 genes×6 samplesのカウントデータ(srp001558_count_hoge6.txt)の場合:

例題1と基本的に同じですが、サンプル全てでカウントの総和が0以下となっている遺伝子(行)を除去してから行っています。 例題1では"ENSG00000002586"が原因で「重複した 'row.names' は許されません」となりましたが、 "ENSG00000002586.18_PAR_Y"が低発現遺伝子のフィルタリングで落とされ"ENSG00000002586.18"のみとなり、(他にもあったろうとは思いますが...)エラーが消えたことが分かります。 実際には、低発現パターンのフィルタリングはバージョン情報除去後に同一Ensembl Gene IDとなる可能性を減らすだけであり、必ずしもうまくいくわけではないのでご注意下さい。

in_f <- "srp001558_count_hoge6.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_thres <- 0                       #除去したい遺伝子の総カウント数の閾値を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(低発現遺伝子のフィルタリング)
obj <- as.logical(rowSums(data) > param_thres)#条件を満たすかどうかを判定した結果をobjに格納
data <- data[obj,]                     #objがTRUEとなる行のみ抽出した結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番(文字列操作)
hoge <- strsplit(rownames(data), ".", fixed=TRUE)#names(fasta)中の文字列を.で区切った結果をリスト形式でhogeに格納
hoge2 <- unlist(lapply(hoge, "[[", 1)) #hogeのリスト中の1番目の要素(これがバージョン情報のないEnsembl Gene IDに相当)を抽出してhoge2に格納
rownames(data) <- hoge2                #行名を付加(エラーは出ません)
length(hoge2)                          #確認してるだけです(要素数を表示)
length(unique(hoge2))                  #確認してるだけです(重複除去後の要素数を表示)

#ファイルに保存(テキストファイル)
tmp <- cbind(hoge2, data)              #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 前処理 | ID変換 | Ensembl Gene ID --> gene symbols | 基礎

Ensembl gene IDとgene symbolsの対応表を利用して、発現行列の一番左側がEnsembl gene IDのカウントデータファイルを入力として、 同一gene symbolsのカウント情報をマージしてgene symbolsに変換した結果を返すやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. カウントデータファイル(srp001558_count_hoge3.txt)と対応表(srp001558_features_hoge3.txt)の場合:

「解析 | 前処理 | フィルタリング | その他 | gene symbols情報があるもののみ」 の例題3実行結果ファイルと同じものです。対応表のほうは3列目がgene symbols情報。対応表の1列目とカウントファイルの1列目がEnsembl gene IDです。 前処理済みなので比較的簡単なコードですみます。 21,329 Ensembl gene IDsが、21,163 gene symbolsになっていることがわかります。

in_f1 <- "srp001558_count_hoge3.txt"   #入力ファイル名を指定してin_f1に格納(カウントデータファイル)
in_f2 <- "srp001558_features_hoge3.txt"#入力ファイル名を指定してin_f2に格納(対応表)
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param <- "mean"                        #代表値(要約統計量)を指定

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
annot <- read.table(in_f2, header=TRUE, sep="\t", quote="")#in_f2で指定したファイルの読み込み
dim(data)                              #確認してるだけです
dim(annot)                             #確認してるだけです

#前処理(意味のあるgene symbols情報を抽出)
symbols <- as.character(annot$symbol)  #対応表の3列目の情報に相当するannot$symbolを文字列としてsymbolsに格納
names(symbols) <- as.character(annot$gene_id)#対応表の1列目の情報に相当するannot$gene_idを文字列としてnames(symbols)に代入
unique_sym <- unique(symbols)          #ユニーク(non-redundant)なgene symbolsのベクトルにしている

#本番(同一gene symbolsのデータをまとめる)
hoge <- NULL                           #最終的に欲しい情報を格納するためのプレースホルダ
for(i in 1:length(unique_sym)){        #non-redundant gene symbol数分だけループを回す
    hoge <- rbind(hoge, apply(data[which(symbols == unique_sym[i]),], 2, param, na.rm=TRUE))#dataの中からi番目のgene symbolと同じEnsembl gene IDのデータを全て抽出し、paramで指定した要約統計量をhogeの一番下の行に追加
}                                      #non-redundant gene symbol数分だけループを回す
rownames(hoge) <- unique_sym           #non-redundant gene symbolsをhogeの行の名前として利用
dim(hoge)                              #確認してるだけです

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(hoge), hoge)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. カウントデータファイル(srp001558_count_hoge6.txt)と対応表(srp001558_meta_features.txt)の場合:

「カウント情報取得 | リアルデータ | SRP001558 | recount(Collado-Torres_2017)」 の例題6(カウントデータ)、および例題4(対応表)実行結果ファイルと同じものです。前処理から行う例です。 58,037 Ensembl gene IDsが、25,219 gene symbolsになっていることがわかります。 低発現遺伝子のフィルタリングを行っていないので行全体でゼロカウントのもの(例:MIR3202-2)や、同一gene IDに複数のgene symbolsが割り当てられているもの (例:67行目のc("ST7", "ST7-OT3", "MIR6132"))が含まれていることがわかります。

in_f1 <- "srp001558_count_hoge6.txt"   #入力ファイル名を指定してin_f1に格納(カウントデータファイル)
in_f2 <- "srp001558_meta_features.txt" #入力ファイル名を指定してin_f2に格納(対応表ファイル)
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param <- "mean"                        #代表値(要約統計量)を指定

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
annot <- read.table(in_f2, header=TRUE, sep="\t", quote="")#in_f2で指定したファイルの読み込み
dim(data)                              #確認してるだけです
dim(annot)                             #確認してるだけです

#前処理(意味のあるgene symbols情報を抽出)
symbols <- as.character(annot$symbol)  #対応表の3列目の情報に相当するannot$symbolを文字列としてsymbolsに格納
names(symbols) <- as.character(annot$gene_id)#対応表の1列目の情報に相当するannot$gene_idを文字列としてnames(symbols)に代入
unique_sym <- unique(symbols)          #ユニーク(non-redundant)なgene symbolsのベクトルにしている
unique_sym <- unique_sym[unique_sym != ""]#unique_symの中から、Gene symbolがないものを除く
unique_sym <- unique_sym[!is.na(unique_sym)]#unique_symの中から、Gene symbolが"NA"のものを除く
unique_sym <- unique_sym[!is.nan(unique_sym)]#unique_symの中から、Gene symbolが"NaN"のものを除く

#本番(同一gene symbolsのデータをまとめる)
hoge <- NULL                           #最終的に欲しい情報を格納するためのプレースホルダ
for(i in 1:length(unique_sym)){        #non-redundant gene symbol数分だけループを回す
    hoge <- rbind(hoge, apply(data[which(symbols == unique_sym[i]),], 2, param, na.rm=TRUE))#dataの中からi番目のgene symbolと同じEnsembl gene IDのデータを全て抽出し、paramで指定した要約統計量をhogeの一番下の行に追加
}                                      #non-redundant gene symbol数分だけループを回す
rownames(hoge) <- unique_sym           #non-redundant gene symbolsをhogeの行の名前として利用
dim(hoge)                              #確認してるだけです

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(hoge), hoge)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. カウントデータファイル(srp001558_count_hoge6.txt)と対応表(srp001558_meta_features.txt)の場合:

例題2と基本的に同じで、低発現遺伝子のフィルタリングのみ追加しています。 58,037 Ensembl gene IDsが、21,649 gene symbolsになっていることがわかります。 まだ、同一gene IDに複数のgene symbolsが割り当てられているもの (例:67行目のc("ST7", "ST7-OT3", "MIR6132"))が含まれていることがわかります。

in_f1 <- "srp001558_count_hoge6.txt"   #入力ファイル名を指定してin_f1に格納(カウントデータファイル)
in_f2 <- "srp001558_meta_features.txt" #入力ファイル名を指定してin_f2に格納(対応表ファイル)
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param <- "mean"                        #代表値(要約統計量)を指定
param_thres <- 0                       #除去したい遺伝子の総カウント数の閾値を指定

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
annot <- read.table(in_f2, header=TRUE, sep="\t", quote="")#in_f2で指定したファイルの読み込み
dim(data)                              #確認してるだけです
dim(annot)                             #確認してるだけです

#前処理1(低発現遺伝子のフィルタリング、カウントデータ側)
obj <- as.logical(rowSums(data) > param_thres)#条件を満たすかどうかを判定した結果をobjに格納
data <- data[obj,]                     #objがTRUEとなる行のみ抽出した結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理1(低発現遺伝子のフィルタリング、対応表側)
obj <- is.element(annot$gene_id, rownames(data))#annot行列のgene_id列において、rownames(data)中の文字列と一致する箇所をTRUE、それ以外をFALSEとした結果をobjに格納
annot <- annot[obj,]                   #annot行列の情報も低発現遺伝子のフィルタリング後に揃えている
dim(annot)                             #確認してるだけです

#前処理2(意味のあるgene symbols情報を抽出)
symbols <- as.character(annot$symbol)  #対応表の3列目の情報に相当するannot$symbolを文字列としてsymbolsに格納
names(symbols) <- as.character(annot$gene_id)#対応表の1列目の情報に相当するannot$gene_idを文字列としてnames(symbols)に代入
unique_sym <- unique(symbols)          #ユニーク(non-redundant)なgene symbolsのベクトルにしている
unique_sym <- unique_sym[unique_sym != ""]#unique_symの中から、Gene symbolがないものを除く
unique_sym <- unique_sym[!is.na(unique_sym)]#unique_symの中から、Gene symbolが"NA"のものを除く
unique_sym <- unique_sym[!is.nan(unique_sym)]#unique_symの中から、Gene symbolが"NaN"のものを除く

#本番(同一gene symbolsのデータをまとめる)
hoge <- NULL                           #最終的に欲しい情報を格納するためのプレースホルダ
for(i in 1:length(unique_sym)){        #non-redundant gene symbol数分だけループを回す
    hoge <- rbind(hoge, apply(data[which(symbols == unique_sym[i]),], 2, param, na.rm=TRUE))#dataの中からi番目のgene symbolと同じEnsembl gene IDのデータを全て抽出し、paramで指定した要約統計量をhogeの一番下の行に追加
}                                      #non-redundant gene symbol数分だけループを回す
rownames(hoge) <- unique_sym           #non-redundant gene symbolsをhogeの行の名前として利用
dim(hoge)                              #確認してるだけです

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(hoge), hoge)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. カウントデータファイル(srp001558_count_hoge6.txt)と対応表(srp001558_meta_features.txt)の場合:

例題3と基本的に同じで、同一gene IDに複数のgene symbolsが割り当てられているものの除去を追加しています。 58,037 Ensembl gene IDsが、21,163 gene symbolsになっていることがわかります。

in_f1 <- "srp001558_count_hoge6.txt"   #入力ファイル名を指定してin_f1に格納(カウントデータファイル)
in_f2 <- "srp001558_meta_features.txt" #入力ファイル名を指定してin_f2に格納(対応表ファイル)
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param <- "mean"                        #代表値(要約統計量)を指定
param_thres <- 0                       #除去したい遺伝子の総カウント数の閾値を指定

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
annot <- read.table(in_f2, header=TRUE, sep="\t", quote="")#in_f2で指定したファイルの読み込み
dim(data)                              #確認してるだけです
dim(annot)                             #確認してるだけです

#前処理1(低発現遺伝子のフィルタリング、カウントデータ側)
obj <- as.logical(rowSums(data) > param_thres)#条件を満たすかどうかを判定した結果をobjに格納
data <- data[obj,]                     #objがTRUEとなる行のみ抽出した結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理1(低発現遺伝子のフィルタリング、対応表側)
obj <- is.element(annot$gene_id, rownames(data))#annot行列のgene_id列において、rownames(data)中の文字列と一致する箇所をTRUE、それ以外をFALSEとした結果をobjに格納
annot <- annot[obj,]                   #annot行列の情報も低発現遺伝子のフィルタリング後に揃えている
dim(annot)                             #確認してるだけです

#前処理2(同一IDに単一のgene symbolsが割り当てられているものを抽出、対応表側)
posi <- grep("\\(", annot$symbol, ignore.case=T)#annot$symbolに対して(を含む行番号をposiに格納
annot <- annot[-posi,]                 #posi中の行番号以外の行を抽出
dim(annot)                             #確認してるだけです

#前処理2(同一IDに単一のgene symbolsが割り当てられているものを抽出、カウントデータ側)
obj <- is.element(rownames(data), annot$gene_id)#rownames(data)の文字列ベクトルに対して、annot$gene_id中の文字列と一致する箇所をTRUE、それ以外をFALSEとした結果をobjに格納
data <- data[obj, ]                    #objがTRUEとなる行のみ抽出
dim(data)                              #確認してるだけです

#前処理3(意味のあるgene symbols情報を抽出)
symbols <- as.character(annot$symbol)  #対応表の3列目の情報に相当するannot$symbolを文字列としてsymbolsに格納
names(symbols) <- as.character(annot$gene_id)#対応表の1列目の情報に相当するannot$gene_idを文字列としてnames(symbols)に代入
unique_sym <- unique(symbols)          #ユニーク(non-redundant)なgene symbolsのベクトルにしている
unique_sym <- unique_sym[unique_sym != ""]#unique_symの中から、Gene symbolがないものを除く
unique_sym <- unique_sym[!is.na(unique_sym)]#unique_symの中から、Gene symbolが"NA"のものを除く
unique_sym <- unique_sym[!is.nan(unique_sym)]#unique_symの中から、Gene symbolが"NaN"のものを除く

#本番(同一gene symbolsのデータをまとめる)
hoge <- NULL                           #最終的に欲しい情報を格納するためのプレースホルダ
for(i in 1:length(unique_sym)){        #non-redundant gene symbol数分だけループを回す
    hoge <- rbind(hoge, apply(data[which(symbols == unique_sym[i]),], 2, param, na.rm=TRUE))#dataの中からi番目のgene symbolと同じEnsembl gene IDのデータを全て抽出し、paramで指定した要約統計量をhogeの一番下の行に追加
}                                      #non-redundant gene symbol数分だけループを回す
rownames(hoge) <- unique_sym           #non-redundant gene symbolsをhogeの行の名前として利用
dim(hoge)                              #確認してるだけです

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(hoge), hoge)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. カウントデータファイル(srp001540_count_yale.txt)と対応表(srp001540_meta_features.txt)の場合:

例題4と基本的に同じで、入力ファイルが異なるだけです。入力ファイルは 「カウント情報取得 | リアルデータ | SRP001540 | recount(Collado-Torres_2017)」 の例題6実行ファイルと同じです。出力ファイルはsrp001540_count_symbols.txtです 58,037 Ensembl gene IDsが、23,377 gene symbolsになっていることがわかります。

in_f1 <- "srp001540_count_yale.txt"    #入力ファイル名を指定してin_f1に格納(カウントデータファイル)
in_f2 <- "srp001540_meta_features.txt" #入力ファイル名を指定してin_f2に格納(対応表ファイル)
out_f <- "srp001540_count_symbols.txt" #出力ファイル名を指定してout_fに格納
param <- "mean"                        #代表値(要約統計量)を指定
param_thres <- 0                       #除去したい遺伝子の総カウント数の閾値を指定

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
annot <- read.table(in_f2, header=TRUE, sep="\t", quote="")#in_f2で指定したファイルの読み込み
dim(data)                              #確認してるだけです
dim(annot)                             #確認してるだけです

#前処理1(低発現遺伝子のフィルタリング、カウントデータ側)
obj <- as.logical(rowSums(data) > param_thres)#条件を満たすかどうかを判定した結果をobjに格納
data <- data[obj,]                     #objがTRUEとなる行のみ抽出した結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理1(低発現遺伝子のフィルタリング、対応表側)
obj <- is.element(annot$gene_id, rownames(data))#annot行列のgene_id列において、rownames(data)中の文字列と一致する箇所をTRUE、それ以外をFALSEとした結果をobjに格納
annot <- annot[obj,]                   #annot行列の情報も低発現遺伝子のフィルタリング後に揃えている
dim(annot)                             #確認してるだけです

#前処理2(同一IDに単一のgene symbolsが割り当てられているものを抽出、対応表側)
posi <- grep("\\(", annot$symbol, ignore.case=T)#annot$symbolに対して(を含む行番号をposiに格納
annot <- annot[-posi,]                 #posi中の行番号以外の行を抽出
dim(annot)                             #確認してるだけです

#前処理2(同一IDに単一のgene symbolsが割り当てられているものを抽出、カウントデータ側)
obj <- is.element(rownames(data), annot$gene_id)#rownames(data)の文字列ベクトルに対して、annot$gene_id中の文字列と一致する箇所をTRUE、それ以外をFALSEとした結果をobjに格納
data <- data[obj, ]                    #objがTRUEとなる行のみ抽出
dim(data)                              #確認してるだけです

#前処理3(意味のあるgene symbols情報を抽出)
symbols <- as.character(annot$symbol)  #対応表の3列目の情報に相当するannot$symbolを文字列としてsymbolsに格納
names(symbols) <- as.character(annot$gene_id)#対応表の1列目の情報に相当するannot$gene_idを文字列としてnames(symbols)に代入
unique_sym <- unique(symbols)          #ユニーク(non-redundant)なgene symbolsのベクトルにしている
unique_sym <- unique_sym[unique_sym != ""]#unique_symの中から、Gene symbolがないものを除く
unique_sym <- unique_sym[!is.na(unique_sym)]#unique_symの中から、Gene symbolが"NA"のものを除く
unique_sym <- unique_sym[!is.nan(unique_sym)]#unique_symの中から、Gene symbolが"NaN"のものを除く

#本番(同一gene symbolsのデータをまとめる)
hoge <- NULL                           #最終的に欲しい情報を格納するためのプレースホルダ
for(i in 1:length(unique_sym)){        #non-redundant gene symbol数分だけループを回す
    hoge <- rbind(hoge, apply(data[which(symbols == unique_sym[i]),], 2, param, na.rm=TRUE))#dataの中からi番目のgene symbolと同じEnsembl gene IDのデータを全て抽出し、paramで指定した要約統計量をhogeの一番下の行に追加
}                                      #non-redundant gene symbol数分だけループを回す
rownames(hoge) <- unique_sym           #non-redundant gene symbolsをhogeの行の名前として利用
dim(hoge)                              #確認してるだけです

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(hoge), hoge)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 前処理 | ID変換 | Ensembl Gene ID --> gene symbols | RangedSummarizedExperiment

ここでは、recountパッケージ(Collado-Torres et al., 2017) 経由でダウンロードしたRangedSummarizedExperiment形式の発現データ(このページではrseというオブジェクト名で統一)を出発点とするやり方を示します。 このrseオブジェクトはEnsembl gene IDとgene symbolsの対応情報を保持しているので、 同一gene symbolsのカウント情報をマージしてgene symbolsに変換した結果を返すやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. recountパッケージでSRP001558データのダウンロードから行う場合:

「解析 | 前処理 | フィルタリング | その他 | gene symbols情報があるもののみ | RangedSummarizedExperiment」 の例題1(gene symbolがNAでないもののフィルタリングまで)をまるごと含んでいます。 58,037 Ensembl gene IDsが、25,287 gene symbolsになっていることがわかります(2018年8月15日現在)。

param_ID <- "SRP001558"                #IDを指定
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param <- "mean"                        #代表値(要約統計量)を指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み
library(SummarizedExperiment)          #パッケージの読み込み

#入力データ取得(.Rdataのロード)
download_study(param_ID, type="rse-gene", download=T)#ダウンロード
load(file.path(param_ID, 'rse_gene.Rdata'))#作成されたparam_IDという名前のディレクトリ中の.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#前処理(データ正規化など;この項目とは直接的な関係はないが念のため)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)

#前処理(gene symbolがNAでないもののフィルタリング)
symbols <- as.character(as.vector(rowData(rse)$symbol))#gene symbol情報を文字列ベクトルとして抽出
obj <- !is.na(symbols)                 #gene symbolsがNA以外ならTRUE、NAならFALSEとした条件判定を行っている
rse <- rse[obj]                        #objがTRUEとなるもののみ抽出
rse                                    #確認してるだけです

#前処理(ユニークなgene symbolsの抽出など)
symbols <- symbols[obj]                #gene symbol情報を文字列ベクトルとして抽出
unique_sym <- unique(symbols)          #ユニーク(non-redundant)なgene symbolsのベクトルにしている
length(unique_sym)                     #確認してるだけです(ユニークなgene symbols数)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
data <- as.data.frame(data)            #データフレーム形式に変換
dim(data)                              #確認してるだけです

#本番(同一gene symbolsのデータをまとめる)
hoge <- NULL                           #最終的に欲しい情報を格納するためのプレースホルダ
for(i in 1:length(unique_sym)){        #non-redundant gene symbol数分だけループを回す
    hoge <- rbind(hoge, apply(data[which(symbols == unique_sym[i]),], 2, param, na.rm=TRUE))#dataの中からi番目のgene symbolと同じEnsembl gene IDのデータを全て抽出し、paramで指定した要約統計量をhogeの一番下の行に追加
}                                      #non-redundant gene symbol数分だけループを回す
rownames(hoge) <- unique_sym           #non-redundant gene symbolsをhogeの行の名前として利用
dim(hoge)                              #確認してるだけです

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(hoge), hoge)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

「解析 | 前処理 | フィルタリング | その他 | gene symbols情報があるもののみ | RangedSummarizedExperiment」 の例題2(gene symbolがNAでないもののフィルタリングまで)をまるごと含んでいます。 58,037 Ensembl gene IDsが、25,219 gene symbolsになっていることがわかります(2018年8月15日現在)。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param <- "mean"                        #代表値(要約統計量)を指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み
library(SummarizedExperiment)          #パッケージの読み込み

#入力ファイルの読み込み(.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#前処理(データ正規化など;この項目とは直接的な関係はないが念のため)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)

#本番(gene symbolがNAでないもののフィルタリング)
symbols <- as.character(as.vector(rowData(rse)$symbol))#gene symbol情報を文字列ベクトルとして抽出
obj <- !is.na(symbols)                 #gene symbolsがNA以外ならTRUE、NAならFALSEとした条件判定を行っている
rse <- rse[obj]                        #objがTRUEとなるもののみ抽出
rse                                    #確認してるだけです

#前処理(ユニークなgene symbolsの抽出など)
symbols <- symbols[obj]                #gene symbol情報を文字列ベクトルとして抽出
unique_sym <- unique(symbols)          #ユニーク(non-redundant)なgene symbolsのベクトルにしている
length(unique_sym)                     #確認してるだけです(ユニークなgene symbols数)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
data <- as.data.frame(data)            #データフレーム形式に変換
dim(data)                              #確認してるだけです

#本番(同一gene symbolsのデータをまとめる)
hoge <- NULL                           #最終的に欲しい情報を格納するためのプレースホルダ
for(i in 1:length(unique_sym)){        #non-redundant gene symbol数分だけループを回す
    hoge <- rbind(hoge, apply(data[which(symbols == unique_sym[i]),], 2, param, na.rm=TRUE))#dataの中からi番目のgene symbolと同じEnsembl gene IDのデータを全て抽出し、paramで指定した要約統計量をhogeの一番下の行に追加
}                                      #non-redundant gene symbol数分だけループを回す
rownames(hoge) <- unique_sym           #non-redundant gene symbolsをhogeの行の名前として利用
dim(hoge)                              #確認してるだけです

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(hoge), hoge)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. ダウンロード済みのrse_gene.Rdataを入力として読み込む場合:

例題2をほぼ丸々含みますが、「カウント情報取得 | リアルデータ | SRP001558 | recount(Collado-Torres_2017)」 の例題6の最後のほうをさらに組み合わせています。つまり、 同一サンプル(technical replicates)の情報をマージした後、サンプル名を変更して出力させています。 出力は、25,219 gene symbols×6 sampleのカウントデータです。

in_f <- "rse_gene.Rdata"               #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param <- "mean"                        #代表値(要約統計量)を指定

#必要なパッケージをロード
library(recount)                       #パッケージの読み込み
library(SummarizedExperiment)          #パッケージの読み込み

#入力ファイルの読み込み(.Rdataをロード)
load(in_f)                             #in_fで指定した.Rdataをロード
rse <- rse_gene                        #rseとして取り扱う
rse                                    #確認してるだけです

#前処理(データ正規化など;この項目とは直接的な関係はないが念のため)
rse <- scale_counts(rse)               #scale_counts実行(2018.08.07追加)

#本番(gene symbolがNAでないもののフィルタリング)
symbols <- as.character(as.vector(rowData(rse)$symbol))#gene symbol情報を文字列ベクトルとして抽出
obj <- !is.na(symbols)                 #gene symbolsがNA以外ならTRUE、NAならFALSEとした条件判定を行っている
rse <- rse[obj]                        #objがTRUEとなるもののみ抽出
rse                                    #確認してるだけです

#前処理(ユニークなgene symbolsの抽出など)
symbols <- symbols[obj]                #gene symbol情報を文字列ベクトルとして抽出
unique_sym <- unique(symbols)          #ユニーク(non-redundant)なgene symbolsのベクトルにしている
length(unique_sym)                     #確認してるだけです(ユニークなgene symbols数)
data <- assays(rse)$counts             #カウントデータ行列を取得してdataに格納
data <- as.data.frame(data)            #データフレーム形式に変換
dim(data)                              #確認してるだけです

#本番(同一gene symbolsのデータをまとめる)
hoge <- NULL                           #最終的に欲しい情報を格納するためのプレースホルダ
for(i in 1:length(unique_sym)){        #non-redundant gene symbol数分だけループを回す
    hoge <- rbind(hoge, apply(data[which(symbols == unique_sym[i]),], 2, param, na.rm=TRUE))#dataの中からi番目のgene symbolと同じEnsembl gene IDのデータを全て抽出し、paramで指定した要約統計量をhogeの一番下の行に追加
}                                      #non-redundant gene symbol数分だけループを回す
rownames(hoge) <- unique_sym           #non-redundant gene symbolsをhogeの行の名前として利用
dim(hoge)                              #確認してるだけです

#後処理(technical replicatesの列をマージ)
uge <- as.data.frame(hoge)             #行列形式からデータフレーム形式に変更
data <- cbind(                         #必要な列名の情報を取得したい列の順番で結合した結果をdataに格納
  uge$SRR032116,                       #HSF1
  uge$SRR032118 + uge$SRR032119,       #HSF2
  uge$SRR032120 + uge$SRR032121,       #HSF3
  uge$SRR032122 + uge$SRR032123,       #HSM1
  uge$SRR032124 + uge$SRR032125,       #HSM2
  uge$SRR032126 + uge$SRR032127)       #HSM3
  
colnames(data) <- c(                   #列名を付加
  "HSF1", "HSF2", "HSF3",              #列名を付加
  "HSM1", "HSM2", "HSM3")              #列名を付加
rownames(data)<- rownames(uge)         #行名を付加
dim(data)                              #行数と列数を表示
head(data)                             #確認してるだけです

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 前処理 | scRNA-seq | について

single-cell RNA-seq (scRNA-seq)のカウントデータは「疎(sparse)」です。つまり、多くの遺伝子のカウントがゼロ(0)という特徴を持ちます。 これには2つの理由があり、1つは「細胞のタイプごとに発現している遺伝子が異なるため本当に発現していない」という生物学的な理由(biological cause)によるもの。 そしてもう1つは「本当は発現しているんだけども捉えられていない」という技術的な理由(technical cause)によるものです。 特に、後者の技術的な理由でゼロカウントになることを「ドロップアウト(dropout)」と言います(Zappia et al., Genome Biol., 2017)。 データのほとんどがゼロでそれが検出されたりされなかったりするデータ(遺伝子)が多いのが特徴ですが、これがデータ解析時に悪さをするので前処理(preprocessing)が必要らしいです。
  しかし、一言で前処理と言っても、実際には多様な処理が含まれます。例えば、転写物レベルのカウントデータを遺伝子レベルにつぶす(collapseする)処理や、 外部コントロールとして用いるspike-in転写物のカウント数がやたらと多い細胞のデータ(実験上のミスや細胞が死んでいるなどの理由による)の除去、 ごく少数の遺伝子のみのカウント数がそのライブラリの総カウント数の占めるようなlow-complexity librariesの存在確認、低発現遺伝子(low-abundance genes)や ドロップアウト率の高い遺伝子(genes with high dropout rate)のフィルタリングなどが挙げられます (McCarthy et al., Bioinformatics, 2017)。 この他にも、反復データをうまく利用して真の発現レベル(true expression levels)を推定するプログラム (inferとかimputationとかdenoisingとかrecoverなどの単語を含むものが該当します)もこの範疇に含めてよいと思います。 "cells (細胞)"の代わりに"barcodes (バーコード)"という用語も使われます。これは、同じバーコード(well- or droplet-specific cellular barcode)に割り当てられた全てのリードが同じ細胞由来のリードに対応しないこともあるためです(Luecken and Theis, Mol Syst Biol., 2019のpage 3の右上あたり)。 例えば、あるバーコードが複数の細胞に間違ってタグ付けされたり(これを"doublet (ダブレット)"といいます)、どの細胞にも割当てられなかったりする(empty doublet/well)ことが現実にはあります。 scRNA-seqは実験プロトコルとして細胞ごとに分離してsequencingを行うのでsingle-cellなのですが、この際に完全には細胞を分離しきれないことに起因します。 doubletsは、サンプルのラベル情報がミスった状態で解析をするのと同義ですので、結構悪影響を及ぼします。 以下で「doublets同定用」と書いてあるのは、そのようなあやしいdoublets由来データを検出してくれるプログラムたちです。 ちなみにdoubletsというと2つの細胞ということになりますので、3つ以上の場合にはmultipletsになります。 それでもmultipletsということがほとんどないのは、おそらく3つ以上も混入してしまうような実験プロトコルは淘汰されているから...ですかね。 ちなみに、多くの実験プロトコルはプレート(plate)ごとあるいは液滴(droplet)ごとに「unique molecular identifier (UMI)という6-10塩基程度の長さの識別用タグ配列」仕込みます。 こうしておくことで、sequencingの際は全部を一緒にしてNGS機器にかけることができます(These libraries are pooled together for sequencing.) (Luecken and Theis, Mol Syst Biol., 2019)。この「一緒にする(プールする)」ことをmultiplexingと言います。 scRNA-seqの生データ自体は、分離前の様々な細胞由来リード情報からなるので、一緒にされているものを分離する作業が必要になります。これをdemultiplexingといいます

他には、biological effectsの補正として細胞周期を揃えるbiological correctionもあります。scaterSCANPYがcell cycle scoreで線形回帰するシンプルな方法を実装しています(Luecken and Theis, Mol Syst Biol., 2019の6ページ目の右上)が、 より複雑なモデルでcell cycle補正を行うscLVMf-scLVM(slalomパッケージの一部として実装されている) もあります。また、細胞によって大きさが異なりますが、この大きさの違いは細胞周期に起因する転写の効果によって説明できるという主張 (McDavid, Nat Biotechnol., 2016)もあります。このcell size補正に特化したcgCorrectというプログラムもあるようです。 cgCorrectは部分的にcell cycle補正も行うことになります(Luecken and Theis, Mol Syst Biol., 2019の6ページ目の右中)。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | クラスタリング | RNA-seq | について

だいぶ充実してきましたね。2019年4月4日にscRNA-seq用を別項目に移動させ、scRNA-seqとの対比で、(bulk) RNA-seq用のみであることを明記した項目名に変更しました。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | クラスタリング | RNA-seq | サンプル間 | hclust

RNA-seqカウントデータのクラスタリング結果は、特にゼロカウント(0カウント; zero count)を多く含む場合に(もちろん距離の定義の仕方によっても変わってきますが) 低発現データのフィルタリングの閾値次第で結果が変わる傾向にあります。 ここでは、上記閾値問題に悩まされることなく頑健なサンプル間クラスタリングを行うやり方を示します。 内部的に行っていることは、1)全サンプルで0カウントとなる行(遺伝子)をフィルタリングした後、unique関数を用いて同一発現パターンのものを1つのパターンとしてまとめ、 2)「1 - Spearman順位相関係数」でサンプル間距離を定義、3)Average-linkage clusteringの実行、です。 順位相関係数を用いてサンプルベクトル間の類似度として定義するので、サンプル間正規化の問題に悩まされません。 また、低発現遺伝子にありがちな同一発現パターンの遺伝子をまとめることで、(変動しやすい)同順位となる大量の遺伝子が集約されるため、 結果的に「総カウント数がx個以下のものをフィルタリング...」という閾値問題をクリアしたことになります。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
data.dist <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdata.distに格納
out <- hclust(data.dist, method="average")#階層的クラスタリングを実行し、結果をoutに格納
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。non-DEGデータのみでクラスタリングを行っています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_nonDEG <- 2001:10000             #non-DEGの位置を指定

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(サブセットの抽出)
data <- data[param_nonDEG,]            #指定した行のみ抽出した結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
data.dist <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdata.distに格納
out <- hclust(data.dist, method="average")#階層的クラスタリングを実行し、結果をoutに格納
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

3.サンプルデータ9のReCount (Frazee et al., BMC Bioinformatics, 2011)から提供されているカウントデータの場合:

Study列が"bodymap"データのクラスタリングを行います。"Count table"列のカウントデータファイル(bodymap_count_table.txt) のみではサンプル名がIDとして与えられているため、"Phenotype table"列のサンプル名情報ファイル(bodymap_phenodata.txt) も利用してbrain, liver, heartなどに変換した上でクラスタリング結果を表示させています。

in_f1 <- "bodymap_count_table.txt"     #入力ファイル名を指定してin_f1に格納(カウントデータファイル)
in_f2 <- "bodymap_phenodata.txt"       #入力ファイル名を指定してin_f2に格納(サンプル名情報ファイル)
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込みと列名変更
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
phenotype <- read.table(in_f2, header=TRUE, row.names=1, sep=" ", quote="")#in_f2で指定したファイルの読み込み
colnames(data) <- phenotype$tissue.type#列名を付与
dim(data)                              #確認してるだけです

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
data.dist <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdata.distに格納
out <- hclust(data.dist, method="average")#階層的クラスタリングを実行し、結果をoutに格納
png(out_f, pointsize=15, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

4. サンプルデータ8の26,221 genes×6 samplesのリアルデータ(data_arab.txt; mock 3サンプル vs. hrcc 3サンプル)の場合:

in_f <- "data_arab.txt"                #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
data.dist <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdata.distに格納
out <- hclust(data.dist, method="average")#階層的クラスタリングを実行し、結果をoutに格納
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

5. 59,857 genes×6 samplesのリアルデータ(srp017142_count_bowtie.txt; 3 proliferative samples vs. 3 Ras samples)の場合:

Neyret-Kahn et al., Genome Res., 2013の2群間比較用ヒトRNA-seqカウントデータです。 パイプライン | ゲノム | 発現変動 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013)から得られます。

in_f <- "srp017142_count_bowtie.txt"   #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
data.dist <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdata.distに格納
out <- hclust(data.dist, method="average")#階層的クラスタリングを実行し、結果をoutに格納
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

解析 | クラスタリング | RNA-seq | サンプル間 | TCC(Sun_2013)

TCCパッケージを用いてサンプル間クラスタリングを行うやり方を示します。 clusterSample関数を利用した頑健なクラスタリング結果を返します。多群間比較用の推奨ガイドライン提唱論文 (Tang et al., BMC Bioinformatics, 2015)中でも この関数を用いています(2015/11/05追加)。xlsx形式ファイルを入力とするやり方も追加しました(2015/11/15)。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 59,857 genes×6 samplesのリアルデータ(srp017142_count_bowtie.txt)の場合:

Neyret-Kahn et al., Genome Res., 2013の2群間比較用(3 proliferative samples vs. 3 Ras samples)ヒトRNA-seqカウントデータです。 パイプライン | ゲノム | 発現変動 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013)から得られます。

in_f <- "srp017142_count_bowtie.txt"   #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

2. 59,857 genes×6 samplesのリアルデータ(srp017142_count_bowtie.txt)の場合:

1.との違いはplot関数実行時のオプションの部分のみです。sub=""で、下のほうの「hclust(*, "average")」という文字を消しています。 xlab=""で、下のほうの「d」という文字を消しています。cex.lab=1.5で、表示されているy軸名「Height」の文字の大きさを通常の0.6倍にし、 入力ファイル中のサンプル名の文字の大きさを通常の1.3倍にしています。

in_f <- "srp017142_count_bowtie.txt"   #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, sub="", xlab="", cex.lab=0.6, cex=1.3)#樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

3. 59,857 genes×6 samplesのリアルデータ(srp017142_count_bowtie.txt)の場合:

2.との違いはplot関数実行時のオプションの部分のみです。 ylab="height kamo"で、y軸名を通常の1.2倍の「height kamo」にしています。 main=""で、図の上のほうのメインタイトル名が表示されないようにしてます。 par(mar=c(0, 4, 1, 0))で、図の上下の余白を狭くして、図の左側のみ4行分、上を1行分空け、下と右を0行分だけ開けるように指定しています。

in_f <- "srp017142_count_bowtie.txt"   #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(0, 4, 1, 0))                 #下、左、上、右の順で余白(行)を指定
plot(out, sub="", xlab="", cex.lab=1.2,#樹形図(デンドログラム)の表示
  cex=1.3, main="", ylab="height kamo")#樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

4. 59,857 genes×6 samplesのリアルデータ(srp017142_count_bowtie.txt)の場合:

このデータは2つの大きなクラスターに分かれていることが分かります。 ここでは指定したクラスター数に分けた場合に、含まれるメンバーなどを得るやり方を示します。

in_f <- "srp017142_count_bowtie.txt"   #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge4.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge4.png"                  #出力ファイル名を指定してout_f2に格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_clust_num <- 3                   #クラスター数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#後処理
hoge <- cutree(out, k=param_clust_num) #指定したクラスター数に分割した結果をhogeに格納
hoge                                   #サンプルごとに所属するクラスター番号を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(colnames(data), hoge)     #保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(0, 4, 1, 0))                 #下、左、上、右の順で余白(行)を指定
plot(out, sub="", xlab="", cex.lab=1.2,#樹形図(デンドログラム)の表示
  cex=1.3, main="", ylab="Height")     #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

5. 60,234 genes×6 samplesのリアルデータ(hoge9_count_gene.txt)の場合:

Neyret-Kahn et al., Genome Res., 2013のgene-levelの2群間比較用(3 proliferative samples vs. 3 Ras samples)ヒトRNA-seqカウントデータです。 マップ後 | カウント情報取得 | single-end | ゲノム | アノテーション有 | QuasR(Gaidatzis_2015)から得られます。

in_f <- "hoge9_count_gene.txt"         #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(0, 4, 1, 0))                 #下、左、上、右の順で余白(行)を指定
plot(out, sub="", xlab="", cex.lab=1.2,#樹形図(デンドログラム)の表示
  cex=1.3, main="", ylab="Height")     #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

6. 584,914 exons×6 samplesのリアルデータ(hoge9_count_exon.txt)の場合:

Neyret-Kahn et al., Genome Res., 2013のexon-levelの2群間比較用(3 proliferative samples vs. 3 Ras samples)ヒトRNA-seqカウントデータです。 マップ後 | カウント情報取得 | single-end | ゲノム | アノテーション有 | QuasR(Gaidatzis_2015)から得られます。

in_f <- "hoge9_count_exon.txt"         #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(0, 4, 1, 0))                 #下、左、上、右の順で余白(行)を指定
plot(out, sub="", xlab="", cex.lab=1.2,#樹形図(デンドログラム)の表示
  cex=1.3, main="", ylab="Height")     #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

7. サンプルデータ41のリアルデータ(sample_blekhman_36.txt)の場合:

Blekhman et al., Genome Res., 2010の 20,689 genes×36 samplesのカウントデータです。

in_f <- "sample_blekhman_36.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(700, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(0, 4, 1, 0))                 #下、左、上、右の順で余白(行)を指定
plot(out, sub="", xlab="", cex.lab=1.2,#樹形図(デンドログラム)の表示
  cex=1.3, main="", ylab="Height")     #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

8. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

Blekhman et al., Genome Res., 2010の 20,689 genes×18 samplesのカウントデータです。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge8.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(700, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(0, 4, 1, 0))                 #下、左、上、右の順で余白(行)を指定
plot(out, sub="", xlab="", cex.lab=1.2,#樹形図(デンドログラム)の表示
  cex=1.3, main="", ylab="Height")     #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

9. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

8.と基本的に同じですが、図の大きさなどを変更しています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge9.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(340, 200)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(0, 0, 0, 0))                 #下、左、上、右の順で余白(行)を指定
plot(out, sub="", xlab="", cex.lab=1.2,#樹形図(デンドログラム)の表示
  cex=1.3, main="", col.main="red")    #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

10. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

9.と基本的に同じですが、図の大きさを変更しています。 また、余白のパラメータparam_marを追加しています。左側の軸が見えるようにしています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge10.png"                  #出力ファイル名を指定してout_fに格納
param_fig <- c(403, 200)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(0, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(out, sub="", xlab="", cex.lab=1.2,#樹形図(デンドログラム)の表示
  cex=1.3, main="", col.main="red")    #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

11. Rajkumar et al., 2015の26,119 genes×16 samplesのカウントデータ(s12864-015-1767-y-s1.xlsx)の場合:

Additional file 1として提供されているxlsxファイルです。 2群間比較用(8 samples vs. 8 samples)データです。余分な情報を最初の1行分に含みます。 このため、最初の2行目から読み込むやり方です。

in_f <- "s12864-015-1767-y-s1.xlsx"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge11.png"                  #出力ファイル名を指定してout_fに格納
param_skip <- 2                        #読み込み始める行番号を指定
param_fig <- c(403, 200)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(0, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(openxlsx)                      #パッケージの読み込み
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.xlsx(in_f, startRow=param_skip, colNames=T, rowNames=T)#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(out, sub="", xlab="", cex.lab=1.2,#樹形図(デンドログラム)の表示
  cex=1.3, main="", col.main="red")    #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

解析 | クラスタリング | RNA-seq | 遺伝子間(基礎) | MBCluster.Seq(Si_2014)

MBCluster.Seqパッケージを用いたやり方を示します。 k-means++(Arthur and Vassilvitskii, 2007) と似た方法でクラスター中心を決める方法を内部的に利用しているらしいです。 param_clust_numで指定するクラスター数は最初は気持ち多めにしておいても、クラスタリング実行中に重複のないパターン(non-redundant expression patterns)にある程度はしてくれます。 例えば、これを利用した最近の論文(Casero et al., Nat Immunol., 2015)では、 おそらくparam_clust_numで指定するクラスター数を50として実行し、最終的に20 clustersを得たようです。 モデルはPoissonとnegative binomial (NB) modelから選択できるらしいですが、基本は後者の利用だと思います。 遺伝子間クラスタリングなのでデータの正規化が重要になってきます。 RNASeq.Data関数のところで、Normalizer=NULLにするとlog(Q2)でデータを揃えるらしいです。 この関数は、遺伝子(行)ごとの正規化後の平均発現量、正規化係数、logFC、NB.Dispersionなどクラスタリングに必要な結果を返します。 ここでは、例題7まではNormalizer=NULLに固定し、それ以外の入力ファイルや指定するクラスター数の例を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

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であることが既知です。 このデータは事実上3つのクラスター(G1で高発現のDEGクラスター、G2で高発現のDEGクラスター、non-DEGクラスター)しか存在しない例ですが、 とりあえずクラスター数を4にしています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(800, 500)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_clust_num <- 4                   #クラスター数を指定
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(MBCluster.Seq)                 #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(基礎情報取得)
hoge <- RNASeq.Data(data, Normalizer=NULL,#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得

#本番(クラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotHybrid.Tree(merge=tr, cluster=cls$cluster, logFC=hoge$logFC, tree.title=NULL)#描画
dev.off()                              #おまじない
	

2. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。このデータは事実上4つのクラスター (G1で高発現のDEGクラスター、G2で高発現のDEGクラスター、G3で高発現のDEGクラスター、non-DEGクラスター)しか存在しない例ですが、 とりあえずクラスター数を6にしています。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(800, 500)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_clust_num <- 6                   #クラスター数を指定
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(MBCluster.Seq)                 #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(基礎情報取得)
hoge <- RNASeq.Data(data, Normalizer=NULL,#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得

#本番(クラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotHybrid.Tree(merge=tr, cluster=cls$cluster, logFC=hoge$logFC, tree.title=NULL)#描画
dev.off()                              #おまじない
	

3. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

Blekhman et al., Genome Res., 2010の20,689 genes×18 samplesのカウントデータです。 ヒトのメス3サンプル(HSF1-3)とオス3サンプル(HSM1-3), チンパンジーのメス3サンプル(PTF1-3)とオス3サンプル(PTM1-3), アカゲザルのメス3サンプル(RMF1-3)とオス3サンプル(RMM1-3)の並びになっています。とりあえずクラスター数を5にしています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(800, 500)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_clust_num <- 5                   #クラスター数を指定
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(MBCluster.Seq)                 #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(基礎情報取得)
hoge <- RNASeq.Data(data, Normalizer=NULL,#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得

#本番(クラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotHybrid.Tree(merge=tr, cluster=cls$cluster, logFC=hoge$logFC, tree.title=NULL)#描画
dev.off()                              #おまじない
	

4. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

3.と基本的に同じですが、遺伝子ごとにparam_clust_numで指定したクラスターのどこに割り振られたかの情報を、 クラスターごとにソートして保存しています。とりあえずクラスター数を10にしています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge4.png"                  #出力ファイル名を指定してout_f1に格納(pngファイル)
out_f2 <- "hoge4.txt"                  #出力ファイル名を指定してout_f2に格納(txtファイル)
param_fig <- c(800, 500)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_clust_num <- 10                  #クラスター数を指定
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(MBCluster.Seq)                 #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(基礎情報取得)
hoge <- RNASeq.Data(data, Normalizer=NULL,#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得

#本番(クラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)
table(cls$cluster)                     #各クラスターに属する遺伝子数を表示

#ファイルに保存(pngファイル)
png(out_f1, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotHybrid.Tree(merge=tr, cluster=cls$cluster, logFC=hoge$logFC, tree.title=NULL)#描画
dev.off()                              #おまじない

#ファイルに保存(txtファイル)
tmp <- cbind(rownames(data), data, cls$cluster)#保存したい情報をtmpに格納
tmp <- tmp[order(cls$cluster),]        #クラスター番号順にソートした結果をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f2で指定したファイル名で保存
	

5. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

例題2のシミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。このデータは事実上4つのクラスター (G1で高発現のDEGクラスター、G2で高発現のDEGクラスター、G3で高発現のDEGクラスター、non-DEGクラスター)しか存在しない例です。 クラスター数を4にして、どのクラスターに割り振られたかが分かるようにしています。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_clust_num <- 4                   #クラスター数を指定
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(MBCluster.Seq)                 #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(基礎情報取得)
hoge <- RNASeq.Data(data, Normalizer=NULL,#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得

#本番(クラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)

#ファイルに保存(txtファイル)
tmp <- cbind(rownames(data), data, cls$cluster)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f2で指定したファイル名で保存
	

6. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

例題5と基本的に同じですが、クラスター番号情報だけではなく、既知の発現パターン ("DEG_G1", "DEG_G2", "DEG_G3", "nonDEG")に割り当てた結果を一番右側の列に追加しています。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_clust_num <- 4                   #クラスター数を指定
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_narabi <- c("nonDEG", "DEG_G1", "DEG_G2", "DEG_G3")#パターン名を指定(並びは変えない)

#必要なパッケージをロード
library(MBCluster.Seq)                 #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(基礎情報取得)
hoge <- RNASeq.Data(data, Normalizer=NULL,#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得

#本番(クラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)

#クラスター番号への既知パターンの割り当て
DEG_G1_posi <- 1:2100                  #G1群で高発現の位置情報
DEG_G2_posi <- 2101:2700               #G2群で高発現の位置情報
DEG_G3_posi <- 2701:3000               #G3群で高発現の位置情報
nonDEG_posi <- 3001:10000              #non-DEGの位置情報

conversion <- 1:param_clust_num        #クラスター数の情報をconversionに格納
names(conversion) <- 1:param_clust_num #names属性を付加
pattern <- cls$cluster                 #クラスター番号情報をpatternに格納

hoge <- table(cls$cluster[nonDEG_posi])#nonDEG群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[1]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[1] #当該クラスター番号への既知パターン情報の割り当て

hoge <- table(cls$cluster[DEG_G1_posi])#G1群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[2]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[2] #当該クラスター番号への既知パターン情報の割り当て

hoge <- table(cls$cluster[DEG_G2_posi])#G2群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[3]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[3] #当該クラスター番号への既知パターン情報の割り当て

hoge <- table(cls$cluster[DEG_G3_posi])#G3群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[4]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[4] #当該クラスター番号への既知パターン情報の割り当て

conversion                             #割り当てられたクラスター番号と既知パターンの対応関係を表示
table(cls$cluster[nonDEG_posi])        #non-DEGのものが割り当てられたクラスター番号を表示
table(cls$cluster[DEG_G1_posi])        #G1群で高発現のものが割り当てられたクラスター番号を表示
table(cls$cluster[DEG_G2_posi])        #G2群で高発現のものが割り当てられたクラスター番号を表示
table(cls$cluster[DEG_G3_posi])        #G3群で高発現のものが割り当てられたクラスター番号を表示

#ファイルに保存(txtファイル)
tmp <- cbind(rownames(data), data, cls$cluster, pattern)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
	

7. サンプルデータ15の10,000 genes×9 samplesのカウントデータ生成から行う場合:

例題6と同じ結果になります。サンプルデータ15の最初の部分を丸々含みます。 混同行列(confusion matrix)情報のファイルも出力しています。

out_f1 <- "hoge7.txt"                  #出力ファイル名を指定してout_f1に格納(クラスタリング結果)
out_f2 <- "hoge7_confusion.txt"        #出力ファイル名を指定してout_f2に格納(混同行列ファイル)
param_clust_num <- 4                   #クラスター数を指定
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.3                      #発現変動遺伝子の割合を指定    
param_FC <- c(3, 10, 6)                #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.7, 0.2, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_narabi <- c("nonDEG", "DEG_G1", "DEG_G2", "DEG_G3")#パターン名を指定(並びは変えない)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(MBCluster.Seq)                 #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成
data <- tcc$count                      #カウントデータ情報をdataに格納
data.cl <- tcc$group$group             #G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(基礎情報取得)
hoge <- RNASeq.Data(data, Normalizer=NULL,#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得
head(hoge$Normalizer, n=1)             #確認してるだけです

#本番(クラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)

#クラスター番号と既知パターンの対応付け
hoge <- param_Ngene*param_PDEG         #トータルのDEG数情報をhogeに格納
DEG_G1_posi <- 1:(hoge*param_DEGassign[1])#G1群で高発現の位置情報
DEG_G2_posi <- (hoge*param_DEGassign[1]+1):(hoge*sum(param_DEGassign[1:2]))#G2群で高発現の位置情報
DEG_G3_posi <- (hoge*sum(param_DEGassign[1:2])+1):hoge#G3群で高発現の位置情報
nonDEG_posi <- (hoge+1):param_Ngene    #non-DEGの位置情報

conversion <- 1:param_clust_num        #クラスター数の情報をconversionに格納
names(conversion) <- 1:param_clust_num #names属性を付加
pattern <- cls$cluster                 #クラスター番号情報をpatternに格納

hoge <- table(cls$cluster[nonDEG_posi])#nonDEG群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[1]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[1] #当該クラスター番号への既知パターン情報の割り当て

hoge <- table(cls$cluster[DEG_G1_posi])#G1群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[2]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[2] #当該クラスター番号への既知パターン情報の割り当て

hoge <- table(cls$cluster[DEG_G2_posi])#G2群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[3]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[3] #当該クラスター番号への既知パターン情報の割り当て

hoge <- table(cls$cluster[DEG_G3_posi])#G3群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[4]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[4] #当該クラスター番号への既知パターン情報の割り当て

#混同行列(confusion matrix)の作成
confusion <- matrix(0, nrow=param_clust_num, ncol=param_clust_num)#プレースホルダの作成
for(i in 1:param_clust_num){           #(param_clust_num)回だけループを回す
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 1] <- sum(cls$cluster[nonDEG_posi] == posi)#nonDEG_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 2] <- sum(cls$cluster[DEG_G1_posi] == posi)#DEG_G1_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 3] <- sum(cls$cluster[DEG_G2_posi] == posi)#DEG_G2_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 4] <- sum(cls$cluster[DEG_G3_posi] == posi)#DEG_G3_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
}
confusion  <- cbind(confusion, rowSums(confusion))#各行の総和情報を付加
confusion  <- rbind(confusion, colSums(confusion))#各列の総和情報を付加
colnames(confusion) <- c(param_narabi, "Total")#列名を付加
rownames(confusion) <- c(param_narabi, "Total")#行名を付加
confusion                              #確認してるだけです

#ファイルに保存(クラスタリング結果)
tmp <- cbind(rownames(data), data, cls$cluster, pattern)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存

#ファイルに保存(混同行列)
tmp <- cbind(rownames(confusion), confusion)#保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存
	

8. サンプルデータ15の10,000 genes×9 samplesのカウントデータ生成から行う場合:

例題7を基本として、TMM正規化によって得られたサイズファクターをRNASeq.Data関数での読み込み時に与えています。

out_f1 <- "hoge8.txt"                  #出力ファイル名を指定してout_f1に格納(クラスタリング結果)
out_f2 <- "hoge8_confusion.txt"        #出力ファイル名を指定してout_f2に格納(混同行列ファイル)
param_clust_num <- 4                   #クラスター数を指定
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.3                      #発現変動遺伝子の割合を指定    
param_FC <- c(3, 10, 6)                #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.7, 0.2, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_narabi <- c("nonDEG", "DEG_G1", "DEG_G2", "DEG_G3")#パターン名を指定(並びは変えない)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(MBCluster.Seq)                 #パッケージの読み込み
library(edgeR)                         #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成
data <- tcc$count                      #カウントデータ情報をdataに格納
data.cl <- tcc$group$group             #G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番(TMM正規化)
#tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納
#norm.factors <- tcc$norm.factors      #TMM正規化係数をnorm.factorsに格納
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化係数を計算
norm.factors <- d$samples$norm.factors #TMM正規化係数をnorm.factorsに格納
ef.libsizes <- colSums(data)*norm.factors#総リード数(library sizes)に正規化係数を掛けて得たeffective library sizes情報をef.libsizesに格納
size.factors <- ef.libsizes/mean(ef.libsizes)#effective library sizesを正規化してサイズファクターを得る
size.factors                           #確認してるだけです

#前処理(正規化)
hoge <- RNASeq.Data(data, Normalizer=log(size.factors),#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得
head(hoge$Normalizer, n=1)             #確認してるだけです

#本番(クラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)

#クラスター番号と既知パターンの対応付け
hoge <- param_Ngene*param_PDEG         #トータルのDEG数情報をhogeに格納
DEG_G1_posi <- 1:(hoge*param_DEGassign[1])#G1群で高発現の位置情報
DEG_G2_posi <- (hoge*param_DEGassign[1]+1):(hoge*sum(param_DEGassign[1:2]))#G2群で高発現の位置情報
DEG_G3_posi <- (hoge*sum(param_DEGassign[1:2])+1):hoge#G3群で高発現の位置情報
nonDEG_posi <- (hoge+1):param_Ngene    #non-DEGの位置情報

conversion <- 1:param_clust_num        #クラスター数の情報をconversionに格納
names(conversion) <- 1:param_clust_num #names属性を付加
pattern <- cls$cluster                 #クラスター番号情報をpatternに格納

hoge <- table(cls$cluster[nonDEG_posi])#nonDEG群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[1]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[1] #当該クラスター番号への既知パターン情報の割り当て

hoge <- table(cls$cluster[DEG_G1_posi])#G1群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[2]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[2] #当該クラスター番号への既知パターン情報の割り当て

hoge <- table(cls$cluster[DEG_G2_posi])#G2群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[3]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[3] #当該クラスター番号への既知パターン情報の割り当て

hoge <- table(cls$cluster[DEG_G3_posi])#G3群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[4]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[4] #当該クラスター番号への既知パターン情報の割り当て

#混同行列(confusion matrix)の作成
confusion <- matrix(0, nrow=param_clust_num, ncol=param_clust_num)#プレースホルダの作成
for(i in 1:param_clust_num){           #(param_clust_num)回だけループを回す
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 1] <- sum(cls$cluster[nonDEG_posi] == posi)#nonDEG_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 2] <- sum(cls$cluster[DEG_G1_posi] == posi)#DEG_G1_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 3] <- sum(cls$cluster[DEG_G2_posi] == posi)#DEG_G2_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 4] <- sum(cls$cluster[DEG_G3_posi] == posi)#DEG_G3_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
}
confusion  <- cbind(confusion, rowSums(confusion))#各行の総和情報を付加
confusion  <- rbind(confusion, colSums(confusion))#各列の総和情報を付加
colnames(confusion) <- c(param_narabi, "Total")#列名を付加
rownames(confusion) <- c(param_narabi, "Total")#行名を付加
confusion                              #確認してるだけです

#ファイルに保存(クラスタリング結果)
tmp <- cbind(rownames(data), data, cls$cluster, pattern)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存

#ファイルに保存(混同行列)
tmp <- cbind(rownames(confusion), confusion)#保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存
	

9. サンプルデータ15の10,000 genes×9 samplesのカウントデータ生成から行う場合:

例題8と基本的に同じ結果になりますが、TMM正規化をedgeRパッケージ中の関数ではなく、 TCCで行っています。

out_f1 <- "hoge9.txt"                  #出力ファイル名を指定してout_f1に格納(クラスタリング結果)
out_f2 <- "hoge9_confusion.txt"        #出力ファイル名を指定してout_f2に格納(混同行列ファイル)
param_clust_num <- 4                   #クラスター数を指定
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.3                      #発現変動遺伝子の割合を指定    
param_FC <- c(3, 10, 6)                #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.7, 0.2, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_narabi <- c("nonDEG", "DEG_G1", "DEG_G2", "DEG_G3")#パターン名を指定(並びは変えない)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(MBCluster.Seq)                 #パッケージの読み込み
library(edgeR)                         #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成
data <- tcc$count                      #カウントデータ情報をdataに格納
data.cl <- tcc$group$group             #G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番(TMM正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納
norm.factors <- tcc$norm.factors       #TMM正規化係数をnorm.factorsに格納
#d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
#d <- calcNormFactors(d)               #TMM正規化係数を計算
#norm.factors <- d$samples$norm.factors#TMM正規化係数をnorm.factorsに格納
ef.libsizes <- colSums(data)*norm.factors#総リード数(library sizes)に正規化係数を掛けて得たeffective library sizes情報をef.libsizesに格納
size.factors <- ef.libsizes/mean(ef.libsizes)#effective library sizesを正規化してサイズファクターを得る
size.factors                           #確認してるだけです

#前処理(正規化)
hoge <- RNASeq.Data(data, Normalizer=log(size.factors),#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得
head(hoge$Normalizer, n=1)             #確認してるだけです

#本番(クラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)

#クラスター番号と既知パターンの対応付け
hoge <- param_Ngene*param_PDEG         #トータルのDEG数情報をhogeに格納
DEG_G1_posi <- 1:(hoge*param_DEGassign[1])#G1群で高発現の位置情報
DEG_G2_posi <- (hoge*param_DEGassign[1]+1):(hoge*sum(param_DEGassign[1:2]))#G2群で高発現の位置情報
DEG_G3_posi <- (hoge*sum(param_DEGassign[1:2])+1):hoge#G3群で高発現の位置情報
nonDEG_posi <- (hoge+1):param_Ngene    #non-DEGの位置情報

conversion <- 1:param_clust_num        #クラスター数の情報をconversionに格納
names(conversion) <- 1:param_clust_num #names属性を付加
pattern <- cls$cluster                 #クラスター番号情報をpatternに格納

hoge <- table(cls$cluster[nonDEG_posi])#nonDEG群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[1]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[1] #当該クラスター番号への既知パターン情報の割り当て

hoge <- table(cls$cluster[DEG_G1_posi])#G1群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[2]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[2] #当該クラスター番号への既知パターン情報の割り当て

hoge <- table(cls$cluster[DEG_G2_posi])#G2群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[3]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[3] #当該クラスター番号への既知パターン情報の割り当て

hoge <- table(cls$cluster[DEG_G3_posi])#G3群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[4]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[4] #当該クラスター番号への既知パターン情報の割り当て

#混同行列(confusion matrix)の作成
confusion <- matrix(0, nrow=param_clust_num, ncol=param_clust_num)#プレースホルダの作成
for(i in 1:param_clust_num){           #(param_clust_num)回だけループを回す
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 1] <- sum(cls$cluster[nonDEG_posi] == posi)#nonDEG_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 2] <- sum(cls$cluster[DEG_G1_posi] == posi)#DEG_G1_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 3] <- sum(cls$cluster[DEG_G2_posi] == posi)#DEG_G2_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 4] <- sum(cls$cluster[DEG_G3_posi] == posi)#DEG_G3_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
}
confusion  <- cbind(confusion, rowSums(confusion))#各行の総和情報を付加
confusion  <- rbind(confusion, colSums(confusion))#各列の総和情報を付加
colnames(confusion) <- c(param_narabi, "Total")#列名を付加
rownames(confusion) <- c(param_narabi, "Total")#行名を付加
confusion                              #確認してるだけです

#ファイルに保存(クラスタリング結果)
tmp <- cbind(rownames(data), data, cls$cluster, pattern)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存

#ファイルに保存(混同行列)
tmp <- cbind(rownames(confusion), confusion)#保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存
	

10. サンプルデータ15の10,000 genes×9 samplesのカウントデータ生成から行う場合:

例題9はparam_narabiで示す発現パターン分類を(シミュレーションデータなので)答えが分かっているものから逆算して割り当てています。 それに対して、ここではクラスタリング結果のclsオブジェクト中に含まれる(param_clust_num)個の代表発現パターン (これはcls$centersから取得可能)から、どのクラスター番号のものがどのパターンに相当するかを割り当てるやり方です。

out_f1 <- "hoge10.txt"                 #出力ファイル名を指定してout_f1に格納(クラスタリング結果)
out_f2 <- "hoge10_confusion.txt"       #出力ファイル名を指定してout_f2に格納(混同行列ファイル)
param_clust_num <- 4                   #クラスター数を指定
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.3                      #発現変動遺伝子の割合を指定    
param_FC <- c(3, 10, 6)                #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.7, 0.2, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_narabi <- c("nonDEG", "DEG_G1", "DEG_G2", "DEG_G3")#パターン名を指定(並びは変えない)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(MBCluster.Seq)                 #パッケージの読み込み
library(edgeR)                         #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成
data <- tcc$count                      #カウントデータ情報をdataに格納
data.cl <- tcc$group$group             #G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番(TMM正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納
norm.factors <- tcc$norm.factors       #TMM正規化係数をnorm.factorsに格納
#d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
#d <- calcNormFactors(d)               #TMM正規化係数を計算
#norm.factors <- d$samples$norm.factors#TMM正規化係数をnorm.factorsに格納
ef.libsizes <- colSums(data)*norm.factors#総リード数(library sizes)に正規化係数を掛けて得たeffective library sizes情報をef.libsizesに格納
size.factors <- ef.libsizes/mean(ef.libsizes)#effective library sizesを正規化してサイズファクターを得る
size.factors                           #確認してるだけです

#前処理(正規化)

hoge <- RNASeq.Data(data, Normalizer=log(size.factors),#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得
head(hoge$Normalizer, n=1)             #確認してるだけです

#本番(クラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)

#クラスター番号と発現パターンの対応付け
cls$centers                            #確認してるだけです
conversion <- rep(0, param_clust_num)  #クラスター数の情報をconversionに格納
conversion <- paste("DEG_G", max.col(cls$centers), sep="")#クラスターごとに最大値となる群番号情報を割り当てている
tmp <- apply(cls$centers, 1, max) - apply(cls$centers, 1, min)#代表パターンごとの(max - min)をtmpに格納
obj <- (tmp == min(tmp))               #条件を満たすかどうかを判定した結果をobjに格納(バラツキが最小のパターンをTRUE、それ以外をFALSE)
conversion[obj] <- "nonDEG"            #nonDEGパターンの割り当て
conversion                             #確認してるだけです

pattern <- cls$cluster                 #クラスター番号情報をpatternに格納
for(i in 1:param_clust_num){           #(param_clust_num)回だけループを回す
  pattern[pattern == i] <- conversion[i]#クラスター番号に対応するパターン名の割り当て
}

#混同行列(confusion matrix)の作成
hoge <- param_Ngene*param_PDEG         #トータルのDEG数情報をhogeに格納
DEG_G1_posi <- 1:(hoge*param_DEGassign[1])#G1群で高発現の位置情報
DEG_G2_posi <- (hoge*param_DEGassign[1]+1):(hoge*sum(param_DEGassign[1:2]))#G2群で高発現の位置情報
DEG_G3_posi <- (hoge*sum(param_DEGassign[1:2])+1):hoge#G3群で高発現の位置情報
nonDEG_posi <- (hoge+1):param_Ngene    #non-DEGの位置情報

confusion <- matrix(0, nrow=param_clust_num, ncol=param_clust_num)#プレースホルダの作成
for(i in 1:param_clust_num){           #(param_clust_num)回だけループを回す
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 1] <- sum(cls$cluster[nonDEG_posi] == posi)#nonDEG_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 2] <- sum(cls$cluster[DEG_G1_posi] == posi)#DEG_G1_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 3] <- sum(cls$cluster[DEG_G2_posi] == posi)#DEG_G2_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 4] <- sum(cls$cluster[DEG_G3_posi] == posi)#DEG_G3_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
}
confusion  <- cbind(confusion, rowSums(confusion))#各行の総和情報を付加
confusion  <- rbind(confusion, colSums(confusion))#各列の総和情報を付加
colnames(confusion) <- c(param_narabi, "Total")#列名を付加
rownames(confusion) <- c(param_narabi, "Total")#行名を付加
confusion                              #確認してるだけです

#ファイルに保存(クラスタリング結果)
tmp <- cbind(rownames(data), data, cls$cluster, pattern)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存

#ファイルに保存(混同行列)
tmp <- cbind(rownames(confusion), confusion)#保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存
	

11. サンプルデータ15の10,000 genes×9 samplesのカウントデータ生成から行う場合:

例題10を基本として、nonDEGパターンに割り振られる確率でAUCを計算しています。 AUC値は0.9446149ですね。

out_f1 <- "hoge11.txt"                 #出力ファイル名を指定してout_f1に格納(クラスタリング結果)
out_f2 <- "hoge11_confusion.txt"       #出力ファイル名を指定してout_f2に格納(混同行列ファイル)
param_clust_num <- 4                   #クラスター数を指定
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.3                      #発現変動遺伝子の割合を指定    
param_FC <- c(3, 10, 6)                #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.7, 0.2, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_narabi <- c("nonDEG", "DEG_G1", "DEG_G2", "DEG_G3")#パターン名を指定(並びは変えない)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(MBCluster.Seq)                 #パッケージの読み込み
library(edgeR)                         #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成
data <- tcc$count                      #カウントデータ情報をdataに格納
data.cl <- tcc$group$group             #G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番(TMM正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納
norm.factors <- tcc$norm.factors       #TMM正規化係数をnorm.factorsに格納
#d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
#d <- calcNormFactors(d)               #TMM正規化係数を計算
#norm.factors <- d$samples$norm.factors#TMM正規化係数をnorm.factorsに格納
ef.libsizes <- colSums(data)*norm.factors#総リード数(library sizes)に正規化係数を掛けて得たeffective library sizes情報をef.libsizesに格納
size.factors <- ef.libsizes/mean(ef.libsizes)#effective library sizesを正規化してサイズファクターを得る
size.factors                           #確認してるだけです

#前処理(正規化)

hoge <- RNASeq.Data(data, Normalizer=log(size.factors),#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得
head(hoge$Normalizer, n=1)             #確認してるだけです

#本番(クラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)

#クラスター番号と発現パターンの対応付け
cls$centers                            #確認してるだけです
conversion <- rep(0, param_clust_num)  #クラスター数の情報をconversionに格納
conversion <- paste("DEG_G", max.col(cls$centers), sep="")#クラスターごとに最大値となる群番号情報を割り当てている
tmp <- apply(cls$centers, 1, max) - apply(cls$centers, 1, min)#代表パターンごとの(max - min)をtmpに格納
obj <- (tmp == min(tmp))               #条件を満たすかどうかを判定した結果をobjに格納(バラツキが最小のパターンをTRUE、それ以外をFALSE)
conversion[obj] <- "nonDEG"            #nonDEGパターンの割り当て
conversion                             #確認してるだけです
ranking <- rank(cls$probability[,obj]) #nonDEGのprobabilityでランキングした結果をrankingに格納

pattern <- cls$cluster                 #クラスター番号情報をpatternに格納
for(i in 1:param_clust_num){           #(param_clust_num)回だけループを回す
  pattern[pattern == i] <- conversion[i]#クラスター番号に対応するパターン名の割り当て
}

#混同行列(confusion matrix)の作成
hoge <- param_Ngene*param_PDEG         #トータルのDEG数情報をhogeに格納
DEG_G1_posi <- 1:(hoge*param_DEGassign[1])#G1群で高発現の位置情報
DEG_G2_posi <- (hoge*param_DEGassign[1]+1):(hoge*sum(param_DEGassign[1:2]))#G2群で高発現の位置情報
DEG_G3_posi <- (hoge*sum(param_DEGassign[1:2])+1):hoge#G3群で高発現の位置情報
nonDEG_posi <- (hoge+1):param_Ngene    #non-DEGの位置情報

confusion <- matrix(0, nrow=param_clust_num, ncol=param_clust_num)#プレースホルダの作成
for(i in 1:param_clust_num){           #(param_clust_num)回だけループを回す
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 1] <- sum(cls$cluster[nonDEG_posi] == posi)#nonDEG_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 2] <- sum(cls$cluster[DEG_G1_posi] == posi)#DEG_G1_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 3] <- sum(cls$cluster[DEG_G2_posi] == posi)#DEG_G2_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 4] <- sum(cls$cluster[DEG_G3_posi] == posi)#DEG_G3_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
}
confusion  <- cbind(confusion, rowSums(confusion))#各行の総和情報を付加
confusion  <- rbind(confusion, colSums(confusion))#各列の総和情報を付加
colnames(confusion) <- c(param_narabi, "Total")#列名を付加
rownames(confusion) <- c(param_narabi, "Total")#行名を付加
confusion                              #確認してるだけです

#ファイルに保存(クラスタリング結果)
tmp <- cbind(rownames(data), data, cls$cluster, pattern)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存

#ファイルに保存(混同行列)
tmp <- cbind(rownames(confusion), confusion)#保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存

#AUC値を計算(高いほどよい方法; ただの検証用)
library(ROC)                           #パッケージの読み込み
obj <- as.numeric(tcc$simulation$trueDEG != 0)#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

解析 | クラスタリング | RNA-seq | 遺伝子間(応用) | TCC正規化(Sun_2013)+MBCluster.Seq(Si_2014)

MBCluster.Seqパッケージを用いたやり方を示します。 遺伝子間クラスタリングなのでデータの正規化が重要になってきます。ここでは、 TCCを実行して得られたTCC正規化係数(iDEGES/edgeR正規化を実行して得られたサンプルごとに与える係数) を入力として与えるやり方を示します。正確には、 DESeqパッケージと同じようにsize.factorsに変換してから与えています。 理由は、TCCedgeRパッケージ中で取り扱っている「正規化係数(normalization factors)」は、 「総リード数(library sizes)」を補正するための「係数」という位置づけだからです(正規化係数を掛けたあとのライブラリサイズをeffective library sizesともいう)。 その一方でMBCluster.Seq 中で述べている正規化は、DESeqやDESeq2で使われている。 つまり、TCC正規化係数*総リード数 = effective library sizes、そしてeffective library sizesをさらに正規化したものがsize factorsという関係になります。 2021年5月に精査した結果、RNASeq.Data関数のNormalizerオプションで与える情報は「size factorsそのもの」や「そのlog」ではなく「log2」が正解のようですのでそのように修正しましたm(_ _)m 尚、この場合は結果的にeffective library sizesそのものから算出しても同じなのでそのようにしています。(2021年5月28日追加)

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

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であることが既知です。 このデータは事実上3つのクラスター(G1で高発現のDEGクラスター、G2で高発現のDEGクラスター、non-DEGクラスター)しか存在しない例ですが、 とりあえずクラスター数を4にしています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(800, 500)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_clust_num <- 4                   #クラスター数を指定
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(MBCluster.Seq)                 #パッケージの読み込み
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
norm.factors <- tcc$norm.factors       #TCC正規化係数をnorm.factorsに格納
ef.libsizes <- colSums(data)*norm.factors#総リード数(library sizes)に正規化係数を掛けて得たeffective library sizes情報をef.libsizesに格納
size.factors <- ef.libsizes/mean(ef.libsizes)#effective library sizesを正規化してサイズファクターを得る

#前処理(正規化)
hoge <- RNASeq.Data(data, Normalizer=log(size.factors),#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得

#本番(クラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotHybrid.Tree(merge=tr, cluster=cls$cluster, logFC=hoge$logFC, tree.title=NULL)#描画
dev.off()                              #おまじない
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

1.と基本的に同じですが、遺伝子ごとにparam_clust_numで指定したクラスターのどこに割り振られたかの情報もテキストファイルに保存するやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge2.png"                  #出力ファイル名を指定してout_f1に格納(pngファイル)
out_f2 <- "hoge2.txt"                  #出力ファイル名を指定してout_f2に格納(txtファイル)
param_fig <- c(800, 500)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_clust_num <- 4                   #クラスター数を指定
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(MBCluster.Seq)                 #パッケージの読み込み
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
norm.factors <- tcc$norm.factors       #TCC正規化係数をnorm.factorsに格納
ef.libsizes <- colSums(data)*norm.factors#総リード数(library sizes)に正規化係数を掛けて得たeffective library sizes情報をef.libsizesに格納
size.factors <- ef.libsizes/mean(ef.libsizes)#effective library sizesを正規化してサイズファクターを得る

#前処理(正規化)
hoge <- RNASeq.Data(data, Normalizer=log(size.factors),#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得

#本番(クラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)
table(cls$cluster)                     #各クラスターに属する遺伝子数を表示

#ファイルに保存(pngファイル)
png(out_f1, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotHybrid.Tree(merge=tr, cluster=cls$cluster, logFC=hoge$logFC, tree.title=NULL)#描画
dev.off()                              #おまじない

#ファイルに保存(txtファイル)
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(data), normalized, cls$cluster)#保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f2で指定したファイル名で保存
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

2.と基本的に同じですが、遺伝子ごとにparam_clust_numで指定したクラスターのどこに割り振られたかの情報をテキストファイルに保存する際に、 クラスターでソートするやり方です。 このデータは、gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知なので、 「G1群で高発現DEGだとわかっているもの(gene_1〜gene_1800)がどのパターンに割り振られたか、gene_1801〜gene_2000がどのパターンに割り振られたか、 も表示させています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge3.png"                  #出力ファイル名を指定してout_f1に格納(pngファイル)
out_f2 <- "hoge3.txt"                  #出力ファイル名を指定してout_f2に格納(txtファイル)
param_fig <- c(800, 500)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_clust_num <- 4                   #クラスター数を指定
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(MBCluster.Seq)                 #パッケージの読み込み
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
norm.factors <- tcc$norm.factors       #TCC正規化係数をnorm.factorsに格納
ef.libsizes <- colSums(data)*norm.factors#総リード数(library sizes)に正規化係数を掛けて得たeffective library sizes情報をef.libsizesに格納
size.factors <- ef.libsizes/mean(ef.libsizes)#effective library sizesを正規化してサイズファクターを得る

#前処理(正規化)
hoge <- RNASeq.Data(data, Normalizer=log(size.factors),#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得

#本番(クラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)
table(cls$cluster)                     #各クラスターに属する遺伝子数を表示
table(cls$cluster[1:1800])             #G1群で高発現DEGだとわかっているもの(gene_1〜gene_1800)に絞って表示
table(cls$cluster[1801:2000])          #G2群で高発現DEGだとわかっているもの(gene_1801〜gene_2000)に絞って表示
table(cls$cluster[2001:10000])         #non-DEGだとわかっているもの(gene_2001〜gene_10000)に絞って表示

#ファイルに保存(pngファイル)
png(out_f1, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotHybrid.Tree(merge=tr, cluster=cls$cluster, logFC=hoge$logFC, tree.title=NULL)#描画
dev.off()                              #おまじない

#ファイルに保存(txtファイル)
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(data), normalized, cls$cluster)#保存したい情報をtmpに格納
tmp <- tmp[order(cls$cluster),]        #クラスター番号順にソートした結果をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f2で指定したファイル名で保存
	

4. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

Blekhman et al., Genome Res., 2010の20,689 genes×18 samplesのカウントデータ。 ヒトのメス3サンプル(HSF1-3)とオス3サンプル(HSM1-3), チンパンジーのメス3サンプル(PTF1-3)とオス3サンプル(PTM1-3), アカゲザルのメス3サンプル(RMF1-3)とオス3サンプル(RMM1-3)の並びになっています。 入力ファイル以外は、3.と基本的に同じ。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge4.png"                  #出力ファイル名を指定してout_f1に格納(pngファイル)
out_f2 <- "hoge4.txt"                  #出力ファイル名を指定してout_f2に格納(txtファイル)
param_fig <- c(800, 500)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_clust_num <- 5                   #クラスター数を指定
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(MBCluster.Seq)                 #パッケージの読み込み
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
norm.factors <- tcc$norm.factors       #TCC正規化係数をnorm.factorsに格納
ef.libsizes <- colSums(data)*norm.factors#総リード数(library sizes)に正規化係数を掛けて得たeffective library sizes情報をef.libsizesに格納
size.factors <- ef.libsizes/mean(ef.libsizes)#effective library sizesを正規化してサイズファクターを得る

#前処理(正規化)
hoge <- RNASeq.Data(data, Normalizer=log(size.factors),#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得

#本番(クラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)
table(cls$cluster)                     #各クラスターに属する遺伝子数を表示

#ファイルに保存(pngファイル)
png(out_f1, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotHybrid.Tree(merge=tr, cluster=cls$cluster, logFC=hoge$logFC, tree.title=NULL)#描画
dev.off()                              #おまじない

#ファイルに保存(txtファイル)
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(data), normalized, cls$cluster)#保存したい情報をtmpに格納
tmp <- tmp[order(cls$cluster),]        #クラスター番号順にソートした結果をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f2で指定したファイル名で保存
	

5. サンプルデータ15の10,000 genes×9 samplesのカウントデータ生成から行う場合:

サンプルデータ15のシミュレーションデータ作成から行うやり方です。 混同行列(confusion matrix)情報のファイルも出力しています。

out_f1 <- "hoge5.txt"                  #出力ファイル名を指定してout_f1に格納(クラスタリング結果)
out_f2 <- "hoge5_confusion.txt"        #出力ファイル名を指定してout_f2に格納(混同行列ファイル)
param_clust_num <- 4                   #クラスター数を指定
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.3                      #発現変動遺伝子の割合を指定    
param_FC <- c(3, 10, 6)                #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.7, 0.2, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_narabi <- c("nonDEG", "DEG_G1", "DEG_G2", "DEG_G3")#パターン名を指定(並びは変えない)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(MBCluster.Seq)                 #パッケージの読み込み
library(edgeR)                         #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成
data <- tcc$count                      #カウントデータ情報をdataに格納
data.cl <- tcc$group$group             #G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
norm.factors <- tcc$norm.factors       #正規化係数をnorm.factorsに格納
ef.libsizes <- colSums(data)*norm.factors#総リード数(library sizes)に正規化係数を掛けて得たeffective library sizes情報をef.libsizesに格納
size.factors <- ef.libsizes/mean(ef.libsizes)#effective library sizesを正規化してサイズファクターを得る
size.factors                           #確認してるだけです

#前処理(正規化)
hoge <- RNASeq.Data(data, Normalizer=log(size.factors),#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得
head(hoge$Normalizer, n=1)             #確認してるだけです

#本番(クラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)

#クラスター番号と既知パターンの対応付け
hoge <- param_Ngene*param_PDEG         #トータルのDEG数情報をhogeに格納
DEG_G1_posi <- 1:(hoge*param_DEGassign[1])#G1群で高発現の位置情報
DEG_G2_posi <- (hoge*param_DEGassign[1]+1):(hoge*sum(param_DEGassign[1:2]))#G2群で高発現の位置情報
DEG_G3_posi <- (hoge*sum(param_DEGassign[1:2])+1):hoge#G3群で高発現の位置情報
nonDEG_posi <- (hoge+1):param_Ngene    #non-DEGの位置情報

conversion <- 1:param_clust_num        #クラスター数の情報をconversionに格納
names(conversion) <- 1:param_clust_num #names属性を付加
pattern <- cls$cluster                 #クラスター番号情報をpatternに格納

hoge <- table(cls$cluster[nonDEG_posi])#nonDEG群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[1]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[1] #当該クラスター番号への既知パターン情報の割り当て

hoge <- table(cls$cluster[DEG_G1_posi])#G1群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[2]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[2] #当該クラスター番号への既知パターン情報の割り当て

hoge <- table(cls$cluster[DEG_G2_posi])#G2群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[3]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[3] #当該クラスター番号への既知パターン情報の割り当て

hoge <- table(cls$cluster[DEG_G3_posi])#G3群で高発現のものが割り当てられたクラスター番号情報の取得
cls_num <- as.integer(names(hoge)[hoge == max(hoge)])#最も多く割り当てられたクラスター番号情報の取得
pattern[pattern == cls_num] <- param_narabi[4]#当該クラスター番号の遺伝子への既知パターン情報の割り当て
conversion[cls_num] <- param_narabi[4] #当該クラスター番号への既知パターン情報の割り当て

#混同行列(confusion matrix)の作成
confusion <- matrix(0, nrow=param_clust_num, ncol=param_clust_num)#プレースホルダの作成
for(i in 1:param_clust_num){           #(param_clust_num)回だけループを回す
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 1] <- sum(cls$cluster[nonDEG_posi] == posi)#nonDEG_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 2] <- sum(cls$cluster[DEG_G1_posi] == posi)#DEG_G1_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 3] <- sum(cls$cluster[DEG_G2_posi] == posi)#DEG_G2_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
  posi <- which(conversion == param_narabi[i])#param_narabi[i]のパターン名に対応するクラスター番号情報の取得
  confusion[i, 4] <- sum(cls$cluster[DEG_G3_posi] == posi)#DEG_G3_posi内のクラスター番号群の中でposiと一致する遺伝子数をカウント
}
confusion  <- cbind(confusion, rowSums(confusion))#各行の総和情報を付加
confusion  <- rbind(confusion, colSums(confusion))#各列の総和情報を付加
colnames(confusion) <- c(param_narabi, "Total")#列名を付加
rownames(confusion) <- c(param_narabi, "Total")#行名を付加
confusion                              #確認してるだけです

#ファイルに保存(クラスタリング結果)
tmp <- cbind(rownames(data), data, cls$cluster, pattern)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存

#ファイルに保存(混同行列)
tmp <- cbind(rownames(confusion), confusion)#保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存
	

解析 | クラスタリング | scRNA-seq | について

single-cell RNA-seq (scRNA-seq)データ用です。scRNA-toolsはscRNA-seqデータ解析全般のツールのデータベースですが、 この中にクラスタリングプログラムも含まれています。(scRNA-seqとの対比として)昔ながらのbulk RNA-seqでは、どのサンプルがどの群に属するかが既知なので 群間で発現が異なる遺伝子(Differentially Expressed Genes; DEG)の検出がcommon taskでした。しかしscRNA-seqでは、通常どのサンプルがどの群に属するかが不明なので、 探索的な解析(Exploratory Analysis)が中心となります。つまりクラスタリングが重要だということです。そのため、多くのscRNA-seq用のクラスタリングプログラムは どのサンプルがどの群に属するかを割り当てることにフォーカスしています(Zappia et al., Genome Biol., 2017)。 このやり方はサンプルが細胞の状態が変化しない成熟細胞(mature cells)の場合に有効です。しかし発生段階(developmental stages)では、幹細胞(stem cells)が成熟細胞へと分化します。 よって、特定の群への割り当てというのは適切ではなく、ある細胞(one cell type)が別の種類の細胞へと連続的に変化していく軌跡(continuous trajectory)を並べる(ordering)ようなプログラムを利用する必要があります。 bulk RNA-seqでも経時変化に特化したものと通常のクラスタリングに分けられるようなものだと思えば納得しやすいでしょう。 また、クラスタリングの際に重要なのは、効果的な次元削減(dimensionality reduction)です。例えば、主成分分析(PCA)だと数万遺伝子(つまり数万次元)のデータを2次元や3次元に削減した状態でデータを表示させています。 このPCA (Rのprcomp関数を実行することと同じ)もまた、次元削減法の1つと捉えることができます。scRNA-seqデータに特化させたのが、t-SNE, ZIFA, CIDRのような以下にリストアップされているものたちです。 UMAPやSPRINGは、いずれもForceAtlas2というforce-directed layout algorithmを採用しているようです(Luecken and Theis, Mol Syst Biol., 2019のpage 9の右下)。

クラスタリングのアプローチには、K-meansのような通常のクラスタリングアルゴリズムの他に、community detection methodsというものもあります。 これは、各細胞(each cell)を「K個の最も類似度の高い細胞(K most similar cells)」とのみ連結させてグラフを描くK-Nearest Neighbour approach (KNN graph) であるため、他の全細胞との類似度を保持する通常の方法に比べて高速です(Luecken and Theis, Mol Syst Biol., 2019のpage 11の右下)。 PhenoGraphなどがこれに属します。 ScanpyやSeuratもLouvain algorithm on single-cell KNN graphsがデフォルトのクラスタリング法として実行されるようなので(Luecken and Theis, Mol Syst Biol., 2019のpage 12の左)、 これらもcommunity detection系ということでよいのだろうと思います。 「Louvainアルゴリズム」でググると、scRNA-seqそのものずばりではありませんが、一般的な説明があります。 感覚的には、偶然に近いものとして連結されるグループの期待値よりも多く連結されるグループを「コミュニティ(community)」として同定するものです。 KNNグラフの中から密に連結される部分グラフを探すアルゴリズム、と理解してもよいと思います。 このあたりではmodularity optimizationという用語が出てきますが、感覚的にはsignal-to-noize ratio (S/N比)が高いみたいなイメージで、 「グループ間の連結度合いは少なく、グループ内の連結度合いが高いものがよい」みたいな理解でよいと思います。

trajectory系については、全てのタイプのtrajectoriesに対しても有用な方法というのはないが(Luecken and Theis, Mol Syst Biol., 2019のpage 16の左上)、 分枝が多くないシンプルなモデルの場合にはslingshotがよく、 より複雑なモデルの場合はPAGAがよいという報告(Saelens et al., Nat Biotechnol., 2019)があります。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | クラスタリング | scRNA-seq | サンプル間 | PHATE(Moon_2019)

PHATEのR版であるphateRパッケージを用いて サンプル間クラスタリング(次元削減と可視化;dimensionality reduction and visualization)を行うやり方を示します。 手順は開発者らが提供しているマウス骨髄のscRNA-seqデータのチュートリアル に従っています。このチュートリアルでは「10 cells以上で発現している遺伝子」や 「総UMIカウント数が1000 よりも大きい細胞」のフィルタリングを行っていますが、下記の例題で用いる細胞数に応じて適宜変更しています。 例題1-3の実行結果は毎回変わります

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。 ここでは6細胞(6 cells)のデータとみなして考えます。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 3.5                      #プロットの大きさを指定(通常の3.5倍)

#必要なパッケージをロード
library(phateR)                        #パッケージの読み込み
library(ggplot2)                       #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(phateR)
out <- phate(data)                     #クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=PHATE1, y=PHATE2), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

例題1と基本的に同じですが、どの細胞がどの群に属するかという既知のサンプルラベル情報を与えて色分けしています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 3.5                      #プロットの大きさを指定(通常の3.5倍)

#必要なパッケージをロード
library(phateR)                        #パッケージの読み込み
library(ggplot2)                       #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(phateR)
out <- phate(data)                     #クラスタリング実行結果をoutに格納

#ファイルに保存
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=PHATE1, y=PHATE2, color=as.factor(data.cl)), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

例題2では既知のグループラベル情報を与えましたが、cluster_phate関数を用いたKmeans clusteringを独立して行うことで、実際にグループ化した結果で色分けするやり方です。 ここでは、クラスター数k = 2としています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 3.5                      #プロットの大きさを指定(通常の3.5倍)
param_kmeans <- 2                      #Kmeans clustering実行時のクラスター数kを指定

#必要なパッケージをロード
library(phateR)                        #パッケージの読み込み
library(ggplot2)                       #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(phateR)
out <- phate(data)                     #クラスタリング実行結果をoutに格納

#後処理(グループ化)
grouped <- cluster_phate(out, k=param_kmeans)#Kmeans clustering実行結果をgroupedに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=PHATE1, y=PHATE2, color=as.factor(grouped)), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

4. サンプルデータ51の714 genes×58 samplesのカウントデータ(sample51.txt)の場合:

MLSeqパッケージから提供されている cervical.txtという名前のカウントデータと同じものです。データの原著論文は、Witten et al., 2010です。 子宮頸がん患者29例の正常組織と癌組織のペアサンプルであり、714のmicroRNA (714 miRNAs)の発現を調べたデータです。 (行名情報の列を除く)最初の29列分が正常サンプル(N1, N2, ..., N29)、残りの29列分が癌サンプル(T1, T2, ..., T29)のデータです。 例題2とは入力ファイルが異なる以外は基本的に同じです。どの細胞がどの群に属するかという既知のサンプルラベル情報を与えて色分けしています。

in_f <- "sample51.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 29                         #G1群のサンプル数を指定
param_G2 <- 29                         #G2群のサンプル数を指定
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 1.8                      #プロットの大きさを指定(通常の1.8倍)

#必要なパッケージをロード
library(phateR)                        #パッケージの読み込み
library(ggplot2)                       #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示
data.cl <- data.cl[obj]                #条件を満たす要素のみフィルタリング

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(phateR)
out <- phate(data)                     #クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=PHATE1, y=PHATE2, color=as.factor(data.cl)), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

5. サンプルデータ51の714 genes×58 samplesのカウントデータ(sample51.txt)の場合:

MLSeqパッケージから提供されている cervical.txtという名前のカウントデータと同じものです。データの原著論文は、Witten et al., 2010です。 子宮頸がん患者29例の正常組織と癌組織のペアサンプルであり、714のmicroRNA (714 miRNAs)の発現を調べたデータです。 (行名情報の列を除く)最初の29列分が正常サンプル(N1, N2, ..., N29)、残りの29列分が癌サンプル(T1, T2, ..., T29)のデータです。 例題3とは入力ファイルが異なる以外は基本的に同じです。 例題4では既知のグループラベル情報を与えましたが、cluster_phate関数を用いたKmeans clusteringを独立して行うことで、実際にグループ化した結果で色分けするやり方です。 ここでは、クラスター数k = 2としています。

in_f <- "sample51.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 1.8                      #プロットの大きさを指定(通常の1.8倍)
param_kmeans <- 2                      #Kmeans clustering実行時のクラスター数kを指定

#必要なパッケージをロード
library(phateR)                        #パッケージの読み込み
library(ggplot2)                       #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(phateR)
out <- phate(data)                     #クラスタリング実行結果をoutに格納

#後処理(グループ化)
grouped <- cluster_phate(out, k=param_kmeans)#Kmeans clustering実行結果をgroupedに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=PHATE1, y=PHATE2, color=as.factor(grouped)), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

解析 | クラスタリング | scRNA-seq | サンプル間 | umap(Becht_2018)

umapパッケージを用いて サンプル間クラスタリング(次元削減と可視化;dimensionality reduction and visualization)を行うやり方を示します。 手順は開発者らが提供しているマウス骨髄のscRNA-seqデータのチュートリアル に従っています。このチュートリアルでは「10 cells以上で発現している遺伝子」や 「総UMIカウント数が1000 よりも大きい細胞」のフィルタリングを行っていますが、下記の例題で用いる細胞数に応じて適宜変更しています。 現状ではサンプル数の少なさに起因する「エラー: umap: number of neighbors must be smaller than number of items」というエラーメッセージに遭遇します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

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であることが既知です。 ここでは6細胞(6 cells)のデータとみなして考えます。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 3.5                      #プロットの大きさを指定(通常の3.5倍)
param_knn <- 3                         #k-nearest neighbors数を指定(3個)

#必要なパッケージをロード
library(umap)                          #パッケージの読み込み
library(ggplot2)                       #パッケージの読み込み
library(phateR)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(umap)
tmp <- umap.defaults                   #デフォルトパラメータ情報をtmpに格納
tmp$n_neighbors <- param_knn           #n_neighborsのところにparam_knnの値を格納
out <- as.data.frame(umap(data, config=tmp)$layout)#クラスタリング実行結果をoutに格納
colnames(out) <- c("UMAP1", "UMAP2")   #列名を変更

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=UMAP1, y=UMAP2), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

例題1と基本的に同じですが、どの細胞がどの群に属するかという既知のサンプルラベル情報を与えて色分けしています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 3.5                      #プロットの大きさを指定(通常の3.5倍)
param_knn <- 3                         #k-nearest neighbors数を指定(3個)

#必要なパッケージをロード
library(umap)                          #パッケージの読み込み
library(ggplot2)                       #パッケージの読み込み
library(phateR)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(umap)
tmp <- umap.defaults                   #デフォルトパラメータ情報をtmpに格納
tmp$n_neighbors <- param_knn           #n_neighborsのところにparam_knnの値を格納
out <- as.data.frame(umap(data, config=tmp)$layout)#クラスタリング実行結果をoutに格納
colnames(out) <- c("UMAP1", "UMAP2")   #列名を変更

#ファイルに保存
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=UMAP1, y=UMAP2), color=as.factor(data.cl), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

例題2では既知のグループラベル情報を与えましたが、kmeans関数を用いたKmeans clusteringを独立して行うことで、実際にグループ化した結果で色分けするやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 3.5                      #プロットの大きさを指定(通常の3.5倍)
param_kmeans <- 2                      #Kmeans clustering実行時のクラスター数kを指定
param_knn <- 3                         #k-nearest neighbors数を指定(3個)

#必要なパッケージをロード
library(umap)                          #パッケージの読み込み
library(cclust)                        #パッケージの読み込み
library(ggplot2)                       #パッケージの読み込み
library(phateR)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(umap)
tmp <- umap.defaults                   #デフォルトパラメータ情報をtmpに格納
tmp$n_neighbors <- param_knn           #n_neighborsのところにparam_knnの値を格納
out <- as.data.frame(umap(data, config=tmp)$layout)#クラスタリング実行結果をoutに格納
colnames(out) <- c("UMAP1", "UMAP2")   #列名を変更

#後処理(グループ化)
#grouped <- cclust(x=data, centers=param_kmeans,#Kmeans clustering実行結果をgroupedに格納
#              iter.max=100, verbose=T, method="kmeans")#Kmeans clustering実行結果をgroupedに格納
grouped <- kmeans(x=data, centers=param_kmeans, nstart=100)#Kmeans clustering実行結果をgroupedに格納


#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=UMAP1, y=UMAP2), color=as.factor(grouped$cluster), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

4. サンプルデータ51の714 genes×58 samplesのカウントデータ(sample51.txt)の場合:

MLSeqパッケージから提供されている cervical.txtという名前のカウントデータと同じものです。データの原著論文は、Witten et al., 2010です。 子宮頸がん患者29例の正常組織と癌組織のペアサンプルであり、714のmicroRNA (714 miRNAs)の発現を調べたデータです。 (行名情報の列を除く)最初の29列分が正常サンプル(N1, N2, ..., N29)、残りの29列分が癌サンプル(T1, T2, ..., T29)のデータです。 例題2とは入力ファイルが異なる以外は基本的に同じですが、サンプル数がそれなりにあるのでparam_knnをなくしてデフォルトにしています。どの細胞がどの群に属するかという既知のサンプルラベル情報を与えて色分けしています。

in_f <- "sample51.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 29                         #G1群のサンプル数を指定
param_G2 <- 29                         #G2群のサンプル数を指定
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 1.8                      #プロットの大きさを指定(通常の1.8倍)

#必要なパッケージをロード
library(umap)                          #パッケージの読み込み
library(ggplot2)                       #パッケージの読み込み
library(phateR)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示
data.cl <- data.cl[obj]                #条件を満たす要素のみフィルタリング

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(umap)
out <- as.data.frame(umap(data)$layout)#クラスタリング実行結果をoutに格納
colnames(out) <- c("UMAP1", "UMAP2")   #列名を変更

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=UMAP1, y=UMAP2), color=as.factor(data.cl), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

5. サンプルデータ51の714 genes×58 samplesのカウントデータ(sample51.txt)の場合:

MLSeqパッケージから提供されている cervical.txtという名前のカウントデータと同じものです。データの原著論文は、Witten et al., 2010です。 子宮頸がん患者29例の正常組織と癌組織のペアサンプルであり、714のmicroRNA (714 miRNAs)の発現を調べたデータです。 (行名情報の列を除く)最初の29列分が正常サンプル(N1, N2, ..., N29)、残りの29列分が癌サンプル(T1, T2, ..., T29)のデータです。 例題3とは入力ファイルが異なる以外は基本的に同じですが、サンプル数がそれなりにあるのでparam_knnをなくしてデフォルトにしています。 kmeans関数を用いたKmeans clusteringを独立して行うことで、実際にグループ化した結果で色分けするやり方です。

in_f <- "sample51.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 1.8                      #プロットの大きさを指定(通常の1.8倍)
param_kmeans <- 2                      #Kmeans clustering実行時のクラスター数kを指定

#必要なパッケージをロード
library(umap)                          #パッケージの読み込み
library(cclust)                        #パッケージの読み込み
library(ggplot2)                       #パッケージの読み込み
library(phateR)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(umap)
out <- as.data.frame(umap(data)$layout)#クラスタリング実行結果をoutに格納
colnames(out) <- c("UMAP1", "UMAP2")   #列名を変更

#後処理(グループ化)
#grouped <- cclust(x=data, centers=param_kmeans,#Kmeans clustering実行結果をgroupedに格納
#              iter.max=100, verbose=T, method="kmeans")#Kmeans clustering実行結果をgroupedに格納
grouped <- kmeans(x=data, centers=param_kmeans, nstart=100)#Kmeans clustering実行結果をgroupedに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=UMAP1, y=UMAP2), color=as.factor(grouped$cluster), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

解析 | クラスタリング | scRNA-seq | サンプル間 | t-SNE(van der Maaten_2008)

Rtsneパッケージを用いて サンプル間クラスタリング(t分布型確率的近傍埋め込み法;t-Distributed Stochastic Neighbor Embedding; t-SNE;van der Maaten and Hintonm, 2008)を行うやり方を示します。 手順は開発者らが提供しているマウス骨髄のscRNA-seqデータのチュートリアル に従っています。このチュートリアルでは「10 cells以上で発現している遺伝子」や 「総UMIカウント数が1000 よりも大きい細胞」のフィルタリングを行っていますが、下記の例題で用いる細胞数に応じて適宜変更しています。 param_perplexityのところでは、perplexityというパラメータ(デフォルトは30)を指定します。 「should not be bigger than 3 * perplexity < nrow(X)- 1」と書かれており、 例題1-3のような細胞数(=6)が非常に少ないデータの場合は3*perplexity < 6 - 1となるので、perplexity = 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であることが既知です。 ここでは6細胞(6 cells)のデータとみなして考えます。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 3.5                      #プロットの大きさを指定(通常の3.5倍)
param_perplexity <- 1                  #t-SNE実行時のperplexityを指定(デフォルトは30)

#必要なパッケージをロード
library(ggplot2)                       #パッケージの読み込み
library(Rtsne)                         #パッケージの読み込み
library(phateR)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(t-SNE)
out <- as.data.frame(Rtsne(data, perplexity=param_perplexity)$Y)   #クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=V1, y=V2), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

例題1と基本的に同じですが、どの細胞がどの群に属するかという既知のサンプルラベル情報を与えて色分けしています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 3.5                      #プロットの大きさを指定(通常の3.5倍)
param_perplexity <- 1                  #t-SNE実行時のperplexityを指定(デフォルトは30)

#必要なパッケージをロード
library(ggplot2)                       #パッケージの読み込み
library(Rtsne)                         #パッケージの読み込み
library(phateR)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(t-SNE)
out <- as.data.frame(Rtsne(data, perplexity=param_perplexity)$Y)   #クラスタリング実行結果をoutに格納

#ファイルに保存
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=V1, y=V2, color=as.factor(data.cl)), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

例題2では既知のグループラベル情報を与えましたが、kmeans関数を用いたKmeans clusteringを独立して行うことで、実際にグループ化した結果で色分けするやり方です。 ここでは、クラスター数k = 2としています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 3.5                      #プロットの大きさを指定(通常の3.5倍)
param_kmeans <- 2                      #Kmeans clustering実行時のクラスター数kを指定
param_perplexity <- 1                  #t-SNE実行時のperplexityを指定(デフォルトは30)

#必要なパッケージをロード
library(cclust)                        #パッケージの読み込み
library(ggplot2)                       #パッケージの読み込み
library(Rtsne)                         #パッケージの読み込み
library(phateR)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(t-SNE)
out <- as.data.frame(Rtsne(data, perplexity=param_perplexity)$Y)   #クラスタリング実行結果をoutに格納

#後処理(グループ化)
#grouped <- cclust(x=data, centers=param_kmeans,#Kmeans clustering実行結果をgroupedに格納
#              iter.max=100, verbose=T, method="kmeans")#Kmeans clustering実行結果をgroupedに格納
grouped <- kmeans(x=data, centers=param_kmeans, nstart=100)#Kmeans clustering実行結果をgroupedに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=V1, y=V2, color=as.factor(grouped$cluster)), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

4. サンプルデータ51の714 genes×58 samplesのカウントデータ(sample51.txt)の場合:

MLSeqパッケージから提供されている cervical.txtという名前のカウントデータと同じものです。データの原著論文は、Witten et al., 2010です。 子宮頸がん患者29例の正常組織と癌組織のペアサンプルであり、714のmicroRNA (714 miRNAs)の発現を調べたデータです。 (行名情報の列を除く)最初の29列分が正常サンプル(N1, N2, ..., N29)、残りの29列分が癌サンプル(T1, T2, ..., T29)のデータです。 例題2とは入力ファイルが異なる以外は基本的に同じですが、サンプル数がそれなりにあるのでparam_perplexityを18にしています。 どの細胞がどの群に属するかという既知のサンプルラベル情報を与えて色分けしています。

in_f <- "sample51.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 29                         #G1群のサンプル数を指定
param_G2 <- 29                         #G2群のサンプル数を指定
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 1.8                      #プロットの大きさを指定(通常の1.8倍)
param_perplexity <- 18                 #t-SNE実行時のperplexityを指定(デフォルトは30)

#必要なパッケージをロード
library(ggplot2)                       #パッケージの読み込み
library(Rtsne)                         #パッケージの読み込み
library(phateR)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示
data.cl <- data.cl[obj]                #条件を満たす要素のみフィルタリング

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(t-SNE)
out <- as.data.frame(Rtsne(data, perplexity=param_perplexity)$Y)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=V1, y=V2, color=as.factor(data.cl)), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

5. サンプルデータ51の714 genes×58 samplesのカウントデータ(sample51.txt)の場合:

MLSeqパッケージから提供されている cervical.txtという名前のカウントデータと同じものです。データの原著論文は、Witten et al., 2010です。 子宮頸がん患者29例の正常組織と癌組織のペアサンプルであり、714のmicroRNA (714 miRNAs)の発現を調べたデータです。 (行名情報の列を除く)最初の29列分が正常サンプル(N1, N2, ..., N29)、残りの29列分が癌サンプル(T1, T2, ..., T29)のデータです。 例題3とは入力ファイルが異なる以外は基本的に同じですが、サンプル数がそれなりにあるのでparam_perplexityを18にしています。 kmeans関数を用いたKmeans clusteringを独立して行うことで、実際にグループ化した結果で色分けするやり方です。 ここでは、クラスター数k = 2としています。

in_f <- "sample51.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 1.8                      #プロットの大きさを指定(通常の1.8倍)
param_kmeans <- 2                      #Kmeans clustering実行時のクラスター数kを指定
param_perplexity <- 18                 #t-SNE実行時のperplexityを指定(デフォルトは30)

#必要なパッケージをロード
library(cclust)                        #パッケージの読み込み
library(ggplot2)                       #パッケージの読み込み
library(Rtsne)                         #パッケージの読み込み
library(phateR)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(t-SNE)
out <- as.data.frame(Rtsne(data, perplexity=param_perplexity)$Y)#クラスタリング実行結果をoutに格納

#後処理(グループ化)
#grouped <- cclust(x=data, centers=param_kmeans,#Kmeans clustering実行結果をgroupedに格納
#              iter.max=100, verbose=T, method="kmeans")#Kmeans clustering実行結果をgroupedに格納
grouped <- kmeans(x=data, centers=param_kmeans, nstart=100)#Kmeans clustering実行結果をgroupedに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=V1, y=V2, color=as.factor(grouped$cluster)), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

解析 | クラスタリング | scRNA-seq | サンプル間 | 主成分分析(PCA)

statsパッケージのprcomp関数を用いて サンプル間クラスタリング(主成分分析;Principal Component Analysis; PCA)を行うやり方を示します。 手順は開発者らが提供しているマウス骨髄のscRNA-seqデータのチュートリアル に従っています。このチュートリアルでは「10 cells以上で発現している遺伝子」や 「総UMIカウント数が1000 よりも大きい細胞」のフィルタリングを行っていますが、下記の例題で用いる細胞数に応じて適宜変更しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

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であることが既知です。 ここでは6細胞(6 cells)のデータとみなして考えます。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 3.5                      #プロットの大きさを指定(通常の3.5倍)

#必要なパッケージをロード
library(ggplot2)                       #パッケージの読み込み
library(phateR)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(PCA)
out <- as.data.frame(prcomp(data)$x)   #クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=PC1, y=PC2), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

例題1と基本的に同じですが、どの細胞がどの群に属するかという既知のサンプルラベル情報を与えて色分けしています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 3.5                      #プロットの大きさを指定(通常の3.5倍)

#必要なパッケージをロード
library(ggplot2)                       #パッケージの読み込み
library(phateR)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(PCA)
out <- as.data.frame(prcomp(data)$x)   #クラスタリング実行結果をoutに格納

#ファイルに保存
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=PC1, y=PC2, color=as.factor(data.cl)), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

例題2では既知のグループラベル情報を与えましたが、kmeans関数を用いたKmeans clusteringを独立して行うことで、実際にグループ化した結果で色分けするやり方です。 ここでは、クラスター数k = 2としています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 3.5                      #プロットの大きさを指定(通常の3.5倍)
param_kmeans <- 2                      #Kmeans clustering実行時のクラスター数kを指定

#必要なパッケージをロード
library(cclust)                        #パッケージの読み込み
library(ggplot2)                       #パッケージの読み込み
library(phateR)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(PCA)
out <- as.data.frame(prcomp(data)$x)   #クラスタリング実行結果をoutに格納

#後処理(グループ化)
#grouped <- cclust(x=data, centers=param_kmeans,#Kmeans clustering実行結果をgroupedに格納
#              iter.max=100, verbose=T, method="kmeans")#Kmeans clustering実行結果をgroupedに格納
grouped <- kmeans(x=data, centers=param_kmeans, nstart=100)#Kmeans clustering実行結果をgroupedに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=PC1, y=PC2, color=as.factor(grouped$cluster)), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

4. サンプルデータ51の714 genes×58 samplesのカウントデータ(sample51.txt)の場合:

MLSeqパッケージから提供されている cervical.txtという名前のカウントデータと同じものです。データの原著論文は、Witten et al., 2010です。 子宮頸がん患者29例の正常組織と癌組織のペアサンプルであり、714のmicroRNA (714 miRNAs)の発現を調べたデータです。 (行名情報の列を除く)最初の29列分が正常サンプル(N1, N2, ..., N29)、残りの29列分が癌サンプル(T1, T2, ..., T29)のデータです。 例題2とは入力ファイルが異なる以外は基本的に同じです。どの細胞がどの群に属するかという既知のサンプルラベル情報を与えて色分けしています。

in_f <- "sample51.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 29                         #G1群のサンプル数を指定
param_G2 <- 29                         #G2群のサンプル数を指定
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 1.8                      #プロットの大きさを指定(通常の1.8倍)

#必要なパッケージをロード
library(ggplot2)                       #パッケージの読み込み
library(phateR)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示
data.cl <- data.cl[obj]                #条件を満たす要素のみフィルタリング

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(PCA)
out <- as.data.frame(prcomp(data)$x)   #クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=PC1, y=PC2, color=as.factor(data.cl)), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

5. サンプルデータ51の714 genes×58 samplesのカウントデータ(sample51.txt)の場合:

MLSeqパッケージから提供されている cervical.txtという名前のカウントデータと同じものです。データの原著論文は、Witten et al., 2010です。 子宮頸がん患者29例の正常組織と癌組織のペアサンプルであり、714のmicroRNA (714 miRNAs)の発現を調べたデータです。 (行名情報の列を除く)最初の29列分が正常サンプル(N1, N2, ..., N29)、残りの29列分が癌サンプル(T1, T2, ..., T29)のデータです。 例題3とは入力ファイルが異なる以外は基本的に同じです。kmeans関数を用いたKmeans clusteringを独立して行うことで、実際にグループ化した結果で色分けするやり方です。 ここでは、クラスター数k = 2としています。

in_f <- "sample51.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_cell <- 3                        #細胞数の閾値を指定(3 cells以上で発現している遺伝子のみ利用)
param_count <- 1000                    #総カウント数の閾値を指定(1000以上ある細胞のみ利用)
param_size <- 1.8                      #プロットの大きさを指定(通常の1.8倍)
param_kmeans <- 2                      #Kmeans clustering実行時のクラスター数kを指定

#必要なパッケージをロード
library(cclust)                        #パッケージの読み込み
library(ggplot2)                       #パッケージの読み込み
library(phateR)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(行列の転置、低発現遺伝子や総カウント数の少ない細胞ののフィルタリング)
data <- t(data)                        #行列の転置
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- colSums(data > 0) > param_cell  #まず(data > 0)で0より大きい要素をTRUEとして論理値行列化し、遺伝子ごとにTRUEの要素数を数え上げ、それがparam_cellより大きいかどうかを判定した結果objに格納
data <- data[, obj]                    #条件を満たす列のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

obj <- rowSums(data) > param_count     #細胞(行)ごとに、総カウント数がparam_countより大きいかどうかを判定した結果objに格納
data <- data[obj, ]                    #条件を満たす行のみフィルタリング
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(データの正規化など)
data <- library.size.normalize(data)   #正規化(細胞ごとの総カウント数をmedianに揃えている)
data <- sqrt(data)                     #平方根

#本番(PCA)
out <- as.data.frame(prcomp(data)$x)   #クラスタリング実行結果をoutに格納

#後処理(グループ化)
#grouped <- cclust(x=data, centers=param_kmeans,#Kmeans clustering実行結果をgroupedに格納
#              iter.max=100, verbose=T, method="kmeans")#Kmeans clustering実行結果をgroupedに格納
grouped <- kmeans(x=data, centers=param_kmeans, nstart=100)#Kmeans clustering実行結果をgroupedに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
ggplot(out) +                          #ggplotで視覚化
    geom_point(aes(x=PC1, y=PC2, color=as.factor(grouped$cluster)), size=param_size)#ggplotで視覚化
dev.off()                              #おまじない
	

解析 | クラスタリング | scRNA-seq | 参照情報あり | について

scRNA-seqは探索的な解析(Exploratory Analysis)が中心です。 「解析 | クラスタリング | scRNA-seq | について」では手元のデータのみを用いてクラスタリングを行うプログラムをリストアップしていますが、 情報の蓄積により、このサンプルの発現プロファイルは「既知のこのクラスター(or cell type or cell identify)に近い」といった外部の情報を使って評価することもできます。 この外部の参照(refer)できる情報を利用して、手元にあるデータのサンプルのアノテーション(既知クラスター情報の注釈付けを行うというふうに理解すればよい)を行う作業を reference-based cluster annotationとかclustering based on reference dataとかreference-based clusteringなどと表現します (Luecken and Theis, Mol Syst Biol., 2019のpage 14の右中央あたり)。 従来の手元のデータのみでクラスタリングを行う作業は、これとの対比でdata-driven approachと表現されます。 当然ながら、細胞のタイプ(cell types)や組成は実験条件によっても異なりますし、アノテーションされないサンプルも結構な割合であるとは思いますので、 ここでリストアップされているプログラムが従来のやり方にとって代わることは、(情報の蓄積によって役割は大きくなるとは思いますが...)ないと思います (Luecken and Theis, Mol Syst Biol., 2019のpage 14の右中央あたりにも同様の記述あり)。 scmapの論文中では"projection"という表現が、 そしてGarnettの論文中では"classification"や"annotation"という表現が使われています。 ですので、ここでリストアップされているものたちは、"分類"を行ってくれるものという風に解釈してもよいと思います。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 外れサンプル検出 | について

外れサンプル検出を行うプログラムをリストアップします。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 発現変動 | について(2013年頃の記載事項で記念に残しているだけ)

ここでは、RNA-seqから得られるカウントデータの特徴や、実験デザイン、モデルなどについて基本的なところを述べています。 しかし、以下の記述内容は2012年頃までの知識に基づいているため結構古くなっています。参考程度にしてください。 2014年7月現在の印象としては、ReExpressのような新規転写物を同定しつつ、 既知転写物とそれらの新規転写物配列情報をアップデートしながら発現量推定を行い、 かつ発現変動解析まで行う、あるいはそれを繰り返すという方向性に移行しつつあるような感じです。 つまり、これまでの行数一定の"遺伝子"発現行列データを入力として解析するのではなく、 逐次転写物の発現量の数値や行数が変化しながら解析を行うようなイメージです。

カウントデータとモデル

私のマイクロアレイの論文(Kadota et al., 2009)では、「データ正規化法」と「発現変動遺伝子検出法」の組合せに相性がある、ということを述べています。NGSデータ解析時にも同様な注意が必要です。

ここでの入力データは「遺伝子発現行列」です。「raw countsのもの」か「正規化後」の遺伝子発現行列のどちらを入力データとして用いるのかは用いる方法によりますが、特に指定のない限り「raw countsのデータ」を入力として下さい。

NGSデータは測定値が何回sequenceされたかというcount情報に基づくもので、digital gene expression (DGE)データなどと呼ばれます。 そして、生のカウントデータは当然ながら、integer (整数;小数点以下の数値を含むはずがない)です。 ある遺伝子由来のsequenceされたリード数は二項分布(binomial distribution)に従うと様々な論文中で言及されています。つまり、

ポアソン分布(Poisson distribution)に従う、という記述もよくみかけますが本質的に同じ意味(ポアソン分布や正規分布は二項分布の近似)です。 つまり、nが大きいのがNGSの特徴であるので、pが小さくても、np(sequenceされたある特定の遺伝子由来のリード数の期待値、に相当; λ=np)がそこそこ大きな値になることが期待されるわけです。

というわけですので、このような二項分布を仮定したモデルに基づく「発現変動遺伝子検出法」を用いる際には、 へたに正規化を行ってそのモデルを仮定することができなくなるような墓穴を掘ることはないでしょう、ということです。

ちなみに「負の二項分布(negative bionomial distribution)」というキーワードを目にすることもあろうかと思いますが、これは二項分布の拡張版です。

いわゆるtechnical variation (技術的なばらつき)は「ポアソン分布」として考えることができるが、 biological variation (生物学的なばらつき;もう少し正確にはbiological replicatesのvariation)は一般にそれよりも大きいので(サンプル間の変動係数(coefficient of variation; CV)を)additional variationとして取り扱うべく「負の二項(Negative Binomial; NB)分布」として考える必要性があるのでしょうね。(Robinson and Oshlack, 2010)

technical replicatesとbiological replicatesの意味合い

technical replicatesとbiological replicatesの意味合いについて、もうすこしざっくりと説明します。

例えば「人間である私の体内の二つの組織間(例えば大脳(Brain; B)と皮膚(Skin; S))で発現変動している遺伝子を検出したい」という目的があったとします。 同じ組織でもばらつきを考慮する必要があるので大脳由来サンプルをいくつかに分割して(これがtechnical replicatesという意味)データを取得します。 皮膚由来サンプルについても同様です。これで得られたデータは(B1, B2, ...) vs. (S1, S2, ...)のようなreplicatesありのデータになります。 この私一個人のtechnical replicatesデータから発現変動遺伝子が得られたとします。 一般的に「私一個人内でのデータのばらつき(technical variation)」は「同じ人間だけど複数の別人の大脳(or 皮膚)由来サンプル間のばらつき(biological variation)」よりも小さいです。 ですので、technical replicates由来データで発現変動遺伝子(Differentially Expressed Genes; DEGs)を同定した結果は「そんなあほな!!」というくらいのDEGs数がレポートされます。 ここで注意しなければいけないのは、この結果は「私一個人の二つのサンプル間で発現変動している遺伝子がこれだけあった」ということを言っているだけで、 「(私が所属する)人間全般に言えることではない!」という点です。そしてもちろん一般には「私個人の事象についてではなく人間(ある特定の生物種)全般にいえる事象に興味がある」わけです。 それゆえ(biological replicatesのデータでないとユニバーサルな事象を理解するのが難しいために)ある程度理解が進んだ人はbiological replicatesが重要だと言っているわけです。

「モデルだ〜分布だ〜」ということと「ユーザーがプログラムを実行して得られる結果(発現変動遺伝子数や特徴)」との関係

「モデルだ〜分布だ〜」ということと「ユーザーがプログラムを実行して得られる結果(発現変動遺伝子数や特徴)」との関係についてですが、重要なのは「比較している二群間でどの程度差があれば発現変動していると判断するか?」です。

これをうまく表現するために、同一サンプルの(biological) replicatesデータから発現変動していないデータがどの程度ばらついているかをまず見積もります。 (このときにどういう数式でばらつきを見積もるのか?というところでいろんな選択肢が存在するがために沢山のRパッケージが存在しうるというわけですが、、、まあこれはおいといて) 負の二項分布モデル(negative binomial model; NB model)では分散VARをVAR = MEAN + φMEAN^2という数式(φ > 0)で表現するのが一般的です。 ちなみにポアソンモデルというのはNBモデルのφ = 0の場合(つまりVAR = MEAN; ある遺伝子の平均発現量がわかるとその遺伝子の分散が概ね平均と同じ、という意味)です。 計算手順としては、同一サンプルの(biological) replicatesデータからφがどの程度の値かを見積もります(推定します)。 ここまでで「ある発現変動していない遺伝子(non-DEGs)の平均発現量がこれくらいのときの分散はこれくらい」という情報が得られます。 これで発現変動していないものの分布(モデル)が決まります。その後、比較する二つのサンプルのカウント(発現量)データを一緒にして分散を計算し、 non-DEGsの分布のどの程度の位置にいるか(p値)を計算し、形式的には帰無仮説(Null Hypothesis)を棄却するかどうかという手順を経てDEG or non-DEGの判定をします。

用いる正規化法の違いが(non-DEGの)モデル構築にどう影響するか?どう関係するのか?

用いる正規化法の違いが(non-DEGの)モデル構築にどう影響するか?どう関係するのか?についてですが、これは極めてシンプルで、DEGかどうかの判定をする際に「比較する二つのサンプルのカウント(発現量)データを一緒にして分散を計算し...」を行う際に、サンプル間の正規化がうまくできていなければバラツキ(分散)を正しく計算できません。

ただそれだけですが、用いる正規化法次第で結果が大きく異なりうるのです(Robinson and Oshlack, 2010)。そして発現変動解析結果はその後の解析(GO解析など)にほとんどそのまま反映されますので私を含む多くのグループが正規化法の開発や性能評価といったあたりの研究を行っています。

正規化 | についてのところでも述べていますが、大抵の場合、 パッケージ独自の「正規化法」と「発現変動遺伝子検出法」が実装されており、「どの正規化法を使うか?」ということが「どの発現変動遺伝子検出法を使うか?」ということよりも結果に与える影響が大きい(Bullard et al., 2010; Kadota et al., 2012; Garmire and Subramanian, 2012)ことがわかりつつあります。 従来のサンプル間正規化法(RPMやTMM法)は比較する二群間(G1群 vs. G2群)でDEG数に大きな偏りがないことを前提にしています。 つまり、「(G1群 >> G2群)のDEG数と(G1群 << G2群)のDEG数が同程度」という前提条件がありますが、実際には大きく偏りがある場合も想定すべきで、偏りがあるなしにかかわらずロバストに正規化を行ってくれるのがTbT正規化法(Kadota et al., 2012)です。 偏りがあるなしの主な原因はDEGの分布にあるわけです。よって、TbT論文では、「正規化中にDEG検出を行い、DEGを除き、non-DEGのみで再度正規化係数を決める」というDEG elimination strategyに基づく正規化法を提案しています。 そして、TbT法を含むDEG elimination strategyに基づくいくつかの正規化法をTCCというRパッケージ中に実装しています(TCC論文中ではこの戦略をDEGES「でげす」と呼んでいます; Sun et al., 2013)。TCCパッケージ中に実装されている主な方法および入力データは以下の通りです:

  1. DEGES/TbT:オリジナルのTbT法そのもの。TMM-baySeq-TMMという3ステップで正規化を行う方法。step 2のDEG同定のところで計算時間のかかるbaySeqを採用しているため、他のパッケージでは数秒で終わる正規化ステップが数十分程度はかかるのがネック。また、biological replicatesがあることを前提としている。(A1, A2, ...) vs. (B1, B2, ...)のようなデータという意味。
  2. iDEGES/edgeR:DEGES/TbT法の超高速版(100倍程度高速)。TMM-(edgeR-TMM)nというステップで正規化を行う方法(デフォルトはn = 3)。step 2のDEG同定のところでedgeRパッケージ中のexact test (Robinson and Smyth, 2008)を採用しているためDEG同定の高速化が可能。
     したがって、(step2 - step3)のサイクルをiterative (それゆえDEGESの頭にiterativeの意味を示すiがついたiDEGESとなっている)に行ってよりロバストな正規化係数を得ることが理論的に可能な方法です。 それゆえreplicatesのある二群間比較を行いたい場合にはDEGES/TbTよりもiDEGES/edgeRのほうがおすすめ。
  3. iDEGES/DESeq:一連のmulti-stepの正規化手順をすべてDESeqパッケージ中の関数のみで実装したパイプライン。複製実験のない二群間比較時(i.e., A1 vs. B1など)にはこちらを利用します。

TCCパッケージでは、内部的にedgeR, baySeq, DESeqを利用しています。

解析 | 発現変動 | RNA-seq | について

昔(2018年6月まで)は2群間用、3群間用などと別々にプログラムをリストアップしていましたが、もはやそんな時代ではありませんのでここに新規項目を作成しました。 scRNA-seq用については「解析 | 発現変動 | scRNA-seq | について」をご覧ください。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 発現変動 | 2群間 | 対応なし | について

実験デザインが以下のような場合にこのカテゴリーに属す方法を適用します:

Aさんの正常サンプル
Bさんの正常サンプル
Cさんの正常サンプル
Dさんの腫瘍サンプル
Eさんの腫瘍サンプル
Fさんの腫瘍サンプル
Gさんの腫瘍サンプル

2016年10月に調査した結果をリストアップします。PoissonSeqのリンク先がなかったので追加しました(2015/02/02)。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 発現変動 | 2群間 | 対応なし | 複製あり | DESeq2(Love_2014)

DESeq2パッケージ (Love et al., Genome Biol., 2014)を用いるやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge1.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(DESeq2)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(DESeqDataSetオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
colData <- data.frame(condition=as.factor(data.cl))#condition列にクラスラベル情報を格納したcolDataオブジェクトを作成
d <- DESeqDataSetFromMatrix(countData=data, colData=colData, design=~condition)#DESeqDataSetオブジェクトdの作成

#本番(DEG検出)
#d <- estimateSizeFactors(d)           #正規化を実行した結果をdに格納
#d <- estimateDispersions(d)           #モデル構築(ばらつきの程度を見積もっている)
#d <- nbinomLRT(d, full= ~condition, reduced= ~1)#検定
d <- DESeq(d)                          #DESeq2を実行
tmp <- results(d)                      #実行結果を抽出
p.value <- tmp$pvalue                  #p-valueをp.valueに格納
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- tmp$padj                    #adjusted p-valueをq.valueに格納
q.value[is.na(q.value)] <- 1           #NAを1に置換している
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示
sum(p.adjust(p.value, method="BH") < param_FDR)#FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotMA(d)                              #描画
dev.off()                              #おまじない

#AUC値を計算(高いほどよい方法; ただの検証用)
library(ROC)                           #パッケージの読み込み
param_DEG <- 1:2000                    #DEGの位置を指定
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

解析 | 発現変動 | 2群間 | 対応なし | 複製あり | TCC(Sun_2013)

TCCを用いたやり方を示します。 内部的にiDEGES/edgeR(Sun_2013)正規化を実行したのち、 edgeRパッケージ中のexact testで発現変動遺伝子(Differentially Expressed Genes; DEGs)検出を行っています。TCC原著論文中のiDEGES/edgeR-edgeRという解析パイプラインに相当します。 全てTCCパッケージ(Sun et al., BMC Bioinformatics, 2013)内で完結します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge1.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR)               #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない

#AUC値を計算(高いほどよい方法; ただの検証用)
library(ROC)                              #パッケージの読み込み
param_DEG <- 1:2000                    #DEGの位置を指定
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-result$rank))#AUC計算
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。 正規化後のテキストファイルデータを出力し、平均-分散プロットのpngファイルを出力しています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge2.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge2.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(380, 420)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(平均-分散プロット)
hoge <- normalized                     #正規化後のデータをhogeに格納
MEAN <- apply(hoge, 1, mean)           #各行の平均を計算した結果をMEANに格納
VARIANCE <- apply(hoge, 1, var)        #各行の分散を計算した結果をVARIANCEに格納

png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(MEAN, VARIANCE, log="xy", pch=20, cex=.1,#プロット
     xlim=c(1e-02, 1e+08), ylim=c(1e-02, 1e+08), col="black")#プロット
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
abline(a=0, b=1, col="gray")           #y=xの直線を指定した色で追加(y=a+bxのa=0, b=1)
obj <- (result$q.value < param_FDR)    #条件を満たすかどうかを判定した結果をobjに格納
points(MEAN[obj], VARIANCE[obj], col="magenta", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。 DEG検出後に任意のFDR閾値を満たす遺伝子数を調べたり、色分けしたりx, y軸の範囲を限定するなどする様々なテクニックを示しています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.1                       #false discovery rate (FDR)閾値を指定
param_nonDEG <- 2001:10000             #non-DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納

#後処理(様々な情報を得ている)
sum(tcc$estimatedDEG)                  #param_FDRのところで指定した閾値を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
sum(tcc$DEGES$potentialDEG)            #DEGES正規化のstep2でpotential DEGと判定された数を表示
tcc$norm.factors                       #DEGES正規化係数を表示(この係数を用いてDEG検出を行っている)

#ファイルに保存(全遺伝子でM-A plot)
out_f1 <- "hoge3_all_010.png"           #出力ファイル名を指定してout_f1に格納
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
A <- getResult(tcc)$a.value            #M-A plotのA値を抽出
png(out_f1, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)",#M-A plotを描画
     xlim=c(-2, 16), ylim=c(-8, 6), pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
obj <- tcc$stat$q.value < param_FDR    #条件を満たすかどうかを判定した結果をobjに格納
points(A[obj], M[obj], col="magenta", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(M[obj] < 0)                        #FDR < 0.10を満たものの中でM < 0(G1群で高発現)となる遺伝子数を表示
sum(M[obj] > 0)                        #FDR < 0.10を満たものの中でM > 0(G2群で高発現)となる遺伝子数を表示

#ファイルに保存(non-DEGデータのみでM-A plot; FDR < 0.1)
tcc <- tcc[param_nonDEG]               #non-DEGデータ情報のみ抽出
out_f2 <- "hoge3_nonDEG_010.png"       #出力ファイル名を指定してout_f2に格納

M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
A <- getResult(tcc)$a.value            #M-A plotのA値を抽出
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)",#M-A plotを描画
     xlim=c(-2, 16), ylim=c(-8, 6), pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
obj <- tcc$stat$q.value < param_FDR    #条件を満たすかどうかを判定した結果をobjに格納
points(A[obj], M[obj], col="magenta", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(M[obj] < 0)                        #FDR < 0.10を満たものの中でM < 0(G1群で高発現)となる遺伝子数を表示
sum(M[obj] > 0)                        #FDR < 0.10を満たものの中でM > 0(G2群で高発現)となる遺伝子数を表示

#ファイルに保存(non-DEGデータのみでM-A plot; FDR < 0.2)
param_FDR <- 0.2                       #false discovery rate (FDR)閾値を指定
out_f3 <- "hoge3_nonDEG_020.png"       #出力ファイル名を指定してout_f3に格納
M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
A <- getResult(tcc)$a.value            #M-A plotのA値を抽出
png(out_f3, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)",#M-A plotを描画
     xlim=c(-2, 16), ylim=c(-8, 6), pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
obj <- tcc$stat$q.value < param_FDR    #条件を満たすかどうかを判定した結果をobjに格納
points(A[obj], M[obj], col="magenta", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(M[obj] < 0)                        #FDR < 0.10を満たものの中でM < 0(G1群で高発現)となる遺伝子数を表示
sum(M[obj] > 0)                        #FDR < 0.10を満たものの中でM > 0(G2群で高発現)となる遺伝子数を表示

#ファイルに保存(non-DEGデータのみでM-A plot; FDR < 0.4)
param_FDR <- 0.4                       #false discovery rate (FDR)閾値を指定
out_f4 <- "hoge3_nonDEG_040.png"       #出力ファイル名を指定してout_f4に格納

M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
A <- getResult(tcc)$a.value            #M-A plotのA値を抽出
png(out_f4, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)",#M-A plotを描画
     xlim=c(-2, 16), ylim=c(-8, 6), pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
obj <- tcc$stat$q.value < param_FDR    #条件を満たすかどうかを判定した結果をobjに格納
points(A[obj], M[obj], col="magenta", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(M[obj] < 0)                        #FDR < 0.10を満たものの中でM < 0(G1群で高発現)となる遺伝子数を表示
sum(M[obj] > 0)                        #FDR < 0.10を満たものの中でM > 0(G2群で高発現)となる遺伝子数を表示

#ファイルに保存(non-DEGデータのみでM-A plot; FDR < 0.6)
param_FDR <- 0.6                       #false discovery rate (FDR)閾値を指定
out_f5 <- "hoge3_nonDEG_060.png"        #出力ファイル名を指定してout_f5に格納

M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
A <- getResult(tcc)$a.value            #M-A plotのA値を抽出
png(out_f5, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(A, M, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)",#M-A plotを描画
     xlim=c(-2, 16), ylim=c(-8, 6), pch=20, cex=.1)#M-A plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
obj <- tcc$stat$q.value < param_FDR    #条件を満たすかどうかを判定した結果をobjに格納
points(A[obj], M[obj], col="magenta", cex=0.1, pch=20)#objがTRUEとなる要素のみ指定した色で描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(M[obj] < 0)                        #FDR < 0.10を満たものの中でM < 0(G1群で高発現)となる遺伝子数を表示
sum(M[obj] > 0)                        #FDR < 0.10を満たものの中でM > 0(G2群で高発現)となる遺伝子数を表示
	

4. サンプルデータ4の18,110 genes×10 samplesのリアルデータ(data_marioni.txt; kidney 5サンプル vs. liver 5サンプル)の場合:

「FDR閾値を満たすもの」と「fold-change閾値を満たすもの」それぞれのM-A plotを作成しています。

in_f <- "data_marioni.txt"             #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge4.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge4_FDR.png"              #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge4_FC.png"               #出力ファイル名を指定してout_f3に格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_FC <- 2                          #fold-change閾値(param_FC倍)を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot; FDR)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR, xlim=c(-3, 13), ylim=c(-10, 10))#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("bottomright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示

#ファイルに保存(M-A plot; fold-change)
M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
hoge <- rep(1, length(M))              #初期値を1にしたベクトルhogeを作成
hoge[abs(M) > log2(param_FC)] <- 2     #条件を満たす位置に2を代入
cols <- c("black", "magenta")          #色情報を指定してcolsに格納

png(out_f3, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, col=cols, col.tag=hoge, xlim=c(-3, 13), ylim=c(-10, 10))#M-A plotを描画
legend("bottomright", c(paste("DEG(", param_FC, "-fold)", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(abs(M) > log2(16))                 #16倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(8))                  #8倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(4))                  #4倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(2))                  #2倍以上発現変動する遺伝子数を表示
	

5. サンプルデータ4の18,110 genes×10 samplesのリアルデータ(data_marioni.txt; kidney 5サンプル vs. liver 5サンプル)の最初の4サンプルを比較する場合:

「FDR閾値を満たすもの」と「fold-change閾値を満たすもの」それぞれのM-A plotを作成しています。

in_f <- "data_marioni.txt"             #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge5.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge5_FDR.png"              #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge5_FC.png"               #出力ファイル名を指定してout_f3に格納
param_G1 <- 2                          #G1群(kidney)のサンプル数を指定
param_G2 <- 2                          #G2群(liver)のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_FC <- 2                          #fold-change閾値(param_FC倍)を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出)
data <- data[,1:(param_G1+param_G2)]   #最初の(param_G1+param_G2)列分のデータを抽出している

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot; FDR)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR, xlim=c(-3, 13), ylim=c(-10, 10))#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("bottomright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示

#ファイルに保存(M-A plot; fold-change)
M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
hoge <- rep(1, length(M))              #初期値を1にしたベクトルhogeを作成
hoge[abs(M) > log2(param_FC)] <- 2     #条件を満たす位置に2を代入
cols <- c("black", "magenta")          #色情報を指定してcolsに格納

png(out_f3, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, col=cols, col.tag=hoge, xlim=c(-3, 13), ylim=c(-10, 10))#M-A plotを描画
legend("bottomright", c(paste("DEG(", param_FC, "-fold)", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(abs(M) > log2(16))                 #16倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(8))                  #8倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(4))                  #4倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(2))                  #2倍以上発現変動する遺伝子数を表示
	

6. サンプルデータ8の26,221 genes×6 samplesのリアルデータ(data_arab.txt; mock 3サンプル vs. hrcc 3サンプル)の場合:

「FDR閾値を満たすもの」と「fold-change閾値を満たすもの」それぞれのM-A plotを作成しています。

in_f <- "data_arab.txt"                #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge6.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge6_FDR.png"              #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge6_FC.png"               #出力ファイル名を指定してout_f3に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_FC <- 2                          #fold-change閾値(param_FC倍)を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出)
data <- data[,1:(param_G1+param_G2)]   #最初の(param_G1+param_G2)列分のデータを抽出している

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot; FDR)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR, xlim=c(-3, 13), ylim=c(-10, 10))#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("bottomright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示

#ファイルに保存(M-A plot; fold-change)
M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
hoge <- rep(1, length(M))              #初期値を1にしたベクトルhogeを作成
hoge[abs(M) > log2(param_FC)] <- 2     #条件を満たす位置に2を代入
cols <- c("black", "magenta")          #色情報を指定してcolsに格納

png(out_f3, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, col=cols, col.tag=hoge, xlim=c(-3, 13), ylim=c(-10, 10))#M-A plotを描画
legend("bottomright", c(paste("DEG(", param_FC, "-fold)", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(abs(M) > log2(16))                 #16倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(8))                  #8倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(4))                  #4倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(2))                  #2倍以上発現変動する遺伝子数を表示
	

7. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。 1.と基本的に同じで、出力のテキストファイルが正規化前のデータではなく正規化後のデータになっていて、発現変動順にソートしたものになっています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge7.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge7.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR)               #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

8. 60,234 genes×6 samplesのリアルデータ(hoge9_count_gene.txt)の場合:

Neyret-Kahn et al., Genome Res., 2013のgene-levelの2群間比較用(3 proliferative samples vs. 3 Ras samples)ヒトRNA-seqカウントデータです。 マップ後 | カウント情報取得 | single-end | ゲノム | アノテーション有 | QuasR(Gaidatzis_2015)から得られます。

in_f <- "hoge9_count_gene.txt"         #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge8.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge8.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(430, 390)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR)               #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

9. 59,857 genes×6 samplesのリアルデータ(srp017142_count_bowtie.txt)の場合:

8.の入力ファイル(hoge9_count_gene.txt)と本質的に同じもの(アノテーション情報が2014年3月ごろと若干古いだけ)です。 パイプライン | ゲノム | 発現変動 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013)から得られます。

in_f <- "srp017142_count_bowtie.txt"   #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge9.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge9.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(430, 390)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR, xlim=c(-3, 17), ylim=c(-8, 15))#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

解析 | 発現変動 | 2群間 | 対応なし | 複製あり | Blekhmanデータ | TCC(Sun_2013)

Blekhman et al., Genome Res., 2010の公共カウントデータ解析に特化させて、 TCCを用いた様々な例題を示します。 入力は全てサンプルデータ42の20,689 genes×18 samplesのリアルカウントデータ (sample_blekhman_18.txt)です。 ヒトHomo sapiens; HS)のメス3サンプル(HSF1-3)とオス3サンプル(HSM1-3), チンパンジー(Pan troglodytes; PT)のメス3サンプル(PTF1-3)とオス3サンプル(PTM1-3), アカゲザル(Rhesus macaque; RM)のメス3サンプル(RMF1-3)とオス3サンプル(RMM1-3)の並びになっています。 つまり、以下のような感じです。FはFemale(メス)、MはMale(オス)を表します。

ヒト(1-6列目): HSF1, HSF2, HSF3, HSM1, HSM2, and HSM3

チンパンジー(7-12列目): PTF1, PTF2, PTF3, PTM1, PTM2, and PTM3

アカゲザル(13-18列目): RMF1, RMF2, RMF3, RMM1, RMM2, and RMM3

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ヒト2サンプル(G1群:HSF1とHSM1) vs. アカゲザル2サンプル(G2群:RMF1とRMM1)の場合:

1, 4, 13, 16 列目のデータのみ抽出しています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge1.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1.png"                  #出力ファイル名を指定してout_f2に格納
param_subset <- c(1, 4, 13, 16)        #取り扱いたいサブセット情報を指定
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(430, 350)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
dim(data)                              #行数と列数を表示
head(data)                             #最初の6行分を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR, xlim=c(-2, 17), ylim=c(-10, 10),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

2. ヒト2サンプル(G1群:HSF1とHSM1) vs. アカゲザル2サンプル(G2群:RMF1とRMM1)の場合:

1.と基本的に同じで、ランキング1位の"ENSG00000208570"をハイライトさせるテクニックです。 1位のy軸の値(m.value)が11.29なので、y軸の範囲を[-10.0, 11.5]の範囲に変更する操作も行っています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge2.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge2.png"                  #出力ファイル名を指定してout_f2に格納
param_subset <- c(1, 4, 13, 16)        #取り扱いたいサブセット情報を指定
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 310)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_geneid <- "ENSG00000208570"      #ハイライトさせたいgene_IDを指定
param_col <- "magenta"                 #色を指定
param_cex <- 2                         #点の大きさを指定(2なら通常の2倍、0.5なら通常の0.5倍)
param_pch <- 20                        #点の形状を指定(詳細はこちらとか)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
dim(data)                              #行数と列数を表示
head(data)                             #最初の6行分を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR, xlim=c(-2, 17), ylim=c(-10.0, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
obj <- is.element(tcc$gene_id, param_geneid)#条件を満たすかどうかを判定した結果をobjに格納(param_geneidで指定した位置をTRUE)
points(result$a.value[obj], result$m.value[obj],#条件を満たす点をハイライト
       pch=param_pch, cex=param_cex, col=param_col)#条件を満たす点をハイライト
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

3. ヒト2サンプル(G1群:HSF1とHSM1) vs. アカゲザル2サンプル(G2群:RMF1とRMM1)の場合:

2.と基本的に同じです。 ランキング2位の"ENSG00000220191"をハイライトさせるテクニックです。 param_cexやparam_pchを変更しています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge3.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge3.png"                  #出力ファイル名を指定してout_f2に格納
param_subset <- c(1, 4, 13, 16)        #取り扱いたいサブセット情報を指定
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 310)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_geneid <- "ENSG00000220191"      #ハイライトさせたいgene_IDを指定
param_col <- "magenta"                 #色を指定
param_cex <- 2.3                       #点の大きさを指定(2なら通常の2倍、0.5なら通常の0.5倍)
param_pch <- 15                        #点の形状を指定(詳細はこちらとか)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
dim(data)                              #行数と列数を表示
head(data)                             #最初の6行分を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR, xlim=c(-2, 17), ylim=c(-10.0, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
obj <- is.element(tcc$gene_id, param_geneid)#条件を満たすかどうかを判定した結果をobjに格納(param_geneidで指定した位置をTRUE)
points(result$a.value[obj], result$m.value[obj],#条件を満たす点をハイライト
       pch=param_pch, cex=param_cex, col=param_col)#条件を満たす点をハイライト
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

4. ヒト2サンプル(G1群:HSF1とHSM1) vs. アカゲザル2サンプル(G2群:RMF1とRMM1)の場合:

3.と基本的に同じです。 ランキング3位の"ENSG00000106366"をハイライトさせるテクニックです。 param_cexやparam_pchを変更しています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge4.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge4.png"                  #出力ファイル名を指定してout_f2に格納
param_subset <- c(1, 4, 13, 16)        #取り扱いたいサブセット情報を指定
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 310)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_geneid <- "ENSG00000106366"      #ハイライトさせたいgene_IDを指定
param_col <- "magenta"                 #色を指定
param_cex <- 3.1                       #点の大きさを指定(2なら通常の2倍、0.5なら通常の0.5倍)
param_pch <- 18                        #点の形状を指定(詳細はこちらとか)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
dim(data)                              #行数と列数を表示
head(data)                             #最初の6行分を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR, xlim=c(-2, 17), ylim=c(-10.0, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
obj <- is.element(tcc$gene_id, param_geneid)#条件を満たすかどうかを判定した結果をobjに格納(param_geneidで指定した位置をTRUE)
points(result$a.value[obj], result$m.value[obj],#条件を満たす点をハイライト
       pch=param_pch, cex=param_cex, col=param_col)#条件を満たす点をハイライト
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

5. ヒト2サンプル(G1群:HSF1とHSM1) vs. アカゲザル2サンプル(G2群:RMF1とRMM1)の場合:

4.と基本的に同じです。 param_FDRで指定した閾値をギリギリ満たすランキング2,488位の"ENSG00000139445"をハイライトさせるテクニックです。 param_col, param_cex, param_pchを変更しています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge5.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge5.png"                  #出力ファイル名を指定してout_f2に格納
param_subset <- c(1, 4, 13, 16)        #取り扱いたいサブセット情報を指定
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 310)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_geneid <- "ENSG00000139445"      #ハイライトさせたいgene_IDを指定
param_col <- "skyblue"                 #色を指定
param_cex <- 2.5                       #点の大きさを指定(2なら通常の2倍、0.5なら通常の0.5倍)
param_pch <- 17                        #点の形状を指定(詳細はこちらとか)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
dim(data)                              #行数と列数を表示
head(data)                             #最初の6行分を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR, xlim=c(-2, 17), ylim=c(-10.0, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
obj <- is.element(tcc$gene_id, param_geneid)#条件を満たすかどうかを判定した結果をobjに格納(param_geneidで指定した位置をTRUE)
points(result$a.value[obj], result$m.value[obj],#条件を満たす点をハイライト
       pch=param_pch, cex=param_cex, col=param_col)#条件を満たす点をハイライト
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

6. ヒト2サンプル(G1群:HSF1とHSM1) vs. アカゲザル2サンプル(G2群:RMF1とRMM1)の場合:

3種類のFDR閾値(0.0001, 0.05, 0.4)でのM-A plotを出力させています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge6_1.png"                #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge6_2.png"                #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge6_3.png"                #出力ファイル名を指定してout_f3に格納
param_subset <- c(1, 4, 13, 16)        #取り扱いたいサブセット情報を指定
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param_FDR <- c(0.0001, 0.05, 0.4)      #false discovery rate (FDR)閾値を指定
param_fig <- c(375, 350)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
dim(data)                              #行数と列数を表示
head(data)                             #最初の6行分を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger")#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR[1])   #FDR < param_FDR[1]を満たす遺伝子数を表示
sum(tcc$stat$q.value < param_FDR[2])   #FDR < param_FDR[2]を満たす遺伝子数を表示
sum(tcc$stat$q.value < param_FDR[3])   #FDR < param_FDR[3]を満たす遺伝子数を表示

#ファイルに保存(M-A plot)
png(out_f1, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR[1], xlim=c(-2, 17), ylim=c(-10.0, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR[1], ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
dev.off()                              #おまじない

png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR[2], xlim=c(-2, 17), ylim=c(-10.0, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR[2], ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
dev.off()                              #おまじない

png(out_f3, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR[3], xlim=c(-2, 17), ylim=c(-10.0, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR[3], ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
dev.off()                              #おまじない
	

7. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

Blekhman et al., Genome Res., 2010の20,689 genes×18 samplesのカウントデータです。 ヒトのメス3サンプル(HSF1-3)とオス3サンプル(HSM1-3), チンパンジーのメス3サンプル(PTF1-3)とオス3サンプル(PTM1-3), アカゲザルのメス3サンプル(RMF1-3)とオス3サンプル(RMM1-3)の並びになっています。 ここでは、1, 4, 7, 10 列目のデータのみ抽出して、ヒト2サンプル(G1群:HSF1とHSM1) vs. チンパンジー2サンプル(G2群:PTF1とPTM1)の2群間比較を行います。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge7.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge7.png"                  #出力ファイル名を指定してout_f2に格納
param_subset <- c(1, 4, 7, 10)         #取り扱いたいサブセット情報を指定
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(430, 350)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
colnames(data)                         #列名を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR, xlim=c(-2, 17), ylim=c(-10.0, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

8. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

Blekhman et al., Genome Res., 2010の20,689 genes×18 samplesのカウントデータです。 ヒトのメス3サンプル(HSF1-3)とオス3サンプル(HSM1-3), チンパンジーのメス3サンプル(PTF1-3)とオス3サンプル(PTM1-3), アカゲザルのメス3サンプル(RMF1-3)とオス3サンプル(RMM1-3)の並びになっています。 ここでは、1, 4, 2, 5 列目のデータのみ抽出して、ヒト2サンプル(G1群:HSF1とHSM1) vs. ヒト2サンプル(G2群:HSF2とHSM2)の2群間比較を行います。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge8.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge8.png"                  #出力ファイル名を指定してout_f2に格納
param_subset <- c(1, 4, 2, 5)          #取り扱いたいサブセット情報を指定
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(430, 350)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
colnames(data)                         #列名を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR, xlim=c(-2, 17), ylim=c(-10.0, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
obj <- as.logical(tcc$stat$q.value < param_FDR)#条件を満たすかどうかを判定した結果をobjに格納
points(result$a.value[obj], result$m.value[obj],#objがTRUEとなる点をハイライト
       pch=20, cex=1.5, col="magenta")#objがTRUEとなる点をハイライト
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

9. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

Blekhman et al., Genome Res., 2010の20,689 genes×18 samplesのカウントデータです。 ヒトのメス3サンプル(HSF1-3)とオス3サンプル(HSM1-3), チンパンジーのメス3サンプル(PTF1-3)とオス3サンプル(PTM1-3), アカゲザルのメス3サンプル(RMF1-3)とオス3サンプル(RMM1-3)の並びになっています。 ここでは、7, 10, 8, 11列目のデータのみ抽出して、 チンパンジー2サンプル(G1群:PTF1とPTM1) vs. チンパンジー2サンプル(G2群:PTF2とPTM2)の2群間比較を行います。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge9.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge9.png"                  #出力ファイル名を指定してout_f2に格納
param_subset <- c(7, 10, 8, 11)        #取り扱いたいサブセット情報を指定
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(430, 350)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
colnames(data)                         #列名を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR, xlim=c(-2, 17), ylim=c(-10.0, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
obj <- as.logical(tcc$stat$q.value < param_FDR)#条件を満たすかどうかを判定した結果をobjに格納
points(result$a.value[obj], result$m.value[obj],#objがTRUEとなる点をハイライト
       pch=20, cex=1.5, col="magenta")#objがTRUEとなる点をハイライト
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

10. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

Blekhman et al., Genome Res., 2010の20,689 genes×18 samplesのカウントデータです。 ヒトのメス3サンプル(HSF1-3)とオス3サンプル(HSM1-3), チンパンジーのメス3サンプル(PTF1-3)とオス3サンプル(PTM1-3), アカゲザルのメス3サンプル(RMF1-3)とオス3サンプル(RMM1-3)の並びになっています。 ここでは、13, 16, 14, 17列目のデータのみ抽出して、 アカゲザル2サンプル(G1群:RMF1とRMM1) vs. アカゲザル2サンプル(G2群:RMF2とRMM2)の2群間比較を行います。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge10.txt"                 #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge10.png"                 #出力ファイル名を指定してout_f2に格納
param_subset <- c(13, 16, 14, 17)      #取り扱いたいサブセット情報を指定
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(430, 350)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
colnames(data)                         #列名を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR, xlim=c(-2, 17), ylim=c(-10.0, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
obj <- as.logical(tcc$stat$q.value < param_FDR)#条件を満たすかどうかを判定した結果をobjに格納
points(result$a.value[obj], result$m.value[obj],#objがTRUEとなる点をハイライト
       pch=20, cex=1.5, col="magenta")#objがTRUEとなる点をハイライト
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

11. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

Blekhman et al., Genome Res., 2010の20,689 genes×18 samplesのカウントデータです。 ヒトのメス3サンプル(HSF1-3)とオス3サンプル(HSM1-3), チンパンジーのメス3サンプル(PTF1-3)とオス3サンプル(PTM1-3), アカゲザルのメス3サンプル(RMF1-3)とオス3サンプル(RMM1-3)の並びになっています。 ここでは、13, 16, 15, 18列目のデータのみ抽出して、 アカゲザル2サンプル(G1群:RMF1とRMM1) vs. アカゲザル2サンプル(G2群:RMF3とRMM3)の2群間比較を行います。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge11.txt"                 #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge11.png"                 #出力ファイル名を指定してout_f2に格納
param_subset <- c(13, 16, 15, 18)      #取り扱いたいサブセット情報を指定
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(430, 350)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
colnames(data)                         #列名を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR, xlim=c(-2, 17), ylim=c(-10.0, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
obj <- as.logical(tcc$stat$q.value < param_FDR)#条件を満たすかどうかを判定した結果をobjに格納
points(result$a.value[obj], result$m.value[obj],#objがTRUEとなる点をハイライト
       pch=20, cex=1.5, col="magenta")#objがTRUEとなる点をハイライト
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

12. ヒト2サンプル(G1群:HSF1とHSM1) vs. アカゲザル2サンプル(G2群:RMF1とRMM1)の場合:

2.と基本的に同じで、q.value = 1の"ENSG00000125844"と "ENSG00000115325"をハイライトさせるテクニックです。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge12.txt"                 #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge12.png"                 #出力ファイル名を指定してout_f2に格納
param_subset <- c(1, 4, 13, 16)        #取り扱いたいサブセット情報を指定
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 310)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_geneid <- c("ENSG00000125844", "ENSG00000115325")#ハイライトさせたいgene_IDを指定
param_col <- "skyblue"                 #色を指定
param_cex <- 2                         #点の大きさを指定(2なら通常の2倍、0.5なら通常の0.5倍)
param_pch <- 20                        #点の形状を指定(詳細はこちらとか)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
dim(data)                              #行数と列数を表示
head(data)                             #最初の6行分を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR, xlim=c(-2, 17), ylim=c(-10.0, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
obj <- is.element(tcc$gene_id, param_geneid)#条件を満たすかどうかを判定した結果をobjに格納(param_geneidで指定した位置をTRUE)
points(result$a.value[obj], result$m.value[obj],#条件を満たす点をハイライト
       pch=param_pch, cex=param_cex, col=param_col)#条件を満たす点をハイライト
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

13. ヒト2サンプル(G1群:HSF1とHSM1) vs. アカゲザル2サンプル(G2群:RMF1とRMM1)の場合:

1.と基本的に同じで、「FDR閾値を満たすもの」と「fold-change閾値を満たすもの」それぞれのM-A plotを作成しています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge13.txt"                 #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge13_FDR.png"             #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge13_FC.png"              #出力ファイル名を指定してout_f3に格納
param_subset <- c(1, 4, 13, 16)        #取り扱いたいサブセット情報を指定
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_FC <- 2                          #fold-change閾値(param_FC倍)を指定
param_fig <- c(400, 310)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
dim(data)                              #行数と列数を表示
head(data)                             #最初の6行分を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot; FDR)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR, xlim=c(-2, 17), ylim=c(-10.0, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示

#ファイルに保存(M-A plot; fold-change)
M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
hoge <- rep(1, length(M))              #初期値を1にしたベクトルhogeを作成
hoge[abs(M) > log2(param_FC)] <- 2     #条件を満たす位置に2を代入
cols <- c("black", "magenta")          #色情報を指定してcolsに格納

png(out_f3, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, col=cols, col.tag=hoge, xlim=c(-2, 17), ylim=c(-10.0, 11.5),#M-A plotを描画
     cex=0.8, cex.lab=1.2,             #閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(", param_FC, "-fold)", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(abs(M) > log2(16))                 #16倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(8))                  #8倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(4))                  #4倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(2))                  #2倍以上発現変動する遺伝子数を表示
	

解析 | 発現変動 | 2群間 | 対応なし | 複製あり | SAMseq(Li_2013)

samrパッケージ中のSAMseq (Li and Tibshirani, 2013)を用いて 発現変動遺伝子(Differentially Expressed Genes; DEGs)検出を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(samr)                          #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番(DEG検出)
out <- SAMseq(data, data.cl, resp.type="Two class unpaired")#DEG検出を実行した結果をoutに格納
p.value <- samr.pvalues.from.perms(out$samr.obj$tt, out$samr.obj$ttstar)#p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < 0.10)                    #FDR閾値(q.value < 0.10)を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納。
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

1.と基本的に同じで、DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_DEG <- 1:2000                    #DEGの位置を指定

#必要なパッケージをロード
library(samr)                          #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番(DEG検出)
out <- SAMseq(data, data.cl, resp.type="Two class unpaired")#DEG検出を実行した結果をoutに格納
p.value <- samr.pvalues.from.perms(out$samr.obj$tt, out$samr.obj$ttstar)#p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < 0.10)                    #FDR閾値(q.value < 0.10)を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納。
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

3. サンプルデータ13と同じ10,000 genes×6 samplesのシミュレーションデータの作成から行う場合:

「G1_rep1, G1_rep2, G1_rep3, G2_rep1, G2_rep2, G2_rep3」の計6サンプル分からなります。 全10,000遺伝子中の最初の2,000個(gene_1〜gene_2000まで)が発現変動遺伝子(DEG)です。 全2,000 DEGsの内訳:最初の90%分(gene_1〜gene_1800)がG1群で4倍高発現、残りの10%分(gene_1801〜gene_2000)がG2群で4倍高発現

このDEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(samr)                          #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=10000, PDEG=0.2,#シミュレーションデータの作成
             DEG.assign=c(0.9, 0.1),   #シミュレーションデータの作成
             DEG.foldchange=c(4, 4),   #シミュレーションデータの作成
             replicates=c(3, 3))       #シミュレーションデータの作成
data <- tcc$count                      #カウントデータ情報をdataに格納
data.cl <- tcc$group$group             #G1群を1、G2群を2としたベクトルdata.clを作成

#本番(DEG検出)
out <- SAMseq(data, data.cl, resp.type="Two class unpaired")#DEG検出を実行した結果をoutに格納
p.value <- samr.pvalues.from.perms(out$samr.obj$tt, out$samr.obj$ttstar)#p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < 0.10)                    #FDR閾値(q.value < 0.10)を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納。
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
obj <- as.numeric(tcc$simulation$trueDEG != 0)#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

4. サンプルデータ13と同じ10,000 genes×6 samplesのシミュレーションデータの作成から行う場合:

「G1_rep1, G1_rep2, G1_rep3, G2_rep1, G2_rep2, G2_rep3」の計6サンプル分からなります。 全10,000遺伝子中の最初の2,000個(gene_1〜gene_2000まで)が発現変動遺伝子(DEG)です。 全2,000 DEGsの内訳:最初の90%分(gene_1〜gene_1800)がG1群で4倍高発現、残りの10%分(gene_1801〜gene_2000)がG2群で4倍高発現

このDEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。 samrパッケージではなくTCCパッケージを用いています。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(samr)                          #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=10000, PDEG=0.2,#シミュレーションデータの作成
             DEG.assign=c(0.9, 0.1),   #シミュレーションデータの作成
             DEG.foldchange=c(4, 4),   #シミュレーションデータの作成
             replicates=c(3, 3))       #シミュレーションデータの作成

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="samseq")#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(q.value < 0.10)                    #FDR閾値(q.value < 0.10)を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
calcAUCValue(tcc)                      #AUC計算
	

解析 | 発現変動 | 2群間 | 対応なし | 複製あり | edgeR(Robinson_2010)

edgeRパッケージを用いて発現変動遺伝子(Differentially Expressed Genes; DEGs)検出を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#前処理(低発現遺伝子のフィルタリング)
group <- factor(data.cl)               #factor形式に変更
d <- DGEList(counts=data,group=group)  #DGEListオブジェクトを作成してdに格納
keep <- filterByExpr(d)                #低発現遺伝子のフィルタリング
#d <- d[keep,,keep.lib.sizes=FALSE]    #低発現遺伝子のフィルタリング

#本番
d <- calcNormFactors(d)                #TMM正規化を実行
design <- model.matrix(~group)         #デザイン行列を作成
d <- estimateDisp(d, design)           #モデル構築
fit <- glmQLFit(d, design)             #モデル構築
out <- glmQLFTest(fit, coef=2)         #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

MA-plotも描くやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#前処理(低発現遺伝子のフィルタリング)
group <- factor(data.cl)               #factor形式に変更
d <- DGEList(counts=data,group=group)  #DGEListオブジェクトを作成してdに格納
keep <- filterByExpr(d)                #低発現遺伝子のフィルタリング
#d <- d[keep,,keep.lib.sizes=FALSE]    #低発現遺伝子のフィルタリング

#本番
d <- calcNormFactors(d)                #TMM正規化を実行
design <- model.matrix(~group)         #デザイン行列を作成
d <- estimateDisp(d, design)           #モデル構築
fit <- glmQLFit(d, design)             #モデル構築
out <- glmQLFTest(fit, coef=2)         #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#MA-plotを描画
plotSmear(d)                           #MA-plotの基本形(縦軸(M):log-ratio, 横軸(A):全体的な発現レベル)
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

MA-plotも描き、FDR < 0.05を満たすものを赤色で示すやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#前処理(低発現遺伝子のフィルタリング)
group <- factor(data.cl)               #factor形式に変更
d <- DGEList(counts=data,group=group)  #DGEListオブジェクトを作成してdに格納
keep <- filterByExpr(d)                #低発現遺伝子のフィルタリング
#d <- d[keep,,keep.lib.sizes=FALSE]    #低発現遺伝子のフィルタリング

#本番
d <- calcNormFactors(d)                #TMM正規化を実行
design <- model.matrix(~group)         #デザイン行列を作成
d <- estimateDisp(d, design)           #モデル構築
fit <- glmQLFit(d, design)             #モデル構築
out <- glmQLFTest(fit, coef=2)         #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#MA-plotを描画
hoge <- rownames(data)[q.value < param_FDR]#指定したFDRの閾値を満たす遺伝子名情報をhogeに格納
plotSmear(d, de.tags=hoge)             #MA-plotの基本形に加え、発現変動遺伝子に相当する
length(hoge)                           #発現変動遺伝子数を表示
length(hoge)/nrow(data)                #発現変動遺伝子の全遺伝子数に占める割合を表示
	

4. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

MA-plotも描き、FDR値で発現変動順に並べた上位300個を赤色で示すやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param3 <- 300                          #MA-plot描画時の赤色で示す上位遺伝子数の閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#前処理(低発現遺伝子のフィルタリング)
group <- factor(data.cl)               #factor形式に変更
d <- DGEList(counts=data,group=group)  #DGEListオブジェクトを作成してdに格納
keep <- filterByExpr(d)                #低発現遺伝子のフィルタリング
#d <- d[keep,,keep.lib.sizes=FALSE]    #低発現遺伝子のフィルタリング

#本番
d <- calcNormFactors(d)                #TMM正規化を実行
design <- model.matrix(~group)         #デザイン行列を作成
d <- estimateDisp(d, design)           #モデル構築
fit <- glmQLFit(d, design)             #モデル構築
out <- glmQLFTest(fit, coef=2)         #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#MA-plotを描画
hoge <- rownames(data)[ranking <= param3]#param3で指定した個数の上位遺伝子の遺伝子名情報をhogeに格納
plotSmear(d, de.tags=hoge)             #MA-plotの基本形に加え、発現変動遺伝子に相当する
length(hoge)                           #発現変動遺伝子数を表示
length(hoge)/nrow(data)                #発現変動遺伝子の全遺伝子数に占める割合を表示
	

5. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

MA-plotも描き、2倍以上発現変化しているものを赤色で示すやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param3 <- 2                            #MA-plot描画時の倍率変化の閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#前処理(低発現遺伝子のフィルタリング)
group <- factor(data.cl)               #factor形式に変更
d <- DGEList(counts=data,group=group)  #DGEListオブジェクトを作成してdに格納
keep <- filterByExpr(d)                #低発現遺伝子のフィルタリング
#d <- d[keep,,keep.lib.sizes=FALSE]    #低発現遺伝子のフィルタリング

#本番
d <- calcNormFactors(d)                #TMM正規化を実行
design <- model.matrix(~group)         #デザイン行列を作成
d <- estimateDisp(d, design)           #モデル構築
fit <- glmQLFit(d, design)             #モデル構築
out <- glmQLFTest(fit, coef=2)         #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#MA-plotを描画
hoge <- rownames(data)[abs(out$table$logFC) >= log2(param3)]#param3で指定した倍率変化の閾値を満たす遺伝子名情報をhogeに格納
plotSmear(d, de.tags=hoge)             #MA-plotの基本形に加え、発現変動遺伝子に相当する
length(hoge)                           #発現変動遺伝子数を表示
length(hoge)/nrow(data)                #発現変動遺伝子の全遺伝子数に占める割合を表示
	

6. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

MA-plotも描き、MA-plotで大きさを指定してpng形式ファイルに保存するやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge6.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge6.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param3 <- 2                            #MA-plot描画時の倍率変化の閾値を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#前処理(低発現遺伝子のフィルタリング)
group <- factor(data.cl)               #factor形式に変更
d <- DGEList(counts=data,group=group)  #DGEListオブジェクトを作成してdに格納
keep <- filterByExpr(d)                #低発現遺伝子のフィルタリング
#d <- d[keep,,keep.lib.sizes=FALSE]    #低発現遺伝子のフィルタリング

#本番
d <- calcNormFactors(d)                #TMM正規化を実行
design <- model.matrix(~group)         #デザイン行列を作成
d <- estimateDisp(d, design)           #モデル構築
fit <- glmQLFit(d, design)             #モデル構築
out <- glmQLFTest(fit, coef=2)         #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#MA-plotを描画
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hoge <- rownames(data)[abs(out$table$logFC) >= log2(param3)]#param3で指定した倍率変化の閾値を満たす遺伝子名情報をhogeに格納
plotSmear(d, de.tags=hoge)             #MA-plotの基本形に加え、発現変動遺伝子に相当する
dev.off()                              #おまじない
length(hoge)                           #発現変動遺伝子数を表示
length(hoge)/nrow(data)                #発現変動遺伝子の全遺伝子数に占める割合を表示
	

7. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

MA-plotも描き、FDR < 0.01を満たすものを赤色で示したMA-plotをファイルに保存するやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge7.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge7.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.01                      #MA-plot描画時のfalse discovery rate (FDR)閾値を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#前処理(低発現遺伝子のフィルタリング)
group <- factor(data.cl)               #factor形式に変更
d <- DGEList(counts=data,group=group)  #DGEListオブジェクトを作成してdに格納
keep <- filterByExpr(d)                #低発現遺伝子のフィルタリング
#d <- d[keep,,keep.lib.sizes=FALSE]    #低発現遺伝子のフィルタリング

#本番
d <- calcNormFactors(d)                #TMM正規化を実行
design <- model.matrix(~group)         #デザイン行列を作成
d <- estimateDisp(d, design)           #モデル構築
fit <- glmQLFit(d, design)             #モデル構築
out <- glmQLFTest(fit, coef=2)         #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
#write.table(tmp[order(ranking),], out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存(発現変動順にソートしたいとき)

#MA-plotを描画
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
hoge <- rownames(data)[q.value < param_FDR]#指定したFDRの閾値を満たす遺伝子名情報をhogeに格納
plotSmear(d, de.tags=hoge)             #MA-plotの基本形に加え、発現変動遺伝子に相当する
dev.off()                              #おまじない
length(hoge)                           #発現変動遺伝子数を表示
length(hoge)/nrow(data)                #発現変動遺伝子の全遺伝子数に占める割合を表示
	

8. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

MA-plotも描き、FDR < 0.01を満たすものを赤色で示したMA-plotをファイルに保存するやり方です。 基本は7と同じで、MA-plotの描画をplotSmear関数を用いないで行うやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge8.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge8.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.01                      #MA-plot描画時のfalse discovery rate (FDR)閾値を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#前処理(低発現遺伝子のフィルタリング)
group <- factor(data.cl)               #factor形式に変更
d <- DGEList(counts=data,group=group)  #DGEListオブジェクトを作成してdに格納
keep <- filterByExpr(d)                #低発現遺伝子のフィルタリング
#d <- d[keep,,keep.lib.sizes=FALSE]    #低発現遺伝子のフィルタリング

#本番
d <- calcNormFactors(d)                #TMM正規化を実行
design <- model.matrix(~group)         #デザイン行列を作成
d <- estimateDisp(d, design)           #モデル構築
fit <- glmQLFit(d, design)             #モデル構築
out <- glmQLFTest(fit, coef=2)         #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPM正規化後のデータでM-A plotを描画(するための基礎情報取得)
norm_f_RPM <- 1000000/colSums(data)    #各列に対して掛ける正規化係数を計算してnorm_f_RPMに格納
RPM <- sweep(data, 2, norm_f_RPM, "*") #norm_f_RPMを各列に掛けた結果をRPMに格納
data <- RPM                            #RPMをdataに格納
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (q.value < param_FDR)      #指定した閾値未満のものの位置情報をDEG_posiに格納

#MA-plotを描画(本番)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A=(log2(G2)+log2(G1))/2", ylab="M=log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
points(x_axis[DEG_posi], y_axis[DEG_posi], col="red", pch=20, cex=0.1)#DEGを赤色にしている
dev.off()                              #おまじない
sum(DEG_posi)                          #発現変動遺伝子数を表示
sum(DEG_posi)/nrow(data)               #発現変動遺伝子の全遺伝子数に占める割合を表示
	

9. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

MA-plotも描き、FDR < 0.01を満たすものを赤色で示したMA-plotをファイルに保存するやり方です。 基本は8と同じで、MA-plotの描画をRPMではなくTMM正規化後のデータで行うやり方です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge9.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge9.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.01                      #MA-plot描画時のfalse discovery rate (FDR)閾値を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#前処理(低発現遺伝子のフィルタリング)
group <- factor(data.cl)               #factor形式に変更
d <- DGEList(counts=data,group=group)  #DGEListオブジェクトを作成してdに格納
keep <- filterByExpr(d)                #低発現遺伝子のフィルタリング
#d <- d[keep,,keep.lib.sizes=FALSE]    #低発現遺伝子のフィルタリング

#本番
d <- calcNormFactors(d)                #TMM正規化を実行
design <- model.matrix(~group)         #デザイン行列を作成
d <- estimateDisp(d, design)           #モデル構築
fit <- glmQLFit(d, design)             #モデル構築
out <- glmQLFTest(fit, coef=2)         #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPM正規化後のデータでM-A plotを描画(するための基礎情報取得)
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化係数を計算
norm_f_TMM <- d$samples$norm.factors   #TMM正規化係数の情報を抽出してnorm_f_TMMに格納
names(norm_f_TMM) <- colnames(data)    #norm_f_TMMのnames属性をcolnames(data)で与えている
effective_libsizes <- colSums(data) * norm_f_TMM#effective library sizesというのはlibrary sizesに(TMM)正規化係数を掛けたものなのでそれを計算した結果をeffective_libsizesに格納
RPM_TMM <- sweep(data, 2, 1000000/effective_libsizes, "*")#元のカウントデータをeffective_libsizesで割り(RPMデータと同程度の数値分布にしたいので)1000000を掛けた正規化後のデータをRPM_TMMに格納

data <- RPM_TMM                        #RPM_TMMをdataに格納
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
DEG_posi <- (stat_edgeR < param_FDR)      #指定した閾値未満のものの位置情報をDEG_posiに格納

#MA-plotを描画(本番)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A=(log2(G2)+log2(G1))/2", ylab="M=log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
points(x_axis[DEG_posi], y_axis[DEG_posi], col="red", pch=20, cex=0.1)#DEGを赤色にしている
dev.off()                              #おまじない
sum(DEG_posi)                          #発現変動遺伝子数を表示
sum(DEG_posi)/nrow(data)               #発現変動遺伝子の全遺伝子数に占める割合を表示
	

解析 | 発現変動 | 2群間 | 対応なし | 複製あり | WAD(Kadota_2008)

TCCパッケージを用いてiDEGES/edgeR正規化を行ったデータを入力として、 WAD法(Kadota et al., 2008)を適用して発現変動遺伝子(Differentially Expressed Genes; DEGs)検出を行うやり方を示します。 WAD法は統計的手法ではない(ヒューリスティックな方法)ので、出力ファイル中にp-valueやq-valueは存在しません。 それゆえ、FDR閾値を満たす遺伝子数、という概念もありません。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="wad")#DEG検出を実行した結果をtccに格納
statistic <- tcc$stat$testStat         #WAD統計量を抽出した結果をstatisticに格納
ranking <- tcc$stat$rank               #WAD統計量でランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, statistic, ranking)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

1.と基本的に同じで、DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_DEG <- 1:2000                    #DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="wad")#DEG検出を実行した結果をtccに格納
statistic <- tcc$stat$testStat         #WAD統計量を抽出した結果をstatisticに格納
ranking <- tcc$stat$rank               #WAD統計量でランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, statistic, ranking)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

2.と基本的に同じで、iDEGES/edgeR正規化後のデータを明示的に取得して、 estimateDE関数ではなくTCCパッケージ中のWAD関数を用いてWAD法を実行するやり方です。 WAD法はlog2変換後のデータを入力とすることを前提としており、発現レベルに相当する数値が1未満のものを1に変換してからlogをとっています。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_DEG <- 1:2000                    #DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
head(normalized)                       #確認してるだけです

#本番(DEG検出)
out <- WAD(normalized, data.cl, logged=F, floor=1)#DEG検出を実行した結果をtccに格納
ranking <- out$rank                    #WAD統計量でランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, out)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

解析 | 発現変動 | 2群間 | 対応なし | 複製あり | varSelRF(Diaz-Uriarte_2007)

varSelRFパッケージを用いて2群の分類。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し、以下をコピペ

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に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(varSelRF)                      #varSelRFパッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番
out <- varSelRF(t(data), factor(data.cl))#RFをデフォルトで実行した結果をoutに格納
out$selected.vars                   #重要な遺伝子を表示
	

解析 | 発現変動 | 2群間 | 対応なし | 複製なし | について

以下でも記載していますが、 TCCは複製なしデータの場合には内部的にDESeq2をこれまで利用してきました。 しかしDESeq2が2018年10月頃リリース版で非対応となるらしいので、TCCもDESeqに切り替える予定です。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 発現変動 | 2群間 | 対応なし | 複製なし | CORNAS(Low_2017)

CORNASを用いるやり方を示します。 結構設定が面倒ですので、とりあえずCORNASの例題を示します。 githubは応答がないなどとよく言われて取り扱いづらいので、一旦全部ダウンロードしたものを改めてこのサイト上で提供しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. test4_kidneyliver_example.tab)の場合:

Marioni et al., Genome Res., 2008のkidney vs. liverのカウントデータです。 configファイル(cornas.config.test4)も入力として利用します。 2018年7月19日現在、outオブジェクトにcornas関数実行結果がうまく格納されていません...。

in_f1 <- "test4_kidneyliver_example.tab"#入力ファイル名を指定してin_f1に格納(発現データファイル)
in_f2 <- "cornas.config.test4"         #入力ファイル名を指定してin_f2に格納(configファイル)
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納

#必要なパッケージなどをロード
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R_seq/CORNAS-master/CORNAS.R")  #パッケージの読み込み

#本番(CORNAS実行)
out <- cornas(in_f2, in_f1)           #CORNASを実行

#ファイルに保存(テキストファイル)
write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

解析 | 発現変動 | 2群間 | 対応なし | 複製なし | LPEseq(Gim_2016)

LPEseqを用いるやり方を示します。 It is freely downloadable from our website (...) or Bioconductor.と7ページ目に書かれていますが、2018年7月現在Bioconductorでは提供されていません。 パッケージのインストールがまだの場合は、最初に例題0のやり方に従ってインストールをしておく必要があります。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

0. パッケージのインストール:

最新版のファイル(2018年12月現在はLPEseq_v0.99.1.tar.gz)を 作業ディレクトリ上に予めダウンロードしておいてから、下記をコピペしてください。

source("http://statgen.snu.ac.kr/software/LPEseq/LPEseq.R")
install.packages("LPEseq_v0.99.1.tar.gz", repos=NULL, type="source")
    

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であることが既知です。 5% FDR閾値を満たす遺伝子数は2,317個、AUCは0.6397909であることがわかります。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge1.txt"                  #出力ファイル名を指定してout_f1に格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(LPEseq)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#データの正規化(DESeqと似た方法らしい)
normalized <- LPEseq.normalise(data)   #正規化を実行

#本番(DEG検出)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
G1 <- normalized[, data.cl==1]         #G1群のデータを抽出
G2 <- normalized[, data.cl==2]         #G2群のデータを抽出
out <- LPEseq.test(G1, G2, d=1)        #LPEseq法を実行(反復ありの場合はd=2)

p.value <- out$p.value                 #p-valueをp.valueに格納
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- out$q.value                 #q-valueをq.valueに格納
q.value[is.na(q.value)] <- 1           #NAを1に置換している
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法; ただの検証用)
library(ROC)                           #パッケージの読み込み
param_DEG <- 1:2000                    #DEGの位置を指定
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

解析 | 発現変動 | 2群間 | 対応なし | 複製なし | NOISeq(Tarazona_2015)

NOISeqを用いるやり方を示します。 Tarazona et al., Genome Res., 2011が原著論文ですが、2015年の論文もあったのでそちらにしています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

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であることが既知です。 param_thresは(1 - p-value)ではないとマニュアル中で強調されています。 この閾値を満たす遺伝子数は1,834個、AUC = 0.7811677でした。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge1.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_thres <- 0.9                     #DEGと判定する閾値(DEGの確率に相当)を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(NOISeq)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(ExpressionSetオブジェクトの作成; )
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
myfactors <- data.frame(comp=data.cl)  #サンプルラベル情報をデータフレーム形式に変換
eset <- readData(data=data, factors=myfactors)#ExpressionSetオブジェクトを作成

#本番(DEG検出)
out <- noiseq(eset, factor="comp",     #NOISeqを実行
              k=NULL, norm="tmm", pnr=0.2, nss=5,#NOISeqを実行
              v=0.02, lc=1, replicates="no")#NOISeqを実行
prob <- out@results[[1]]$prob          #prob情報をprobに格納(高いほどよりDEだが、1 - pvalueではないと強調されている)
prob[is.na(prob)] <- 0                 #NAを0に置換している
ranking <- rank(-prob)                 #probの高い順にランキングした結果をrankingに格納
sum(prob > param_thres)                #指定した閾値を満たす遺伝子数を表示
hoge <- degenes(out, q=param_thres, M=NULL)#指定した閾値を満たす遺伝子数を表示(NOISeqマニュアルと同じやり方)

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, prob, ranking)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法; ただの検証用)
library(ROC)                           #パッケージの読み込み
param_DEG <- 1:2000                    #DEGの位置を指定
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

解析 | 発現変動 | 2群間 | 対応なし | 複製なし | DESeq2(Love_2014)

DESeq2パッケージ (Love et al., Genome Biol., 2014)を用いるやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

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であることが既知です。 DESeq2パッケージ中の記述方式です plotMAのところでエラーが出てM-A plotは描画できません(DESeq2 ver. 1.12.0で2016年5月22日に確認)。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge1.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge1.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(DESeq2)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(DESeqDataSetオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
colData <- data.frame(condition=as.factor(data.cl))#condition列にクラスラベル情報を格納したcolDataオブジェクトを作成
d <- DESeqDataSetFromMatrix(countData=data, colData=colData, design=~condition)#DESeqDataSetオブジェクトdの作成

#本番(DEG検出)
d <- DESeq(d)                         #DESeq2を実行
#d <- estimateSizeFactors(d)           #正規化を実行した結果をdに格納
##sizeFactors(d) <- sizeFactors(d)/mean(sizeFactors(d))#size factorsをさらに正規化(TCCは内部的にこれを行っている)
#d <- estimateDispersions(d)           #モデル構築(ばらつきの程度を見積もっている)
#d <- nbinomLRT(d, full= ~condition, reduced= ~1)#検定

tmp <- results(d)                      #実行結果を抽出
p.value <- tmp$pvalue                  #p-valueをp.valueに格納
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- tmp$padj                    #adjusted p-valueをq.valueに格納
q.value[is.na(q.value)] <- 1           #NAを1に置換している
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示
sum(p.adjust(p.value, method="BH") < param_FDR)#FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotMA(d)                              #描画
dev.off()                              #おまじない

#AUC値を計算(高いほどよい方法; ただの検証用)
library(ROC)                           #パッケージの読み込み
param_DEG <- 1:2000                    #DEGの位置を指定
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算

#様々なFDR閾値を満たす遺伝子数を表示
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
sum(q.value < 0.50)                    #FDR = 0.50 (q-value < 0.50)を満たす遺伝子数を表示
sum(q.value < 0.70)                    #FDR = 0.70 (q-value < 0.70)を満たす遺伝子数を表示
sum(q.value < 0.80)                    #FDR = 0.80 (q-value < 0.80)を満たす遺伝子数を表示
sum(p.adjust(p.value, method="BH") < 0.05)#FDR閾値(q.value < 0.05)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.10)#FDR閾値(q.value < 0.10)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.30)#FDR閾値(q.value < 0.30)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.50)#FDR閾値(q.value < 0.50)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.70)#FDR閾値(q.value < 0.70)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.80)#FDR閾値(q.value < 0.80)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)

    

2. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

1.と基本的に同じですが、TCCパッケージ中の記述方式です。 calcNormFactors関数実行部分で、iteration=0にしています。 これはTCCの長所である頑健な正規化パイプラインの機能をオフにすることに相当し、結果的にデフォルトのDESeq2パイプラインが走るようにしています。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge2.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge2.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq2", test.method="deseq2",#正規化を実行した結果をtccに格納
                       iteration=0, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq2", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示
sum(p.adjust(tcc$stat$p.value, method="BH") < param_FDR)#FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(4, 4, 0, 0))                 #余白を指定
plot(tcc, FDR=param_FDR, main="",      #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR=", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない

#AUC値を計算(高いほどよい方法; ただの検証用)
library(ROC)                           #パッケージの読み込み
param_DEG <- 1:2000                    #DEGの位置を指定
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-result$rank))#AUC計算

#様々なFDR閾値を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.05)           #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.50)           #FDR = 0.50 (q-value < 0.50)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.70)           #FDR = 0.70 (q-value < 0.70)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.80)           #FDR = 0.80 (q-value < 0.80)を満たす遺伝子数を表示
sum(p.adjust(tcc$stat$p.value, method="BH") < 0.05)#FDR閾値(q.value < 0.05)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(tcc$stat$p.value, method="BH") < 0.10)#FDR閾値(q.value < 0.10)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(tcc$stat$p.value, method="BH") < 0.30)#FDR閾値(q.value < 0.30)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(tcc$stat$p.value, method="BH") < 0.50)#FDR閾値(q.value < 0.50)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(tcc$stat$p.value, method="BH") < 0.70)#FDR閾値(q.value < 0.70)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(tcc$stat$p.value, method="BH") < 0.80)#FDR閾値(q.value < 0.80)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
    

3. ReCountのmaqc (pooled)データ( maqc_pooledreps_count_table.txt)の場合:

52,580 genes×2 samplesのカウントデータ(G1群1サンプル vs. G2群1サンプル)です。 DESeq2パッケージ中の記述方式です plotMAのところでエラーが出てM-A plotは描画できません(DESeq2 ver. 1.12.0で2016年5月22日に確認)。

in_f <- "maqc_pooledreps_count_table.txt"#入力ファイル名を指定してin_fに格納
out_f1 <- "hoge3.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge3.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(DESeq2)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(DESeqDataSetオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
colData <- data.frame(condition=as.factor(data.cl))#condition列にクラスラベル情報を格納したcolDataオブジェクトを作成
d <- DESeqDataSetFromMatrix(countData=data, colData=colData, design=~condition)#DESeqDataSetオブジェクトdの作成

#本番(DEG検出)
d <- DESeq(d)                         #DESeq2を実行
#d <- estimateSizeFactors(d)           #正規化を実行した結果をdに格納
##sizeFactors(d) <- sizeFactors(d)/mean(sizeFactors(d))#size factorsをさらに正規化(TCCは内部的にこれを行っている)
#d <- estimateDispersions(d)           #モデル構築(ばらつきの程度を見積もっている)
#d <- nbinomLRT(d, full= ~condition, reduced= ~1)#検定

tmp <- results(d)                      #実行結果を抽出
p.value <- tmp$pvalue                  #p-valueをp.valueに格納
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- tmp$padj                    #adjusted p-valueをq.valueに格納
q.value[is.na(q.value)] <- 1           #NAを1に置換している
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示
sum(p.adjust(p.value, method="BH") < param_FDR)#FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotMA(d)                              #描画
dev.off()                              #おまじない

#様々なFDR閾値を満たす遺伝子数を表示
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
sum(q.value < 0.50)                    #FDR = 0.50 (q-value < 0.50)を満たす遺伝子数を表示
sum(q.value < 0.70)                    #FDR = 0.70 (q-value < 0.70)を満たす遺伝子数を表示
sum(q.value < 0.80)                    #FDR = 0.80 (q-value < 0.80)を満たす遺伝子数を表示
sum(p.adjust(p.value, method="BH") < 0.05)#FDR閾値(q.value < 0.05)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.10)#FDR閾値(q.value < 0.10)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.30)#FDR閾値(q.value < 0.30)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.50)#FDR閾値(q.value < 0.50)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.70)#FDR閾値(q.value < 0.70)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.80)#FDR閾値(q.value < 0.80)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
    

4. ReCountのmaqc (pooled)データ( maqc_pooledreps_count_table.txt)の場合:

3.と基本的に同じですが、発現変動順にソートしています。 plotMAのところでエラーが出てM-A plotは描画できません(DESeq2 ver. 1.12.0で2016年5月22日に確認)。

in_f <- "maqc_pooledreps_count_table.txt"#入力ファイル名を指定してin_fに格納
out_f1 <- "hoge4.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge4.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(DESeq2)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(DESeqDataSetオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
colData <- data.frame(condition=as.factor(data.cl))#condition列にクラスラベル情報を格納したcolDataオブジェクトを作成
d <- DESeqDataSetFromMatrix(countData=data, colData=colData, design=~condition)#DESeqDataSetオブジェクトdの作成

#本番(DEG検出)
d <- DESeq(d)                         #DESeq2を実行
#d <- estimateSizeFactors(d)           #正規化を実行した結果をdに格納
##sizeFactors(d) <- sizeFactors(d)/mean(sizeFactors(d))#size factorsをさらに正規化(TCCは内部的にこれを行っている)
#d <- estimateDispersions(d)           #モデル構築(ばらつきの程度を見積もっている)
#d <- nbinomLRT(d, full= ~condition, reduced= ~1)#検定
normalized <- counts(d, normalized=T)  #正規化後のデータを取り出してnormalizedに格納

tmp <- results(d)                      #実行結果を抽出
p.value <- tmp$pvalue                  #p-valueをp.valueに格納
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- tmp$padj                    #adjusted p-valueをq.valueに格納
q.value[is.na(q.value)] <- 1           #NAを1に置換している
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示
sum(p.adjust(p.value, method="BH") < param_FDR)#FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), normalized, p.value, q.value, ranking)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(ranking),]            #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotMA(d)                              #描画
dev.off()                              #おまじない

#様々なFDR閾値を満たす遺伝子数を表示
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
sum(q.value < 0.50)                    #FDR = 0.50 (q-value < 0.50)を満たす遺伝子数を表示
sum(q.value < 0.70)                    #FDR = 0.70 (q-value < 0.70)を満たす遺伝子数を表示
sum(q.value < 0.80)                    #FDR = 0.80 (q-value < 0.80)を満たす遺伝子数を表示
sum(p.adjust(p.value, method="BH") < 0.05)#FDR閾値(q.value < 0.05)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.10)#FDR閾値(q.value < 0.10)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.30)#FDR閾値(q.value < 0.30)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.50)#FDR閾値(q.value < 0.50)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.70)#FDR閾値(q.value < 0.70)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.80)#FDR閾値(q.value < 0.80)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
    

5. ReCountのmaqc (pooled)データ( maqc_pooledreps_count_table.txt)の場合:

4.と基本的に同じですが、TCCパッケージ中の記述方式です。 calcNormFactors関数実行部分で、iteration=0にしています。 これはTCCの長所である頑健な正規化パイプラインの機能をオフにすることに相当し、結果的にデフォルトのDESeq2パイプラインが走るようにしています。 正規化後のデータ、発現変動順にソートして出力しています。M-A plotのところも変更しています。

in_f <- "maqc_pooledreps_count_table.txt"#入力ファイル名を指定してin_fに格納
out_f1 <- "hoge5.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge5.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq2", test.method="deseq2",#正規化を実行した結果をtccに格納
                       iteration=0, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq2", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(4, 4, 0, 0))                 #余白を指定
plot(tcc, FDR=param_FDR, main="",      #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR =", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない

#様々なFDR閾値を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.05)           #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.50)           #FDR = 0.50 (q-value < 0.50)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.70)           #FDR = 0.70 (q-value < 0.70)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.80)           #FDR = 0.80 (q-value < 0.80)を満たす遺伝子数を表示
sum(p.adjust(tcc$stat$p.value, method="BH") < 0.05)#FDR閾値(q.value < 0.05)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(tcc$stat$p.value, method="BH") < 0.10)#FDR閾値(q.value < 0.10)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(tcc$stat$p.value, method="BH") < 0.30)#FDR閾値(q.value < 0.30)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(tcc$stat$p.value, method="BH") < 0.50)#FDR閾値(q.value < 0.50)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(tcc$stat$p.value, method="BH") < 0.70)#FDR閾値(q.value < 0.70)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(tcc$stat$p.value, method="BH") < 0.80)#FDR閾値(q.value < 0.80)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)

	

解析 | 発現変動 | 2群間 | 対応なし | 複製なし | TCC (Sun_2013)

TCCを用いたやり方を示します。 2016年5月21日に、TCC原著論文(Sun et al., BMC Bioinformatics, 2013)発表時の推奨解析パイプラインである、 iDEGES/DESeq-DESeqから、iDEGES/DESeq2-DESeq2に切り替えていましたが、2019年7月11日に元に戻しました。理由はDESeq2を使うとエラーが出るようになったからです。その後DESeqもBioconductorから削除されたので、2021年6月1日に内部的に利用する関数をedgeRパッケージのものに切り替えました。さらにその後、このスクリプトも動かなくなっていることを2022年4月28日に確認しました。現状それ以外の手段はありませんので、実行不可ということになります(辛川 涼眸 氏提供情報)。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
head(result, n=3)                      #確認してるだけです(最初の3遺伝子分を表示)
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画したり、 DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。 FDR閾値を満たす遺伝子数は0個、AUC = 0.798375であることが分かります。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_DEG <- 1:2000                    #DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
head(result, n=3)                      #確認してるだけです(最初の3遺伝子分を表示)
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示
ranking <- rank(tcc$stat$p.value)      #p-valueでランキングした結果をrankingに格納

#ファイルに保存
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#正規化後のデータでM-A plotを描画
plot(tcc, FDR=param_FDR)               #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

3. サンプルデータ8の26,221 genes×6 samplesのリアルデータ(data_arab.txt; mock 3サンプル vs. hrcc 3サンプル)の場合:

mock群の1番目(mock1)と3番目(mock3)のサブセットを抽出して複製なしデータとして取り扱っています。

「FDR閾値を満たすもの」と「fold-change閾値を満たすもの」それぞれのM-A plotを作成しています。

in_f <- "data_arab.txt"                #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge3.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge3_FDR.png"              #出力ファイル名を指定してout_f2に格納
out_f3 <- "hoge3_FC.png"               #出力ファイル名を指定してout_f3に格納
param_subset <- c(1, 3)                #取り扱いたいサブセット情報を指定
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_FC <- 2                          #fold-change閾値(param_FC倍)を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <-data[,param_subset]             #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
head(result, n=3)                      #確認してるだけです(最初の3遺伝子分を表示)
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot; FDR)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR, xlim=c(-3, 13), ylim=c(-10, 10))#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("bottomright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示

#ファイルに保存(M-A plot; fold-change)
param_FC <- 2                          #fold-change閾値(param_FC倍)を指定
M <- getResult(tcc)$m.value            #M-A plotのM値を抽出
hoge <- rep(1, length(M))              #初期値を1にしたベクトルhogeを作成
hoge[abs(M) > log2(param_FC)] <- 2     #条件を満たす位置に2を代入
cols <- c("black", "magenta")          #色情報を指定してcolsに格納

png(out_f3, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, col=cols, col.tag=hoge, xlim=c(-3, 13), ylim=c(-10, 10))#M-A plotを描画
legend("bottomright", c(paste("DEG(", param_FC, "-fold)", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(abs(M) > log2(16))                 #16倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(8))                  #8倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(4))                  #4倍以上発現変動する遺伝子数を表示
sum(abs(M) > log2(2))                  #2倍以上発現変動する遺伝子数を表示
	

4. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

1.と基本的に同じで、出力のテキストファイルが正規化前のデータではなく正規化後のデータになっていて、発現変動順にソートしたものになっています。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge4.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge4.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR)               #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

5. ReCountのmaqc (pooled)データ( maqc_pooledreps_count_table.txt)の場合:

52,580 genes×2 samplesのカウントデータ(G1群1サンプル vs. G2群1サンプル)です。 例題4と基本的に同じで、正規化後のデータ、発現変動順にソートして出力しています。M-A plotのところも変更しています。

in_f <- "maqc_pooledreps_count_table.txt"#入力ファイル名を指定してin_fに格納
out_f1 <- "hoge5.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge5.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 380)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(4, 4, 0, 0))                 #余白を指定
plot(tcc, FDR=param_FDR, main="",      #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR =", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
	

6. サンプルデータ42の20,689 genes×18 samplesのリアルカウントデータ (sample_blekhman_18.txt)の場合:

ヒトHomo sapiens; HS)のメス3サンプル(HSF1-3)とオス3サンプル(HSM1-3), チンパンジー(Pan troglodytes; PT)のメス3サンプル(PTF1-3)とオス3サンプル(PTM1-3), アカゲザル(Rhesus macaque; RM)のメス3サンプル(RMF1-3)とオス3サンプル(RMM1-3)の並びになっています。 つまり、以下のような感じです。FはFemale(メス)、MはMale(オス)を表します。

ヒト(1-6列目): HSF1, HSF2, HSF3, HSM1, HSM2, and HSM3

チンパンジー(7-12列目): PTF1, PTF2, PTF3, PTM1, PTM2, and PTM3

アカゲザル(13-18列目): RMF1, RMF2, RMF3, RMM1, RMM2, and RMM3

ここでは、ヒト1サンプル(G1群:HSF1) vs. アカゲザル1サンプル(G2群:RMF1)の比較を行っています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge6.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge6.png"                  #出力ファイル名を指定してout_f2に格納
param_subset <- c(1, 13)               #取り扱いたいサブセット情報を指定
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.10                      #false discovery rate (FDR)閾値を指定
param_fig <- c(430, 350)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
dim(data)                              #行数と列数を表示
head(data)                             #最初の6行分を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR, xlim=c(-2, 17), ylim=c(-10, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR =", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
	

7. サンプルデータ42の20,689 genes×18 samplesのリアルカウントデータ (sample_blekhman_18.txt)の場合:

例題6と基本的に同じで、ヒト1サンプル(G1群:HSF1) vs. チンパンジー1サンプル(G2群:PTF1)の比較を行っています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge7.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge7.png"                  #出力ファイル名を指定してout_f2に格納
param_subset <- c(1, 7)                #取り扱いたいサブセット情報を指定
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.10                      #false discovery rate (FDR)閾値を指定
param_fig <- c(430, 350)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
dim(data)                              #行数と列数を表示
head(data)                             #最初の6行分を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR, xlim=c(-2, 17), ylim=c(-10, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR =", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
	

8. サンプルデータ42の20,689 genes×18 samplesのリアルカウントデータ (sample_blekhman_18.txt)の場合:

例題6と基本的に同じで、ヒト1サンプル(G1群:HSF1) vs. ヒト1サンプル(G2群:HSM1)の比較を行っています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge8.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge8.png"                  #出力ファイル名を指定してout_f2に格納
param_subset <- c(1, 4)                #取り扱いたいサブセット情報を指定
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.10                      #false discovery rate (FDR)閾値を指定
param_fig <- c(430, 350)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
dim(data)                              #行数と列数を表示
head(data)                             #最初の6行分を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(tcc, FDR=param_FDR, xlim=c(-2, 17), ylim=c(-10, 11.5),#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex=0.8, cex.lab=1.2,             #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     cex.axis=1.2, main="",            #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
     xlab="A = (log2(G2) + log2(G1))/2",#閾値を満たすDEGをマゼンタ色にして描画
     ylab="M = log2(G2) - log2(G1)")   #閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR =", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20, cex=1.2)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
	

解析 | 発現変動 | 2群間 | 対応なし | 複製なし | DESeq (Anders_2010)

Anders and Huberの(AH)正規化(Anders_2010)を実行したのち、 DESeqパッケージ中のnegative binomial testで発現変動遺伝子(Differentially Expressed Genes; DEGs)検出を行う DESeqパッケージ内のオリジナルの手順を示します。 このパッケージはもはや存在しないので動きません(2021.06.01追加)。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(DESeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番(Anders and Huberの(AH)正規化)
cds <- newCountDataSet(data, data.cl)  #CountDataSetオブジェクトを作成してcdsに格納
cds <- estimateSizeFactors(cds)        #size factorを計算し、結果をcdsに格納
sizeFactors(cds)                       #これがDESeqのsize factorsです(1.049957, 0.952420)

#本番(DEG検出)
cds <- estimateDispersions(cds, method="blind", sharingMode="fit-only")#モデル構築
out <- nbinomTest(cds, 1, 2)           #発現変動の各種統計量を計算し、結果をoutに格納
p.value <- out$pval                    #p-valueをp.valueに格納
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- out$padj                    #adjusted p-valueをq.valueに格納
q.value[is.na(q.value)] <- 1           #NAを1に置換している
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
logratio <- out$log2FoldChange         #log2(B/A)統計量をlogratioに格納
head(out, n=3)                         #確認してるだけです(最初の3遺伝子分を表示)
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data, p.value, q.value, ranking, logratio)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

1.と基本的に同じで、param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画したり、 このDEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。 AUC = 0.7811263ですね。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_DEG <- 1:2000                    #DEGの位置を指定
param_FDR <- 0.1                       #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(DESeq)                         #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番(Anders and Huberの(AH)正規化)
cds <- newCountDataSet(data, data.cl)  #CountDataSetオブジェクトを作成してcdsに格納
cds <- estimateSizeFactors(cds)        #size factorを計算し、結果をcdsに格納
sizeFactors(cds)                       #これがDESeqのsize factorsです(1.049957, 0.952420)

#本番(DEG検出)
cds <- estimateDispersions(cds, method="blind", sharingMode="fit-only")#モデル構築
out <- nbinomTest(cds, 1, 2)           #発現変動の各種統計量を計算し、結果をoutに格納
p.value <- out$pval                    #p-valueをp.valueに格納
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- out$padj                    #adjusted p-valueをq.valueに格納
q.value[is.na(q.value)] <- 1           #NAを1に置換している
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
logratio <- out$log2FoldChange         #log2(B/A)統計量をlogratioに格納
head(out, n=3)                         #確認してるだけです(最初の3遺伝子分を表示)
sum(q.value < param_FDR)                 #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data, p.value, q.value, ranking, logratio)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#正規化後のデータでM-A plotを描画
plotMA(out)                            #指定したFDR閾値を満たすDEGを赤としてM-A plotを描画

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

3. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

TCCパッケージを用いて同様の解析を行うやり方です。 出力ファイルのa.value列がlogratioに相当し、q.value列上でFDR閾値を決めます。(内部的な細かい話ですが...)estimateDispersions関数実行時に、fitType="parametric"を最初に試して、エラーが出たら自動的に"local"に変更しています。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.10                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc,iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, FDR=param_FDR)  #DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
head(result, n=3)                      #確認してるだけです(最初の3遺伝子分を表示)
sum(tcc$stat$q.value < param_FDR)      #指定したFDR閾値を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

TCCパッケージを用いて同様の解析を行うやり方です。 出力ファイルのa.value列がlogratioに相当し、q.value列上でFDR閾値を決めます。(内部的な細かい話ですが...)estimateDispersions関数実行時に、fitType="parametric"を最初に試して、 エラーが出たら自動的に"local"に変更しています。param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画したり、 このDEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.10                      #false discovery rate (FDR)閾値を指定
param_DEG <- 1:2000                    #DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc,iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, FDR=param_FDR)  #DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
head(result, n=3)                      #確認してるだけです(最初の3遺伝子分を表示)
sum(tcc$stat$q.value < param_FDR)      #指定したFDR閾値を満たす遺伝子数を表示
ranking <- tcc$stat$rank               #順位情報をrankingに格納

#ファイルに保存
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#正規化後のデータでM-A plotを描画
plot(tcc, FDR=param_FDR)               #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

解析 | 発現変動 | 2群間 | 対応なし | 複製なし | edgeR(Robinson_2010)

edgeRパッケージを用いて発現変動遺伝子(Differentially Expressed Genes; DEGs)検出を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。estimateGLMCommonDisp関数実行部分のオプションは、 edgeRUsersGuide.pdfの 反復なしの場合(2.11 What to do if you have no replicates)の、選択肢3に相当します。 verbose=TRUEは、計算したBCV値を表示するオプションです。common.dispersion = 0.45507、BCV = 0.6746、AUC = 0.771165ですね。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化を実行
d <- estimateGLMCommonDisp(d, method="deviance",#モデル構築(common Dispersionを算出)
                           robust=TRUE, subset=NULL, verbose=TRUE)#モデル構築(common Dispersionを算出)
out <- exactTest(d)                    #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法; ただの検証用)
library(ROC)                           #パッケージの読み込み
param_DEG <- 1:2000                    #DEGの位置を指定
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

2. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

例題1とほとんど同じで、estimateGLMCommonDisp関数実行部分のオプションが若干異なります。 common.dispersion = 0.4310842、BCV = 0.6566、AUC = 0.7726519ですね。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化を実行
d <- estimateGLMCommonDisp(d, verbose=TRUE)#モデル構築(common Dispersionを算出)
out <- exactTest(d)                    #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法; ただの検証用)
library(ROC)                           #パッケージの読み込み
param_DEG <- 1:2000                    #DEGの位置を指定
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

3. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

non-DEGの正しい情報を与えることで、common.dispersion値が正しく小さい値になるかどうかを試すコードです。 estimateDisp関数実行部分のオプションは、 edgeRUsersGuide.pdfの 反復なしの場合(2.11 What to do if you have no replicates)の、選択肢4に相当します。 common.dispersion = 0.2544829、BCV = 0.504463、AUC = 0.7784515ですね。 non-DEGの正しい情報を与えているのでうまくいって当然ではありますが、 反復なしデータでもFDR0.05を満たすのが53個得られていることがわかります。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番(正規化係数取得)
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化を実行

#本番(common.dispersion情報取得)
d1 <- d                                #d1として取り扱う
d1$samples$group <- 1                  #全サンプルを同一群として取り扱う
d1 <- estimateDisp(d1[2001:10000, ],   #モデル構築(common Dispersionを算出)
                   trend="none", tagwise=FALSE, verbose=TRUE)#モデル構築(common Dispersionを算出)
d$common.dispersion <- d1$common.dispersion#一部のデータで算出したcommon.dispersionを代入
d$common.dispersion                    #common.dispersionを表示
sqrt(d$common.dispersion)              #BCV(Biological Coefficient of Variation; common.dispersionの平方根に相当)を表示

#本番(検定)
out <- exactTest(d)                    #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法; ただの検証用)
library(ROC)                           #パッケージの読み込み
param_DEG <- 1:2000                    #DEGの位置を指定
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

4. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

例題3と基本的に同じですが、estimateDisp関数ではなく、estimateGLMCommonDisp関数を使っています。 common.dispersion = 0.24691、BCV = 0.4969、AUC = 0.7783244ですね。 例題3と同じく、反復なしデータでもFDR0.05を満たすのが64個得られていることがわかります。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- as.matrix(data)                #データの型をmatrixにしている
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番
d <- DGEList(counts=data,group=data.cl)#DGEListオブジェクトを作成してdに格納
d <- calcNormFactors(d)                #TMM正規化を実行
d1 <- estimateGLMCommonDisp(d[2001:10000, ], verbose=TRUE)#モデル構築(common Dispersionを算出)
d$common.dispersion <- d1$common.dispersion#一部のデータで算出したcommon.dispersionを代入

out <- exactTest(d)                    #exact test (正確確率検定)で発現変動遺伝子を計算した結果をoutに格納
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法; ただの検証用)
library(ROC)                           #パッケージの読み込み
param_DEG <- 1:2000                    #DEGの位置を指定
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

解析 | 発現変動 | 2群間 | 対応あり | について

実験デザインが以下のような場合にこのカテゴリーに属す方法を適用します:

Aさんの正常サンプル(or "time_point1" or "Group1")
Bさんの正常サンプル(or "time_point1" or "Group1")
Cさんの正常サンプル(or "time_point1" or "Group1")
Aさんの腫瘍サンプル(or "time_point2" or "Group2")
Bさんの腫瘍サンプル(or "time_point2" or "Group2")
Cさんの腫瘍サンプル(or "time_point2" or "Group2")

2015年11月に調査した結果をリストアップします。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 発現変動 | 2群間 | 対応あり | 複製なし | TCC中のDEGES/edgeR-edgeR (Sun_2013)

DEGES/edgeR正規化(Sun et al., 2013)を実行したのち、 edgeRパッケージ中のGLM (一般化線形モデル; Generalized Linear Model)に基づく方法 (McCarthy et al., 2012)で発現変動遺伝子(Differentially Expressed Genes; DEGs)検出を行うやり方を示します。 TCC原著論文中のDEGES/edgeR-edgeRという解析パイプラインに相当します。 Bioconductor ver. 2.13で利用可能なTCC ver. 1.2.0ではまだ実装されていないので、 ここでは、edgeRパッケージ中の関数のみを用いて対応のあるサンプル(paired samples)データ解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(1. DGEListオブジェクトの作成、2. 実験デザイン行列の作成など)
d <- DGEList(counts=data)              #1. DGEListオブジェクトdを作成
pair <- as.factor(c(1:param_G1, 1:param_G2))#2. 対応関係の情報をpairに格納
cl <- as.factor(c(rep(1, param_G1), rep(2, param_G2)))#2. グループラベル情報をclに格納
design <- model.matrix(~ pair + cl)    #2. デザイン行列を作成した結果をdesignに格納
FDR <- 0.1                             #DEGES正規化内部でのDEG検出時のFDR閾値を指定
floorPDEG <- 0.05                      #上記FDR閾値を満たす遺伝子数がここで指定した値(5%)未満だったときに、最低でも上位5%の遺伝子をDEGとみなして除去するための下限値を指定

#本番(DEGES/edgeR正規化)
### STEP 1 ###
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
d$samples$norm.factors                 #確認してるだけです
### STEP 2 ###
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #NB GLMへのfitting
out <- glmLRT(fit)                     #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
if (sum(q.value < FDR) > (floorPDEG * nrow(data))){#FDR閾値を満たす遺伝子数がここで指定した値(5%)よりも多いかどうか?
  is.DEG <- as.logical(q.value < FDR)  #Yesの場合は、FDR閾値を満たす遺伝子がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
} else {                               #Noの場合は...
  is.DEG <- as.logical(rank(p.value, ties.method="min") <= nrow(data)*floorPDEG)#上位(floorPDEG)%がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
}
### STEP 3 ###
d <- DGEList(counts=data[!is.DEG, ])   #DGEListオブジェクトdを作成(non-DEG)
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
norm.factors <- d$samples$norm.factors*colSums(data[!is.DEG, ])/colSums(data)#non-DEGのみ用に得られたTMM正規化係数を全遺伝子に掛けられるようにするための補正
norm.factors <- norm.factors/mean(norm.factors)#TMM正規化を実行した結果をdに格納
norm.factors                           #確認してるだけです

#本番(DEG検出)
d <- DGEList(counts=data)              #DGEListオブジェクトdを作成
d$samples$norm.factors <- norm.factors #計算した正規化係数を代入
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #NB GLMへのfitting
out <- glmLRT(fit)                     #検定
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

1.と全く同じ結果が得られますが、デザイン行列designの作成のところで順番を入れ替えています。 それに伴い、検定時のglmLRT関数実行時に、coefで指定する列情報を2列目に変更しています。1.ではデフォルトがdesign行列の最後の列なので、何も指定しなくていいのです。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(1. DGEListオブジェクトの作成、2. 実験デザイン行列の作成など)
d <- DGEList(counts=data)              #1. DGEListオブジェクトdを作成
pair <- as.factor(c(1:param_G1, 1:param_G2))#2. 対応関係の情報をpairに格納
cl <- as.factor(c(rep(1, param_G1), rep(2, param_G2)))#2. グループラベル情報をclに格納
design <- model.matrix(~ cl + pair)    #2. デザイン行列を作成した結果をdesignに格納
FDR <- 0.1                             #DEGES正規化内部でのDEG検出時のFDR閾値を指定
floorPDEG <- 0.05                      #上記FDR閾値を満たす遺伝子数がここで指定した値(5%)未満だったときに、最低でも上位5%の遺伝子をDEGとみなして除去するための下限値を指定

#本番(DEGES/edgeR正規化)
### STEP 1 ###
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
d$samples$norm.factors                 #確認してるだけです
### STEP 2 ###
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #NB GLMへのfitting
out <- glmLRT(fit, coef=2)             #検定(デザイン行列の2列目が目的のグループラベル情報clに相当)
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
if (sum(q.value < FDR) > (floorPDEG * nrow(data))){#FDR閾値を満たす遺伝子数がここで指定した値(5%)よりも多いかどうか?
  is.DEG <- as.logical(q.value < FDR)  #Yesの場合は、FDR閾値を満たす遺伝子がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
} else {                               #Noの場合は...
  is.DEG <- as.logical(rank(p.value, ties.method="min") <= nrow(data)*floorPDEG)#上位(floorPDEG)%がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
}
### STEP 3 ###
d <- DGEList(counts=data[!is.DEG, ])   #DGEListオブジェクトdを作成(non-DEG)
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
norm.factors <- d$samples$norm.factors*colSums(data[!is.DEG, ])/colSums(data)#non-DEGのみ用に得られたTMM正規化係数を全遺伝子に掛けられるようにするための補正
norm.factors <- norm.factors/mean(norm.factors)#TMM正規化を実行した結果をdに格納
norm.factors                           #確認してるだけです

#本番(DEG検出)
d <- DGEList(counts=data)              #DGEListオブジェクトdを作成
d$samples$norm.factors <- norm.factors #計算した正規化係数を代入
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #NB GLMへのfitting
out <- glmLRT(fit, coef=2)             #検定(デザイン行列の2列目が目的のグループラベル情報clに相当)
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

DEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_DEG <- 1:2000                    #DEGの位置を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(1. DGEListオブジェクトの作成、2. 実験デザイン行列の作成など)
d <- DGEList(counts=data)              #1. DGEListオブジェクトdを作成
pair <- as.factor(c(1:param_G1, 1:param_G2))#2. 対応関係の情報をpairに格納
cl <- as.factor(c(rep(1, param_G1), rep(2, param_G2)))#2. グループラベル情報をclに格納
design <- model.matrix(~ pair + cl)    #2. デザイン行列を作成した結果をdesignに格納
FDR <- 0.1                             #DEGES正規化内部でのDEG検出時のFDR閾値を指定
floorPDEG <- 0.05                      #上記FDR閾値を満たす遺伝子数がここで指定した値(5%)未満だったときに、最低でも上位5%の遺伝子をDEGとみなして除去するための下限値を指定

#本番(DEGES/edgeR正規化)
### STEP 1 ###
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
d$samples$norm.factors                 #確認してるだけです
### STEP 2 ###
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #NB GLMへのfitting
out <- glmLRT(fit)                     #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
if (sum(q.value < FDR) > (floorPDEG * nrow(data))){#FDR閾値を満たす遺伝子数がここで指定した値(5%)よりも多いかどうか?
  is.DEG <- as.logical(q.value < FDR)  #Yesの場合は、FDR閾値を満たす遺伝子がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
} else {                               #Noの場合は...
  is.DEG <- as.logical(rank(p.value, ties.method="min") <= nrow(data)*floorPDEG)#上位(floorPDEG)%がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
}
### STEP 3 ###
d <- DGEList(counts=data[!is.DEG, ])   #DGEListオブジェクトdを作成(non-DEG)
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
norm.factors <- d$samples$norm.factors*colSums(data[!is.DEG, ])/colSums(data)#non-DEGのみ用に得られたTMM正規化係数を全遺伝子に掛けられるようにするための補正
norm.factors <- norm.factors/mean(norm.factors)#TMM正規化を実行した結果をdに格納
norm.factors                           #確認してるだけです

#本番(DEG検出)
d <- DGEList(counts=data)              #DGEListオブジェクトdを作成
d$samples$norm.factors <- norm.factors #計算した正規化係数を代入
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #NB GLMへのfitting
out <- glmLRT(fit)                     #検定
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算

	

4. TCCパッケージ中の1,000 genes×6 samplesのカウントデータ(hypoData)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_200までがDEG (最初の180個がG1群で高発現、残りの20個がG2群で高発現) gene_201〜gene_1000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み
library(TCC)                           #パッケージの読み込み

#カウントデータオブジェクトの読み込み
data(hypoData)                         #TCCパッケージ中のhypoDataオブジェクトをロード
data <- hypoData                       #オブジェクト名を変更

#前処理(1. DGEListオブジェクトの作成、2. 実験デザイン行列の作成など)
d <- DGEList(counts=data)              #1. DGEListオブジェクトdを作成
pair <- as.factor(c(1:param_G1, 1:param_G2))#2. 対応関係の情報をpairに格納
cl <- as.factor(c(rep(1, param_G1), rep(2, param_G2)))#2. グループラベル情報をclに格納
design <- model.matrix(~ pair + cl)    #2. デザイン行列を作成した結果をdesignに格納
FDR <- 0.1                             #DEGES正規化内部でのDEG検出時のFDR閾値を指定
floorPDEG <- 0.05                      #上記FDR閾値を満たす遺伝子数がここで指定した値(5%)未満だったときに、最低でも上位5%の遺伝子をDEGとみなして除去するための下限値を指定

#本番(DEGES/edgeR正規化)
### STEP 1 ###
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
d$samples$norm.factors                 #確認してるだけです
### STEP 2 ###
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #NB GLMへのfitting
out <- glmLRT(fit)                     #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
if (sum(q.value < FDR) > (floorPDEG * nrow(data))){#FDR閾値を満たす遺伝子数がここで指定した値(5%)よりも多いかどうか?
  is.DEG <- as.logical(q.value < FDR)  #Yesの場合は、FDR閾値を満たす遺伝子がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
} else {                               #Noの場合は...
  is.DEG <- as.logical(rank(p.value, ties.method="min") <= nrow(data)*floorPDEG)#上位(floorPDEG)%がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
}
### STEP 3 ###
d <- DGEList(counts=data[!is.DEG, ])   #DGEListオブジェクトdを作成(non-DEG)
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
norm.factors <- d$samples$norm.factors*colSums(data[!is.DEG, ])/colSums(data)#non-DEGのみ用に得られたTMM正規化係数を全遺伝子に掛けられるようにするための補正
norm.factors <- norm.factors/mean(norm.factors)#TMM正規化を実行した結果をdに格納
norm.factors                           #確認してるだけです

#本番(DEG検出)
d <- DGEList(counts=data)              #DGEListオブジェクトdを作成
d$samples$norm.factors <- norm.factors #計算した正規化係数を代入
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #NB GLMへのfitting
out <- glmLRT(fit)                     #検定
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. TCCパッケージ中の1,000 genes×6 samplesのカウントデータ(hypoData)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_200までがDEG (最初の180個がG1群で高発現、残りの20個がG2群で高発現) gene_201〜gene_1000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

4.と全く同じ結果が得られますが、デザイン行列designの作成のところで順番を入れ替えています。 それに伴い、検定時のglmLRT関数実行時に、coefで指定する列情報を2列目に変更しています。1.ではデフォルトがdesign行列の最後の列なので、何も指定しなくていいのです。

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み
library(TCC)                           #パッケージの読み込み

#カウントデータオブジェクトの読み込み
data(hypoData)                         #TCCパッケージ中のhypoDataオブジェクトをロード
data <- hypoData                       #オブジェクト名を変更

#前処理(1. DGEListオブジェクトの作成、2. 実験デザイン行列の作成など)
d <- DGEList(counts=data)              #1. DGEListオブジェクトdを作成
pair <- as.factor(c(1:param_G1, 1:param_G2))#2. 対応関係の情報をpairに格納
cl <- as.factor(c(rep(1, param_G1), rep(2, param_G2)))#2. グループラベル情報をclに格納
design <- model.matrix(~ cl + pair)    #2. デザイン行列を作成した結果をdesignに格納
FDR <- 0.1                             #DEGES正規化内部でのDEG検出時のFDR閾値を指定
floorPDEG <- 0.05                      #上記FDR閾値を満たす遺伝子数がここで指定した値(5%)未満だったときに、最低でも上位5%の遺伝子をDEGとみなして除去するための下限値を指定

#本番(DEGES/edgeR正規化)
### STEP 1 ###
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
d$samples$norm.factors                 #確認してるだけです
### STEP 2 ###
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #NB GLMへのfitting
out <- glmLRT(fit, coef=2)             #検定(デザイン行列の2列目が目的のグループラベル情報clに相当)
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
if (sum(q.value < FDR) > (floorPDEG * nrow(data))){#FDR閾値を満たす遺伝子数がここで指定した値(5%)よりも多いかどうか?
  is.DEG <- as.logical(q.value < FDR)  #Yesの場合は、FDR閾値を満たす遺伝子がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
} else {                               #Noの場合は...
  is.DEG <- as.logical(rank(p.value, ties.method="min") <= nrow(data)*floorPDEG)#上位(floorPDEG)%がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
}
### STEP 3 ###
d <- DGEList(counts=data[!is.DEG, ])   #DGEListオブジェクトdを作成(non-DEG)
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
norm.factors <- d$samples$norm.factors*colSums(data[!is.DEG, ])/colSums(data)#non-DEGのみ用に得られたTMM正規化係数を全遺伝子に掛けられるようにするための補正
norm.factors <- norm.factors/mean(norm.factors)#TMM正規化を実行した結果をdに格納
norm.factors                           #確認してるだけです

#本番(DEG検出)
d <- DGEList(counts=data)              #DGEListオブジェクトdを作成
d$samples$norm.factors <- norm.factors #計算した正規化係数を代入
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #NB GLMへのfitting
out <- glmLRT(fit, coef=2)             #検定(デザイン行列の2列目が目的のグループラベル情報clに相当)
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 発現変動 | 2群間 | 対応あり | 複製なし | TCC中のDEGES/DESeq-DESeq (Sun_2013)

書きかけです。

DEGES/DESeq正規化(Sun et al., 2013)を実行したのち、 DESeqパッケージ中のGLM (一般化線形モデル; Generalized Linear Model)に基づく方法 で発現変動遺伝子(Differentially Expressed Genes; DEGs)検出を行うやり方を示します。 TCC原著論文中のDEGES/DESeq-DESeqという解析パイプラインに相当します。 Bioconductor ver. 2.13で利用可能なTCC ver. 1.2.0ではまだ実装されていないので、 ここでは、DESeqパッケージ中の関数のみを用いて対応のあるサンプル(paired samples)データ解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

TCC ver. 1.3.2で2014年4月に利用可能予定のコードです。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(DESeq)                          #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(1. DGEListオブジェクトの作成、2. 実験デザイン行列の作成など)
d <- DGEList(counts=data)              #1. DGEListオブジェクトdを作成
pair <- as.factor(c(1:param_G1, 1:param_G2))#2. 対応関係の情報をpairに格納
cl <- as.factor(c(rep(1, param_G1), rep(2, param_G2)))#2. グループラベル情報をclに格納
design <- model.matrix(~ pair + cl)    #2. デザイン行列を作成した結果をdesignに格納
FDR <- 0.1                             #DEGES正規化内部でのDEG検出時のFDR閾値を指定
floorPDEG <- 0.05                      #上記FDR閾値を満たす遺伝子数がここで指定した値(5%)未満だったときに、最低でも上位5%の遺伝子をDEGとみなして除去するための下限値を指定

#本番(DEGES/edgeR正規化)
### STEP 1 ###
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
d$samples$norm.factors                 #確認してるだけです
### STEP 2 ###
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #NB GLMへのfitting
out <- glmLRT(fit)                     #検定
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
if (sum(q.value < FDR) > (floorPDEG * nrow(data))){#FDR閾値を満たす遺伝子数がここで指定した値(5%)よりも多いかどうか?
  is.DEG <- as.logical(q.value < FDR)  #Yesの場合は、FDR閾値を満たす遺伝子がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
} else {                               #Noの場合は...
  is.DEG <- as.logical(rank(p.value, ties.method="min") <= nrow(data)*floorPDEG)#上位(floorPDEG)%がTRUE、そうでないものがFALSEと判定した結果をis.DEGベクトルに格納
}
### STEP 3 ###
d <- DGEList(counts=data[!is.DEG, ])   #DGEListオブジェクトdを作成(non-DEG)
d <- calcNormFactors(d)                #TMM正規化を実行した結果をdに格納
norm.factors <- d$samples$norm.factors*colSums(data[!is.DEG, ])/colSums(data)#non-DEGのみ用に得られたTMM正規化係数を全遺伝子に掛けられるようにするための補正
norm.factors <- norm.factors/mean(norm.factors)#TMM正規化を実行した結果をdに格納
norm.factors                           #確認してるだけです

#本番(DEG検出)
d <- DGEList(counts=data)              #DGEListオブジェクトdを作成
d$samples$norm.factors <- norm.factors #計算した正規化係数を代入
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #NB GLMへのfitting
out <- glmLRT(fit)                     #検定
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 発現変動 | 2群間 | 対応あり | 複製なし | DESeq (Anders_2010)

DESeqパッケージを用いて対応のあるサンプル(paired samples)データ解析を行うやり方を示します。 TCCパッケージでも内部的にDESeqを呼び出して実行可能なので、そのやり方も示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

TCC ver. 1.3.2で2014年4月に利用可能予定のコードです。getResult関数のところでエラーが出るようですね。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
design.cl <- data.frame(               #デザイン行列と同じ意味合いのデータフレーム形式オブジェクトを作成
    group=c(rep(1, param_G1), rep(2, param_G2)),#グループラベル情報
    pair=c(1:param_G1, 1:param_G2)     #対応関係の情報
)                                      #
tcc <- new("TCC", data, design.cl)     #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0, paired=T)#正規化を実行した結果をtccに格納
tcc$norm.factors                       #確認してるだけです

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR, paired=T)#DEG検出を実行した結果をtccに格納
#result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
#sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示
p.value <- tcc$stat$p.value             #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
#tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

DEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

TCC ver. 1.3.2で2014年4月に利用可能予定のコードです。getResult関数のところでエラーが出るようですね。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_DEG <- 1:2000                    #DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
design.cl <- data.frame(               #デザイン行列と同じ意味合いのデータフレーム形式オブジェクトを作成
    group=c(rep(1, param_G1), rep(2, param_G2)),#グループラベル情報
    pair=c(1:param_G1, 1:param_G2)     #対応関係の情報
)                                      #
tcc <- new("TCC", data, design.cl)     #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0, paired=T)#正規化を実行した結果をtccに格納
tcc$norm.factors                       #確認してるだけです

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR, paired=T)#DEG検出を実行した結果をtccに格納
#result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
#sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示
p.value <- tcc$stat$p.value             #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
#tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

3. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

1.と同じ入力形式で、TCCパッケージを使わずにDESeqパッケージ中の関数のみで行うやり方です。TCCのほうが手順的にも簡便であることがわかります。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(DESeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
pair <- c(1:param_G1, 1:param_G2)      #対応関係の情報
design.cl <- data.frame(               #デザイン行列と同じ意味合いのデータフレーム形式オブジェクトを作成
    group=as.factor(data.cl),          #グループラベル情報
    pair=as.factor(pair)               #対応関係の情報
)                                      #

#本番(正規化)
cds <- newCountDataSet(data, design.cl)#CountDataSetオブジェクトを作成してcdsに格納
cds <- estimateSizeFactors(cds)        #size factorを計算し、結果をcdsに格納
sizeFactors(cds)                       #これがDESeqのsize factors

#本番(DEG検出)
cds <- estimateDispersions(cds, method="blind", sharingMode="fit-only")#モデル構築
fit1 <- fitNbinomGLMs(cds, count ~ as.factor(data.cl) + as.factor(pair))#full model
fit0 <- fitNbinomGLMs(cds, count ~ as.factor(pair))#reduced model
p.value <- nbinomGLMTest(fit1, fit0)   #検定
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

4. TCCパッケージ中の1,000 genes×6 samplesのカウントデータ(hypoData)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_200までがDEG (最初の180個がG1群で高発現、残りの20個がG2群で高発現) gene_201〜gene_1000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

TCC ver. 1.3.2で2014年4月に利用可能予定のコードです。getResult関数のところでエラーが出るようですね。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(DESeq)                         #パッケージの読み込み

#カウントデータオブジェクトの読み込み
data(hypoData)                         #TCCパッケージ中のhypoDataオブジェクトをロード
data <- hypoData                       #オブジェクト名を変更

#前処理(TCCクラスオブジェクトの作成)
design.cl <- data.frame(               #デザイン行列と同じ意味合いのデータフレーム形式オブジェクトを作成
    group=c(rep(1, param_G1), rep(2, param_G2)),#グループラベル情報
    pair=c(1:param_G1, 1:param_G2)     #対応関係の情報
)                                      #
tcc <- new("TCC", data, design.cl)     #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0, paired=T)#正規化を実行した結果をtccに格納
tcc$norm.factors                       #確認してるだけです

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR, paired=T)#DEG検出を実行した結果をtccに格納
#result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
#sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示
p.value <- tcc$stat$p.value             #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
#tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

5. TCCパッケージ中の1,000 genes×6 samplesのカウントデータ(hypoData)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_200までがDEG (最初の180個がG1群で高発現、残りの20個がG2群で高発現) gene_201〜gene_1000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

DEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

TCC ver. 1.3.2で2014年4月に利用可能予定のコードです。getResult関数のところでエラーが出るようですね。

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_DEG <- 1:200                     #DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(ROC)                           #パッケージの読み込み
library(DESeq)                         #パッケージの読み込み

#カウントデータオブジェクトの読み込み
data(hypoData)                         #TCCパッケージ中のhypoDataオブジェクトをロード
data <- hypoData                       #オブジェクト名を変更

#前処理(TCCクラスオブジェクトの作成)
design.cl <- data.frame(               #デザイン行列と同じ意味合いのデータフレーム形式オブジェクトを作成
    group=c(rep(1, param_G1), rep(2, param_G2)),#グループラベル情報
    pair=c(1:param_G1, 1:param_G2)     #対応関係の情報
)                                      #
tcc <- new("TCC", data, design.cl)     #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0, paired=T)#正規化を実行した結果をtccに格納
tcc$norm.factors                       #確認してるだけです

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR, paired=T)#DEG検出を実行した結果をtccに格納
#result <- getResult(tcc, sort=FALSE)  #p値などの計算結果をresultに格納
#sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示
p.value <- tcc$stat$p.value            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
#tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

6. TCCパッケージ中の1,000 genes×6 samplesのカウントデータ(hypoData)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_200までがDEG (最初の180個がG1群で高発現、残りの20個がG2群で高発現) gene_201〜gene_1000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

4.と同じ入力形式で、TCCパッケージを使わずにDESeqパッケージ中の関数のみで行うやり方です。TCCのほうが手順的にも簡便であることがわかります。

out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(DESeq)                         #パッケージの読み込み
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data(hypoData)                         #TCCパッケージ中のhypoDataオブジェクトをロード
data <- hypoData                       #オブジェクト名を変更
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
pair <- c(1:param_G1, 1:param_G2)      #対応関係の情報
design.cl <- data.frame(               #デザイン行列と同じ意味合いのデータフレーム形式オブジェクトを作成
    group=as.factor(data.cl),          #グループラベル情報
    pair=as.factor(pair)               #対応関係の情報
)                                      #

#本番(正規化)
cds <- newCountDataSet(data, design.cl)#CountDataSetオブジェクトを作成してcdsに格納
cds <- estimateSizeFactors(cds)        #size factorを計算し、結果をcdsに格納
sizeFactors(cds)                       #これがDESeqのsize factors

#本番(DEG検出)
cds <- estimateDispersions(cds, method="blind", sharingMode="fit-only")#モデル構築
fit1 <- fitNbinomGLMs(cds, count ~ as.factor(data.cl) + as.factor(pair))#full model
fit0 <- fitNbinomGLMs(cds, count ~ as.factor(pair))#reduced model
p.value <- nbinomGLMTest(fit1, fit0)   #検定
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 発現変動 | 2群間 | 対応あり | 複製なし | edgeR(Robinson_2010)

edgeRパッケージを用いて対応のあるサンプル(paired samples)データ解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_f1に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(1. DGEListオブジェクトの作成、2. TMM正規化、3. 実験デザイン行列の作成)
d <- DGEList(data)                     #1. DGEListオブジェクトdを作成
d <- calcNormFactors(d)                #2. TMM正規化を実行した結果をdに格納
pair <- as.factor(c(1:param_G1, 1:param_G2))#3. 対応関係の情報をpairに格納
cl <- as.factor(c(rep(1, param_G1), rep(2, param_G2)))#3. グループラベル情報をclに格納
design <- model.matrix(~ pair + cl)    #3. デザイン行列を作成した結果をdesignに格納

#本番(DEG検出)
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #NB GLMへのfitting
out <- glmLRT(fit)                     #検定
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. サンプルデータ13の10,000 genes×6 samplesのカウントデータ(data_hypodata_3vs3.txt)の場合:

Biological replicatesを模倣したシミュレーションデータ(G1群3サンプル vs. G2群3サンプル)です。 gene_1〜gene_2000までがDEG (最初の1800個がG1群で高発現、残りの200個がG2群で高発現) gene_2001〜gene_10000までがnon-DEGであることが既知です。

G1群の3つのサンプル(G1_1, G1_2, G1_3)とG2群の3つのサンプル(G2_1, G2_2, G2_3)が対応しているという仮定で解析を行います。

例えば、G1_1とG2_1がAさん、G1_2とG2_2がBさん、そしてG1_3とG2_3がCさんというイメージです。したがって、G1群とG2群のサンプル数が異なることはアリエマセン。

DEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算を行う例です。

in_f <- "data_hypodata_3vs3.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_f1に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_DEG <- 1:2000                    #DEGの位置を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(1. DGEListオブジェクトの作成、2. TMM正規化、3. 実験デザイン行列の作成)
d <- DGEList(data)                     #1. DGEListオブジェクトdを作成
d <- calcNormFactors(d)                #2. TMM正規化を実行した結果をdに格納
pair <- as.factor(c(1:param_G1, 1:param_G2))#3. 対応関係の情報をpairに格納
cl <- as.factor(c(rep(1, param_G1), rep(2, param_G2)))#3. グループラベル情報をclに格納
design <- model.matrix(~ pair + cl)    #3. デザイン行列を作成した結果をdesignに格納

#本番(DEG検出)
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #NB GLMへのfitting
out <- glmLRT(fit)                     #検定
#tmp <- topTags(out, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- out$table$PValue            #p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
	

解析 | 発現変動 | 3群間 | 対応なし | について

実験デザインが以下のような場合にこのカテゴリーに属す方法を適用します:

Aさんの肝臓サンプル(or "time_point1" or "Group1")
Bさんの肝臓サンプル(or "time_point1" or "Group1")
Cさんの肝臓サンプル(or "time_point1" or "Group1")
Dさんの腎臓サンプル(or "time_point2" or "Group2")
Eさんの腎臓サンプル(or "time_point2" or "Group2")
Fさんの腎臓サンプル(or "time_point2" or "Group2")
Gさんの大腸サンプル(or "time_point3" or "Group3")
Hさんの大腸サンプル(or "time_point3" or "Group3")
Iさんの大腸サンプル(or "time_point3" or "Group3")

基礎では、ANOVAのような「どこかの群間で発現に差がある遺伝子の検出」のやり方を示します。 応用では、「指定した群間で発現に差がある遺伝子の検出」のやり方を示します。 GLM LRT法などが有名です。GLMは一般化線形モデル(generalized linear model)の略、そしてLRTは尤度比検定(log-likelihood ratio test)の略です。 基本的には、「全ての群の情報を含むfull model」と「特定の情報を除くreduced model」の2つモデルを作成し、その二つのモデルの尤度に差があるかどうかを検定するやり方です。 designというオブジェクトがfull modelに相当します。基本的には、デザイン行列中のparam_coefで指定した列を除くことでreduced modelを作成してLRTを行っています。 EBSeqやbaySeqは、考えられる様々なパターンのうちどのパターンへの当てはまりが最も良いかというposterior probabilityを出力します。 手法比較論文(Tang et al., BMC Bioinformatics, 2015) 中では、複製ありデータ用はTCCのDEGESパイプライン内部でedgeRを用いたEEE-E、 そして複製なしデータ用はDEGESパイプライン内部でDESeq2を用いたSSS-Sを多群間比較用の推奨ガイドラインとして結論づけています。 EEE-EはTCC論文中のiDEGES/edgeR-edgeRパイプラインと、そしてSSS-SはiDEGES/DESeq2-DESeq2パイプラインに相当します。

2016年10月に調査した結果をリストアップします。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 発現変動 | 3群間 | 対応なし | 複製あり | 基礎 | DESeq2(Love_2014)

DESeq2パッケージ (Love et al., Genome Biol., 2014)を用いるやり方を示します。 DESeq2はTCCパッケージ (Sun et al., BMC Bioinformatics, 2013)内で用いることができるので、そのやり方を中心に述べます。 デフォルトのDESeq2の手順に相当します。 ここでやっていることはANOVAのような「どこかの群間で発現に差がある遺伝子を検出」です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。TCCパッケージを用いるやり方です。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq2", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq2", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

2. サンプルデータ15の10,000 genes×9 samplesのシミュレーションデータ(data_hypodata_3vs3vs3.txt)と同じものをTCCパッケージ内部で作成する場合:

1.と同じ結果が得られます。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータ作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
             DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
             DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
             replicates = c(param_G1, param_G2, param_G3))#各群のサンプル数を指定

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq2", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq2", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
calcAUCValue(tcc)                      #AUC値計算結果を表示(どこかの群で発現変動しているか否かの1 or 0の予測結果のベクトルと真の情報とのROC曲線の下部面積)
	

3. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq2", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq2", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

4. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)と同じものをTCCパッケージ内部で作成する場合:

3.と同じ結果が得られます。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータ作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
             DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
             DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
             replicates = c(param_G1, param_G2, param_G3))#各群のサンプル数を指定

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq2", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq2", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
calcAUCValue(tcc)                      #AUC値計算結果を表示(どこかの群で発現変動しているか否かの1 or 0の予測結果のベクトルと真の情報とのROC曲線の下部面積)
	

5. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

1.と基本的に同じで、出力のテキストファイルが正規化前のデータではなく正規化後のデータになっていて、発現変動順にソートしたものになっています。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq2", iteration=0)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq2", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
    

6. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

1.と基本的に同じですが、full modelとreduced modelを情報を明示的に指定しています。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq2", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc$group <- data.frame(condition = as.factor(data.cl))#tcc$group中の記述を変更している
tcc <- estimateDE(tcc, test.method="deseq2", FDR=param_FDR,#DEG検出を実行した結果をtccに格納
                       full= ~condition, reduced= ~1)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

7. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

3.と基本的に同じで、TCCパッケージを使わずにDESeq2パッケージ中の関数のみで行うやり方です。 TCCのほうが手順的にも簡便であることがわかります。 指定したFDR閾値を満たす遺伝子数が異なるのは、q-value算出方法の違いに起因します。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(DESeq2)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(DESeqDataSetオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
colData <- data.frame(condition=as.factor(data.cl))#condition列にクラスラベル情報を格納したcolDataオブジェクトを作成
d <- DESeqDataSetFromMatrix(countData=data, colData=colData, design=~condition)#DESeqDataSetオブジェクトdの作成

#本番(正規化)
d <- estimateSizeFactors(d)            #正規化を実行した結果をdに格納
sizeFactors(d) <- sizeFactors(d)/mean(sizeFactors(d))#おまじない(TCCパッケージと同じ結果を得る場合に必要)

#本番(DEG検出)
d <- estimateDispersions(d)            #モデル構築(ばらつきの程度を見積もっている)
d <- nbinomLRT(d, full= ~condition, reduced= ~1)#検定
tmp <- results(d)                      #検定結果を抽出
p.value <- tmp$pvalue                  #p-valueをp.valueに格納
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- tmp$padj                    #adjusted p-valueをq.valueに格納
q.value[is.na(q.value)] <- 1           #NAを1に置換している
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示
sum(p.adjust(p.value, method="BH") < param_FDR)#条件を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

8. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

シミュレーションデータ(G1群4サンプル vs. G2群4サンプル vs. G3群4サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_1000がG1群で5倍高発現、gene_1001〜gene_2000がG2群で5倍高発現、gene_2001〜gene_3000がG3群で5倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。このDEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算も行っています。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge8.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_FDR <- 0.1                       #false discovery rate (FDR)閾値を指定
param_DEG <- 1:3000                    #DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq2", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq2", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示
ranking <- rank(tcc$stat$p.value)      #p-valueでランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

9. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

8.と基本的に同じですが、TCCパッケージではなくDESeq2パッケージ中の関数を利用しています。 指定したFDR閾値を満たす遺伝子数が異なるのは、q-value算出方法の違いに起因します。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge9.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_FDR <- 0.1                       #false discovery rate (FDR)閾値を指定
param_DEG <- 1:3000                    #DEGの位置を指定

#必要なパッケージをロード
library(DESeq2)                        #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(DESeqDataSetオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
colData <- data.frame(condition=as.factor(data.cl))#condition列にクラスラベル情報を格納したcolDataオブジェクトを作成
d <- DESeqDataSetFromMatrix(countData=data, colData=colData, design=~condition)#DESeqDataSetオブジェクトdの作成

#本番(正規化)
d <- estimateSizeFactors(d)            #正規化を実行した結果をdに格納
sizeFactors(d) <- sizeFactors(d)/mean(sizeFactors(d))#おまじない(TCCパッケージと同じ結果を得る場合に必要)

#本番(DEG検出)
d <- estimateDispersions(d)            #モデル構築(ばらつきの程度を見積もっている)
d <- nbinomLRT(d, full= ~condition, reduced= ~1)#検定
tmp <- results(d)                      #検定結果を抽出
p.value <- tmp$pvalue                  #p-valueをp.valueに格納
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- tmp$padj                    #adjusted p-valueをq.valueに格納
q.value[is.na(q.value)] <- 1           #NAを1に置換している
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示
sum(p.adjust(p.value, method="BH") < param_FDR)#FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

解析 | 発現変動 | 3群間 | 対応なし | 複製あり | 基礎 | TCC(Sun_2013)

TCCを用いたやり方を示します。 内部的にiDEGES/edgeR(Sun_2013)正規化を実行したのち、 edgeRパッケージ中のGLM LRT法で発現変動遺伝子(Differentially Expressed Genes; DEGs)検出を行っています。 TCC原著論文中のiDEGES/edgeR-edgeRという解析パイプラインに相当します。 TCC原著論文(Sun et al., BMC Bioinformatics, 2013)では 3群間複製ありデータ用の推奨パイプラインを示していませんでしたが、多群間比較用の推奨ガイドライン提唱論文 (Tang et al., BMC Bioinformatics, 2015) で推奨しているパイプライン"EEE-E"が"iDEGES/edgeR-edgeR"と同じものです。この2つの論文を引用し、安心してご利用ください。 尚、ここでやっていることはANOVAのような「どこかの群間で発現に差がある遺伝子を検出」です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

2. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)と同じものをTCCパッケージ内部で作成する場合:

1.と同じ結果が得られます。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータ作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
             DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
             DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
             replicates = c(param_G1, param_G2, param_G3))#各群のサンプル数を指定

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
calcAUCValue(tcc)                      #AUC値計算結果を表示(どこかの群で発現変動しているか否かの1 or 0の予測結果のベクトルと真の情報とのROC曲線の下部面積)
	

3. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

4. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)と同じものをTCCパッケージ内部で作成する場合:

3.と同じ結果が得られます。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータ作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
             DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
             DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
             replicates = c(param_G1, param_G2, param_G3))#各群のサンプル数を指定

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
calcAUCValue(tcc)                      #AUC値計算結果を表示(どこかの群で発現変動しているか否かの1 or 0の予測結果のベクトルと真の情報とのROC曲線の下部面積)
	

5. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

1.と基本的に同じで、出力のテキストファイルが正規化前のデータではなく正規化後のデータになっていて、発現変動順にソートしたものになっています。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.20)                    #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
    

6. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

1.と基本的に同じですが、デザイン行列designと係数coefを明示的に作成および指定しています。 coefに入っている数値は、length(unique(data.cl))の値が3になるので、2:3、つまり2と3になります。 これがANOVA的などこかの群間で発現変動しているものを検出するときに指定する値です。 感覚的にはdesign[,2] - design[,3]をやっていることになり、「G1で-1, G2で0, G3で1」と全ての群で異なる数値が割り振られることになります。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
design <- model.matrix(~ as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
coef <- 2:length(unique(data.cl))      #線形モデルの比較する係数を指定(全ての群間比較時のおまじない的な記述法です)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR,#DEG検出を実行した結果をtccに格納
                       design=design, coef=coef)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

7. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

5.と基本的に同じで、入力ファイルが違うだけです。Blekhman et al., Genome Res., 2010の 20,689 genes×18 samplesのカウントデータです。ヒト(HS)、チンパンジー(PT)、アカゲザル(RM)の3生物種間比較です。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.20)                    #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
    

8. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

例題7と基本的に同じで、各生物種につき最初の5サンプル分を抽出して5反復の3群間比較を行っています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge8.txt"                   #出力ファイル名を指定してout_fに格納
param_subset <- c(1:5, 7:11, 13:17)    #取り扱いたいサブセット情報を指定
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param_G3 <- 5                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.20)                    #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
    

9. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

例題7と基本的に同じで、各生物種につき最初の4サンプル分を抽出して4反復の3群間比較を行っています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge9.txt"                   #出力ファイル名を指定してout_fに格納
param_subset <- c(1:4, 7:10, 13:16)    #取り扱いたいサブセット情報を指定
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.20)                    #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
    

10. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

例題7と基本的に同じで、各生物種につき最初の3サンプル分を抽出して3反復の3群間比較を行っています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge10.txt"                  #出力ファイル名を指定してout_fに格納
param_subset <- c(1:3, 7:9, 13:15)     #取り扱いたいサブセット情報を指定
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.20)                    #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
    

解析 | 発現変動 | 3群間 | 対応なし | 複製あり | 基礎 | EBSeq(Leng_2013)

EBSeqパッケージ(Leng et al., 2013)を用いて 発現変動遺伝子(Differentially Expressed Genes; DEGs)検出を行うやり方を示します。 ANOVAのような「どこかの群間で発現に差がある遺伝子を検出」ではなく、EBSeqで定義したいくつかの発現パターンのどれに相当するかまで示してくれるので、 「どこで発現に差があるのか」を調べるpost-hoc testを行う必要がないのが特徴です。 出力結果ファイルを眺めると Pattern1, Pattern2, ..., Pattern5までの列のところに遺伝子ごとのPosterior Probability (PP)値が与えられています。 PP値が一番大きい(つまり1に近い)パターンに、その遺伝子が属するということになります:
  Pattern1は(1, 1, 1)なのでnon-DEGの発現パターン
  Pattern2は(1, 1, 2)なのでG3群で発現変動(高発現または低発現)
  Pattern3は(1, 2, 1)なのでG2群で発現変動
  Pattern4は(1, 2, 2)なのでG1群で発現変動
  Pattern5は(1, 2, 3)なので、全ての群間で発現変動
  一番右側のout$MAP列を見る方が手っ取り早いかもしれません。どの遺伝子がどのパターンに属するかが一目瞭然です。 全体的な発現変動の度合いによるANOVA-likeなランキングは、例題5などを参考にしてPattern1のPP値に基づいて行えばよいです。 Pattern1のPP値の低さはnon-DEGである確率の低さを意味するからです。
 

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

シミュレーションデータ(G1群4サンプル vs. G2群4サンプル vs. G3群4サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_1000がG1群で5倍高発現、gene_1001〜gene_2000がG2群で5倍高発現、gene_2001〜gene_3000がG3群で5倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(EBSeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep("G1", param_G1), rep("G2", param_G2), rep("G3", param_G3))#G1群を"G1"、G2群を"G2"、G3群を"G3"としたベクトルdata.clを作成

#本番(正規化)
size.factors <- MedianNorm(data)       #サイズファクター(size factors)を算出した結果をsize.factorsに格納
size.factors                           #サイズファクター(size factors)を表示

#本番(DEG検出)
PosParti <- GetPatterns(data.cl)       #可能な全ての発現パターンを作成した結果をPosPartiに格納
Parti <- PosParti                      #解析したいパターンをPartiに格納
Parti                                  #解析する発現パターンを表示
hoge <- EBMultiTest(as.matrix(data), NgVector=NULL,#EBSeq実行結果をhogeに格納
         Conditions=data.cl, AllParti=Parti,#EBSeq実行結果をhogeに格納
         sizeFactors=size.factors, maxround=5,#EBSeq実行結果をhogeに格納
         Qtrm=1.0, QtrmCut=-1)         #EBSeq実行結果をhogeに格納
out <- GetMultiPP(hoge)                #Posterior Probabilityなどの欲しい情報をoutに格納
ranking <- rank(out$PP[, "Pattern1"])  #Pattern1の事後確率が低い順(DEGである確率が高い順)でランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#解析しているパターン番号と実際のパターンを表示
out$Patterns                           #パターン番号と実際のパターンを表示
    

2. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

1.と基本的に同じですが、調べるパターンの中からPattern5を排除するやり方です。 DegPack (An et al., 2014) はまさにPattern5のような「どの群間でも同じパターンではない遺伝子」の検出を目的としていますが、 そういうものは興味の対象外という場合にここを利用します。尚、param_patternで指定している1:4c(1, 2, 3, 4)と同じ意味です。 1.でPattern5への当てはまりがよいとされていたgene_32が、Pattern4になっていることがわかります。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_pattern <- 1:4                   #解析したいパターン番号を指定

#必要なパッケージをロード
library(EBSeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep("G1", param_G1), rep("G2", param_G2), rep("G3", param_G3))#G1群を"G1"、G2群を"G2"、G3群を"G3"としたベクトルdata.clを作成

#本番(正規化)
size.factors <- MedianNorm(data)       #サイズファクター(size factors)を算出した結果をsize.factorsに格納
size.factors                           #サイズファクター(size factors)を表示

#本番(DEG検出)
PosParti <- GetPatterns(data.cl)       #可能な全ての発現パターンを作成した結果をPosPartiに格納
Parti <- PosParti[param_pattern, ]     #解析したいパターンをPartiに格納
Parti                                  #解析する発現パターンを表示
hoge <- EBMultiTest(as.matrix(data), NgVector=NULL,#EBSeq実行結果をhogeに格納
         Conditions=data.cl, AllParti=Parti,#EBSeq実行結果をhogeに格納
         sizeFactors=size.factors, maxround=5,#EBSeq実行結果をhogeに格納
         Qtrm=1.0, QtrmCut=-1)         #EBSeq実行結果をhogeに格納
out <- GetMultiPP(hoge)                #Posterior Probabilityなどの欲しい情報をoutに格納
ranking <- rank(out$PP[, "Pattern1"])  #Pattern1の事後確率が低い順(DEGである確率が高い順)でランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#解析しているパターン番号と実際のパターンを表示
out$Patterns                           #パターン番号と実際のパターンを表示
    

3. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

1.と基本的に同じですが、調べるパターンの中からPattern2, 3, 4を排除して、Pattern1と5のみを想定するやり方です。 DegPack (An et al., 2014) と似た解析である「どの群間でも同じパターンではない遺伝子」の検出をやっていることに相当します。 私は通常の解析ではやりません。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_pattern <- c(1, 5)               #解析したいパターン番号を指定

#必要なパッケージをロード
library(EBSeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep("G1", param_G1), rep("G2", param_G2), rep("G3", param_G3))#G1群を"G1"、G2群を"G2"、G3群を"G3"としたベクトルdata.clを作成

#本番(正規化)
size.factors <- MedianNorm(data)       #サイズファクター(size factors)を算出した結果をsize.factorsに格納
size.factors                           #サイズファクター(size factors)を表示

#本番(DEG検出)
PosParti <- GetPatterns(data.cl)       #可能な全ての発現パターンを作成した結果をPosPartiに格納
Parti <- PosParti[param_pattern, ]     #解析したいパターンをPartiに格納
Parti                                  #解析する発現パターンを表示
hoge <- EBMultiTest(as.matrix(data), NgVector=NULL,#EBSeq実行結果をhogeに格納
         Conditions=data.cl, AllParti=Parti,#EBSeq実行結果をhogeに格納
         sizeFactors=size.factors, maxround=5,#EBSeq実行結果をhogeに格納
         Qtrm=1.0, QtrmCut=-1)         #EBSeq実行結果をhogeに格納
out <- GetMultiPP(hoge)                #Posterior Probabilityなどの欲しい情報をoutに格納
ranking <- rank(out$PP[, "Pattern1"])  #Pattern1の事後確率が低い順(DEGである確率が高い順)でランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#解析しているパターン番号と実際のパターンを表示
out$Patterns                           #パターン番号と実際のパターンを表示
    

4. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

Blekhman et al., Genome Res., 2010の20,689 genes×18 samplesのカウントデータです。 ヒトのメス3サンプル(HSF1-3)とオス3サンプル(HSM1-3), チンパンジーのメス3サンプル(PTF1-3)とオス3サンプル(PTM1-3), アカゲザルのメス3サンプル(RMF1-3)とオス3サンプル(RMM1-3)の並びになっています。 ここでは、ヒト(G1群)6サンプル, チンパンジー(G2群)6サンプル, アカゲザル(G3群)6サンプルの3群間比較を行います。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(EBSeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep("G1", param_G1), rep("G2", param_G2), rep("G3", param_G3))#G1群を"G1"、G2群を"G2"、G3群を"G3"としたベクトルdata.clを作成

#本番(正規化)
size.factors <- MedianNorm(data)       #サイズファクター(size factors)を算出した結果をsize.factorsに格納
size.factors                           #サイズファクター(size factors)を表示

#本番(DEG検出)
PosParti <- GetPatterns(data.cl)       #可能な全ての発現パターンを作成した結果をPosPartiに格納
Parti <- PosParti                      #解析したいパターンをPartiに格納
Parti                                  #解析する発現パターンを表示
hoge <- EBMultiTest(as.matrix(data), NgVector=NULL,#EBSeq実行結果をhogeに格納
         Conditions=data.cl, AllParti=Parti,#EBSeq実行結果をhogeに格納
         sizeFactors=size.factors, maxround=5,#EBSeq実行結果をhogeに格納
         Qtrm=1.0, QtrmCut=-1)         #EBSeq実行結果をhogeに格納
out <- GetMultiPP(hoge)                #Posterior Probabilityなどの欲しい情報をoutに格納
ranking <- rank(out$PP[, "Pattern1"])  #Pattern1の事後確率が低い順(DEGである確率が高い順)でランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#解析しているパターン番号と実際のパターンを表示
out$Patterns                           #パターン番号と実際のパターンを表示

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(Pattern1である確率が0.05未満のものを概観)
obj <- (out$PP[, "Pattern1"] < 0.05)   #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)
    

5. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。AUC値も表示させています。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(EBSeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep("G1", param_G1), rep("G2", param_G2), rep("G3", param_G3))#G1群を"G1"、G2群を"G2"、G3群を"G3"としたベクトルdata.clを作成

#本番(正規化)
size.factors <- MedianNorm(data)       #サイズファクター(size factors)を算出した結果をsize.factorsに格納
size.factors                           #サイズファクター(size factors)を表示

#本番(DEG検出)
PosParti <- GetPatterns(data.cl)       #可能な全ての発現パターンを作成した結果をPosPartiに格納
Parti <- PosParti                      #解析したいパターンをPartiに格納
Parti                                  #解析する発現パターンを表示
hoge <- EBMultiTest(as.matrix(data), NgVector=NULL,#EBSeq実行結果をhogeに格納
         Conditions=data.cl, AllParti=Parti,#EBSeq実行結果をhogeに格納
         sizeFactors=size.factors, maxround=5,#EBSeq実行結果をhogeに格納
         Qtrm=1.0, QtrmCut=-1)         #EBSeq実行結果をhogeに格納
out <- GetMultiPP(hoge)                #Posterior Probabilityなどの欲しい情報をoutに格納
ranking <- rank(out$PP[, "Pattern1"])  #Pattern1の事後確率が低い順(DEGである確率が高い順)でランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#解析しているパターン番号と実際のパターンを表示
out$Patterns                           #パターン番号と実際のパターンを表示

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(Pattern1である確率が0.05未満のものを概観)
obj <- (out$PP[, "Pattern1"] < 0.05)   #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)

#AUC値を計算(高いほどよい方法)
library(ROC)                           #パッケージの読み込み
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[1:3000] <- 1                       #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

解析 | 発現変動 | 3群間 | 対応なし | 複製あり | 基礎 | SAMseq(Li_2013)

samrパッケージ中のSAMseq (Li and Tibshirani, 2013)を用いて 発現変動遺伝子(Differentially Expressed Genes; DEGs)検出を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

シミュレーションデータ(G1群4サンプル vs. G2群4サンプル vs. G3群4サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_1000がG1群で5倍高発現、gene_1001〜gene_2000がG2群で5倍高発現、gene_2001〜gene_3000がG3群で5倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。TCCパッケージでSAMseqを実行するやり方です。 このDEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算も行っています。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_FDR <- 0.1                       #false discovery rate (FDR)閾値を指定
param_DEG <- 1:3000                    #DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(DEG検出)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
tcc <- estimateDE(tcc, test.method="samseq", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示
ranking <- rank(tcc$stat$p.value)      #p-valueでランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算

tcc$private$simulation <- TRUE         #tccのシミュレーション解析の時に用いるfieldを有効にしている
tcc$simulation$trueDEG <- obj          #真の情報からなるベクトルをtccクラスオブジェクトに格納
calcAUCValue(tcc)                      #AUC計算
    

2. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

シミュレーションデータ(G1群4サンプル vs. G2群4サンプル vs. G3群4サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_1000がG1群で5倍高発現、gene_1001〜gene_2000がG2群で5倍高発現、gene_2001〜gene_3000がG3群で5倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。samrパッケージでSAMseqを実行する通常のやり方です。 このDEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算も行っています。同じAUC値(=0.8965379)が得られることが分かります。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_FDR <- 0.1                       #false discovery rate (FDR)閾値を指定
param_DEG <- 1:3000                    #DEGの位置を指定

#必要なパッケージをロード
library(samr)                          #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成

#本番(DEG検出)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
out <- SAMseq(data, data.cl, resp.type="Multiclass")#DEG検出を実行した結果をoutに格納
p.value <- samr.pvalues.from.perms(out$samr.obj$tt, out$samr.obj$ttstar)#p値をp.valueに格納
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納。
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

3. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

シミュレーションデータ(G1群4サンプル vs. G2群4サンプル vs. G3群4サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_1000がG1群で5倍高発現、gene_1001〜gene_2000がG2群で5倍高発現、gene_2001〜gene_3000がG3群で5倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。samrパッケージでSAMseqを実行する通常のやり方です。 このDEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算も行っています。1.や2.と若干異なるAUC値(=0.896619)が得られることが分かります。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_FDR <- 0.1                       #false discovery rate (FDR)閾値を指定
param_DEG <- 1:3000                    #DEGの位置を指定

#必要なパッケージをロード
library(samr)                          #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成

#本番(DEG検出)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
out <- SAMseq(data, data.cl, resp.type="Multiclass", fdr.output=1)#DEG検出を実行した結果をoutに格納
hoge <- rbind(out$siggenes.table$genes.up, out$siggenes.table$genes.lo)#q-valueを含む情報をhogeに格納
q.value <- rep(1, nrow(data))          #q.valueのプレースホルダを作成
names(q.value) <- rownames(data)       #q.valueのプレースホルダを作成
q.value[as.numeric(hoge[, "Gene Name"])] <- as.numeric(hoge[, "q-value(%)"])/100#hoge中の%q-valueの値を変換し、遺伝子名順にソート
ranking <- rank(q.value)               #q.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data, q.value, ranking)#入力データの右側にq.value、rankingを結合した結果をtmpに格納。
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

4. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

3.と基本的に同じで、記述形式をちょっと変更しているだけです。 SAMseq関数実行時の「nperms = 100, nresamp = 20」はデフォルトの数値を明示しているだけです。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_FDR <- 0.1                       #false discovery rate (FDR)閾値を指定
param_DEG <- 1:3000                    #DEGの位置を指定

#必要なパッケージをロード
library(samr)                          #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成

#本番(DEG検出)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
out <- SAMseq(data, data.cl, nperms = 100, nresamp = 20,#DEG検出を実行した結果をoutに格納
              geneid = rownames(data), genenames = rownames(data),#DEG検出を実行した結果をoutに格納
              resp.type="Multiclass", fdr.output=1)#DEG検出を実行した結果をoutに格納
hoge <- rbind(out$siggenes.table$genes.up, out$siggenes.table$genes.lo)#q-valueを含む情報をhogeに格納
q.value <- rep(1, nrow(data))          #q.valueのプレースホルダを作成
names(q.value) <- rownames(data)       #q.valueのプレースホルダを作成
q.value[match(hoge[,1], rownames(data))] <- as.numeric(hoge[, "q-value(%)"])/100#hoge中の%q-valueの値を変換し、遺伝子名順にソート
ranking <- rank(q.value)               #q.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存
tmp <- cbind(rownames(data), data, q.value, ranking)#入力データの右側にq.value、rankingを結合した結果をtmpに格納。
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

解析 | 発現変動 | 3群間 | 対応なし | 複製あり | 基礎 | DESeq(Anders_2010)

DESeqパッケージを用いて発現変動遺伝子(Differentially Expressed Genes; DEGs)検出を行うやり方(DESeq coupled with DESeq normalization; DESeq-DESeq)を示します。 デフォルトのDESeqの手順に相当します。TCCパッケージを用いても同様のことができますので、動作確認も兼ねて両方のやり方を示しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#「rownames情報」、「カウントデータ」、「DEG検出結果」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

2. サンプルデータ15の10,000 genes×9 samplesのシミュレーションデータ(data_hypodata_3vs3vs3.txt)と同じものをTCCパッケージ内部で作成する場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータ作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
             DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
             DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
             replicates = c(param_G1, param_G2, param_G3))#各群のサンプル数を指定

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#「rownames情報」、「カウントデータ」、「DEG検出結果」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
calcAUCValue(tcc)                      #AUC値計算結果を表示(どこかの群で発現変動しているか否かの1 or 0の予測結果のベクトルと真の情報とのROC曲線の下部面積)
	

3. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

1.と同じ入力形式で、TCCパッケージを使わずにDESeqパッケージ中の関数のみで行うやり方です。TCCのほうが手順的にも簡便であることがわかります。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(DESeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成

#本番(正規化)
cds <- newCountDataSet(data, data.cl)  #CountDataSetオブジェクトを作成してcdsに格納
cds <- estimateSizeFactors(cds)        #size factorを計算した結果をcdsに格納
sizeFactors(cds)                       #これがDESeqのsize factors

#本番(DEG検出)
cds <- estimateDispersions(cds, method="pooled")#モデル構築
fit1 <- fitNbinomGLMs(cds, count ~ as.factor(data.cl))#full model
fit0 <- fitNbinomGLMs(cds, count ~ 1)  #reduced model
p.value <- nbinomGLMTest(fit1, fit0)   #検定
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

4. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#「rownames情報」、「カウントデータ」、「DEG検出結果」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

5. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)と同じものをTCCパッケージ内部で作成する場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータ作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
             DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
             DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
             replicates = c(param_G1, param_G2, param_G3))#各群のサンプル数を指定

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#「rownames情報」、「カウントデータ」、「DEG検出結果」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
calcAUCValue(tcc)                      #AUC値計算結果を表示(どこかの群で発現変動しているか否かの1 or 0の予測結果のベクトルと真の情報とのROC曲線の下部面積)
	

6. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

3.と同じ入力形式で、TCCパッケージを使わずにDESeqパッケージ中の関数のみで行うやり方です。TCCのほうが手順的にも簡便であることがわかります。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(DESeq)                         #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成

#本番(正規化)
cds <- newCountDataSet(data, data.cl)  #CountDataSetオブジェクトを作成してcdsに格納
cds <- estimateSizeFactors(cds)        #size factorを計算した結果をcdsに格納
sizeFactors(cds)                       #これがDESeqのsize factors

#本番(DEG検出)
cds <- estimateDispersions(cds, method="pooled")#モデル構築
fit1 <- fitNbinomGLMs(cds, count ~ as.factor(data.cl))#full model
fit0 <- fitNbinomGLMs(cds, count ~ 1)  #reduced model
p.value <- nbinomGLMTest(fit1, fit0)   #検定
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- p.adjust(p.value, method="BH")#q値をq.valueに格納
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にp.value、q.value、rankingを結合した結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

解析 | 発現変動 | 3群間 | 対応なし | 複製あり | 基礎 | baySeq(Hardcastle_2010)

baySeqを用いて発現変動遺伝子(Differentially Expressed Genes; DEGs) 検出を行うやり方を示します。 ANOVAのような「どこかの群間で発現に差がある遺伝子を検出」ではなく、baySeqで定義したいくつかの発現パターンのどれに相当するかまで示してくれるので、 「どこで発現に差があるのか」を調べるpost-hoc testを行う必要がないのが特徴です。 2018年7月9日に、ここの全ての例題にset.seed(2015)を埋め込みました。 試行(trial)ごとに得られる数値が変わるようにしたい場合はset.seed(2015)の前に#を入れましょう。 つまり「set.seed(2015)」->「#set.seed(2015)」です。 2015はタネ番号なので3496などでも構いません。 例題5以降がより適切だと思っておりますので、そちらをご利用ください(長部 高之 氏提供情報をベースに作成;2018.07.09)。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。約3分。AUC値は0.875086ですね。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_samplesize <- 2000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成

#前処理(countDataオブジェクトの作成)
NDE <- factor(c(rep("NDE", param_G1), rep("NDE", param_G2), rep("NDE", param_G3)))#non-DEGのパターンを作成
DE <- factor(c(rep("G1", param_G1), rep("G2", param_G2), rep("G3", param_G3)))#DEGのパターンを作成
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
groups(ba) <- list(NDE=NDE, DE=DE)     #non-DEGとDEGのパターン情報を格納

#本番(正規化)
libsizes(ba) <- getLibsizes(ba, estimationType="edgeR")#edgeRパッケージ中の正規化法を実行

#本番(DEG検出)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算
res <- topCounts(ba, group="DE", normaliseData=T, number=nrow(data))#(発現変動順にソート済みの)解析結果を抽出
res <- res[rownames(data),]            #解析結果をオリジナルの並びに再ソート
q.value <- res$FDR.DE                  #FDR.DEの情報ををq.valueに格納
ranking <- rank(q.value)               #q.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(res), res, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#結果のまとめ(全遺伝子)
head(res$ordering)                     #最初の6遺伝子分のパターンを表示
table(res$ordering)                    #パターンごとの出現頻度を表示
table(res$ordering)/length(res$ordering)#パターンごとの出現確率を表示

#結果のまとめ(FDR閾値を満たすものを概観)
obj <- (q.value < param_FDR)           #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(res$ordering[obj])               #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(res$ordering[obj])/length(res$ordering[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)

#AUC値を計算(高いほどよい方法)
library(ROC)                           #パッケージの読み込み
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[1:3000] <- 1                       #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

2. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

1.と同じですが、前処理のところが微妙に異なります。 具体的には、NDEとDEオブジェクト作成部分でfactor関数をつけていません。 また、文字列ベクトルから数値ベクトルになっています。こんな書き方でもOKという例です。約10分。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_samplesize <- 5000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成

#前処理(countDataオブジェクトの作成)
NDE <- c(rep(1, param_G1), rep(1, param_G2), rep(1, param_G3))#non-DEGのパターンを作成
DE <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#DEGのパターンを作成
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
groups(ba) <- list(NDE=NDE, DE=DE)     #non-DEGとDEGのパターン情報を格納

#本番(正規化)
libsizes(ba) <- getLibsizes(ba, estimationType="edgeR")#edgeRパッケージ中の正規化法を実行

#本番(DEG検出)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算
res <- topCounts(ba, group="DE", normaliseData=T, number=nrow(data))#(発現変動順にソート済みの)解析結果を抽出
res <- res[rownames(data),]            #解析結果をオリジナルの並びに再ソート
q.value <- res$FDR.DE                  #FDR.DEの情報ををq.valueに格納
ranking <- rank(q.value)               #q.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(res), res, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#結果のまとめ(全遺伝子)
head(res$ordering)                     #最初の6遺伝子分のパターンを表示
table(res$ordering)                    #パターンごとの出現頻度を表示
table(res$ordering)/length(res$ordering)#パターンごとの出現確率を表示

#結果のまとめ(FDR閾値を満たすものを概観)
obj <- (q.value < param_FDR)           #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(res$ordering[obj])               #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(res$ordering[obj])/length(res$ordering[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)

#AUC値を計算(高いほどよい方法)
library(ROC)                           #パッケージの読み込み
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[1:3000] <- 1                       #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

3. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

Blekhman et al., Genome Res., 2010の20,689 genes×18 samplesのカウントデータです。 ヒトのメス3サンプル(HSF1-3)とオス3サンプル(HSM1-3), チンパンジーのメス3サンプル(PTF1-3)とオス3サンプル(PTM1-3), アカゲザルのメス3サンプル(RMF1-3)とオス3サンプル(RMM1-3)の並びになっています。 ここでは、ヒト(G1群)6サンプル, チンパンジー(G2群)6サンプル, アカゲザル(G3群)6サンプルの3群間比較を行います。 既知のDEG情報はないのでAUC計算はできません。 約40分。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_samplesize <- 5000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成

#前処理(countDataオブジェクトの作成)
NDE <- c(rep(1, param_G1), rep(1, param_G2), rep(1, param_G3))#non-DEGのパターンを作成
DE <- c(rep("G1", param_G1), rep("G2", param_G2), rep("G3", param_G3))#DEGのパターンを作成
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
groups(ba) <- list(NDE=NDE, DE=DE)     #non-DEGとDEGのパターン情報を格納

#本番(正規化)
libsizes(ba) <- getLibsizes(ba, estimationType="edgeR")#edgeRパッケージ中の正規化法を実行

#本番(DEG検出)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算
res <- topCounts(ba, group="DE", normaliseData=T, number=nrow(data))#(発現変動順にソート済みの)解析結果を抽出
res <- res[rownames(data),]            #解析結果をオリジナルの並びに再ソート
q.value <- res$FDR.DE                  #FDR.DEの情報ををq.valueに格納
ranking <- rank(q.value)               #q.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(res), res, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#結果のまとめ(全遺伝子)
head(res$ordering)                     #最初の6遺伝子分のパターンを表示
table(res$ordering)                    #パターンごとの出現頻度を表示
table(res$ordering)/length(res$ordering)#パターンごとの出現確率を表示

#結果のまとめ(FDR閾値を満たすものを概観)
obj <- (q.value < param_FDR)           #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(res$ordering[obj])               #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(res$ordering[obj])/length(res$ordering[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)
    

4. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

3.と基本的に同じでparam_samplesizeで指定するリサンプリング回数を1/10にして実行時間を大幅に短縮しています。約4分。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_samplesize <- 500                #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成

#前処理(countDataオブジェクトの作成)
NDE <- c(rep(1, param_G1), rep(1, param_G2), rep(1, param_G3))#non-DEGのパターンを作成
DE <- c(rep("G1", param_G1), rep("G2", param_G2), rep("G3", param_G3))#DEGのパターンを作成
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
groups(ba) <- list(NDE=NDE, DE=DE)     #non-DEGとDEGのパターン情報を格納

#本番(正規化)
libsizes(ba) <- getLibsizes(ba, estimationType="edgeR")#edgeRパッケージ中の正規化法を実行

#本番(DEG検出)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算
res <- topCounts(ba, group="DE", normaliseData=T, number=nrow(data))#(発現変動順にソート済みの)解析結果を抽出
res <- res[rownames(data),]            #解析結果をオリジナルの並びに再ソート
q.value <- res$FDR.DE                  #FDR.DEの情報ををq.valueに格納
ranking <- rank(q.value)               #q.valueでランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(res), res, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.20)                    #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示

#結果のまとめ(全遺伝子)
head(res$ordering)                     #最初の6遺伝子分のパターンを表示
table(res$ordering)                    #パターンごとの出現頻度を表示
table(res$ordering)/length(res$ordering)#パターンごとの出現確率を表示

#結果のまとめ(FDR閾値を満たすものを概観)
obj <- (q.value < param_FDR)           #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(res$ordering[obj])               #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(res$ordering[obj])/length(res$ordering[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)
    

5. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

例題1と基本的に同じですが、「解析 | 発現変動 | 3群間 | 対応なし | 複製あり | 基礎 | EBSeq(Leng_2013)」 と同じ5種類の発現パターン(Pattern1, Pattern2, ..., Pattern5)を想定するやり方です。 出力形式もEBSeqに似せています。例題1は、Pattern1と5のみを想定するやり方です。約10分。AUC値は0.8783407ですね。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_samplesize <- 1000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成

#前処理(countDataオブジェクトの作成)
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
Pat1 <- factor(c(rep(1, param_G1), rep(1, param_G2), rep(1, param_G3)))#non-DEGのパターンを作成
Pat2 <- factor(c(rep(1, param_G1), rep(1, param_G2), rep(2, param_G3)))#DEGのパターンを作成(G3で発現変動)
Pat3 <- factor(c(rep(1, param_G1), rep(2, param_G2), rep(1, param_G3)))#DEGのパターンを作成(G2で発現変動)
Pat4 <- factor(c(rep(2, param_G1), rep(1, param_G2), rep(1, param_G3)))#DEGのパターンを作成(G1で発現変動)
Pat5 <- factor(c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3)))#DEGのパターンを作成(全ての群間で発現変動)
groups(ba) <- list(Pattern1 = Pat1,    #non-DEGとDEGのパターン情報を格納
             Pattern2 = Pat2,          #non-DEGとDEGのパターン情報を格納
             Pattern3 = Pat3,          #non-DEGとDEGのパターン情報を格納
             Pattern4 = Pat4,          #non-DEGとDEGのパターン情報を格納
             Pattern5 = Pat5)          #non-DEGとDEGのパターン情報を格納

#本番(正規化)
libsizes(ba) <- getLibsizes(ba, estimationType="edgeR")#edgeRパッケージ中の正規化法を実行

#本番(DEG検出)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算

#後処理(EBSeqの出力に合わせている)
out <- list()                          #outというプレースホルダの作成(list形式の結果を格納する場所の作成)
out$PP <- exp(ba@posteriors)           #事後確率情報の抽出(ba@posteriorsが対数変換後の値なので、expで指数化せねばならない)
out$MAP <- paste("Pattern", max.col(out$PP), sep = "")#out$PPの事後確率が最大のパターンを抽出
ranking <- rank(out$PP[, "Pattern1"])  #Pattern1の事後確率が低い順(DEGである確率が高い順)でランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(Pattern1の事後確率の閾値を満たすものを概観)
obj <- (out$PP[, "Pattern1"] < 0.05)   #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)

#AUC値を計算(高いほどよい方法)
library(ROC)                           #パッケージの読み込み
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[1:3000] <- 1                       #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

6. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

例題5と基本的に同じですが、例題1の実行結果中で見られるordering情報をranking列の左側に追加しています。 例えばgene_3はPattern4に属するとなっています。 Pattern4は「G1群が2、それ以外が1」を指定したPat4に対応するので「G1群で発現変動」です。 そのordering情報は"2>1"となっているので「G1群のほうが高発現のパターン」だというのがわかります。 同様に、gene_7はPattern3に属しています。 Pattern3は「G2群が2、それ以外が1」を指定したPat3に対応するので「G2群で発現変動」です。 そのordering情報は"1>2"となっているので「G2群のほうが低発現のパターン」だというのがわかります。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_samplesize <- 1000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成

#前処理(countDataオブジェクトの作成)
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
Pat1 <- factor(c(rep(1, param_G1), rep(1, param_G2), rep(1, param_G3)))#non-DEGのパターンを作成
Pat2 <- factor(c(rep(1, param_G1), rep(1, param_G2), rep(2, param_G3)))#DEGのパターンを作成(G3で発現変動)
Pat3 <- factor(c(rep(1, param_G1), rep(2, param_G2), rep(1, param_G3)))#DEGのパターンを作成(G2で発現変動)
Pat4 <- factor(c(rep(2, param_G1), rep(1, param_G2), rep(1, param_G3)))#DEGのパターンを作成(G1で発現変動)
Pat5 <- factor(c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3)))#DEGのパターンを作成(全ての群間で発現変動)
groups(ba) <- list(Pattern1 = Pat1,    #non-DEGとDEGのパターン情報を格納
             Pattern2 = Pat2,          #non-DEGとDEGのパターン情報を格納
             Pattern3 = Pat3,          #non-DEGとDEGのパターン情報を格納
             Pattern4 = Pat4,          #non-DEGとDEGのパターン情報を格納
             Pattern5 = Pat5)          #non-DEGとDEGのパターン情報を格納

#本番(正規化)
libsizes(ba) <- getLibsizes(ba, estimationType="edgeR")#edgeRパッケージ中の正規化法を実行

#本番(DEG検出)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算

#後処理(EBSeqの出力に合わせている)
out <- list()                          #outというプレースホルダの作成(list形式の結果を格納する場所の作成)
out$PP <- exp(ba@posteriors)           #事後確率情報の抽出(ba@posteriorsが対数変換後の値なので、expで指数化せねばならない)
out$MAP <- paste("Pattern", max.col(out$PP), sep = "")#out$PPの事後確率が最大のパターンを抽出
ranking <- rank(out$PP[, "Pattern1"])  #Pattern1の事後確率が低い順(DEGである確率が高い順)でランキングした結果をrankingに格納
orderings <- NULL                      #最終的に得る結果を格納するためのプレースホルダを作成しているだけ
for(i in 1:length(out$MAP)){           #length(out$MAP)回だけループを回す
    orderings <- append(orderings, as.character(ba@orderings[i, max.col(out$PP)[i]]))#事後確率が最大のパターンについて、群間の大小関係情報を抽出
}

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, orderings, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(Pattern1の事後確率の閾値を満たすものを概観)
obj <- (out$PP[, "Pattern1"] < 0.05)   #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)

#AUC値を計算(高いほどよい方法)
library(ROC)                           #パッケージの読み込み
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[1:3000] <- 1                       #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

7. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

例題6と基本的に同じで、パターン名などを変更しているだけです。解釈のしやすさという点ではこちらのほうが優位かと思います。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_samplesize <- 1000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成

#前処理(countDataオブジェクトの作成)
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
nonDEG <- factor(c(rep("non", param_G1), rep("non", param_G2), rep("non", param_G3)))#non-DEGのパターンを作成
DEG_G3 <- factor(c(rep("other", param_G1), rep("other", param_G2), rep("G3", param_G3)))#DEGのパターンを作成(G3で発現変動)
DEG_G2 <- factor(c(rep("other", param_G1), rep("G2", param_G2), rep("other", param_G3)))#DEGのパターンを作成(G2で発現変動)
DEG_G1 <- factor(c(rep("G1", param_G1), rep("other", param_G2), rep("other", param_G3)))#DEGのパターンを作成(G1で発現変動)
DEG_all <- factor(c(rep("G1", param_G1), rep("G2", param_G2), rep("G3", param_G3)))#DEGのパターンを作成(全ての群間で発現変動)
groups(ba) <- list(nonDEG = nonDEG,    #non-DEGとDEGのパターン情報を格納
             DEG_G3 = DEG_G3,          #non-DEGとDEGのパターン情報を格納
             DEG_G2 = DEG_G2,          #non-DEGとDEGのパターン情報を格納
             DEG_G1 = DEG_G1,          #non-DEGとDEGのパターン情報を格納
             DEG_all = DEG_all)        #non-DEGとDEGのパターン情報を格納

#本番(正規化)
libsizes(ba) <- getLibsizes(ba, estimationType="edgeR")#edgeRパッケージ中の正規化法を実行

#本番(DEG検出)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算

#後処理(EBSeqの出力に合わせている)
out <- list()                          #outというプレースホルダの作成(list形式の結果を格納する場所の作成)
out$PP <- exp(ba@posteriors)           #事後確率情報の抽出(ba@posteriorsが対数変換後の値なので、expで指数化せねばならない)
out$MAP <- NULL                        #最終的に得る結果を格納するためのプレースホルダを作成しているだけ
for(i in 1:nrow(out$PP)){              #nrow(out$PP)回だけループを回す
    out$MAP <- append(out$MAP, colnames(out$PP)[max.col(out$PP)[i]])#out$PPの事後確率が最大のパターンを抽出
}
ranking <- rank(out$PP[, "nonDEG"])    #nonDEGの事後確率が低い順(DEGである確率が高い順)でランキングした結果をrankingに格納
orderings <- NULL                      #最終的に得る結果を格納するためのプレースホルダを作成しているだけ
for(i in 1:length(out$MAP)){           #length(out$MAP)回だけループを回す
    orderings <- append(orderings, as.character(ba@orderings[i, max.col(out$PP)[i]]))#事後確率が最大のパターンについて、群間の大小関係情報を抽出
}

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, orderings, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(nonDEGの事後確率の閾値を満たすものを概観)
obj <- (out$PP[, "nonDEG"] < 0.05)     #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)

#AUC値を計算(高いほどよい方法)
library(ROC)                           #パッケージの読み込み
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[1:3000] <- 1                       #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

8. サンプルデータ15の10,000 genes×9 samplesのカウントデータ生成から行う場合:

サンプルデータ15のシミュレーションデータ作成から行うやり方です。 また、例題7と違って(このシミュレーションデータには存在しないので)「全ての群間で発現変動しているパターン」に相当するDEG_allを考慮しないやり方です。 AUC値は0.8747938ですね。

out_f1 <- "hoge8.txt"                  #出力ファイル名を指定してout_f1に格納(解析結果)
out_f2 <- "hoge8_confusion.txt"        #出力ファイル名を指定してout_f2に格納(混同行列ファイル)
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.3                      #発現変動遺伝子の割合を指定    
param_FC <- c(3, 10, 6)                #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.7, 0.2, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_narabi <- c("nonDEG", "DEG_G1", "DEG_G2", "DEG_G3")#パターン名を指定(並びは変えない)
param_samplesize <- 1000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成
data <- tcc$count                      #カウントデータ情報をdataに格納
data.cl <- tcc$group$group             #G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(countDataオブジェクトの作成)
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
nonDEG <- factor(c(rep("non", param_replicates[1]), rep("non", param_replicates[2]), rep("non", param_replicates[3])))#non-DEGのパターンを作成
DEG_G1 <- factor(c(rep("G1", param_replicates[1]), rep("other", param_replicates[2]), rep("other", param_replicates[3])))#DEGのパターンを作成(G1で発現変動)
DEG_G2 <- factor(c(rep("other", param_replicates[1]), rep("G2", param_replicates[2]), rep("other", param_replicates[3])))#DEGのパターンを作成(G2で発現変動)
DEG_G3 <- factor(c(rep("other", param_replicates[1]), rep("other", param_replicates[2]), rep("G3", param_replicates[3])))#DEGのパターンを作成(G3で発現変動)
groups(ba) <- list(nonDEG = nonDEG,    #non-DEGとDEGのパターン情報を格納
             DEG_G1 = DEG_G1,          #non-DEGとDEGのパターン情報を格納
             DEG_G2 = DEG_G2,          #non-DEGとDEGのパターン情報を格納
             DEG_G3 = DEG_G3)          #non-DEGとDEGのパターン情報を格納

#本番(正規化)
libsizes(ba) <- getLibsizes(ba, estimationType="edgeR")#edgeRパッケージ中の正規化法を実行

#本番(DEG検出)
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算

#後処理(EBSeqの出力に合わせている)
out <- list()                          #outというプレースホルダの作成(list形式の結果を格納する場所の作成)
out$PP <- exp(ba@posteriors)           #事後確率情報の抽出(ba@posteriorsが対数変換後の値なので、expで指数化せねばならない)
out$MAP <- param_narabi[max.col(out$PP)]#out$PPの事後確率が最大のパターンを抽出
ranking <- rank(out$PP[, param_narabi[1]])#param_narabi[1]の事後確率が低い順(DEGである確率が高い順)でランキングした結果をrankingに格納
orderings <- NULL                      #最終的に得る結果を格納するためのプレースホルダを作成しているだけ
for(i in 1:length(out$MAP)){           #length(out$MAP)回だけループを回す
    orderings <- append(orderings, as.character(ba@orderings[i, max.col(out$PP)[i]]))#事後確率が最大のパターンについて、群間の大小関係情報を抽出
}

#混同行列(confusion matrix)の作成
hoge <- param_Ngene*param_PDEG         #トータルのDEG数情報をhogeに格納
DEG_G1_posi <- 1:(hoge*param_DEGassign[1])#G1群で高発現の位置情報
DEG_G2_posi <- (hoge*param_DEGassign[1]+1):(hoge*sum(param_DEGassign[1:2]))#G2群で高発現の位置情報
DEG_G3_posi <- (hoge*sum(param_DEGassign[1:2])+1):hoge#G3群で高発現の位置情報
nonDEG_posi <- (hoge+1):param_Ngene    #non-DEGの位置情報

confusion <- matrix(0, nrow=length(param_narabi), ncol=length(param_narabi))#プレースホルダの作成
for(i in 1:length(param_narabi)){      #length(param_narabi)回だけループを回す
  confusion[i, 1] <- sum(out$MAP[nonDEG_posi] == param_narabi[i])#nonDEG_posi内のクラスター番号群の中でparam_narabi[i]と一致する遺伝子数をカウント
  confusion[i, 2] <- sum(out$MAP[DEG_G1_posi] == param_narabi[i])#DEG_G1_posi内のクラスター番号群の中でparam_narabi[i]と一致する遺伝子数をカウント
  confusion[i, 3] <- sum(out$MAP[DEG_G2_posi] == param_narabi[i])#DEG_G2_posi内のクラスター番号群の中でparam_narabi[i]と一致する遺伝子数をカウント
  confusion[i, 4] <- sum(out$MAP[DEG_G3_posi] == param_narabi[i])#DEG_G3_posi内のクラスター番号群の中でparam_narabi[i]と一致する遺伝子数をカウント
}
confusion  <- cbind(confusion, rowSums(confusion))#各行の総和情報を付加
confusion  <- rbind(confusion, colSums(confusion))#各列の総和情報を付加
colnames(confusion) <- c(param_narabi, "Total")#列名を付加
rownames(confusion) <- c(param_narabi, "Total")#行名を付加
confusion                              #確認してるだけです

#ファイルに保存(解析結果)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, orderings, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(混同行列)
tmp <- cbind(rownames(confusion), confusion)#保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
library(ROC)                           #パッケージの読み込み
obj <- as.numeric(tcc$simulation$trueDEG != 0)#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

解析 | 発現変動 | 3群間 | 対応なし | 複製あり | 基礎 | edgeR(Robinson_2010)

TMM正規化(Robinson_2010)を実行したのち、 edgeRパッケージ中のGLM LRT法で発現変動遺伝子(Differentially Expressed Genes; DEGs) 検出を行うやり方(edgeR coupled with TMM normalization; TMM-edgeR)を示します。デフォルトのedgeRの手順に相当します。 ここでやっていることはANOVAのような「どこかの群間で発現に差がある遺伝子を検出」です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

2. サンプルデータ15の10,000 genes×9 samplesのシミュレーションデータ(data_hypodata_3vs3vs3.txt)と同じものをTCCパッケージ内部で作成する場合:

1.と同じ結果が得られます。

out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータ作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
             DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
             DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
             replicates = c(param_G1, param_G2, param_G3))#各群のサンプル数を指定

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
calcAUCValue(tcc)                      #AUC値計算結果を表示(どこかの群で発現変動しているか否かの1 or 0の予測結果のベクトルと真の情報とのROC曲線の下部面積)
	

3. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

シミュレーションデータ(G1群2サンプル vs. G2群4サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

4. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)と同じものをTCCパッケージ内部で作成する場合:

3.と同じ結果が得られます。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#シミュレーションデータ作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene = 10000, PDEG = 0.3,#全遺伝子数とDEGの割合を指定
             DEG.assign = c(0.7, 0.2, 0.1),#DEGの内訳(G1が70%, G2が20%, G3が10%)を指定
             DEG.foldchange = c(3, 10, 6),#DEGの発現変動度合い(G1が3倍、G2が10倍、G3が6倍)を指定
             replicates = c(param_G1, param_G2, param_G3))#各群のサンプル数を指定

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
calcAUCValue(tcc)                      #AUC値計算結果を表示(どこかの群で発現変動しているか否かの1 or 0の予測結果のベクトルと真の情報とのROC曲線の下部面積)
	

5. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

1.と基本的に同じで、出力のテキストファイルが正規化前のデータではなく正規化後のデータになっていて、発現変動順にソートしたものになっています。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
    

6. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

1.と基本的に同じですが、デザイン行列designと係数coefを明示的に作成および指定しています。 coefに入っている数値は、length(unique(data.cl))の値が3になるので、2:3、つまり2と3になります。 これがANOVA的などこかの群間で発現変動しているものを検出するときに指定する値です。 感覚的にはdesign[,2] - design[,3]をやっていることになり、「G1で-1, G2で0, G3で1」と全ての群で異なる数値が割り振られることになります。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
design <- model.matrix(~ as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
coef <- 2:length(unique(data.cl))      #線形モデルの比較する係数を指定(全ての群間比較時のおまじない的な記述法です)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR,#DEG検出を実行した結果をtccに格納
                       design=design, coef=coef)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

7. サンプルデータ16の10,000 genes×9 samplesのカウントデータ(data_hypodata_2vs4vs3.txt)の場合:

3.と基本的に同じで、TCCパッケージを使わずにedgeRパッケージ中の関数のみで行うやり方です。TCCのほうが手順的にも簡便であることがわかります。

in_f <- "data_hypodata_2vs4vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(DGEListオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
d <- DGEList(data, group=data.cl)      #DGEListオブジェクトdを作成

#本番(正規化)
d <- calcNormFactors(d)                #正規化を実行した結果をdに格納

#本番(DEG検出)
design <- model.matrix(~ as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #NB GLMへのfitting
coef <- 2:length(unique(data.cl))      #線形モデルの比較する係数を指定(全ての群間比較時のおまじない的な記述法です)
lrt <- glmLRT(fit, coef=coef)          #検定
tmp <- topTags(lrt, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- tmp$table$PValue            #p値を抽出
q.value <- tmp$table$FDR               #q値を抽出
result <- cbind(p.value, q.value)      #p値とq値をまとめた結果をresultに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

8. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

シミュレーションデータ(G1群4サンプル vs. G2群4サンプル vs. G3群4サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_1000がG1群で5倍高発現、gene_1001〜gene_2000がG2群で5倍高発現、gene_2001〜gene_3000がG3群で5倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。このDEG or non-DEGの位置情報と実際のランキング結果情報を用いてAUC値の計算も行っています。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge8.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_FDR <- 0.1                       #false discovery rate (FDR)閾値を指定
param_DEG <- 1:3000                    #DEGの位置を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", iteration=0)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

9. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

8.と基本的に同じですが、TCCパッケージではなくedgeRパッケージ中の関数を利用しています。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge9.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_FDR <- 0.1                       #false discovery rate (FDR)閾値を指定
param_DEG <- 1:3000                    #DEGの位置を指定

#必要なパッケージをロード
library(edgeR)                         #パッケージの読み込み
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(DGEListオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
d <- DGEList(data, group=data.cl)      #DGEListオブジェクトdを作成

#本番(正規化)
d <- calcNormFactors(d)                #正規化を実行した結果をdに格納

#本番(DEG検出)
design <- model.matrix(~ as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
d <- estimateGLMCommonDisp(d, design)  #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTrendedDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
d <- estimateGLMTagwiseDisp(d, design) #モデル構築(ばらつきの程度を見積もっている)
fit <- glmFit(d, design)               #NB GLMへのfitting
coef <- 2:length(unique(data.cl))      #線形モデルの比較する係数を指定(全ての群間比較時のおまじない的な記述法です)
lrt <- glmLRT(fit, coef=coef)          #検定
tmp <- topTags(lrt, n=nrow(data), sort.by="none")#検定結果を抽出
p.value <- tmp$table$PValue            #p値を抽出
q.value <- tmp$table$FDR               #q値を抽出
result <- cbind(p.value, q.value)      #p値とq値をまとめた結果をresultに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

解析 | 発現変動 | 3群間 | 対応なし | 複製あり | 応用 | TCC(Sun_2013)

「応用」でやりたいことは、例題1-7「指定した群間で発現に差がある遺伝子の検出」、そして例題8以降が「基礎」の結果と遺伝子間クラスタリングを組み合わせたパターン分類です。 例題1-7「指定した群間で発現に差がある遺伝子の検出」デザイン行列design中のparam_coefで指定した列を除くことでreduced modelを作成します。 TCCを用いたやり方を示します。 内部的にiDEGES/edgeR(Sun_2013)正規化を実行したのち、 edgeRパッケージ中のGLM LRT法で発現変動遺伝子(Differentially Expressed Genes; DEGs)検出を行っています。 TCC原著論文中のiDEGES/edgeR-edgeRという解析パイプラインに相当します。TCC原著論文(Sun et al., BMC Bioinformatics, 2013)では 3群間複製ありデータ用の推奨パイプラインを示していませんでしたが、多群間比較用の推奨ガイドライン提唱論文 (Tang et al., BMC Bioinformatics, 2015) で推奨しているパイプライン"EEE-E"が"iDEGES/edgeR-edgeR"と同じものです。この2つの論文を引用し、安心してご利用ください。 例題8以降は、MBCluster.Seqも利用しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

シミュレーションデータ(G1群4サンプル vs. G2群4サンプル vs. G3群4サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_1000がG1群で5倍高発現、gene_1001〜gene_2000がG2群で5倍高発現、gene_2001〜gene_3000がG3群で5倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。ANOVAと同じく、どこかの群間で発現変動しているものを検出するやり方(帰無仮説: G1 = G2 = G3)です。 出力ファイルのestimatedDEG列を眺めると、DEGに相当する最初の1行目から3000行目のところのほとんどが1, それ以外の3001から10000行のほとんどが0になっていることからparam_coefでの指定方法が妥当であることが分かります。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_FDR <- 0.1                       #false discovery rate (FDR)閾値を指定
param_coef <- c(2, 3)                  #デザイン行列中の除きたい列を指定(reduced model作成用)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
design <- model.matrix(~ as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR,#DEG検出を実行した結果をtccに格納
                  design=design, coef=param_coef)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示
design                                 #デザイン行列の情報を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

2. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

「G1群 vs. G2群」の比較を行いたいときの指定方法(帰無仮説: G1 = G2)です。 出力ファイルのestimatedDEG列を眺めると、DEGに相当する最初の1行目から2000行目のところのほとんどが1である一方、 G3群で高発現DEGの2001から3000行目のほとんどが0となっていることから、param_coefでの指定方法が妥当であることが分かります。 「full modelに相当するデザイン行列designの2列目のパラメータを除いたものをreduced modelとする」という指定に相当します。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_FDR <- 0.1                       #false discovery rate (FDR)閾値を指定
param_coef <- 2                        #デザイン行列中の除きたい列を指定(reduced model作成用)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
design <- model.matrix(~ as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR,#DEG検出を実行した結果をtccに格納
                  design=design, coef=param_coef)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示
design                                 #デザイン行列の情報を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

3. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

「G1群 vs. G3群」の比較を行いたいときの指定方法(帰無仮説: G1 = G3)です。 出力ファイルのestimatedDEG列を眺めると、DEGに相当する最初の1-1000行目および2001-3000行目のところのほとんどが1である一方、 G2群で高発現DEGの1001から2000行目のほとんどが0となっていることから、param_coefでの指定方法が妥当であることが分かります。 「full modelに相当するデザイン行列designの3列目のパラメータを除いたものをreduced modelとする」という指定に相当します。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_FDR <- 0.1                       #false discovery rate (FDR)閾値を指定
param_coef <- 3                        #デザイン行列中の除きたい列を指定(reduced model作成用)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
design <- model.matrix(~ as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR,#DEG検出を実行した結果をtccに格納
                  design=design, coef=param_coef)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示
design                                 #デザイン行列の情報を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

4. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

「G2群 vs. G3群」の比較を行いたいときの指定方法(帰無仮説: G2 = G3)です。 出力ファイルのestimatedDEG列を眺めると、DEGに相当する最初の1001-3000行目のところのほとんどが1である一方、 G1群で高発現DEGの1から1000行目のほとんどが0となっていることから、param_contrastでの指定方法が妥当であることが分かります。 1-3.のようにparam_coefの枠組みではうまくG2 vs. G3をうまく表現できないので、コントラストという別の枠組みで指定しています。 思考回路としては、「a1*G1 + a2*G2 + a3*G3 = 0」として、この場合の目的である「G2 = G3という帰無仮説」を作成できるように、係数a1, a2, a3に適切な数値を代入することです。 ここではa1 = 0、a2 = -1, a3 = 1にすることで目的の帰無仮説を作成できます。 以下ではc(0, -1, 1)と指定していますが、 c(0, 1, -1)でも構いません。 理由はどちらでもG2 = G3を表現できているからです。 尚、full modelに相当するデザイン行列の作成手順も若干異なります。具体的には、model.matrix関数実行時に「0 + 」を追加しています。 これによって、最初の1列目が全て1になるようなG1群を基準にして作成したデザイン行列ではなく、各群が各列になるようにしています。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_FDR <- 0.1                       #false discovery rate (FDR)閾値を指定
param_contrast <- c(0, -1, 1)          #コントラスト情報を指定(reduced model作成用)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
design <- model.matrix(~ 0 + as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR,#DEG検出を実行した結果をtccに格納
                  design=design, contrast=param_contrast)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示
design                                 #デザイン行列の情報を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

5. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

「G1群 vs. G2群」の比較を行いたいときの指定方法(帰無仮説: G1 = G2)です。 出力ファイルのestimatedDEG列を眺めると、DEGに相当する最初の1行目から2000行目のところのほとんどが1である一方、 G3群で高発現DEGの2001から3000行目のほとんどが0となっていることから、param_contrastでの指定方法が妥当であることが分かります。 思考回路としては、「a1*G1 + a2*G2 + a3*G3 = 0」として、この場合の目的である「G1 = G2という帰無仮説」を作成できるように、係数a1, a2, a3に適切な数値を代入することです。 ここではa1 = 1、a2 = -1, a3 = 0にすることで目的の帰無仮説を作成できます。 以下ではc(1, -1, 0)と指定していますが、 c(-1, 1, 0)でも構いません。理由はどちらでもG1 = G2を表現できているからです。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_FDR <- 0.1                       #false discovery rate (FDR)閾値を指定
param_contrast <- c(1, -1, 0)          #コントラスト情報を指定(reduced model作成用)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
design <- model.matrix(~ 0 + as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR,#DEG検出を実行した結果をtccに格納
                  design=design, contrast=param_contrast)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示
design                                 #デザイン行列の情報を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

6. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

「G1群 vs. G3群」の比較を行いたいときの指定方法(帰無仮説: G1 = G3)です。 出力ファイルのestimatedDEG列を眺めると、DEGに相当する最初の1-1000行目および2001-3000行目のところのほとんどが1である一方、 G2群で高発現DEGの1001から2000行目のほとんどが0となっていることから、param_contrastでの指定方法が妥当であることが分かります。 思考回路としては、「a1*G1 + a2*G2 + a3*G3 = 0」として、この場合の目的である「G1 = G3という帰無仮説」を作成できるように、係数a1, a2, a3に適切な数値を代入することです。 ここではa1 = 1、a2 = 0, a3 = -1にすることで目的の帰無仮説を作成できます。 以下ではc(1, 0, -1)と指定していますが、 c(-1, 0, 1)でも構いません。理由はどちらでもG1 = G3を表現できているからです。

in_f <- "data_hypodata_4vs4vs4.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_FDR <- 0.1                       #false discovery rate (FDR)閾値を指定
param_contrast <- c(1, 0, -1)          #コントラスト情報を指定(reduced model作成用)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
design <- model.matrix(~ 0 + as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR,#DEG検出を実行した結果をtccに格納
                  design=design, contrast=param_contrast)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示
design                                 #デザイン行列の情報を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

7. サンプルデータ40の10,000 genes×12 samplesのカウントデータ(data_hypodata_4vs4vs4.txt)の場合:

例題6までとは異なり、MBCluster.Seqを用いた遺伝子間クラスタリングを行った結果を合わせるやり方です。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge7.txt"                  #出力ファイル名を指定してout_f1に格納(txtファイル)
out_f2 <- "hoge7.png"                  #出力ファイル名を指定してout_f2に格納(pngファイル)
param_G1 <- 4                          #G1群のサンプル数を指定
param_G2 <- 4                          #G2群のサンプル数を指定
param_G3 <- 4                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(800, 500)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_clust_num <- 10                  #クラスター数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(MBCluster.Seq)                 #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(TCC正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#前処理(MBCluster.Seq基礎情報取得)
hoge <- RNASeq.Data(data, Normalizer=NULL,#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得

#本番(MBCluster.Seqクラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)
table(cls$cluster)                     #各クラスターに属する遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result, cls$cluster)#保存したい情報をtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.20)                    #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotHybrid.Tree(merge=tr, cluster=cls$cluster, logFC=hoge$logFC, tree.title=NULL)#描画
dev.off()                              #おまじない

#後処理(各クラスターに属する遺伝子数を表示)
table(cls$cluster)                     #各クラスターに属する遺伝子数を表示(全遺伝子)
table(cls$cluster[q.value < 0.05])     #各クラスターに属する遺伝子数を表示(q-value < 0.05を満たす遺伝子のみ)
table(cls$cluster[q.value < 0.10])     #各クラスターに属する遺伝子数を表示(q-value < 0.10を満たす遺伝子のみ)
table(cls$cluster[q.value < 0.20])     #各クラスターに属する遺伝子数を表示(q-value < 0.20を満たす遺伝子のみ)
table(cls$cluster[q.value < 0.30])     #各クラスターに属する遺伝子数を表示(q-value < 0.30を満たす遺伝子のみ)
    

8. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

7.と基本的に同じで、入力ファイルが違うだけです。Blekhman et al., Genome Res., 2010の 20,689 genes×18 samplesのカウントデータです。ヒト(HS)、チンパンジー(PT)、アカゲザル(RM)の3生物種間比較です。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge8.txt"                  #出力ファイル名を指定してout_f1に格納(txtファイル)
out_f2 <- "hoge8.png"                  #出力ファイル名を指定してout_f2に格納(pngファイル)
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(800, 500)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_clust_num <- 10                  #クラスター数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(MBCluster.Seq)                 #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(TCC正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#前処理(MBCluster.Seq基礎情報取得)
hoge <- RNASeq.Data(data, Normalizer=NULL,#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得

#本番(MBCluster.Seqクラスタリング)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)
table(cls$cluster)                     #各クラスターに属する遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result, cls$cluster)#保存したい情報をtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.20)                    #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotHybrid.Tree(merge=tr, cluster=cls$cluster, logFC=hoge$logFC, tree.title=NULL)#描画
dev.off()                              #おまじない

#後処理(各クラスターに属する遺伝子数を表示)
table(cls$cluster)                     #各クラスターに属する遺伝子数を表示(全遺伝子)
table(cls$cluster[q.value < 0.05])     #各クラスターに属する遺伝子数を表示(q-value < 0.05を満たす遺伝子のみ)
table(cls$cluster[q.value < 0.10])     #各クラスターに属する遺伝子数を表示(q-value < 0.10を満たす遺伝子のみ)
table(cls$cluster[q.value < 0.20])     #各クラスターに属する遺伝子数を表示(q-value < 0.20を満たす遺伝子のみ)
table(cls$cluster[q.value < 0.30])     #各クラスターに属する遺伝子数を表示(q-value < 0.30を満たす遺伝子のみ)
    

9. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

8.と基本的に同じで、MBCluster.Seq実行時にTCC正規化後のデータを入力としています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge9.txt"                  #出力ファイル名を指定してout_f1に格納(txtファイル)
out_f2 <- "hoge9.png"                  #出力ファイル名を指定してout_f2に格納(pngファイル)
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(800, 500)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_clust_num <- 10                  #クラスター数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(MBCluster.Seq)                 #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(TCC正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
norm.factors <- tcc$norm.factors       #TCC正規化係数をnorm.factorsに格納
ef.libsizes <- colSums(data)*norm.factors#総リード数(library sizes)に正規化係数を掛けて得たeffective library sizes情報をef.libsizesに格納
size.factors <- ef.libsizes/mean(ef.libsizes)#effective library sizesを正規化してサイズファクターを得る

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#前処理(MBCluster.Seq基礎情報取得)
hoge <- RNASeq.Data(data, Normalizer=size.factors,#クラスタリングに必要な基礎情報を取得
           Treatment=data.cl, GeneID=rownames(data))#クラスタリングに必要な基礎情報を取得
           
#本番(MBCluster.Seqクラスタリング)
set.seed(2016)                         #おまじない(同じ乱数になるようにするため)
c0 <- KmeansPlus.RNASeq(data=hoge, nK=param_clust_num,#K-means clusteringのクラスター中心の初期値を取得
           model="nbinom", print.steps=F)#K-means clusteringのクラスター中心の初期値を取得
cls <- Cluster.RNASeq(data=hoge, model="nbinom",#クラスタリング
           centers=c0$centers, method="EM")#クラスタリング
tr <- Hybrid.Tree(data=hoge, model="nbinom",cluster=cls$cluster)#hybrid-hierarchical clustering(ツリー構造の構築)

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result, cls$cluster)#保存したい情報をtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.20)                    #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plotHybrid.Tree(merge=tr, cluster=cls$cluster, logFC=hoge$logFC, tree.title=NULL)#描画
dev.off()                              #おまじない

#後処理(各クラスターに属する遺伝子数を表示)
table(cls$cluster)                     #各クラスターに属する遺伝子数を表示(全遺伝子)
table(cls$cluster[q.value < 0.05])     #各クラスターに属する遺伝子数を表示(q-value < 0.05を満たす遺伝子のみ)
table(cls$cluster[q.value < 0.10])     #各クラスターに属する遺伝子数を表示(q-value < 0.10を満たす遺伝子のみ)
table(cls$cluster[q.value < 0.20])     #各クラスターに属する遺伝子数を表示(q-value < 0.20を満たす遺伝子のみ)
table(cls$cluster[q.value < 0.30])     #各クラスターに属する遺伝子数を表示(q-value < 0.30を満たす遺伝子のみ)
    

解析 | 発現変動 | 3群間 | 対応なし | 複製あり | 応用 | Blekhmanデータ | TCC(Sun_2013)

「解析 | 発現変動 | 3群間 | 対応なし | 複製あり | 応用 | TCC(Sun_2013)」 と基本的に同じです。Blekhman et al., Genome Res., 2010の公共カウントデータ解析に特化させて、 TCCを用いた様々な例題を示します。 入力は全てサンプルデータ42の20,689 genes×18 samplesのリアルカウントデータ (sample_blekhman_18.txt)です。 ヒトHomo sapiens; HS)のメス3サンプル(HSF1-3)とオス3サンプル(HSM1-3), チンパンジー(Pan troglodytes; PT)のメス3サンプル(PTF1-3)とオス3サンプル(PTM1-3), アカゲザル(Rhesus macaque; RM)のメス3サンプル(RMF1-3)とオス3サンプル(RMM1-3)の並びになっています。 つまり、以下のような感じです。FはFemale(メス)、MはMale(オス)を表します。

ヒト(1-6列目): HSF1, HSF2, HSF3, HSM1, HSM2, and HSM3

チンパンジー(7-12列目): PTF1, PTF2, PTF3, PTM1, PTM2, and PTM3

アカゲザル(13-18列目): RMF1, RMF2, RMF3, RMM1, RMM2, and RMM3

2022年9月2日にいただいた情報として、一部の例題で挙動がおかしいようです。少なくとも例題4でエラーが出ることを私も確認済みです。この原因はTCCパッケージが内部的に用いているedgeRの仕様変更に起因します。半年ほど前まではうまく動いていたようですが、多群間比較のpost-hoc testは組み合わせも多数あるので作業が煩雑です。それゆえ、多群間比較の場合は「解析 | 発現変動 | 3群間 | 対応なし | 複製あり | 応用 | TCC+baySeq(Osabe_2019)」の例題8以降を参考にして解析するようにしてください。こちらのやり方だと、どの群間で発現変動しているかといった発現パターン分類までone-stopでやってくれます(この推奨パイプラインの原著論文はOsabe et al., Bioinform. Biol. Insight, 2019です)。(2022/09/03)

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ANOVA的な解析の場合:

どこかの群間で発現変動しているものを検出するやり方(帰無仮説: G1 = G2 = G3)です。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_coef <- c(2, 3)                  #デザイン行列中の除きたい列を指定(reduced model作成用)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
design <- model.matrix(~ as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR,#DEG検出を実行した結果をtccに格納
                  design=design, coef=param_coef)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
design                                 #デザイン行列の情報を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.20)                    #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
    

2. post-hoc testで「G1群 vs. G2群」の比較の場合:

「G1群 vs. G2群」の比較を行いたいときの指定方法(帰無仮説: G1 = G2)です。 「full modelに相当するデザイン行列designの2列目のパラメータを除いたものをreduced modelとする」という指定に相当します。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_coef <- 2                        #デザイン行列中の除きたい列を指定(reduced model作成用)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
design <- model.matrix(~ as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR,#DEG検出を実行した結果をtccに格納
                  design=design, coef=param_coef)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
design                                 #デザイン行列の情報を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.20)                    #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
    

3. post-hoc testで「G1群 vs. G3群」の比較の場合:

「G1群 vs. G3群」の比較を行いたいときの指定方法(帰無仮説: G1 = G3)です。 「full modelに相当するデザイン行列designの3列目のパラメータを除いたものをreduced modelとする」という指定に相当します。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_coef <- 3                        #デザイン行列中の除きたい列を指定(reduced model作成用)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
design <- model.matrix(~ as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR,#DEG検出を実行した結果をtccに格納
                  design=design, coef=param_coef)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
design                                 #デザイン行列の情報を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.20)                    #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
    

4. post-hoc testで「G2群 vs. G3群」の比較の場合:

「G2群 vs. G3群」の比較を行いたいときの指定方法(帰無仮説: G2 = G3)です。 param_coefの枠組みではうまくG2 vs. G3をうまく表現できないので、コントラストという別の枠組みで指定しています。 思考回路としては、「a1*G1 + a2*G2 + a3*G3 = 0」として、この場合の目的である「G2 = G3という帰無仮説」を作成できるように、係数a1, a2, a3に適切な数値を代入することです。 ここではa1 = 0、a2 = -1, a3 = 1にすることで目的の帰無仮説を作成できます。 以下ではc(0, -1, 1)と指定していますが、 c(0, 1, -1)でも構いません。 理由はどちらでもG2 = G3を表現できているからです。 尚、full modelに相当するデザイン行列の作成手順も若干異なります。具体的には、model.matrix関数実行時に「0 + 」を追加しています。 これによって、最初の1列目が全て1になるようなG1群を基準にして作成したデザイン行列ではなく、各群が各列になるようにしています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_contrast <- c(0, -1, 1)          #コントラスト情報を指定(reduced model作成用)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
#design <- model.matrix(~ as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
design <- model.matrix(~ 0 + as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR,#DEG検出を実行した結果をtccに格納
                  design=design, contrast=param_contrast)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
design                                 #デザイン行列の情報を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.20)                    #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
    

5. post-hoc testで「G1群 vs. G2群」の比較の場合:

コントラストで「G1群 vs. G2群」の比較を行いたいときの指定方法(帰無仮説: G1 = G2)です。 ここではa1 = 1、a2 = -1, a3 = 0にすることで目的の帰無仮説を作成できます。 以下ではc(1, -1, 0)と指定していますが、 c(-1, 1, 0)でも構いません。 理由はどちらでもG1 = G2を表現できているからです。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_contrast <- c(1, -1, 0)          #コントラスト情報を指定(reduced model作成用)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
#design <- model.matrix(~ as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
design <- model.matrix(~ 0 + as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR,#DEG検出を実行した結果をtccに格納
                  design=design, contrast=param_contrast)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
design                                 #デザイン行列の情報を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.20)                    #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
    

6. post-hoc testで「G1群 vs. G3群」の比較の場合:

コントラストで「G1群 vs. G3群」の比較を行いたいときの指定方法(帰無仮説: G1 = G3)です。 ここではa1 = 1、a2 = 0, a3 = -1にすることで目的の帰無仮説を作成できます。 以下ではc(1, 0, -1)と指定していますが、 c(-1, 0, 1)でも構いません。 理由はどちらでもG1 = G3を表現できているからです。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_contrast <- c(1, 0, -1)          #コントラスト情報を指定(reduced model作成用)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
#design <- model.matrix(~ as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
design <- model.matrix(~ 0 + as.factor(data.cl))#デザイン行列を作成した結果をdesignに格納
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR,#DEG検出を実行した結果をtccに格納
                  design=design, contrast=param_contrast)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
design                                 #デザイン行列の情報を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(tmp$rank),]           #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.20)                    #FDR = 0.20 (q-value < 0.20)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
    

解析 | 発現変動 | 3群間 | 対応なし | 複製あり | 応用 | TCC+baySeq(Osabe_2019)

TCCbaySeq を組み合わせたやり方を示します。例題8以降が推奨パイプライン(Osabe et al., Bioinform. Biol. Insight, 2019)です(2019年7月10日追記)。 例題1-7までは、「TCC中のiDEGES/edgeR正規化で得られた正規化係数をbaySeqに与えた解析パイプライン」です。 TCC原著論文中のiDEGES/edgeR-baySeqという解析パイプラインに相当し、 多群間比較用の推奨ガイドライン提唱論文(Tang et al., 2015)の表記法に従うとEEE-bに相当します。

その後、このパイプライン(EEE-b)は、TCCのデフォルトの解析パイプライン(EEE-E)よりも全体的な発現変動のランキングの点で劣っていることが判明しました(Osabe et al., 2019)。 しかし、EEE-Eはどこかの群間で発現変動しているというANOVA的な結果までしか返さないのに対して、EEE-bは発現変動パターンの割当て(や分類)の点で優位です。 理由は、TCCやedgeRやDESeq2を用いて3群間比較で発現変動パターンの割当まで行う場合、「G1 vs. G2、G1 vs. G3、G2 vs. G3の3通りの2群間比較を独立に行ってから、 その結果に基づいて発現変動パターンを構築する」とか、あるいは 「(G1+G2) vs. G3、(G1+G3) vs. G2、(G2+G3) vs. G1を行ってから構築する」などやろうと思えばやれないことはないが現実には結構大変だからです。 例題8は、全体的な発現変動の度合い(ANOVA的などこかの群間で発現変動している度合いでのランキング)をEEE-Eで行い、 発現変動パターンの同定をEEE-b(長部らの原著論文中ではEEE-baySEqと表記)で行った結果を出力しています。 以下は2020年07月29日に追加した情報。入力ファイルに実数が含まれるとうまく動きませんのでご注意ください。 例えば、STAR-RSEMで作成したものでexpected_countをそのまま入力として与えたい場合は、 入力ファイル読み込み後のオブジェクトに対してround関数を実行するなどすればよいです(茂木朋貴 氏提供情報)

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。 試行(trial)ごとに得られる数値が変わるようにしたい場合はset.seed(2015)の前に#を入れましょう。 つまり「set.seed(2015)」->「#set.seed(2015)」です。 2015はタネ番号なので3496などでも構いません。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_samplesize <- 1000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#TCC正規化
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#前処理(countDataオブジェクトの作成)
NDE <- c(rep(1, param_G1), rep(1, param_G2), rep(1, param_G3))#non-DEGのパターンを作成
DE <- c(rep("G1", param_G1), rep("G2", param_G2), rep("G3", param_G3))#DEGのパターンを作成
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
groups(ba) <- list(NDE=NDE, DE=DE)     #non-DEGとDEGのパターン情報を格納
ba@annotation <- data.frame(name = tcc$gene_id)#geneID情報を格納(2022.09.03追加)

#本番(TCC正規化係数のbaySeqへの組み込み)
libsizes(ba) <- colSums(data)*tcc$norm.factors#TCC正規化後のライブラリサイズを格納

#本番(DEG検出)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算
res <- topCounts(ba, group="DE", normaliseData=T, number=nrow(data))#(発現変動順にソート済みの)解析結果を抽出
rownames(res)  <- res$name             #resの行名を変更(2022.09.03追加)
res <- res[rownames(data),]            #解析結果をオリジナルの並びに再ソート
q.value <- res$FDR.DE                  #FDR.DEの情報ををq.valueに格納
ranking <- rank(q.value)               #q.valueでランキングした結果をrankingに格納
sum(q.value < param_FDR)               #FDR閾値(q.value < param_FDR)を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(res), res, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#結果のまとめ(全遺伝子)
head(res$DE)                           #最初の6遺伝子分のパターンを表示
table(res$DE)                          #パターンごとの出現頻度を表示
table(res$DE)/length(res$DE)           #パターンごとの出現確率を表示

#結果のまとめ(FDR閾値を満たすものを概観)
obj <- (q.value < param_FDR)           #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(res$DE[obj])                     #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(res$DE[obj])/length(res$DE[obj]) #パターンごとの出現確率を表示(条件を満たすもののみ)

#AUC値を計算(高いほどよい方法)
library(ROC)                           #パッケージの読み込み
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[1:3000] <- 1                       #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

2. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。 試行(trial)ごとに得られる数値が変わるようにしたい場合はset.seed(2015)の前に#を入れましょう。 つまり「set.seed(2015)」->「#set.seed(2015)」です。 2015はタネ番号なので3496などでも構いません。 出力ファイルのout$MAP列にはPattern1からPattern4までのいずれかが表示されていますが、 「Pattern1はnon-DEG、Pattern2はG1群で発現変動、Pattern3はG2群で発現変動、Pattern4はG3群で発現変動」 だと読み解きます。orderings列には、発現変動の方向についての情報が記載されています。Pattern1はnon-DEGなので情報はありません。 Pattern2から4までについて「1<2または2>1」の情報が記載されています。例えばPattern2はG1群に着目していますので、 着目している群のほうが高発現であれば2>1が、低発現であれば1<2が表示されます。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_samplesize <- 1000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#TCC正規化
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#前処理(countDataオブジェクトの作成)
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
Pat1 <- factor(c(rep(1, param_G1), rep(1, param_G2), rep(1, param_G3)))#non-DEGのパターンを作成
Pat2 <- factor(c(rep(2, param_G1), rep(1, param_G2), rep(1, param_G3)))#DEGのパターンを作成(G1で発現変動)
Pat3 <- factor(c(rep(1, param_G1), rep(2, param_G2), rep(1, param_G3)))#DEGのパターンを作成(G2で発現変動)
Pat4 <- factor(c(rep(1, param_G1), rep(1, param_G2), rep(2, param_G3)))#DEGのパターンを作成(G3で発現変動)
groups(ba) <- list(Pattern1 = Pat1,    #non-DEGとDEGのパターン情報を格納
             Pattern2 = Pat2,          #non-DEGとDEGのパターン情報を格納
             Pattern3 = Pat3,          #non-DEGとDEGのパターン情報を格納
             Pattern4 = Pat4)          #non-DEGとDEGのパターン情報を格納
ba@annotation <- data.frame(name = tcc$gene_id)#geneID情報を格納(2022.09.03追加)

#本番(TCC正規化係数のbaySeqへの組み込み)
libsizes(ba) <- colSums(data)*tcc$norm.factors#TCC正規化後のライブラリサイズを格納

#本番(DEG検出)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算

#後処理(EBSeqの出力に合わせている)
out <- list()                          #outというプレースホルダの作成(list形式の結果を格納する場所の作成)
out$PP <- exp(ba@posteriors)           #事後確率情報の抽出(ba@posteriorsが対数変換後の値なので、expで指数化せねばならない)
out$MAP <- paste("Pattern", max.col(out$PP), sep = "")#out$PPの事後確率が最大のパターンを抽出
ranking <- rank(out$PP[, "Pattern1"])  #Pattern1の事後確率が低い順(DEGである確率が高い順)でランキングした結果をrankingに格納
orderings <- NULL                      #最終的に得る結果を格納するためのプレースホルダを作成しているだけ
for(i in 1:length(out$MAP)){           #length(out$MAP)回だけループを回す
    orderings <- append(orderings, as.character(ba@orderings[i, max.col(out$PP)[i]]))#事後確率が最大のパターンについて、群間の大小関係情報を抽出
}

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, orderings, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(Pattern1の事後確率の閾値を満たすものを概観)
obj <- (out$PP[, "Pattern1"] < 0.05)   #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)

#AUC値を計算(高いほどよい方法)
library(ROC)                           #パッケージの読み込み
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[1:3000] <- 1                       #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

3. サンプルデータ15の10,000 genes×9 samplesのカウントデータ生成から行う場合:

サンプルデータ15のシミュレーションデータ作成から行うやり方です。

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.3                      #発現変動遺伝子の割合を指定    
param_FC <- c(3, 10, 6)                #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.7, 0.2, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_narabi <- c("nonDEG", "DEG_G1", "DEG_G2", "DEG_G3")#パターン名を指定(並びは変えない)
param_samplesize <- 1000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成
data <- tcc$count                      #カウントデータ情報をdataに格納
data.cl <- tcc$group$group             #G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#TCC正規化
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#前処理(countDataオブジェクトの作成)
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
Pat1 <- factor(c(rep(1, param_replicates[1]), rep(1, param_replicates[2]), rep(1, param_replicates[3])))#non-DEGのパターンを作成
Pat2 <- factor(c(rep(2, param_replicates[1]), rep(1, param_replicates[2]), rep(1, param_replicates[3])))#DEGのパターンを作成(G1で発現変動)
Pat3 <- factor(c(rep(1, param_replicates[1]), rep(2, param_replicates[2]), rep(1, param_replicates[3])))#DEGのパターンを作成(G2で発現変動)
Pat4 <- factor(c(rep(1, param_replicates[1]), rep(1, param_replicates[2]), rep(2, param_replicates[3])))#DEGのパターンを作成(G3で発現変動)
groups(ba) <- list(Pattern1 = Pat1,    #non-DEGとDEGのパターン情報を格納
             Pattern2 = Pat2,          #non-DEGとDEGのパターン情報を格納
             Pattern3 = Pat3,          #non-DEGとDEGのパターン情報を格納
             Pattern4 = Pat4)          #non-DEGとDEGのパターン情報を格納

#本番(TCC正規化係数のbaySeqへの組み込み)
libsizes(ba) <- colSums(data)*tcc$norm.factors#TCC正規化後のライブラリサイズを格納

#本番(DEG検出)
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算

#後処理(EBSeqの出力に合わせている)
out <- list()                          #outというプレースホルダの作成(list形式の結果を格納する場所の作成)
out$PP <- exp(ba@posteriors)           #事後確率情報の抽出(ba@posteriorsが対数変換後の値なので、expで指数化せねばならない)
out$MAP <- paste("Pattern", max.col(out$PP), sep = "")#out$PPの事後確率が最大のパターンを抽出
ranking <- rank(out$PP[, "Pattern1"])  #Pattern1の事後確率が低い順(DEGである確率が高い順)でランキングした結果をrankingに格納
orderings <- NULL                      #最終的に得る結果を格納するためのプレースホルダを作成しているだけ
for(i in 1:length(out$MAP)){           #length(out$MAP)回だけループを回す
    orderings <- append(orderings, as.character(ba@orderings[i, max.col(out$PP)[i]]))#事後確率が最大のパターンについて、群間の大小関係情報を抽出
}

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, orderings, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(Pattern1の事後確率の閾値を満たすものを概観)
obj <- (out$PP[, "Pattern1"] < 0.05)   #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)

#AUC値を計算(高いほどよい方法)
library(ROC)                           #パッケージの読み込み
obj <- as.numeric(tcc$simulation$trueDEG != 0)#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

4. サンプルデータ15の10,000 genes×9 samplesのカウントデータ生成から行う場合:

例題3と基本的に同じで、パターン名などを変更しているだけです。解釈のしやすさという点ではこちらのほうが優位かと思います。

out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.3                      #発現変動遺伝子の割合を指定    
param_FC <- c(3, 10, 6)                #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.7, 0.2, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_narabi <- c("nonDEG", "DEG_G1", "DEG_G2", "DEG_G3")#パターン名を指定(並びは変えない)
param_samplesize <- 1000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成
data <- tcc$count                      #カウントデータ情報をdataに格納
data.cl <- tcc$group$group             #G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#TCC正規化
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#前処理(countDataオブジェクトの作成)
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
nonDEG <- factor(c(rep("non", param_replicates[1]), rep("non", param_replicates[2]), rep("non", param_replicates[3])))#non-DEGのパターンを作成
DEG_G1 <- factor(c(rep("G1", param_replicates[1]), rep("other", param_replicates[2]), rep("other", param_replicates[3])))#DEGのパターンを作成(G1で発現変動)
DEG_G2 <- factor(c(rep("other", param_replicates[1]), rep("G2", param_replicates[2]), rep("other", param_replicates[3])))#DEGのパターンを作成(G2で発現変動)
DEG_G3 <- factor(c(rep("other", param_replicates[1]), rep("other", param_replicates[2]), rep("G3", param_replicates[3])))#DEGのパターンを作成(G3で発現変動)
groups(ba) <- list(nonDEG = nonDEG,    #non-DEGとDEGのパターン情報を格納
             DEG_G1 = DEG_G1,          #non-DEGとDEGのパターン情報を格納
             DEG_G2 = DEG_G2,          #non-DEGとDEGのパターン情報を格納
             DEG_G3 = DEG_G3)          #non-DEGとDEGのパターン情報を格納

#本番(TCC正規化係数のbaySeqへの組み込み)
libsizes(ba) <- colSums(data)*tcc$norm.factors#TCC正規化後のライブラリサイズを格納

#本番(DEG検出)
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算

#後処理(EBSeqの出力に合わせている)
out <- list()                          #outというプレースホルダの作成(list形式の結果を格納する場所の作成)
out$PP <- exp(ba@posteriors)           #事後確率情報の抽出(ba@posteriorsが対数変換後の値なので、expで指数化せねばならない)
out$MAP <- param_narabi[max.col(out$PP)]#out$PPの事後確率が最大のパターンを抽出
ranking <- rank(out$PP[, param_narabi[1]])#param_narabi[1]の事後確率が低い順(DEGである確率が高い順)でランキングした結果をrankingに格納
orderings <- NULL                      #最終的に得る結果を格納するためのプレースホルダを作成しているだけ
for(i in 1:length(out$MAP)){           #length(out$MAP)回だけループを回す
    orderings <- append(orderings, as.character(ba@orderings[i, max.col(out$PP)[i]]))#事後確率が最大のパターンについて、群間の大小関係情報を抽出
}

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, orderings, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(nonDEGの事後確率の閾値を満たすものを概観)
obj <- (out$PP[, param_narabi[1]] < 0.05)#条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)

#AUC値を計算(高いほどよい方法)
library(ROC)                           #パッケージの読み込み
obj <- as.numeric(tcc$simulation$trueDEG != 0)#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

5. サンプルデータ15の10,000 genes×9 samplesのカウントデータ生成から行う場合:

例題4と基本的に同じです。混同行列(confusion matrix)情報のファイルも出力しています。 AUC値は0.8917377ですね。

out_f1 <- "hoge5.txt"                  #出力ファイル名を指定してout_f1に格納(解析結果)
out_f2 <- "hoge5_confusion.txt"        #出力ファイル名を指定してout_f2に格納(混同行列ファイル)
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.3                      #発現変動遺伝子の割合を指定    
param_FC <- c(3, 10, 6)                #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.7, 0.2, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   
param_narabi <- c("nonDEG", "DEG_G1", "DEG_G2", "DEG_G3")#パターン名を指定(並びは変えない)
param_samplesize <- 1000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成
data <- tcc$count                      #カウントデータ情報をdataに格納
data.cl <- tcc$group$group             #G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#TCC正規化
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#前処理(countDataオブジェクトの作成)
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
nonDEG <- factor(c(rep("non", param_replicates[1]), rep("non", param_replicates[2]), rep("non", param_replicates[3])))#non-DEGのパターンを作成
DEG_G1 <- factor(c(rep("G1", param_replicates[1]), rep("other", param_replicates[2]), rep("other", param_replicates[3])))#DEGのパターンを作成(G1で発現変動)
DEG_G2 <- factor(c(rep("other", param_replicates[1]), rep("G2", param_replicates[2]), rep("other", param_replicates[3])))#DEGのパターンを作成(G2で発現変動)
DEG_G3 <- factor(c(rep("other", param_replicates[1]), rep("other", param_replicates[2]), rep("G3", param_replicates[3])))#DEGのパターンを作成(G3で発現変動)
groups(ba) <- list(nonDEG = nonDEG,    #non-DEGとDEGのパターン情報を格納
             DEG_G1 = DEG_G1,          #non-DEGとDEGのパターン情報を格納
             DEG_G2 = DEG_G2,          #non-DEGとDEGのパターン情報を格納
             DEG_G3 = DEG_G3)          #non-DEGとDEGのパターン情報を格納

#本番(TCC正規化係数のbaySeqへの組み込み)
libsizes(ba) <- colSums(data)*tcc$norm.factors#TCC正規化後のライブラリサイズを格納

#本番(DEG検出)
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算

#後処理(EBSeqの出力に合わせている)
out <- list()                          #outというプレースホルダの作成(list形式の結果を格納する場所の作成)
out$PP <- exp(ba@posteriors)           #事後確率情報の抽出(ba@posteriorsが対数変換後の値なので、expで指数化せねばならない)
out$MAP <- param_narabi[max.col(out$PP)]#out$PPの事後確率が最大のパターンを抽出
ranking <- rank(out$PP[, param_narabi[1]])#param_narabi[1]の事後確率が低い順(DEGである確率が高い順)でランキングした結果をrankingに格納
orderings <- NULL                      #最終的に得る結果を格納するためのプレースホルダを作成しているだけ
for(i in 1:length(out$MAP)){           #length(out$MAP)回だけループを回す
    orderings <- append(orderings, as.character(ba@orderings[i, max.col(out$PP)[i]]))#事後確率が最大のパターンについて、群間の大小関係情報を抽出
}

#混同行列(confusion matrix)の作成
hoge <- param_Ngene*param_PDEG         #トータルのDEG数情報をhogeに格納
DEG_G1_posi <- 1:(hoge*param_DEGassign[1])#G1群で高発現の位置情報
DEG_G2_posi <- (hoge*param_DEGassign[1]+1):(hoge*sum(param_DEGassign[1:2]))#G2群で高発現の位置情報
DEG_G3_posi <- (hoge*sum(param_DEGassign[1:2])+1):hoge#G3群で高発現の位置情報
nonDEG_posi <- (hoge+1):param_Ngene    #non-DEGの位置情報

confusion <- matrix(0, nrow=length(param_narabi), ncol=length(param_narabi))#プレースホルダの作成
for(i in 1:length(param_narabi)){      #length(param_narabi)回だけループを回す
  confusion[i, 1] <- sum(out$MAP[nonDEG_posi] == param_narabi[i])#nonDEG_posi内のクラスター番号群の中でparam_narabi[i]と一致する遺伝子数をカウント
  confusion[i, 2] <- sum(out$MAP[DEG_G1_posi] == param_narabi[i])#DEG_G1_posi内のクラスター番号群の中でparam_narabi[i]と一致する遺伝子数をカウント
  confusion[i, 3] <- sum(out$MAP[DEG_G2_posi] == param_narabi[i])#DEG_G2_posi内のクラスター番号群の中でparam_narabi[i]と一致する遺伝子数をカウント
  confusion[i, 4] <- sum(out$MAP[DEG_G3_posi] == param_narabi[i])#DEG_G3_posi内のクラスター番号群の中でparam_narabi[i]と一致する遺伝子数をカウント
}
confusion  <- cbind(confusion, rowSums(confusion))#各行の総和情報を付加
confusion  <- rbind(confusion, colSums(confusion))#各列の総和情報を付加
colnames(confusion) <- c(param_narabi, "Total")#列名を付加
rownames(confusion) <- c(param_narabi, "Total")#行名を付加
confusion                              #確認してるだけです

#ファイルに保存(解析結果)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, orderings, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(混同行列)
tmp <- cbind(rownames(confusion), confusion)#保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f1で指定したファイル名で保存

#AUC値を計算(高いほどよい方法)
library(ROC)                           #パッケージの読み込み
obj <- as.numeric(tcc$simulation$trueDEG != 0)#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

6. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。 試行(trial)ごとに得られる数値が変わるようにしたい場合はset.seed(2015)の前に#を入れましょう。 つまり「set.seed(2015)」->「#set.seed(2015)」です。 2015はタネ番号なので3496などでも構いません。 発現パターンとして、nonDEG(発現変動なし), DEG_G1(G1群で発現変動), DEG_G2(G2群で発現変動), DEG_G3(G3群で発現変動)の計4パターンのみを考慮するやり方です。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_narabi <- c("nonDEG", "DEG_G1", "DEG_G2", "DEG_G3")#パターン名を指定(並びは変えない)
param_samplesize <- 1000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#TCC正規化
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#前処理(countDataオブジェクトの作成)
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
nonDEG <- factor(c(rep("non", param_G1), rep("non", param_G2), rep("non", param_G3)))#non-DEGのパターンを作成
DEG_G1 <- factor(c(rep("G1", param_G1), rep("other", param_G2), rep("other", param_G3)))#DEGのパターンを作成(G1で発現変動)
DEG_G2 <- factor(c(rep("other", param_G1), rep("G2", param_G2), rep("other", param_G3)))#DEGのパターンを作成(G2で発現変動)
DEG_G3 <- factor(c(rep("other", param_G1), rep("other", param_G2), rep("G3", param_G3)))#DEGのパターンを作成(G3で発現変動)
groups(ba) <- list(nonDEG = nonDEG,    #non-DEGとDEGのパターン情報を格納
             DEG_G1 = DEG_G1,          #non-DEGとDEGのパターン情報を格納
             DEG_G2 = DEG_G2,          #non-DEGとDEGのパターン情報を格納
             DEG_G3 = DEG_G3)          #non-DEGとDEGのパターン情報を格納

#本番(TCC正規化係数のbaySeqへの組み込み)
libsizes(ba) <- colSums(data)*tcc$norm.factors#TCC正規化後のライブラリサイズを格納

#本番(DEG検出)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算

#後処理(EBSeqの出力に合わせている)
out <- list()                          #outというプレースホルダの作成(list形式の結果を格納する場所の作成)
out$PP <- exp(ba@posteriors)           #事後確率情報の抽出(ba@posteriorsが対数変換後の値なので、expで指数化せねばならない)
out$MAP <- param_narabi[max.col(out$PP)]#out$PPの事後確率が最大のパターンを抽出
ranking <- rank(out$PP[, param_narabi[1]])#param_narabi[1]の事後確率が低い順(DEGである確率が高い順)でランキングした結果をrankingに格納
orderings <- NULL                      #最終的に得る結果を格納するためのプレースホルダを作成しているだけ
for(i in 1:length(out$MAP)){           #length(out$MAP)回だけループを回す
    orderings <- append(orderings, as.character(ba@orderings[i, max.col(out$PP)[i]]))#事後確率が最大のパターンについて、群間の大小関係情報を抽出
}

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, orderings, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(nonDEGの事後確率の閾値を満たすものを概観)
obj <- (out$PP[, param_narabi[1]] < 0.05)#条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)
    

7. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。 試行(trial)ごとに得られる数値が変わるようにしたい場合はset.seed(2015)の前に#を入れましょう。 つまり「set.seed(2015)」->「#set.seed(2015)」です。 2015はタネ番号なので3496などでも構いません。 発現パターンとして、nonDEG(発現変動なし), DEG_G1(G1群で発現変動), DEG_G2(G2群で発現変動), DEG_G3(G3群で発現変動), DEGall(全ての群で発現変動)の計5パターンを考慮するやり方です。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_narabi <- c("nonDEG", "DEG_G1", "DEG_G2", "DEG_G3", "DEGall")#パターン名を指定(並びは変えない)
param_samplesize <- 1000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#TCC正規化
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#前処理(countDataオブジェクトの作成)
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
nonDEG <- factor(c(rep("non", param_G1), rep("non", param_G2), rep("non", param_G3)))#non-DEGのパターンを作成
DEG_G1 <- factor(c(rep("G1", param_G1), rep("other", param_G2), rep("other", param_G3)))#DEGのパターンを作成(G1で発現変動)
DEG_G2 <- factor(c(rep("other", param_G1), rep("G2", param_G2), rep("other", param_G3)))#DEGのパターンを作成(G2で発現変動)
DEG_G3 <- factor(c(rep("other", param_G1), rep("other", param_G2), rep("G3", param_G3)))#DEGのパターンを作成(G3で発現変動)
DEGall <- factor(c(rep("G1", param_G1), rep("G2", param_G2), rep("G3", param_G3)))#DEGのパターンを作成(全ての群間でで発現変動)
groups(ba) <- list(nonDEG = nonDEG,    #non-DEGとDEGのパターン情報を格納
             DEG_G1 = DEG_G1,          #non-DEGとDEGのパターン情報を格納
             DEG_G2 = DEG_G2,          #non-DEGとDEGのパターン情報を格納
             DEG_G3 = DEG_G3,          #non-DEGとDEGのパターン情報を格納
             DEGall = DEGall)          #non-DEGとDEGのパターン情報を格納

#本番(TCC正規化係数のbaySeqへの組み込み)
libsizes(ba) <- colSums(data)*tcc$norm.factors#TCC正規化後のライブラリサイズを格納

#本番(DEG検出)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算

#後処理(EBSeqの出力に合わせている)
out <- list()                          #outというプレースホルダの作成(list形式の結果を格納する場所の作成)
out$PP <- exp(ba@posteriors)           #事後確率情報の抽出(ba@posteriorsが対数変換後の値なので、expで指数化せねばならない)
out$MAP <- param_narabi[max.col(out$PP)]#out$PPの事後確率が最大のパターンを抽出
ranking <- rank(out$PP[, param_narabi[1]])#param_narabi[1]の事後確率が低い順(DEGである確率が高い順)でランキングした結果をrankingに格納
orderings <- NULL                      #最終的に得る結果を格納するためのプレースホルダを作成しているだけ
for(i in 1:length(out$MAP)){           #length(out$MAP)回だけループを回す
    orderings <- append(orderings, as.character(ba@orderings[i, max.col(out$PP)[i]]))#事後確率が最大のパターンについて、群間の大小関係情報を抽出
}

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, orderings, ranking)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(nonDEGの事後確率の閾値を満たすものを概観)
obj <- (out$PP[, param_narabi[1]] < 0.05)#条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)
    

8. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

例題7と似ていますが、全体的な発現変動の度合い(ANOVA的などこかの群間で発現変動している度合いでのランキング)をEEE-Eで行い、 発現変動パターンの同定をEEE-b(長部らの原著論文中ではEEE-baySEqと表記)で行った結果を出力しています

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge8.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_narabi <- c("nonDEG", "DEG_G1", "DEG_G2", "DEG_G3", "DEGall")#パターン名を指定(並びは変えない)
param_samplesize <- 1000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#TCC正規化
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#前処理(countDataオブジェクトの作成)
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
nonDEG <- factor(c(rep("non", param_G1), rep("non", param_G2), rep("non", param_G3)))#non-DEGのパターンを作成
DEG_G1 <- factor(c(rep("G1", param_G1), rep("other", param_G2), rep("other", param_G3)))#DEGのパターンを作成(G1で発現変動)
DEG_G2 <- factor(c(rep("other", param_G1), rep("G2", param_G2), rep("other", param_G3)))#DEGのパターンを作成(G2で発現変動)
DEG_G3 <- factor(c(rep("other", param_G1), rep("other", param_G2), rep("G3", param_G3)))#DEGのパターンを作成(G3で発現変動)
DEGall <- factor(c(rep("G1", param_G1), rep("G2", param_G2), rep("G3", param_G3)))#DEGのパターンを作成(全ての群間でで発現変動)
groups(ba) <- list(nonDEG = nonDEG,    #non-DEGとDEGのパターン情報を格納
             DEG_G1 = DEG_G1,          #non-DEGとDEGのパターン情報を格納
             DEG_G2 = DEG_G2,          #non-DEGとDEGのパターン情報を格納
             DEG_G3 = DEG_G3,          #non-DEGとDEGのパターン情報を格納
             DEGall = DEGall)          #non-DEGとDEGのパターン情報を格納

#本番(DEG検出 with TCC)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#本番(DEパターン分類 with baySeq)
libsizes(ba) <- colSums(data)*tcc$norm.factors#TCC正規化後のライブラリサイズを格納
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算

#後処理(EBSeqの出力に合わせている)
out <- list()                          #outというプレースホルダの作成(list形式の結果を格納する場所の作成)
out$PP <- exp(ba@posteriors)           #事後確率情報の抽出(ba@posteriorsが対数変換後の値なので、expで指数化せねばならない)
out$MAP <- param_narabi[max.col(out$PP)]#out$PPの事後確率が最大のパターンを抽出
ranking <- tcc$stat$rank               #TCCでランキングした結果をrankingに格納
orderings <- NULL                      #最終的に得る結果を格納するためのプレースホルダを作成しているだけ
for(i in 1:length(out$MAP)){           #length(out$MAP)回だけループを回す
    orderings <- append(orderings, as.character(ba@orderings[i, max.col(out$PP)[i]]))#事後確率が最大のパターンについて、群間の大小関係情報を抽出
}

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, orderings, ranking, result$q.value)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(nonDEGの事後確率の閾値を満たすものを概観)
obj <- (tcc$stat$q.value < param_FDR)#条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)
    

9. 10,000 genes×9 samplesのカウントデータ(Simulation_3group_sheep.txt)の場合:

例題8とは基本的に入力ファイルが異なるだけです。入力ファイルは、1~1,000行目がG1群で4倍高発現パターン(DEG_G1)、 1,001~2,000行目がG2群で4倍高発現パターン(DEG_G2)、2,001~3,000行目がG3群で4倍高発現パターン(DEG_G3)、残りがnon-DEGです。 他は、TCC-GUI (Su et al., 2019)の デフォルトのFDR閾値(= 0.10)に合わせています。

in_f <- "Simulation_3group_sheep.txt"  #入力ファイル名を指定してin_fに格納
out_f <- "hoge9.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.10                      #false discovery rate (FDR)閾値を指定
param_narabi <- c("nonDEG", "DEG_G1", "DEG_G2", "DEG_G3", "DEGall")#パターン名を指定(並びは変えない)
param_samplesize <- 1000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#TCC正規化
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#前処理(countDataオブジェクトの作成)
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
nonDEG <- factor(c(rep("non", param_G1), rep("non", param_G2), rep("non", param_G3)))#non-DEGのパターンを作成
DEG_G1 <- factor(c(rep("G1", param_G1), rep("other", param_G2), rep("other", param_G3)))#DEGのパターンを作成(G1で発現変動)
DEG_G2 <- factor(c(rep("other", param_G1), rep("G2", param_G2), rep("other", param_G3)))#DEGのパターンを作成(G2で発現変動)
DEG_G3 <- factor(c(rep("other", param_G1), rep("other", param_G2), rep("G3", param_G3)))#DEGのパターンを作成(G3で発現変動)
DEGall <- factor(c(rep("G1", param_G1), rep("G2", param_G2), rep("G3", param_G3)))#DEGのパターンを作成(全ての群間でで発現変動)
groups(ba) <- list(nonDEG = nonDEG,    #non-DEGとDEGのパターン情報を格納
             DEG_G1 = DEG_G1,          #non-DEGとDEGのパターン情報を格納
             DEG_G2 = DEG_G2,          #non-DEGとDEGのパターン情報を格納
             DEG_G3 = DEG_G3,          #non-DEGとDEGのパターン情報を格納
             DEGall = DEGall)          #non-DEGとDEGのパターン情報を格納

#本番(DEG検出 with TCC)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#本番(DEパターン分類 with baySeq)
libsizes(ba) <- colSums(data)*tcc$norm.factors#TCC正規化後のライブラリサイズを格納
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算

#後処理(EBSeqの出力に合わせている)
out <- list()                          #outというプレースホルダの作成(list形式の結果を格納する場所の作成)
out$PP <- exp(ba@posteriors)           #事後確率情報の抽出(ba@posteriorsが対数変換後の値なので、expで指数化せねばならない)
out$MAP <- param_narabi[max.col(out$PP)]#out$PPの事後確率が最大のパターンを抽出
ranking <- tcc$stat$rank               #TCCでランキングした結果をrankingに格納
orderings <- NULL                      #最終的に得る結果を格納するためのプレースホルダを作成しているだけ
for(i in 1:length(out$MAP)){           #length(out$MAP)回だけループを回す
    orderings <- append(orderings, as.character(ba@orderings[i, max.col(out$PP)[i]]))#事後確率が最大のパターンについて、群間の大小関係情報を抽出
}

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, orderings, ranking, result$q.value)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(nonDEGの事後確率の閾値を満たすものを概観)
obj <- (tcc$stat$q.value < param_FDR)#条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)
    

10. 20,689 genes×18 samplesのカウントデータ(sample_blekhman_18.txt)の場合:

例題9とは基本的に入力ファイルが異なるだけです。 サンプルデータ42で作成したリアルデータです。 HS(ヒト)6 samples、PT(チンパンジー)6 samples、RM(アカゲザル)6 samplesの3生物種間比較用です。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge10.txt"                  #出力ファイル名を指定してout_fに格納
param_G1 <- 6                          #G1群のサンプル数を指定
param_G2 <- 6                          #G2群のサンプル数を指定
param_G3 <- 6                          #G3群のサンプル数を指定
param_FDR <- 0.10                      #false discovery rate (FDR)閾値を指定
param_narabi <- c("nonDEG", "DEG_G1", "DEG_G2", "DEG_G3", "DEGall")#パターン名を指定(並びは変えない)
param_samplesize <- 1000               #ブートストラップリサンプリング回数(100000が推奨。大きい値ほど計算時間増加)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#TCC正規化
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#前処理(countDataオブジェクトの作成)
ba <- new("countData", data=as.matrix(data), replicates=data.cl)#countDataオブジェクトを作成
nonDEG <- factor(c(rep("non", param_G1), rep("non", param_G2), rep("non", param_G3)))#non-DEGのパターンを作成
DEG_G1 <- factor(c(rep("G1", param_G1), rep("other", param_G2), rep("other", param_G3)))#DEGのパターンを作成(G1で発現変動)
DEG_G2 <- factor(c(rep("other", param_G1), rep("G2", param_G2), rep("other", param_G3)))#DEGのパターンを作成(G2で発現変動)
DEG_G3 <- factor(c(rep("other", param_G1), rep("other", param_G2), rep("G3", param_G3)))#DEGのパターンを作成(G3で発現変動)
DEGall <- factor(c(rep("G1", param_G1), rep("G2", param_G2), rep("G3", param_G3)))#DEGのパターンを作成(全ての群間でで発現変動)
groups(ba) <- list(nonDEG = nonDEG,    #non-DEGとDEGのパターン情報を格納
             DEG_G1 = DEG_G1,          #non-DEGとDEGのパターン情報を格納
             DEG_G2 = DEG_G2,          #non-DEGとDEGのパターン情報を格納
             DEG_G3 = DEG_G3,          #non-DEGとDEGのパターン情報を格納
             DEGall = DEGall)          #non-DEGとDEGのパターン情報を格納

#本番(DEG検出 with TCC)
set.seed(2015)                         #おまじない(同じ乱数になるようにするため)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#本番(DEパターン分類 with baySeq)
libsizes(ba) <- colSums(data)*tcc$norm.factors#TCC正規化後のライブラリサイズを格納
ba <- getPriors.NB(ba, samplesize=param_samplesize, estimation="QL", cl=NULL)#事前分布を推定
ba <- getLikelihoods(ba, pET="BIC", nullData=FALSE, cl=NULL)#事後確率を計算

#後処理(EBSeqの出力に合わせている)
out <- list()                          #outというプレースホルダの作成(list形式の結果を格納する場所の作成)
out$PP <- exp(ba@posteriors)           #事後確率情報の抽出(ba@posteriorsが対数変換後の値なので、expで指数化せねばならない)
out$MAP <- param_narabi[max.col(out$PP)]#out$PPの事後確率が最大のパターンを抽出
ranking <- tcc$stat$rank               #TCCでランキングした結果をrankingに格納
orderings <- NULL                      #最終的に得る結果を格納するためのプレースホルダを作成しているだけ
for(i in 1:length(out$MAP)){           #length(out$MAP)回だけループを回す
    orderings <- append(orderings, as.character(ba@orderings[i, max.col(out$PP)[i]]))#事後確率が最大のパターンについて、群間の大小関係情報を抽出
}

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, orderings, ranking, result$q.value)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(nonDEGの事後確率の閾値を満たすものを概観)
obj <- (tcc$stat$q.value < param_FDR)#条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)
    

解析 | 発現変動 | 3群間 | 対応なし | 複製あり | 応用 | TCC+EBSeq(Osabe_2019)

TCCEBSeq を組み合わせたやり方を示します。 例題5以降がEBSeqを使う場合の推奨パイプライン(Osabe et al., Bioinform. Biol. Insight, 2019)です(2019年7月10日追記)。 例題1-4までは、「TCC中のiDEGES/edgeR正規化で得られた正規化係数をEBSeqに与えた解析パイプライン」です。 TCC原著論文の表記法に従うと、iDEGES/edgeR-EBSeqという解析パイプラインに相当します。 Tang et al., 2015の表記法では、、、EEE-EBSeqですね。 出力結果ファイルを眺めると Pattern1, Pattern2, ..., Pattern5までの列のところに遺伝子ごとのPosterior Probability (PP)値が与えられています。 PP値が一番大きい(つまり1に近い)パターンに、その遺伝子が属するということになります:
  Pattern1は(1, 1, 1)なのでnon-DEGの発現パターン
  Pattern2は(1, 1, 2)なのでG3群で発現変動(高発現または低発現)
  Pattern3は(1, 2, 1)なのでG2群で発現変動
  Pattern4は(1, 2, 2)なのでG1群で発現変動
  Pattern5は(1, 2, 3)なので、全ての群間で発現変動
  一番右側のout$MAP列を見る方が手っ取り早いかもしれません。どの遺伝子がどのパターンに属するかが一目瞭然です。 ranking列は、Pattern1のPP値に基づいています。Pattern1のPP値の低さはnon-DEGである確率の低さを意味するからです。
  尚、試行(trial)ごとに得られる数値が変わるようにしたい場合はset.seed(2015)の前に#を入れましょう。 つまり「set.seed(2015)」->「#set.seed(2015)」です。 2015はタネ番号なので3496などでも構いません。 2018年8月12日に、本来「size.factors <- ef.libsizes/mean(ef.libsizes)」と書くべきところを、どこでどう間違えたのか 「size.factors <- mean(ef.libsizes)/ef.libsizes」となっていたことが判明したので修正しました(長部 高之 氏提供情報)。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現)、 そしてgene_3001〜gene_10000までがnon-DEGであることが既知です。 従って、Pattern1が70%、Pattern2が3%、Pattern3が6%、Pattern4が21%、Pattern5が0%が正解になります。 AUC値は0.8534662ですね。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(EBSeq)                         #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#TCC正規化
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(normalization factors -> size factorsへの変換)
norm.factors <- tcc$norm.factors       #TCC正規化係数をnorm.factorsに格納
ef.libsizes <- colSums(data)*norm.factors#総リード数(library sizes)に正規化係数を掛けて得たeffective library sizes情報をef.libsizesに格納
size.factors <- ef.libsizes/mean(ef.libsizes)#effective library sizesを正規化してサイズファクターを得る(2018年8月12日修正)
size.factors                           #サイズファクター(size factors)を表示

#本番(DEG検出)
data.cl <- c(rep("G1", param_G1), rep("G2", param_G2), rep("G3", param_G3))#G1群を"G1"、G2群を"G2"、G3群を"G3"としたベクトルdata.clを作成
PosParti <- GetPatterns(data.cl)       #可能な全ての発現パターンを作成した結果をPosPartiに格納
Parti <- PosParti                      #解析したいパターンをPartiに格納
Parti                                  #解析する発現パターンを表示
hoge <- EBMultiTest(as.matrix(data), NgVector=NULL,#EBSeq実行結果をhogeに格納
         Conditions=data.cl, AllParti=Parti,#EBSeq実行結果をhogeに格納
         sizeFactors=size.factors, maxround=5,#EBSeq実行結果をhogeに格納
         Qtrm=1.0, QtrmCut=-1)         #EBSeq実行結果をhogeに格納
out <- GetMultiPP(hoge)                #Posterior Probabilityなどの欲しい情報をoutに格納
ranking <- rank(out$PP[, "Pattern1"])  #Pattern1のPosterior Probabilityでランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, ranking)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#解析しているパターン番号と実際のパターンを表示
out$Patterns                           #パターン番号と実際のパターンを表示

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(Pattern1である確率が0.05未満のものを概観)
obj <- (out$PP[, "Pattern1"] < 0.05)   #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)

#AUC値を計算(高いほどよい方法)
library(ROC)                           #パッケージの読み込み
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[1:3000] <- 1                       #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

2. サンプルデータ15の10,000 genes×9 samplesのカウントデータ(data_hypodata_3vs3vs3.txt)の場合:

例題1との違いは、(このシミュレーションデータには存在しないので)「全ての群間で発現変動しているパターン」に相当するPattern5を考慮しないやり方です。 AUC値は0.8534662ですね。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(EBSeq)                         #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#TCC正規化
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(normalization factors -> size factorsへの変換)
norm.factors <- tcc$norm.factors       #TCC正規化係数をnorm.factorsに格納
ef.libsizes <- colSums(data)*norm.factors#総リード数(library sizes)に正規化係数を掛けて得たeffective library sizes情報をef.libsizesに格納
size.factors <- ef.libsizes/mean(ef.libsizes)#effective library sizesを正規化してサイズファクターを得る(2018年8月12日修正)
size.factors                           #サイズファクター(size factors)を表示

#本番(DEG検出)
data.cl <- c(rep("G1", param_G1), rep("G2", param_G2), rep("G3", param_G3))#G1群を"G1"、G2群を"G2"、G3群を"G3"としたベクトルdata.clを作成
PosParti <- GetPatterns(data.cl)       #可能な全ての発現パターンを作成した結果をPosPartiに格納
obj <- (rownames(PosParti) != "Pattern5")#解析したいパターン(Pattern5以外)の位置情報をobjに格納
Parti <- PosParti[obj, ]               #解析したいパターンをPartiに格納
Parti                                  #解析する発現パターンを表示
hoge <- EBMultiTest(as.matrix(data), NgVector=NULL,#EBSeq実行結果をhogeに格納
         Conditions=data.cl, AllParti=Parti,#EBSeq実行結果をhogeに格納
         sizeFactors=size.factors, maxround=5,#EBSeq実行結果をhogeに格納
         Qtrm=1.0, QtrmCut=-1)         #EBSeq実行結果をhogeに格納
out <- GetMultiPP(hoge)                #Posterior Probabilityなどの欲しい情報をoutに格納
ranking <- rank(out$PP[, "Pattern1"])  #Pattern1のPosterior Probabilityでランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, ranking)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#解析しているパターン番号と実際のパターンを表示
out$Patterns                           #パターン番号と実際のパターンを表示

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(Pattern1である確率が0.05未満のものを概観)
obj <- (out$PP[, "Pattern1"] < 0.05)   #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)

#AUC値を計算(高いほどよい方法)
library(ROC)                           #パッケージの読み込み
obj <- rep(0, nrow(data))              #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[1:3000] <- 1                       #DEGの位置に1を代入
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

3. サンプルデータ15の10,000 genes×9 samplesのカウントデータ生成から行う場合:

サンプルデータ15のシミュレーションデータ作成から行うやり方です。 AUC値は0.8534662です。

out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.3                      #発現変動遺伝子の割合を指定    
param_FC <- c(3, 10, 6)                #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.7, 0.2, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(EBSeq)                         #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成
data <- tcc$count                      #カウントデータ情報をdataに格納
data.cl <- tcc$group$group             #G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#TCC正規化
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(normalization factors -> size factorsへの変換)
norm.factors <- tcc$norm.factors       #TCC正規化係数をnorm.factorsに格納
ef.libsizes <- colSums(data)*norm.factors#総リード数(library sizes)に正規化係数を掛けて得たeffective library sizes情報をef.libsizesに格納
size.factors <- ef.libsizes/mean(ef.libsizes)#effective library sizesを正規化してサイズファクターを得る(2018年8月12日修正)
size.factors                           #サイズファクター(size factors)を表示

#本番(DEG検出)
data.cl <- c(rep("G1", param_replicates[1]), rep("G2", param_replicates[2]), rep("G3", param_replicates[3]))#G1群を"G1"、G2群を"G2"、G3群を"G3"としたベクトルdata.clを作成
PosParti <- GetPatterns(data.cl)       #可能な全ての発現パターンを作成した結果をPosPartiに格納
obj <- (rownames(PosParti) != "Pattern5")#解析したいパターン(Pattern5以外)の位置情報をobjに格納
Parti <- PosParti[obj, ]               #解析したいパターンをPartiに格納
Parti                                  #解析する発現パターンを表示
hoge <- EBMultiTest(as.matrix(data), NgVector=NULL,#EBSeq実行結果をhogeに格納
         Conditions=data.cl, AllParti=Parti,#EBSeq実行結果をhogeに格納
         sizeFactors=size.factors, maxround=5,#EBSeq実行結果をhogeに格納
         Qtrm=1.0, QtrmCut=-1)         #EBSeq実行結果をhogeに格納
out <- GetMultiPP(hoge)                #Posterior Probabilityなどの欲しい情報をoutに格納
ranking <- rank(out$PP[, "Pattern1"])  #Pattern1のPosterior Probabilityでランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, ranking)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#解析しているパターン番号と実際のパターンを表示
out$Patterns                           #パターン番号と実際のパターンを表示

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(Pattern1である確率が0.05未満のものを概観)
obj <- (out$PP[, "Pattern1"] < 0.05)   #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)

#AUC値を計算(高いほどよい方法)
library(ROC)                           #パッケージの読み込み
obj <- as.numeric(tcc$simulation$trueDEG != 0)#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

4. サンプルデータ15の10,000 genes×9 samplesのカウントデータ生成から行う場合:

例題3と基本的に同じですが、混同行列(confusion matrix)情報のファイルも出力しています。

out_f1 <- "hoge4.txt"                   #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge4_confusion.txt"        #出力ファイル名を指定してout_f2に格納(混同行列ファイル)
param_replicates <- c(3, 3, 3)         #G1, G2, G3群のサンプル数をそれぞれ指定
param_Ngene <- 10000                   #全遺伝子数を指定
param_PDEG <- 0.3                      #発現変動遺伝子の割合を指定    
param_FC <- c(3, 10, 6)                #G1, G2, G3群の発現変動の度合い(fold-change)をそれぞれ指定    
param_DEGassign <- c(0.7, 0.2, 0.1)    #DEGのうちG1, G2, G3群で高発現なものの割合をそれぞれ指定   

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(EBSeq)                         #パッケージの読み込み

#シミュレーションデータの作成
set.seed(1000)                         #おまじない(同じ乱数になるようにするため)
tcc <- simulateReadCounts(Ngene=param_Ngene,#シミュレーションデータの作成
            PDEG=param_PDEG,           #シミュレーションデータの作成
            DEG.assign=param_DEGassign,#シミュレーションデータの作成
            DEG.foldchange=param_FC,   #シミュレーションデータの作成
            replicates=param_replicates)#シミュレーションデータの作成
data <- tcc$count                      #カウントデータ情報をdataに格納
data.cl <- tcc$group$group             #G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
dim(data)                              #オブジェクトdataの行数と列数を表示

#TCC正規化
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(normalization factors -> size factorsへの変換)
norm.factors <- tcc$norm.factors       #TCC正規化係数をnorm.factorsに格納
ef.libsizes <- colSums(data)*norm.factors#総リード数(library sizes)に正規化係数を掛けて得たeffective library sizes情報をef.libsizesに格納
size.factors <- ef.libsizes/mean(ef.libsizes)#effective library sizesを正規化してサイズファクターを得る(2018年8月12日修正)
size.factors                           #サイズファクター(size factors)を表示

#本番(DEG検出)
data.cl <- c(rep("G1", param_replicates[1]), rep("G2", param_replicates[2]), rep("G3", param_replicates[3]))#G1群を"G1"、G2群を"G2"、G3群を"G3"としたベクトルdata.clを作成
PosParti <- GetPatterns(data.cl)       #可能な全ての発現パターンを作成した結果をPosPartiに格納
obj <- (rownames(PosParti) != "Pattern5")#解析したいパターン(Pattern5以外)の位置情報をobjに格納
Parti <- PosParti[obj, ]               #解析したいパターンをPartiに格納
Parti                                  #解析する発現パターンを表示
hoge <- EBMultiTest(as.matrix(data), NgVector=NULL,#EBSeq実行結果をhogeに格納
         Conditions=data.cl, AllParti=Parti,#EBSeq実行結果をhogeに格納
         sizeFactors=size.factors, maxround=5,#EBSeq実行結果をhogeに格納
         Qtrm=1.0, QtrmCut=-1)         #EBSeq実行結果をhogeに格納
out <- GetMultiPP(hoge)                #Posterior Probabilityなどの欲しい情報をoutに格納
ranking <- rank(out$PP[, "Pattern1"])  #Pattern1のPosterior Probabilityでランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, ranking)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#解析しているパターン番号と実際のパターンを表示
out$Patterns                           #パターン番号と実際のパターンを表示

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(Pattern1である確率が0.05未満のものを概観)
obj <- (out$PP[, "Pattern1"] < 0.05)   #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)

#AUC値を計算(高いほどよい方法)
library(ROC)                           #パッケージの読み込み
obj <- as.numeric(tcc$simulation$trueDEG != 0)#DEGの位置を1、non-DEGの位置を0としたベクトルobjを作成
AUC(rocdemo.sca(truth=obj, data=-ranking))#AUC計算
    

5. サンプルデータ15の10,000 genes×9 samplesのカウントデータ生成から行う場合:

例題1-4までとは異なり、全体的な発現変動の度合いでのランキングはEEE-Eのパイプラインを利用しています。 発現変動パターンの同定部分がEEE-EBSeqです。

in_f <- "data_hypodata_3vs3vs3.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み
library(EBSeq)                         #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#TCC正規化
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(normalization factors -> size factorsへの変換)
norm.factors <- tcc$norm.factors       #TCC正規化係数をnorm.factorsに格納
ef.libsizes <- colSums(data)*norm.factors#総リード数(library sizes)に正規化係数を掛けて得たeffective library sizes情報をef.libsizesに格納
size.factors <- ef.libsizes/mean(ef.libsizes)#effective library sizesを正規化してサイズファクターを得る
size.factors                           #サイズファクター(size factors)を表示

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
ranking <- tcc$stat$rank               #ランキング結果をrankingに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#本番(DEパターン分類 with EBSeq)
Parti <- GetPatterns(data.cl)       #可能な全ての発現パターンを作成した結果をPartiに格納
Parti                                  #解析する発現パターンを表示
hoge <- EBMultiTest(as.matrix(data), NgVector=NULL,#EBSeq実行結果をhogeに格納
         Conditions=data.cl, AllParti=Parti,#EBSeq実行結果をhogeに格納
         sizeFactors=size.factors, maxround=5,#EBSeq実行結果をhogeに格納
         Qtrm=1.0, QtrmCut=-1)         #EBSeq実行結果をhogeに格納
out <- GetMultiPP(hoge)                #Posterior Probabilityなどの欲しい情報をoutに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, out$PP, out$MAP, ranking)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#解析しているパターン番号と実際のパターンを表示
out$Patterns                           #パターン番号と実際のパターンを表示

#結果のまとめ(全遺伝子)
head(out$MAP)                          #最初の6遺伝子分のパターンを表示
table(out$MAP)                         #パターンごとの出現頻度を表示
table(out$MAP)/length(out$MAP)         #パターンごとの出現確率を表示

#結果のまとめ(TCCでq.value < 0.05未満のものを概観)
obj <- (tcc$stat$q.value < 0.05)   #条件を満たすかどうかを判定した結果をobjに格納
sum(obj)                               #条件を満たす数を表示
table(out$MAP[obj])                    #パターンごとの出現頻度を表示(条件を満たすもののみ)
table(out$MAP[obj])/length(out$MAP[obj])#パターンごとの出現確率を表示(条件を満たすもののみ)
    

解析 | 発現変動 | 3群間 | 対応なし | 複製なし | DESeq2(Love_2014)

DESeq2パッケージ (Love et al., Genome Biol., 2014)を用いるやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ43の10,000 genes×3 samplesのカウントデータ(data_hypodata_1vs1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル vs. G3群1サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。 約1分かかります。

in_f <- "data_hypodata_1vs1vs1.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_G3 <- 1                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(DESeq2)                        #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(DESeqDataSetオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
colData <- data.frame(condition=as.factor(data.cl))#condition列にクラスラベル情報を格納したcolDataオブジェクトを作成
d <- DESeqDataSetFromMatrix(countData=data, colData=colData, design=~condition)#DESeqDataSetオブジェクトdの作成

#本番(DEG検出)
d <- DESeq(d)                         #DESeq2を実行
#d <- estimateSizeFactors(d)           #正規化を実行した結果をdに格納
##sizeFactors(d) <- sizeFactors(d)/mean(sizeFactors(d))#size factorsをさらに正規化(TCCは内部的にこれを行っている)
#d <- estimateDispersions(d)           #モデル構築(ばらつきの程度を見積もっている)
#d <- nbinomLRT(d, full= ~condition, reduced= ~1)#検定

tmp <- results(d)                      #実行結果を抽出
p.value <- tmp$pvalue                  #p-valueをp.valueに格納
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- tmp$padj                    #adjusted p-valueをq.valueに格納
q.value[is.na(q.value)] <- 1           #NAを1に置換している
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), data, p.value, q.value, ranking)#入力データの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(ranking),]            #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
sum(q.value < 0.50)                    #FDR = 0.50 (q-value < 0.50)を満たす遺伝子数を表示
sum(q.value < 0.70)                    #FDR = 0.70 (q-value < 0.70)を満たす遺伝子数を表示
sum(q.value < 0.80)                    #FDR = 0.80 (q-value < 0.80)を満たす遺伝子数を表示
sum(p.adjust(p.value, method="BH") < 0.05)#FDR閾値(q.value < 0.05)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.10)#FDR閾値(q.value < 0.10)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.30)#FDR閾値(q.value < 0.30)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.50)#FDR閾値(q.value < 0.50)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.70)#FDR閾値(q.value < 0.70)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.80)#FDR閾値(q.value < 0.80)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
    

2. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

20,689 genes×18 samplesのカウントデータで、ヒト(HS)、チンパンジー(PT)、アカゲザル(RM)の3生物種間比較です (Blekhman et al., Genome Res., 2010)。 1, 7, 13列目のデータのみ抽出して、 反復なし3群間比較(HSF1 vs. PTF1 vs. RMF1)としています。 正規化後のデータで発現変動順にソートした結果を出力しています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_subset <- c(1, 7, 13)            #取り扱いたいサブセット情報を指定
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_G3 <- 1                          #G3群のサンプル数を指定

#必要なパッケージをロード
library(DESeq2)                        #パッケージの読み込み

#入力ファイルの読み込みとサブセットの作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出

#前処理(DESeqDataSetオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
colData <- data.frame(condition=as.factor(data.cl))#condition列にクラスラベル情報を格納したcolDataオブジェクトを作成
d <- DESeqDataSetFromMatrix(countData=data, colData=colData, design=~condition)#DESeqDataSetオブジェクトdの作成

#本番(DEG検出)
d <- DESeq(d)                         #DESeq2を実行
#d <- estimateSizeFactors(d)           #正規化を実行した結果をdに格納
##sizeFactors(d) <- sizeFactors(d)/mean(sizeFactors(d))#size factorsをさらに正規化(TCCは内部的にこれを行っている)
#d <- estimateDispersions(d)           #モデル構築(ばらつきの程度を見積もっている)
#d <- nbinomLRT(d, full= ~condition, reduced= ~1)#検定
normalized <- counts(d, normalized=T)  #正規化後のデータを取り出してnormalizedに格納

tmp <- results(d)                      #実行結果を抽出
p.value <- tmp$pvalue                  #p-valueをp.valueに格納
p.value[is.na(p.value)] <- 1           #NAを1に置換している
q.value <- tmp$padj                    #adjusted p-valueをq.valueに格納
q.value[is.na(q.value)] <- 1           #NAを1に置換している
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(data), normalized, p.value, q.value, ranking)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(ranking),]            #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
sum(q.value < 0.50)                    #FDR = 0.50 (q-value < 0.50)を満たす遺伝子数を表示
sum(q.value < 0.70)                    #FDR = 0.70 (q-value < 0.70)を満たす遺伝子数を表示
sum(q.value < 0.80)                    #FDR = 0.80 (q-value < 0.80)を満たす遺伝子数を表示
sum(p.adjust(p.value, method="BH") < 0.05)#FDR閾値(q.value < 0.05)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.10)#FDR閾値(q.value < 0.10)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.30)#FDR閾値(q.value < 0.30)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.50)#FDR閾値(q.value < 0.50)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.70)#FDR閾値(q.value < 0.70)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
sum(p.adjust(p.value, method="BH") < 0.80)#FDR閾値(q.value < 0.80)を満たす遺伝子数を表示(TCCはp-valueをもとにBH法でq-value情報を得ている)
    

解析 | 発現変動 | 3群間 | 対応なし | 複製なし | TCC(Sun_2013)

TCCを用いたやり方を示します。 内部的にDESeqパッケージ中の関数を利用して、 複製なしデータに対応済みのDESeq2の通常の手順を複数回繰り返す(DEGES-based normalization; Kadota et al., 2012) ことでより正確なデータ正規化が実現された発現変動解析結果を得ることができます。 2019年7月11日にこの項目内で明示的にDESeq2と指定していた部分をDESeqに変更しました。理由はDESeq2を使うとエラーが出るようになったからです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ43の10,000 genes×3 samplesのカウントデータ(data_hypodata_1vs1vs1.txt)の場合:

シミュレーションデータ(G1群1サンプル vs. G2群1サンプル vs. G3群1サンプル)です。 gene_1〜gene_3000までがDEG (gene_1〜gene_2100がG1群で3倍高発現、gene_2101〜gene_2700がG2群で10倍高発現、gene_2701〜gene_3000がG3群で6倍高発現) gene_3001〜gene_10000までがnon-DEGであることが既知です。 約1分かかります。 2018年の秋ごろのリリースでDESeq2が反復なし非対応になったので、TCC側がまだ対応できておらずエラーとなります(2019年4月26日追加)。

in_f <- "data_hypodata_1vs1vs1.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_G3 <- 1                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, iteration=3)#正規化を実行した結果を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)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
sum(q.value < 0.50)                    #FDR = 0.50 (q-value < 0.50)を満たす遺伝子数を表示
sum(q.value < 0.70)                    #FDR = 0.70 (q-value < 0.70)を満たす遺伝子数を表示
    

2. サンプルデータ43の10,000 genes×3 samplesのカウントデータ(data_hypodata_1vs1vs1.txt)の場合:

明示的にDESeqを指定しています。約1分。

in_f <- "data_hypodata_1vs1vs1.txt"    #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_G3 <- 1                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq",#正規化を実行した結果をtccに格納
               test.method="deseq", iteration=3)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
sum(q.value < 0.50)                    #FDR = 0.50 (q-value < 0.50)を満たす遺伝子数を表示
sum(q.value < 0.70)                    #FDR = 0.70 (q-value < 0.70)を満たす遺伝子数を表示
    

3. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

20,689 genes×18 samplesのカウントデータで、ヒト(HS)、チンパンジー(PT)、アカゲザル(RM)の3生物種間比較です (Blekhman et al., Genome Res., 2010)。 1, 7, 13列目のデータのみ抽出して、 反復なし3群間比較(HSF1 vs. PTF1 vs. RMF1)としています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_subset <- c(1, 7, 13)            #取り扱いたいサブセット情報を指定
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_G3 <- 1                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
colnames(data)                         #列名を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq",#正規化を実行した結果をtccに格納
               test.method="deseq", iteration=3)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
sum(q.value < 0.50)                    #FDR = 0.50 (q-value < 0.50)を満たす遺伝子数を表示
sum(q.value < 0.70)                    #FDR = 0.70 (q-value < 0.70)を満たす遺伝子数を表示
    

4. サンプルデータ42のリアルデータ(sample_blekhman_18.txt)の場合:

20,689 genes×18 samplesのカウントデータで、ヒト(HS)、チンパンジー(PT)、アカゲザル(RM)の3生物種間比較です (Blekhman et al., Genome Res., 2010)。 1, 7, 13列目のデータのみ抽出して、 反復なし3群間比較(HSF1 vs. PTF1 vs. RMF1)としています。 例題3と基本的に同じですが、正規化後のデータで発現変動順にソートした結果を出力しています。

in_f <- "sample_blekhman_18.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.txt"                   #出力ファイル名を指定してout_fに格納
param_subset <- c(1, 7, 13)            #取り扱いたいサブセット情報を指定
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_G3 <- 1                          #G3群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(サブセットの抽出とTCCクラスオブジェクトの作成)
data <- data[,param_subset]            #param_subsetで指定した列の情報のみ抽出
data.cl <- c(rep(1, param_G1), rep(2, param_G2), rep(3, param_G3))#G1群を1、G2群を2、G3群を3としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成
colnames(data)                         #列名を表示

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq",#正規化を実行した結果をtccに格納
               test.method="deseq", iteration=3)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
p.value <- tcc$stat$p.value            #p-valueをp.valueに格納
p.value[is.na(p.value)] <- 1           #NAを1に置換している
ranking <- rank(p.value)               #p.valueでランキングした結果をrankingに格納
q.value <- tcc$stat$q.value            #q-valueをq.valueに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalized, p.value, q.value, ranking)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
tmp <- tmp[order(ranking),]            #発現変動順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#様々なFDR閾値を満たす遺伝子数を表示
sum(q.value < 0.05)                    #FDR = 0.05 (q-value < 0.05)を満たす遺伝子数を表示
sum(q.value < 0.10)                    #FDR = 0.10 (q-value < 0.10)を満たす遺伝子数を表示
sum(q.value < 0.30)                    #FDR = 0.30 (q-value < 0.30)を満たす遺伝子数を表示
sum(q.value < 0.50)                    #FDR = 0.50 (q-value < 0.50)を満たす遺伝子数を表示
sum(q.value < 0.70)                    #FDR = 0.70 (q-value < 0.70)を満たす遺伝子数を表示
    

解析 | 発現変動 | 5群間 | 対応なし | 複製あり | TCC(Sun_2013)

TCCを用いたやり方を示します。 内部的にiDEGES/edgeR(Sun_2013)正規化を実行したのち、 edgeRパッケージ中のexact testで発現変動遺伝子(Differentially Expressed Genes; DEGs)検出を行っています。 TCC原著論文中のiDEGES/edgeR-edgeRという解析パイプラインに相当します。 TCC原著論文(Sun et al., BMC Bioinformatics, 2013)では 多群間複製ありデータ用の推奨パイプラインを示していませんでしたが、多群間比較用の推奨ガイドライン提唱論文 (Tang et al., BMC Bioinformatics, 2015) で推奨しているパイプライン"EEE-E"が"iDEGES/edgeR-edgeR"と同じものです。この2つの論文を引用し、安心してご利用ください。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ39の10,000 genes×15 samplesのカウントデータ(data_hypodata_3vs3vs3vs3vs3.txt)の場合:

シミュレーションデータ(G1群3サンプル vs. G2群3サンプル vs. G3群3サンプル vs. G4群3サンプル vs. G5群3サンプル)です。 gene_1〜gene_2000までがDEG (gene_1〜gene_1000がG1群で5倍高発現、gene_1001〜gene_1400がG2群で10倍高発現、gene_1401〜gene_1700がG3群で8倍高発現、 gene_1701〜gene_1900がG4群で12倍高発現、gene_1901〜gene_2000がG5群で7倍高発現)、gene_2001〜gene_10000までがnon-DEGであることが既知です。

in_f <- "data_hypodata_3vs3vs3vs3vs3.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_G3 <- 3                          #G3群のサンプル数を指定
param_G4 <- 3                          #G4群のサンプル数を指定
param_G5 <- 3                          #G5群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1,param_G1), rep(2,param_G2), rep(3,param_G3), rep(4,param_G4), rep(5,param_G5))#G1群を1、G2群を2、G3群を3、G4群を4、G5群を5としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
    

解析 | 発現変動 | scRNA-seq | について

single-cell RNA-seq用のプログラムたちです。 通常のRNA-seq用(bulk RNA-seq用)については、「解析 | 発現変動 | RNA-seq | について」をご覧ください。 Soneson and Robinson, Nat Methods, 2018は、 「scRNA-seqに特化した方法よりもbulk RNA-seq用に開発された方法が劣ることはない」といった結論を述べています。 Andrews and Hemberg, F1000Res., 2018は、 dropout問題に起因するゼロカウントの補正アルゴリズムの比較がメインです。 が、この中で発現変動解析の評価も行っており、何もしないデータ(unimputed data)のほうが発現変動解析の場合はよいと述べています(page 8のFigure 2やpage 9の左のほうの記述)。 この主張は、Luecken and Theis, Mol Syst Biol., 2019中の記述とも合致します(page 10のTable 1やpage 11の左中あたり)。 TN testはLuecken and Theis, Mol Syst Biol., 2019のpage 14の左下あたりで言及されています。 Van den Berge et al., Genome Biol., 2018でも、 ZINB-WaVE法(Risso et al., Nat Commun., 2018) によって得られたgene weights情報とbulk RNA-seq用に開発された方法(edgeR or DESEq2)を組み合わせたやり方がよいということが述べられています (Luecken and Theis, Mol Syst Biol., 2019のpage 17の左中央あたり)。 このやり方は、weighted bulk DE testingとも表現されています。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 発現変動 | 時系列 | について

時系列(time-series)解析用のものたちです。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 発現変動 | 時系列 | maSigPro(Nueda_2014)

maSigProパッケージを用いた時系列データ解析(西岡輔 氏提供情報)を示します。 maSigPro ver. 1.40.0のマニュアルによると、正規化済みのデータを入力とする必要があるようです。 実験デザインの記述などについては、(Rで)マイクロアレイデータ解析でも maSigProを用いたアレイデータ用の時系列解析も記載しているのでそちらも参考にしてください。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. maSigProパッケージ付属のデータセットの場合:

2群間比較(G1群 vs. G2群)で、6 time points (T1, T2, ..., T6)の正規化済みのデータセット(100 genes ×36 samples)です。 time pointごとに3 replicatesあるので、2群×6time points×3 replicates = 36です。 データはNBdataとして、そして実験デザイン情報はNBdesignとして提供されているので、それを読み込んで実行します。 p.vector関数実行時にcounts=TRUEとしている場合は、NBモデルをしていることに相当します。 最初の20 genes (Gene1, Gene2, ..., Gene20)が経時変化していることが既知なので、これらが検出できれば正解です。

out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_FDR <- 0.05                      #DEG検出時のFDR閾値を指定

#必要なパッケージをロード
library(maSigPro)                      #パッケージの読み込み

#発現データ(NBdata)と実験デザイン行列(NBdesign)をロード
data(NBdata)                           #発現データNBdataをロード
data(NBdesign)                         #実験デザイン行列NBdesignをロード
data <- NBdata                         #NBdataをdataとして取り扱う
edesign <- NBdesign                    #NBdesignをedesignとして取り扱う
dim(data)                              #確認してるだけです(行数と列数)
colnames(data)                         #確認してるだけです(列名)

#本番(発現変動遺伝子検出; ANOVAみたいなところ)
design <- make.design.matrix(edesign, degree=2,#実験デザイン行列の作成。degree=2は、2次の回帰モデルで考えることを意味する
               time.col=1,             #time.col=1の1は、1列目がtime情報であることを示す
               repl.col=2,             #repl.col=2の2は、2列目がreplicates情報であることを示す
               group.cols=c(3:ncol(edesign)))#group.cols=c(3:ncol(edesign)))の3は、3列目以降の情報がgroup情報であることを示す
design                                 #確認してるだけです(デザイン行列情報)
fit <- p.vector(data, design, counts=TRUE, Q=param_FDR)#回帰モデルの作成
fit$i                                  #指定したFDR閾値を満たす発現変動遺伝子(DEG)数を表示
fit$BH.alfa                            #指定したFDR閾値に相当するp-valueを表示
fit$SELEC                              #DEGとされたものの発現情報を表示(DEG数が多い場合には画面が一気に流れる)

#本番(発現変動パターン検出; post-hoc testみたいなところ))
hoge <- T.fit(fit, alfa=param_FDR)     #geneごとに最もよい回帰モデルを選択した結果をhogeに格納
hoge$sol                               #結果のsummaryを表示。p-value列がANOVA p-value。右のほうのがpost-hoc testのどのモデルで違いがあったかを調べるためのp-value。

out <- get.siggenes(hoge, rsq=0.7, vars="groups")#回帰モデルのRsquaredの値が0.7(この値がデフォルト)よりも大きいものを抽出し、outに格納
out$summary                            #モデル(variables)ごとの閾値を満たすDEGリストを表示

#ファイルに保存
tmp <- cbind(rownames(hoge$sol), hoge$sol)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

	

解析 | 発現変動 | 時系列 | Bayesian model-based clustering (Nascimento_2012)

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

	

解析 | 発現変動 | exon/isoform | について

選択的スプライシング(alternative splicing; AS)とは、ある共通の前駆体mRNAからエクソン(exon)のextending, shortening, skipping, includingやイントロン(intron) 配列の保持(retaining)によって異なるmRNAバリアントを作り出すメカニズムのことを指します。 これらのイベントはalternative exon events (AEEs)と総称されるようです。 ちなみに全ヒト遺伝子の75-92%が複数のアイソフォーム(multiple isoforms)となりうるという報告もあるようです (言い換えると8-25%がsingle isoform genesだということ)。 複数のサンプル間で発現に違いのあるエクソン(Differential Exon Usage; DEU)を同定するためのプログラムです。 DEU以外にdifferential isoform usage用の方法が含まれます。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 発現変動 | exon/isoform | DEXSeq

DEXSeqパッケージを用いてサンプル間で発現に違いのあるエクソン(exon)を同定するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

	

解析 | 機能解析 | について

多少間違えているかもしれませんが、とりあえず2018年6月現在の私の理解に基づいて、全貌をざっくりと書きます。 機能解析という項目ですが、実質的にはGene Set Enrichment Analysis (GSEA)を意識した内容です。GSEAは、発現変動解析の枠組みに属するものです。 通常、発現変動解析は発現変動遺伝子(DEG)を個別に検出することを目的として行っています。 そして、その後の解析の多くは、「DEGとして検出されたもの(or 発現変動上位遺伝子群)の中に、何か特定の機能と関連したものが多く濃縮(Enrich)されているかどうか」を調べるというものでした。 例えば、「細胞周期(Cell Cycle)に関連する遺伝子群がDEGの中に多く含まれているかどうか」を調べるというものです。

Mootha et al.,2003の論文では、視点を変えた解析を行っています。 特定の機能に属する遺伝子群に関する知識(knowledge)はGene Ontology(GO)やKEGG Pathwayなどで整理されつつあったので、 「比較するグループ間で、例えば細胞周期に関連する遺伝子群のような特定の機能を果たす遺伝子群(Gene Set)が全体として発現変動しているかどうかを調べる」戦略を提唱しています。 そして、このような知識を利用した解析法(knowledge-based analysis)の考え方をbrush upさせたのが、Subramanian et al., 2005の論文のタイトルでもある、 Gene Set Enrichment Analysis (GSEA)です。この方法は、遺伝子セット解析(Gene Set Analysis; GSA)とも総称されますが、事実上GSEAの考え方そのものを指します。 このような発現変動に関連した機能解析を行う際に、遺伝子セットとして遺伝子オントロジー(GO)の情報を用いる場合はGO解析になり、 遺伝子セットとしてKEGG PathwayやReactomeの情報を用いる場合はパスウェイ解析になります。GSEAが爆発的に流行ったのは、以下に示すような様々な要因が重なったためと考えられます:

  1. GOやKEGGなど知識の整備が進んでいた(時代背景)
  2. マイクロアレイもコストが下がり流行っていた(時代背景)
  3. それらをうまく利用して、従来の機能解析を「知識ベースの発現変動解析」に切り替えた(クールな発想の転換)
  4. エンドユーザが使いやすいようにMolecular Signatures Database (MSigDB)上で 遺伝子セット解析のための基盤情報を提供(丁寧なアフターフォロー)

MSigDBは、様々な遺伝子セットの情報を含むデータベースです。 GSEAのサイトの右上にある図中で、Gene set Databaseと書かれているものに相当します。 ユーザは、MSigDBから自分が調べたい遺伝子セット情報を含むGMTファイル(.gmt)を予めダウンロードしておく必要があります。 従って、入力ファイルとして必要なものは2種類(マイクロアレイやRNA-seqで得られた発現行列のファイルと.gmtファイル)になります。 これらを入力として、GSEAプログラムそのものや、その後提案された様々な遺伝子セット解析用プログラムを実行するのです。 発現変動に関連した機能解析用プログラムの中には、パスウェイ解析に特化したもの、GO解析もできるもの、遺伝子セット解析全般ができるものなどいろいろあります。

現実問題として、エンドユーザが特に手元にあるRNA-seqの発現データを用いてプログラムを実行する障壁は非常に高いです。 理由は、発現情報ファイル中のfeature IDと.gmtファイル中のIDとの対応付けを行う部分が厄介だからです。 featureという曖昧な用語を用いているのは、発現行列の各行が仮にgeneを指し示すIDに限定されていたとしても、 Ensembl gene ID、Entrez gene ID、gene symbolsなどが現実にあり得ます。また、 exonやtranscriptを指し示すIDかもしれませんし、マイクロアレイデータの場合は各メーカーによって異なる独自のID (例えばAffymetrixのID)になります。 それゆえ、featureという曖昧な表現がよく使われるのです。

現在MSigDBでは、 Entrez gene ID(ファイル名の最後のほうが.entrez.gmt)とgene symbols(ファイル名の最後のほうが.symbols.gmt) の2種類が提供されています。それゆえ、手元の発現データファイル中のfeature IDがもしEntrez gene IDなら、.entrez.gmtを利用することになります。 feature IDがもしEntrez gene ID以外なら、(多くの場合はgene symbolsとの対応付けは行える状況にあるので)予めfeature IDをgene symbolsにどうにかして変換してから、 .symbols.gmtを利用してプログラムを実行することになります。

但し、発現行列データ側の前処理として、同一feature IDsの重複除去を行っておく必要もあります。 有意な発現変動遺伝子セットを検出する際に、複数個存在する同一feature IDsの情報が過大評価されないようにするのが目的です。 これも、実際に重複除去をやろうとすると色々と厄介です。例えば、発現変動遺伝子セット解析用パッケージのGSVA は、発現行列データの格納形式としてExpressionSetオブジェクトを利用しています。そして、 前処理として重複除去を行う際にgenefilter パッケージ内のnsFilter関数(入力がExpressionSetオブジェクト)を利用しています。 ExpressionSetオブジェクトは、特にユーザに意識させることなく(Rで)マイクロアレイデータ解析上でも使っていましたが、 このようなデータ形式を取り扱うスキルもきっちり身につけていく必要があります。尚、 マイクロアレイデータの頃はExpressionSetオブジェクトがよく使われていましたが、RNA-seqカウントデータの現在は SummarizedExperimentやRangedSummarizedExperimentがよく使われます。

解析 | 機能解析 | GMTファイル取得 | について

Gene Set Enrichment Analysis (GSEA)に代表される遺伝子セット解析を行うためには、 (発現情報と)遺伝子セット情報が必要です。遺伝子セット情報の取得場所として最も有名なのは、 Molecular Signatures Database (MSigDB)であり、Gene Matrix Transposed (GMT)形式で提供されています。 遺伝子セット情報は、MSigDBを含む以下からも提供されています:

解析 | 機能解析 | GMTファイル取得 | EGSEAdata(Alhamdoosh_2017)

EGSEAdataパッケージからも遺伝子セット情報を取得可能です。 中身はヒトとマウスのMSigDBGeneSetDBのようです。 GMTファイル取得、と言っていいのかどうかまでは未検証です。

解析 | 機能解析 | GMTファイル取得 | GeneSetDB(Araki_2012)

GeneSetDBからもGMT形式ファイルを取得可能です。 拡張子は.gmtにはなっていませんが、中身は間違いなくGMT形式になっています。GeneSetDB is freely available for academic purposes. だそうです。

解析 | 機能解析 | GMTファイル取得 | MSigDB(Subramanian_2005)

MSigDBから遺伝子セット情報を含むGMTファイル(.gmt)を取得するやり方を示します。2022年5月現在は、MSigDB version 7.5.1です。License Agreement for MSigDB v6.0 and aboveにもありますが、MSigDB v6.0以降、提供データが Creative Commons Attribution 4.0 International Licenseになったようです(KEGG、BioCarta、AAAS/STKE Cell Signaling Database dataの3種類を除く)。 MSigDB v7.5.1では、以下に示す9個の主要なコレクション(9 major collections)が提供されています。ときどきMSigDBからgmtファイルをダウンロードできない事態に遭遇しますので、このサイト上でも提供可能なものはダウンロードできる状態にしています。 但し、このサイト上からダウロードした場合は、registerし、MSigDBに対して仁義を果たして下さい。MSigDBがfunding agenciesに利用者情報を報告するために必要です。 また、MSigDBの論文だけでなく、例えば 1番目のコレクションであるH hallmark gene setsを利用する場合は Liberzon et al., 2015を、そして 2番目のコレクションであるC2(curated gene sets)に含まれるCP:Reactomeのgene setsを利用する場合は Joshi-Tope et al., 2005などを適切に引用しましょう。

  1. H: hallmark gene sets(50 gene sets)
  2. C1: positional gene sets(299 gene sets)
  3. C2: curated gene sets(6366 gene sets)
  4. C3: regulatory target gene sets(3726 gene sets)
  5. C4: computational gene sets(858 gene sets)
  6. C5: ontology gene sets(15473 gene sets)
  7. C6: oncogenic signature gene sets(189 gene sets)
  8. C7: immunologic signature gene sets(5219 gene sets)
  9. C8: cell type signature gene sets(700 gene sets)

解析 | 機能解析 | GMTファイル読込 | GSEABase(Morgan_2018)

GSEABaseを用いて.gmtファイルを読み込むやり方を示します。 GeneSetCollectionという形式で情報が格納されています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. MSigDBから得られた299 gene setsからなるc1.all.v7.5.1.symbols.gmtの場合:

基本形です。最後のgenesetオブジェクトの確認で、geneIdTypeのところがNullIdentifierに、 そしてcollectionTypeのところがNullCollectionになっているのが分かります。

in_f <- "c1.all.v7.5.1.symbols.gmt"      #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(GSEABase)                      #パッケージの読み込み

#入力ファイルの読み込み
geneset <- getGmt(in_f)                #in_fで指定したファイルの読み込み
geneset                                #確認してるだけです
	

2. MSigDBから得られた299 gene setsからなるc1.all.v7.5.1.symbols.gmtの場合:

このファイルはgene ID情報がgene symbolsであり、 MSigDBの提供元であるBroad Instituteのコレクションの C1というカテゴリーに属するものであるという情報を明確に与えています。geneIdTypeとcollectionTypeのところが例題1とは異なっていることがわかります。

in_f <- "c1.all.v7.5.1.symbols.gmt"      #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(GSEABase)                      #パッケージの読み込み

#入力ファイルの読み込み
geneset <- getGmt(in_f, geneIdType=SymbolIdentifier(),#in_fで指定したファイルの読み込み
                  collectionType=BroadCollection(category="c1"))#in_fで指定したファイルの読み込み
geneset                                #確認してるだけです
	

3. MSigDBから得られた299 gene setsからなるc1.all.v7.5.1.entrez.gmtの場合:

例題2とは入力ファイルが異なります。このファイルはgene ID情報がEntrez gene IDsですので、 その部分のみ例題2とは異なります。

in_f <- "c1.all.v7.5.1.entrez.gmt"       #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(GSEABase)                      #パッケージの読み込み

#入力ファイルの読み込み
geneset <- getGmt(in_f, geneIdType=EntrezIdentifier(),#in_fで指定したファイルの読み込み
                  collectionType=BroadCollection(category="c1"))#in_fで指定したファイルの読み込み
geneset                                #確認してるだけです
	

4. MSigDBから得られた1615 gene setsからなるc2.cp.reactome.v7.5.1.symbols.gmtの場合:

MSigDBの提供元であるBroad Instituteのコレクションの C2というカテゴリーに属するものであるという情報を明確に与えています。

in_f <- "c2.cp.reactome.v7.5.1.symbols.gmt"#入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(GSEABase)                      #パッケージの読み込み

#入力ファイルの読み込み
geneset <- getGmt(in_f, geneIdType=SymbolIdentifier(),#in_fで指定したファイルの読み込み
                  collectionType=BroadCollection(category="c2"))#in_fで指定したファイルの読み込み
geneset                                #確認してるだけです
	

5. MSigDBから得られた1738 gene setsからなるc5.mf.v7.5.1.symbols.gmtの場合:

MSigDBの提供元であるBroad Instituteのコレクションの C5というカテゴリーに属するものであるという情報を明確に与えています。

in_f <- "c5.mf.v7.5.1.symbols.gmt"   #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(GSEABase)                      #パッケージの読み込み

#入力ファイルの読み込み
geneset <- getGmt(in_f, geneIdType=SymbolIdentifier(),#in_fで指定したファイルの読み込み
                  collectionType=BroadCollection(category="c5"))#in_fで指定したファイルの読み込み
geneset                                #確認してるだけです
	

解析 | 機能解析 | 遺伝子セット解析 | GSVA(Hänzelmann_2013)

GSVAを用いて遺伝子セット解析を行うやり方を示します。 このデータはAbsFilterGSEA (Yoon et al., PLoS One, 2016)、 およびGSVA (Hänzelmann et al., BMC Bioinformatics, 2013)中で、 検証用データとして用いられています。具体的には、MSigDBのC1というコレクションに含まれる 2つのsex-specificな遺伝子セット(chryq11とchrxp22)が発現変動しているという結果を得ているようです。従って、 ここではGSVA実行に必要な2つのファイルのうち、gmtファイルをMSigDBから得られた 299 gene setsからなるC1コレクションのgmtファイル(c1.all.v7.5.1.entrez.gmtc1.all.v7.5.1.symbols.gmt) を用いて、いくつかの例題を示します。尚、GSVA自体はエンリッチメントスコア(Enrithment Score)をサンプルごとに算出した結果を返すだけなので、 GSVAの実行のみの場合はどのサンプルがどの群に属しているかのグループラベル情報を与える必要はありません。 そのため、GSVA実行結果であるoutオブジェクト(フィルタリング後の遺伝子セット数×サンプル数)を入力として、 とりあえずnon-parametricのシンプルなwilcox.testを実行して得られたp-value情報を取得した結果も出力しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. カウントデータファイル(SRP001540_23_13.txt)とEntrezのgmtファイル(c1.all.v7.5.1.entrez.gmt)の場合:

「カウント情報取得 | リアルデータ | SRP001540 | GSVAdata(Hänzelmann_2013)」の例題7を実行して得られた、 11,482 genes × 36 samplesからなる23 females vs. 13 malesの2群間比較用データと同じものです。 同一gene IDsを重複除去した後のデータです。遺伝子セットchryq11のp値が最も低くなっており、妥当ですね。

in_f1 <- "SRP001540_23_13.txt"         #入力ファイル名を指定してin_f1に格納(発現ファイル)
in_f2 <- "c1.all.v7.5.1.entrez.gmt"      #入力ファイル名を指定してin_f2に格納(gmtファイル)
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 23                         #G1群のサンプル数を指定
param_G2 <- 13                         #G2群のサンプル数を指定

#必要なパッケージをロード
library(GSVA)                          #パッケージの読み込み
library(GSEABase)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
geneset <- getGmt(in_f2, geneIdType=EntrezIdentifier(),#in_f2で指定したファイルの読み込み
                  collectionType=BroadCollection(category="c1"))#in_f2で指定したファイルの読み込み
geneset                                #確認してるだけです

#本番(GSVAの実行)
data <- as.matrix(data)                #データの型をmatrixにしている
out <- gsva(data, geneset,             #GSVAの実行
            min.sz=5, max.sz=500, kcdf="Poisson",#GSVAの実行(遺伝子セットのメンバー数が5以上?!500以下?!のものに限定)
            mx.diff=T, verbose=F, parallel.sz=1) #GSVAの実行
dim(out)                               #確認してるだけです

#後処理(wilcox.testを実行)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
pvalue <- NULL                         #pvalueというプレースホルダの作成
for(i in 1:nrow(out)){                 #遺伝子セット数に相当するnrow(out)回だけループを回す
  pvalue <- c(pvalue, wilcox.test(out[i, data.cl==1], out[i, data.cl==2])$p.value)#p値を計算した結果をどんどんpvalueに格納
}

#ファイルに保存
tmp <- cbind(rownames(out), out, pvalue)#保存したい情報をtmpに格納
tmp <- tmp[order(pvalue),]             #pvalue順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. カウントデータファイル(srp001540_count_symbols.txt)とgene symbolsのgmtファイル(c1.all.v7.5.1.symbols.gmt)の場合:

「解析 | 前処理 | ID変換 | Ensembl Gene ID --> gene symbols | 基礎」の例題5を実行して得られた、 23,377 gene symbols × 69 samplesからなる40 females vs. 29 malesの2群間比較用データと同じものです。 遺伝子セットchryq11のp値が最も低くなっており、妥当ですね。

in_f1 <- "srp001540_count_symbols.txt" #入力ファイル名を指定してin_f1に格納(発現ファイル)
in_f2 <- "c1.all.v7.5.1.symbols.gmt"     #入力ファイル名を指定してin_f2に格納(gmtファイル)
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 40                         #G1群のサンプル数を指定
param_G2 <- 29                         #G2群のサンプル数を指定

#必要なパッケージをロード
library(GSVA)                          #パッケージの読み込み
library(GSEABase)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
geneset <- getGmt(in_f2, geneIdType=SymbolIdentifier(),#in_f2で指定したファイルの読み込み
                  collectionType=BroadCollection(category="c1"))#in_f2で指定したファイルの読み込み
geneset                                #確認してるだけです

#本番(GSVAの実行)
data <- as.matrix(data)                #データの型をmatrixにしている
out <- gsva(data, geneset,             #GSVAの実行
            min.sz=5, max.sz=500, kcdf="Poisson",#GSVAの実行(遺伝子セットのメンバー数が5以上?!500以下?!のものに限定)
            mx.diff=T, verbose=F, parallel.sz=1) #GSVAの実行
dim(out)                               #確認してるだけです

#後処理(wilcox.testを実行)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
pvalue <- NULL                         #pvalueというプレースホルダの作成
for(i in 1:nrow(out)){                 #遺伝子セット数に相当するnrow(out)回だけループを回す
  pvalue <- c(pvalue, wilcox.test(out[i, data.cl==1], out[i, data.cl==2])$p.value)#p値を計算した結果をどんどんpvalueに格納
}

#ファイルに保存
tmp <- cbind(rownames(out), out, pvalue)#保存したい情報をtmpに格納
tmp <- tmp[order(pvalue),]             #pvalue順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

3. カウントデータファイル(srp001540_count_symbols.txt)とgene symbolsのgmtファイル(c1.all.v7.5.1.symbols.gmt)の場合:

例題2と基本的に同じですが、gsva実行時に「XXX genes with constant expression values throuhgout the samples」と表示されるXXX genesのリストを抽出するやり方です。

in_f1 <- "srp001540_count_symbols.txt" #入力ファイル名を指定してin_f1に格納(発現ファイル)
in_f2 <- "c1.all.v7.5.1.symbols.gmt"     #入力ファイル名を指定してin_f2に格納(gmtファイル)
out_f <- "hoge3.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 40                         #G1群のサンプル数を指定
param_G2 <- 29                         #G2群のサンプル数を指定

#必要なパッケージをロード
library(GSVA)                          #パッケージの読み込み
library(GSEABase)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
geneset <- getGmt(in_f2, geneIdType=SymbolIdentifier(),#in_f2で指定したファイルの読み込み
                  collectionType=BroadCollection(category="c1"))#in_f2で指定したファイルの読み込み
geneset                                #確認してるだけです

#本番(GSVAの実行)
data <- as.matrix(data)                #データの型をmatrixにしている
out <- gsva(data, geneset,             #GSVAの実行
            min.sz=5, max.sz=500, kcdf="Poisson",#GSVAの実行(遺伝子セットのメンバー数が5以上?!500以下?!のものに限定)
            mx.diff=T, verbose=F, parallel.sz=1) #GSVAの実行
dim(out)                               #確認してるだけです

#後処理(wilcox.testを実行)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
pvalue <- NULL                         #pvalueというプレースホルダの作成
for(i in 1:nrow(out)){                 #遺伝子セット数に相当するnrow(out)回だけループを回す
  pvalue <- c(pvalue, wilcox.test(out[i, data.cl==1], out[i, data.cl==2])$p.value)#p値を計算した結果をどんどんpvalueに格納
}

#ファイルに保存
tmp <- cbind(rownames(out), out, pvalue)#保存したい情報をtmpに格納
tmp <- tmp[order(pvalue),]             #pvalue順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 機能解析 | 遺伝子オントロジー(GO)解析 | について

RNA-seqなどのタグカウントデータから遺伝子オントロジー(GO)解析を行うためのパッケージもいくつか出ています。 遺伝子セット解析(Gene Set Analysis; GSA)という枠組みではGO解析もパスウェイ解析も同じなので、そちらもチェックするといいかもしれません。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 機能解析 | 遺伝子オントロジー(GO)解析 | SeqGSEA (Wang_2014)

SeqGSEAを用いてGO解析を行うやり方を示します。 このパッケージは、exonレベルのカウントデータを入力として、発現変動遺伝子セットに相当する有意に発現変動したGO termsを出力するのが基本ですが、geneレベルのカウントデータを入力として解析することも可能です。 統計的有意性の評価にサンプルラベル情報の並べ替え(permutation)戦略を採用しているため、 各グループあたりの反復数が5以上のデータを想定しているようです(Wang et al., 2014)。また、計算時間が半端なくかかります。 例えば、並べ替え回数がたったの20回でも2時間ちょっとかかります(Panasonic Let's note CF-SX3本郷モデルの場合)のでご注意ください。 推奨は1000回以上と書いてますが、10日ほどかかることになるので個人的にはアリエナイですね...。 SeqGSEAでの機能解析の基本は、exonレベルとgeneレベルの発現変動解析結果を組み合わせてGSEAを行うというものです(Wang and Cairns, 2013)。 SeqGSEA著者たちは、exonレベルの発現変動解析のことをDifferential splicing (DS) analysisと呼んでいて、 おそらくDSGseq (Wang et al., 2013)はSeqGSEA中に組み込まれています。 そしてgeneレベルの発現変動解析をDifferential expression (DE) analysisとして、SeqGSEA中では DESeqを利用しています。 GSEAに代表される発現変動遺伝子セット解析は、基本的にGSEAの開発者らが作成した様々な遺伝子セット情報を収めた Molecular Signatures Database (MSigDB)からダウンロードした.gmt形式ファイルを読み込んで解析を行います。 *gmt形式ファイルのダウンロードについては、 「解析 | 機能解析 | GMTファイル取得 | MSigDB(Subramanian_2005)」をご覧下さい。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. exonレベルのカウントデータファイル(srp017142_count_bowtie2.txt)の場合:

パイプライン | ゲノム | 機能解析 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013) のStep2の出力結果ファイルです。SeqGSEA内部でReadCountSetクラスオブジェクトというものを作成する必要がありますが、 これはexonレベルのカウントデータと遺伝子アノテーション情報(Ensembl gene IDおよびexon ID)を対応づけるためのものです。 カウントデータ自体は、ヒトゲノム("hg19")のEnsembl Genes ("ensGene")情報を利用して取得しているので、 アノテーション情報も同じ条件でオンライン上でTxDbオブジェクトとして取得しています(Lawrence et al., 2013)。 以下のスクリプト中の前処理のところでごちゃごちゃと計算しているのは、複数のEnsembl gene IDによって共有されているexon (shared exon)の情報のみ解析から除外しています。 その後、shared exonを除く残りのexonレベルのカウントデータ情報を用いてDifferential splicing (DS) analysisを行い、exonレベルの発現変動解析(Wang et al., Gene, 2013)を行っています。 計算のボトルネックはこの部分です。 次に、exonレベルのカウントデータからgeneレベルのカウントデータを作成したのち、DESeqパッケージを用いて 遺伝子レベルの発現変動解析(Anders and Huber, 2010)を行っています。 SeqGSEA (Wang and Cairns, BMC Bioinformatics)は、これら2つのレベルの発現変動解析結果の情報を統合して よりよい遺伝子セット解析(Gene Set Enrichment Analysis; GSEA; Subramanian et al., 2005)を行うという手法です。 ヒト遺伝子の90%以上は選択的スプライシングが起こっている(Wang et al., Nature, 2008)ので、 geneレベルのみの発現変動解析結果をもとにするやり方であるGOSeq (Young et al., Genome Biol., 2010)よりもいいだろう、という思想です。 以下では"c5.bp.v4.0.symbols.gmt"の解析を行っています。 また、並べ替え回数がたったの20回でも2時間ちょっとかかります(Panasonic Let's note CF-SX3本郷モデルの場合)のでご注意ください。 並べ替えを200回行って得られた srp017142_SeqGSEA_c5bp_exon200.txtでは、FDR < 0.01を満たすGO termは26個であることがわかります。

in_f1 <- "srp017142_count_bowtie2.txt" #入力ファイル名を指定してin_f1に格納
in_f2 <- "c5.bp.v4.0.symbols.gmt"      #入力ファイル名を指定してin_f2に格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_perm <- 20                       #並べ替え回数を指定(数値が大きいほどより正確だがその分だけ時間がかかる。実際の解析ではサンプル数にもよるが最低でも1000以上を推奨)
param1 <- "hg19"                       #TxDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #TxDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

#必要なパッケージをロード
library(SeqGSEA)                       #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
dim(data)                              #確認してるだけです
tmp_colname <- colnames(data)          #SeqGSEAが判別可能なサンブルラベル情報に変更
colnames(data) <- c(paste("E", 1:param_G1, sep=""), paste("C", 1:param_G2, sep=""))#SeqGSEAが判別可能なサンブルラベル情報に変更

#前処理(ReadCountSetクラスオブジェクトの作成)
txdb <- makeTxDbFromUCSC(genome=param1, tablename=param2)#txdbオブジェクトの作成
hoge1 <- exonsBy(txdb, by=c("gene"))   #Ensembl Gene IDごとに構成するexonの座標情報を格納したGRangesListオブジェクトをhoge1に格納
hoge2 <- unlist(hoge1)                 #GRangesListからGRanges形式オブジェクトに変換
hoge2                                  #確認してるだけです
hoge3 <- table(hoge2$exon_id)          #exon IDごとの出現回数を取得
hoge4 <- names(hoge3)[hoge3 == 1]      #出現回数が1回だったもののexon ID情報を取得
obj <- is.element(as.character(hoge2$exon_id), hoge4)#元のhoge2オブジェクト上での位置情報を取得
exonIDs <- as.character(hoge2$exon_id)[obj]#shared exon以外のexon IDを取得
geneIDs <- names(hoge2)[obj]           #shared exon以外のgene IDを取得
data <- data[exonIDs,]                 #shared exon以外のexon IDの並びでカウントデータのサブセットを取得
dim(data)                              #確認してるだけです
exonIDs <- paste("E", exonIDs, sep="") #exon IDの最初に"E"を追加
RCS <- newReadCountSet(data, exonIDs, geneIDs)#ReadCountSetオブジェクトを作成
RCS                                    #確認してるだけです

#前処理(低発現exonのフィルタリング)
RCS <- exonTestability(RCS, cutoff = 5)#exonレベルでの総リードカウント数が5未満のリードを除去
geneTestable <- geneTestability(RCS)   #geneレベルでのフィルタリングの有無情報を取得
RCS <- subsetByGenes(RCS, unique(geneID(RCS))[geneTestable])#フィルタリング実行
RCS                                    #確認してるだけです

#本番(Differential splicing (DS) analysis; Wang et al., Gene, 2013)
time_DS_s <- proc.time()               #計算時間を計測するため
RCS <- estiExonNBstat(RCS)             #DS解析(exon DS NB-statistics算出)
RCS <- estiGeneNBstat(RCS)             #DS解析(gene DS NB-statistics算出)
head(fData(RCS)[, c("exonIDs", "geneIDs", "testable", "NBstat")])#確認してるだけです
permuteMat <- genpermuteMat(RCS, times=param_perm)#DS解析(permutation testのところ)
RCS <- DSpermute4GSEA(RCS, permuteMat) #DS解析(permutation testのところ)
DSscore.normFac <- normFactor(RCS@permute_NBstat_gene) #DS解析(NB統計量の正規化によるDSスコアの算出)
DSscore <- scoreNormalization(RCS@featureData_gene$NBstat, DSscore.normFac)#DS解析(NB統計量の正規化によるDSスコアの算出)
DSscore.perm <- scoreNormalization(RCS@permute_NBstat_gene, DSscore.normFac)#DS解析(NB統計量の正規化によるDSスコアの算出)
RCS <- DSpermutePval(RCS, permuteMat)  #DS解析(p値の算出)
head(DSresultGeneTable(RCS))           #確認してるだけです
time_DS_e <- proc.time()               #計算時間を計測するため
time_DS_e - time_DS_s                  #計算時間を表示(単位は秒)

#本番(Differential expression (DE) analysis; Anders and Huber, Genome Biol., 2010)
time_DE_s <- proc.time()               #計算時間を計測するため
geneCounts <- getGeneCount(RCS)        #DE解析(geneレベルのカウントデータ取得)
head(geneCounts)                       #確認してるだけです
DEG <- runDESeq(geneCounts, label(RCS))#DE解析(DESeqの実行)
DEGres <- DENBStat4GSEA(DEG)           #DE解析(NB統計量情報の取得)
DEpermNBstat <- DENBStatPermut4GSEA(DEG, permuteMat)#DE解析(permutation testのところ)
DEscore.normFac <- normFactor(DEpermNBstat)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore <- scoreNormalization(DEGres$NBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore.perm <- scoreNormalization(DEpermNBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEGres <- DEpermutePval(DEGres, DEpermNBstat)#DE解析(p値の算出)
head(DEGres)                           #確認してるだけです
time_DE_e <- proc.time()               #計算時間を計測するため
time_DE_e - time_DE_s                  #計算時間を表示(単位は秒)

#本番(Integrative GSEA; Wang and Cairns, BMC Bioinformatics, 2013)
combine <- rankCombine(DEscore, DSscore, DEscore.perm, DSscore.perm, DEweight = 0.3)#DS scoreとDE scoreの統合
gene.score <- combine$geneScore        #integrated score情報取得
gene.score.perm <- combine$genePermuteScore#permutationデータセットのintegrated average score情報取得
GS <- loadGenesets(in_f2, unique(geneID(RCS)), geneID.type = "ensembl")#gmtファイルの読み込みおよびSeqGeneSetオブジェクトの作成
GS <- GSEnrichAnalyze(GS, gene.score, gene.score.perm)#SeqGSEAの実行

#ファイルに保存
#tmp <- GSEAresultTable(GS, GSDesc = TRUE)#SeqGSEA実行結果をtmpに格納(この関数はソート機能がないので非推奨)
tmp <- topGeneSets(GS, n=length(GS@GSNames), sortBy="FDR")#SeqGSEA実行結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. geneレベルのカウントデータファイル(srp017142_count_bowtie.txt)の場合:

パイプライン | ゲノム | 発現変動 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013) のStep2の出力結果ファイルです。 SeqGSEA (Wang et al., 2014)は、 exonレベル(Differential Splicing; DS)とgeneレベル(Differential Expression; DE)の2つの発現変動解析結果を統合して よりよい遺伝子セット解析(Gene Set Enrichment Analysis; GSEA; Subramanian et al., 2005)を行うという手法ですが、 選択的スプライシング(Alternative Splicing; AS)が少ないあるいはない高等生物以外にも適用可能です。 ここでは、geneレベルの発現変動解析のみに基づくDE-only GSEAのやり方を示します。計算時間のボトルネックになっていたexonレベルの発現変動解析を含まないので高速に計算可能なため、 並べ替え回数を多くすることが可能です(500回で100分程度)。 以下では"c5.bp.v4.0.symbols.gmt"の解析を行っています。並べ替えを500回行って得られた srp017142_SeqGSEA_c5bp_gene500.txtでは、FDR < 0.05を満たすGO termは10個であることがわかります。

in_f1 <- "srp017142_count_bowtie.txt"  #入力ファイル名を指定してin_f1に格納
in_f2 <- "c5.bp.v4.0.symbols.gmt"      #入力ファイル名を指定してin_f2に格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_perm <- 40                       #並べ替え回数を指定(数値が大きいほどより正確だがその分だけ時間がかかる。実際の解析ではサンプル数にもよるが最低でも1000以上を推奨)

#必要なパッケージをロード
library(SeqGSEA)                       #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f4で指定したファイルの読み込み
dim(data)                              #確認してるだけです
tmp_colname <- colnames(data)          #SeqGSEAが判別可能なサンブルラベル情報に変更
colnames(data) <- c(paste("E", 1:param_G1, sep=""), paste("C", 1:param_G2, sep=""))#SeqGSEAが判別可能なサンブルラベル情報に変更
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番(Differential expression (DE) analysis; Anders and Huber, Genome Biol., 2010)
time_s <- proc.time()                  #計算時間を計測するため
DEG <- runDESeq(data, as.factor(data.cl))#DESeqの実行
DEGres <- DENBStat4GSEA(DEG)           #NB統計量情報の取得
permuteMat <- genpermuteMat(as.factor(data.cl), times=param_perm)#並べ替え情報の取得
DEpermNBstat <- DENBStatPermut4GSEA(DEG, permuteMat)#DE解析(permutation testのところ)
DEscore.normFac <- normFactor(DEpermNBstat)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore <- scoreNormalization(DEGres$NBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore.perm <- scoreNormalization(DEpermNBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)

#本番(Integrative GSEA; Wang and Cairns, BMC Bioinformatics, 2013)
gene.score <- geneScore(DEscore, DEweight=1)#integrated score情報取得
gene.score.perm <- genePermuteScore(DEscore.perm, DEweight=1)#permutationデータセットのintegrated average score情報取得
GS <- loadGenesets(in_f2, rownames(data), geneID.type = "ensembl")#gmtファイルの読み込みおよびSeqGeneSetオブジェクトの作成
GS <- GSEnrichAnalyze(GS, gene.score, gene.score.perm, weighted.type=1)#SeqGSEAの実行
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(単位は秒)

#ファイルに保存
#tmp <- GSEAresultTable(GS, GSDesc = TRUE)#SeqGSEA実行結果をtmpに格納(この関数はソート機能がないので非推奨)
tmp <- topGeneSets(GS, n=length(GS@GSNames), sortBy="FDR")#SeqGSEA実行結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 機能解析 | 遺伝子オントロジー(GO)解析 | GSVA(Hänzelmann_2013)

GSVAを用いて遺伝子オントロジー(GO)解析を行うやり方を示します。 基本的に「解析 | 機能解析 | 遺伝子セット解析 | GSVA(Hänzelmann_2013)」の内容と同じで、gmtファイルが異なるだけです。 ここではGSVA実行に必要な2つのファイルのうち、gmtファイルをMSigDBから得られた7658 gene setsからなるc5.bp.v7.5.1.entrez.gmt に固定して、いくつかの例題を示します。尚、GSVA自体はエンリッチメントスコア(Enrithment Score)をサンプルごとに算出した結果を返すだけなので、 GSVAの実行のみの場合はどのサンプルがどの群に属しているかのグループラベル情報を与える必要はありません。 そのため、GSVA実行結果であるoutオブジェクト(フィルタリング後の遺伝子セット数×サンプル数)を入力として、 とりあえずnon-parametricのシンプルなwilcox.testを実行して得られたp-value情報を取得した結果も出力しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 11,482 genes × 36 samplesからなるカウントデータファイル(SRP001540_23_13.txt)の場合:

「カウント情報取得 | リアルデータ | SRP001540 | GSVAdata(Hänzelmann_2013)」の例題7を実行して得られた、 23 females vs. 13 malesの2群間比較用データと同じものです。 同一gene IDsを重複除去した後のデータです。3位に遺伝子セットGO_MALE_SEX_DIFFERENTIATIONがきていて妥当ですね。

in_f1 <- "SRP001540_23_13.txt"         #入力ファイル名を指定してin_f1に格納(発現ファイル)
in_f2 <- "c5.bp.v7.5.1.entrez.gmt"       #入力ファイル名を指定してin_f2に格納(gmtファイル)
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 23                         #G1群のサンプル数を指定
param_G2 <- 13                         #G2群のサンプル数を指定

#必要なパッケージをロード
library(GSVA)                          #パッケージの読み込み
library(GSEABase)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
geneset <- getGmt(in_f2, geneIdType=EntrezIdentifier(),#in_f2で指定したファイルの読み込み
                  collectionType=BroadCollection(category="c1"))#in_f2で指定したファイルの読み込み
geneset                                #確認してるだけです

#本番(GSVAの実行)
data <- as.matrix(data)                #データの型をmatrixにしている
out <- gsva(data, geneset,             #GSVAの実行
            min.sz=5, max.sz=500, kcdf="Poisson",#GSVAの実行(遺伝子セットのメンバー数が5以上?!500以下?!のものに限定)
            mx.diff=T, verbose=F, parallel.sz=1) #GSVAの実行
dim(out)                               #確認してるだけです

#後処理(wilcox.testを実行)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
pvalue <- NULL                         #pvalueというプレースホルダの作成
for(i in 1:nrow(out)){                 #遺伝子セット数に相当するnrow(out)回だけループを回す
  pvalue <- c(pvalue, wilcox.test(out[i, data.cl==1], out[i, data.cl==2])$p.value)#p値を計算した結果をどんどんpvalueに格納
}

#ファイルに保存
tmp <- cbind(rownames(out), out, pvalue)#保存したい情報をtmpに格納
tmp <- tmp[order(pvalue),]             #pvalue順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 機能解析 | 遺伝子オントロジー(GO)解析 | GOseq (Young_2010)

GOseqを用いてGO解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

	

解析 | 機能解析 | パスウェイ(Pathway)解析 | について

RNA-seqなどのタグカウントデータからパスウェイ(Pathway)解析を行うためのパッケージもいくつか出ています。 入力のカウントデータファイルのgene IDは、Ensembl (Zerbino et al., Nucleic Acids Res., 2018) が多いようです。 遺伝子セット解析(Gene Set Analysis; GSA)という枠組みではGO解析もパスウェイ解析も同じなので、そちらもチェックするといいかもしれません。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 機能解析 | パスウェイ(Pathway)解析 | GSAR (Rahmatallah_2017)

まだ途中です。動きません。GSARパッケージを用いた解析のやり方を示します。 GSARは、様々なプログラム群からなるパッケージです。 ここでは、GSARで提供されているGene Sets Net Correlations Analysis法(GSNCA; Rahmatallah et al., 2014)を実行するやり方を示します。 gmtファイルは、MSigDB (Subramanian et al., PNAS, 2005)から任意のものをダウンロードしてください。 尚、gmtファイルの読み込みにはGSAパッケージ (Efron and Tibshirani, 2007)中のGSA.read.gmt関数を利用しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. GSARの解析例として示されているPickrell datasetの場合:

tweeDEseqCountDataパッケージから提供されている pickrellという名前の52,580 genes×69 samplesのデータです。 17 wild-type (WT) samples vs. 33 mutant (MUT) samplesの2群間比較です。 gmtファイルは、MSigDB (ver. 5.2)の C2: curated gene sets中の 全データファイル(c2.all.v5.2.symbols.gmt)を利用しています。 この中に解析例で取り扱っている遺伝子セット("LU_TUMOR_VASCULATURE_UP")が含まれています。 ここでは、"LU_TUMOR_VASCULATURE_UP"を構成する遺伝子群(29 genes)の中から、 発現データ中に存在するもの(22 genes)に対してGSNCA法を適用した結果のp-value (= 0.02797)を出力するところまでを示します。 p-value = 0.02797という結果は、比較する2群間(WT vs. MUT)でこの遺伝子セットの発現の相関に差がない(帰無仮説)確率が2.797%しかないことを意味します。 1つの判断基準として、(建前上)有意水準α = 0.05を設定していたのなら、帰無仮説が本当は正しいが間違って棄却してしまう確率を5%に設定したことに相当し、 この場合はp-value < 0.05なので帰無仮説を棄却し対立仮説(差がある)を採択することになります。

in_f <- "c2.all.v5.2.symbols.gmt"      #入力ファイル名を指定してin_fに格納(gmtファイル)
param_G1 <- 17                         #G1群のサンプル数を指定
param_G2 <- 33                         #G2群のサンプル数を指定
param <- "LU_TUMOR_VASCULATURE_UP"     #解析したい遺伝子セット名を指定

#必要なパッケージをロード
library(GSAR)                          #パッケージの読み込み
library(tweeDEseqCountData)            #パッケージの読み込み
library(GSA)                           #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
hoge <- GSA.read.gmt(in_f)             #in_fで指定したファイルの読み込み(不完全な最終行が見つかりました、となっても気にしない)
gmt <- hoge$genesets                   #フォーマット変換
names(gmt) <- hoge$geneset.names       #フォーマット変換

data(pickrell)                         #tweeDEseqCountDataパッケージ中のpickrell.esetオブジェクトの呼び出し
data <- pickrell.eset                  #オブジェクト名の変更(dataとして取り扱う)
rownames(data) <- toupper(rownames(data))#gene symbolを大文字に変換している(gmtファイルに合わせるため)
dim(data)                              #確認してるだけです
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#GSAR本番(正確にはGSARから提供されているGSNCA法の実行)
set.seed(1053)                         #おまじない(同じ乱数になるようにするため)
hoge <- gmt[[param]]                   #解析したい遺伝子セット情報をhogeに格納
length(hoge)                           #遺伝子数を表示(gmtファイル)
obj <- is.element(rownames(data), hoge)#条件判定
sum(obj)                               #遺伝子数を表示(発現データ中に存在するものに限定)
p.value <- GSNCAtest(data[obj, ], data.cl)#GSNCAを実行
p.value                                #p-valueを表示
	

解析 | 機能解析 | パスウェイ(Pathway)解析 | SeqGSEA (Wang_2014)

SeqGSEAを用いてPathway解析を行うやり方を示します。 このパッケージは、exonレベルのカウントデータを入力として、発現変動遺伝子セットに相当する有意に発現変動したKEGG Pathway名などを出力するのが基本ですが、geneレベルのカウントデータを入力として解析することも可能です。 統計的有意性の評価にサンプルラベル情報の並べ替え(permutation)戦略を採用しているため、 各グループあたりの反復数が5以上のデータを想定しているようです(Wang et al., 2014)。また、計算時間が半端なくかかります。 例えば、並べ替え回数がたったの20回でも2時間ちょっとかかります(Panasonic Let's note CF-SX3本郷モデルの場合)のでご注意ください。 推奨は1000回以上と書いてますが、10日ほどかかることになるので個人的にはアリエナイですね...。 >SeqGSEAでの機能解析の基本は、exonレベルとgeneレベルの発現変動解析結果を組み合わせてGSEAを行うというものです(Wang and Cairns, 2013)。 SeqGSEA著者たちは、exonレベルの発現変動解析のことをDifferential splicing (DS) analysisと呼んでいて、 おそらくDSGseq (Wang et al., 2013)はSeqGSEA中に組み込まれています。 そしてgeneレベルの発現変動解析をDifferential expression (DE) analysisとして、SeqGSEA中では DESeqを利用しています。 GSEAに代表される発現変動遺伝子セット解析は、基本的にGSEAの開発者らが作成した様々な遺伝子セット情報を収めた Molecular Signatures Database (MSigDB)からダウンロードした.gmt形式ファイルを読み込んで解析を行います。 *gmt形式ファイルのダウンロード方法は、基本的に以下の通りです:

  1. Molecular Signatures Database (MSigDB)
      「register」のページで登録し、遺伝子セットをダウンロード可能な状態にする。
  2. Molecular Signatures Database (MSigDB)
      「Download gene sets」の"Download"のところをクリックし、Loginページで登録したe-mail addressを入力。
  3. これでMSigDBのダウンロードページに行けるので、
      「c2: curated gene sets」の「all canonical pathways」を解析したい場合はc2.cp.v4.0.symbols.gmtファイルをダウンロードしておく。
      「c2: curated gene sets」の「BioCarta gene sets」を解析したい場合はc2.cp.biocarta.v4.0.symbols.gmtファイルをダウンロードしておく。
      「c2: curated gene sets」の「KEGG gene sets」を解析したい場合はc2.cp.kegg.v4.0.symbols.gmtファイルをダウンロードしておく。
      「c2: curated gene sets」の「Reactome gene sets」を解析したい場合はc2.cp.reactome.v4.0.symbols.gmtファイルをダウンロードしておく。
     

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. exonレベルのカウントデータファイル(srp017142_count_bowtie2.txt)の場合:

パイプライン | ゲノム | 機能解析 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013) のStep2の出力結果ファイルです。SeqGSEA内部でReadCountSetクラスオブジェクトというものを作成する必要がありますが、 これはexonレベルのカウントデータと遺伝子アノテーション情報(Ensembl gene IDおよびexon ID)を対応づけるためのものです。 カウントデータ自体は、ヒトゲノム("hg19")のEnsembl Genes ("ensGene")情報を利用して取得しているので、 アノテーション情報も同じ条件でオンライン上でTxDbオブジェクトとして取得しています(Lawrence et al., 2013)。 以下のスクリプト中の前処理のところでごちゃごちゃと計算しているのは、複数のEnsembl gene IDによって共有されているexon (shared exon)の情報のみ解析から除外しています。 その後、shared exonを除く残りのexonレベルのカウントデータ情報を用いてDifferential splicing (DS) analysisを行い、exonレベルの発現変動解析(Wang et al., Gene, 2013)を行っています。 計算のボトルネックはこの部分です。 次に、exonレベルのカウントデータからgeneレベルのカウントデータを作成したのち、DESeqパッケージを用いて 遺伝子レベルの発現変動解析(Anders and Huber, 2010)を行っています。 SeqGSEA (Wang and Cairns, BMC Bioinformatics)は、これら2つのレベルの発現変動解析結果の情報を統合して よりよい遺伝子セット解析(Gene Set Enrichment Analysis; GSEA; Subramanian et al., 2005)を行うという手法です。 ヒト遺伝子の90%以上は選択的スプライシングが起こっている(Wang et al., Nature, 2008)ので、 geneレベルのみの発現変動解析結果をもとにするやり方であるGOSeq (Young et al., Genome Biol., 2010)よりもいいだろう、という思想です。 以下では"c2.cp.kegg.v4.0.symbols.gmt"の解析を行っています。 また、並べ替え回数がたったの20回でも2時間ちょっとかかります(Panasonic Let's note CF-SX3本郷モデルの場合)のでご注意ください。 並べ替えを200回行って得られた srp017142_SeqGSEA_c2cp_exon200.txtでは、FDR < 0.02を満たすパスウェイIDは21個であることがわかります(計算時間は20時間ほどでした)。

in_f1 <- "srp017142_count_bowtie2.txt" #入力ファイル名を指定してin_f1に格納
in_f2 <- "c2.cp.kegg.v4.0.symbols.gmt" #入力ファイル名を指定してin_f2に格納
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_perm <- 20                       #並べ替え回数を指定(数値が大きいほどより正確だがその分だけ時間がかかる。実際の解析ではサンプル数にもよるが最低でも1000以上を推奨)
param1 <- "hg19"                       #TxDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #TxDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

#必要なパッケージをロード
library(SeqGSEA)                       #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f4で指定したファイルの読み込み
dim(data)                              #確認してるだけです
tmp_colname <- colnames(data)          #SeqGSEAが判別可能なサンブルラベル情報に変更
colnames(data) <- c(paste("E", 1:param_G1, sep=""), paste("C", 1:param_G2, sep=""))#SeqGSEAが判別可能なサンブルラベル情報に変更

#前処理(ReadCountSetクラスオブジェクトの作成)
txdb <- makeTxDbFromUCSC(genome=param1, tablename=param2)#txdbオブジェクトの作成
hoge1 <- exonsBy(txdb, by=c("gene"))   #Ensembl Gene IDごとに構成するexonの座標情報を格納したGRangesListオブジェクトをhoge1に格納
hoge2 <- unlist(hoge1)                 #GRangesListからGRanges形式オブジェクトに変換
hoge2                                  #確認してるだけです
hoge3 <- table(hoge2$exon_id)          #exon IDごとの出現回数を取得
hoge4 <- names(hoge3)[hoge3 == 1]      #出現回数が1回だったもののexon ID情報を取得
obj <- is.element(as.character(hoge2$exon_id), hoge4)#元のhoge2オブジェクト上での位置情報を取得
exonIDs <- as.character(hoge2$exon_id)[obj]#shared exon以外のexon IDを取得
geneIDs <- names(hoge2)[obj]           #shared exon以外のgene IDを取得
data <- data[exonIDs,]                 #shared exon以外のexon IDの並びでカウントデータのサブセットを取得
dim(data)                              #確認してるだけです
exonIDs <- paste("E", exonIDs, sep="") #exon IDの最初に"E"を追加
RCS <- newReadCountSet(data, exonIDs, geneIDs)#ReadCountSetオブジェクトを作成
RCS                                    #確認してるだけです

#前処理(低発現exonのフィルタリング)
RCS <- exonTestability(RCS, cutoff = 5)#exonレベルでの総リードカウント数が5未満のリードを除去
geneTestable <- geneTestability(RCS)   #geneレベルでのフィルタリングの有無情報を取得
RCS <- subsetByGenes(RCS, unique(geneID(RCS))[geneTestable])#フィルタリング実行
RCS                                    #確認してるだけです

#本番(Differential splicing (DS) analysis; Wang et al., Gene, 2013)
time_DS_s <- proc.time()               #計算時間を計測するため
RCS <- estiExonNBstat(RCS)             #DS解析(exon DS NB-statistics算出)
RCS <- estiGeneNBstat(RCS)             #DS解析(gene DS NB-statistics算出)
head(fData(RCS)[, c("exonIDs", "geneIDs", "testable", "NBstat")])#確認してるだけです
permuteMat <- genpermuteMat(RCS, times=param_perm)#DS解析(permutation testのところ)
RCS <- DSpermute4GSEA(RCS, permuteMat) #DS解析(permutation testのところ)
DSscore.normFac <- normFactor(RCS@permute_NBstat_gene) #DS解析(NB統計量の正規化によるDSスコアの算出)
DSscore <- scoreNormalization(RCS@featureData_gene$NBstat, DSscore.normFac)#DS解析(NB統計量の正規化によるDSスコアの算出)
DSscore.perm <- scoreNormalization(RCS@permute_NBstat_gene, DSscore.normFac)#DS解析(NB統計量の正規化によるDSスコアの算出)
RCS <- DSpermutePval(RCS, permuteMat)  #DS解析(p値の算出)
head(DSresultGeneTable(RCS))           #確認してるだけです
time_DS_e <- proc.time()               #計算時間を計測するため
time_DS_e - time_DS_s                  #計算時間を表示(単位は秒)

#本番(Differential expression (DE) analysis; Anders and Huber, Genome Biol., 2010)
time_DE_s <- proc.time()               #計算時間を計測するため
geneCounts <- getGeneCount(RCS)        #DE解析(geneレベルのカウントデータ取得)
head(geneCounts)                       #確認してるだけです
DEG <- runDESeq(geneCounts, label(RCS))#DE解析(DESeqの実行)
DEGres <- DENBStat4GSEA(DEG)           #DE解析(NB統計量情報の取得)
DEpermNBstat <- DENBStatPermut4GSEA(DEG, permuteMat)#DE解析(permutation testのところ)
DEscore.normFac <- normFactor(DEpermNBstat)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore <- scoreNormalization(DEGres$NBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore.perm <- scoreNormalization(DEpermNBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEGres <- DEpermutePval(DEGres, DEpermNBstat)#DE解析(p値の算出)
head(DEGres)                           #確認してるだけです
time_DE_e <- proc.time()               #計算時間を計測するため

#本番(Integrative GSEA; Wang and Cairns, BMC Bioinformatics, 2013)
combine <- rankCombine(DEscore, DSscore, DEscore.perm, DSscore.perm, DEweight = 0.3)#DS scoreとDE scoreの統合
gene.score <- combine$geneScore        #integrated score情報取得
gene.score.perm <- combine$genePermuteScore#permutationデータセットのintegrated average score情報取得
GS <- loadGenesets(in_f2, unique(geneID(RCS)), geneID.type = "ensembl")#gmtファイルの読み込みおよびSeqGeneSetオブジェクトの作成
GS <- GSEnrichAnalyze(GS, gene.score, gene.score.perm)#SeqGSEAの実行

#ファイルに保存
#tmp <- GSEAresultTable(GS, GSDesc = TRUE)#SeqGSEA実行結果をtmpに格納(この関数はソート機能がないので非推奨)
tmp <- topGeneSets(GS, n=length(GS@GSNames), sortBy="FDR")#SeqGSEA実行結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

2. geneレベルのカウントデータファイル(srp017142_count_bowtie.txt)の場合:

パイプライン | ゲノム | 発現変動 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013) のStep2の出力結果ファイルです。 SeqGSEA (Wang and Cairns, BMC Bioinformatics)は、 exonレベル(Differential Splicing; DS)とgeneレベル(Differential Expression; DE)の2つの発現変動解析結果を統合して よりよい遺伝子セット解析(Gene Set Enrichment Analysis; GSEA; Subramanian et al., 2005)を行うという手法ですが、 選択的スプライシング(Alternative Splicing; AS)が少ないあるいはない高等生物以外にも適用可能です。 ここでは、geneレベルの発現変動解析のみに基づくDE-only GSEAのやり方を示します。計算時間のボトルネックになっていたexonレベルの発現変動解析を含まないので高速に計算可能なため、 並べ替え回数を多くすることが可能です(500回で100分程度)。 以下では"c2.cp.kegg.v4.0.symbols.gmt"の解析を行っています。並べ替えを500回行って得られた srp017142_SeqGSEA_c2cpkegg_gene1000.txtでは、FDR < 0.02を満たすPathwayは44個であることがわかります。

in_f1 <- "srp017142_count_bowtie.txt"  #入力ファイル名を指定してin_f1に格納
in_f2 <- "c2.cp.kegg.v4.0.symbols.gmt" #入力ファイル名を指定してin_f2に格納
out_f <- "hoge2.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_perm <- 40                       #並べ替え回数を指定(数値が大きいほどより正確だがその分だけ時間がかかる。実際の解析ではサンプル数にもよるが最低でも1000以上を推奨)

#必要なパッケージをロード
library(SeqGSEA)                       #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f4で指定したファイルの読み込み
dim(data)                              #確認してるだけです
tmp_colname <- colnames(data)          #SeqGSEAが判別可能なサンブルラベル情報に変更
colnames(data) <- c(paste("E", 1:param_G1, sep=""), paste("C", 1:param_G2, sep=""))#SeqGSEAが判別可能なサンブルラベル情報に変更
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#本番(Differential expression (DE) analysis; Anders and Huber, Genome Biol., 2010)
time_s <- proc.time()                  #計算時間を計測するため
DEG <- runDESeq(data, as.factor(data.cl))#DESeqの実行
DEGres <- DENBStat4GSEA(DEG)           #NB統計量情報の取得
permuteMat <- genpermuteMat(as.factor(data.cl), times=param_perm)#並べ替え情報の取得
DEpermNBstat <- DENBStatPermut4GSEA(DEG, permuteMat)#DE解析(permutation testのところ)
DEscore.normFac <- normFactor(DEpermNBstat)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore <- scoreNormalization(DEGres$NBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore.perm <- scoreNormalization(DEpermNBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)

#本番(Integrative GSEA; Wang and Cairns, BMC Bioinformatics, 2013)
gene.score <- geneScore(DEscore, DEweight=1)#integrated score情報取得
gene.score.perm <- genePermuteScore(DEscore.perm, DEweight=1)#permutationデータセットのintegrated average score情報取得
GS <- loadGenesets(in_f2, rownames(data), geneID.type = "ensembl")#gmtファイルの読み込みおよびSeqGeneSetオブジェクトの作成
GS <- GSEnrichAnalyze(GS, gene.score, gene.score.perm, weighted.type=1)#SeqGSEAの実行
time_e <- proc.time()                  #計算時間を計測するため
time_e - time_s                        #計算時間を表示(単位は秒)

#ファイルに保存
#tmp <- GSEAresultTable(GS, GSDesc = TRUE)#SeqGSEA実行結果をtmpに格納(この関数はソート機能がないので非推奨)
tmp <- topGeneSets(GS, n=length(GS@GSNames), sortBy="FDR")#SeqGSEA実行結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | 機能解析 | パスウェイ(Pathway)解析 | GSVA(Hänzelmann_2013)

GSVAを用いてパスウェイ(Pathway)解析を行うやり方を示します。 基本的に「解析 | 機能解析 | 遺伝子セット解析 | GSVA(Hänzelmann_2013)」の内容と同じで、gmtファイルが異なるだけです。 ここではGSVA実行に必要な2つのファイルのうち、gmtファイルをMSigDBから得られた1615 gene setsからなるc2.cp.reactome.v7.5.1.entrez.gmt に固定して、いくつかの例題を示します。尚、GSVA自体はエンリッチメントスコア(Enrithment Score)をサンプルごとに算出した結果を返すだけなので、 GSVAの実行のみの場合はどのサンプルがどの群に属しているかのグループラベル情報を与える必要はありません。 そのため、GSVA実行結果であるoutオブジェクト(フィルタリング後の遺伝子セット数×サンプル数)を入力として、 とりあえずnon-parametricのシンプルなwilcox.testを実行して得られたp-value情報を取得した結果も出力しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 11,482 genes × 36 samplesからなるカウントデータファイル(SRP001540_23_13.txt)の場合:

「カウント情報取得 | リアルデータ | SRP001540 | GSVAdata(Hänzelmann_2013)」の例題7を実行して得られた、 23 females vs. 13 malesの2群間比較用データと同じものです。 同一gene IDsを重複除去した後のデータです。1位の遺伝子セットはREACTOME_NEPHRIN_INTERACTIONSですが、どう解釈していいのかはわかりません。

in_f1 <- "SRP001540_23_13.txt"         #入力ファイル名を指定してin_f1に格納(発現ファイル)
in_f2 <- "c2.cp.reactome.v7.5.1.entrez.gmt"#入力ファイル名を指定してin_f2に格納(gmtファイル)
out_f <- "hoge1.txt"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 23                         #G1群のサンプル数を指定
param_G2 <- 13                         #G2群のサンプル数を指定

#必要なパッケージをロード
library(GSVA)                          #パッケージの読み込み
library(GSEABase)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
geneset <- getGmt(in_f2, geneIdType=EntrezIdentifier(),#in_f2で指定したファイルの読み込み
                  collectionType=BroadCollection(category="c1"))#in_f2で指定したファイルの読み込み
geneset                                #確認してるだけです

#本番(GSVAの実行)
data <- as.matrix(data)                #データの型をmatrixにしている
out <- gsva(data, geneset,             #GSVAの実行
            min.sz=5, max.sz=500, kcdf="Poisson",#GSVAの実行(遺伝子セットのメンバー数が5以上?!500以下?!のものに限定)
            mx.diff=T, verbose=F, parallel.sz=1) #GSVAの実行
dim(out)                               #確認してるだけです

#後処理(wilcox.testを実行)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
pvalue <- NULL                         #pvalueというプレースホルダの作成
for(i in 1:nrow(out)){                 #遺伝子セット数に相当するnrow(out)回だけループを回す
  pvalue <- c(pvalue, wilcox.test(out[i, data.cl==1], out[i, data.cl==2])$p.value)#p値を計算した結果をどんどんpvalueに格納
}

#ファイルに保存
tmp <- cbind(rownames(out), out, pvalue)#保存したい情報をtmpに格納
tmp <- tmp[order(pvalue),]             #pvalue順にソートした結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

解析 | リガンド-レセプター解析(ligand-receptor analysis) | について

scRNA-seqデータ解析で用いられる、細胞クラスター間の相互作用(interaction between cell clusters)を調べるためのものです。 マイクロアレイやbulk RNA-seqデータ解析で行われている遺伝子セット解析(gene set analysis)とカテゴリー的には同じ部類に属するようです (Luecken and Theis, Mol Syst Biol., 2019のpage 17-18のあたり)。 リガンドとレセプターのペアに関する情報は、CellPhoneDB(Vento-Tormo et al., Nature, 2018) が使えるようです。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 遺伝子制御ネットワーク推定 | について

遺伝子制御ネットワーク(Gene regulatory network; GRN)推定用プログラムたちです。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 機械学習(分類) | について

未知データが与えられたときに、それがどういう状態かを当てるものたちです(多数の語弊ありw)。 バイオインフォマティクス分野では、癌サンプル群と正常サンプル群のような2群間比較用の数値行列データ(各行が遺伝子、各列がサンプル) が手元にある状態からスタートします。そしてそのデータのみで全てのことを完結させます。 その理由は、手元のデータのみで完結させることができるからです。 但し!各群のサンプル数が数十程度あるというのが大前提です。例えば、 癌サンプル30例と正常サンプル30例の計60サンプルからなるRNA-seqカウントデータくらいの規模感があるデータじゃないとだめですよ、ということです。 発現変動解析を行う場合は、各群3サンプルで計6サンプルの2群間比較用データを入力とするくらいの感覚です。 しかし、その程度の規模感のデータだと入力として成立しないのでご注意ください。

説明用に、癌サンプルが25例(サンプル名はT1, T2, ..., T25)、正常サンプルが25例(サンプル名はN1, N2, ..., N25)の全部で50サンプルからなるデータを考えます。 まず、手元のデータは、各サンプルの状態(癌 or 正常)が分かっています。 「このサンプルは癌状態のもので、これは正常状態のものだ」ということであり、ラベル情報(label information) という言い方をします(他には、サンプルラベルとか)。

Step1:方法の選択。機械学習(分類)では、まずどの方法(アルゴリズム)を使うかを決めます。サポートベクターマシン(Support Vector Machine; SVM)とか、 ランダムフォレスト(Random Forest; RF)とか、ニューラルネットワーク(Neural Network; NN)とかいろいろあります。 例えばSVMを使うと決めます。SVMに与える情報には、数値行列データラベル情報は当然含まれます。 機械学習の最大の目的は、未知サンプルの状態(ラベル情報)を正しく予測するためのモデルを構築することです。 SVMやRFはただの手段であり、予測モデル(判別するための数式という理解でよい)を構築することが重要です。 但し、方法ごとに内部的に用いるパラメータが異なりますが、全てを自動的にやってくれるわけではない点に注意が必要です。 例えば、SVMのときにはどのカーネルを使うか(よく使われるのはRBFカーネル)とか、誤分類をどの程度許容するかというコストパラメータを指定せねばなりません。 このようにヒトが予め適切な値を指定してやらねばならないパラメータのことをハイパーパラメータといいます。 この方法(アルゴリズム)のときはこれらのハイパーパラメータを指定せねばならない、といった情報はネットで取得可能です。

Step2:パラメータチューニング(parameter tuning)。 どのパラメータをどの程度の数値の範囲で何通り試すかというパラメータチューニングも重要です。 このための手段としては、グリッドサーチクロスバリデーション(交差検証) グリッドサーチでは、例えばパラメータが2種類あり(パラメータAとB)、パラメータAでは実際の数値として10, 100, 1000を試すとします。 パラメータBでは0.1, 1, 10を試すとします。この場合は3×3 = 9通りの組み合わせを試して最適なパラメータを決めることになります。

Step3:予測と評価。 Step2とリンクしていると思いますが、交差検証ではデータセットをトレーニングセット(training set; 訓練データ)と テストセット(test set; テストデータ)に分割します。 例えば、計50サンプルのうち、80%をトレーニングセット(T1, T2, ..., T20とN1, N2, ..., N20)、 残りの20%をテストセット(T21, T22, ..., T25とN21, N22, ..., N25)とします。 計9通りのパラメータの組み合わせの1番目を用いて、トレーニングセットに対して予測モデルを構築します。 そして、その予測モデルを用いてテストセットの評価を行います。テストセットは答えが分かっているので、 計10サンプルのうちいくつをうまく当てられたか(予測精度)がわかるのです。次に組み合わせの2番目に対して同様の作業を行い、 予測精度を調べます。こんな感じで3, 4, ..., 9番目まで予測精度を調べてゆけば、どのパラメータを用いればよいかがわかるのです。
  もう少し詳細に述べていくと、データセットの分割方法は1通りのみではありません。例えば、データを5分割 (1つ目が1-5、2つ目が6-10、3つ目が11-15、4つ目が16-20、5つ目が21-25番目のサンプル)しておきます。 そうすると、テストセットとして使えるものが5つ分あります。例えば、1つ目の1-5(i.e., T1, T2, ..., T5, N1, N2, ..., N5)をテストセットとし、 残りをトレーニングセットにするのです。こんな感じで結果的に全部のデータをテストセットにしていろいろ予測精度を調べることで、 パラメータチューニングの精度を上げていくことができます。
  さらにもう少し詳細に述べていくと、実はこのような交差検証のチューニング手段で得られたパラメータは、 結局のところデータセット内の全ての情報を使っていることになります。それゆえ、結果的に全てのデータを用いて得られた予測精度通りに、 本当の未知のサンプル群に対しても予測できるのかは正当に評価できていないことになります。このあたりが汎化性能(はんかせいのう) という議論に相当します。それゆえ、例えば、テストセットは本当にテストセットとしてしか使わない、つまりパラメータチューニング用には一切使わないようにするやり方もあります。 それは、例えば、計50サンプルのうち、80%をトレーニングセット(T1, T2, ..., T20とN1, N2, ..., N20)、 残りの20%をテストセット(T21, T22, ..., T25とN21, N22, ..., N25)とした場合に、計40サンプルのトレーニングセットの中で、さらに交差検証のようなことをやって、 パラメータチューニングをやるのです。例えば、計40サンプルのうち、30サンプル(T1, T2, ..., T15とN1, N2, ..., N15)をトレーニングセット内のトレーニングセットとして用い、 トレーニングセット内の残りの10サンプル(T16, T17, T18, T19, T20, N16, N17, N18, N19, N20)を検証セット(validation set)として用いるのです。 次は、本当のテストセット(T21, T22, ..., T25とN21, N22, ..., N25)以外の別の10サンプルを検証セット(例えばT11-T15とN11-N15)とし、 残り(T1-T10とT16-T20、およびN1-N10とN16-N20)をトレーニングセット内のトレーニングセットとして予測モデルを構築するのです。 つまり、手元のデータセットをトレーニングセット、検証セット、テストセットに3分割するようなイメージでパラメータチューニングを行うことで、 汎化性能を正統に評価することができるのです。 ややこしいですが、直感的に(高精度な予測モデルを構築する上で必須である)パラメータチューニングを行いつつ、 且つ正統に予測モデルの性能評価するにはどうしなければいけないだろうか という視点で考えながら解釈していくとよいと思います。

以下では、機械学習を行うプログラムを示します。 パッケージの右側に「汎用」と書いてあるものの多くは、生命科学分野(RNA-seq, ChIP-seqなど)に限定しないものです。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 機械学習(分類) | 基礎 | MLSeq(Goksuluk_2019)

MLSeqを用いて機械学習(分類)を行うやり方を示します。 ここでは入力ファイルをサンプルデータ51のsample51.txtに限定して、 ステップごとに一つ一つ丁寧に説明していきます。このデータは、 MLSeqパッケージから提供されている cervical.txtという名前のカウントデータと同じものです。714行×58列からなる数値行列データです(「ヘッダー行」や「行名情報の列」を除く)。 データの原著論文は、Witten et al., 2010です。 子宮頸がん患者29例の正常組織と癌組織のペアサンプルであり、714のmicroRNA (714 miRNAs)の発現を調べたデータです。 (行名情報の列を除く)最初の29列分が正常サンプル(N1, N2, ..., N29)、残りの29列分が癌サンプル(T1, T2, ..., T29)のデータです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

Step 1:入力ファイルの読込みとラベル情報の割当てまで。

最初の29列分が正常組織のデータ、残りの29列分が癌組織のデータ だと分かっている場合に、以下のように記述します。 読み込んだdataオブジェクトは、714行×58列からなる数値行列データとなっていることが分かります。 MLSeqのBeginner's guide 中の「2 Preparing the input data」(page 4)の作業の一部に相当します。

in_f <- "sample51.txt"                 #入力ファイル名を指定してin_fに格納
param_G1 <- 29                         #G1(N)群のサンプル数を指定
param_G2 <- 29                         #G2(T)群のサンプル数を指定

#必要なパッケージをロード
library(MLSeq)                         #パッケージの読み込み
library(S4Vectors)                     #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t")#in_fで指定したファイルの読み込み
data.cl <- c(rep("G1", param_G1), rep("G2", param_G2))#G1群を"G1"、G2群を"G2"としたベクトルdata.clを作成
class <- DataFrame(cond=factor(data.cl))#data.clをもとにしてDataFrameオブジェクトを作成
dim(data)                              #行数と列数を表示
class                                  #確認してるだけです(中身を表示)
	

以下の事柄は非常にマニアックですが、ドハマりしたので、備忘録的に書いておきます。 上記のdata.clオブジェクト作成部分に関する補足情報です。 クラスラベル情報の与え方次第で、Step 7の予測モデル構築のところでコケマス。 svmやrfのようなcaret-based classifiersを利用する場合に、特に気をつけてください。 voom-basedやdiscrete classifiersの場合は、様々なクラスラベルの指定法に対応してくれているようです。 以下にうまく動く例を示しておきます。

## やり方1
## Step 7で示した全てのアルゴリズムで正常に動作します。
## MLSeqのBeginner's guideのpage4と同じ記述法です。
data.cl <- c(rep("N", param_G1), rep("T", param_G2))

## やり方2
## Step 7で示した全てのアルゴリズムで正常に動作します。
## アルファベットが異なるだけです。Normal vs. Tumorだからといって、NTにする必要はありません。
data.cl <- c(rep("A", param_G1), rep("B", param_G2))

## やり方3
## Step 7で示した全てのアルゴリズムで正常に動作します。本項目の例題で使われている表記法です。
data.cl <- c(rep("G1", param_G1), rep("G2", param_G2))

## やり方4
## "svmRadial"や"rf"のようなcaret-based classifiersのときにエラーとなります。
data.cl <- c(rep("1", param_G1), rep("2", param_G2))

## やり方5
## Step 7で示した全てのアルゴリズムでエラーとなります。
data.cl <- c(rep(1, param_G1), rep(2, param_G2))
	

Step 2:分散の大きい上位100行分のデータのみ抽出するところまで。

元の入力データは714行分ありますが、分類を行う上で重要度の高いものから低いものまで様々です。 直感的には、行全体で分散(バラつき)が小さいものは分類問題への寄与が小さいと判断できます。 それゆえ、ここでは行ごとに分散の値を算出し、分散の大きい上位100行分のデータを利用するようにしています。 尚、行数はmicroRNAの種類数に相当します。しかし、実際には行数が遺伝子数だったり転写物数だったりと様々です。 それゆえ、バイオインフォの世界では、より一般的な表現としてfeature(フィーチャー;特徴)という言葉を用います。 そして、ここの作業は、特徴抽出(feature selection)と呼ばれるものに相当します。 入力データの段階でfeature数が100個程度しかないような場合には、ここのステップは行わないのではと思います。 遺伝子発現データのような、数万の遺伝子数(数万のfeature数)からなるデータを取り扱う場合には、 計算コスト削減を主目的としてfeature selectionを行います。 MLSeqのBeginner's guide 中の「3 Splitting the data」(page 5)の作業の一部に相当します。 ここまでの作業で、分散の大きい上位100行分のデータからなるdata.subというオブジェクトを得ています。

param_nfeat <- 100                     #利用するfeature数を指定

#前処理(利用するfeatureを抽出)
vars <- apply(data, 1, var, na.rm=T)   #feature(行)ごとに分散を計算
head(vars)                             #最初の6要素分を表示
vars.sorted <- sort(vars, decreasing=T)#分散の大きい順にソート
head(vars.sorted)                      #最初の6要素分を表示
features <- names(vars.sorted)[1:param_nfeat]#分散の大きい上位param_nfeat個のfeature ID情報を取得
head(features)                         #最初の6要素分を表示
data.sub <- data[features, ]           #featuresで指定した行名のみの発現データ情報を取得
dim(data.sub)                          #行数と列数を表示
	

Step 3:データセットの分割。

テストセット(30%)とトレーニングセットを分割。 58*0.3=17.4となるので、ceiling関数を使って切り上げています。 結果として、18サンプルをテストセットとして使うことになります。 sample関数実行時に非復元抽出を意味するreplace=Tとした理由は、同じサンプルを重複して抽出する事態を避けるためです。 set.seed関数内で指定している2128という数値に特に意味はありません(乱数発生時のタネ番号です)。 整数であれば何でもよいはずですが、ここではMLSeqと同じ乱数を発生させるために、同じタネ番号を指定しています。

「前処理(データの分割)」のところでは、データをトレーニングセット(training set)とテストセット(test set)に分割しています。 MLSeqのBeginner's guide 中の「3 Splitting the data」(page 4-5)では、トレーニングセットとして指定する割合のガイドラインを以下のように定めています:
  「ほとんどの場合は70%」、「トータルのサンプル数が200-500程度と十分多ければ、80 or 90%」、「サンプル数が少なければ50%」
  「サンプル数が十分多ければトレーニングセットが80-90%」というのは妥当です。 理由は、予測モデルを構築するのに十分なトレーニングセット内のサンプル数があり、 且つテストセットが10-20%しかなくともトータルのサンプル数が多いので、テストセットの総数もある程度稼げるからです。 「サンプル数が少なければ50%」というガイドラインから、このパッケージ開発者が 「テストセットで使うサンプル数をある程度確保するのは重要だ」という思想だと判断できます。 MLSeqのBeginner's guide の4-5ページ目にかけて、「トータル58サンプルのデータの場合は、トレーニングセットのサンプル数を90%にすることもあるかもしれない。」 と書いています。これはマニュアルにも書いているように、 「テストセットを用いた評価よりも、より高精度な予測モデルを構築することを重視」 することに相当します。58サンプルのうち、たった58*0.1 = 6サンプルだけしかテストセットとして用いられない場合は、 たった1サンプルの予測ミスが1/6 = 16.6667%分も予測精度に影響を及ぼすことになります。 それゆえ、テストセットの予測精度が悪かった場合、私の思考回路は以下のような感じになります:
  「それはたまたま運が悪かっただけ...かな トレーニングセット(検証セット含む)での精度はそれなりにあったから...まあしょうがないかな。 一応念のため、トレーニングセットのサンプル数を50-60%くらいに減らして、テストセットを増やしてみようかな。」

param_n.tes <- 0.3                     #テストセットの割合を指定

set.seed(2128)                         #おまじない(同じ乱数になるようにするため)
#前処理(テストセットとして用いる列番号情報取得)
n.tes <- ceiling(ncol(data)*param_n.tes)#テストセットとして用いるサンプル数情報を取得
n.tes                                  #確認してるだけです

ind <- sample(x=ncol(data), size=n.tes, replace=F)#非復元抽出で、テストセットとして用いるサンプルの列番号情報を取得
ind                                    #確認してるだけです

#前処理(データセットの分割)
tmp <- as.matrix(data.sub + 1)         #数値行列data.subの全ての要素に1を足し、matrix形式に変換したものをtmpに格納
data.tes <- tmp[, ind]                 #整数ベクトルindで指定した列の情報をテストセットdata.tesに格納
data.tra <- tmp[, -ind]                #整数ベクトルindで指定した列以外の情報をテストセットdata.traに格納
dim(data.tes)                          #行数と列数を表示
dim(data.tra)                          #行数と列数を表示
class.tes <- DataFrame(cond=class[ind, ])#テストセットのクラスラベル情報をclass.tesに格納
class.tra <- DataFrame(cond=class[-ind, ])#トレーニングセットのクラスラベル情報をclass.traに格納
dim(class.tes)                         #行数と列数を表示
dim(class.tra)                         #行数と列数を表示
	

Step 4:カウントデータとクラスラベル情報をDESeqDataSet形式のオブジェクトに変換。

トレーニングセットとテストセットの情報を、それぞれDESeqDataSetという形式のオブジェクトに格納しています。 DESeq2パッケージが提供している格納形式です。 このパッケージを読み込んだのち、DESeqDataSetFromMatrixという関数を用いてDESeqDataSetという形式のオブジェクトに変換しています。 ここまでで、MLSeqのBeginner's guide 中の「3 Splitting the data」(page 4-5あたり)が終了です。

#必要なパッケージをロード
library(DESeq2)                        #パッケージの読み込み

#前処理(DESeqDataSet形式に変換)
tes.s4 <- DESeqDataSetFromMatrix(      #DESeqDataSet形式に変換(テストセット)
               countData = data.tes,   #DESeqDataSet形式に変換(テストセット)
               colData = class.tes,    #DESeqDataSet形式に変換(テストセット)
               design = formula(~cond))#DESeqDataSet形式に変換(テストセット)
tra.s4 <- DESeqDataSetFromMatrix(      #DESeqDataSet形式に変換(トレーニングセット)
               countData = data.tra,   #DESeqDataSet形式に変換(トレーニングセット)
               colData = class.tra,    #DESeqDataSet形式に変換(トレーニングセット)
               design = formula(~cond))#DESeqDataSet形式に変換(トレーニングセット)
tes.s4                                 #確認してるだけです(中身を表示)
tra.s4                                 #確認してるだけです(中身を表示)
	

Step 5:利用可能な機械学習アルゴリズムを確認。

MLSeqのBeginner's guide 中の「4 Available machine-learning models」(page 5の下のほう)に相当する部分です。 ここでリストアップされているもののどれかを、この後で利用するclassify関数中のmethodオプションのところで指定します。 packageVersion関数実行結果として、MLSeqのバージョンが2.2.1となっているヒトは、 93個のアルゴリズムが利用可能であることがわかります。

availableMethods()                     #MLSeqパッケージ内で利用可能な機械学習アルゴリズム名を表示
packageVersion("MLSeq")                #確認してるだけです(中身を表示)
	

Step 6:データの正規化や変換と、用いる機械学習アルゴリズムの組み合わせについて正しく理解。

MLSeqのBeginner's guide のpage 6の「5 Normalization and transformation」に相当する部分です(page 10付近でも説明されています)。 作業は特になく、Step 5で決めたアルゴリズムによって、この後で利用するclassify関数中のオプションを うまく使い分けないといけないという話です。 例えば、preProcessingオプションは、入力データに対して「正規化(Normalization)と変換(Transformation)」を実行したい場合に利用します。 normalizeオプションは、入力データに対して「正規化(Normalization)」のみ実行したい場合に利用します。 具体的には、以下に示すように「正規化のみ行って、RNA-seqカウントデータに特化した機械学習アルゴリズムを利用したい場合」と 「正規化だけでなく変換まで行って、多くの一般的な機械学習アルゴリズムを利用したい場合」に大別してオプションを使い分けます。 後者の方で指定する一般的な機械学習アルゴリズムは、caret パッケージで利用できるものに相当します。これは、MLSeq が内部的にcaretを利用しているからです。 ここをよく理解してからStep 7に進みます。

6-1. RNA-seqカウントデータに特化した機械学習アルゴリズムを利用したい場合。

・normalizeオプション(以下の3つ):
  deseq, tmm, and none
  データ正規化までしか行わないのがポイントです。
・methodオプション(以下の6つ):
  最初の3つは、PLDA, PLDA2, and NBLDA
  discrete classifiersというカテゴリに属するものたちです。
  原著論文中では、algorithms which are based on discrete distributionsという表現もなされています。
  残りの3つは、voomDLDA, voomDQDA, and voomNSC
  voom-based classifiersというカテゴリに属するものたちです。
・controlオプション(以下の2つ):
  discrete classifiersを指定した場合は、discreteControlを使います。
  voom-based classifiersを指定した場合は、voomControlを使います。
    

6-2.一般的な機械学習アルゴリズムを利用したい場合。

・preProcessingオプション(以下の4つ):
  deseq-vst, deseq-rlog, deseq-logcpm, and tmm-logcpm
  データ正規化後に変換まで行うのがポイントです。
・methodオプション(沢山):
  knn, rf, svmLinear, glmboost, ctree, and so on.
  Step 5の「availableMethods()」実行結果として見られたもののうち、上記の6個以外の全て(のはず)です。
  caret-based classifiersとかmicroarray-based classifiersというカテゴリに属するものたちです。
・controlオプション(以下の1つのみ):
  trainControl
    

Step 7:予測モデル(分類器)の構築。

MLSeqのBeginner's guide 中の「6 Model building」(page 7)に相当する部分です。classify関数の実行結果として得られるfitというオブジェクトには、 最適な予測モデル(optimal model)やトレーニングセットに対する性能評価結果が含まれています。 いくつか例示します。多くのアルゴリズムは原著論文が存在しますので適切に引用してください。 下記コードで、classify関数実行時に与えているrefオプションは、 どのクラスラベルがつけられた群をリファレンスとして利用するかを宣言するものです。 このデータの場合は正常サンプル群と癌サンプル群のどちらをリファレンスとして利用するかに相当します。 マニュアルのpage 7では"T"となっていますので、 ここではそれに対応した"G2"をparam_refオブジェクトとして与えています。 refオプションのデフォルトはNULLです。結果として最初に出現するラベル情報である"N"(本項では"G1")とはせずに わざわざ"T"(本項では"G2")ととした開発者の意図は不明です。 また、e1071パッケージのロードも行っています。 これは、MLSeqのBeginner's guide 中には明記されていませんでしたが、実行時にこのパッケージが必要だと言われたのでつけています。
 

7-1. RNA-seqカウントデータに特化した機械学習アルゴリズムを利用したい場合。
  voom-based classifierの1つである、voom-based Nearest Shrunken Centroids (voomNSC)、 およびdeseq正規化を採用する例です。入力データにはtra.s4を与えています。 controlオプションでは、voomControl関数で定義したオプションを指定しているのがわかります。 詳細についてはMLSeqのReference Manual 中のvoomControlの解説ページに書かれています。tuneLengthオプションのデフォルトは10ですが、 ここでは探索されるチューニングパラメータの総数(total number of tuning parameter to be searched) を20にしているようです。

param_method <- "voomNSC"              #アルゴリズムを指定
param_normalize <- "deseq"             #正規化法を指定
param_ref <- "G2"                      #リファレンスとして用いるクラスラベル情報を指定

#必要なパッケージをロード
library(e1071)                         #パッケージの読み込み

#本番(モデル構築)
set.seed(2128)                         #おまじない(同じ乱数になるようにするため)
ctrl <- voomControl(tuneLength=20)     #voomControl関数を用いて専用のオプションを定義
fit <- classify(                       #classify関数を用いて予測モデルを構築
           data = tra.s4,              #classify関数を用いて予測モデルを構築
           method = param_method,      #classify関数を用いて予測モデルを構築
           normalize = param_normalize,#classify関数を用いて予測モデルを構築
           ref = param_ref,            #classify関数を用いて予測モデルを構築
           control = ctrl)             #classify関数を用いて予測モデルを構築
fit                                    #fitの中身を表示
	

実行結果であるfitは、MLSeqという形式のクラスオブジェクトです。 fit実行結果として、「機械学習アルゴリズムとしてvoomNSCが使われていること、 Accuracyは97.5%、Sensitivityは94.12%、Specificityは100%、Reference ClassはG2」 が表示されていることがわかります。

str(fit)をやると一気に大量の情報が表示されるのでわかりますが、fitが保有する情報は実際にはもっと沢山あります。 例えば、trained(fit)を実行すると、fitオブジェクト内のtrainedModelというスロットに格納されている情報が表示されます。 fitは計100 features×40samplesからなるトレーニングセットから、2つのクラス("G1" or "G2")のどちらに属するかを決めるために構築された予測モデルです。 「threshold, NonZeroFeat., Accuracy」という情報と、20行分の数値が見えます。 これがclassify関数中のcontrolオプションのところで指定したtuneLength=20の値に対応します。 最もよいAccuracy(=0.9750)が得られたthresholdは2.71944であり、そのときに用いられたfeature数は2であることもわかります。 MLSeqの原著論文(Goksuluk et al., 2019)や MLSeqのBeginner's guide のpage 7にも書かれていますが、ここで指定したアルゴリズム(voomNSC)は、 入力情報中の100 features全てを使うわけではありません(voomNSC is sparse and uses a subset of features for classification)。 この中から分類に寄与する少数のfeaturesを抽出しています。 今回の結果では、「100個中2個を使ったときに最も高いAccuracyが得られた」と解釈します。 このあたりの議論が、MLSeqの原著論文(Goksuluk et al., 2019) のTable 3に記載されている、voomNSCのSparsity = 0.022の結果と対応します。

fit                                    #fitの中身を表示
show(fit)                              #直前のコマンドと同じ結果が得られる
trained(fit)                           #fitオブジェクト内のtrainedModelというスロットに格納されている情報を表示
fit@modelInfo@trainedModel             #直前のコマンドと同じ結果が得られる
fit.voomNSC <- fit                     #fitオブジェクトののコピーを作成
	

上記trained(fit)でみられるthreshold(横軸)とAccuracy(縦軸)のプロットは以下で得られます。 プロットの数はtuneLength=20で指定した数と対応します。 MLSeqのBeginner's guide のpage 9のFigure 1に相当します。

plot(fit)                              #thresholdとaccuracyのプロットを表示
	


 

7-2. RNA-seqカウントデータに特化した機械学習アルゴリズムを利用したい場合。
  voom-based classifierの1つである、voom-based diagonal linear discriminant analysis (voomDLDA)、 およびdeseq正規化を採用する例です。

param_method <- "voomDLDA"             #アルゴリズムを指定
param_normalize <- "deseq"             #正規化法を指定
param_ref <- "G2"                      #リファレンスとして用いるクラスラベル情報を指定

#必要なパッケージをロード
library(e1071)                         #パッケージの読み込み

#本番(モデル構築)
set.seed(2128)                         #おまじない(同じ乱数になるようにするため)
ctrl <- voomControl(tuneLength=20)     #voomControl関数を用いて専用のオプションを定義
fit <- classify(                       #classify関数を用いて予測モデルを構築
           data = tra.s4,              #classify関数を用いて予測モデルを構築
           method = param_method,      #classify関数を用いて予測モデルを構築
           normalize = param_normalize,#classify関数を用いて予測モデルを構築
           ref = param_ref,            #classify関数を用いて予測モデルを構築
           control = ctrl)             #classify関数を用いて予測モデルを構築
fit                                    #fitの中身を表示
	

fit実行結果として、「機械学習アルゴリズムとしてvoomDLDAが使われていること、 Accuracyは92.68%、Sensitivityは94.12%、Specificityは91.67%、Reference ClassはG2」が表示されていることがわかります。

7-1で行ったvoomNSCの結果とは、 上記のパフォーマンスの違いだけでなく「trained(fit)」の実行結果の見栄えも異なります。 MLSeqの原著論文(Goksuluk et al., 2019)や MLSeqのBeginner's guide のpage 7にも書かれていますが、ここで指定したアルゴリズム(voomDLDA)は、 入力情報中の100 features全てを使います(VoomDLDA and voomDQDA approaches are non-sparse and use all features to classify the data)。したがって、実質的にtuneLength=20というオプションは機能していないのだろう、ということが予想されます。 fitオブジェクト中で見られるAccuracy=92.68%と、trained(fit)実行結果として見られるAccuracy=93.75%に違いが見られます。 原著論文著者に問い合わせたところ、The accuracy, in fit object, is calculated with the confusion matrix of train dataset. However, the second one is calculated by the rounded averages of counts in each cross-validation fold. Actually, you can use any of them. とのことでした(Thanks to Dr. Zararsiz and Dr. GÖKSÜLÜK)。

fit                                    #fitの中身を表示
show(fit)                              #直前のコマンドと同じ結果が得られる
trained(fit)                           #fitオブジェクト内のtrainedModelというスロットに格納されている情報を表示
fit@modelInfo@trainedModel             #直前のコマンドと同じ結果が得られる
fit.voomDLDA <- fit                    #fitオブジェクトののコピーを作成
	

上記trained(fit)実行結果中にも「There is no tuning parameter for selected method.」とあることから予想できますが、 下記plot(fit)を実行しても何も表示されません。 MLSeqのBeginner's guide のpage 9のFigure 1に相当します。

plot(fit)                              #thresholdとaccuracyのプロットを表示(されない)
	


 

7-3. RNA-seqカウントデータに特化した機械学習アルゴリズムを利用したい場合。
  discrete classifierの1つである、negative binomial linear discriminant analysis (NBLDA)、 およびdeseq正規化を採用する例です。 controlオプションではdiscreteControlを指定しているのがわかります。 discreteControl内で与えているtuneLength=10は、 10通りのグリッドサーチを行ってパラメータチューニングを行えという指令です。 number=5は、トレーニングセットの40サンプルのデータを5分割せよという命令です。 1分割あたり40/5 = 8サンプルからなるサブセットが得られますので、 それをさらに8サンプルからなるテストセットと32サンプルからなるトレーニングセットにわけています。 「32サンプルからなるトレーニングセットで予測モデルを構築し、8サンプルからなるテストセットで性能評価を行うという作業」を repeats=9で指定した回数繰り返しているようなイメージでよいです。このあたりはマニュアルでも丁寧には書かれていません。 repeatsやtuneLengthで指定する数値を大きくするほど時間がかかるようなイメージです。

param_method <- "NBLDA"                #アルゴリズムを指定
param_normalize <- "deseq"             #正規化法を指定
param_ref <- "G2"                      #リファレンスとして用いるクラスラベル情報を指定

#必要なパッケージをロード
library(e1071)                         #パッケージの読み込み

#本番(モデル構築)
set.seed(2128)                         #おまじない(同じ乱数になるようにするため)
ctrl <- discreteControl(               #discreteControl関数を用いて専用のオプションを定義
           tuneLength=10,              #discreteControl関数を用いて専用のオプションを定義
           number=5,                   #discreteControl関数を用いて専用のオプションを定義
           repeats=9)                  #discreteControl関数を用いて専用のオプションを定義
fit <- classify(                       #classify関数を用いて予測モデルを構築
           data = tra.s4,              #classify関数を用いて予測モデルを構築
           method = param_method,      #classify関数を用いて予測モデルを構築
           normalize = param_normalize,#classify関数を用いて予測モデルを構築
           ref = param_ref,            #classify関数を用いて予測モデルを構築
           control = ctrl)             #classify関数を用いて予測モデルを構築
fit                                    #fitの中身を表示
	

fit実行結果として、「機械学習アルゴリズムとしてNBLDAが使われていること、 Accuracyは92.5%、Sensitivityは94.12%、Specificityは91.3%、Reference ClassはG2」が表示されていることがわかります。

上記のパフォーマンスは、repeatsで指定する数値次第でコロコロ変わるようです (実際、MLSeqのReference Manual中の page 7あたりでNumber of repeats (repeats) might change model accuracies.という記述もあります。)。 MLSeqの原著論文(Goksuluk et al., 2019) のTable 3に記載されている、NBLDAのSparsityの値がないこと、 そしてtrained(fit)実行結果で確信(There is no tuning parameter for selected method.という記載)できるように、 tuneLength=10は機能していないのだろうと判断できます。

fit                                    #fitの中身を表示
show(fit)                              #直前のコマンドと同じ結果が得られる
trained(fit)                           #fitオブジェクト内のtrainedModelというスロットに格納されている情報を表示
fit@modelInfo@trainedModel             #直前のコマンドと同じ結果が得られる
fit.NBLDA <- fit                       #fitオブジェクトののコピーを作成
	

上記trained(fit)実行結果中にも「There is no tuning parameter for selected method.」とあることから予想できますが、 下記plot(fit)を実行しても何も表示されません。 MLSeqのBeginner's guide のpage 9のFigure 1に相当します。

plot(fit)                              #thresholdとaccuracyのプロットを表示(されない)
	


 

7-4. 一般的な機械学習アルゴリズムを利用したい場合。
  caret-based classifierの1つである、Support Vector Machineおよび deseq-vst前処理(deseq正規化とvst変換)を採用する例です。 ここでは、データに関する事前知識がない場合によく用いられる、 ラジアル基底関数(Radial basis function; RBF)と呼ばれるカーネル (svmRadial) を用いてSVMを実行します。 また、preProcessingオプションに変更されているので注意してください。 controlオプションでは、trainControl関数で定義したオプションを指定しているのがわかります。 このtrainControl自体は、caretパッケージで提供されているものです。 classProbsオプションのデフォルトはFalseなようですが、ここではTrueにしています。 classProbs=Tとした根拠は、 MLSeqのBeginner's guide のpage 7でsvmRadialの実行例がそうなっていたからです。 trainControl関数実行時に、「`repeats` has no meaning for this resampling method.」という警告が出ていることから、 repeatsオプションの数値(ここでは3)を変更しても結果が不変であることが予想されます(実際そうなります)。 tuneLength=7は、SVM実行時に指定するハイパーパラメータである 「誤分類をどの程度許容するかというコストパラメータC」の数値を7通り探索せよという指定です。 注意点としては、classify関数内のオプションとして直接tuneLength=7を与えています。 これは、例題7-1や7-2ではvoomControl関数内にtuneLengthの値を指定していたので、同様にtrainControl関数内に与えたらエラーになったからです。 MLSeqのBeginner's guide のpage 8でも、classify関数内のオプションとして直接tuneLengthを指定しているので、おそらくこれでよいと思います。

param_method <- "svmRadial"            #アルゴリズムを指定
param_preprocess <- "deseq-vst"        #前処理法を指定
param_ref <- "G2"                      #リファレンスとして用いるクラスラベル情報を指定

#必要なパッケージをロード
library(kernlab)                       #パッケージの読み込み

#本番(モデル構築)
set.seed(2128)                         #おまじない(同じ乱数になるようにするため)
ctrl <- trainControl(number=2,         #trainControl関数を用いて専用のオプションを定義
            repeats=3,                 #trainControl関数を用いて専用のオプションを定義
            classProbs=T)              #trainControl関数を用いて専用のオプションを定義
fit <- classify(                       #classify関数を用いて予測モデルを構築
           data = tra.s4,              #classify関数を用いて予測モデルを構築
           method = param_method,      #classify関数を用いて予測モデルを構築
           preProcessing = param_preprocess,#classify関数を用いて予測モデルを構築
           ref = param_ref,            #classify関数を用いて予測モデルを構築
           tuneLength=7,               #classify関数を用いて予測モデルを構築
           control = ctrl)             #classify関数を用いて予測モデルを構築
fit                                    #fitの中身を表示
	

fit実行結果として、「機械学習アルゴリズムとしてsvmRadialが使われていること、 Accuracyは100%、Sensitivityは100%、Specificityは100%、Reference ClassはG2」 が表示されていることがわかります。 MLSeqの原著論文(Goksuluk et al., 2019) のTable 3に記載されている、SVMのSparsityの値がないことから、 このアルゴリズムは、7-1で用いたようなsparse classifierのカテゴリに属するものではないことがわかります。 また、trained(fit)実行結果から「Resampling: Bootstrapped (2 reps) 」という記述を発見できます。 このことから、この2という数値は、trainControl関数中のnumber=2に対応するものだろうと予想できます。 さらに、「Resampling results across tuning parameters:」という記述から、numberオプションで指定する数値がブートストラップのリサンプリング回数 に対応するのだろうと予想できます。この数値を変えることで、Accuracyが変わるのだろうと予想できます。 今回の結果では「sigma = 0.006054987 and C = 0.5」のパラメータを採用したときに最もよいAccuracy = 0.9198718が得られたと解釈します。

fit                                    #fitの中身を表示
show(fit)                              #直前のコマンドと同じ結果が得られる
trained(fit)                           #fitオブジェクト内のtrainedModelというスロットに格納されている情報を表示
fit@modelInfo@trainedModel             #直前のコマンドと同じ結果が得られる
fit.svmRadial <- fit                   #fitオブジェクトののコピーを作成
	

上記trained(fit)でみられるコストパラメータC(横軸)とAccuracy(縦軸)のプロットは以下で得られます。 プロットの数はtuneLength=7で指定した数と対応します。 MLSeqのBeginner's guide のpage 9のFigure 1に相当します。

plot(fit)                              #thresholdとaccuracyのプロットを表示
	


 

7-5. 一般的な機械学習アルゴリズムを利用したい場合。
  caret-based classifierの1つである、Random Forest (method = "rf")、 およびdeseq-vst前処理(deseq正規化とvst変換)を採用する例です。 7-4.で行ったSVMのときとの違いは見た目上ほとんどありませんが、 trainControl関数実行時に、method = "repeatedcv"を明記している点が異なります。 7-4.では明記せずとも正常に動作しましたが、本例題のRandom Forest (rf) 実行時のみ?!、試行錯誤の末、明示する必要があることを見い出しました。 MLSeqのReference Manual 中のpage 7においてRFの実行例は確かにそうなっていました。 MLSeqのBeginner's guide のpage 7でも、確かにSVM実行時にmethod = "repeatedcv"を明記してあります。 しかし、7-4.でも示してある通り、明記せずとも正常に動作していたので、rf 実行時のエラー解決に苦労したというオチです。

param_method <- "rf"                   #アルゴリズムを指定
param_preprocess <- "deseq-vst"        #前処理法を指定
param_ref <- "G2"                      #リファレンスとして用いるクラスラベル情報を指定

#必要なパッケージをロード
library(randomForest)                  #パッケージの読み込み

#本番(モデル構築)
set.seed(2128)                         #おまじない(同じ乱数になるようにするため)
ctrl <- trainControl(                  #trainControl関数を用いて専用のオプションを定義
               method = "repeatedcv",  #trainControl関数を用いて専用のオプションを定義
               number=5,               #trainControl関数を用いて専用のオプションを定義
               repeats=3,               #trainControl関数を用いて専用のオプションを定義
               classProbs=T)           #trainControl関数を用いて専用のオプションを定義
fit <- classify(                       #classify関数を用いて予測モデルを構築
           data = tra.s4,              #classify関数を用いて予測モデルを構築
           method = param_method,      #classify関数を用いて予測モデルを構築
           preProcessing = param_preprocess,#classify関数を用いて予測モデルを構築
           ref = param_ref,            #classify関数を用いて予測モデルを構築
           tuneLength=7,               #classify関数を用いて予測モデルを構築
           control = ctrl)             #classify関数を用いて予測モデルを構築
fit                                    #fitの中身を表示
	

fit実行結果として、「機械学習アルゴリズムとしてrfが使われていること、 Accuracyは95%、Sensitivityは88.24%、Specificityは100%、Reference ClassはG2」 が表示されていることがわかります。 また、trained(fit)実行結果から「Resampling: Cross-Validated (5 fold, repeated 3 times)」 という記述を発見できます。 このことから、この5という数値はtrainControl関数中のnumber=5 に、そして3という数値はrepeats=3 に対応するものだろうと予想できます。 さらに、「Resampling results across tuning parameters:」という記述から、numberとrepeatsオプションで指定する数値を変えることで、 Accuracyが変わるのだろうと予想できます。 今回の結果では「mtry = 18」を採用したときに最もよいAccuracy = 0.9435185が得られたと解釈します。

fit                                    #fitの中身を表示
show(fit)                              #直前のコマンドと同じ結果が得られる
trained(fit)                           #fitオブジェクト内のtrainedModelというスロットに格納されている情報を表示
fit@modelInfo@trainedModel             #直前のコマンドと同じ結果が得られる
fit.rf <- fit                          #fitオブジェクトののコピーを作成
	

上記trained(fit)でみられる#Randomly Selected Predictors(横軸)とAccuracy(縦軸)のプロットは以下で得られます。 プロットの数はtuneLength=7で指定した数と対応します。 横軸が18のときに縦軸のAccuracyが最大になっていることから、mtryが#Randomly Selected Predictorsに相当するのだろうと解釈できます。 ここまでで得られた情報から、「Step 2のparam_nfeatで指定した100 featuresの中から ランダムに2, 18, 34, 51, 67, 83, 100個の計7通り抽出して分類を試し、 結果としてランダムに18個を抽出して分類に用いた結果が最もよくAccuracy = 0.9435185であった」と 解釈すればよいのだろうと断定できます(推測のみで確たる証拠はなし)。 MLSeqのBeginner's guide のpage 9のFigure 1に相当します。

plot(fit)                              #thresholdとaccuracyのプロットを表示
	

Step 8:テストセットの予測、および予測精度評価。

MLSeqのBeginner's guide 中の「7 Predicting the class labels of test samples」(page 11)に相当する部分です。 Step 7で構築した予測モデル(分類器)を用いて、Step 4で作成しておいた18サンプルからなるテストセット(tes.s4オブジェクト)の予測を実行します。 このテストセットは、Step 1でG1とラベルした6個のNormalサンプル、 およびG2とラベルした12個のTumorサンプルから構成されていることがわかります。 本当はどのサンプルがどの群に属するかわかっているが、それを知らないものとして予測してみるとどうなるかを調べようとしているのです。

tes.s4                                 #テストセットの中身を表示
colnames(tes.s4)                       #テストセット中のサンプル名を表示
	


 

以下ではStep7の例題番号と対応させて、構築した予測モデルで予測を行っています。
 

8-1. 7-1.で構築した予測モデル(fit.voomNSC)を利用する場合。
  outオブジェクトが予測結果です。colnames(input)で示されたサンプル名の順番で、予測結果が示されています。

fit <- fit.voomNSC                     #予測モデルをfitという名前で取り扱う
input <- tes.s4                        #入力データをinputという名前で取り扱う
out <- predict(object=fit, test.data=input)#predict関数を用いてfitでinputを予測した結果をoutに格納
out                                    #outの中身を表示
colnames(input)                        #テストセット中のサンプル名を表示
rownames(colData(input))               #テストセット中のサンプル名を表示(表現法を変えているだけ)
	

実際には、サンプル名情報は本質的ではなく、サンプルに付随するラベル情報のほうが重要です。 それがcolData(input)$condに相当します。予測結果outと見比べて、異なっているものが予測ミスに相当します。 この場合は、計18サンプル中13サンプルの予測に成功していると判断します。

out                                    #outの中身を表示
class.tes$cond                         #テストセット中の真のラベル情報を表示(class.tesはStep 3で作成済み)
colData(input)$cond                    #テストセット中の真のラベル情報を表示
colData(input)$cond == out             #うまく当てられたらTRUE、そうでなければFALSE
sum(colData(input)$cond == out)        #TRUEの要素数
length(out)                            #評価したサンプル数
	

outオブジェクトをみれば分かりますが、Levelsに相当するラベル情報の順番、 特に一番最初に現れるものが"G1"になっています。 Step 7では、リファレンスとして用いるクラスラベル情報を"G2"として実行していました。 ここでもこれをリファレンス(基準)として利用すべく変更すべくrelevel関数を用いて"G2"に変更します。 なんでこれをわざわざやる必要があるのかは、私もいまだによくわかりません。 ここは、MLSeqのBeginner's guide のpage 12の上のほうの作業に相当します。

param_ref <- "G2"                      #リファレンスとして用いるクラスラベル情報を指定
out                                    #outの中身を表示
out <- relevel(out, ref=param_ref)     #relevel関数を用いてparam_refで指定したクラスラベルを基準とするように変更
out                                    #outの中身を表示

colData(input)$cond                    #テストセット中の真のラベル情報を表示
actual <- relevel(colData(input)$cond, ref=param_ref)#relevel関数を用いてparam_refで指定したクラスラベルを基準とするように変更
actual                                 #actualの中身を表示
	

予測結果outと実際のラベル情報actualを用いて混同行列(confusion matrix)を作成します。 まず、table関数を用いて2×2の分割表(contingency table)を作成したのち、 それを入力としてconfusionMatrix関数を用いて混同行列を作成します。 分割表と混同行列は、見かけ上は同じです。しかし、 正式な混同行列の形式にすることによって、AccuracyやSpecificityなどの値が計算できるのです。 「str(output)」としてoutputの中の構造(structure)を事前に眺めていたので、 output$tableやoutput$overallやoutput$byClassで情報抽出ができることを事前に学んでいます。 fit.voomNSCのAccuracyは0.722であることがわかります。

tbl <- table(Predicted=out, Actual=actual)#table関数を用いて2×2の分割表を作成
output <- confusionMatrix(data=tbl, positive=param_ref)#confusionMatrix関数を用いて混同行列や各種統計情報を計算
output                                 #中身を表示
output$table                           #table部分のみ表示
output$overall                         #outputオブジェクト中のoverallという部分に格納されている情報のみ表示
output$byClass                         #outputオブジェクト中のbyClassという部分に格納されている情報のみ表示
output$overall["Accuracy"]             #各種統計情報部分の中からAccuracyのみ表示
output$overall["Kappa"]                #各種統計情報部分の中からKappaのみ表示
output$byClass["Sensitivity"]          #byClassという部分の中からSensitivityのみ表示
output.voomNSC  <- output              #outputの中身をコピー
	


 

8-2. 7-2.で構築した予測モデル(fit.voomDLDA)を利用する場合。
  outオブジェクトが予測結果です。colnames(input)で示されたサンプル名の順番で、予測結果が示されています。

fit <- fit.voomDLDA                    #予測モデルをfitという名前で取り扱う
input <- tes.s4                        #入力データをinputという名前で取り扱う
out <- predict(object=fit, test.data=input)#predict関数を用いてfitでinputを予測した結果をoutに格納
out                                    #outの中身を表示
colnames(input)                        #テストセット中のサンプル名を表示
rownames(colData(input))               #テストセット中のサンプル名を表示(表現法を変えているだけ)
	

実際には、サンプル名情報は本質的ではなく、サンプルに付随するラベル情報のほうが重要です。 それがcolData(input)$condに相当します。予測結果outと見比べて、異なっているものが予測ミスに相当します。 この場合は、計18サンプル中13サンプルの予測に成功していると判断します。

out                                    #outの中身を表示
class.tes$cond                         #テストセット中の真のラベル情報を表示(class.tesはStep 3で作成済み)
colData(input)$cond                    #テストセット中の真のラベル情報を表示
colData(input)$cond == out             #うまく当てられたらTRUE、そうでなければFALSE
sum(colData(input)$cond == out)        #TRUEの要素数
length(out)                            #評価したサンプル数
	

outオブジェクトをみれば分かりますが、Levelsに相当するラベル情報の順番、 特に一番最初に現れるものが"G1"になっています。 Step 7では、リファレンスとして用いるクラスラベル情報を"G2"として実行していました。 ここでもこれをリファレンス(基準)として利用すべく変更すべくrelevel関数を用いて"G2"に変更します。 なんでこれをわざわざやる必要があるのかは、私もいまだによくわかりません。 ここは、MLSeqのBeginner's guide のpage 12の上のほうの作業に相当します。

param_ref <- "G2"                      #リファレンスとして用いるクラスラベル情報を指定
out                                    #outの中身を表示
out <- relevel(out, ref=param_ref)     #relevel関数を用いてparam_refで指定したクラスラベルを基準とするように変更
out                                    #outの中身を表示

colData(input)$cond                    #テストセット中の真のラベル情報を表示
actual <- relevel(colData(input)$cond, ref=param_ref)#relevel関数を用いてparam_refで指定したクラスラベルを基準とするように変更
actual                                 #actualの中身を表示
	

予測結果outと実際のラベル情報actualを用いて混同行列(confusion matrix)を作成します。 まず、table関数を用いて2×2の分割表(contingency table)を作成したのち、 それを入力としてconfusionMatrix関数を用いて混同行列を作成します。 分割表と混同行列は、見かけ上は同じです。しかし、 正式な混同行列の形式にすることによって、AccuracyやSpecificityなどの値が計算できるのです。 「str(output)」としてoutputの中の構造(structure)を事前に眺めていたので、 output$tableやoutput$overallやoutput$byClassで情報抽出ができることを事前に学んでいます。 fit.voomDLDAのAccuracyは0.889であることがわかります。

tbl <- table(Predicted=out, Actual=actual)#table関数を用いて2×2の分割表を作成
output <- confusionMatrix(data=tbl, positive=param_ref)#confusionMatrix関数を用いて混同行列や各種統計情報を計算
output                                 #中身を表示
output$table                           #table部分のみ表示
output$overall                         #outputオブジェクト中のoverallという部分に格納されている情報のみ表示
output$byClass                         #outputオブジェクト中のbyClassという部分に格納されている情報のみ表示
output$overall["Accuracy"]             #各種統計情報部分の中からAccuracyのみ表示
output$overall["Kappa"]                #各種統計情報部分の中からKappaのみ表示
output$byClass["Sensitivity"]          #byClassという部分の中からSensitivityのみ表示
output.voomDLDA  <- output             #outputの中身をコピー
	


 

8-3. 7-3.で構築した予測モデル(fit.NBLDA)を利用する場合。
  outオブジェクトが予測結果です。colnames(input)で示されたサンプル名の順番で、予測結果が示されています。

fit <- fit.NBLDA                       #予測モデルをfitという名前で取り扱う
input <- tes.s4                        #入力データをinputという名前で取り扱う
out <- predict(object=fit, test.data=input)#predict関数を用いてfitでinputを予測した結果をoutに格納
out                                    #outの中身を表示
colnames(input)                        #テストセット中のサンプル名を表示
rownames(colData(input))               #テストセット中のサンプル名を表示(表現法を変えているだけ)
	

実際には、サンプル名情報は本質的ではなく、サンプルに付随するラベル情報のほうが重要です。 それがcolData(input)$condに相当します。予測結果outと見比べて、異なっているものが予測ミスに相当します。 この場合は、計18サンプル中13サンプルの予測に成功していると判断します。

out                                    #outの中身を表示
class.tes$cond                         #テストセット中の真のラベル情報を表示(class.tesはStep 3で作成済み)
colData(input)$cond                    #テストセット中の真のラベル情報を表示
colData(input)$cond == out             #うまく当てられたらTRUE、そうでなければFALSE
sum(colData(input)$cond == out)        #TRUEの要素数
length(out)                            #評価したサンプル数
	

outオブジェクトをみれば分かりますが、Levelsに相当するラベル情報の順番、 特に一番最初に現れるものが"G1"になっています。 Step 7では、リファレンスとして用いるクラスラベル情報を"G2"として実行していました。 ここでもこれをリファレンス(基準)として利用すべく変更すべくrelevel関数を用いて"G2"に変更します。 なんでこれをわざわざやる必要があるのかは、私もいまだによくわかりません。 ここは、MLSeqのBeginner's guide のpage 12の上のほうの作業に相当します。

param_ref <- "G2"                      #リファレンスとして用いるクラスラベル情報を指定
out                                    #outの中身を表示
out <- relevel(out, ref=param_ref)     #relevel関数を用いてparam_refで指定したクラスラベルを基準とするように変更
out                                    #outの中身を表示

colData(input)$cond                    #テストセット中の真のラベル情報を表示
actual <- relevel(colData(input)$cond, ref=param_ref)#relevel関数を用いてparam_refで指定したクラスラベルを基準とするように変更
actual                                 #actualの中身を表示
	

予測結果outと実際のラベル情報actualを用いて混同行列(confusion matrix)を作成します。 まず、table関数を用いて2×2の分割表(contingency table)を作成したのち、 それを入力としてconfusionMatrix関数を用いて混同行列を作成します。 分割表と混同行列は、見かけ上は同じです。しかし、 正式な混同行列の形式にすることによって、AccuracyやSpecificityなどの値が計算できるのです。 「str(output)」としてoutputの中の構造(structure)を事前に眺めていたので、 output$tableやoutput$overallやoutput$byClassで情報抽出ができることを事前に学んでいます。 fit.NBLDAのAccuracyは0.833であることがわかります。

tbl <- table(Predicted=out, Actual=actual)#table関数を用いて2×2の分割表を作成
output <- confusionMatrix(data=tbl, positive=param_ref)#confusionMatrix関数を用いて混同行列や各種統計情報を計算
output                                 #中身を表示
output$table                           #table部分のみ表示
output$overall                         #outputオブジェクト中のoverallという部分に格納されている情報のみ表示
output$byClass                         #outputオブジェクト中のbyClassという部分に格納されている情報のみ表示
output$overall["Accuracy"]             #各種統計情報部分の中からAccuracyのみ表示
output$overall["Kappa"]                #各種統計情報部分の中からKappaのみ表示
output$byClass["Sensitivity"]          #byClassという部分の中からSensitivityのみ表示
output.NBLDA  <- output                #outputの中身をコピー
	


 

8-4. 7-4.で構築した予測モデル(fit.svmRadial)を利用する場合。
  outオブジェクトが予測結果です。colnames(input)で示されたサンプル名の順番で、予測結果が示されています。

fit <- fit.svmRadial                   #予測モデルをfitという名前で取り扱う
input <- tes.s4                        #入力データをinputという名前で取り扱う
out <- predict(object=fit, test.data=input)#predict関数を用いてfitでinputを予測した結果をoutに格納
out                                    #outの中身を表示
colnames(input)                        #テストセット中のサンプル名を表示
rownames(colData(input))               #テストセット中のサンプル名を表示(表現法を変えているだけ)
	

実際には、サンプル名情報は本質的ではなく、サンプルに付随するラベル情報のほうが重要です。 それがcolData(input)$condに相当します。予測結果outと見比べて、異なっているものが予測ミスに相当します。 この場合は、計18サンプル中13サンプルの予測に成功していると判断します。

out                                    #outの中身を表示
class.tes$cond                         #テストセット中の真のラベル情報を表示(class.tesはStep 3で作成済み)
colData(input)$cond                    #テストセット中の真のラベル情報を表示
colData(input)$cond == out             #うまく当てられたらTRUE、そうでなければFALSE
sum(colData(input)$cond == out)        #TRUEの要素数
length(out)                            #評価したサンプル数
	

outオブジェクトをみれば分かりますが、Levelsに相当するラベル情報の順番、 特に一番最初に現れるものが"G1"になっています。 Step 7では、リファレンスとして用いるクラスラベル情報を"G2"として実行していました。 ここでもこれをリファレンス(基準)として利用すべく変更すべくrelevel関数を用いて"G2"に変更します。 なんでこれをわざわざやる必要があるのかは、私もいまだによくわかりません。 ここは、MLSeqのBeginner's guide のpage 12の上のほうの作業に相当します。

param_ref <- "G2"                      #リファレンスとして用いるクラスラベル情報を指定
out                                    #outの中身を表示
out <- relevel(out, ref=param_ref)     #relevel関数を用いてparam_refで指定したクラスラベルを基準とするように変更
out                                    #outの中身を表示

colData(input)$cond                    #テストセット中の真のラベル情報を表示
actual <- relevel(colData(input)$cond, ref=param_ref)#relevel関数を用いてparam_refで指定したクラスラベルを基準とするように変更
actual                                 #actualの中身を表示
	

予測結果outと実際のラベル情報actualを用いて混同行列(confusion matrix)を作成します。 まず、table関数を用いて2×2の分割表(contingency table)を作成したのち、 それを入力としてconfusionMatrix関数を用いて混同行列を作成します。 分割表と混同行列は、見かけ上は同じです。しかし、 正式な混同行列の形式にすることによって、AccuracyやSpecificityなどの値が計算できるのです。 「str(output)」としてoutputの中の構造(structure)を事前に眺めていたので、 output$tableやoutput$overallやoutput$byClassで情報抽出ができることを事前に学んでいます。 fit.svmRadialのAccuracyは0.944であることがわかります。

tbl <- table(Predicted=out, Actual=actual)#table関数を用いて2×2の分割表を作成
output <- confusionMatrix(data=tbl, positive=param_ref)#confusionMatrix関数を用いて混同行列や各種統計情報を計算
output                                 #中身を表示
output$table                           #table部分のみ表示
output$overall                         #outputオブジェクト中のoverallという部分に格納されている情報のみ表示
output$byClass                         #outputオブジェクト中のbyClassという部分に格納されている情報のみ表示
output$overall["Accuracy"]             #各種統計情報部分の中からAccuracyのみ表示
output$overall["Kappa"]                #各種統計情報部分の中からKappaのみ表示
output$byClass["Sensitivity"]          #byClassという部分の中からSensitivityのみ表示
output.svmRadial  <- output            #outputの中身をコピー
	


 

8-5. 7-5.で構築した予測モデル(fit.rf)を利用する場合。
  outオブジェクトが予測結果です。colnames(input)で示されたサンプル名の順番で、予測結果が示されています。

fit <- fit.rf                          #予測モデルをfitという名前で取り扱う
input <- tes.s4                        #入力データをinputという名前で取り扱う
out <- predict(object=fit, test.data=input)#predict関数を用いてfitでinputを予測した結果をoutに格納
out                                    #outの中身を表示
colnames(input)                        #テストセット中のサンプル名を表示
rownames(colData(input))               #テストセット中のサンプル名を表示(表現法を変えているだけ)
	

実際には、サンプル名情報は本質的ではなく、サンプルに付随するラベル情報のほうが重要です。 それがcolData(input)$condに相当します。予測結果outと見比べて、異なっているものが予測ミスに相当します。 この場合は、計18サンプル中13サンプルの予測に成功していると判断します。

out                                    #outの中身を表示
class.tes$cond                         #テストセット中の真のラベル情報を表示(class.tesはStep 3で作成済み)
colData(input)$cond                    #テストセット中の真のラベル情報を表示
colData(input)$cond == out             #うまく当てられたらTRUE、そうでなければFALSE
sum(colData(input)$cond == out)        #TRUEの要素数
length(out)                            #評価したサンプル数
	

outオブジェクトをみれば分かりますが、Levelsに相当するラベル情報の順番、 特に一番最初に現れるものが"G1"になっています。 Step 7では、リファレンスとして用いるクラスラベル情報を"G2"として実行していました。 ここでもこれをリファレンス(基準)として利用すべく変更すべくrelevel関数を用いて"G2"に変更します。 なんでこれをわざわざやる必要があるのかは、私もいまだによくわかりません。 ここは、MLSeqのBeginner's guide のpage 12の上のほうの作業に相当します。

param_ref <- "G2"                      #リファレンスとして用いるクラスラベル情報を指定
out                                    #outの中身を表示
out <- relevel(out, ref=param_ref)     #relevel関数を用いてparam_refで指定したクラスラベルを基準とするように変更
out                                    #outの中身を表示

colData(input)$cond                    #テストセット中の真のラベル情報を表示
actual <- relevel(colData(input)$cond, ref=param_ref)#relevel関数を用いてparam_refで指定したクラスラベルを基準とするように変更
actual                                 #actualの中身を表示
	

予測結果outと実際のラベル情報actualを用いて混同行列(confusion matrix)を作成します。 まず、table関数を用いて2×2の分割表(contingency table)を作成したのち、 それを入力としてconfusionMatrix関数を用いて混同行列を作成します。 分割表と混同行列は、見かけ上は同じです。しかし、 正式な混同行列の形式にすることによって、AccuracyやSpecificityなどの値が計算できるのです。 「str(output)」としてoutputの中の構造(structure)を事前に眺めていたので、 output$tableやoutput$overallやoutput$byClassで情報抽出ができることを事前に学んでいます。 fit.rfのAccuracyは0.833であることがわかります。

tbl <- table(Predicted=out, Actual=actual)#table関数を用いて2×2の分割表を作成
output <- confusionMatrix(data=tbl, positive=param_ref)#confusionMatrix関数を用いて混同行列や各種統計情報を計算
output                                 #中身を表示
output$table                           #table部分のみ表示
output$overall                         #outputオブジェクト中のoverallという部分に格納されている情報のみ表示
output$byClass                         #outputオブジェクト中のbyClassという部分に格納されている情報のみ表示
output$overall["Accuracy"]             #各種統計情報部分の中からAccuracyのみ表示
output$overall["Kappa"]                #各種統計情報部分の中からKappaのみ表示
output$byClass["Sensitivity"]          #byClassという部分の中からSensitivityのみ表示
output.rf  <- output                   #outputの中身をコピー
	

Step 9:分類への寄与度の高いfeatures (i.e., possible biomarkers)の情報を取得。

MLSeqのBeginner's guide 中の「9 Determining possible biomarkers using sparse classifiers」(page 14)に相当する部分です。 Step 8とは独立に、Step 7で構築した予測モデルの情報から抽出する情報になります。 voomNSCのようなsparse classifiersの結果のみ、有意義な情報が得られます。 理由は、本項では、Step 2のparam_nfeatで指定した、分散の大きい上位100 featuresを利用していますが、 このうち分類への寄与度を算出するclassifiersは一部だからです。 以下のコマンドを実行すると、sparse classifierであるfit.voomNSCのみ、2つのfeaturesが表示されていることがわかります。

selectedGenes(fit.voomNSC)            #利用されたfeature情報を表示
selectedGenes(fit.voomDLDA)           #利用されたfeature情報を表示
selectedGenes(fit.NBLDA)              #利用されたfeature情報を表示
selectedGenes(fit.svmRadial)          #利用されたfeature情報を表示
selectedGenes(fit.rf)                 #利用されたfeature情報を表示

trained(fit.voomNSC)@finalModel$model$SelectedGenes#利用されたfeature情報を表示(こんな感じでも情報を取得できる)
trained(fit.voomDLDA)@finalModel$model$SelectedGenes#利用されたfeature情報を表示(こんな感じでも情報を取得できる)
trained(fit.NBLDA)@finalModel$model$SelectedGenes#利用されたfeature情報を表示(こんな感じでも情報を取得できる)
trained(fit.svmRadial)@finalModel$model$SelectedGenes#利用されたfeature情報を表示(こんな感じでも情報を取得できる)
trained(fit.rf)@finalModel$model$SelectedGenes#利用されたfeature情報を表示(こんな感じでも情報を取得できる)
	

解析 | 菌叢解析 | について

このあたりはほとんどノータッチです。菌叢解析(microbiome analysis)といういわゆるメタゲノム解析用のRパッケージもあるようです。 分類が正しいのかどうかもよくわかりません。

2017年6月に調査した結果をリストアップします。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 菌叢解析 | phyloseq(McMurdie_2013)

phyloseqを用いて菌叢解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(phyloseq)                      #パッケージの読み込み
	

解析 | エクソーム解析 | について

目的のエクソン領域のみ効率的に濃縮してシークエンスすることで、SNPやインデル(indel)などエクソン(exon)領域中のの変異を検出するものです。 1,000人ゲノムプロジェクト(1000 Genomes Project Consortium, Nature, 2012)の解析などがこの範疇に含まれます。 basic alignerの一つであるBWAでマッピング後にGenome Analysis Toolkit (GATK)という変異検出プログラムを適用する解析パイプラインが王道のようです。 1,000人ゲノムのようなデータが出てきているのでこれらのpopulation (a collection of genomes)に対して効率的にマッピングを行うBWBBLEというプログラムなどが出始めています。 また、exome sequencingとexome microarrayの比較を行った論文(Wang et al., Front Genet., 2013)なども出ています。 2014年7月に調査した結果をリストアップします。

プログラム:

Review、ガイドライン、パイプライン系:

解析 | ChIP-seq | について

このあたりはほとんどノータッチです。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | ChIP-seq | DiffBind (Ross-Innes_2012)

DiffBindを用いてChIP-seq解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(DiffBind)                      #パッケージの読み込み
	

解析 | ChIP-seq | ChIPseqR (Humburg_2011)

ChIPseqRを用いてChIP-seq解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(ChIPseqR)                      #パッケージの読み込み
	

解析 | ChIP-seq | chipseq

chipseqを用いてChIP-seq解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(chipseq)                       #パッケージの読み込み
	

解析 | ChIP-seq | PICS (Zhang_2011)

PICSを用いてChIP-seq解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(PICS)                          #パッケージの読み込み
	

解析 | ChIP-seq | ChIPpeakAnno (Zhu_2010)

ChIPpeakAnnoを用いてChIP-seq解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(ChIPpeakAnno)                  #パッケージの読み込み
	

解析 | ChIP-seq | rMAT (Droit_2010)

rMATを用いてChIP-seq解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(rMAT)                          #パッケージの読み込み
	

解析 | ChIP-seq | CSAR (Kaufmann_2009)

CSARを用いてChIP-seq解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(CSAR)                          #パッケージの読み込み
	

解析 | ChIP-seq | ChIPsim (Zhang_2008)

ChIPsimを用いてChIP-seq解析を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(ChIPsim)                       #パッケージの読み込み
	

解析 | ChIP-seq | 新規モチーフ | rGADEM(Li_2009)

rGADEMを用いたやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(rGADEM)                        #パッケージの読み込み
	

解析 | ChIP-seq | 新規モチーフ | cosmo(Bembom_2007)

cosmoを用いたやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(cosmo)                         #パッケージの読み込み
	

解析 | chromosome conformation capture (3C) | について

"chromosome conformation capture" (3C)は、DNAが細胞中でどのような立体的な配置(染色体の高次構造; chromosome conformation)をとっているか、 またどのような長距離ゲノム間相互作用(long-range genomic interactions)がなされているかを網羅的に調べるための実験技術です(Dekker et al., Science, 2002)。 その後、circular "chromosome conformation capture" (4C; Zhao et al., Nat. Genet., 2006)、 "chromosome conformation capture" carbon copy (5C; Dostie et al., Genome Res., 2006)、 Hi-C (Lieberman-Aiden et al., Science, 2009)、 single-cell Hi-C (Nagano et al., Nature, 2013)などの関連手法が提案されています。 ReviewとしてはDekker et al., Nat. Rev. Genet., 2013などが参考になると思います。 これらのクロマチン間の相互作用(chromatin interaction)を網羅的に検出すべく、NGSと組み合わされた"3C-seq"由来データが出てきています。 Rパッケージは、マップ後のBAM形式ファイルなどを入力として、統計的に有意な相互作用をレポートします。

2017年04月に調査した結果をリストアップします。

R用:

R以外:

Review、ガイドライン、パイプライン系:

解析 | 3C | r3Cseq (Thongjuea_2013)

r3Cseqを用いたやり方を示します。

BAM形式ファイルを入力として、シス相互作用(cis-interaction; 同じ染色体上の異なる部位同士の相互作用)や トランス相互作用(trans-interaction; 異なる染色体間の相互作用)を統計解析結果として出力します。 出力は、シンプルテキストファイルとbedGraphファイル(Kent et al., Genome Res., 2002)のようです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(r3Cseq)                        #パッケージの読み込み
	

解析 | Bisulfite sequencing (BS-seq) | について

Bisulfite sequencing (BS-seq; Bisulfite-seq)は、ゲノムDNAに対してbisulfite (重亜硫酸ナトリウム)処理を行った後にシーケンスを行う実験技術です。

BS-seqは、メチル化状態を検出するためのものです。bisulfite処理すると、メチル化されていないシトシン(C)はウラシル(U)に変換されます。 しかし、メチル化シトシンはUに変換されません。この性質を利用して、bisulfite処理後のDNAを鋳型にしてsequenceすれば、 メチル化シトシンのみCとして読まれ、それ以外はTとして読まれるので、メチル化の有無を区別することができるというものです。 但し、一般にマイクログラム程度のDNA量を必要とするため、一連の処理はPCR増幅のステップを含みます。 その後、アダプター付加(adapter ligation)後にbisulfite処理を行うのではなく、bisulfite処理後にアダプター付加を行うことでPCR増幅のステップを省いた PBAT法(post-bisulfite adaptor tagging; Miura et al., Nucleic Acids Res., 2012)などの関連手法が開発されているようです。

2016年10月に調査した結果をリストアップします。

R用:

R以外:

解析 | BS-seq | BiSeq (Hebestreit_2013)

BiSeqを用いたやり方を示します。

Bismark (Krueger et al., Bioinformatics, 2011)というBS-seq用マッピングプログラムの出力ファイルを入力として、 比較するグループ間でメチル化状態の異なる領域(Differentially Methylated Regions; DMRs)を出力します。

一般に、検定に供されるCpGサイトは100万(one million)以上になります。そのため、多重比較補正(multiple testing correction)後には、 ごく一部の明らかに差のある個所しか有意と判定されない傾向にあります(Bock C., Nat Rev Genet., 2012)。

BiSeqでは、階層的な検定手順(a hierarchical testing procedure; Benjamini and Heller, J Am Stat Assoc., 2007)を採用しています。 具体的には、最初のステップとして「領域(regions)」を単位として検定を行った後、検定の結果棄却された領域(rejected regions)内でより詳細な「個所(locations)」の検定を行う戦略を採用しています。 このように階層的に行うことで、検定数(number of hypothesis tests)を減らすことができ、ひいては検出力(statistical power)を上げることができるわけです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(BiSeq)                         #パッケージの読み込み
	

解析 | BS-seq | bsseq (Hansen_2012)

bsseqを用いたやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(bsseq)                         #パッケージの読み込み
	

解析 | 制限酵素切断部位(RECS)地図 | REDseq (Zhu_201X)

制限酵素消化(restriction enzyme digestion; RED)でアプローチ可能なところと不可能なところを区別できるとうれしいようです。 この制限酵素認識部位を調べるためのRパッケージだそうです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(REDseq)                        #パッケージの読み込み
	

解析 | small RNA | segmentSeq (Hardcastle_2012)

segmentSeqパッケージを用いたやり方を示します。 ゲノム上のsmall interfering RNAs (siRNAs)が結合?!する場所を探してくれるようです。 主な特徴としては、従来の発見的な方法(heuristic method)では、siRNAsの複数個所の"loci"としてレポートしてしまっていたものを、 提案手法の経験ベイズ(empirical Bayesian methods)を用いることで必要以上に分割してしまうことなく"locus"としてレポートしてくれるようです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(segmentSeq)                    #パッケージの読み込み
	

作図 |雑多(miscellaneous) | について

カテゴライズしづらいものたちです。

R用:

R以外:

作図 | 染色体 | について

karyotype (G banding)のプロットができるものたち?!です。

R用:

R以外:

作図 | ヒートマップ(heatmap) | について

ヒートマップを描くパッケージです。

R用:

R以外:

作図 | ヒートマップ(heatmap) | ComplexHeatmap(Gu_2016)

ComplexHeatmapパッケージを用いるやり方を示します。とりあえず項目のみ。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

	

作図 | ヒートマップ(heatmap) | NeatMap(Rajaram_2010)

NeatMapパッケージを用いるやり方を示します。 サンプルごとに色分けしたクラスタリング結果やヒートマップをを作成することができるようです。 クラスタリングしたあとのサブセットを示すときにも便利そう。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

	

作図 | 生存曲線 | 基礎 | について

抗がん剤とプラセボ(偽薬)のどちらがより長く生存したかを示すような、生存率曲線(生存曲線)を描くものたちです。 縦軸が累積生存率、横軸が生存時間です。カプランマイヤー(Kaplan-Meier)法を用いて比較する2群の生存率を同時に評価する場合が多い?!ので、 一般のヒトにとっては、「カプランマイヤー」という言葉のほうが馴染みがあると思います。 抗がん剤を使ったかどうかという原因側のデータを説明変数、 結果としてどれだけ長生きできたかという結果側の変数を目的変数と言います。 原因側のデータは、女か男かで調べてもよいですし、病気の種類でもよいです。 「病気A, B, C」のように3種類以上のような場合でも指定可能です。 また、「病気A, B, C」と「男女」を組み合わせて調べることだってできます。ここでは、主にsurvival パッケージを用いています。Surv関数のところで指定するのは、列名情報です。 「uge ~ ege」のような感じで指定しますが、右側に原因側である説明変数を指定し、 左側に結果側である目的変数を指定します。

R用:

R以外:

作図 | 生存曲線 | 基礎 | 1. まずはプロット

survivalパッケージを用いた生存曲線(カプランマイヤー曲線) の描画を行うやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ48のsample48.txtの場合:

MASSパッケージから提供されている gehanという名前の生存時間解析用データと同じものです。これは(ヘッダー行を除く)42行×4列からなる数値行列データです。 42行の行数は、42人の白血病患者(leukemia patients)数に相当します。 2人ずつのペアになっており、片方には6-mercaptopurine (6-MP)という薬を投与、もう片方にはプラセボ(control)を投与しています。
  行列データの各列には以下に示す情報が格納されています:
  1列目(列名:pair)は、患者のid情報が示されています。 例えば1-2行目が1番目のペア、3-4行目が2番目のペアだと読み解きます。
  2列目(列名:time)は、寛解時間(単位は週)です。MASSのリファレンスマニュアル56ページ目では、 remission time in weeksと書いてあります。大まかには「元気に過ごせた時間」とか「生存時間」のように解釈しちゃって構いません。
  3列目(列名:cens)は、打ち切り(censoring)があったかなかったかという 0 or 1の情報からなります。打ち切りがあったら0、なかったら1です。 このデータの場合は、3列目の0が12個、1が30個です。したがって、12人の患者さんのデータが打ち切りのあるデータ(「上完全データ」と呼ぶそうです)、 30人の患者さんのデータが打ち切りのないデータ(「完全データ」と呼ぶそうです。)ということになります。打ち切りデータというのは、 患者さんとの連絡が取れなくなったなど、何らかの理由で患者さんの状況を把握する手段がなくなったデータのことを指します。 観察期間終了まで生存されている患者さんの場合も、「打ち切りありで0」ということになります。 ちなみに、亡くなったという情報が分かっているデータは打ち切りのないデータに相当します。
  4列目(列名:treat)には、プラセボ(control)投与群か6-MP投与群かという「どのような処理を行ったかという処理(treatment)情報」が記載されています。
 
  ここでは、入力ファイル中のtreat列を、原因側である説明変数として指定しています。 結果側である目的変数で指定している部分は、「Surv(time=time, event=cens)」 に相当します。イベント(打ち切り)情報であるcens列の情報を加えた、time列の情報を、 Survという関数を用いて生存時間解析用のオブジェクトに変換しています。 抗がん剤(6-MP)投与群のほうがプラセボ(control)投与群よりも時間が長いことが分かります。

in_f <- "sample48.txt"                 #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=cens)~treat#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#本番(生存曲線の描画)
plot(sf, xlab="Time(in weeks)", ylab="Survival rate")#生存曲線の描画
	

2. サンプルデータ49のsample49.txtの場合:

survivalパッケージから提供されている kidneyという名前の生存時間解析用データ(sample49.txt;タブ区切りテキストファイル)です。 これは(ヘッダー行を除く)76行×7列からなる数値行列データです。 これは、ポータブル透析装置(portable dialysis equipment)を使用している腎臓病患者(kidney patients)向けの、 カテーテル(catheter)挿入時点での感染までの再発時間に関するデータです(McGilchrist and Aisbett, Biometrics, 1991)。 カテーテルは感染以外の理由で除去される場合があります。その場合、観察は打ち切られます。 患者1人につき、2つの観察結果(2 observations)があります。 このデータは76行ありますので、76/2 = 38人分の腎臓病患者のデータがあることになります。 このデータは、生存モデルでのランダム効果(フレイル)を説明するためによく使用されているようです。
  行列データの各列には以下に示す情報が格納されています:
  1列目(列名:id)は、患者のid情報が示されています。 例えば、(ヘッダー行を除く)最初の1-2行がid = 1の最初の患者さん、次の3-4行がid = 2の患者さん、という風に解釈します。
  2列目(列名:time)は、時間です(単位不明)。
  3列目(列名:status)は、event statusです。 0 or 1ですが、何が0で何が1かは記載されていません。 Rと生存時間分析(2) によると、「打ち切りは0、その他は1」となっています。
  4列目(列名:age)は、年令情報(in years)です。
  5列目(列名:sex)は、性別情報です。1が男性、2が女性です。
  6列目(列名:disease)は、「disease type」に関する情報が含まれています。 「0=GN, 1=AN, 2=PKD, 3=Other」だそうです。PKDはほぼ間違いなくpolycystic kidney diseaseの略で、多発性囊胞腎です。 ANは、おそらくacute nephritis (急性腎炎)のこと。GNは、glomerular nephritis (糸球体腎炎)の略なんだろうとは思いますが...。 実際には、数値ではなく「GN or AN or PKD or Other」のいずれかが記載されています。
  7列目(列名:frail)は、「frailty estimate from original paper」に関する情報が含まれています。 原著論文(McGilchrist and Aisbett, Biometrics, 1991)から推定した フレイル(frailty;加齢により心身が老い衰えた状態)の度合いを数値で示したもののようです。数値が大きいほど衰えの度合いが高い?!。
 
  ここでは、入力ファイル中のsex列を、原因側である説明変数として指定しています。 結果側である目的変数で指定している部分は、「Surv(time=time, event=status)」 に相当します。イベント(打ち切り)情報であるstatus列の情報を加えた、time列の情報を、 Survという関数を用いて生存時間解析用のオブジェクトに変換しています。 女性(sex=2)のほうが男性(sex=1)よりも時間が長いことがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#本番(生存曲線の描画)
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate")#生存曲線の描画
	

3. サンプルデータ49のsample49.txtの場合:

例題2と入力ファイルは同じですが、sex列(性別情報)ではなく、 disease列(disease type;病気の種類情報)を、原因側である説明変数として指定しています。 それ以外は同じです。 「GN or AN or PKD or Other」の4種類ありますので、どれがどれかはわかりませんが、4つ分描画されているのがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#本番(生存曲線の描画)
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate")#生存曲線の描画
	

4. サンプルデータ49のsample49.txtの場合:

例題3と入力ファイルは同じですが、sex列(性別情報) disease列(disease type;病気の種類情報)を、原因側である説明変数として指定しています。 それ以外は同じです。 男女と病気の種類の計8通り分ありますので、どれがどれかはわかりませんが、計8つ分描画されているのがわかります。 sfオブジェクトの実行結果を眺めても分かりますが、例えば「男でAN(sex=1, disease=AN)」はn=4でevents=3であることがわかります。 これは、データ数は4 (idが16と25のヒト)であり、そのうち打ち切りなしのデータが3つ(status列の1の個数)であることを意味します。 median=17とありますが、これは打ち切りなしデータの3つのtime情報(12, 17, 40)の中央値に相当するのだろうということがわかります。 マニュアルの説明文を読んだだけでは理解できないことが多いですが、こんな感じで元の入力ファイルと突き合わせて確認しながら理解してゆけばよいです。 尚、以下のコードでは「sex+disease」と記述していますが、 「disease+sex」でも構いません。sfオブジェクト内の順番が入れ替わるだけだからです。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex+disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#本番(生存曲線の描画)
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate")#生存曲線の描画
	

5. サンプルデータ50のsample50.txtの場合:

survivalパッケージから提供されている colonという名前の生存時間解析用データ(sample50.txt;タブ区切りテキストファイル)です。 カプランマイヤー(Kaplan-Meier)法による生存曲線(カプランマイヤー曲線;生存率曲線)作成時の入力ファイルです。 survivalのリファレンスマニュアル23ページ目のcolonの説明部分でも解説されていますが、 これは(ヘッダー行を除く)1858行×16列からなる数値行列データです。 これは、大腸がんに対する術後補助化学療法(adjuvant chemotherapy)の有効性を示したデータです (Laurie et al., J Clin Oncol., 1989)。 化学療法としては、低毒性のレバミゾール(Levamisole; 線虫駆虫薬の1種)と、 中程度の毒性のフルオロウラシル(fluorouracil; 5-FU)が使われています。 患者は、何もせずに経過観察(Obsavation)のみのObs群、Levamisole単独投与群(Lev群)、そして2種類の抗がん剤の併用群(Lev+5-FU群)の3種類に分けられます。 患者1人につき、2つの記録(two records)があります。再発(recurrence)が1で、死亡(death)が2です。 このデータは1858行ありますので、1858/2 = 929人分の大腸がん患者(colon cancer patients)のデータがあることになります。 それぞれのイベントの種類(event type; etype)ごとに、時間(time)の情報があります。 例えば、idが1の患者さんは、再発(etype = 1)までの時間が968 days、死亡(etype = 2)までの時間が1521 daysだったと解釈します。 データ全体を眺める(特にtime列とetype列を見比べる)とわかりますが、死亡までの時間のほうが再発までの時間よりも短いデータはアリエマセン。 「再発までの時間 <= 死亡までの時間」ということになります。
  行列データの各列には以下に示す情報が格納されています:
  1列目(列名:id)は、患者のid情報が示されています。 例えば、(ヘッダー行を除く)最初の1-2行がid = 1の最初の患者さん、次の3-4行がid = 2の患者さん、という風に解釈します。
  2列目(列名:study)は、全て1であり特に意味はありません。
  3列目(列名:rx)は、患者に対してどのような処置(Treatment)を行ったのかという情報が含まれています。 経過観察のみのObs群、Levamisole単独投与群(Lev群)、そして2種類の抗がん剤の併用群(Lev+5-FU群)の3種類です。
  4列目(列名:sex)は、性別情報です。0が女性、1が男性です。
  5列目(列名:age)は、年令情報(in years)です。
  6列目(列名:obstruct)は、「obstruction of colon by tumour」に関する情報が含まれています。 おそらく癌によって腸閉塞が行ったかどうかという0 or 1の情報からなるのだろうと思います。この列をざっと眺めると、0のほうが多いこと、 そしてそれほど腸閉塞の頻度は多くないだろうという素人判断から、0が腸閉塞なし、1が腸閉塞ありなのだろうと思います。
  7列目(列名:perfor)は、「perforation of colon」に関する情報が含まれています。 おそらく結腸(大腸のこと)に穴(穿孔)があいちゃったかどうかという0 or 1の情報からなるのだろうと思います。この列をざっと眺めると、0のほうが多いこと、 そしてそれほど穿孔の頻度は多くないだろうという素人判断から、0が穿孔なし、1が穿孔ありなのだろうと思います。
  8列目(列名:adhere)は、「adherence to nearby organs」に関する情報が含まれています。 近くの臓器への癒着があったかどうかという0 or 1の情報からなるのだろうと思います。この列をざっと眺めると、0のほうが多いこと、 そしてそれほど癒着の頻度は多くないだろうという素人判断から、0が癒着なし、1が癒着ありなのだろうと思います。
  9列目(列名:nodes)は、「number of lymph nodes with detectable cancer」に関する情報が含まれています。 リンパ節への転移に関する情報で、転移のあったリンパ節数(多いほどよくない)です。
  10列目(列名:status)は、「censoring status」に関する情報が含まれています。 打ち切り(censoring)があったかなかったかという 0 or 1の情報からなります。打ち切りがあったら0、なかったら1です。 打ち切りデータというのは、患者さんとの連絡が取れなくなったなど、何らかの理由で患者さんの状況を把握する手段がなくなったデータのことを指します。 観察期間終了まで生存されている患者さんの場合は、「打ち切りありで0」ということになります。 ちなみに、亡くなったという情報が分かっているデータは打ち切りのないデータに相当します。
  11列目(列名:differ)は、「differentiation of tumour」に関する情報が含まれています。 分化度(differentiation)のことですね。「1=well, 2=moderate, 3=poor」です。高分化型が1、中分化型が2、低分化型が3です。 数値が大きいほど悪性度が高いと解釈します。
  12列目(列名:extent)は、「Extent of local spread」に関する情報が含まれています。 「腫瘍の局所的拡大の範囲」と解釈すればよいのでしょうか。「1=submucosa, 2=muscle, 3=serosa, 4=contiguous structures)」です。 大腸粘膜(mucosa)の次の層がsubmucosa、その次が筋層(muscle layer)、その次がserosa (serous membrane;漿膜)、 最後にcontiguous structures (直接隣接する組織)となります。数値が大きいほど深層まで達していると解釈できるので、悪性度が高いと解釈します。
  13列目(列名:surg)は、「time from surgery to registration」に関する情報が含まれています。 来訪してから手術までの期間であり、「0=short, 1=long」です。
  14列目(列名:node4)は、「more than 4 positive lymph nodes」に関する情報が含まれています。 nodes列が4よりも大きいものが1、4以下が0となっているようですね。
  15列目(列名:time)は、「days until event or censoring」に関する情報が含まれています。 イベント(再発 or 死亡)または打ち切り(censoring)までの日数です。数値の大きさは、生存時間の長さを表します。
  16列目(列名:etype)は、「event type」に関する情報が含まれています。 再発(recurrence)が1で、死亡(death)が2です。
 
  ここでは、入力ファイル中のsex列を、原因側である説明変数として指定しています。 結果側である目的変数で指定している部分は、「Surv(time=time, event=status)」 に相当します。イベント(打ち切り)情報であるstatus列の情報を加えた、time列の情報を、 Survという関数を用いて生存時間解析用のオブジェクトに変換しています。 sfオブジェクトの実行結果より、Timeが2500くらいまでは、890人いる女性(sex=0)のほうが968人いる男性(sex=1)よりも生存時間が短いことがわかります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#本番(生存曲線の描画)
plot(sf, xlab="Time(in days)", ylab="Survival rate")#生存曲線の描画
	

6. サンプルデータ50のsample50.txtの場合:

例題5と入力ファイルは同じですが、sex列(性別情報)ではなく、 node4列を、原因側である説明変数として指定しています。 この列は、転移のあったリンパ節数(多いほどよくない)が、4個以下なら0、4個よりも多ければ1とした情報です。 予想としては、リンパ節転移が少ないほうが生存率が高いはずであり、実際に2つの状態間で明瞭に生存曲線が分離されていることがわかります。 sfオブジェクトの実行結果より、n=1348の転移したリンパ節数が4個以下(node4=0)のヒトの生存時間の中央値はNA、 n=510の転移したリンパ節数が4個よりも多い(node4=1)ヒトの生存時間の中央値は697日であることがわかります。 この段階で、生存曲線の悪いほうがnode4=1のデータであることがわかります。理由は、図の縦軸が0.5のところ で水平線を引き、曲線との交点から垂直に下した横軸(Time)の値が大体700 days付近であるからです。 もう一つのほうは、縦軸が0.5まで達していないので、medianを計算できないのだろうと解釈できます。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~node4#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#本番(生存曲線の描画)
plot(sf, xlab="Time(in days)", ylab="Survival rate")#生存曲線の描画
	

7. サンプルデータ50のsample50.txtの場合:

例題6と入力ファイルは同じですが、 rx列を、原因側である説明変数として指定しています。 この列は、患者に対してどのような処置(Treatment)を行ったのかという情報が含まれています。 経過観察のみのObs群、Levamisole単独投与群(Lev群)、そして2種類の抗がん剤の併用群(Lev+5-FU群)の3種類です。 1つの群のみ生存率がよいことが分かります。sf実行結果で、median=NAとなっているのは「rx=Lev+5FUの群」であり、 Time = 3000のあたりまで見ても確かに縦軸の生存率(Survival rate)が0.6程度あることが分かります。 原著論文(Laurie et al., J Clin Oncol., 1989)が補助化学療法として5-FU の効果を主張したものであることからも妥当ですね。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~rx#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#本番(生存曲線の描画)
plot(sf, xlab="Time(in days)", ylab="Survival rate")#生存曲線の描画
	

作図 | 生存曲線 | 基礎 | 2. pngファイルに保存

ここでは、「1. まずはプロット」の続きとして、縦横のサイズを指定してPNG形式ファイルとして保存するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ48のsample48.txtの場合:

in_f <- "sample48.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=cens)~treat#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(sf, xlab="Time(in weeks)", ylab="Survival rate")#生存曲線の描画
dev.off()                              #おまじない
	

2. サンプルデータ49のsample49.txtの場合:

女性(sex=2)のほうが男性(sex=1)よりも時間が長いことがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate")#生存曲線の描画
dev.off()                              #おまじない
	

3. サンプルデータ49のsample49.txtの場合:

「GN or AN or PKD or Other」の4種類ありますので、どれがどれかはわかりませんが、4つ分描画されているのがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate")#生存曲線の描画
dev.off()                              #おまじない
	

4. サンプルデータ49のsample49.txtの場合:

男女と病気の種類の計8通り分ありますので、どれがどれかはわかりませんが、計8つ分描画されているのがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex+disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate")#生存曲線の描画
dev.off()                              #おまじない
	

5. サンプルデータ50のsample50.txtの場合:

Timeが2500以降ではっきり差がついていることがわかります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(sf, xlab="Time(in days)", ylab="Survival rate")#生存曲線の描画
dev.off()                              #おまじない
	

6. サンプルデータ50のsample50.txtの場合:

リンパ節転移が少ないほう(node4=0)が生存率が高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~node4#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(sf, xlab="Time(in days)", ylab="Survival rate")#生存曲線の描画
dev.off()                              #おまじない
	

7. サンプルデータ50のsample50.txtの場合:

経過観察のみのObs群、Levamisole単独投与群(Lev群)、そして2種類の抗がん剤の併用群(Lev+5-FU群)の3種類の比較です。 併用群の生存率が一番高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~rx#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(sf, xlab="Time(in days)", ylab="Survival rate")#生存曲線の描画
dev.off()                              #おまじない
	

作図 | 生存曲線 | 基礎 | 3. 余白を変える

この項目では、図の余白を任意に変更します。 「下、左、上、右」の順で余白を指定します。単位は「行」で、0が最も余白が小さく、大体5程度が最大です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ48のsample48.txtの場合:

in_f <- "sample48.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=cens)~treat#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in weeks)", ylab="Survival rate")#生存曲線の描画
dev.off()                              #おまじない
	

2. サンプルデータ49のsample49.txtの場合:

女性(sex=2)のほうが男性(sex=1)よりも時間が長いことがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate")#生存曲線の描画
dev.off()                              #おまじない
	

3. サンプルデータ49のsample49.txtの場合:

「GN or AN or PKD or Other」の4種類ありますので、どれがどれかはわかりませんが、4つ分描画されているのがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate")#生存曲線の描画
dev.off()                              #おまじない
	

4. サンプルデータ49のsample49.txtの場合:

男女と病気の種類の計8通り分ありますので、どれがどれかはわかりませんが、計8つ分描画されているのがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex+disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate")#生存曲線の描画
dev.off()                              #おまじない
	

5. サンプルデータ50のsample50.txtの場合:

Timeが2500以降ではっきり差がついていることがわかります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate")#生存曲線の描画
dev.off()                              #おまじない
	

6. サンプルデータ50のsample50.txtの場合:

リンパ節転移が少ないほう(node4=0)が生存率が高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~node4#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate")#生存曲線の描画
dev.off()                              #おまじない
	

7. サンプルデータ50のsample50.txtの場合:

経過観察のみのObs群、Levamisole単独投与群(Lev群)、そして2種類の抗がん剤の併用群(Lev+5-FU群)の3種類の比較です。 併用群の生存率が一番高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~rx#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate")#生存曲線の描画
dev.off()                              #おまじない
	

作図 | 生存曲線 | 基礎 | 4. 軸ラベルや数値の大きさを変える(cex.labとcex.axis)

この項目では、plot関数実行時に、cex.labとcex.axisオプションを追加して、軸ラベルや数値の大きさを変えます。 通常のx倍という指定の仕方をします。 例えば、cex.lab=1.5は軸ラベル名を通常の1.5倍にしてね、ということに相当します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ48のsample48.txtの場合:

in_f <- "sample48.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=cens)~treat#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in weeks)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5)         #生存曲線の描画
dev.off()                              #おまじない
	

2. サンプルデータ49のsample49.txtの場合:

女性(sex=2)のほうが男性(sex=1)よりも時間が長いことがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5)         #生存曲線の描画
dev.off()                              #おまじない
	

3. サンプルデータ49のsample49.txtの場合:

「GN or AN or PKD or Other」の4種類ありますので、どれがどれかはわかりませんが、4つ分描画されているのがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5)         #生存曲線の描画
dev.off()                              #おまじない
	

4. サンプルデータ49のsample49.txtの場合:

男女と病気の種類の計8通り分ありますので、どれがどれかはわかりませんが、計8つ分描画されているのがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex+disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5)         #生存曲線の描画
dev.off()                              #おまじない
	

5. サンプルデータ50のsample50.txtの場合:

Timeが2500以降ではっきり差がついていることがわかります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5)         #生存曲線の描画
dev.off()                              #おまじない
	

6. サンプルデータ50のsample50.txtの場合:

リンパ節転移が少ないほう(node4=0)が生存率が高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~node4#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5)         #生存曲線の描画
dev.off()                              #おまじない
	

7. サンプルデータ50のsample50.txtの場合:

経過観察のみのObs群、Levamisole単独投与群(Lev群)、そして2種類の抗がん剤の併用群(Lev+5-FU群)の3種類の比較です。 併用群の生存率が一番高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~rx#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5)         #生存曲線の描画
dev.off()                              #おまじない
	

作図 | 生存曲線 | 基礎 | 5. 色分けする(col)

この項目では、colオプションを追加して色分けします。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ48のsample48.txtの場合:

in_f <- "sample48.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=cens)~treat#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in weeks)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
dev.off()                              #おまじない
	

2. サンプルデータ49のsample49.txtの場合:

女性(sex=2)のほうが男性(sex=1)よりも時間が長いことがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
dev.off()                              #おまじない
	

3. サンプルデータ49のsample49.txtの場合:

「GN or AN or PKD or Other」の4種類ありますので、どれがどれかはわかりませんが、4つ分描画されているのがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black", "blue", "pink")#色を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
dev.off()                              #おまじない
	

4. サンプルデータ49のsample49.txtの場合:

男女と病気の種類の計8通り分ありますので、どれがどれかはわかりませんが、計8つ分描画されているのがわかります。 色の名前を8種類も打つのが面倒なのでデフォルトの色番号(1:black, 2:red, ...)で指定しています。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- 1:8                       #色番号を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex+disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
dev.off()                              #おまじない
	

5. サンプルデータ50のsample50.txtの場合:

Timeが2500くらいまでは、890人いる女性(sex=0)のほうが968人いる男性(sex=1)よりも生存時間が短いことがわかります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
dev.off()                              #おまじない
	

6. サンプルデータ50のsample50.txtの場合:

リンパ節転移が少ないほう(node4=0)が生存率が高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~node4#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
dev.off()                              #おまじない
	

7. サンプルデータ50のsample50.txtの場合:

経過観察のみのObs群、Levamisole単独投与群(Lev群)、そして2種類の抗がん剤の併用群(Lev+5-FU群)の3種類の比較です。 併用群の生存率が一番高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black", "blue") #色を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~rx#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
dev.off()                              #おまじない
	

作図 | 生存曲線 | 基礎 | 6. グリッドを追加(grid)

この項目では、grid関数を用いてグリッドを追加します。ltyオプションでは、線分の形式を指定します。 "dotted"(点線)の代わりに、"dashed"(破線)や"solid"(実線)も指定可能です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ48のsample48.txtの場合:

in_f <- "sample48.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=cens)~treat#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in weeks)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

2. サンプルデータ49のsample49.txtの場合:

女性(sex=2)のほうが男性(sex=1)よりも時間が長いことがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

3. サンプルデータ49のsample49.txtの場合:

「GN or AN or PKD or Other」の4種類ありますので、どれがどれかはわかりませんが、4つ分描画されているのがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black", "blue", "pink")#色を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

4. サンプルデータ49のsample49.txtの場合:

男女と病気の種類の計8通り分ありますので、どれがどれかはわかりませんが、計8つ分描画されているのがわかります。 色の名前を8種類も打つのが面倒なのでデフォルトの色番号(1:black, 2:red, ...)で指定しています。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- 1:8                       #色番号を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex+disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

5. サンプルデータ50のsample50.txtの場合:

Timeが2500くらいまでは、890人いる女性(sex=0)のほうが968人いる男性(sex=1)よりも生存時間が短いことがわかります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

6. サンプルデータ50のsample50.txtの場合:

リンパ節転移が少ないほう(node4=0)が生存率が高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~node4#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

7. サンプルデータ50のsample50.txtの場合:

経過観察のみのObs群、Levamisole単独投与群(Lev群)、そして2種類の抗がん剤の併用群(Lev+5-FU群)の3種類の比較です。 併用群の生存率が一番高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black", "blue") #色を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~rx#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

作図 | 生存曲線 | 基礎 | 7. 凡例を追加(legend)

この項目では、legend関数を用いて凡例を追加します。legend関数実行時のlty=1は、 線分の形式を実線にするように指定していることに相当します。 lty=2破線に相当します。他にもいろいろあります。 cex=1.5というのは、線分の大きさの倍率指定です。この場合は通常の1.5倍に相当します。 凡例で指定する文字列の並びは、sfオブジェクトの中身を見ながら、その出現順に記載していきます。 本当はもう少し自動化できるやり方はあるのですが、初心者のうちはその解釈が難解だと思うのでやめてます。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ48のsample48.txtの場合:

in_f <- "sample48.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定
param_legend <- c("6-MP", "Control")   #凡例を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=cens)~treat#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in weeks)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

2. サンプルデータ49のsample49.txtの場合:

女性(sex=2)のほうが男性(sex=1)よりも時間が長いことがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定
param_legend <- c("Male", "Female")    #凡例を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

3. サンプルデータ49のsample49.txtの場合:

「GN or AN or PKD or Other」の4種類ありますので、どれがどれかはわかりませんが、4つ分描画されているのがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black", "blue", "pink")#色を指定
param_legend <- c("AN", "GN", "Other", "PKD")#凡例を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

4. サンプルデータ49のsample49.txtの場合:

男女と病気の種類の計8通り分ありますので、どれがどれかはわかりませんが、計8つ分描画されているのがわかります。 色の名前を8種類も打つのが面倒なのでデフォルトの色番号(1:black, 2:red, ...)で指定しています。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- 1:8                       #色番号を指定
param_legend <- c("Male_AN", "Male_GN", "Male_Other", "Male_PKD", "Female_AN", "Female_GN", "Female_Other", "Female_PKD")#凡例を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex+disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

5. サンプルデータ50のsample50.txtの場合:

Timeが2500くらいまでは、890人いる女性(sex=0)のほうが968人いる男性(sex=1)よりも生存時間が短いことがわかります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定
param_legend <- c("Female", "Male")    #凡例を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

6. サンプルデータ50のsample50.txtの場合:

リンパ節転移が少ないほう(node4=0)が生存率が高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定
param_legend <- c("node4(less)", "node4(more)")#凡例を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~node4#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

7. サンプルデータ50のsample50.txtの場合:

経過観察のみのObs群、Levamisole単独投与群(Lev群)、そして2種類の抗がん剤の併用群(Lev+5-FU群)の3種類の比較です。 併用群の生存率が一番高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black", "blue") #色を指定
param_legend <- c("Lev", "Lev+5FU", "Obs")#凡例を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~rx#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

作図 | 生存曲線 | 基礎 | 8. 95%信頼区間を追加

この項目では、plot関数実行時にconf.int=Tオプションを付けて、デフォルトの95%信頼区間も描画しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ48のsample48.txtの場合:

in_f <- "sample48.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定
param_legend <- c("6-MP", "Control")   #凡例を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=cens)~treat#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in weeks)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)#凡例を表示
dev.off()                              #おまじない
	

2. サンプルデータ49のsample49.txtの場合:

女性(sex=2)のほうが男性(sex=1)よりも時間が長いことがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定
param_legend <- c("Male", "Female")    #凡例を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

3. サンプルデータ49のsample49.txtの場合:

「GN or AN or PKD or Other」の4種類ありますので、どれがどれかはわかりませんが、4つ分描画されているのがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black", "blue", "pink")#色を指定
param_legend <- c("AN", "GN", "Other", "PKD")#凡例を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

4. サンプルデータ49のsample49.txtの場合:

男女と病気の種類の計8通り分ありますので、どれがどれかはわかりませんが、計8つ分描画されているのがわかります。 色の名前を8種類も打つのが面倒なのでデフォルトの色番号(1:black, 2:red, ...)で指定しています。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- 1:8                       #色番号を指定
param_legend <- c("Male_AN", "Male_GN", "Male_Other", "Male_PKD", "Female_AN", "Female_GN", "Female_Other", "Female_PKD")#凡例を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex+disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

5. サンプルデータ50のsample50.txtの場合:

Timeが2500くらいまでは、890人いる女性(sex=0)のほうが968人いる男性(sex=1)よりも生存時間が短いことがわかります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定
param_legend <- c("Female", "Male")    #凡例を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

6. サンプルデータ50のsample50.txtの場合:

リンパ節転移が少ないほう(node4=0)が生存率が高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定
param_legend <- c("node4(less)", "node4(more)")#凡例を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~node4#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

7. サンプルデータ50のsample50.txtの場合:

経過観察のみのObs群、Levamisole単独投与群(Lev群)、そして2種類の抗がん剤の併用群(Lev+5-FU群)の3種類の比較です。 併用群の生存率が一番高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black", "blue") #色を指定
param_legend <- c("Lev", "Lev+5FU", "Obs")#凡例を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~rx#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data) #survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

作図 | 生存曲線 | 基礎 | 9. 80%信頼区間を追加

この項目では、survfit関数実行時にconf.intオプションを付けて、80%信頼区間も描画しています。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ48のsample48.txtの場合:

in_f <- "sample48.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定
param_legend <- c("6-MP", "Control")   #凡例を指定
param_confint <- 0.8                   #信頼区間情報を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=cens)~treat#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data, conf.int=param_confint)#survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in weeks)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)#凡例を表示
dev.off()                              #おまじない
	

2. サンプルデータ49のsample49.txtの場合:

女性(sex=2)のほうが男性(sex=1)よりも時間が長いことがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定
param_legend <- c("Male", "Female")    #凡例を指定
param_confint <- 0.8                   #信頼区間情報を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data, conf.int=param_confint)#survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

3. サンプルデータ49のsample49.txtの場合:

「GN or AN or PKD or Other」の4種類ありますので、どれがどれかはわかりませんが、4つ分描画されているのがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black", "blue", "pink")#色を指定
param_legend <- c("AN", "GN", "Other", "PKD")#凡例を指定
param_confint <- 0.8                   #信頼区間情報を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data, conf.int=param_confint)#survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

4. サンプルデータ49のsample49.txtの場合:

男女と病気の種類の計8通り分ありますので、どれがどれかはわかりませんが、計8つ分描画されているのがわかります。 色の名前を8種類も打つのが面倒なのでデフォルトの色番号(1:black, 2:red, ...)で指定しています。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- 1:8                       #色番号を指定
param_legend <- c("Male_AN", "Male_GN", "Male_Other", "Male_PKD", "Female_AN", "Female_GN", "Female_Other", "Female_PKD")#凡例を指定
param_confint <- 0.8                   #信頼区間情報を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex+disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data, conf.int=param_confint)#survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

5. サンプルデータ50のsample50.txtの場合:

Timeが2500くらいまでは、890人いる女性(sex=0)のほうが968人いる男性(sex=1)よりも生存時間が短いことがわかります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定
param_legend <- c("Female", "Male")    #凡例を指定
param_confint <- 0.8                   #信頼区間情報を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data, conf.int=param_confint)#survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

6. サンプルデータ50のsample50.txtの場合:

リンパ節転移が少ないほう(node4=0)が生存率が高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定
param_legend <- c("node4(less)", "node4(more)")#凡例を指定
param_confint <- 0.8                   #信頼区間情報を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~node4#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data, conf.int=param_confint)#survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

7. サンプルデータ50のsample50.txtの場合:

経過観察のみのObs群、Levamisole単独投与群(Lev群)、そして2種類の抗がん剤の併用群(Lev+5-FU群)の3種類の比較です。 併用群の生存率が一番高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black", "blue") #色を指定
param_legend <- c("Lev", "Lev+5FU", "Obs")#凡例を指定
param_confint <- 0.8                   #信頼区間情報を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~rx#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data, conf.int=param_confint)#survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

作図 | 生存曲線 | 基礎 | 10. 信頼区間の凡例も追加

この項目では、信頼区間の凡例を追加します。legend関数実行時のオプションに、例えばlty=c(1,2,1,2)があります。 これは凡例の表示順に、線分を「実線(lty=1)・破線(lty=2)・実線(lty=1)・破線(lty=2)」の順で描画してね、という指令です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ48のsample48.txtの場合:

in_f <- "sample48.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定
param_legend <- c("6-MP", "Control")   #凡例を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=cens)~treat#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data, conf.int=param_confint)#survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです
summary(sf)                            #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in weeks)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
uge  <- paste(100*param_confint, "%信頼区間", sep="")#凡例に表示する情報を作成
legend("topright", legend=c("6-MP", uge, "control", uge),#凡例を表示
       col=c("red", "red", "black", "black"), lty=c(1,2,1,2), cex=1.3)#凡例を表示
dev.off()                              #おまじない
	

2. サンプルデータ49のsample49.txtの場合:

女性(sex=2)のほうが男性(sex=1)よりも時間が長いことがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定
param_legend <- c("Male", "Female")    #凡例を指定
param_confint <- 0.8                   #信頼区間情報を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data, conf.int=param_confint)#survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

3. サンプルデータ49のsample49.txtの場合:

「GN or AN or PKD or Other」の4種類ありますので、どれがどれかはわかりませんが、4つ分描画されているのがわかります。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black", "blue", "pink")#色を指定
param_legend <- c("AN", "GN", "Other", "PKD")#凡例を指定
param_confint <- 0.8                   #信頼区間情報を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data, conf.int=param_confint)#survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

4. サンプルデータ49のsample49.txtの場合:

男女と病気の種類の計8通り分ありますので、どれがどれかはわかりませんが、計8つ分描画されているのがわかります。 色の名前を8種類も打つのが面倒なのでデフォルトの色番号(1:black, 2:red, ...)で指定しています。

in_f <- "sample49.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- 1:8                       #色番号を指定
param_legend <- c("Male_AN", "Male_GN", "Male_Other", "Male_PKD", "Female_AN", "Female_GN", "Female_Other", "Female_PKD")#凡例を指定
param_confint <- 0.8                   #信頼区間情報を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex+disease#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data, conf.int=param_confint)#survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(unknown unit)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

5. サンプルデータ50のsample50.txtの場合:

Timeが2500くらいまでは、890人いる女性(sex=0)のほうが968人いる男性(sex=1)よりも生存時間が短いことがわかります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定
param_legend <- c("Female", "Male")    #凡例を指定
param_confint <- 0.8                   #信頼区間情報を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~sex#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data, conf.int=param_confint)#survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

6. サンプルデータ50のsample50.txtの場合:

リンパ節転移が少ないほう(node4=0)が生存率が高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black")         #色を指定
param_legend <- c("node4(less)", "node4(more)")#凡例を指定
param_confint <- 0.8                   #信頼区間情報を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~node4#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data, conf.int=param_confint)#survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

7. サンプルデータ50のsample50.txtの場合:

経過観察のみのObs群、Levamisole単独投与群(Lev群)、そして2種類の抗がん剤の併用群(Lev+5-FU群)の3種類の比較です。 併用群の生存率が一番高いことが分かります。

in_f <- "sample50.txt"                 #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_mar <- c(4, 5, 1, 0)             #下、左、上、右の順で余白を指定(単位は行)
param_col <- c("red", "black", "blue") #色を指定
param_legend <- c("Lev", "Lev+5FU", "Obs")#凡例を指定
param_confint <- 0.8                   #信頼区間情報を指定

#必要なパッケージをロード
library(survival)                      #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, sep="\t")#in_fで指定したファイルの読み込み

#前処理(生存曲線解析用の形式に変換)
head(data)                             #確認してるだけです(ヘッダー行を除いた最初の6行分を表示)
dim(data)                              #確認してるだけです(行数と列数を表示)
hoge <- Surv(time=time, event=status)~rx#survival関数のformula部分を作成した結果をhogeに格納
sf <- survfit(formula=hoge, data=data, conf.int=param_confint)#survfit関数を用いてクラスオブジェクトを作成した結果をsfに格納
sf                                     #確認してるだけです

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(sf, xlab="Time(in days)", ylab="Survival rate",#生存曲線の描画
    cex.lab=1.5, cex.axis=1.5, col=param_col, conf.int=T)#生存曲線の描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
legend("topright", legend=param_legend,#凡例を表示
       col=param_col, lty=1, cex=1.5)  #凡例を表示
dev.off()                              #おまじない
	

作図 | M-A plot | について

2群間(A群 vs. B群)の発現変動解析結果を視覚化する手段の1つです。縦軸がlog2(B/A)またはlog2(A/B)、横軸がlog2((A+B)/2)みたいな感じで散布図をプロットします。 縦軸は、いわゆるlog ratioとかlog比などと呼ばれるものです。横軸は平均発現量という理解でよいです。数が大きいほど全体的な発現量が高い遺伝子だと判断します。 縦軸が0に近いものほど発現変動の度合いが低い(変動していない)と判断します。 ほとんどの発現変動解析用パッケージ中で、このプロットを描くための関数が用意されています。

R用:

R以外:

作図 | M-A plot | 基礎 | 1. 感覚をつかむ

M-A plotは、二群間比較の発現変動解析結果の図としてよく見かけます。横軸を平均発現レベル、縦軸をlog ratioとしてプロットしたものです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ2のSupplementaryTable2_changed.txtの場合:

「G1群 5サンプル vs. G2群 5サンプル」の2群間比較データです。

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#M-A plot本番
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画

#以下は(こんなこともできますという)おまけ
#縦軸の任意の位置に赤で水平線を引きたい
param3 <- 1                            #縦軸の任意の値(つまりこの場合は2倍の発現量の差に相当)をparam3に格納
abline(h=param3, col="red", lwd=1)     #param3で指定したy軸上の値で横線を引く(lwdの値を大きくするほど線が太くなる;横線を引きたいときはh=param3で、縦線を引きたいときはv=param3にするとよい)
	

2. サンプルデータ2のSupplementaryTable2_changed.txtの場合:

サイズを指定してpng形式ファイルで保存するやり方です。

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#M-A plot本番
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid()                                 #grid線を追加している
dev.off()                              #おまじない
	

3. サンプルデータ2のSupplementaryTable2_changed.txtの場合:

y軸の範囲をparam5で指定するやり方です。

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)
param5 <- c(-5, 5)                     #y軸の任意の範囲を指定

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#M-A plot本番
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1, ylim=param5)#MA-plotを描画
dev.off()                              #おまじない
	

4. サンプルデータ2のSupplementaryTable2_changed.txtの場合:

グリッドを、param6で指定した色およびparam7で指定した線のタイプで表示させるやり方です。

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)
param5 <- c(-5, 5)                     #y軸の任意の範囲を指定
param6 <- "gray"                       #グリッドの色(red, black, blue, and so on)を指定
param7 <- "solid"                      #グリッド線のタイプ("dotted", "solid", ...)を指定

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#M-A plot本番
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1, ylim=param5)#MA-plotを描画
grid(col=param6, lty=param7)           #param6, 7で指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

5. サンプルデータ2のSupplementaryTable2_changed.txtの場合:

param8で指定した任意のIDがどのあたりにあるかをparam9で指定した色で表示させるやり方です。

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)
param5 <- c(-8, 8)                     #y軸の任意の範囲を指定
param6 <- "gray"                       #グリッドの色(red, black, blue, and so on)を指定
param7 <- "dotted"                     #グリッド線のタイプ("dotted", "solid", ...)を指定
param8 <- c("ENSG00000004468","ENSG00000182325","ENSG00000110492","ENSG00000008516","ENSG00000100170","ENSG00000173698","ENSG00000171433")#任意のIDを指定
param9 <- "red"                        #色を指定

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#M-A plot本番
obj <- is.element(rownames(data), param8)#param8で指定したIDの位置情報をobjに格納
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1, ylim=param5)#MA-plotを描画
grid(col=param6, lty=param7)           #param6, 7で指定したパラメータでグリッドを表示
points(x_axis[obj], y_axis[obj], col=param9)#param8で指定したGene symbolsに相当する点をparam9で指定した色で表示
dev.off()                              #おまじない

#以下は(こんなこともできますという)おまけ
data[obj,]                             #param8で指定したIDの発現データを表示
	

6. サンプルデータ2のSupplementaryTable2_changed.txtの場合:

param8で指定した原著論文中でRT-PCRで発現変動が確認された7遺伝子のGene symbolsがどのあたりにあるかをparam9で指定した色で表示させるやり方です。 一見ややこしくて回りくどい感じですが、以下のような事柄に対処するために、ここで記述しているような集合演算テクニック(intersect, is.element (or %in%))を駆使することは非常に大事です:

  1. 一つのgene symbolが複数のEnsembl Gene IDsに対応することがよくある。
  2. BioMartなどから取得したIDの対応関係情報を含むアノテーションファイル(ens_gene_48.txt)中に、原著論文で言及されparam8で指定したgene symbolsが存在しない。
  3. 読み込んだ発現データファイル中にはあるがアノテーションファイル中には存在しないIDがある。
in_f1 <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_f1に格納
in_f2 <- "ens_gene_48.txt"             #アノテーション情報ファイルを指定してin_f2に格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)
param5 <- c(-8, 8)                     #y軸の任意の範囲を指定
param6 <- "gray"                       #グリッドの色(red, black, blue, and so on)を指定
param7 <- "dotted"                     #グリッド線のタイプ("dotted", "solid", ...)を指定
param8 <- c("MMP25","SLC5A1","MDK","GPR64","CD38","GLOD5","FBXL6")#RT-PCRで発現変動が確認されたGene symbolsを指定
param9 <- "red"                        #色を指定

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

tmp <- read.table(in_f2, header=TRUE, sep="\t", quote="")#in_f2で指定したファイルの読み込み
gs_annot <- tmp[,5]                    #5列目(HGNC symbol)の情報をgs_annotに格納
names(gs_annot) <- tmp[,1]             #gs_annotとIDを対応づけている

gs_annot_sub <- intersect(gs_annot, param8)#param8で指定したgene symbolsとアノテーションファイル中のgene symbolsの積集合をgs_annot_subに格納(結果としてparam8と同じ情報になるが、アノテーションファイル中にないものをparam8で指定する可能性もあるためです)
obj_annot <- is.element(gs_annot, gs_annot_sub)#gs_annot_subで指定したgene symbolsのアノテーションファイル中における位置情報をobj_annotに格納(「obj_annot <- gs_annot %in% gs_annot_sub」と同じ意味)
ensembl_annot_gs <- unique(names(gs_annot)[obj_annot])#アノテーションファイル中のobj_annotに対応する位置にあるEnsembl IDsをensembl_annot_gsに格納
ensembl_data_gs <- intersect(rownames(data), ensembl_annot_gs)#ensembl_annot_gsで指定したEnsembl IDsと発現データファイル中のEnsembl IDsの積集合をensembl_data_gs
obj <- is.element(rownames(data), ensembl_data_gs)#発現データファイル中のensembl_data_gsに対応する位置にあるEnsembl IDsをobjに格納 (「obj <- rownames(data) %in% ensembl_data_gs」と同じ意味)

mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)

png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1, ylim=param5)#MA-plotを描画
grid(col=param6, lty=param7)           #param6, 7で指定したパラメータでグリッドを表示
points(x_axis[obj], y_axis[obj], col=param9)#param8で指定したGene symbolsに相当する点をparam9で指定した色で表示
dev.off()                              #おまじない

#以下は(こんなこともできますという)おまけ
ensembl_data_gs                        #param8で指定したGene symbolsに対応するEnsembl Gene IDを表示
data[obj,]                             #param8で指定したGene symbolsの発現データを表示
	

7. サンプルデータ2のSupplementaryTable2_changed.txtの場合:

RPM正規化してから作図するやり方です。

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param_fig <- c(600, 400)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#RPM補正とM-A plot本番
RPM <- sweep(data, 2, 1000000/colSums(data), "*")#RPM補正した結果をRPMに格納
data <- RPM                            #オブジェクトRPMの情報をdataに代入している
mean_G1 <- log2(apply(as.matrix(data[,data.cl==1]), 1, mean))#遺伝子ごとにG1群の平均の対数を計算した結果をmean_G1に格納
mean_G2 <- log2(apply(as.matrix(data[,data.cl==2]), 1, mean))#遺伝子ごとにG2群の平均の対数を計算した結果をmean_G2に格納
x_axis <- (mean_G1 + mean_G2)/2        #「G1群の平均値」と「G2群の平均値」の平均をとったものがM-A plotのA(x軸の値)に相当するものなのでx_axisに格納)
y_axis <- mean_G2 - mean_G1            #いわゆるlog比(logの世界での引き算)がM-A plotのM(y軸の値)に相当するものなのでy_axisに格納)

png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(x_axis, y_axis, xlab="A = (log2(G2)+log2(G1))/2", ylab="M = log2(G2)-log2(G1)", pch=20, cex=.1)#MA-plotを描画
grid()                                 #grid線を追加している
dev.off()                              #おまじない
	

作図 | M-A plot | 基礎 | 2. 発現変動遺伝子を色分けする

「解析 | 発現変動 | 2群間 | 対応なし | 複製なし | TCC(Sun_2013)」の例題とほぼ同じですが、 TCCを用いて発現変動遺伝子(DEG)検出を行った後、 それを様々な閾値で色分けして表示させるやり方を示します。このような作業を行うことで、例題5が示すように 「何かおかしな結果になっている!バグがあるのではないか?!」といったことがわかります(南茂隆生 氏提供情報)。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

param_FDRで指定したFDR(false discovery rate)閾値を満たすDEGをマゼンタ色にしてpngファイルに保存する例です。 複製(反復)なしデータの場合は、一般的なFDR閾値(5%や10%)を満たす遺伝子は通常得られません。 このデータの場合も有意なDEGはないため、全て黒色のプロットになります。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq2", test.method="deseq2",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq2", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納

sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示
sum(result$q.value < param_FDR)        #条件を満たす遺伝子数を表示


#ファイルに保存(M-A plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR, xlim=c(-3, 13), ylim=c(-10, 10))#param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("bottomright", c(paste("DEG(FDR ", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない
sum(tcc$stat$q.value < 0.05)           #FDR < 0.05を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.10)           #FDR < 0.10を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.20)           #FDR < 0.20を満たす遺伝子数を表示
sum(tcc$stat$q.value < 0.30)           #FDR < 0.30を満たす遺伝子数を表示
	

2. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

param_pvalueで指定したFPR(false positive rate;有意水準のことです)閾値を満たすDEGを色付けしてpngファイルに保存する例です。 TCCパッケージ中のplot関数はFDR閾値でしか指定できない仕様になっているので、ここはアリエナイほど厳しい閾値(0.00000000000001)にしておいて、 後でpoints関数を用いてp-value閾値を満たすものを"skyblue"で表示させるようにしています。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_pvalue <- 0.05                   #false positive rate (FPR)閾値を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)
param_col <- "skyblue"                 #色を指定
param_cex <- 1                         #点の大きさを指定(2なら通常の2倍、0.5なら通常の0.5倍)
param_pch <- 20                        #点の形状を指定(詳細はこちらとか)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq2", test.method="deseq2",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq2", FDR=0.1)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(result$p.value < param_pvalue)     #条件を満たす遺伝子数を表示
sum(tcc$stat$p.value < param_pvalue)   #条件を満たす遺伝子数を表示


#ファイルに保存(M-A plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=0.00000000000001, xlim=c(-3, 13), ylim=c(-10, 10))#指定した閾値を満たすDEGをマゼンタ色にして描画
legend("bottomright", c(paste("DEG(p-value < ", param_pvalue, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
obj <- as.logical(tcc$stat$p.value < param_pvalue)#条件を満たすかどうかを判定した結果をobjに格納
points(result$a.value[obj], result$m.value[obj],#条件を満たす点をハイライト
       pch=param_pch, cex=param_cex, col=param_col)#条件を満たす点をハイライト
dev.off()                              #おまじない
sum(tcc$stat$p.value < 0.05)           #p-value < 0.05を満たす遺伝子数を表示
sum(tcc$stat$p.value < 0.10)           #p-value < 0.10を満たす遺伝子数を表示
sum(tcc$stat$p.value < 0.20)           #p-value < 0.20を満たす遺伝子数を表示
sum(tcc$stat$p.value < 0.30)           #p-value < 0.30を満たす遺伝子数を表示
	

3. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

param_FCで指定した変動幅以上の遺伝子を色付けしてpngファイルに保存する例です。 TCCパッケージ中のplot関数はFDR閾値でしか指定できない仕様になっているので、ここはアリエナイほど厳しい閾値(0.00000000000001)にしておいて、 後でpoints関数を用いてparam_FC倍という閾値を満たすものを"skyblue"で表示させるようにしています。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_FC <- 2                          #fold-change閾値(param_FC倍)を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)
param_col <- "skyblue"                 #色を指定
param_cex <- 1                         #点の大きさを指定(2なら通常の2倍、0.5なら通常の0.5倍)
param_pch <- 20                        #点の形状を指定(詳細はこちらとか)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq2", test.method="deseq2",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq2", FDR=0.1)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(abs(result$m.value) >= log2(param_FC))#条件を満たす遺伝子数を表示

#ファイルに保存(M-A plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=0.00000000000001, xlim=c(-3, 13), ylim=c(-10, 10))#指定した閾値を満たすDEGをマゼンタ色にして描画
legend("bottomright", c(paste("DEG(", param_FC, "-fold)", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
obj <- as.logical(abs(result$m.value) >= log2(param_FC))#条件を満たすかどうかを判定した結果をobjに格納
points(result$a.value[obj], result$m.value[obj],#条件を満たす点をハイライト
       pch=param_pch, cex=param_cex, col=param_col)#条件を満たす点をハイライト
dev.off()                              #おまじない
	

4. サンプルデータ14の10,000 genes×2 samplesのカウントデータ(data_hypodata_1vs1.txt)の場合:

例題2と似ていますが、param_DEGで指定したp-valueの低い上位500個の遺伝子を"skyblue"で表示させる例です。

in_f <- "data_hypodata_1vs1.txt"       #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_DEG <- 500                       #上位遺伝子数を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)
param_col <- "skyblue"                 #色を指定
param_cex <- 1                         #点の大きさを指定(2なら通常の2倍、0.5なら通常の0.5倍)
param_pch <- 20                        #点の形状を指定(詳細はこちらとか)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq2", test.method="deseq2",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq2", FDR=0.1)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
ranking <- rank(tcc$stat$p.value)      #p-valueでランキングした結果をrankingに格納

#ファイルに保存(M-A plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=0.00000000000001, xlim=c(-3, 13), ylim=c(-10, 10))#指定した閾値を満たすDEGをマゼンタ色にして描画
legend("bottomright", c(paste("Top ", param_DEG, "genes", sep=""), "Others"),#凡例を作成
       col=c(param_col, "black"), pch=20)#凡例を作成
obj <- as.logical(ranking <= param_DEG)#条件を満たすかどうかを判定した結果をobjに格納
points(result$a.value[obj], result$m.value[obj],#条件を満たす点をハイライト
       pch=param_pch, cex=param_cex, col=param_col)#条件を満たす点をハイライト
dev.off()                              #おまじない
	

5. サンプルデータ46の14,599 genes×2 samplesのカウントデータ(sample_pasilla_1vs1.txt)の場合:

例題4ととの違いは入力ファイルのみです。M-A plotが変なことがわかります。つまりDEG検出結果がオカシイということです(南茂隆生 氏提供情報)。 例えばM-A plotのM値が-5.05、A値が4.29の"FBgn0024288"は、p値が0.027で96位です。 しかし、同程度のM値(-4.97)でA値(=8.38)が非常に高い"FBgn0039155"のp値がなぜか0.395と高めに出ており2247位となっています。 内部的に用いているDESeq2の出力結果の解説(?results)ページ中でも 「outlierを判定されたもののp値はNAとしている(results assigns a p-value of NA to genes containing count outliers)」 と書いてはいますが、"FBgn0039155"のp値はNAにもなっていないのでoutlierと判定されたわけでもなさそうです。 従って、2018.01.12現在の私の見解は「DESeq2にバグがある」です。 尚、この結論に至る手前のBioconductor上でのDESeq2開発者とのやり取りはこれです。

in_f <- "sample_pasilla_1vs1.txt"      #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_DEG <- 500                       #上位遺伝子数を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)
param_col <- "skyblue"                 #色を指定
param_cex <- 1                         #点の大きさを指定(2なら通常の2倍、0.5なら通常の0.5倍)
param_pch <- 20                        #点の形状を指定(詳細はこちらとか)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq2", test.method="deseq2",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq2", FDR=0.1)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
ranking <- rank(tcc$stat$p.value)      #p-valueでランキングした結果をrankingに格納

#ファイルに保存(M-A plot)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=0.00000000000001, xlim=c(-3, 13), ylim=c(-10, 10))#指定した閾値を満たすDEGをマゼンタ色にして描画
legend("bottomright", c(paste("Top ", param_DEG, "genes", sep=""), "Others"),#凡例を作成
       col=c(param_col, "black"), pch=20)#凡例を作成
obj <- as.logical(ranking <= param_DEG)#条件を満たすかどうかを判定した結果をobjに格納
points(result$a.value[obj], result$m.value[obj],#条件を満たす点をハイライト
       pch=param_pch, cex=param_cex, col=param_col)#条件を満たす点をハイライト
dev.off()                              #おまじない

#おまけ(上位にランクされるはずだが、されていないものを調査)
sum(result$m.value < -4.5)             #M-A plotでM値の条件を満たす遺伝子数を表示
obj <- (result$m.value < -4.5)         #条件を満たすかどうかを判定した結果をobjに格納
result[obj, ]                          #条件を満たすものを表示
	

6. サンプルデータ46の14,599 genes×2 samplesのカウントデータ(sample_pasilla_1vs1.txt)の場合:

例題5と基本的に同じですが、M-A plot以外の解析結果ファイルを出力させています。

in_f <- "sample_pasilla_1vs1.txt"      #入力ファイル名を指定してin_fに格納
out_f1 <- "hoge6.txt"                  #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge6.png"                  #出力ファイル名を指定してout_f2に格納
param_G1 <- 1                          #G1群のサンプル数を指定
param_G2 <- 1                          #G2群のサンプル数を指定
param_DEG <- 500                       #上位遺伝子数を指定
param_fig <- c(400, 380)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)
param_col <- "skyblue"                 #色を指定
param_cex <- 1                         #点の大きさを指定(2なら通常の2倍、0.5なら通常の0.5倍)
param_pch <- 20                        #点の形状を指定(詳細はこちらとか)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="deseq2", test.method="deseq2",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="deseq2", FDR=0.1)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
ranking <- rank(tcc$stat$p.value)      #p-valueでランキングした結果をrankingに格納

#ファイルに保存(M-A plot)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=0.00000000000001, xlim=c(-3, 13), ylim=c(-10, 10))#指定した閾値を満たすDEGをマゼンタ色にして描画
legend("bottomright", c(paste("Top ", param_DEG, "genes", sep=""), "Others"),#凡例を作成
       col=c(param_col, "black"), pch=20)#凡例を作成
obj <- as.logical(ranking <= param_DEG)#条件を満たすかどうかを判定した結果をobjに格納
points(result$a.value[obj], result$m.value[obj],#条件を満たす点をハイライト
       pch=param_pch, cex=param_cex, col=param_col)#条件を満たす点をハイライト
dev.off()                              #おまじない

#ファイルに保存
tmp <- cbind(rownames(tcc$count), tcc$count, result)#入力データの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

作図 | M-A plot | 応用 | ggplot2

ここではサンプルデータ2のSupplementaryTable2_changed.txtの 「G1群 5サンプル vs. G2群 5サンプル」の二群間比較データ(raw count; 特定の遺伝子領域にいくつリードがマップされたかをただカウントした数値データ) とTCCパッケージから生成したシミュレーションデータとを用いて2例を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. raw countのデータ

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_fig <- c(380, 420)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ggplot2)

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
colSums(data)

#前処理(データ正規化; 群ごとに総リード数の平均値を揃えている)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
hoge <- data[,data.cl==1]              #G1群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G1群の正規化係数を計算した結果をnfに格納
G1 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG1に格納
colSums(G1)                                                      #総リード数を表示
hoge <- data[,data.cl==2]              #G2群のデータのみ抽出している
nf <- mean(colSums(hoge))/colSums(hoge)#G2群の正規化係数を計算した結果をnfに格納
G2 <- sweep(hoge, 2, nf, "*")          #正規化係数を各列に掛けた結果をG2に格納
colSums(G2)                            #総リード数を表示

#ggplot2用のデータを整形
mean_G1 <- log2(apply(G1, 1, mean))
mean_G2 <- log2(apply(G2, 1, mean))
df <- data.frame(
    A = (mean_G1 + mean_G2) / 2,
    M = mean_G2 - mean_G1
)
head(df)

#ggplot2の描画レイヤーを描く
l <- ggplot(df, aes(x = A, y = M))     #x座標をdfのMEAN列に、y座標をdfのVARIANCEの列とする
l <- l + geom_point(size = 2, pch = 20, na.rm = T)#マーカーの形ををpch=20、サイズをcex=2で指定する
l <- l + xlab("A value")               #x軸ラベル
l <- l + ylab("M value")               #y軸ラベル

#本番(Mean-Variance plot; G1 and G2 両方)
plot(l)

#画像として保存する(Mean-Variance plot; G1 and G2 両方)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(l)                                #プロット
dev.off()                              #おまじない
	

2. シミュレーションデータ

TCCパッケージで生成される2群間比較用のシミュレーションデータを描きます。 シミュレーションデータの場合G1群で高発現しているDEG (DEG1)か、G2群で高発現しているDEG (DEG2)か、 non-DEGかわかっているため、それぞれ別々の色に塗ります。2021年9月5日に、実際にはDEG1とDEG2の塗分けができていないことの指摘や修正コードをいただいたので反映させました(Manon Makino氏提供情報)。

out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_fig <- c(380, 420)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)
library(ggplot2)

#MAプロット用のデータを生成する
tcc <- simulateReadCounts(replicates = c(param_G1, param_G2))#TCCパッケージの関数を利用してシミュレーションデータを生成する
ma <- plot(tcc)                        #TCCパッケージ中のplot関数を利用してMAプロットの座標を求める

#ggplot2用のデータを整形
tag <- tcc$simulation$trueDEG          #non-DEGが0、DEGが1となっているバイナリ情報を格納(色分けのための情報)
tag[1801:2000] <- 2                    #DEG内の色分け用(1をG1群で高発現DEG、2をG2群で高発現DEGとして使おうとしている)
tag[tag == 0] <- "non-DEG"             #ベクトルtagが0の要素を"non-DEG"に置換
tag[tag == 1] <- "DEG (G1)"            #ベクトルtagが1の要素を"DEG (G1)"に置換
tag[tag == 2] <- "DEG (G2)"            #ベクトルtagが2の要素を"DEG (G2)"に置換
df <- data.frame(
    A = ma$a.value,                    #横軸の値
    M = ma$m.value,                    #縦軸の値
    TYPE = as.factor(tag)              #"non-DEG" or "DEG (G1)" or "DEG (G2)"からなる因子ベクトル情報
)

#ggplot2の描画レイヤーを描く
l <- ggplot(df, aes(x = A, y = M))     #x座標をdfのMEAN列に、y座標をdfのVARIANCEの列とする
l <- l + geom_point(aes(colour = TYPE), size = 2, pch = 20, na.rm = T)#マーカーの形ををpch=20、サイズをcex=2で指定する
l <- l + xlab("A value")               #x軸ラベル
l <- l + ylab("M value")               #y軸ラベル

#本番(Mean-Variance plot; G1 and G2 両方)
plot(l)

#画像として保存する(Mean-Variance plot; G1 and G2 両方)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(l)                                #プロット
dev.off()                              #おまじない
	

3. シミュレーションデータ

例題2と基本的に同じですが、プロットしたときにnon-DEGが後に描画される(これが例題2)のではなく、 DEGが後に描画されるようにデータを並べ替える操作を行った版です(Manon Makino氏提供情報)。

out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_G1 <- 5                          #G1群(kidney)のサンプル数を指定
param_G2 <- 5                          #G2群(liver)のサンプル数を指定
param_fig <- c(380, 420)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)
library(ggplot2)

#MAプロット用のデータを生成する
tcc <- simulateReadCounts(replicates = c(param_G1, param_G2))#TCCパッケージの関数を利用してシミュレーションデータを生成する
ma <- plot(tcc)                        #TCCパッケージ中のplot関数を利用してMAプロットの座標を求める

#ggplot2用のデータを整形
tag <- tcc$simulation$trueDEG          #non-DEGが0、DEGが1となっているバイナリ情報を格納(色分けのための情報)
tag[1801:2000] <- 2                    #DEG内の色分け用(1をG1群で高発現DEG、2をG2群で高発現DEGとして使おうとしている)
tag[tag == 0] <- "non-DEG"             #ベクトルtagが0の要素を"non-DEG"に置換
tag[tag == 1] <- "DEG (G1)"            #ベクトルtagが1の要素を"DEG (G1)"に置換
tag[tag == 2] <- "DEG (G2)"            #ベクトルtagが2の要素を"DEG (G2)"に置換
df <- data.frame(
    A = ma$a.value,                    #横軸の値
    M = ma$m.value,                    #縦軸の値
    TYPE = as.factor(tag)              #"non-DEG" or "DEG (G1)" or "DEG (G2)"からなる因子ベクトル情報
)
df <- rbind(df[df$TYPE=='non-DEG',],   #並べ替え
    df[df$TYPE=='DEG (G1)',],          #並べ替え
    df[df$TYPE=='DEG (G2)',])          #並べ替え

#ggplot2の描画レイヤーを描く
l <- ggplot(df, aes(x = A, y = M))     #x座標をdfのMEAN列に、y座標をdfのVARIANCEの列とする
l <- l + geom_point(aes(colour = TYPE), size = 2, pch = 20, na.rm = T)#マーカーの形ををpch=20、サイズをcex=2で指定する
l <- l + xlab("A value")               #x軸ラベル
l <- l + ylab("M value")               #y軸ラベル

#本番(Mean-Variance plot; G1 and G2 両方)
plot(l)

#画像として保存する(Mean-Variance plot; G1 and G2 両方)
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(l)                                #プロット
dev.off()                              #おまじない
	

作図 | クラスタリング | について

遺伝子発現行列のような数値行列を入力として、類似した発現パターンを示す列(サンプル)をまとめた結果を描画するやり方ですが、 基本的に、「解析 | クラスタリング | ...」のほうをご覧ください。

R用:

R以外:

作図 | クラスタリング | サンプル間 | TCC(Sun_2013)

TCCパッケージ中の clusterSample関数を利用したサンプル間クラスタリング結果をいろいろ整形するやり方を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 59,857 genes×6 samplesのリアルデータ(srp017142_count_bowtie.txt; 3 proliferative samples vs. 3 Ras samples)の場合:

Neyret-Kahn et al., Genome Res., 2013の2群間比較用ヒトRNA-seqカウントデータです。 パイプライン | ゲノム | 発現変動 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013)から得られます。

in_f <- "srp017142_count_bowtie.txt"   #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

2. 59,857 genes×6 samplesのリアルデータ(srp017142_count_bowtie.txt; 3 proliferative samples vs. 3 Ras samples)の場合:

1.との違いはplot関数実行時のオプションの部分のみです。下のほうの「hclust(*, "average")」という文字が消えていることが分かります。

in_f <- "srp017142_count_bowtie.txt"   #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, sub="")                      #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

3. 59,857 genes×6 samplesのリアルデータ(srp017142_count_bowtie.txt; 3 proliferative samples vs. 3 Ras samples)の場合:

2.との違いはplot関数実行時のオプションの部分のみです。下のほうの「d」という文字が消えていることが分かります。

in_f <- "srp017142_count_bowtie.txt"   #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, sub="", xlab="")             #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

4. 59,857 genes×6 samplesのリアルデータ(srp017142_count_bowtie.txt; 3 proliferative samples vs. 3 Ras samples)の場合:

3.との違いはplot関数実行時のオプションの部分のみです。表示されているy軸名「Height」の文字の大きさを通常の1.5倍にしています。

in_f <- "srp017142_count_bowtie.txt"   #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, sub="", xlab="", cex.lab=1.5)#樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

5. 59,857 genes×6 samplesのリアルデータ(srp017142_count_bowtie.txt; 3 proliferative samples vs. 3 Ras samples)の場合:

4.との違いはplot関数実行時のオプションの部分のみです。 表示されているy軸名「Height」の文字の大きさを通常の0.6倍にし、入力ファイル中のサンプル名の文字の大きさを通常の1.3倍にしています。

in_f <- "srp017142_count_bowtie.txt"   #入力ファイル名を指定してin_fに格納
out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, sub="", xlab="", cex.lab=0.6, cex=1.3)#樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

6. 59,857 genes×6 samplesのリアルデータ(srp017142_count_bowtie.txt; 3 proliferative samples vs. 3 Ras samples)の場合:

5.との違いはplot関数実行時のオプションの部分のみです。 y軸名を通常の1.2倍の「height kamo」に、そして図の上のほうのタイトル名が表示されないようにしてます。

in_f <- "srp017142_count_bowtie.txt"   #入力ファイル名を指定してin_fに格納
out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, sub="", xlab="", cex.lab=1.2,#樹形図(デンドログラム)の表示
  cex=1.3, main="", ylab="height kamo")#樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

7. 59,857 genes×6 samplesのリアルデータ(srp017142_count_bowtie.txt; 3 proliferative samples vs. 3 Ras samples)の場合:

6.との違いはpar関数部分のみです。図の上下の余白を狭くして、図の左側のみ4行分空け、それ以外を1行分だけ開けるように指定しています。

in_f <- "srp017142_count_bowtie.txt"   #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(1, 4, 1, 1))                 #下、左、上、右の順で余白(行)を指定
plot(out, sub="", xlab="", cex.lab=1.2,#樹形図(デンドログラム)の表示
  cex=1.3, main="", ylab="height kamo")#樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

8. 59,857 genes×6 samplesのリアルデータ(srp017142_count_bowtie.txt; 3 proliferative samples vs. 3 Ras samples)の場合:

7.との違いはpar関数実行時のオプションの部分のみです。 図の上下の余白を狭くして、図の左側のみ4行分、上を1行分空け、下と右を0行分だけ開けるように指定しています。

in_f <- "srp017142_count_bowtie.txt"   #入力ファイル名を指定してin_fに格納
out_f <- "hoge8.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(0, 4, 1, 0))                 #下、左、上、右の順で余白(行)を指定
plot(out, sub="", xlab="", cex.lab=1.2,#樹形図(デンドログラム)の表示
  cex=1.3, main="", ylab="height kamo")#樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

9. 59,857 genes×6 samplesのリアルデータ(srp017142_count_bowtie.txt; 3 proliferative samples vs. 3 Ras samples)の場合:

8.との違いはpar関数実行時のオプションの部分のみです。 縦軸(y軸)の範囲はデフォルトでよきに計らってくれるので、8の結果から0.06未満であることがわかりますが、 ylim=c(0, 0.2)で縦軸の範囲を0から0.2と明示的に指定していますがうまく反映されないようです(爆)。

in_f <- "srp017142_count_bowtie.txt"   #入力ファイル名を指定してin_fに格納
out_f <- "hoge9.png"                   #出力ファイル名を指定してout_fに格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#本番
out <- clusterSample(data, dist.method="spearman",#クラスタリング実行結果をoutに格納
            hclust.method="average", unique.pattern=TRUE)#クラスタリング実行結果をoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(0, 4, 1, 0))                 #下、左、上、右の順で余白(行)を指定
plot(out, sub="", xlab="", cex.lab=1.2,#樹形図(デンドログラム)の表示
  cex=1.3, main="", ylab="height kamo",#樹形図(デンドログラム)の表示
  ylim=c(0.0, 0.2))                      #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

作図 | ROC曲線 | について

ROC曲線(Receiver Operating Characteristic Curve)を描くパッケージです。バイオインフォマティクス分野では、 特にシミュレーションデータの性能評価指標の1つとして、ROC曲線の下部面積(Area Under the ROC curve)が使われます。

R用:

R以外:

作図 | ROC曲線 | 基礎 | 1. 感覚をつかむ

発現変動解析の手法比較系(バイオインフォマティクス系)の論文では、「真の発現変動遺伝子(true DEGs)」を予め決めておき、 どのDEG検出法が「真の発現変動遺伝子」をより上位にすることができるかを示す指標として、 「ROC曲線の下部面積(Area Under the ROC curve; AUC)」で方法の比較を行っています。このAUC値を計算するための基礎情報がROC曲線です。 必要な情報は2つのベクトルです。1つは何らかのランキング法を用いて発現変動の度合いで遺伝子をランキングした順位情報、 そしてもう1つはどの遺伝子が「真の発現変動遺伝子」かを示す0 or 1の情報です。 この項目では、全部で10遺伝子(gene1, gene2, ..., gene10)、そのうちgene1, 3, 5が真のDEGsという仮定で、様々なランキング結果でのROC曲線とAUC値、 および範囲を限定したAUC値(partial AUC)を考えます。 ここでは、ROC曲線の「横軸を"1-specificity"、縦軸を"sensitivity"」としていますが、同じ意味なので「横軸を"False Positive Rate (FPR)"、縦軸を"True Positive Rate (TPR)"」としてもよいです。

「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。

1. 真のDEGsに相当するgene1が2位、gene3が3位、gene5が1位の場合:

DEGsとnon-DEGsを完璧に区別できている理想的なランキング結果(AUC = 1)の例です。 param_rankで指定する際に1, 3, 5番目の要素のところのいずれかが1, 2, 3となっていればいいです。

out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(2, 8, 3, 7, 1, 10, 5, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, xlab="1-specificity", ylab="sensitivity", main="ROC curve")#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない

#AUC値を計算(高いほどよい方法)
AUC(out)                               #AUC計算
	

2. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

現実によく見かけるROC曲線やAUC値(=0.857)の一例です。

out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, xlab="1-specificity", ylab="sensitivity", main="ROC curve")#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない

#AUC値を計算(高いほどよい方法)
AUC(out)                               #AUC計算
	

3. 真のDEGsに相当するgene1が2位、gene3が4位、gene5が3位の場合:

2.と同じAUC値(=0.857)ですが、ROC曲線が異なります。

out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(2, 8, 4, 7, 3, 10, 5, 1, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, xlab="1-specificity", ylab="sensitivity", main="ROC curve")#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない

#AUC値を計算(高いほどよい方法)
AUC(out)                               #AUC計算
	

4. 真のDEGsに相当するgene1が2位、gene3が6位、gene5が1位の場合:

2.と同じAUC値(=0.857)ですが、ROC曲線が異なります。

out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(2, 8, 6, 7, 1, 10, 5, 4, 9, 3)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, xlab="1-specificity", ylab="sensitivity", main="ROC curve")#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない

#AUC値を計算(高いほどよい方法)
AUC(out)                               #AUC計算
	

5. 真のDEGsに相当するgene1が2位、gene3が6位、gene5が1位の場合:

4.と同じですが、x軸が全範囲のfull AUC値(=0.857)だけでなく、param_thresで指定した範囲までに限定したpartial AUC値(=0.13333)も計算しています。

out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(2, 8, 6, 7, 1, 10, 5, 4, 9, 3)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_thres <- 0.2                     #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, xlab="1-specificity", ylab="sensitivity", main="ROC curve")#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない

#AUC値を計算(高いほどよい方法)
AUC(out)                               #AUC値を計算(x軸が[0, 1]の全範囲)
pAUC(out, t0 = param_thres)            #partial AUC値を計算(x軸が[0, t0]の範囲)
	

6. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が10位の場合:

3つのDEGの平均順位が(1+5+10)/3 = 5.33位、7つのnon-DEGの平均順位が(2+3+4+6+7+8+9)/7 = 5.57位であることからも、full AUC値(=0.5238)が0.5付近にあることの妥当性が分かります。

out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 10, 2, 6, 4, 9, 3)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_thres <- 0.2                     #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, xlab="1-specificity", ylab="sensitivity", main="ROC curve")#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない

#AUC値を計算(高いほどよい方法)
AUC(out)                               #AUC値を計算(x軸が[0, 1]の全範囲)
pAUC(out, t0 = param_thres)            #partial AUC値を計算(x軸が[0, t0]の範囲)
	

7. 真のDEGsに相当するgene1が8位、gene3が9位、gene5が10位の場合:

DEG検出を行っているつもりで、全non-DEGsが上位を占めている最悪のランキング結果(AUC = 0)の例です。 通常はこのようなことは起こりません。解析手順が間違っていると考えるのが妥当です。

out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(8, 1, 9, 7, 10, 2, 6, 4, 5, 3)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_thres <- 0.2                     #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, xlab="1-specificity", ylab="sensitivity", main="ROC curve")#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない

#AUC値を計算(高いほどよい方法)
AUC(out)                               #AUC値を計算(x軸が[0, 1]の全範囲)
pAUC(out, t0 = param_thres)            #partial AUC値を計算(x軸が[0, t0]の範囲)
	

8. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

2.と基本的に同じで、ROC曲線の図を描くための感度(sensitivity)と特異度(specificity)の元の数値情報をテキストファイル形式で取得する例です。

out_f1 <- "hoge8.txt"                   #出力ファイル名を指定してout_f1に格納
out_f2 <- "hoge8.png"                   #出力ファイル名を指定してout_f2に格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(1 - out@spec, out@sens)   #保存したい情報をtmpに格納
tmp <- tmp[order(tmp[, 1]), ]          #1列目の数値が低い順にソート
colnames(tmp) <- c("1-sensitivity", "specificity")#列名を追加
write.table(tmp, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#ファイルに保存(pngファイル)
png(out_f2, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, xlab="1-specificity", ylab="sensitivity", main="ROC curve")#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない

#AUC値を計算(高いほどよい方法)
AUC(out)                               #AUC計算
	

作図 | ROC曲線 | 基礎 | 2. 色を自在に変える(col)

「基礎1」では、主にDEGの順位情報を変えて、ROC曲線やAUC値がどのように変わっていくのかを中心に述べました。 この項目では、プロットの色、軸の数値の色、タイトル、x軸やy軸ラベルの色を様々な手段で指定するやり方を示します。 全部で10遺伝子(gene1, gene2, ..., gene10)、そのうちgene1, 3, 5が真のDEGsという仮定はそのままです。 R Console画面上で「?par」と打つとplot関数実行時に利用可能なオプションを調べることができます。

「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。

1. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

ROC曲線の色を赤色("red")で指定しています。デフォルトは"black"で、"green", "blue", "orange", "yellow", "gray"などが指定できます。 R Console画面上で「colors()」と打つと、指定可能な色名をリストアップできます。 実際の色も同時に調べたい場合は「demo("colors")」と打ち込めばよい。

out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "red"                     #色を指定

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, xlab="1-specificity", ylab="sensitivity",#描画
     main="ROC curve", col=param_col)  #描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

2. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

色を数値で表しています。黒("black", 1), 赤("red", 2), 緑("green3", 3), 青("blue", 4), シアン("cyan", 5), マゼンタ("magenta", 6), 黄色("yellow", 7), 灰色("gray", 8)です。 R Console画面上で「palette()」と打つと、色名と要素番号の対応関係がわかりますが、8までで終わりなようです。

out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- 7                         #色を指定

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, xlab="1-specificity", ylab="sensitivity",#描画
     main="ROC curve", col=param_col)  #描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

3. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

色をRGB (red, green, blue)の0-255の数値で指定するやり方です。 黒(0, 0, 0), 赤(255, 0, 0), 緑(0, 255, 0), 青(0, 0, 255), 黄色(255, 255, 0), マゼンタ(255, 0, 255), シアン(0, 255, 255), 白(255, 255, 255)です。 例えば、灰色でも(20, 0, 0)とすれば白に近い色となり、(200, 0, 0)とすれば黒に近い色になります。 黄緑色は黄色と緑の中間なので(123, 255, 0)、オレンジ色は赤と黄色の中間なので(255, 123, 0)のような感じで表現できます。 RGBで指定するときは、param_colの箇所以外にも、plot関数中のcolオプションのところの記述形式も変える必要がありますのでご注意ください。

out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- c(255, 123, 0)            #色を指定

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, xlab="1-specificity",        #描画
     ylab="sensitivity",               #描画
     main="ROC curve",                 #描画
     col=rgb(param_col[1], param_col[2], param_col[3], max=255))#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

4. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

ROC曲線の色をオレンジ色("orange")で指定しています。 それ以外にも、軸(col.axisオプション)、x軸とy軸のラベル(col.lab)、メインタイトル(col.main)、 ここでは出ていませんが図の下のほうにあるサブタイトル(col.sub)の色も任意に与えることができます。

out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "orange"                  #色を指定(ROC曲線)
param_col_axis <- "blue"               #色を指定(軸)
param_col_lab <- "cyan"                #色を指定(x, y軸ラベル)
param_col_main <- "magenta"            #色を指定(メインタイトル)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out,                              #描画
    main="ROC curve", col.main=param_col_main,#描画
    xlab="1-specificity", ylab="sensitivity",#描画
    col.lab=param_col_lab,             #描画
    col.axis=param_col_axis,           #描画
    col=param_col)                     #描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

作図 | ROC曲線 | 基礎 | 3. 形や大きさを変える(cex, lwd, lty)

この項目では、プロット(cex)、軸の数値(cex.axis)、メインタイトル(cex.main)、x軸やy軸ラベル(cex.lab)、 サブタイトル(cex.sub)についての大きさの倍率を指定するやり方を示します。 基本的には1.0が通常の大きさで、0.5だと通常の0.5倍、 1.7だと通常の1.7倍の大きさで描画してくれます。 文字関連の大きさ調整を行うcexの他に、線分の幅を指定するlwd、線分の種類(実線やダッシュなど)を指定するltyの指定も行います。 全部で10遺伝子(gene1, gene2, ..., gene10)、そのうちgene1, 3, 5が真のDEGsという仮定はそのままです。 R Console画面上で「?par」と打つとplot関数実行時に利用可能なオプションを調べることができます。

「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。

1. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

param_colでROC曲線の色をオレンジ色("orange")で指定している他、 軸(cex.axisオプション)、x軸とy軸のラベル(cex.lab)、メインタイトル(cex.main)、 ここでは出ていませんが図の下のほうにあるサブタイトル(cex.sub)の大きさも任意に与えることができます。 尚、以下のparam_cexは実際には機能していません。理由はここではROC曲線の線のみであり、 param_cexはプロット中のtextやsymbolの大きさを指定するものだからです。

out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "orange"                  #色を指定(ROC曲線)
param_cex <- 2.0                       #倍率を指定(ROC曲線)
param_cex_axis <- 1.2                  #倍率を指定(軸の数値)
param_cex_lab <- 0.7                   #倍率を指定(x, y軸ラベル)
param_cex_main <- 2.3                  #倍率を指定(メインタイトル)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out,                              #描画
    main="ROC curve", cex.main=param_cex_main,#描画
    xlab="1-specificity", ylab="sensitivity",#描画
    cex.lab=param_cex_lab,             #描画
    cex.axis=param_cex_axis,           #描画
    cex=param_cex, col=param_col)      #描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

2. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

ROC曲線の線分の幅を指定するlwdオプションの数値を変更しています。おそらくここで指定している数値は倍率に相当するものです。

out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "orange"                  #色を指定(ROC曲線)
param_lwd <- 2.5                       #線分の幅を指定(ROC曲線)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, main="ROC curve",            #描画
    xlab="1-specificity", ylab="sensitivity",#描画
    lwd=param_lwd, col=param_col)      #描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

3. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

ROC曲線の線分の種類をltyオプションで指定しています。colオプション同様、数値でも文字でも指定可能です。 実線("solid", 1), ダッシュ("dashed", 2), ドット("dotted", 3)あたりが基本だと思います。 他にも、透明("blank", 0), ドットとダッシュ両方("dotdash", 4), ("longdash", 5), ("twodash", 6)などがあります。 以下の例はロングダッシュを数値で指定しています。

out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "orange"                  #色を指定(ROC曲線)
param_lwd <- 4.6                       #線分の幅を指定(ROC曲線)
param_lty <- 5                         #線分の種類を指定(ROC曲線)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, main="ROC curve",            #描画
    xlab="1-specificity", ylab="sensitivity",#描画
    lwd=param_lwd, col=param_col, lty=param_lty)#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

4. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

ROC曲線の線分の種類をltyオプションで指定しています。colオプション同様、数値でも文字でも指定可能です。 実線("solid", 1), ダッシュ("dashed", 2), ドット("dotted", 3)あたりが基本だと思います。 他にも、透明("blank", 0), ドットとダッシュ両方("dotdash", 4), ("longdash", 5), ("twodash", 6)などがあります。 以下の例は色を"blue"、幅を2.0、種類を"dashed"にしています。

out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "blue"                    #色を指定(ROC曲線)
param_lwd <- 2.0                       #線分の幅を指定(ROC曲線)
param_lty <- "dashed"                  #線分の種類を指定(ROC曲線)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, main="ROC curve",            #描画
    xlab="1-specificity", ylab="sensitivity",#描画
    lwd=param_lwd, col=param_col, lty=param_lty)#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

作図 | ROC曲線 | 基礎 | 4. 軸ラベルやタイトルを消す(ann, axes)

この項目では、図の重ね書き時に必要なテクニックとして、annとaxesオプションの挙動を示します。

「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。

1. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

param_colでROC曲線の色を赤色("red")、線分の幅を1.5倍、 線分の種類を実線("solid")で示す他に、main, xlab, and ylabオプションを明記しなかった場合の結果を示しています。

out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "red"                     #色を指定(ROC曲線)
param_lwd <- 1.5                       #線分の幅を指定(ROC曲線)
param_lty <- "solid"                   #線分の種類を指定(ROC曲線)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out,                              #描画
    lwd=param_lwd, col=param_col, lty=param_lty)#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

2. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

plot関数実行時に、ann=Fオプションをつけるとxlabやylabを指定していても無視されることがわかります。

out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "red"                     #色を指定(ROC曲線)
param_lwd <- 1.5                       #線分の幅を指定(ROC曲線)
param_lty <- "solid"                   #線分の種類を指定(ROC曲線)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, ann=F,                       #描画
    xlab="1-specificity", ylab="sensitivity",#描画
    lwd=param_lwd, col=param_col, lty=param_lty)#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

3. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

メインタイトルのみ表示させたい場合のやり方です。

out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "red"                     #色を指定(ROC曲線)
param_lwd <- 1.5                       #線分の幅を指定(ROC曲線)
param_lty <- "solid"                   #線分の種類を指定(ROC曲線)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, main="ROC curve",            #描画
    xlab="", ylab="",                  #描画
    lwd=param_lwd, col=param_col, lty=param_lty)#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

4. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

axes=Fとすると軸ラベルの数値が消えます。

out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "red"                     #色を指定(ROC曲線)
param_lwd <- 1.5                       #線分の幅を指定(ROC曲線)
param_lty <- "solid"                   #線分の種類を指定(ROC曲線)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, main="ROC curve", axes=F,    #描画
    xlab="1-specificity", ylab="sensitivity",#描画
    lwd=param_lwd, col=param_col, lty=param_lty)#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

作図 | ROC曲線 | 基礎 | 5. 軸ラベルの表示角度を変える(las)

この項目では、軸ラベルの表示角度を指定するlasオプションを示します。

「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。

1. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

las=0はデフォルト(ラベルを各軸に対して平行に描く)なので特に指定しないときと比べて変化はありません。

out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "red"                     #色を指定(ROC曲線)
param_lwd <- 1.5                       #線分の幅を指定(ROC曲線)
param_lty <- "solid"                   #線分の種類を指定(ROC曲線)
param_las <- 0                         #lasオプションの数値を指定(0, 1, 2, 3のどれか)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, main="ROC curve", las=param_las,#描画
    xlab="1-specificity", ylab="sensitivity",#描画
    lwd=param_lwd, col=param_col, lty=param_lty)#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

2. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

las=1とすると、ラベルを全て水平に描くことができます。この場合、y軸の数値が時計回りに90度回っていることが分かります。

out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "red"                     #色を指定(ROC曲線)
param_lwd <- 1.5                       #線分の幅を指定(ROC曲線)
param_lty <- "solid"                   #線分の種類を指定(ROC曲線)
param_las <- 1                         #lasオプションの数値を指定(0, 1, 2, 3のどれか)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, main="ROC curve", las=param_las,#描画
    xlab="1-specificity", ylab="sensitivity",#描画
    lwd=param_lwd, col=param_col, lty=param_lty)#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

3. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

las=2とすると、ラベルを各軸に対して垂直に描くことができます。特にx軸上のラベルを垂直に描けるので全て表示させたい場合に重宝します。

out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "red"                     #色を指定(ROC曲線)
param_lwd <- 1.5                       #線分の幅を指定(ROC曲線)
param_lty <- "solid"                   #線分の種類を指定(ROC曲線)
param_las <- 2                         #lasオプションの数値を指定(0, 1, 2, 3のどれか)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, main="ROC curve", las=param_las,#描画
    xlab="1-specificity", ylab="sensitivity",#描画
    lwd=param_lwd, col=param_col, lty=param_lty)#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

4. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

las=3とすると、ラベルを全て垂直に描くことができます。

out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "red"                     #色を指定(ROC曲線)
param_lwd <- 1.5                       #線分の幅を指定(ROC曲線)
param_lty <- "solid"                   #線分の種類を指定(ROC曲線)
param_las <- 3                         #lasオプションの数値を指定(0, 1, 2, 3のどれか)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out, main="ROC curve", las=param_las,#描画
    xlab="1-specificity", ylab="sensitivity",#描画
    lwd=param_lwd, col=param_col, lty=param_lty)#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

作図 | ROC曲線 | 基礎 | 6. 余白を変える(mar)

この項目では、図の余白を指定するpar関数内で用いるmarオプションを示します。 「下、左、上、右」の順で余白を指定します。単位は「行」で、0が最も余白が小さく、大体5程度が最大です。 私の通常の使い方は「左以外は0に近い数値にする」です。

「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。

1. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

左側以外の余白を0行にした例です。上側のメインタイトル(ROC curveの文字)が切れていることが分かります。 また、下側の軸ラベルや軸タイトルも余白の関係上消えていることがわかります。

out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "red"                     #色を指定(ROC曲線)
param_lwd <- 1.5                       #線分の幅を指定(ROC曲線)
param_lty <- "solid"                   #線分の種類を指定(ROC曲線)
param_las <- 0                         #lasオプションの数値を指定(0, 1, 2, 3のどれか)
param_mar <- c(0, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(out, main="ROC curve", las=param_las,#描画
    xlab="1-specificity", ylab="sensitivity",#描画
    lwd=param_lwd, col=param_col, lty=param_lty)#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

2. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

左側の余白を4行、下側の余白を2行にした例です。main=""として上側のメインタイトルの文字も消しています。 下側の余白が2行では、x軸タイトルの表示スペースがないことがわかります。

out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "red"                     #色を指定(ROC曲線)
param_lwd <- 1.5                       #線分の幅を指定(ROC曲線)
param_lty <- "solid"                   #線分の種類を指定(ROC曲線)
param_las <- 0                         #lasオプションの数値を指定(0, 1, 2, 3のどれか)
param_mar <- c(2, 4, 0, 0)             #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(out, main="", las=param_las,      #描画
    xlab="1-specificity", ylab="sensitivity",#描画
    lwd=param_lwd, col=param_col, lty=param_lty)#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

3. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

左側の余白を4行、下側の余白を4行、それ以外の余白を0.5行にした例です。小数点の数値も指定できるようですね。

out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- "red"                     #色を指定(ROC曲線)
param_lwd <- 1.5                       #線分の幅を指定(ROC曲線)
param_lty <- "solid"                   #線分の種類を指定(ROC曲線)
param_las <- 0                         #lasオプションの数値を指定(0, 1, 2, 3のどれか)
param_mar <- c(4, 4, 0.5, 0.5)         #下、左、上、右の順で余白を指定(単位は行)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=param_mar)                     #余白を指定
plot(out, main="", las=param_las,      #描画
    xlab="1-specificity", ylab="sensitivity",#描画
    lwd=param_lwd, col=param_col, lty=param_lty)#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

4. 真のDEGsに相当するgene1が5位、gene3が1位、gene5が3位の場合:

3.と同じです、私の普段使いでは、図のパラメータはこのようにそのまま書いちゃいます。

out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank))      #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番
out <- rocdemo.sca(truth = obj, data = -param_rank)#ROC曲線描画用の形式にしてoutに格納

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(4, 4, 0.5, 0.5))             #下、左、上、右の順で余白を指定(単位は行)
plot(out, main="", las=0,              #描画
    xlab="1-specificity", ylab="sensitivity",#描画
    lwd=1.5, col="red", lty="solid")   #描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

作図 | ROC曲線 | 基礎 | 7. 図の重ね書き(new)

この項目では、図の重ね書き時に指定するpar関数内で用いるnewオプションを示します。 基本的には、par(new=T)を書くだけです。 ここでは、ランキング結果1の数値ベクトルがc(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)、 ランキング結果2がc(3, 1, 6, 2, 5, 10, 7, 4, 9, 8)、 ランキング結果3がc(4, 8, 1, 3, 2, 10, 7, 5, 9, 6) として2つのランキング結果の重ね合わせや3つの結果の重ね合わせの例を示します。

「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し以下をコピペ。

1. 2つのランキング結果の重ね書きを行う場合:

ランキング結果1("red")とランキング結果2("blue")の重ね合わせの基本形です。

out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank1 <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_rank2 <- c(3, 1, 6, 2, 5, 10, 7, 4, 9, 8)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank1))     #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番(ランキング結果ごとの感度・特異度情報を取得)
out1 <- rocdemo.sca(truth = obj, data = -param_rank1)#ROC曲線描画用の形式にしてout1に格納(ランキング結果1)
out2 <- rocdemo.sca(truth = obj, data = -param_rank2)#ROC曲線描画用の形式にしてout2に格納(ランキング結果2)
AUC(out1)                              #AUC値を表示(ランキング結果1)
AUC(out2)                              #AUC値を表示(ランキング結果2)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out1, axes=F, ann=F, col="red")   #軸の数値情報およびラベル情報を描画しない(axes=Fとann=F)設定にして描画(ランキング結果1)
par(new=T)                             #上書きします、という宣言
plot(out2, col="blue")                 #描画(ランキング結果2)
dev.off()                              #おまじない
	

2. 2つのランキング結果の重ね書きを行う場合:

x軸、y軸ラベル情報とグリッドを追加しています。

out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank1 <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_rank2 <- c(3, 1, 6, 2, 5, 10, 7, 4, 9, 8)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank1))     #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番(ランキング結果ごとの感度・特異度情報を取得)
out1 <- rocdemo.sca(truth = obj, data = -param_rank1)#ROC曲線描画用の形式にしてout1に格納(ランキング結果1)
out2 <- rocdemo.sca(truth = obj, data = -param_rank2)#ROC曲線描画用の形式にしてout2に格納(ランキング結果2)
AUC(out1)                              #AUC値を表示(ランキング結果1)
AUC(out2)                              #AUC値を表示(ランキング結果2)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out1, axes=F, ann=F, col="red")   #軸の数値情報およびラベル情報を描画しない(axes=Fとann=F)設定にして描画(ランキング結果1)
par(new=T)                             #上書きします、という宣言
plot(out2, col="blue",                 #描画(ランキング結果2)
    xlab="1-specificity", ylab="sensitivity")#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

3. 2つのランキング結果の重ね書きを行う場合:

図の余白を指定しているほか、lwdで線分の幅をランキング結果1(3.9倍)とランキング結果2(2.3倍)でそれぞれ指定しています。

out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank1 <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_rank2 <- c(3, 1, 6, 2, 5, 10, 7, 4, 9, 8)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank1))     #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番(ランキング結果ごとの感度・特異度情報を取得)
out1 <- rocdemo.sca(truth = obj, data = -param_rank1)#ROC曲線描画用の形式にしてout1に格納(ランキング結果1)
out2 <- rocdemo.sca(truth = obj, data = -param_rank2)#ROC曲線描画用の形式にしてout2に格納(ランキング結果2)
AUC(out1)                              #AUC値を表示(ランキング結果1)
AUC(out2)                              #AUC値を表示(ランキング結果2)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(4, 4, 0.3, 0.3))             #下、左、上、右の順で余白を指定(単位は行)
plot(out1, axes=F, ann=F,              #軸の数値情報およびラベル情報を描画しない(axes=Fとann=F)設定にして描画(ランキング結果1)
    col="red", lwd=3.9)                #軸の数値情報およびラベル情報を描画しない(axes=Fとann=F)設定にして描画(ランキング結果1)
par(new=T)                             #上書きします、という宣言
plot(out2, col="blue", lwd=2.3,        #描画(ランキング結果2)
    xlab="1-specificity", ylab="sensitivity")#描画
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

4. 3つのランキング結果の重ね書きを行う場合:

ランキング結果1("red")とランキング結果2("blue")とランキング結果3("magenta")の重ね合わせの基本形です。

out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank1 <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_rank2 <- c(3, 1, 6, 2, 5, 10, 7, 4, 9, 8)#gene1, 2, ..., 10の並びで順位情報を指定
param_rank3 <- c(4, 8, 1, 3, 2, 10, 7, 5, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank1))     #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番(ランキング結果ごとの感度・特異度情報を取得)
out1 <- rocdemo.sca(truth = obj, data = -param_rank1)#ROC曲線描画用の形式にしてout1に格納(ランキング結果1)
out2 <- rocdemo.sca(truth = obj, data = -param_rank2)#ROC曲線描画用の形式にしてout2に格納(ランキング結果2)
out3 <- rocdemo.sca(truth = obj, data = -param_rank3)#ROC曲線描画用の形式にしてout3に格納(ランキング結果3)
AUC(out1)                              #AUC値を表示(ランキング結果1)
AUC(out2)                              #AUC値を表示(ランキング結果2)
AUC(out3)                              #AUC値を表示(ランキング結果3)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out1, axes=F, ann=F, col="red")   #軸の数値情報およびラベル情報を描画しない(axes=Fとann=F)設定にして描画(ランキング結果1)
par(new=T)                             #上書きします、という宣言
plot(out2, axes=F, ann=F, col="blue")  #軸の数値情報およびラベル情報を描画しない(axes=Fとann=F)設定にして描画(ランキング結果2)
par(new=T)                             #上書きします、という宣言
plot(out3, col="magenta")              #描画(ランキング結果3)
dev.off()                              #おまじない
	

5. 3つのランキング結果の重ね書きを行う場合:

図の余白、ltyで線分の種類、lwdで線分の幅などいろいろ指定しています。

out_f <- "hoge5.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank1 <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_rank2 <- c(3, 1, 6, 2, 5, 10, 7, 4, 9, 8)#gene1, 2, ..., 10の並びで順位情報を指定
param_rank3 <- c(4, 8, 1, 3, 2, 10, 7, 5, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank1))     #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番(ランキング結果ごとの感度・特異度情報を取得)
out1 <- rocdemo.sca(truth = obj, data = -param_rank1)#ROC曲線描画用の形式にしてout1に格納(ランキング結果1)
out2 <- rocdemo.sca(truth = obj, data = -param_rank2)#ROC曲線描画用の形式にしてout2に格納(ランキング結果2)
out3 <- rocdemo.sca(truth = obj, data = -param_rank3)#ROC曲線描画用の形式にしてout3に格納(ランキング結果3)
AUC(out1)                              #AUC値を表示(ランキング結果1)
AUC(out2)                              #AUC値を表示(ランキング結果2)
AUC(out3)                              #AUC値を表示(ランキング結果3)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(4, 4, 0, 0))                 #下、左、上、右の順で余白を指定(単位は行)
plot(out1, axes=F, ann=F,              #描画(ランキング結果1)
     col="red", lwd=2.0, lty="dotted") #描画(ランキング結果1)
par(new=T)                             #上書きします、という宣言
plot(out2, axes=F, ann=F,              #描画(ランキング結果2)
col="blue", lwd=3.0, lty="dashed")     #描画(ランキング結果2)
par(new=T)                             #上書きします、という宣言
plot(out3, col="magenta",              #描画(ランキング結果3)
     lwd=1.0, lty="solid",             #描画(ランキング結果3)
     xlab="1-specificity", ylab="sensitivity")#描画(ランキング結果3)
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

6. 3つのランキング結果の重ね書きを行う場合:

5.と基本的に同じです。このくらいの数になってくるとparamのところで最初に書き込んでおくほうがミスが少なくなります。 cex.lab=1.5は軸ラベルの文字の大きさを通常の1.5倍にするという意味です。

out_f <- "hoge6.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_rank1 <- c(5, 8, 1, 7, 3, 10, 2, 4, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_rank2 <- c(3, 1, 6, 2, 5, 10, 7, 4, 9, 8)#gene1, 2, ..., 10の並びで順位情報を指定
param_rank3 <- c(4, 8, 1, 3, 2, 10, 7, 5, 9, 6)#gene1, 2, ..., 10の並びで順位情報を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- c("red", "blue", "magenta")#色を指定(ROC曲線)
param_lwd <- c(2.0, 3.0, 1.0)          #線分の幅を指定(ROC曲線)
param_lty <- c("dotted", "dashed", "solid")#線分の種類を指定(ROC曲線)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank1))     #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番(ランキング結果ごとの感度・特異度情報を取得)
out1 <- rocdemo.sca(truth = obj, data = -param_rank1)#ROC曲線描画用の形式にしてout1に格納(ランキング結果1)
out2 <- rocdemo.sca(truth = obj, data = -param_rank2)#ROC曲線描画用の形式にしてout2に格納(ランキング結果2)
out3 <- rocdemo.sca(truth = obj, data = -param_rank3)#ROC曲線描画用の形式にしてout3に格納(ランキング結果3)
AUC(out1)                              #AUC値を表示(ランキング結果1)
AUC(out2)                              #AUC値を表示(ランキング結果2)
AUC(out3)                              #AUC値を表示(ランキング結果3)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(4, 4, 0, 0))                 #下、左、上、右の順で余白を指定(単位は行)
plot(out1, axes=F, ann=F,              #描画(ランキング結果1)
     col=param_col[1], lwd=param_lwd[1], lty=param_lty[1]) #描画(ランキング結果1)
par(new=T)                             #上書きします、という宣言
plot(out2, axes=F, ann=F,              #描画(ランキング結果2)
col=param_col[2], lwd=param_lwd[2], lty=param_lty[2])#描画(ランキング結果2)
par(new=T)                             #上書きします、という宣言
plot(out3, col=param_col[3],           #描画(ランキング結果3)
     lwd=param_lwd[3], lty=param_lty[3],#描画(ランキング結果3)
     xlab="1-specificity", ylab="sensitivity",#描画(ランキング結果3)
     cex.lab=1.5)                      #描画(ランキング結果3)
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

7. 3つのランキング結果の重ね書きを行う場合:

6.と基本的に同じです。ランキング結果のタブ区切りテキストファイル(roc_ranking.txt)から読み込むやり方です。

in_f <- "roc_ranking.txt"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge7.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- c("red", "blue", "magenta")#色を指定(ROC曲線)
param_lwd <- c(2.0, 3.0, 1.0)          #線分の幅を指定(ROC曲線)
param_lty <- c("dotted", "dashed", "solid")#線分の種類を指定(ROC曲線)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank1))     #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番(ランキング結果ごとの感度・特異度情報を取得)
out1 <- rocdemo.sca(truth = obj, data = -data[, 1])#ROC曲線描画用の形式にしてout1に格納(ランキング結果1)
out2 <- rocdemo.sca(truth = obj, data = -data[, 2])#ROC曲線描画用の形式にしてout2に格納(ランキング結果2)
out3 <- rocdemo.sca(truth = obj, data = -data[, 3])#ROC曲線描画用の形式にしてout3に格納(ランキング結果3)
AUC(out1)                              #AUC値を表示(ランキング結果1)
AUC(out2)                              #AUC値を表示(ランキング結果2)
AUC(out3)                              #AUC値を表示(ランキング結果3)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(4, 4, 0, 0))                 #下、左、上、右の順で余白を指定(単位は行)
plot(out1, axes=F, ann=F,              #描画(ランキング結果1)
     col=param_col[1], lwd=param_lwd[1], lty=param_lty[1]) #描画(ランキング結果1)
par(new=T)                             #上書きします、という宣言
plot(out2, axes=F, ann=F,              #描画(ランキング結果2)
col=param_col[2], lwd=param_lwd[2], lty=param_lty[2])#描画(ランキング結果2)
par(new=T)                             #上書きします、という宣言
plot(out3, col=param_col[3],           #描画(ランキング結果3)
     lwd=param_lwd[3], lty=param_lty[3],#描画(ランキング結果3)
     xlab="1-specificity", ylab="sensitivity",#描画(ランキング結果3)
     cex.lab=1.5)                      #描画(ランキング結果3)
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示
dev.off()                              #おまじない
	

作図 | ROC曲線 | 基礎 | 8. 凡例を追加(legend)

この項目では、凡例を追加するlegend関数の基本的な使用法を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. 3つのランキング結果のタブ区切りテキストファイル(roc_ranking.txt)の場合:

入力ファイル中にランキング法の名前が書きこまれているのでそれを利用しています。 ROC曲線は右上には必ず曲線が描かれるので、右下("bottomright")に描いています。 bottomright以外に"bottom", "bottomleft", "left", "topleft", "top", "topright", "right", "center"を指定可能です。

in_f <- "roc_ranking.txt"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge1.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- c("red", "blue", "magenta")#色を指定(ROC曲線)
param_lwd <- c(2.0, 3.0, 1.0)          #線分の幅を指定(ROC曲線)
param_lty <- c("dotted", "dashed", "solid")#線分の種類を指定(ROC曲線)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank1))     #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番(ランキング結果ごとの感度・特異度情報を取得)
out1 <- rocdemo.sca(truth = obj, data = -data[, 1])#ROC曲線描画用の形式にしてout1に格納(ランキング結果1)
out2 <- rocdemo.sca(truth = obj, data = -data[, 2])#ROC曲線描画用の形式にしてout2に格納(ランキング結果2)
out3 <- rocdemo.sca(truth = obj, data = -data[, 3])#ROC曲線描画用の形式にしてout3に格納(ランキング結果3)
AUC(out1)                              #AUC値を表示(ランキング結果1)
AUC(out2)                              #AUC値を表示(ランキング結果2)
AUC(out3)                              #AUC値を表示(ランキング結果3)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(4, 4, 0, 0))                 #下、左、上、右の順で余白を指定(単位は行)
plot(out1, axes=F, ann=F,              #描画(ランキング結果1)
     col=param_col[1], lwd=param_lwd[1], lty=param_lty[1]) #描画(ランキング結果1)
par(new=T)                             #上書きします、という宣言
plot(out2, axes=F, ann=F,              #描画(ランキング結果2)
col=param_col[2], lwd=param_lwd[2], lty=param_lty[2])#描画(ランキング結果2)
par(new=T)                             #上書きします、という宣言
plot(out3, col=param_col[3],           #描画(ランキング結果3)
     lwd=param_lwd[3], lty=param_lty[3],#描画(ランキング結果3)
     xlab="1-specificity", ylab="sensitivity",#描画(ランキング結果3)
     cex.lab=1.5)                      #描画(ランキング結果3)
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示

#後処理(凡例追加部分)
legend(x="bottomright",                #凡例を表示(xでは描く位置を指定)
       legend=colnames(data),          #凡例を表示(方法名を指定)
       col=param_col,                  #凡例を表示(色を指定)
       lwd=param_lwd,                  #凡例を表示(線分の幅を指定)
       lty=param_lty,                  #凡例を表示(線分の種類を指定)
       merge=T)                        #凡例を表示
dev.off()                              #おまじない
	

2. 3つのランキング結果のタブ区切りテキストファイル(roc_ranking.txt)の場合:

legendの位置を右側("right")にし、AUC値も一緒に凡例の中に示すやり方の基本形です。 AUC値の小数点以下の桁数がそのまま表示されています。また、方法名とAUC値の間に"_"を入れています。

in_f <- "roc_ranking.txt"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge2.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- c("red", "blue", "magenta")#色を指定(ROC曲線)
param_lwd <- c(2.0, 3.0, 1.0)          #線分の幅を指定(ROC曲線)
param_lty <- c("dotted", "dashed", "solid")#線分の種類を指定(ROC曲線)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank1))     #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番(ランキング結果ごとの感度・特異度情報を取得)
out1 <- rocdemo.sca(truth = obj, data = -data[, 1])#ROC曲線描画用の形式にしてout1に格納(ランキング結果1)
out2 <- rocdemo.sca(truth = obj, data = -data[, 2])#ROC曲線描画用の形式にしてout2に格納(ランキング結果2)
out3 <- rocdemo.sca(truth = obj, data = -data[, 3])#ROC曲線描画用の形式にしてout3に格納(ランキング結果3)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(4, 4, 0, 0))                 #下、左、上、右の順で余白を指定(単位は行)
plot(out1, axes=F, ann=F,              #描画(ランキング結果1)
     col=param_col[1], lwd=param_lwd[1], lty=param_lty[1]) #描画(ランキング結果1)
par(new=T)                             #上書きします、という宣言
plot(out2, axes=F, ann=F,              #描画(ランキング結果2)
col=param_col[2], lwd=param_lwd[2], lty=param_lty[2])#描画(ランキング結果2)
par(new=T)                             #上書きします、という宣言
plot(out3, col=param_col[3],           #描画(ランキング結果3)
     lwd=param_lwd[3], lty=param_lty[3],#描画(ランキング結果3)
     xlab="1-specificity", ylab="sensitivity",#描画(ランキング結果3)
     cex.lab=1.5)                      #描画(ランキング結果3)
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示

#後処理(方法名とAUC値をまとめた文字列ベクトルを作成)
auc <- c(AUC(out1), AUC(out2), AUC(out3))#方法ごとのAUC値をベクトルaucにまとめている
colnames(data)                              #方法名を表示
hoge <- paste(colnames(data), auc, sep="_")#方法ごとのAUC値をベクトルaucにまとめている

#後処理(凡例追加部分)
legend(x="right",                      #凡例を表示(xでは描く位置を指定)
       legend=hoge,                    #凡例を表示(表示させる文字列を指定)
       col=param_col,                  #凡例を表示(色を指定)
       lwd=param_lwd,                  #凡例を表示(線分の幅を指定)
       lty=param_lty,                  #凡例を表示(線分の種類を指定)
       merge=T)                        #凡例を表示
dev.off()                              #おまじない
	

3. 3つのランキング結果のタブ区切りテキストファイル(roc_ranking.txt)の場合:

legendの位置を右側("bottomright")にし、「方法名(AUC=XX)」のような書き方にする基本形です。

in_f <- "roc_ranking.txt"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge3.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- c("red", "blue", "magenta")#色を指定(ROC曲線)
param_lwd <- c(2.0, 3.0, 1.0)          #線分の幅を指定(ROC曲線)
param_lty <- c("dotted", "dashed", "solid")#線分の種類を指定(ROC曲線)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank1))     #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番(ランキング結果ごとの感度・特異度情報を取得)
out1 <- rocdemo.sca(truth = obj, data = -data[, 1])#ROC曲線描画用の形式にしてout1に格納(ランキング結果1)
out2 <- rocdemo.sca(truth = obj, data = -data[, 2])#ROC曲線描画用の形式にしてout2に格納(ランキング結果2)
out3 <- rocdemo.sca(truth = obj, data = -data[, 3])#ROC曲線描画用の形式にしてout3に格納(ランキング結果3)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(4, 4, 0, 0))                 #下、左、上、右の順で余白を指定(単位は行)
plot(out1, axes=F, ann=F,              #描画(ランキング結果1)
     col=param_col[1], lwd=param_lwd[1], lty=param_lty[1]) #描画(ランキング結果1)
par(new=T)                             #上書きします、という宣言
plot(out2, axes=F, ann=F,              #描画(ランキング結果2)
col=param_col[2], lwd=param_lwd[2], lty=param_lty[2])#描画(ランキング結果2)
par(new=T)                             #上書きします、という宣言
plot(out3, col=param_col[3],           #描画(ランキング結果3)
     lwd=param_lwd[3], lty=param_lty[3],#描画(ランキング結果3)
     xlab="1-specificity", ylab="sensitivity",#描画(ランキング結果3)
     cex.lab=1.5)                      #描画(ランキング結果3)
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示

#後処理(方法名とAUC値をまとめた文字列ベクトルを作成)
auc <- c(AUC(out1), AUC(out2), AUC(out3))#方法ごとのAUC値をベクトルaucにまとめている
hoge <- paste(colnames(data), "(AUC=", auc, ")", sep="")#方法ごとのAUC値をベクトルaucにまとめている
hoge                                   #hogeの中身を表示

#後処理(凡例追加部分)
legend(x="bottomright",                #凡例を表示(xでは描く位置を指定)
       legend=hoge,                    #凡例を表示(表示させる文字列を指定)
       col=param_col,                  #凡例を表示(色を指定)
       lwd=param_lwd,                  #凡例を表示(線分の幅を指定)
       lty=param_lty,                  #凡例を表示(線分の種類を指定)
       merge=T)                        #凡例を表示
dev.off()                              #おまじない
	

4. 3つのランキング結果のタブ区切りテキストファイル(roc_ranking.txt)の場合:

AUC値の表示桁数を小数点以下3桁までにするやり方です。

in_f <- "roc_ranking.txt"              #入力ファイル名を指定してin_fに格納
out_f <- "hoge4.png"                   #出力ファイル名を指定してout_fに格納
param_DEG <- c(1, 3, 5)                #DEGの位置を指定
param_fig <- c(400, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)
param_col <- c("red", "blue", "magenta")#色を指定(ROC曲線)
param_lwd <- c(2.0, 3.0, 1.0)          #線分の幅を指定(ROC曲線)
param_lty <- c("dotted", "dashed", "solid")#線分の種類を指定(ROC曲線)

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み

#前処理(真のDEGの位置を指定したベクトルを作成)
obj <- rep(0, length(param_rank1))     #初期値として全てが0の(non-DEGに相当)ベクトルobjを作成
obj[param_DEG] <- 1                    #DEGの位置に1を代入

#本番(ランキング結果ごとの感度・特異度情報を取得)
out1 <- rocdemo.sca(truth = obj, data = -data[, 1])#ROC曲線描画用の形式にしてout1に格納(ランキング結果1)
out2 <- rocdemo.sca(truth = obj, data = -data[, 2])#ROC曲線描画用の形式にしてout2に格納(ランキング結果2)
out3 <- rocdemo.sca(truth = obj, data = -data[, 3])#ROC曲線描画用の形式にしてout3に格納(ランキング結果3)

#ファイルに保存
png(out_f, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
par(mar=c(4, 4, 0, 0))                 #下、左、上、右の順で余白を指定(単位は行)
plot(out1, axes=F, ann=F,              #描画(ランキング結果1)
     col=param_col[1], lwd=param_lwd[1], lty=param_lty[1]) #描画(ランキング結果1)
par(new=T)                             #上書きします、という宣言
plot(out2, axes=F, ann=F,              #描画(ランキング結果2)
col=param_col[2], lwd=param_lwd[2], lty=param_lty[2])#描画(ランキング結果2)
par(new=T)                             #上書きします、という宣言
plot(out3, col=param_col[3],           #描画(ランキング結果3)
     lwd=param_lwd[3], lty=param_lty[3],#描画(ランキング結果3)
     xlab="1-specificity", ylab="sensitivity",#描画(ランキング結果3)
     cex.lab=1.5)                      #描画(ランキング結果3)
grid(col="gray", lty="dotted")         #指定したパラメータでグリッドを表示

#後処理(方法名とAUC値をまとめた文字列ベクトルを作成)
auc <- c(AUC(out1), AUC(out2), AUC(out3))#方法ごとのAUC値をベクトルaucにまとめている
sprintf("%.4f", auc)                   #小数点以下4桁で表示
sprintf("%6.2f", auc)                  #全部で6桁、そのうち2桁分を小数点以下の数値として表示
hoge <- paste(colnames(data), "(AUC=", sprintf("%.3f", auc), ")", sep="")#方法ごとのAUC値をベクトルaucにまとめている
hoge                                   #hogeの中身を表示

#後処理(凡例追加部分)
legend(x="bottomright",                #凡例を表示(xでは描く位置を指定)
       legend=hoge,                    #凡例を表示(表示させる文字列を指定)
       col=param_col,                  #凡例を表示(色を指定)
       lwd=param_lwd,                  #凡例を表示(線分の幅を指定)
       lty=param_lty,                  #凡例を表示(線分の種類を指定)
       merge=T)                        #凡例を表示
dev.off()                              #おまじない
	

作図 | ROC曲線 | 応用

私の2008,2009年の論文では、 主にRT-PCRで発現変動が確認された遺伝子を「真の発現変動遺伝子(true DEGs)」とし、どの発現変動遺伝子のランキング法が「真の発現変動遺伝子」をより上位にすることができるかを示す指標として、 「ROC曲線の下部面積(Area Under the ROC curve; AUC)」で方法の比較を行っています。このAUC値を計算するための基礎情報がROC曲線です。 必要な情報は2つのベクトルです。1つは何らかのランキング法を用いて発現変動の度合いで遺伝子をランキングした順位情報、 そしてもう1つはどの遺伝子が「真の発現変動遺伝子」かを示す0 or 1の情報です。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. サンプルデータ2のSupplementaryTable2_changed.txtの場合:

「G1群 5サンプル vs. G2群 5サンプル」の2群間比較データです。「真の発現変動遺伝子」の情報をparam3で指定するやり方です。

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param3 <- c("ENSG00000004468","ENSG00000182325","ENSG00000110492","ENSG00000008516","ENSG00000100170","ENSG00000173698","ENSG00000171433")#任意のIDを指定
param4 <- "False Positive Rate (FPR)"  #ROC曲線の図のx軸ラベルを指定
param5 <- "True Positive Rate (TPR)"   #ROC曲線の図のy軸ラベルを指定
param6 <- "ROC curves for raw count data"#図のタイトルを指定

#必要なパッケージをロード
library(ROC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#Step1: 任意のランキング法を用いて順位情報を取得
groups <- list(NDE=rep(1, (param_G1+param_G2)), DE=data.cl)#このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=as.matrix(data), replicates=data.cl, libsizes=as.integer(colSums(data)), groups=groups)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=1000, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL)#事後確率を計算
out@estProps                           #発現変動(DE)遺伝子がデータの中にどの程度含まれていたかを表示(右側の数値;ちなみに左側の数値はNDEの割合を示す)
stat_bayseq <- out@posteriors[,2]      #DEのposterior likelihoodをstat_bayseqに格納
rank_bayseq <- rank(-stat_bayseq, ties.method="min")#stat_bayseqでランキングした結果をrank_bayseqに格納

#Step2: 「真の発現変動遺伝子」に相当する行に1を、それ以外を0としたベクトルを作成
obj <- is.element(rownames(data), param3)#param3で指定したIDの位置情報をobjに格納
obj[obj == "TRUE"] <- 1                #TRUE or FALSEの情報から1 or 0の情報に変換

#Step3: ROC曲線描画
out <- rocdemo.sca(truth = obj, data  =-rank_bayseq)#ROC曲線描画用の形式にしてoutに格納
plot(out, xlab=param4, ylab=param5, main=param6)#描画

#以下は(こんなこともできますという)おまけ
AUC(out)                               #AUC値を計算
	

2. 「1.を基本としつつ、さらにもう一つのランキング法を実行して、二つのROC曲線を重ね書きしたい」場合:

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param3 <- c("ENSG00000004468","ENSG00000182325","ENSG00000110492","ENSG00000008516","ENSG00000100170","ENSG00000173698","ENSG00000171433")#任意のIDを指定
param4 <- "False Positive Rate (FPR)"  #ROC曲線の図のx軸ラベルを指定
param5 <- "True Positive Rate (TPR)"   #ROC曲線の図のy軸ラベルを指定
param6 <- "ROC curves for raw count data"#図のタイトルを指定

#必要なパッケージをロード
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")#おまじない(関数ADの呼び出しのため)
library(ROC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#Step1-1: 任意のランキング法1(baySeq)を用いて順位情報を取得
groups <- list(NDE=rep(1, (param_G1+param_G2)), DE=data.cl)#このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=as.matrix(data), replicates=data.cl, libsizes=as.integer(colSums(data)), groups=groups)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=1000, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL)#事後確率を計算
out@estProps                           #発現変動(DE)遺伝子がデータの中にどの程度含まれていたかを表示(右側の数値;ちなみに左側の数値はNDEの割合を示す)
stat_bayseq <- out@posteriors[,2]      #DEのposterior likelihoodをstat_bayseqに格納
rank_bayseq <- rank(-stat_bayseq, ties.method="min")#stat_bayseqでランキングした結果をrank_bayseqに格納

#Step1-2: 任意のランキング法2(AD; logratio)を用いて順位情報を取得
datalog <- log2(data + 1)              #生データに1足してlogをとったものをdatalogに格納
stat_AD <- AD(data=datalog, data.cl=data.cl)#AD統計量(ただのlogの世界でのAverage Difference)を計算して結果をstat_ADに格納
rank_AD <- rank(-abs(stat_AD), ties.method="min")#stat_ADでランキングした結果をrank_ADに格納

#Step2: 「真の発現変動遺伝子」に相当する行に1を、それ以外を0としたベクトルを作成
obj <- is.element(rownames(data), param3)#param3で指定したIDの位置情報をobjに格納
obj[obj == "TRUE"] <- 1                #TRUE or FALSEの情報から1 or 0の情報に変換

#Step3: ROC曲線描画
out1 <- rocdemo.sca(truth = obj, data  =-rank_bayseq)#ランキング法1の結果をROC曲線描画用の形式にしてout1に格納
plot(out1, axes=F, ann=F)              #軸の数値情報およびラベル情報を描画しない(axes=Fとann=F)設定にして描画
par(new=T)                             #上書きします、という宣言
out2 <- rocdemo.sca(truth = obj, data  =-rank_AD)#ランキング法2の結果をROC曲線描画用の形式にしてout2に格納
plot(out2, xlab=param4, ylab=param5, main=param6)#描画

#以下は(こんなこともできますという)おまけ
AUC(out)                               #AUC値を計算
	

3. 「2.を基本としつつ、ランキング法ごとに指定した色にしたい」場合:

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param3 <- c("ENSG00000004468","ENSG00000182325","ENSG00000110492","ENSG00000008516","ENSG00000100170","ENSG00000173698","ENSG00000171433")#任意のIDを指定
param4 <- "False Positive Rate (FPR)"  #ROC曲線の図のx軸ラベルを指定
param5 <- "True Positive Rate (TPR)"   #ROC曲線の図のy軸ラベルを指定
param6 <- "ROC curves for raw count data"#図のタイトルを指定
param7 <- c(  0,  0,  0)               #ランキング法1の色をRGBで指定
param8 <- c(255,  0,  0)               #ランキング法2の色をRGBで指定

#必要なパッケージをロード
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")#おまじない(関数ADの呼び出しのため)
library(ROC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#Step1-1: 任意のランキング法1(baySeq)を用いて順位情報を取得
groups <- list(NDE=rep(1, (param_G1+param_G2)), DE=data.cl)#このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=as.matrix(data), replicates=data.cl, libsizes=as.integer(colSums(data)), groups=groups)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=1000, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL)#事後確率を計算
out@estProps                           #発現変動(DE)遺伝子がデータの中にどの程度含まれていたかを表示(右側の数値;ちなみに左側の数値はNDEの割合を示す)
stat_bayseq <- out@posteriors[,2]      #DEのposterior likelihoodをstat_bayseqに格納
rank_bayseq <- rank(-stat_bayseq, ties.method="min")#stat_bayseqでランキングした結果をrank_bayseqに格納

#Step1-2: 任意のランキング法2(AD; logratio)を用いて順位情報を取得
datalog <- log2(data + 1)              #生データに1足してlogをとったものをdatalogに格納
stat_AD <- AD(data=datalog, data.cl=data.cl)#AD統計量(ただのlogの世界でのAverage Difference)を計算して結果をstat_ADに格納
rank_AD <- rank(-abs(stat_AD), ties.method="min")#stat_ADでランキングした結果をrank_ADに格納

#Step2: 「真の発現変動遺伝子」に相当する行に1を、それ以外を0としたベクトルを作成
obj <- is.element(rownames(data), param3)#param3で指定したIDの位置情報をobjに格納
obj[obj == "TRUE"] <- 1                #TRUE or FALSEの情報から1 or 0の情報に変換

#Step3: ROC曲線描画
out1 <- rocdemo.sca(truth = obj, data  =-rank_bayseq)#ランキング法1の結果をROC曲線描画用の形式にしてout1に格納
plot(out1, axes=F, ann=F, col=rgb(param7[1], param7[2], param7[3], max=255))#軸の数値情報およびラベル情報を描画しない(axes=Fとann=F)設定にして描画
par(new=T)                             #上書きします、という宣言
out2 <- rocdemo.sca(truth = obj, data  =-rank_AD)#ランキング法2の結果をROC曲線描画用の形式にしてout2に格納
plot(out2, xlab=param4, ylab=param5, main=param6, col=rgb(param8[1], param8[2], param8[3], max=255))#描画

#以下は(こんなこともできますという)おまけ
AUC(out1)                              #ランキング法1のAUC値を計算
AUC(out2)                              #ランキング法2のAUC値を計算
	

4. 「3.を基本としつつ、legendも追加したい(ここではとりあえず「lwd=1」としてますが線分の形式をいろいろ変えることができます(詳細はこちら))」場合:

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param3 <- c("ENSG00000004468","ENSG00000182325","ENSG00000110492","ENSG00000008516","ENSG00000100170","ENSG00000173698","ENSG00000171433")#任意のIDを指定
param4 <- "False Positive Rate (FPR)"  #ROC曲線の図のx軸ラベルを指定
param5 <- "True Positive Rate (TPR)"   #ROC曲線の図のy軸ラベルを指定
param6 <- "ROC curves for raw count data"#図のタイトルを指定
param7 <- c(  0,  0,  0)               #ランキング法1の色をRGBで指定
param8 <- c(255,  0,  0)               #ランキング法2の色をRGBで指定
param9 <- "baySeq"                     #legend用のランキング法1の名前を指定
param10 <- "AD"                        #legend用のランキング法2の名前を指定

#必要なパッケージをロード
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")#おまじない(関数ADの呼び出しのため)
library(ROC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#Step1-1: 任意のランキング法1(baySeq)を用いて順位情報を取得
groups <- list(NDE=rep(1, (param_G1+param_G2)), DE=data.cl)#このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=as.matrix(data), replicates=data.cl, libsizes=as.integer(colSums(data)), groups=groups)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=1000, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL)#事後確率を計算
out@estProps                           #発現変動(DE)遺伝子がデータの中にどの程度含まれていたかを表示(右側の数値;ちなみに左側の数値はNDEの割合を示す)
stat_bayseq <- out@posteriors[,2]      #DEのposterior likelihoodをstat_bayseqに格納
rank_bayseq <- rank(-stat_bayseq, ties.method="min")#stat_bayseqでランキングした結果をrank_bayseqに格納

#Step1-2: 任意のランキング法2(AD; logratio)を用いて順位情報を取得
datalog <- log2(data + 1)              #生データに1足してlogをとったものをdatalogに格納
stat_AD <- AD(data=datalog, data.cl=data.cl)#AD統計量(ただのlogの世界でのAverage Difference)を計算して結果をstat_ADに格納
rank_AD <- rank(-abs(stat_AD), ties.method="min")#stat_ADでランキングした結果をrank_ADに格納

#Step2: 「真の発現変動遺伝子」に相当する行に1を、それ以外を0としたベクトルを作成
obj <- is.element(rownames(data), param3)#param3で指定したIDの位置情報をobjに格納
obj[obj == "TRUE"] <- 1                #TRUE or FALSEの情報から1 or 0の情報に変換

#Step3: ROC曲線描画
out1 <- rocdemo.sca(truth = obj, data  =-rank_bayseq)#ランキング法1の結果をROC曲線描画用の形式にしてout1に格納
plot(out1, axes=F, ann=F, col=rgb(param7[1], param7[2], param7[3], max=255))#軸の数値情報およびラベル情報を描画しない(axes=Fとann=F)設定にして描画
par(new=T)                             #上書きします、という宣言
out2 <- rocdemo.sca(truth = obj, data  =-rank_AD)#ランキング法2の結果をROC曲線描画用の形式にしてout2に格納
plot(out2, xlab=param4, ylab=param5, main=param6, col=rgb(param8[1], param8[2], param8[3], max=255))#描画
legend(0.6, 0.3,                       #legendの左上の開始点がx軸0.6y軸0.3の座標となるようにしてlegendを描画
    c(param9, param10),                #param9, 10で指定した方法名を描画
    col=c(rgb(param7[1], param7[2], param7[3], max=255),#param7指定した方法の色を描画
          rgb(param8[1], param8[2], param8[3], max=255)#param8指定した方法の色を描画
    ),                                 #色指定のところは終了
    lwd=1,                             #線の幅を指定(大きな値-->太い線)
    merge=TRUE                         #TRUEにすると図の右端の線にかぶらない
)                                                                #legendの各種パラメータ指定終了

#以下は(こんなこともできますという)おまけ
AUC(out1)                              #ランキング法1のAUC値を計算
AUC(out2)                              #ランキング法2のAUC値を計算
	

5. 「4」と同じ結果だがパラメータの指定法が違う場合(多数の方法を一度に描画するときに便利です):

in_f <- "SupplementaryTable2_changed.txt"#入力ファイル名を指定してin_fに格納
param_G1 <- 5                          #G1群のサンプル数を指定
param_G2 <- 5                          #G2群のサンプル数を指定
param3 <- c("ENSG00000004468","ENSG00000182325","ENSG00000110492","ENSG00000008516","ENSG00000100170","ENSG00000173698","ENSG00000171433")#任意のIDを指定
param4 <- "False Positive Rate (FPR)"  #ROC曲線の図のx軸ラベルを指定
param5 <- "True Positive Rate (TPR)"   #ROC曲線の図のy軸ラベルを指定
param6 <- "ROC curves for raw count data"#図のタイトルを指定
param7 <- list("baySeq", c(  0,  0,  0))#ランキング法1の「方法名」と「色をRGB」で指定
param8 <- list("AD", c(255,  0,  0))   #ランキング法2の「方法名」と「色をRGB」で指定

#必要なパッケージをロード
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")#おまじない(関数ADの呼び出しのため)
library(ROC)                           #パッケージの読み込み
library(baySeq)                        #パッケージの読み込み

#入力ファイルの読み込みとラベル情報の作成
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成

#Step1-1: 任意のランキング法1(baySeq)を用いて順位情報を取得
groups <- list(NDE=rep(1, (param_G1+param_G2)), DE=data.cl)#このデータセット中には発現変動遺伝子群(DE)とそうでないもの(NDE)が含まれているという情報をgroupsオブジェクトに格納
data1 <- new("countData", data=as.matrix(data), replicates=data.cl, libsizes=as.integer(colSums(data)), groups=groups)#countDataオブジェクト形式にしてdata1に格納
data1P.NB <- getPriors.NB(data1, samplesize=1000, estimation="QL", cl=NULL)#事前パラメータの推定
out <- getLikelihoods.NB(data1P.NB, pET="BIC", cl=NULL)#事後確率を計算
out@estProps                           #発現変動(DE)遺伝子がデータの中にどの程度含まれていたかを表示(右側の数値;ちなみに左側の数値はNDEの割合を示す)
stat_bayseq <- out@posteriors[,2]      #DEのposterior likelihoodをstat_bayseqに格納
rank_bayseq <- rank(-stat_bayseq, ties.method="min")#stat_bayseqでランキングした結果をrank_bayseqに格納

#Step1-2: 任意のランキング法2(AD; logratio)を用いて順位情報を取得
datalog <- log2(data + 1)              #生データに1足してlogをとったものをdatalogに格納
stat_AD <- AD(data=datalog, data.cl=data.cl)#AD統計量(ただのlogの世界でのAverage Difference)を計算して結果をstat_ADに格納
rank_AD <- rank(-abs(stat_AD), ties.method="min")#stat_ADでランキングした結果をrank_ADに格納

#Step2: 「真の発現変動遺伝子」に相当する行に1を、それ以外を0としたベクトルを作成
obj <- is.element(rownames(data), param3)#param3で指定したIDの位置情報をobjに格納
obj[obj == "TRUE"] <- 1                #TRUE or FALSEの情報から1 or 0の情報に変換

#Step3: ROC曲線描画
out1 <- rocdemo.sca(truth = obj, data  =-rank_bayseq)#ランキング法1の結果をROC曲線描画用の形式にしてout1に格納
plot(out1, axes=F, ann=F, col=rgb(param7[[2]][1], param7[[2]][2], param7[[2]][3], max=255))#軸の数値情報およびラベル情報を描画しない(axes=Fとann=F)設定にして描画
par(new=T)                             #上書きします、という宣言
out2 <- rocdemo.sca(truth = obj, data  =-rank_AD)#ランキング法2の結果をROC曲線描画用の形式にしてout2に格納
plot(out2, xlab=param4, ylab=param5, main=param6, col=rgb(param8[[2]][1], param8[[2]][2], param8[[2]][3], max=255))#描画
legend(0.6, 0.3,                       #legendの左上の開始点がx軸0.6y軸0.3の座標となるようにしてlegendを描画
    c(param7[[1]], param8[[1]]),       #param9, 10で指定した方法名を描画
    col=c(rgb(param7[[2]][1], param7[[2]][2], param7[[2]][3], max=255),#param7指定した方法の色を描画
          rgb(param8[[2]][1], param8[[2]][2], param8[[2]][3], max=255)#param8指定した方法の色を描画
    ),                                 #色指定のところは終了
    lwd=1,                             #線の幅を指定(大きな値-->太い線)
    merge=TRUE                         #TRUEにすると図の右端の線にかぶらない
)                                                                #legendの各種パラメータして終了

#以下は(こんなこともできますという)おまけ
AUC(out1)                              #ランキング法1のAUC値を計算
AUC(out2)                              #ランキング法2のAUC値を計算
	

作図 | SplicingGraphs

選択的スプライシング(Alternative Splicing; AS)はグラフで表現可能です(Sammeth, 2009)。 SplicingGraphsというパッケージはそれをうまく作成できるようです。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し以下をコピペ。

1. ...の場合:

library(SplicingGraphs)                #パッケージの読み込み
	

パイプライン | について

ここの項目では、公共DBからのRNA-seqデータ取得から、マッピング、カウントデータ取得、発現変動解析までの一連のコマンドを示します。 2013年秋頃にRのみで一通り行えるようにしたので記述内容を大幅に変更しています。

パイプライン | ゲノム | 発現変動 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013)

Neyret-Kahn et al., Genome Res., 2013の2群間比較用ヒトRNA-seqデータ (3 proliferative samples vs. 3 Ras samples)が GSE42213に登録されています。 ここでは、SRAdbパッケージを用いたそのFASTQ形式ファイルのダウンロードから、 QuasRパッケージを用いたマッピングおよびカウントデータ取得、 そしてTCCパッケージを用いた発現変動遺伝子(DEG)検出までを行う一連の手順を示します。 原著論文(Neyret-Kahn et al., Genome Res., 2013)では72-baseと書いてますが、取得ファイルは54-baseしかありません。 また、ヒトサンプルなのになぜかマウスゲノム("mm9")にマップしたと書いているのも意味不明です。 ちなみ54 bpと比較的長いリードであり、原著論文中でもsplice-aware alignerの一つであるTopHat (Trapnell et al., Bioinformatics, 2009)を用いてマッピングを行ったと記述していますが、 ここでは、(計算時間短縮のため)basic alignerの一つであるBowtieをQuasRの内部で用いています。

多数のファイルが作成されるので、ここでは「デスクトップ」上に「SRP017142」というフォルダを作成しておき、そこで作業を行うことにします。

Step1. RNA-seqデータのgzip圧縮済みのFASTQファイルをダウンロード:

論文中の記述からGSE42213を頼りに、 RNA-seqデータがGSE42212として収められていることを見出し、 その情報からSRP017142にたどり着いています。 したがって、ここで指定するのは"SRP017142"となります。 計6ファイル、合計6Gb程度の容量のファイルがダウンロードされます。東大の有線LANで一時間弱程度かかります。 早く終わらせたい場合は、最後のgetFASTQfile関数のオプションを'ftp'から'fasp'に変更すると時間短縮可能です。 イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の記述内容と基本的に同じです。

param <- "SRP017142"                   #取得したいSRA IDを指定

#必要なパッケージをロード
library(SRAdb)                         #パッケージの読み込み

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(圧縮状態で300Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#前処理(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。
getFASTQinfo(in_acc=hoge$run)          #hoge$runで指定したSRRから始まるIDのFASTQファイルサイズ情報などを表示

#本番(FASTQファイルのダウンロード)
getFASTQfile(hoge$run, srcType='ftp')  #hoge$runで指定したSRRから始まるIDのFASTQファイルのダウンロード
	

無事ダウンロードが終了すると、作業ディレクトリ(「デスクトップ」上の「SRP017142」フォルダ)中に7つのファイルが存在するはずです。 4Gb程度ある"SRAmetadb.sqlite"ファイルは無視して構いません。残りの"SRR"からはじまる6つのファイルがダウンロードしたRNA-seqデータです。 オリジナルのサンプル名(の略称)で対応関係を表すとsrp017142_samplename.txtのようになっていることがわかります。 尚このファイルはマッピング時の入力ファイルとしても用います。

Step2. ヒトゲノムへのマッピングおよびカウントデータ取得:

マップしたいFASTQファイルリストおよびそのサンプル名を記述したsrp017142_samplename.txtを作業ディレクトリに保存したうえで、下記を実行します。 BSgenomeパッケージで利用可能なBSgenome.Hsapiens.UCSC.hg19へマッピングしています。 名前から推測できるように"UCSC"の"hg19"にマップしているのと同じです。basic alignerの一つであるBowtieを内部的に用いており、ここではマッピング時のオプションをデフォルトにしています。 原著論文中で用いられたTopHatと同じsplice-aware alignerののカテゴリに含まれるSpliceMap (Au et al., Nucleic Acids Res., 2010) を利用したい場合は、qAlign関数実行のところでsplicedAlignmentオプションをBowtieに対応する"F"からSpliceMapに対応する"T"に変更してください。hg19にマップした結果であり、TxDbオブジェクト取得時のゲノム情報もそれを基本として Ensembl Genes ("ensGene")を指定しているので、Ensembl Gene IDに対するカウントデータ取得になっています。 マシンパワーにもよりますが、ノートPCでも10時間程度で終わると思います。 マップ後 | カウント情報取得 | single-end | ゲノム | アノテーション有 | QuasR(Gaidatzis_2015)の記述内容と基本的に同じです。

in_f1 <- "srp017142_samplename.txt"    #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f1 <- "srp017142_QC_bowtie.pdf"    #出力ファイル名を指定してout_f1に格納
out_f2 <- "srp017142_count_bowtie.txt" #出力ファイル名を指定してout_f2に格納
out_f3 <- "srp017142_genelength.txt"   #出力ファイル名を指定してout_f3に格納
out_f4 <- "srp017142_RPKM_bowtie.txt"  #出力ファイル名を指定してout_f4に格納
out_f5 <- "srp017142_transcript_seq.fa"#出力ファイル名を指定してout_f5に格納
out_f6 <- "srp017142_other_info1.txt"  #出力ファイル名を指定してout_f6に格納
param1 <- "hg19"                       #TxDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #TxDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param3 <- "gene"                       #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#マッピングおよびQCレポート用ファイル作成
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2,            #マッピングを行うqAlign関数を実行した結果をoutに格納
              splicedAlignment=F)      #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
qQCReport(out, pdfFilename=out_f1)     #QCレポート結果をファイルに保存
palette("default")                     #おまじない

#カウントデータ取得およびファイル保存
txdb <- makeTxDbFromUCSC(genome=param1, tablename=param2)#txdbオブジェクトの作成
count <- qCount(out, txdb, reportLevel=param3)#カウントデータ行列を取得してcountに格納
data <- count[,-1]                     #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#遺伝子配列長情報取得およびファイル保存
genelength <- count[,1]                #遺伝子配列長情報をgenelengthに格納
tmp <- cbind(names(genelength), genelength)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPKM取得およびファイル保存
nf_RPM <- 1000000/colSums(data)        #正規化係数(RPM補正用)を計算した結果をnf_RPMに格納
RPM <- sweep(data, 2, nf_RPM, "*")     #正規化係数を各列に掛けた結果をRPMに格納
nf_RPK <- 1000/genelength              #正規化係数(RPK補正用)を計算した結果をnf_RPKに格納
RPKM <- sweep(RPM, 1, nf_RPK, "*")     #正規化係数を各行に掛けた結果をRPKMに格納
tmp <- cbind(rownames(RPKM), RPKM)     #保存したい情報をtmpに格納
write.table(tmp, out_f4, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#転写物配列情報取得およびファイル保存
library(in_f2, character.only=T)       #指定したパッケージの読み込み
tmp <- ls(paste("package", in_f2, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
fasta <- extractTranscriptSeqs(genome, txdb)#転写物塩基配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです
writeXStringSet(fasta, file=out_f5, format="fasta", width=50)#tmpの中身を指定したファイル名で保存

#ファイルに保存(各種情報)
sink(out_f6)                           #指定したファイルへの書き込み指令(表示結果がファイルに保存される)
cat("1. Computation time for mapping (in second).\n")#計算時間を表示(一番右側の数字。単位はsecond)
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
cat("\n\n2. Options used for mapping.\n")#マッピングに用いたオプション情報を表示
out@alignmentParameter                 #マッピングに用いたオプション情報を表示
cat("\n\n3. Alignment statistics.\n")  #マッピング結果(alignment statistics)の表示。
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数
cat("\n\n4. Gene annotation info.\n")  #UCSCからの遺伝子アノテーション情報取得時のバージョン情報などを表示
txdb                                   #UCSCからの遺伝子アノテーション情報取得時のバージョン情報などを表示
cat("\n\n5. Session info.\n")          #解析に用いたRや各種パッケージのバージョン情報を表示
sessionInfo()                          #解析に用いたRや各種パッケージのバージョン情報を表示
sink()                                 #書き込み終了の指令
	

無事マッピングが終了すると、指定した6つのファイルが生成されているはずです。

  1. QCレポートファイル(srp017142_QC_bowtie.pdf):Quality Controlレポートです。よく利用されるFastQCのようなものです。
  2. カウントデータファイル(srp017142_count_bowtie.txt):グループ(サンプル)間での発現変動遺伝子同定に用います。
  3. 遺伝子配列長情報ファイル(srp017142_genelength.txt):配列長とカウント数の関係を調べたいときなどに用います。これはおまけです。
  4. RPKM補正後のファイル(srp017142_RPKM_bowtie.txt):同一サンプル内での発現レベルの大小関係を知りたいときなどに用います。
  5. 転写物塩基配列ファイル(srp017142_transcript_seq.fa):(遺伝子ではなく)転写物の塩基配列のmulti-FASTAファイルです。参考まで。
  6. その他の各種情報ファイル(srp017142_other_info1.txt):論文作成時に必要な、マッピング時に用いたオプション情報、マップされたリード数、Rおよび用いたパッケージのバージョン情報などを含みます。

Step3. サンプル間クラスタリング:

カウントデータ(srp017142_count_bowtie.txt)を用いてサンプル間の全体的な類似度を眺めることを目的として、 サンプル間クラスタリングを行います。類似度は「1-Spearman相関係数」、方法は平均連結法で行っています。 TCC論文(Sun et al., 2013)のFig.3でも同じ枠組みでクラスタリングを行った結果を示していますので、英語論文執筆時の参考にどうぞ。 PearsonではなくSpearmanで行っているのは、ダイナミックレンジが広いので、順序尺度程度にしておいたほうがいいだろうという思想が一番大きいです。 log2変換してダイナミックレンジを圧縮してPearsonにするのも一般的には「アリ」だとは思いますが、マップされたリード数が100万以上あるにも関わらずRPKMデータを用いると、RPKM補正後の値が1未満のものがかなり存在すること、 そしてlogをとれるようにゼロカウントデータの処理が必要ですがやりかた次第で結果がころころかわりうるという状況が嫌なので、RNA-seqデータの場合には私はSpearman相関係数にしています。 また、ベクトルの要素間の差を基本とするdistance metrics (例:ユークリッド距離やマンハッタン距離など)は、比較的最近のRNA-seqデータ正規化法 (TMM: Robinson and Oshlack, 2010, TbT: Kadota et al., 2012, TCC; Sun et al., 2013)論文の重要性が理解できれば、その類似度は少なくともfirst choiceにならないと思われます。 つまり、サンプルごとに転写物の組成比が異なるため、RPMやCPMのような総リード数を補正しただけのデータを用いて「サンプル間の数値の差」に基づいて距離を定めるのはいかがなものか?という思想です。 逆に、ユークリッド距離などを用いてクラスタリングを行った結果と比較することで、転写物の組成比に関する知見が得られるのかもしれません。 さらに、全体的な発現レベルが低いものを予めフィルタリングしておく必要もあるのだろうとは思います。このあたりは、真の回答はありませんので、 (手持ちのデータにこの類似度を適用したときの理論上の短所をきちんと理解したうえで)いろいろ試すというのは重要だとは思います。 ここではカウントデータでクラスタリングをしていますが、おそらく配列長補正後のRPKMデータ(srp017142_RPKM_bowtie.txt) でも得られる樹形図のトポロジー(相対的な位置関係)はほぼ同じになるのではないかと思っています。配列長補正の有無で、サンプル間の相関係数の値自体は変わりますが、 同じグループに属するサンプルであれば反復実験間でそれほど違わないので、多少順位に変動があっても全体としては相殺されるはずです...が確証はありません。

in_f3 <- "srp017142_count_bowtie.txt"  #入力ファイル名を指定してin_f3に格納
out_f6 <- "srp017142_count_cluster.png"#出力ファイル名を指定してout_f6に格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f3, header=TRUE, row.names=1, sep="\t", quote="")#指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#クラスタリングおよび結果の保存
data.dist <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdata.distに格納
out <- hclust(data.dist, method="average")#階層的クラスタリングを実行し、結果をoutに格納
png(out_f6, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

無事計算が終了すると、指定したファイル(srp017142_count_cluster.png)が生成されているはずです。

Step4. 発現変動遺伝子(DEG)同定:

カウントデータファイル(srp017142_count_bowtie.txt)を入力として2群間で発現の異なる遺伝子の検出を行います。 このデータはbiological replicatesありのデータなので、TCCパッケージ(Sun et al., 2013)の推奨ガイドラインに従って、 iDEGES/edgeR正規化(Sun et al., 2013; Robinson et al., 2010; Robinson and Oshlack, 2010; Robinson and Smyth, 2008)を行ったのち、 edgeRパッケージ中のan exact test (Robinson and Smyth, 2008)を行って、DEG検出を行っています。 解析 | 発現変動 | 2群間 | 対応なし | 複製あり | TCC(Sun_2013)および 正規化 | サンプル間 | 2群間 | 複製あり | iDEGES/edgeR(Sun_2013)の記述内容と基本的に同じです。

in_f4 <- "srp017142_count_bowtie.txt"  #入力ファイル名を指定してin_f4に格納
out_f7 <- "srp017142_DEG_bowtie.txt"   #出力ファイル名を指定してout_f7に格納
out_f8 <- "srp017142_MAplot_bowtie.png"#出力ファイル名を指定してout_f8に格納
out_f9 <- "srp017142_other_info2.txt"  #出力ファイル名を指定してout_f9に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(430, 390)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f4, header=TRUE, row.names=1, sep="\t", quote="")#in_f4で指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f7, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f7で指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f8, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR)               #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない

#ファイルに保存(各種情報)
sink(out_f9)                           #指定したファイルへの書き込み指令(表示結果がファイルに保存される)
cat("1. Numbers of DEGs satisfying several FDR thresholds.\n")#任意のFDR閾値を満たす遺伝子数を表示
cat("FDR < 0.05:");print(sum(tcc$stat$q.value < 0.05))#任意のFDR閾値を満たす遺伝子数を表示
cat("FDR < 0.10:");print(sum(tcc$stat$q.value < 0.10))#任意のFDR閾値を満たす遺伝子数を表示
cat("FDR < 0.20:");print(sum(tcc$stat$q.value < 0.20))#任意のFDR閾値を満たす遺伝子数を表示
cat("FDR < 0.30:");print(sum(tcc$stat$q.value < 0.30))#任意のFDR閾値を満たす遺伝子数を表示
cat("\n\n2. Session info.\n")          #解析に用いたRや各種パッケージのバージョン情報を表示
sessionInfo()                          #解析に用いたRや各種パッケージのバージョン情報を表示
sink()                                 #書き込み終了の指令
	

無事計算が終了すると、指定した3つのファイルが生成されているはずです。

  1. 発現変動解析結果ファイル(srp017142_DEG_bowtie.txt):iDEGES/edgeR-edgeRパイプラインによるDEG同定結果です。 "rank"列でソートすると発現変動の度合い順になります。"q.value"列の情報は任意のFDR閾値を満たす遺伝子数を調べるときに用います。 尚、左側の実数の数値データはiDEGES/edgeR正規化後のデータです。M-A plotはこの数値データに基づいて作成されています。尚、配列長補正は掛かっておりませんのでご注意ください。
  2. M-A plotファイル(srp017142_MAplot_bowtie.png):M versus A plotです。横軸が平均発現レベル(右側が高発現、左側が低発現)。縦軸がlog(G2/G1)で、0より下がG1群で高発現、0より上がG2群で高発現です。
  3. その他の各種情報ファイル(srp017142_other_info2.txt):FDR < 0.05, 0.1, 0.2, 0.3を満たす遺伝子数、論文作成時に必要な、Rおよび用いたパッケージのバージョン情報(特にTCC)などを含みます。

Step5. iDEGES/edgeR正規化後のデータに配列長補正を実行:

カウントデータファイル(srp017142_count_bowtie.txt)と遺伝子配列長情報ファイル(srp017142_genelength.txt)を入力として TCCパッケージ(Sun et al., 2013)の推奨ガイドラインに従って、 iDEGES/edgeR正規化(Sun et al., 2013; Robinson et al., 2010; Robinson and Oshlack, 2010; Robinson and Smyth, 2008)を行ったのち、 配列長補正(Reads per kilobase (RPK) or Counts per kilobase (CPK))を実行した結果を返します。 そろそろ誰かが論文で公式に言い出すかもしれません(既にどこかで書かれているかも...)が、RPM (Reads per million)が提唱されたのは、総リード数が100万程度だった時代です。 今はマップされた総リード数が数千万リードという時代ですので、RPM or RPKMのような100万にするような補正後のデータだと、 (細かい点をすっとばすと)せっかく読んだ総リード数の桁が増えてもダイナミックレンジが広くなりようがありません。 iDEGES/edgeR正規化後のデータは、マップされた総リード数の中央値(median)に合わせているので、リード数が増えるほどダイナミックレンジは広くなります。 しかし、これ自体は配列長補正がかかっていないため、RPKMデータと似たような「配列長補正まで行った後のiDEGES/edgeR正規化データ」があったほうが嬉しいヒトがいるのかな、ということで提供しています。 利用法としては、サンプル間クラスタリングを行う際に、順位相関係数以外のサンプルベクトル中の要素間の差に基づくユークリッド距離やマンハッタン距離をどうしても使いたい場合には RPKMのようなデータを使うよりはこちらの正規化データのほうがnon-DEG間の距離がより0に近い値になるから直感的にはいいのではと思っています。 ただし、iDEGES/edgeR正規化を行うときにサンプルのラベル情報を用いていながら(supervised learningみたいなことを行っている)、 unsupervised learningの一種であるクラスタリングを行う、ということの妥当性についてはよくわかりません。 正規化 | サンプル間 | 2群間 | 複製あり | iDEGES/edgeR(Sun_2013)正規化 | 基礎 | RPK or CPK (配列長補正)の記述内容と基本的に同じです。

in_f4 <- "srp017142_count_bowtie.txt"  #入力ファイル名を指定してin_f4に格納
in_f5 <- "srp017142_genelength.txt"    #入力ファイル名を指定してin_f5に格納
out_f10 <- "srp017142_normalized_bowtie.txt"#出力ファイル名を指定してout_f10に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f4, header=TRUE, row.names=1, sep="\t", quote="")#in_f4で指定したファイルの読み込み
len <- read.table(in_f5, header=TRUE, row.names=1, sep="\t", quote="")#in_f5で指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化 --> 配列長補正)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
nf <- 1000/len[,1]                     #正規化係数(RPK補正用)を計算した結果をnfに格納
normalizedK <- sweep(normalized, 1, nf, "*")#正規化係数を各行に掛けた結果をnormalizedKに格納

#ファイルに保存(テキストファイル)
tmp <- cbind(rownames(tcc$count), normalizedK)#「rownames情報」、「正規化後のカウントデータ」を列方向で結合した結果をtmpに格納
write.table(tmp, out_f10, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f10で指定したファイル名で保存
	

無事計算が終了すると、配列長補正まで行った後のiDEGES/edgeR正規化データファイル(srp017142_normalized_bowtie.txt)が生成されているはずです。

パイプライン | ゲノム | 機能解析 | 2群間 | 対応なし | 複製あり | SRP017142(Neyret-Kahn_2013)

Neyret-Kahn et al., Genome Res., 2013の2群間比較用ヒトRNA-seqデータ (3 proliferative samples vs. 3 Ras samples)が GSE42213に登録されています。 ここでは、ファイルのダウンロードから、マッピング、カウントデータ取得、機能解析までを行う一連の手順を示します。 多数のファイルが作成されるので、ここでは「デスクトップ」上に「SRP017142」というフォルダを作成しておき、そこで作業を行うことにします。

Step1. RNA-seqデータのgzip圧縮済みのFASTQファイルをダウンロード:

論文中の記述からGSE42213を頼りに、 RNA-seqデータがGSE42212として収められていることを見出し、 その情報からSRP017142にたどり着いています。 したがって、ここで指定するのは"SRP017142"となります。 計6ファイル、合計6Gb程度の容量のファイルがダウンロードされます。東大の有線LANで一時間弱程度かかります。 早く終わらせたい場合は、最後のgetFASTQfile関数のオプションを'ftp'から'fasp'に変更すると時間短縮可能です。 イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の記述内容と基本的に同じです。

param <- "SRP017142"                   #取得したいSRA IDを指定

#必要なパッケージをロード
library(SRAdb)                         #パッケージの読み込み

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(圧縮状態で300Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#前処理(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。
getFASTQinfo(in_acc=hoge$run)          #hoge$runで指定したSRRから始まるIDのFASTQファイルサイズ情報などを表示

#本番(FASTQファイルのダウンロード)
getFASTQfile(hoge$run, srcType='ftp')  #hoge$runで指定したSRRから始まるIDのFASTQファイルのダウンロード
	

無事ダウンロードが終了すると、作業ディレクトリ(「デスクトップ」上の「SRP017142」フォルダ)中に7つのファイルが存在するはずです。 4Gb程度ある"SRAmetadb.sqlite"ファイルは無視して構いません。残りの"SRR"からはじまる6つのファイルがダウンロードしたRNA-seqデータです。 オリジナルのサンプル名(の略称)で対応関係を表すとsrp017142_samplename.txtのようになっていることがわかります。 尚このファイルはマッピング時の入力ファイルとしても用います。

Step2. ヒトゲノムへのマッピングおよびカウントデータ取得:

マップしたいFASTQファイルリストおよびそのサンプル名を記述したsrp017142_samplename.txtを作業ディレクトリに保存したうえで、下記を実行します。 BSgenomeパッケージで利用可能なBSgenome.Hsapiens.UCSC.hg19へマッピングしています。 名前から推測できるように"UCSC"の"hg19"にマップしているのと同じです。 basic alignerの一つであるBowtieを内部的に用いており、 ここではマッピング時のオプションを"-m 1 --best --strata -v 2"にしています。 hg19にマップした結果なので、TxDbオブジェクト取得時のゲノム情報もそれを基本として Ensembl Genes ("ensGene")を指定しているので、Ensembl Gene IDに対するカウントデータ取得になっています。 但し、機能解析で用いるSeqGSEAパッケージの入力に合わせて、 exonレベルのカウントデータとして取得しています。マシンパワーにもよりますが、ノートPCでも10時間程度で終わると思います。 マップ後 | カウント情報取得 | single-end | ゲノム | アノテーション有 | QuasR(Gaidatzis_2015)の記述内容と基本的に同じです。

in_f1 <- "srp017142_samplename.txt"    #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Hsapiens.UCSC.hg19" #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f1 <- "srp017142_QC_bowtie2.pdf"   #出力ファイル名を指定してout_f1に格納
out_f2 <- "srp017142_count_bowtie2.txt"#出力ファイル名を指定してout_f2に格納
out_f3 <- "srp017142_genelength2.txt"  #出力ファイル名を指定してout_f3に格納
out_f4 <- "srp017142_RPKM_bowtie2.txt" #出力ファイル名を指定してout_f4に格納
out_f5 <- "srp017142_transcript_seq2.fa"#出力ファイル名を指定してout_f5に格納
out_f6 <- "srp017142_other_info1_2.txt" #出力ファイル名を指定してout_f6に格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param1 <- "hg19"                       #TxDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #TxDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)
param3 <- "exon"                       #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#マッピングおよびQCレポート用ファイル作成
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
qQCReport(out, pdfFilename=out_f1)     #QCレポート結果をファイルに保存
palette("default")                     #おまじない

#カウントデータ取得およびファイル保存
txdb <- makeTxDbFromUCSC(genome=param1, tablename=param2)#txdbオブジェクトの作成
count <- qCount(out, txdb, reportLevel=param3)#カウントデータ行列を取得してcountに格納
data <- count[,-1]                     #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#配列長情報取得およびファイル保存
genelength <- count[,1]                #遺伝子配列長情報をgenelengthに格納
tmp <- cbind(names(genelength), genelength)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPKM取得およびファイル保存
nf_RPM <- 1000000/colSums(data)        #正規化係数(RPM補正用)を計算した結果をnf_RPMに格納
RPM <- sweep(data, 2, nf_RPM, "*")     #正規化係数を各列に掛けた結果をRPMに格納
nf_RPK <- 1000/genelength              #正規化係数(RPK補正用)を計算した結果をnf_RPKに格納
RPKM <- sweep(RPM, 1, nf_RPK, "*")     #正規化係数を各行に掛けた結果をRPKMに格納
tmp <- cbind(rownames(RPKM), RPKM)     #保存したい情報をtmpに格納
write.table(tmp, out_f4, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#塩基配列情報取得およびファイル保存
library(in_f2, character.only=T)       #指定したパッケージの読み込み
tmp <- ls(paste("package", in_f2, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
fasta <- extractTranscriptSeqs(genome, txdb)#転写物塩基配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです
writeXStringSet(fasta, file=out_f5, format="fasta", width=50)#tmpの中身を指定したファイル名で保存

#ファイルに保存(各種情報)
sink(out_f6)                           #指定したファイルへの書き込み指令(表示結果がファイルに保存される)
cat("1. Computation time for mapping (in second).\n")#計算時間を表示(一番右側の数字。単位はsecond)
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
cat("\n\n2. Options used for mapping.\n")#マッピングに用いたオプション情報を表示
out@alignmentParameter                 #マッピングに用いたオプション情報を表示
cat("\n\n3. Alignment statistics.\n")  #マッピング結果(alignment statistics)の表示。
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数
cat("\n\n4. Gene annotation info.\n")  #UCSCからの遺伝子アノテーション情報取得時のバージョン情報などを表示
txdb                                   #UCSCからの遺伝子アノテーション情報取得時のバージョン情報などを表示
cat("\n\n5. Session info.\n")          #解析に用いたRや各種パッケージのバージョン情報を表示
sessionInfo()                          #解析に用いたRや各種パッケージのバージョン情報を表示
sink()                                 #書き込み終了の指令
	

無事マッピングが終了すると、指定した6つのファイルが生成されているはずです。

  1. QCレポートファイル(srp017142_QC_bowtie2.pdf):Quality Controlレポートです。よく利用されるFastQCのようなものです。
  2. カウントデータファイル(srp017142_count_bowtie2.txt):グループ(サンプル)間での発現変動遺伝子同定に用います。
  3. 遺伝子配列長情報ファイル(srp017142_genelength2.txt):配列長とカウント数の関係を調べたいときなどに用います。これはおまけです。
  4. RPKM補正後のファイル(srp017142_RPKM_bowtie2.txt):同一サンプル内での発現レベルの大小関係を知りたいときなどに用います。
  5. 転写物塩基配列ファイル(srp017142_transcript_seq2.fa):(遺伝子ではなく)転写物の塩基配列のmulti-FASTAファイルです。参考まで。
  6. その他の各種情報ファイル(srp017142_other_info1_2.txt):論文作成時に必要な、マッピング時に用いたオプション情報、マップされたリード数、Rおよび用いたパッケージのバージョン情報などを含みます。

Step3. 機能解析:

カウントデータファイル(srp017142_count_bowtie2.txt)を入力として SeqGSEAを用いて機能解析を行います。 このパッケージは基本的にexonレベルのカウントデータを入力とするので、その前提で行っています。 また、統計的有意性の評価にサンプルラベル情報の並べ替え(permutation)戦略を採用しているため、 各グループあたりの反復数が5以上のデータを想定しているようです。また、計算時間を半端なく要します(10時間とか)。 それゆえ、本来このデータセットはグループあたりの反復数が3しかないので、適用外ということになります。

Step2に引き続いて行う場合には、dataとtxdbオブジェクトの構築を行う必要は本来ありません。 同様の理由でtxdbオブジェクトの作成に必要なparam1とparam2も必要ありませんが、 これらのアノテーション情報を利用していることが既知であるという前提のもとで行っています。

最終的に欲しいReadCountSetクラスオブジェクトは、「カウントデータ、gene ID、exon ID」の3つの情報から構築されます。 しかし、txdbオブジェクトから得られるgene IDとexon IDはshared exonを含むので、曖昧性を排除するためこれらを除去する必要があります。 それゆえ、hoge2中のexon IDを抽出して一回しか出現しなかったIDをhoge4として取得し、 もとのhoge2オブジェクトの並びで取得しなおしたものがexonIDsとgeneIDsオブジェクトです。

exonレベルカウントデータもshared exonの情報を含むので、それらを除いたものを取得しています。

SeqGSEAでの機能解析の基本はexonレベルとgeneレベルの発現変動解析結果を組み合わせてGSEAを行うというものです(Wang and Cairns, 2013)。 SeqGSEA著者たちは、exonレベルの発現変動解析のことをDifferential splicing (DS) analysisと呼んでいて、 おそらくDSGseqはSeqGSEA中に組み込まれていると思います。 そしてgeneレベルの発現変動解析をdifferential expression (DE) analysisとして、SeqGSEA中では DESeqを利用しています。

GSEAに代表される発現変動遺伝子セット解析は、基本的にGSEAの開発者らが作成した様々な遺伝子セット情報を収めたMolecular Signatures Database (MSigDB)からダウンロードした.gmt形式ファイルを読み込んで解析を行います。

*gmt形式ファイルのダウンロード方法は、基本的に以下の通りです:

  1. Molecular Signatures Database (MSigDB)
      「register」のページで登録し、遺伝子セットをダウンロード可能な状態にする。
  2. Molecular Signatures Database (MSigDB)
      「Download gene sets」の"Download"のところをクリックし、Loginページで登録したe-mail addressを入力。
  3. これでMSigDBのダウンロードページに行けるので、
      「c5: gene ontology gene sets」の「BP: biological process」を解析したい場合はc5.bp.v4.0.symbols.gmtファイルをダウンロードしておく。
      「c2: curated gene sets」の「KEGG gene sets」を解析したい場合はc2.cp.kegg.v4.0.symbols.gmtファイルをダウンロードしておく。
      「c3: motif gene sets」を解析したい場合はc3.all.v4.0.symbols.gmtファイルをダウンロードしておく。

以下ではc5.bp.v4.0.symbols.gmtの解析を行っています。 また、並べ替え回数がたったの20回でも2時間ちょっとかかります(Panasonic Let's note CF-SX3本郷モデルの場合)のでご注意ください。 推奨は1000回以上と書いてますが、個人的にはアリエナイですね。。。

in_f4 <- "srp017142_count_bowtie2.txt" #入力ファイル名を指定してin_f4に格納
in_f5 <- "c5.bp.v4.0.symbols.gmt"      #入力ファイル名を指定してin_f5に格納
out_f7 <- "srp017142_SeqGSEA_c5bp.txt" #出力ファイル名を指定してout_f7に格納
param_G1 <- 3                          #G1群のサンプル数を指定
param_G2 <- 3                          #G2群のサンプル数を指定
param_perm <- 20                       #並べ替え回数を指定(数値が大きいほどより正確だがその分だけ時間がかかる。実際の解析ではサンプル数にもよるが最低でも1000以上を推奨)
param1 <- "hg19"                       #TxDbオブジェクト作成用のリファレンスゲノムを指定(「ucscGenomes()[,"db"]」でリストアップされるものを指定可能)
param2 <- "ensGene"                    #TxDbオブジェクト作成用のtable名を指定(「supportedUCSCtables()」でリストアップされるものを指定可能)

#必要なパッケージをロード
library(SeqGSEA)                       #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f4, header=TRUE, row.names=1, sep="\t", quote="")#in_f4で指定したファイルの読み込み
dim(data)                              #確認してるだけです
tmp_colname <- colnames(data)          #SeqGSEAが判別可能なサンブルラベル情報に変更
colnames(data) <- c(paste("E", 1:param_G1, sep=""), paste("C", 1:param_G2, sep=""))#SeqGSEAが判別可能なサンブルラベル情報に変更

#前処理(ReadCountSetクラスオブジェクトの作成)
txdb <- makeTxDbFromUCSC(genome=param1, tablename=param2)#txdbオブジェクトの作成
hoge1 <- exonsBy(txdb, by=c("gene"))   #Ensembl Gene IDごとに構成するexonの座標情報を格納したGRangesListオブジェクトをhoge1に格納
hoge2 <- unlist(hoge1)                 #GRangesListからGRanges形式オブジェクトに変換
hoge2                                  #確認してるだけです
hoge3 <- table(hoge2$exon_id)          #exon IDごとの出現回数を取得
hoge4 <- names(hoge3)[hoge3 == 1]      #出現回数が1回だったもののexon ID情報を取得
obj <- is.element(as.character(hoge2$exon_id), hoge4)#元のhoge2オブジェクト上での位置情報を取得
exonIDs <- as.character(hoge2$exon_id)[obj]#shared exon以外のexon IDを取得
geneIDs <- names(hoge2)[obj]           #shared exon以外のgene IDを取得
data <- data[exonIDs,]                 #shared exon以外のexon IDの並びでカウントデータのサブセットを取得
#rownames(data) <- paste(geneIDs, exonIDs, sep=":")#行名を変更
dim(data)                              #確認してるだけです
exonIDs <- paste("E", exonIDs, sep="") #exon IDの最初に"E"を追加
RCS <- newReadCountSet(data, exonIDs, geneIDs)#ReadCountSetオブジェクトを作成
RCS                                    #確認してるだけです

#前処理(低発現exonのフィルタリング)
RCS <- exonTestability(RCS, cutoff = 5)#exonレベルでの総リードカウント数が5未満のリードを除去
geneTestable <- geneTestability(RCS)   #geneレベルでのフィルタリングの有無情報を取得
RCS <- subsetByGenes(RCS, unique(geneID(RCS))[geneTestable])#フィルタリング実行
RCS                                    #確認してるだけです

#本番(Differential splicing (DS) analysis; Wang et al., Gene, 2013)
time_DS_s <- proc.time()               #計算時間を計測するため
RCS <- estiExonNBstat(RCS)             #DS解析(exon DS NB-statistics算出)
RCS <- estiGeneNBstat(RCS)             #DS解析(gene DS NB-statistics算出)
head(fData(RCS)[, c("exonIDs", "geneIDs", "testable", "NBstat")])#確認してるだけです
permuteMat <- genpermuteMat(RCS, times=param_perm)#DS解析(permutation testのところ)
RCS <- DSpermute4GSEA(RCS, permuteMat) #DS解析(permutation testのところ)
DSscore.normFac <- normFactor(RCS@permute_NBstat_gene) #DS解析(NB統計量の正規化によるDSスコアの算出)
DSscore <- scoreNormalization(RCS@featureData_gene$NBstat, DSscore.normFac)#DS解析(NB統計量の正規化によるDSスコアの算出)
DSscore.perm <- scoreNormalization(RCS@permute_NBstat_gene, DSscore.normFac)#DS解析(NB統計量の正規化によるDSスコアの算出)
RCS <- DSpermutePval(RCS, permuteMat)  #DS解析(p値の算出)
head(DSresultGeneTable(RCS))           #確認してるだけです
time_DS_e <- proc.time()               #計算時間を計測するため
time_DS_e - time_DS_s                  #計算時間を表示(単位は秒)

#本番(Differential expression (DE) analysis; Anders and Huber, Genome Biol., 2010)
time_DE_s <- proc.time()               #計算時間を計測するため
geneCounts <- getGeneCount(RCS)        #DE解析(geneレベルのカウントデータ取得)
head(geneCounts)                       #確認してるだけです
DEG <- runDESeq(geneCounts, label(RCS))#DE解析(DESeqの実行)
DEGres <- DENBStat4GSEA(DEG)           #DE解析(NB統計量情報の取得)
DEpermNBstat <- DENBStatPermut4GSEA(DEG, permuteMat)#DE解析(permutation testのところ)
DEscore.normFac <- normFactor(DEpermNBstat)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore <- scoreNormalization(DEGres$NBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEscore.perm <- scoreNormalization(DEpermNBstat, DEscore.normFac)#DE解析(NB統計量の正規化によるDEスコアの算出)
DEGres <- DEpermutePval(DEGres, DEpermNBstat)#DE解析(p値の算出)
head(DEGres)                           #確認してるだけです
time_DE_e <- proc.time()               #計算時間を計測するため
time_DE_e - time_DE_s                  #計算時間を表示(単位は秒)

#本番(Integrative GSEA; Wang and Cairns, BMC Bioinformatics, 2013)
combine <- rankCombine(DEscore, DSscore, DEscore.perm, DSscore.perm, DEweight = 0.3)#DS scoreとDE scoreの統合
gene.score <- combine$geneScore        #integrated score情報取得
gene.score.perm <- combine$genePermuteScore#permutationデータセットのintegrated average score情報取得
GS <- loadGenesets(in_f5, unique(geneID(RCS)), geneID.type = "ensembl")#gmtファイルの読み込みおよびSeqGeneSetオブジェクトの作成
GS <- GSEnrichAnalyze(GS, gene.score, gene.score.perm)#SeqGSEAの実行

#ファイルに保存
#tmp <- GSEAresultTable(GS, GSDesc = TRUE)#SeqGSEA実行結果をtmpに格納(この関数はソート機能がないので非推奨)
tmp <- topGeneSets(GS, n=length(GS@GSNames), sortBy="FDR")#SeqGSEA実行結果をtmpに格納
write.table(tmp, out_f7, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存
	

無事計算が終了すると、指定したファイル(srp017142_SeqGSEA_c5bp.txt)が生成されているはずです。 このファイルは並べ替え回数を30回(param_perm <- 30)にして実行した結果です。 permutation p-valueに基づく結果であり並べ替え回数が少ないので、同じ数値を指定した計算結果でも、全く同じ数値や並びになっているとは限りませんのでご注意ください。 例えば、このファイルの場合は、FDR < 0.05未満のものが22個(遺伝子セット名が"CYTOKINESIS"から"INNATE_IMMUNE_RESPONSE"まで)あると解釈します。

パイプライン | ゲノム | 機能解析 | 2群間 | 対応なし | 複製あり | SRP011435(Huang_2012)

Huang et al., Development, 2012の2群間比較用シロイヌナズナRNA-seqデータ (4 DEX-treated vs. 4 mock-treated)が GSE36469に登録されています。 ここでは、SRAdbパッケージを用いたそのFASTQ形式ファイルのダウンロードから、 QuasRパッケージを用いたマッピングおよびカウントデータ取得、 そしてTCCパッケージを用いた発現変動遺伝子(DEG)検出までを行う一連の手順を示します。

多数のファイルが作成されるので、ここでは「デスクトップ」上に「SRP011435」というフォルダを作成しておき、そこで作業を行うことにします。

Step1. RNA-seqデータのgzip圧縮済みのFASTQファイルをダウンロード:

論文中の記述からGSE36469を頼りに、 RNA-seqデータがGSE36469として収められていることを見出し、 その情報からSRP011435にたどり着いています。 したがって、ここで指定するのは"SRP011435"となります。

計8ファイル、合計10Gb程度の容量のファイルがダウンロードされます。東大の有線LANで2時間程度かかります。 早く終わらせたい場合は、最後のgetFASTQfile関数のオプションを'ftp'から'fasp'に変更すると時間短縮可能です。

イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の記述内容と基本的に同じです。

param <- "SRP011435"                   #取得したいSRA IDを指定

#必要なパッケージをロード
library(SRAdb)                         #パッケージの読み込み

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(圧縮状態で300Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#前処理(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。
getFASTQinfo(in_acc=hoge$run)          #hoge$runで指定したSRRから始まるIDのFASTQファイルサイズ情報などを表示

#本番(FASTQファイルのダウンロード)
getFASTQfile(hoge$run, srcType='ftp')  #hoge$runで指定したSRRから始まるIDのFASTQファイルのダウンロード
	

無事ダウンロードが終了すると、作業ディレクトリ(「デスクトップ」上の「SRP011435」フォルダ)中に9つのファイルが存在するはずです。 4Gb程度ある"SRAmetadb.sqlite"ファイルは無視して構いません。残りの"SRR"からはじまる8つのファイルがダウンロードしたRNA-seqデータです。 オリジナルのサンプル名(の略称)で対応関係を表すとsrp011435_samplename.txtのようになっていることがわかります。 尚このファイルはマッピング時の入力ファイルとしても用います。

Step2. シロイヌナズナ(A. thaliana)ゲノムへのマッピングおよびカウントデータ取得:

マップしたいFASTQファイルリストおよびそのサンプル名を記述したsrp011435_samplename.txtを作業ディレクトリに保存したうえで、下記を実行します。

BSgenomeパッケージで利用可能なBSgenome.Athaliana.TAIR.TAIR9へマッピングしています。 名前から推測できるように"TAIR"の"TAIR9"にマップしているのと同じです。BSgenome.Athaliana.TAIR.TAIR9パッケージインストールされていない場合は自動でインストールしてくれるので特に気にする必要はありません。

basic alignerの一つであるBowtieを内部的に用いており、ここではマッピング時のオプションをデフォルトにしています。 原著論文中で用いられたTopHatと同じsplice-aware alignerののカテゴリに含まれるSpliceMap (Au et al., Nucleic Acids Res., 2010) を利用したい場合は、qAlign関数実行のところでsplicedAlignmentオプションをBowtieに対応する"F"からSpliceMapに対応する"T"に変更してください。

TAIR9にマップした結果であり、UCSCからはArabidopsisの遺伝子アノテーション情報が提供されていないため、 TAIR10_GFF3_genes.gffを予めダウンロードしておき、makeTxDbFromGFF関数を用いてTxDbオブジェクトを作成しています。

マシンパワーにもよりますが、ノートPCでも10時間程度で終わると思います。

マップ後 | カウント情報取得 | single-end | ゲノム | アノテーション有 | QuasR(Gaidatzis_2015)の記述内容と基本的に同じです。

in_f1 <- "srp011435_samplename.txt"    #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "BSgenome.Athaliana.TAIR.TAIR9"#入力ファイル名を指定してin_f2に格納(リファレンス配列)
in_f3 <- "TAIR10_GFF3_genes.gff"       #入力ファイル名を指定してin_f3に格納(GFF3またはGTF形式のアノテーションファイル)
out_f1 <- "srp011435_QC_bowtie.pdf"    #出力ファイル名を指定してout_f1に格納
out_f2 <- "srp011435_count_bowtie.txt" #出力ファイル名を指定してout_f2に格納
out_f3 <- "srp011435_genelength.txt"   #出力ファイル名を指定してout_f3に格納
out_f4 <- "srp011435_RPKM_bowtie.txt"  #出力ファイル名を指定してout_f4に格納
out_f5 <- "srp011435_transcript_seq.fa"#出力ファイル名を指定してout_f5に格納
out_f6 <- "srp011435_other_info1.txt"  #出力ファイル名を指定してout_f6に格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param3 <- "gene"                       #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み

#マッピングおよびQCレポート用ファイル作成
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping,#マッピングを行うqAlign関数を実行した結果をoutに格納
              splicedAlignment=F)      #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
qQCReport(out, pdfFilename=out_f1)     #QCレポート結果をファイルに保存
palette("default")                     #おまじない
time_e - time_s                        #計算時間を表示(単位は秒)

#カウントデータ取得およびファイル保存
txdb <- makeTxDbFromGFF(in_f3) #txdbオブジェクトの作成
count <- qCount(out, txdb, reportLevel=param3)#カウントデータ行列を取得してcountに格納
data <- count[,-1]                     #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#遺伝子配列長情報取得およびファイル保存
genelength <- count[,1]                #遺伝子配列長情報をgenelengthに格納
tmp <- cbind(names(genelength), genelength)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPKM取得およびファイル保存
nf_RPM <- 1000000/colSums(data)        #正規化係数(RPM補正用)を計算した結果をnf_RPMに格納
RPM <- sweep(data, 2, nf_RPM, "*")     #正規化係数を各列に掛けた結果をRPMに格納
nf_RPK <- 1000/genelength              #正規化係数(RPK補正用)を計算した結果をnf_RPKに格納
RPKM <- sweep(RPM, 1, nf_RPK, "*")     #正規化係数を各行に掛けた結果をRPKMに格納
tmp <- cbind(rownames(RPKM), RPKM)     #保存したい情報をtmpに格納
write.table(tmp, out_f4, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#転写物配列情報取得およびファイル保存
library(in_f2, character.only=T)       #指定したパッケージの読み込み
tmp <- ls(paste("package", in_f2, sep=":"))#指定したパッケージで利用可能なオブジェクト名を取得した結果をtmpに格納
genome <- eval(parse(text=tmp))        #文字列tmpをRオブジェクトとしてgenomeに格納(パッケージ中にはオブジェクトが一つしか存在しないという前提です)
fasta <- extractTranscriptSeqs(genome, txdb)#転写物塩基配列情報を取得した結果をfastaに格納
fasta                                  #確認してるだけです
writeXStringSet(fasta, file=out_f5, format="fasta", width=50)#tmpの中身を指定したファイル名で保存

#ファイルに保存(各種情報)
sink(out_f6)                           #指定したファイルへの書き込み指令(表示結果がファイルに保存される)
cat("1. Computation time for mapping (in second).\n")#計算時間を表示(一番右側の数字。単位はsecond)
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
cat("\n\n2. Options used for mapping.\n")#マッピングに用いたオプション情報を表示
out@alignmentParameter                 #マッピングに用いたオプション情報を表示
cat("\n\n3. Alignment statistics.\n")  #マッピング結果(alignment statistics)の表示。
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数
cat("\n\n4. Gene annotation info.\n")  #UCSCからの遺伝子アノテーション情報取得時のバージョン情報などを表示
txdb                                   #UCSCからの遺伝子アノテーション情報取得時のバージョン情報などを表示
cat("\n\n5. Session info.\n")          #解析に用いたRや各種パッケージのバージョン情報を表示
sessionInfo()                          #解析に用いたRや各種パッケージのバージョン情報を表示
sink()                                 #書き込み終了の指令
	

無事マッピングが終了すると、指定した6つのファイルが生成されているはずです。

  1. QCレポートファイル(srp011435_QC_bowtie.pdf):Quality Controlレポートです。よく利用されるFastQCのようなものです。
  2. カウントデータファイル(srp011435_count_bowtie.txt):グループ(サンプル)間での発現変動遺伝子同定に用います。
  3. 遺伝子配列長情報ファイル(srp011435_genelength.txt):配列長とカウント数の関係を調べたいときなどに用います。これはおまけです。
  4. RPKM補正後のファイル(srp011435_RPKM_bowtie.txt):同一サンプル内での発現レベルの大小関係を知りたいときなどに用います。
  5. 転写物塩基配列ファイル(srp011435_transcript_seq.fa):(遺伝子ではなく)転写物の塩基配列のmulti-FASTAファイルです。参考まで。
  6. その他の各種情報ファイル(srp011435_other_info1.txt):論文作成時に必要な、マッピング時に用いたオプション情報、マップされたリード数、Rおよび用いたパッケージのバージョン情報などを含みます。

Step2. シロイヌナズナ(A. thaliana)ゲノムへのマッピングおよびカウントデータ取得(リファレンスがmulti-FASTAファイルの場合):

マップしたいFASTQファイルリストおよびそのサンプル名を記述したsrp011435_samplename.txtを作業ディレクトリに保存したうえで、下記を実行します。 シロイヌナズナのゲノム配列ファイル(TAIR10_chr_all.fas.gz)へマッピングしています。 但し、マッピングに用いるQuasRパッケージ中のqAlign関数がリファレンス配列ファイルの拡張子として"*.fasta", "*.fa", "*.fna"しか認識してくれません。 また、カウントデータを取得するために遺伝子アノテーションファイル(TAIR10_GFF3_genes.gff)を利用する必要がありますが、 このファイル中の染色体名と揃える必要があるため、TAIR10_chr_all.fas.gzファイル中のdescription部分をparamで指定した文字列に置換したファイル(tmp_genome.fasta)を中間ファイルとして作成しています。 TAIR10_GFF3_genes.gffを予めダウンロードしておき、makeTxDbFromGFF関数を用いてTxDbオブジェクトを作成しています。 マシンパワーにもよりますが、ノートPCでも10時間程度で終わると思います。マップ後 | カウント情報取得 | single-end | ゲノム | アノテーション有 | QuasR(Gaidatzis_2015)の記述内容と基本的に同じです。 2014年5月2日までextractTranscriptsFromGenome関数を用いて転写物配列情報を取得していましたが、「'extractTranscriptsFromGenome' is deprecated. Use 'extractTranscriptSeqs' instead.」 という警告メッセージが出たので、extractTranscriptSeqs関数に変更しています。尚、Step2のトータル計算時間はノートPCで7時間程度です。

in_f <- "TAIR10_chr_all.fas.gz"        #入力ファイル名を指定してin_fに格納
out_f <- "tmp_genome.fasta"            #出力ファイル名を指定してout_fに格納
param <- c("Chr1","Chr2","Chr3","Chr4","Chr5","ChrM","ChrC")#置換したい文字列を指定

#必要なパッケージをロード
library(Biostrings)                    #パッケージの読み込み

#入力ファイルの読み込み
fasta <- readDNAStringSet(in_f, format="fasta")#in_fで指定したファイルの読み込み
fasta                                  #確認してるだけです

#本番
names(fasta) <- param                  #names(fasta)の中身をparamで置換
fasta                                  #確認してるだけです

#ファイルに保存
writeXStringSet(fasta, file=out_f, format="fasta", width=50)#fastaの中身を指定したファイル名で保存
	
in_f1 <- "srp011435_samplename.txt"    #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "tmp_genome.fasta"            #入力ファイル名を指定してin_f2に格納(リファレンス配列)
in_f3 <- "TAIR10_GFF3_genes.gff"       #入力ファイル名を指定してin_f3に格納(GFF3またはGTF形式のアノテーションファイル)
out_f1 <- "srp011435_QC_bowtie_2.pdf"  #出力ファイル名を指定してout_f1に格納
out_f2 <- "srp011435_count_bowtie_2.txt"#出力ファイル名を指定してout_f2に格納
out_f3 <- "srp011435_genelength_2.txt" #出力ファイル名を指定してout_f3に格納
out_f4 <- "srp011435_RPKM_bowtie_2.txt"#出力ファイル名を指定してout_f4に格納
#out_f5 <- "srp011435_transcript_seq_2.fa"#出力ファイル名を指定してout_f5に格納
out_f6 <- "srp011435_other_info1_2.txt"#出力ファイル名を指定してout_f6に格納
param_mapping <- "-m 1 --best --strata -v 2"#マッピング時のオプションを指定
param3 <- "gene"                       #カウントデータ取得時のレベルを指定:"gene", "exon", "promoter", "junction"のいずれかを指定可能

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicFeatures)               #パッケージの読み込み
#library(Rsamtools)                     #パッケージの読み込み

#マッピングおよびQCレポート用ファイル作成
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2, alignmentParameter=param_mapping,#マッピングを行うqAlign関数を実行した結果をoutに格納
              splicedAlignment=F)      #マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
qQCReport(out, pdfFilename=out_f1)     #QCレポート結果をファイルに保存
palette("default")                     #おまじない
time_e - time_s                        #計算時間を表示(単位は秒)

#カウントデータ取得およびファイル保存
txdb <- makeTxDbFromGFF(in_f3) #txdbオブジェクトの作成
count <- qCount(out, txdb, reportLevel=param3)#カウントデータ行列を取得してcountに格納
data <- count[,-1]                     #カウント情報をdataに格納
tmp <- cbind(rownames(data), data)     #保存したい情報をtmpに格納
write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#遺伝子配列長情報取得およびファイル保存
genelength <- count[,1]                #遺伝子配列長情報をgenelengthに格納
tmp <- cbind(names(genelength), genelength)#保存したい情報をtmpに格納
write.table(tmp, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#RPKM取得およびファイル保存
nf_RPM <- 1000000/colSums(data)        #正規化係数(RPM補正用)を計算した結果をnf_RPMに格納
RPM <- sweep(data, 2, nf_RPM, "*")     #正規化係数を各列に掛けた結果をRPMに格納
nf_RPK <- 1000/genelength              #正規化係数(RPK補正用)を計算した結果をnf_RPKに格納
RPKM <- sweep(RPM, 1, nf_RPK, "*")     #正規化係数を各行に掛けた結果をRPKMに格納
tmp <- cbind(rownames(RPKM), RPKM)     #保存したい情報をtmpに格納
write.table(tmp, out_f4, sep="\t", append=F, quote=F, row.names=F)#tmpの中身を指定したファイル名で保存

#転写物配列情報取得およびファイル保存はエラーが出るので実行しないようにしています。
#fasta_trans <- extractTranscriptSeqs(FaFile(in_f2), txdb)#転写物塩基配列情報を取得した結果をfasta_transに格納
#fasta_trans <- extractTranscriptSeqs(FaFile(in_f2), exonsBy(txdb, by="tx", use.names=TRUE))#転写物塩基配列情報を取得した結果をfasta_transに格納
#fasta_trans <- extractTranscriptSeqs(FaFile(in_f2), cdsBy(txdb, by="tx", use.names=TRUE))#転写物塩基配列情報を取得した結果をfasta_transに格納
#fasta_trans <- extractTranscriptSeqs(fasta, txdb)#転写物塩基配列情報を取得した結果をfasta_transに格納
#fasta_trans <- extractTranscriptSeqs(fasta, exonsBy(txdb, by="tx", use.names=TRUE))#転写物塩基配列情報を取得した結果をfasta_transに格納
#fasta_trans                            #確認してるだけです
#writeXStringSet(fasta_trans, file=out_f5, format="fasta", width=50)#tmpの中身を指定したファイル名で保存

#ファイルに保存(各種情報)
sink(out_f6)                           #指定したファイルへの書き込み指令(表示結果がファイルに保存される)
cat("1. Computation time for mapping (in second).\n")#計算時間を表示(一番右側の数字。単位はsecond)
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
cat("\n\n2. Options used for mapping.\n")#マッピングに用いたオプション情報を表示
out@alignmentParameter                 #マッピングに用いたオプション情報を表示
cat("\n\n3. Alignment statistics.\n")  #マッピング結果(alignment statistics)の表示。
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数
cat("\n\n4. Gene annotation info.\n")  #UCSCからの遺伝子アノテーション情報取得時のバージョン情報などを表示
txdb                                   #UCSCからの遺伝子アノテーション情報取得時のバージョン情報などを表示
cat("\n\n5. Session info.\n")          #解析に用いたRや各種パッケージのバージョン情報を表示
sessionInfo()                          #解析に用いたRや各種パッケージのバージョン情報を表示
sink()                                 #書き込み終了の指令
	

無事マッピングが終了すると、指定した6つのファイルが生成されているはずです。

  1. QCレポートファイル(srp011435_QC_bowtie_2.pdf):Quality Controlレポートです。よく利用されるFastQCのようなものです。
  2. カウントデータファイル(srp011435_count_bowtie_2.txt):グループ(サンプル)間での発現変動遺伝子同定に用います。
  3. 遺伝子配列長情報ファイル(srp011435_genelength_2.txt):配列長とカウント数の関係を調べたいときなどに用います。これはおまけです。
  4. RPKM補正後のファイル(srp011435_RPKM_bowtie_2.txt):同一サンプル内での発現レベルの大小関係を知りたいときなどに用います。
  5. その他の各種情報ファイル(srp011435_other_info1_2.txt):論文作成時に必要な、マッピング時に用いたオプション情報、マップされたリード数、Rおよび用いたパッケージのバージョン情報などを含みます。

Step3. サンプル間クラスタリング:

カウントデータ(srp011435_count_bowtie_2.txt)を用いてサンプル間の全体的な類似度を眺めることを目的として、サンプル間クラスタリングを行います。

類似度は「1-Spearman相関係数」、方法は平均連結法で行っています。 TCC論文(Sun et al., 2013)のFig.3でも同じ枠組みでクラスタリングを行った結果を示していますので、英語論文執筆時の参考にどうぞ。 PearsonではなくSpearmanで行っているのは、ダイナミックレンジが広いので、順序尺度程度にしておいたほうがいいだろうという思想が一番大きいです。 log2変換してダイナミックレンジを圧縮してPearsonにするのも一般的には「アリ」だとは思いますが、マップされたリード数が100万以上あるにも関わらずRPKMデータを用いると、RPKM補正後の値が1未満のものがかなり存在すること、 そしてlogをとれるようにゼロカウントデータの処理が必要ですがやりかた次第で結果がころころかわりうるという状況が嫌なので、RNA-seqデータの場合には私はSpearman相関係数にしています。 また、ベクトルの要素間の差を基本とするdistance metrics (例:ユークリッド距離やマンハッタン距離など)は、比較的最近のRNA-seqデータ正規化法 (TMM: Robinson and Oshlack, 2010, TbT: Kadota et al., 2012, TCC; Sun et al., 2013)論文の重要性が理解できれば、その類似度は少なくともfirst choiceにならないと思われます。 つまり、サンプルごとに転写物の組成比が異なるため、RPMやCPMのような総リード数を補正しただけのデータを用いて「サンプル間の数値の差」に基づいて距離を定めるのはいかがなものか?という思想です。 逆に、ユークリッド距離などを用いてクラスタリングを行った結果と比較することで、転写物の組成比に関する知見が得られるのかもしれません。 さらに、全体的な発現レベルが低いものを予めフィルタリングしておく必要もあるのだろうとは思います。このあたりは、真の回答はありませんので、 (手持ちのデータにこの類似度を適用したときの理論上の短所をきちんと理解したうえで)いろいろ試すというのは重要だとは思います。

ここではカウントデータでクラスタリングをしていますが、おそらく配列長補正後のRPKMデータ(srp011435_RPKM_bowtie_2.txt) でも得られる樹形図のトポロジー(相対的な位置関係)はほぼ同じになるのではないかと思っています。配列長補正の有無で、サンプル間の相関係数の値自体は変わりますが、 同じグループに属するサンプルであれば反復実験間でそれほど違わないので、多少順位に変動があっても全体としては相殺されるはずです...が確証はありません。

in_f3 <- "srp011435_count_bowtie_2.txt"#入力ファイル名を指定してin_f3に格納
out_f6 <- "srp011435_count_cluster.png"#出力ファイル名を指定してout_f6に格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#入力ファイルの読み込み
data <- read.table(in_f3, header=TRUE, row.names=1, sep="\t", quote="")#指定したファイルの読み込み
dim(data)                              #オブジェクトdataの行数と列数を表示

#前処理(フィルタリング)
obj <- as.logical(rowSums(data) > 0)   #条件を満たすかどうかを判定した結果をobjに格納
data <- unique(data[obj,])             #objがTRUEとなる行のみ抽出し、ユニークパターンのみにした結果をdataに格納
dim(data)                              #オブジェクトdataの行数と列数を表示

#クラスタリングおよび結果の保存
data.dist <- as.dist(1 - cor(data, method="spearman"))#サンプル間の距離を計算し、結果をdata.distに格納
out <- hclust(data.dist, method="average")#階層的クラスタリングを実行し、結果をoutに格納
png(out_f6, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

上と同じ結果は、TCC ver. 1.4.0以降で clusterSample関数を用いて得ることができます。

in_f3 <- "srp011435_count_bowtie_2.txt"#入力ファイル名を指定してin_f3に格納
out_f6 <- "hoge.png"                   #出力ファイル名を指定してout_f6に格納
param_fig <- c(500, 400)               #ファイル出力時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f3, header=TRUE, row.names=1, sep="\t", quote="")#指定したファイルの読み込み

#クラスタリングおよび結果の保存
out <- clusterSample(data, dist.method="spearman",
                        hclust.method="average", unique.pattern=TRUE)
png(out_f6, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(out)                              #樹形図(デンドログラム)の表示
dev.off()                              #おまじない
	

無事計算が終了すると、指定したファイル(srp011435_count_cluster.png)が生成されているはずです。

Step4. 発現変動遺伝子(DEG)同定:

カウントデータファイル(srp011435_count_bowtie_2.txt)を入力として2群間で発現の異なる遺伝子の検出を行います。

このデータはtechnical replicatesを含むので、それをマージしたのちbiological replicatesのデータにしてからTCCパッケージ(Sun et al., 2013)の推奨ガイドラインに従って、 iDEGES/edgeR正規化(Sun et al., 2013; Robinson et al., 2010; Robinson and Oshlack, 2010; Robinson and Smyth, 2008)を行ったのち、 edgeRパッケージ中のan exact test (Robinson and Smyth, 2008)を行って、DEG検出を行っています。

解析 | 発現変動 | 2群間 | 対応なし | 複製あり | TCC(Sun_2013)の記述内容と基本的に同じです。

technical replicatesデータのマージ。ここでは、アドホックに2列分ごとのサブセットを抽出し、行の総和を計算したのち、結合しています。

in_f <- "srp011435_count_bowtie_2.txt" #入力ファイル名を指定してin_fに格納
out_f <- "srp011435_count_bowtie_3.txt"#出力ファイル名を指定してout_fに格納

#入力ファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#in_fで指定したファイルの読み込み
head(data)                             #確認してるだけです

#本番(technical replicatesをマージ)
DEX_bio1 <- rowSums(data[,1:2])        #サブセットを抽出し、行の総和を計算
DEX_bio2 <- rowSums(data[,3:4])        #サブセットを抽出し、行の総和を計算
mock_bio1 <- rowSums(data[,5:6])       #サブセットを抽出し、行の総和を計算
mock_bio2 <- rowSums(data[,7:8])       #サブセットを抽出し、行の総和を計算
out <- cbind(DEX_bio1, DEX_bio2, mock_bio1, mock_bio2)#列方向で結合した結果をoutに格納
head(out)                              #確認してるだけです

#ファイルに保存
tmp <- cbind(rownames(out), out)#保存したい情報をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存
	
in_f4 <- "srp011435_count_bowtie_3.txt"#入力ファイル名を指定してin_f4に格納
out_f7 <- "srp011435_DEG_bowtie.txt"   #出力ファイル名を指定してout_f7に格納
out_f8 <- "srp011435_MAplot_bowtie.png"#出力ファイル名を指定してout_f8に格納
out_f9 <- "srp011435_other_info2.txt"  #出力ファイル名を指定してout_f9に格納
param_G1 <- 2                          #G1群のサンプル数を指定
param_G2 <- 2                          #G2群のサンプル数を指定
param_FDR <- 0.05                      #false discovery rate (FDR)閾値を指定
param_fig <- c(430, 390)               #MA-plot描画時の横幅と縦幅を指定(単位はピクセル)

#必要なパッケージをロード
library(TCC)                           #パッケージの読み込み

#入力ファイルの読み込み
data <- read.table(in_f4, header=TRUE, row.names=1, sep="\t", quote="")#in_f4で指定したファイルの読み込み

#前処理(TCCクラスオブジェクトの作成)
data.cl <- c(rep(1, param_G1), rep(2, param_G2))#G1群を1、G2群を2としたベクトルdata.clを作成
tcc <- new("TCC", data, data.cl)       #TCCクラスオブジェクトtccを作成

#本番(正規化)
tcc <- calcNormFactors(tcc, norm.method="tmm", test.method="edger",#正規化を実行した結果をtccに格納
                       iteration=3, FDR=0.1, floorPDEG=0.05)#正規化を実行した結果をtccに格納

#本番(DEG検出)
tcc <- estimateDE(tcc, test.method="edger", FDR=param_FDR)#DEG検出を実行した結果をtccに格納
result <- getResult(tcc, sort=FALSE)   #p値などの計算結果をresultに格納
sum(tcc$stat$q.value < param_FDR)      #条件を満たす遺伝子数を表示

#ファイルに保存(テキストファイル)
normalized <- getNormalizedData(tcc)   #正規化後のデータを取り出してnormalizedに格納
tmp <- cbind(rownames(tcc$count), normalized, result)#正規化後のデータの右側にDEG検出結果を結合したものをtmpに格納
write.table(tmp, out_f7, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f7で指定したファイル名で保存

#ファイルに保存(M-A plot)
png(out_f8, pointsize=13, width=param_fig[1], height=param_fig[2])#出力ファイルの各種パラメータを指定
plot(tcc, FDR=param_FDR)               #param_FDRで指定した閾値を満たすDEGをマゼンタ色にして描画
legend("topright", c(paste("DEG(FDR<", param_FDR, ")", sep=""), "non-DEG"),#凡例を作成
       col=c("magenta", "black"), pch=20)#凡例を作成
dev.off()                              #おまじない

#ファイルに保存(各種情報)
sink(out_f9)                           #指定したファイルへの書き込み指令(表示結果がファイルに保存される)
cat("1. Numbers of DEGs satisfying several FDR thresholds.\n")#任意のFDR閾値を満たす遺伝子数を表示
cat("FDR < 0.05:");print(sum(tcc$stat$q.value < 0.05))#任意のFDR閾値を満たす遺伝子数を表示
cat("FDR < 0.10:");print(sum(tcc$stat$q.value < 0.10))#任意のFDR閾値を満たす遺伝子数を表示
cat("FDR < 0.20:");print(sum(tcc$stat$q.value < 0.20))#任意のFDR閾値を満たす遺伝子数を表示
cat("FDR < 0.30:");print(sum(tcc$stat$q.value < 0.30))#任意のFDR閾値を満たす遺伝子数を表示
cat("\n\n2. Session info.\n")          #解析に用いたRや各種パッケージのバージョン情報を表示
sessionInfo()                          #解析に用いたRや各種パッケージのバージョン情報を表示
sink()                                 #書き込み終了の指令
	

無事計算が終了すると、指定した3つのファイルが生成されているはずです。

  1. 発現変動解析結果ファイル(srp011435_DEG_bowtie.txt):iDEGES/edgeR-edgeRパイプラインによるDEG同定結果です。 "rank"列でソートすると発現変動の度合い順になります。"q.value"列の情報は任意のFDR閾値を満たす遺伝子数を調べるときに用います。 尚、左側の実数の数値データはiDEGES/edgeR正規化後のデータです。M-A plotはこの数値データに基づいて作成されています。尚、配列長補正は掛かっておりませんのでご注意ください。
  2. M-A plotファイル(srp011435_MAplot_bowtie.png):M versus A plotです。横軸が平均発現レベル(右側が高発現、左側が低発現)。縦軸がlog(G2/G1)で、0より下がG1群で高発現、0より上がG2群で高発現です。
  3. その他の各種情報ファイル(srp011435_other_info2.txt):FDR < 0.05, 0.1, 0.2, 0.3を満たす遺伝子数、論文作成時に必要な、Rおよび用いたパッケージのバージョン情報(特にTCC)などを含みます。

パイプライン | ゲノム | small RNA | SRP016842(Nie_2013)

Nie et al., BMC Genomics, 2013のカイコ (Bombyx mori) small RNA-seqデータが GSE41841に登録されています。 (そしてリンク先のGSM1025527からも様々な情報を得ることができます。) ここでは、SRAdbパッケージを用いたそのFASTQ形式ファイルのダウンロードから、 QuasRパッケージを用いたマッピングまでを行う一連の手順を示します。

basic alignerの一つであるBowtieをQuasRの内部で用いています。

ここでは「デスクトップ」上に「SRP016842」というフォルダを作成しておき、そこで作業を行うことにします。

Step1. RNA-seqデータのgzip圧縮済みのFASTQファイルをダウンロード:

論文中の記述からGSE41841を頼りに、 SRP016842にたどり着いています。 したがって、ここで指定するのは"SRP016842"となります。

以下を実行して得られるsmall RNA-seqファイルは一つ(SRR609266.fastq.gz)で、ファイルサイズは400Mb弱、11928428リードであることがわかります。

イントロ | NGS | 配列取得 | FASTQ or SRA | SRAdb(Zhu_2013)の記述内容と基本的に同じです。

param <- "SRP016842"                   #取得したいSRA IDを指定

#必要なパッケージをロード
library(SRAdb)                         #パッケージの読み込み

#前処理
#sqlfile <- "SRAmetadb.sqlite"         #最新でなくてもよく、手元に予めダウンロードしてある"SRAmetadb.sqlite"ファイルをそのまま利用する場合はこちら
sqlfile <- getSRAdbFile()              #最新のSRAmetadb SQLiteファイルをダウンロードして解凍(圧縮状態で300Mbほどありますので注意!)
sra_con <- dbConnect(SQLite(), sqlfile)#おまじない

#前処理(実験デザインの全体像を表示)
hoge <- sraConvert(param, sra_con=sra_con)#paramで指定したSRA IDに付随するstudy (SRP...), sample(SRS...), experiment(SRX...), run(SRR...)のaccession番号情報を取得
hoge                                   #hogeの中身を表示
apply(hoge, 2, unique)                 #hoge行列の列ごとにユニークな文字列を表示させている。
getFASTQinfo(in_acc=hoge$run)          #hoge$runで指定したSRRから始まるIDのFASTQファイルサイズ情報などを表示

#本番(FASTQファイルのダウンロード)
getFASTQfile(hoge$run, srcType='ftp')  #hoge$runで指定したSRRから始まるIDのFASTQファイルのダウンロード
	

無事ダウンロードが終了すると、作業ディレクトリ(「デスクトップ」上の「SRP016842」フォルダ)中に2つのファイルが存在するはずです。 4Gb程度ある"SRAmetadb.sqlite"ファイルは無視して構いません。残りの"SRR"からはじまるファイル(SRR609266.fastq.gz)がダウンロードしたsRNA-seqデータです。 オリジナルのサンプル名(の略称)で対応関係を表すとsrp016842_samplename.txtのようになっていることがわかります。 尚このファイルはマッピング時の入力ファイルとしても用います。

Step2. カイコゲノム配列をダウンロード:

カイコゲノム配列はBSgenomeパッケージとして提供されていないため、自力で入手する必要があります。 手順としては、農業生物資源研究所(NIAS)が提供しているカイコゲノム配列のウェブページからIntegrated sequences (integretedseq.txt.gz) をダウンロードし、解凍します。解凍後のファイル名は"integretedseq.txt"となりますが、拡張子を".txt"から".fa"に変更して、"integretedseq.fa"としたものを作業ディレクトリ(「デスクトップ」上の「SRP016842」フォルダ)上にコピーしておきます。

Step3. small RNA-seqデータの前処理:

原著論文(Nie et al., 2013)中では、アダプター配列やクオリティの低いリードを除去したのち、ゲノムにマッピングしたと書いてあります。 アダプター配列情報はどこにも書かれていませんでしたが、Table S2中のアダプター配列除去後の最も短いリードが18 nt (例:"GCAGTCGTGGCCGAGCGG")であり、 「この18 nt」と「この配列を含む生リード配列の差分」がアダプター配列ということになります。 詳細な情報は書かれていませんでしたが、おそらくアダプター配列は"TGGAATTCTCGGGTGCCAAGGAACTCCAGTC..."という感じだろうと推測できます。

ここでは、ダウンロードした"SRR609266.fastq.gz"ファイルを入力として、 1塩基ミスマッチまで許容して(推定)アダプター配列除去を行ったのち、"ACGT"のみからなる配列(許容するN数が0)で、 配列長が18nt以上のものをフィルタリングして出力しています。

in_f <- "SRR609266.fastq.gz"           #入力ファイル名を指定してin_fに格納(RNA-seqファイル)
out_f <- "SRR609266_p.fastq.gz"        #出力ファイル名を指定してout_fに格納
param_adapter <- "TGGAATTCTCGGGTGCCAAGGAACTCCAGTC"#アダプター配列を指定
param_mismatch <- 1                    #許容するミスマッチ数を指定
param_nBases <- 0                      #許容するNの数を指定
param_minLength <- 18                  #アダプター配列除去後の許容する最短配列長を指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み

#本番(前処理)
res <- preprocessReads(filename=in_f,  #前処理を実行
             outputFilename=out_f,     #前処理を実行
             Rpattern=param_adapter,   #前処理を実行
             max.Rmismatch=rep(param_mismatch, nchar(param_adapter)),#前処理を実行
             nBases=param_nBases,      #前処理を実行
             minLength=param_minLength)#前処理を実行
res                                    #確認してるだけです
	

前処理実行後のresオブジェクトを眺めると、入力ファイルのリード数が11928428であり、 アダプター配列除去後に18nt未満の長さになってしまったためにフィルタリングされたリード数が157229、 "N"を1つ以上含むためにフィルタリングされたリード数が21422あったことがわかります。ここでは配列長分布は得ておりませんが、 出力ファイルを展開して配列長分布を調べると原著論文中のTable S1と似た結果になっていることから、ここでの処理が妥当であることがわかります。

Step4. カイコゲノムへのマッピングおよびカウントデータ取得:

マップしたい前処理後のFASTQファイル名("SRR609266_p.fastq.gz")およびその任意のサンプル名を記述したsrp016842_samplename.txtを作業ディレクトリに保存したうえで、下記を実行します。

Step2でダウンロードしたintegretedseq.faへマッピングしています。

basic alignerの一つであるBowtieを内部的に用いており、 ここではマッピング時のオプションを"-m 1 -v 0"とし、「ミスマッチを許容せず1ヶ所にのみマップされるもの」をレポートしています。 ミスマッチを許容していないため、--best --strataというオプションは事実上意味をなさないためにつけていません。 QuasRのマニュアル中のようにalignmentParameterオプションは特に指定せず(デフォルト)、50ヶ所にマップされるリードまでをレポートする "maxHits=50"オプションをつけるという思想もあります。

マシンパワーにもよりますが、20分程度で終わると思います。

マップ後 | カウント情報取得 | single-end | ゲノム | アノテーション有 | QuasR(Gaidatzis_2015)の記述内容と基本的に同じです。

in_f1 <- "srp016842_samplename.txt"    #入力ファイル名を指定してin_f1に格納(RNA-seqファイル)
in_f2 <- "integretedseq.fa"            #入力ファイル名を指定してin_f2に格納(リファレンス配列)
out_f1 <- "srp016842_QC.pdf"           #出力ファイル名を指定してout_f1に格納
out_f2 <- "srp016842_other_info1.txt"  #出力ファイル名を指定してout_f2に格納
param_mapping <- "-m 1 -v 0"           #マッピング時のオプションを指定

#必要なパッケージをロード
library(QuasR)                         #パッケージの読み込み
library(GenomicAlignments)             #パッケージの読み込み
library(Rsamtools)                     #パッケージの読み込み

#マッピングおよびQCレポート用ファイル作成
time_s <- proc.time()                  #計算時間を計測するため
out <- qAlign(in_f1, in_f2,            #マッピングを行うqAlign関数を実行した結果をoutに格納
      alignmentParameter=param_mapping)#マッピングを行うqAlign関数を実行した結果をoutに格納
time_e <- proc.time()                  #計算時間を計測するため
qQCReport(out, pdfFilename=out_f1)     #QCレポート結果をファイルに保存

#本番(マップされたリードの和集合領域およびその領域に対するカウント情報取得)
tmpfname <- out@alignments[,1]         #ファイル名(in_f1の1列目に相当)をtmpfnameとして取り扱いたいだけです
tmpsname <- out@alignments[,2]         #サンプル名(in_f1の2列目に相当)をtmpsnameとして取り扱いたいだけです
for(i in 1:length(tmpfname)){          #サンプル数(ファイル数)分だけループを回す
  k <- readGAlignments(tmpfname[i])    #BAM形式ファイルを読み込んだ結果をkに格納(これはGAlignmentsオブジェクト)
  m <- reduce(granges(k))              #GRangesオブジェクトへの変換および和集合領域情報を得た結果のGRangesオブジェクトをmに格納
  tmpcount <- summarizeOverlaps(m, tmpfname[i])#GRangesオブジェクトmに対するBAMファイルのマップ結果のカウント情報取得結果をtmpcountに格納
  count <- assays(tmpcount)$counts     #SummarizedExperimentクラスオブジェクトのtmpcountからカウントデータ行列部分を抽出した結果をcountに格納
  colnames(count) <- tmpsname[i]       #列名を付与
  tmp <- cbind(as.data.frame(m), count)#和集合領域情報とカウント情報を結合した結果をtmpに格納
  out_f <- sub(".bam", "_range.txt", tmpfname[i])#変更したファイル名を作成した結果をout_fに格納
  write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F, col.names=T)#tmpの中身を指定したファイル名で保存
  #和集合領域の塩基配列情報取得
  out_f <- sub(".bam", "_range.fa", tmpfname[i])#変更したファイル名を作成した結果をout_fに格納
  fasta <- getSeq(FaFile(in_f2), m)    #塩基配列情報取得結果をfastaに格納
  h <- as.data.frame(m)                #description行情報の作成
  names(fasta) <- paste(h[,1],h[,2],h[,3],h[,4],h[,5], sep="_")#description行情報の作成
  writeXStringSet(fasta, file=out_f, format="fasta", width=50)#description行情報の作成
}

#ファイルに保存(各種情報)
sink(out_f2)                           #指定したファイルへの書き込み指令(表示結果がファイルに保存される)
cat("1. Computation time for mapping (in second).\n")#計算時間を表示(一番右側の数字。単位はsecond)
time_e - time_s                        #計算時間を表示(一番右側の数字。単位はsecond)
cat("\n\n2. Options used for mapping.\n")#マッピングに用いたオプション情報を表示
out@alignmentParameter                 #マッピングに用いたオプション情報を表示
cat("\n\n3. Alignment statistics.\n")  #マッピング結果(alignment statistics)の表示。
alignmentStats(out)                    #マッピング結果(alignment statistics)の表示。seqlength:リファレンス配列の総塩基数、mappedとunmappedは対応するリード数
cat("\n\n4. Session info.\n")          #解析に用いたRや各種パッケージのバージョン情報を表示
sessionInfo()                          #解析に用いたRや各種パッケージのバージョン情報を表示
sink()                                 #書き込み終了の指令
	

無事マッピングが終了すると、指定した2つのファイルが生成されているはずです。

  1. QCレポートファイル(srp016842_QC.pdf):Quality Controlレポートです。よく利用されるFastQCのようなものです。
  2. その他の各種情報ファイル(srp016842_other_info1.txt):論文作成時に必要な、マッピング時に用いたオプション情報、マップされたリード数、Rおよび用いたパッケージのバージョン情報などを含みます。

この他にも以下に示すような形式のファイルがサンプルごとに自動生成されます。以下に示すファイル名中の"fa03ced5b37"に相当する部分はランダムな文字列からなり、サンプルごと、そして実行するたびに異なります。 理由は、同じ入力ファイルを異なるパラメータやリファレンス配列にマッピングしたときに、間違って上書きしてしまうのを防ぐためです。

SRA系

ソフト系

自分用

トップページへ