(Rで)マイクロアレイデータ解析(last modified 2013/05/27, since 2005)

What's new?



はじめに

このページは、マイクロアレイ(microarray)データ取得後のデータ解析をRで行うための一連の手続きをまとめたものであり、特にアグリバイオインフォマティクス教育研究プログラムの被養成者向けに作成したものです。
  実験研究者の方々は、Rを使うとよさそうだということはわかってはいても敷居が高いためなかなか踏み込めないという人が多いことと思います。 そこで、教育に携わる身として、これまでRにパッケージを提供してこられた諸氏の有用なプログラムとその使用例をこのページであらためて紹介することを通じて、実験研究者自身がよりよいマイクロアレイデータ解析を自力で行えるための一助になればと思っています。コピペで結果が出せます!
  以下は、検索エンジンなどから得た情報をまとめたものであり、本当に正しいやり方かどうかなど一切の保証はできませんので予めご承知おきください。 このページの中身自体は、所属機関とは一切関係ない一個人の備忘録のようなものです。 間違いや修正点、また「このような解析をやりたいがどうすればいいか?」などのリクエストがあればメール()をいただければ幸いです。特にアグリバイオインフォマティクス教育研究プログラム被養成者からのリクエストは優先的に対応します。

ここで紹介した様々な方法のほかにも多数の紹介しきれていないものがあります。 それらはBioconductorのAll Packagesから辿れますので、ある程度慣れてきたらこちらで自力で自分の目的に適したパッケージをインストールするなり調べるなりして解析してください(2012/4/25現在、Bioconductor version 2.10で536個のパッケージがあるようですね)。

(ほぼ余談ですが...)データベースのポータルサイトであるIntegbioデータベースカタログはデータベースをキーワード検索できて便利です。 簡単なデータベースの特徴なども記載されていて、非常に重宝しています。是非一度のぞいてみてください。
また、ゲノム解析ツール リンク集も初心者にとっては結構便利なのではと思います。
これらのデータベースや解析ツールは、最初はなかなかどのように使えばいいのか直感的に分かりづらいのですが、そのような場合には、ライフサイエンス統合データベースセンター(DBCLS)が発信している統合TVをのぞいてみてください。 様々なデータベースやツールの利用法をムービーで紹介している有難い番組です。
個人的にはこの三つのサイトを使いこなせば、ほとんど用が足りるのではと思っています。

最後に、東京大学大学院農学生命科学研究科の清水謙多郎教授、中井雄治特任准教授、そしてRの開発や普及に携わっている諸氏に御礼申し上げます。

このページ内で用いる色についての説明:
コメント
特にやらなくてもいいコマンド
プログラム実行時に目的に応じて変更すべき箇所
実行結果を表示(アンダーラインがついてるほうはリンクです。)

Rのインストールと起動

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



2012/03/20までの記述(上記をやっていれば、以下はやらなくていいです)
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")#おまじない
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/mvo.R")        #おまじない
install.packages("ADaCGH")                                     #ADaCGHパッケージのインストール
install.packages("agilp")                                      #agilpパッケージのインストール
install.packages("cclust")                                     #cclustパッケージのインストール
install.packages("celsius")                                    #celsiusパッケージのインストール
install.packages("corpcor")                                    #corpcorパッケージのインストール
install.packages("e1071")                                      #e1071パッケージのインストール
install.packages("eqtl")                                       #eqtlパッケージのインストール
install.packages("GeneCycle")                                  #GeneCycleパッケージのインストール
install.packages("geometry")                                   #geometryパッケージのインストール
install.packages("gRapHD")                                     #gRapHDパッケージのインストール
install.packages("GSA")                                        #GSAパッケージのインストール
install.packages("locfdr")                                     #locfdrパッケージのインストール
install.packages("longitudinal")                               #longitudinalパッケージのインストール
install.packages("permtest")                                   #permtestパッケージのインストール
install.packages("pvclust")                                    #pvclustパッケージのインストール
install.packages("qvalue")                                     #qvalueパッケージのインストール
install.packages("samr")                                       #samrパッケージのインストール
install.packages("som")                                        #somパッケージのインストール
install.packages("st")                                         #stパッケージのインストール
install.packages("varSelRF")                                   #varSelRFパッケージのインストール
#install.packages("VR")                                         #VRパッケージのインストール
source("http://bioconductor.org/biocLite.R")               #おまじない
biocLite()                                                     #おまじない
biocLite("affypdnn")                                           #affypdnnパッケージのインストール
biocLite("annotate")                                           #annotateパッケージのインストール
biocLite("ArrayExpress")                                       #ArrayExpressパッケージのインストール
biocLite("clusterStab")                                        #clusterStabパッケージのインストール
biocLite("DNAcopy")                                            #DNAcopyパッケージのインストール
biocLite("gcrma")                                              #gcrmaパッケージのインストール
biocLite("genefilter")                                         #genefilterパッケージのインストール
biocLite("GEOquery")                                           #GEOqueryパッケージのインストール
biocLite("GLAD")                                               #GLADパッケージのインストール
biocLite("GSEABase")                                           #GSEABaseパッケージのインストール
biocLite("KEGG.db")                                            #KEGG.dbパッケージのインストール
biocLite("limma")                                              #limmaパッケージのインストール
biocLite("marray")                                             #marrayパッケージのインストール
biocLite("maSigPro")                                           #maSigProパッケージのインストール
biocLite("org.Hs.eg.db")                                       #org.Hs.eg.dbパッケージのインストール
biocLite("OCplus")                                             #OCplusパッケージのインストール
biocLite("PGSEA")                                              #PGSEAパッケージのインストール
biocLite("plier")                                              #plierパッケージのインストール
biocLite("puma")                                               #pumaパッケージのインストール
biocLite("RankProd")                                           #RankProdパッケージのインストール
biocLite("RefPlus")                                            #RefPlusパッケージのインストール
biocLite("ROC")                                                #ROCパッケージのインストール
biocLite("SAGx")                                               #SAGxパッケージのインストール
biocLite("vsn")                                                #vsnパッケージのインストール
biocLite("xtable")                                             #xtableパッケージのインストール


Rの昔のバージョンのインストール

DFW (参考文献1)というAffymetrixチップの正規化法でわりとよく"思い通りの"階層的クラスタリング結果を導くような遺伝子発現行列データを生成してくれるAffymetrixデータ用の正規化法(嫌味ではなくいい方法なんだと思います)があります。 しかしこの正規化法は、R2.7.2あたりだと正常に動作していましたが、比較的最近のバージョン(R2.8.1以降)ではうまく動いてくれません。 そのような場合でも、Rの昔のバージョンをインストールしてDFWを実行することによって、DFWを利用することができます。 このような目的のために、ここでは、Rの任意の昔のバージョンをインストールするやり方をR2.7.2のインストールを例に紹介します
  1. ここをクリックして、任意のRのバージョンのところをクリック(例えば2.7.2)
  2. R-X.Y.Z-win32.exe(例えばR-2.7.2-win32.exe)をクリックして「実行」ボタンなどを聞かれるがままに押す
  3. R-X.Y.Zのアイコンがデスクトップにできるので、立ち上げて以下をコピペ
  4. source("http://bioconductor.org/biocLite.R")               #おまじない
    biocLite("affy")                                               #おまじない
    
    
    
これであとはDFWを参考にしてDFWの結果をエンジョイしてください。
参考文献1(Chen et al., Bioinformatics, 2007)

使用例(初心者向け):

Step 1:
Rを起動して以下をコピー&ペーストしてみてください。自分のマイクロアレイデータ解析を実際にRを用いて行う上で、このページの情報をもとに自分がどのような作業をすれば目的を達成できるかの参考になるはずです。
1+2         #1+2を計算
hoge <- 4   #hogeに4を代入
hoge        #hogeの中身を表示
sqrt(hoge)  #4のルートを計算
sqrt(4)     #4のルートを計算(当然同じ意味)
#の後の文章はコメントなので何を書いてもいいですよ。



Step 2:
実際に自分のマイクロアレイデータを用いて解析をしようと思い始めたとき、数行を一度にコピー&ペーストすると、様々なパラメータを変更することができずにつまづくことがあるかもしれません。 そのような場合、例えば「ワードパッド」や「メモ帳」で予め作成しておいた一連のコマンド群からなるrun.txtを用意しておき、その中身をコピー&ペーストすることでrun.txtの中身を実行します。

Step 3:
コマンドライン上に表示される R の出力をファイルにそのまま保存したいと思う場面が出てきます。このような場合、
1.)まず出力される先のディレクトリを、「ファイル」−「ディレクトリの変更」で指定
2.)以下をコピー&ペースト
sink("out.txt")#出力ファイル名をout.txtとする
1+2         #1+2を計算
hoge <- 4   #hogeに4を代入
hoge        #hogeの中身を表示
sqrt(hoge)  #4のルートを計算
sqrt(4)     #4のルートを計算(当然同じ意味)
#の後の文章はコメントなので何を書いてもいいですよ。


コマンドライン上に結果が表示されず、out.txtに結果が以下のように表示されていることと思います:
| out.txtの中身 |
[1] 3
[1] 4
[1] 2
[1] 2
------------------------
尚、sink()と入力すれば、out.txtに出力させるのをやめさせることができます。

・library(): どのようなパッケージがインストールされているかを知る

・library(help="パッケージ名"): 「パッケージ名」で指定したパッケージ中にどのような関数があるかを知る

・update.packages(): 手持ちのパッケージをアップデート

・getBioC("パッケージ名"): 「パッケージ名」で指定したパッケージをインストール

・sample(x, n, replace=F): ベクトルxから長さnの部分ベクトルをランダムにサンプリング

・objects(): 今現在利用可能なオブジェクのリストを表示

・unique(): 重複を除去

・duplicated(): 重複があるものをTRUEとして表示

・rle(): 例えば「x <- c("C", "A", "B", "C", "C", "D"); rle(sort(x))」とやると、Aが1, Bが1, Cが3, Dが1といった情報を返してくれる

・table(): 例えばある離散データ「x <- rpois(50, lambda = 4)」を生成させて、「table(factor(x, 0:max(x)))」とやると、どの数値のものがいくつあったかを返してくれる

サンプルマイクロアレイデータ

  1. 3051(genes)×38(samples)の遺伝子発現データ。
  2. library(multtest)
    data(golub)
    dim(golub)
    
    
    で得られるサンプルデータと本質的に同じ。
    データ(sample1.txt)
    クラスラベルデータ(sample1_cl.txt; 0:tumor, 1: normal sampleなどの属性に関する情報を与えるため)

    クラスラベルデータ(sample1_designmatrix.txt; permtestを実行するため)

  3. 6(genes)×11(samples)の数値データ。
  4. データ(sample2.txt)
    クラスラベルデータ(sample2_cl.txt; 0:tumor, 1: normal sampleなどの属性に関する情報を与えるため)

  5. 45(genes)×10(samples)の数値データ。
  6. sample3_tmp <- rbind(matrix(rnorm(150, mean=0, sd=0.2), ncol=10), matrix(rnorm(150, mean=1, sd=0.2), ncol=10), matrix(rnorm(150, mean=2, sd=0.2), ncol=10))
    write.table(sample3_tmp, "sample3_tmp.txt", sep = "\t", append=F, quote=F, col.names=F)
    得られたsample3_tmp.txtにラベルをエクセルで付け加えるなどして作成した。
    データ(sample3.txt)

  7. 22283(genes)×36(samples)の数値データ。
  8. データ(GDS1096.txt)
    実際には
    GDS1096 <- read.table("GDS1096.txt", header=TRUE, row.names=1, sep="\t", quote="")
    で読み込んでも「IDENTIFIER」カラムが余分にあります。そのため、読み込み後に
    GDS1096$IDENTIFIER <- NULL
    とやっておく必要があります。
    ちなみにこのデータは公共遺伝子発現データベース(GEO)からダウンロードして得られたGDS1096.soft.txtファイルを加工したものです。
    MAS-quantified dataです(2007/7/3追加)。

  9. 22283(genes)×36(samples)の数値データ。
  10. データ(GDS1096_rma.txt)RMA-quantified dataです(2007/7/3追加)。
    MAS-quantified dataだとlog変換してからデータ解析する必要がありますが、シグナル強度が1未満のものが結構あるために、シグナル強度の下限をいくつに設定(例:20未満のものを20にする)した上でlog変換するかなどで結果が変わってくるのが個人的には気持ち悪いです。その点RMA-quantified dataだとそのようなことを気にする必要はありません。

  11. 10(genes)×20(samples)の数値データ。
  12. 欠損値, NaN, NAなどを含むデータです。
    データ(sample4.txt)

  13. 7129(genes/ProbeSets)×72(samples)の遺伝子発現データ(ALL vs. AML)。ALL(47 samples)が1, AML(25 samples)が2でラベルされている。
  14. データ(data_Golub_Merge.txt)
    library(golubEsets)
    library(help=golubEsets)   #golubEsetsライブラリ中にどのような情報が含まれているか調べる
    data(Golub_Merge)
    dim(Golub_Merge)
    
    
    で得られるサンプルデータと本質的に同じ。尚、どのサンプルがALLまたはAMLかを知りたいときは以下のようにして情報を得る。
    Golub_Merge   #Golub_Merge中にどのような情報が含まれているか調べる
    varLabels(Golub_Merge)   #Golub_Merge$ALL.AMLと打ち込めば、どのサンプルがALL or AMLかが分かりそうだと判明する
    Golub_Merge$ALL.AML
    tmp <- rbind(Golub_Merge$ALL.AML, exprs(Golub_Merge))
    write.table(tmp, "data_Golub_Merge.txt", sep = "\t", append=F, quote=F, col.names=F)
    
    
    参考文献:Golub et al., Science, 286, 531-537, 1999

  15. 12,600(ProbeSets)×102(samples)の遺伝子発現データ(non-tumor prostate vs. prostate tumor)。non-tumor prostateが50 samples、prostate tumorが52 samplesからなる。
  16. RMA-quantified data(data_Singh_RMA.txt)
    MAS-quantified data(data_Singh_MAS.txt)
    ソースファイルはRMA-quantified dataSingh.txt(Jeffery et al., BMC Bioinformatics, 7:359, 2006の論文中でpost-processed dataとして利用可能))、 MAS-quantified dataProstate_TN_final0701_allmeanScale.res(Singh et al., Cancer Cell, 1:203-209, 2002の論文のオリジナルデータ)。
    Singh.txt中には12,625 clones分の情報があるものの、Prostate_TN_final0701_allmeanScale.res中には12,600 clones分の情報しかないため、RMA-quantified data中では、(ProbeSetIDが"1600***"という)余分な25 clones分のデータを除去している。

  17. 3,274(ProbeSets)×102(samples)の遺伝子発現データ(non-tumor prostate vs. prostate tumor)。non-tumor prostateが50 samples、prostate tumorが52 samplesからなる。
  18. RMA-quantified data(data_Singh_RMA_3274.txt)
    MAS-quantified data(data_Singh_MAS_3274.txt)
    上の12,600 clonesのデータだと大きすぎてメモリが足りないと文句を言われる場合が多い。そこで、MASのデータで全102サンプル中半分(51サンプル)以上で"Present" callとなっていた3,274クローンからなるサブセットを用意しました。

  19. 1,000(ProbeSets)の時系列遺伝子発現データ
  20. library(maSigPro)
    data(data.abiotic)
    data(edesign.abiotic)
    write.table(data.abiotic, "sample10.txt", sep = "\t", append=F, quote=F, col.names=T)
    write.table(edesign.abiotic, "sample10_cl.txt", sep = "\t", append=F, quote=F, col.names=T)
    
    
    として得られる1,000(ProbeSets)×36(samples)の遺伝子発現データ(sample10.txt)とその実験デザイン情報(sample10_cl.txt)を加工したもの。

    a. 「通常状態(Control)のサンプルの薬剤処理後3時間(3 replicates), 9時間(2 replicates), そして27時間後(3 replicates)の遺伝子発現データ」、「低温状態(Cold)の...」、「高温状態(Heat)の...」からなる計1,000 ProbeSets×24 arraysからなる遺伝子発現データとその実験デザイン情報のデータ
    sample10_3groups.txt(遺伝子発現データ)
    sample10_3groups_cl.txt(実験デザイン情報データ)

    b. 「通常状態(Control)のサンプルの薬剤処理後3時間(3 replicates), 9時間(2 replicates), そして27時間後(3 replicates)の遺伝子発現データ」、「低温状態(Cold)の...」からなる計1,000 ProbeSets×16 arraysからなる遺伝子発現データとその実験デザイン情報のデータ
    sample10_2groups.txt(遺伝子発現データ)
    sample10_2groups_cl.txt(実験デザイン情報データ)

    c. 「ある(Control)のサンプルの薬剤処理後3時間(3 replicates), 9時間(2 replicates), そして27時間後(3 replicates)の遺伝子発現データ」からなる計1,000 ProbeSets×8 arraysからなる遺伝子発現データとその実験デザイン情報のデータ
    sample10_1group.txt(遺伝子発現データ)
    sample10_1group_cl.txt(実験デザイン情報データ)

  21. 1,000(ProbeSets)の時系列遺伝子発現データ
  22. a. 「サンプル1の薬剤処理後0.5, 2, 5, 12.3, 24時間後の遺伝子発現データ」と「サンプル2の薬剤処理後0.5, 2, 5, 12.3, 24時間後の遺伝子発現データ」からなる計1,000 ProbeSets×10 arraysからなる”対応あり”遺伝子発現データ
    sample11_2groups_paired.txt(遺伝子発現データ)
    sample11_2groups_paired_cl.txt(クラスラベルデータ)

    b. 「サンプル1の薬剤処理後0.5, 2, 5, 12.3, 24時間後の遺伝子発現データ」と「サンプル2の薬剤処理後1.3, 4, 8, 12, 20時間後の遺伝子発現データ」からなる計1,000 ProbeSets×10 arraysからなる”対応なし”遺伝子発現データ
    sample11_2groups_unpaired.txt(遺伝子発現データ)
    sample11_2groups_unpaired_cl.txt(クラスラベルデータ)

    c. 「サンプル1の薬剤処理後0.5, 2, 5, 12.3, 24時間後の遺伝子発現データ」からなる計1,000 ProbeSets×5 arraysからなる遺伝子発現データ
    sample11_1group.txt(遺伝子発現データ)
    sample11_1group_cl.txt(クラスラベルデータ)

  23. 22,575 genes×21 samplesからなる二群の遺伝子発現データ
  24. a. このデータは発現データ取得 | Gene Expression Omnibus (GEO)から | GEOquery (Davis_2007)でGSE1322をqueryとして得たtwo-color Agilentデータです。
    最初の15 samplesが面白い話を聞いた患者のlog2(聞いた後/聞く前)で、残りの7 samplesが退屈な講義を聞いた患者のlog2(聞いた後/聞く前)です。
    sample13.txt

    b. これはsample13.txtのサブセットで、最初の7 samplesが面白い話を聞いた患者のlog2(聞いた後/聞く前)で、残りの7 samplesが退屈な講義を聞いた患者のlog2(聞いた後/聞く前)です。原著論文ではこのサブセットで解析していたので念のため用意しました。
    sample13_7vs7.txt
    このデータはsample13.txtを入力として、以下のコマンドを実行することによって得ました。
    in_f <- "sample13.txt"                                           #入力ファイル名を指定
    out_f <- "sample13_7vs7.txt"                                     #出力ファイル名を指定
    
    #発現データの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    data.tmp <- data[,c(3:6,9,13:21)]                                #行列dataの中から3-6, 9, 13-21列のデータのみ抽出してdata.tmpに格納
    tmp <- cbind(rownames(data), data.tmp)                           #遺伝子名の右側にdata.tmpを追加して、tmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
  25. 22,283 genes×6 samplesからなる二群の遺伝子発現データ
  26. 最初の3サンプルがA群、残りの3サンプルがB群のデータです。
    sample14.txt
  27. 5 genes×8 samplesからなる様々な組織特異的発現パターンをもつ人工遺伝子発現データ
  28. sample15.txt
    クラスラベルデータ(sample15_cl.txt; 特異的高発現サンプルを1, それ以外を0とした属性に関する情報を与えるため)

  29. 3 genes×11 samplesからなる二群の遺伝子発現データ
  30. 最初の6サンプルがA群、残りの5サンプルがB群のデータです。
    sample16.txt
    クラスラベルデータ(sample16_cl.txt; A群を1, B群を0とした属性に関する情報を与えるため)

  31. 14026 genes×8 samplesからなる二群の遺伝子発現データ(log変換されていない)
  32. 最初の4サンプルがA群、残りの4サンプルがB群のデータです。
    sample17_unlog.txt
  33. 14026 genes×8 samplesからなる二群の遺伝子発現データ(log2変換されている)
  34. 最初の4サンプルがA群、残りの4サンプルがB群のデータです。
    sample17.txt
  35. 以下の図のようなデータ
  36. sample18_5vs5.txt
  37. 10 genes ×2 samplesのデータ
  38. sample19.txt
  39. 10 genes ×3 samplesのデータ
  40. sample19_plus1.txt
  41. Nakai et al., BBB, 2008のGSE7623由来データ(RMA-preprocessed)
  42. data_GSE7623_rma.txt(31099 probesets×24 samples) ・data_rma_2.txt(31099 probesets×24 samples; ラベル情報部分を日本語でわかりやすくしたもの) ・data_rma_2_BAT.txt(31099 probesets×8 samples; BAT sampleのみでfed vs. 24h-fastedの二群間比較用) ・data_rma_2_LIV.txt(31099 probesets×8 samples; LIV sampleのみでfed vs. 24h-fastedの二群間比較用) ・data_rma_2_WAT.txt(31099 probesets×8 samples; WAT sampleのみでfed vs. 24h-fastedの二群間比較用) ---------------------------------------------------------- GSM184414-184417: Brown adipose tissue (BAT), fed GSM184418-184421: Brown adipose tissue (BAT), 24 h-fasted GSM184422-184425: White adipose tissue (WAT), fed GSM184426-184429: White adipose tissue (WAT), 24 h-fasted GSM184430-184433: Liver tissue (LIV), fed GSM184434-184437: Liver tissue (LIV), 24 h-fasted ---------------------------------------------------------- ・data_rma_2_nr.txt(14132 genes×24 samples; 同じgene symbolのものをまとめたもの) ・data_rma_2_nr_BAT.txt(14132 genes×8 samples; BAT sampleのみでfed vs. 24h-fastedの二群間比較用) ・data_rma_2_nr_LIV.txt(14132 genes×8 samples; LIV sampleのみでfed vs. 24h-fastedの二群間比較用) ちなみに、これは「Affymetrix Rat Genome 230 2.0 Array」を用いて取得したデータでGPL1355からアノテーションファイルを取得可能です。 二群間比較手法の一つであるRank products (Breitling_2004)の2をテンプレートとしてFDR < 0.05を満たすprobesetIDを得た結果ファイルが以下のものたち: ・data_rma_2_BAT.txtを入力として得られた発現変動遺伝子IDリストファイル:result_rankprod_BAT_id.txtdata_rma_2_LIV.txtを入力として得られた発現変動遺伝子IDリストファイル:result_rankprod_LIV_id.txtdata_rma_2_WAT.txtを入力として得られた発現変動遺伝子IDリストファイル:result_rankprod_WAT_id.txt (Rで)塩基配列解析任意のキーワードを含む行を抽出の11をテンプレートとしてprobesetID --> RefSeq IDに変換したファイルが以下のものたち: ・result_rankprod_BAT_RefSeq_DEG.txt(774 RefSeq IDs) ・result_rankprod_BAT_RefSeq_nonDEG.txt(12969 RefSeq IDs) ・result_rankprod_LIV_RefSeq_DEG.txt(559 RefSeq IDs) ・result_rankprod_LIV_RefSeq_nonDEG.txt(13255 RefSeq IDs) ・result_rankprod_WAT_RefSeq_DEG.txt(601 RefSeq IDs) ・result_rankprod_WAT_RefSeq_nonDEG.txt(13269 RefSeq IDs) (Rで)塩基配列解析multi-fastaファイルから任意のサブセットを抽出をテンプレートとしてリスト中のRefSeq IDに相当する(ACGTのみからなる配列で配列長が同じ)サブセットを抽出したmulti-fastaファイル群: ・seq_BAT_DEG.fa(563 RefSeq sequences) ・seq_BAT_nonDEG.fa(8898 RefSeq sequences) ・seq_LIV_DEG.fa(426 RefSeq sequences) ・seq_LIV_nonDEG.fa(9075 RefSeq sequences) ・seq_WAT_DEG.fa(453 RefSeq sequences) ・seq_WAT_nonDEG.fa(9092 RefSeq sequences)

発現データ取得 | Affymetrix data全体 | Celsius (Day_2007)

GEOqueryでゲットできるのは、Gene Expression Omnibus (GEO)中のデータのみです。もちろんこのデータベースはアレイデータを含む最大のデータベースですが、当然GEOが含まないデータもあるわけです。そこで様々なデータベースからAffymetrixデータだけを格納したものがCelsiusですので、Affymetrixユーザーの人は、こちらを用いてデータを得るのをお勧めします。
GEOの3倍、ArrayExpressの7倍のCEL filesを含むそうです。

1. celsiusの実行
library(celsius)                                                 #パッケージの読み込み


CRANのcelsiusのwebページ
CRANのcelsiusのPDFマニュアル
参考文献(Day et al., Genome Biol., 2007)

自分が取得したアレイデータのアノテーション情報を取得するやり方を示します。ここでは、参考文献1(Nakai et al., BBB, 2008)で用いられた「Affymetrix Rat Genome 230 2.0 Array」のアノテーション情報の取得などを示しますが、AffymetrixだけでなくAgilent, Clonetech, GE, Illumina製など様々な製造メーカーの製品のアノテーション情報も取得可能です。詳しくはこちら(ChipManufacturer)をご覧ください。
ChipManufacturerのページより、「Affymetrix Rat Genome 230 2.0 Array」のアノテーション情報はrat2302.db, rat2302cdf, rat2302probe中に含まれていることが分かります。 このようにして、適宜自分が欲しいチップのアノテーション情報がどのような名前で入手できるのか調べた上で、以下のようにします。
ただ、これだけをやってもいまいち実感はわかないと思います...。また、3.のAgilent Human 1A (V2)チップのデータは22,575遺伝子(正確には22,575行+ヘッダーの1行)分のデータ(例えばGSE1322; サンプルマイクロアレイデータの12(sample13.txt))が得られるはずなのですが、以下のやり方だとなぜかそうなりません(20,173行+ヘッダーの1行となる...しかもsample13.txtの左端の列のID情報と異なっており、対応関係も不明...)。 下手にRで小細工をするよりはアノテーション情報取得 | GEOからで示すような公共データベースからのアノテーション情報取得がいいのではと思っています...。

発現データ取得 | Gene Expression Omnibus (GEO)から

マイクロアレイデータベースGene Expression Omnibus (GEO)に登録されているデータを取得するやり方を示します。 GEOquery (Davis_2007)と違って、例えばAffymetrix GeneChipデータだとプローブレベルデータ(*.CELファイル)を取得して自分で好きな手法を用いてデータの正規化を行いたい場合などに利用します。
ここでは、「Affymetrix Rat Genome 230 2.0 Array」を用いて取得されたトータル24サンプルからなるGSE7623というデータセット(参考文献1:Nakai et al., BBB, 2008)のCELファイルの取得を行います。
1. Gene Expression Omnibus (GEO)のページで「GEO accession」のところでGSE7623と打ち込んでGoボタンを押す 2. 画面の一番下のほうにDownloadボタンがあるので、(どれでもいいが私はftpボタンをいつも押してるので...)「ftp」をクリックしてダウンロード 3. ダウンロード先にGSE7623_RAW.tarという圧縮ファイルがあるので、それを(私の場合ダブルクリックで)解凍 4. 解凍後のGSE7623_RAWフォルダを眺めると*CEL.gz, *CHP.gz, *EXP.gzという三種類のファイルがあることが分かるが、   私はいつもCELファイルのみしか利用しないので、それ以外のファイルを削除する 5. *CEL.gzのみにした24個のファイルができる(以下の図のようになる)ので、個別のファイルをまた解凍する 6. 以下の図のようにできたらOK(ここではGSE7623_RAWフォルダに解凍後のCELファイルを置いて、圧縮ファイルの削除を行っている) 参考文献1(Nakai et al., BBB, 2008)

発現データ取得 | Gene Expression Omnibus (GEO)から | GEOquery (Davis_2007)

マイクロアレイデータベースGene Expression Omnibus (GEO)に登録されているデータを入手できる。但し、入手できるデータは加工した後のものです(大抵の場合MAS5-preprocessed data)。
ここでは、参考文献2のAffymetrixデータと参考文献3のAgilentデータ取得例を紹介します。
1-1. 参考文献2のAffymetrixデータ(GDS1096)を入手したい場合1:
param <- "GDS1096"                                               #入手したいGEO IDを指定
out_f <- "data_hoge1.txt"                                        #出力ファイル名を指定

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

data <- getGEO(param)                                            #指定したGEO IDをダウンロードし、dataに格納
eset_data <- GDS2eSet(data)                                      #正規化|Affymetrix GeneChip|MAS,MBEI,RMAなどで行った結果得られるExpressionSetというフォーマットと同じ形式に変換し、結果をeset_dataに格納
write.exprs(eset_data, file=out_f)                               #eset_dataの中身を指定したファイル名で保存。


1-2. 参考文献2のAffymetrixデータ(GDS1096)を入手したい場合2: (上記と出力ファイル形式が微妙に異なります...)
param <- "GDS1096"                                               #入手したいGEO IDを指定
out_f <- "data_hoge2.txt"                                        #出力ファイル名を指定

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

data <- getGEO(param)                                            #指定したGEO IDをダウンロードし、dataに格納
write.table(Table(data), out_f,sep="\t",row.names=F,col.names=T,quote=FALSE)#dataの中身を指定したファイル名で保存。


2. 参考文献2のAffymetrixデータ(GSE2361)を入手したい場合:
param <- "GSE2361"                                               #入手したいGEO IDを指定
out_f <- "data_hoge3.txt"                                        #出力ファイル名を指定

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

data <- getGEO(param)                                            #指定したGEO IDをダウンロードし、dataに格納
write.table(exprs(data[[1]]), out_f,sep="\t",col.names=NA,quote=FALSE)#dataの中身を指定したファイル名で保存。


3. 参考文献2のAffymetrixデータ(GSE2361)そのものではなく、他の様々な情報を得たい場合:
param <- "GSE2361"                                               #入手したいGEO IDを指定
out_f <- "data_hoge4.txt"                                        #出力ファイル名を指定

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

data <- getGEO(param)                                            #指定したGEO IDをダウンロードし、dataに格納
data                                                             #dataの中には「exprs(data[[1]])」で取り出せる遺伝子発現行列以外にも様々な情報が取り出せそうな気がします
varLabels(data[[1]])                                             #title, geo_accessionなど様々な情報を取り出せることが分かる(おそらく、GSEXXXXのXXXX部分の違いによってここで得られる情報や順番は異なるので注意!)
pData(data[[1]])[1]                                              #title情報を取り出したい場合1
pData(data[[1]])$title                                           #title情報を取り出したい場合2
write.table(pData(data[[1]]),out_f,sep="\t",col.names=NA,quote=FALSE)#pData(data[[1]])から取り出せる全てを指定したファイル名で保存。


4. 参考文献3のtwo-color Agilentデータ(GSE1322)を入手したい場合: 詳細はGEOのGSE1322でわかりますが、ここで入手している発現データ (全部糖尿病患者のperipheral bloodサンプル)はいわゆるlog ratioです。具体的にはlog2(Cy5/Cy3)で、 GSM21742: (面白い話を聞いた患者ID1)log2(After/Before) GSM21743: (面白い話を聞いた患者ID2)log2(After/Before) GSM21744: (面白い話を聞いた患者ID3)log2(After/Before) GSM21745: (面白い話を聞いた患者ID5)log2(After/Before) GSM21746: (面白い話を聞いた患者ID6)log2(After/Before) GSM21747: (面白い話を聞いた患者ID7)log2(After/Before) GSM21748: (面白い話を聞いた患者ID8)log2(After/Before) GSM21749: (面白い話を聞いた患者ID9)log2(After/Before) GSM21750: (面白い話を聞いた患者ID10)log2(After/Before) GSM21751: (面白い話を聞いた患者ID11)log2(After/Before) GSM21752: (面白い話を聞いた患者ID13)log2(After/Before) GSM21753: (面白い話を聞いた患者ID14)log2(After/Before) GSM21758: (面白い話を聞いた患者ID16)log2(After/Before) GSM21759: (面白い話を聞いた患者ID17)log2(After/Before) GSM21761: (退屈な講義を聞いた患者ID3)log2(After/Before) GSM21763: (退屈な講義を聞いた患者ID5)log2(After/Before) GSM21765: (退屈な講義を聞いた患者ID6)log2(After/Before) GSM21767: (退屈な講義を聞いた患者ID7)log2(After/Before) GSM21769: (退屈な講義を聞いた患者ID10)log2(After/Before) GSM21771: (退屈な講義を聞いた患者ID16)log2(After/Before) GSM21772: (退屈な講義を聞いた患者ID17)log2(After/Before) のデータです(私の理解が間違ってなければ...)。
param <- "GSE1322"                                               #入手したいGEO IDを指定
out_f <- "sample13.txt"                                          #出力ファイル名を指定
library(GEOquery)                                                #パッケージの読み込み
data <- getGEO(param)                                            #指定したGEO IDをダウンロードし、dataに格納
data                                                             #dataの中には「exprs(data[[1]])」で取り出せる遺伝子発現行列以外にも様々な情報が取り出せそうな気がします
varLabels(data[[1]])                                             #title, geo_accessionなど様々な情報を取り出せることが分かる(おそらく、GSEXXXXのXXXX部分の違いによってここで得られる情報や順番は異なるので注意!)
pData(data[[1]])[1]                                              #title情報を取り出したい場合1
pData(data[[1]])$title                                           #title情報を取り出したい場合2
write.table(exprs(data[[1]]),out_f,sep="\t",col.names=NA,quote=FALSE)#dataの中身を指定したファイル名で保存。


BioconductorのGEOqueryのwebページ

参考文献1(GEOQuery: Davis and Meltzer, Bioinformatics, 2007)
参考文献2(Ge et al., Genomics, 2005)
参考文献3(Hayashi et al., Psychother. Psychosom., 2006)

発現データ取得 | ArrayExpressから | ArrayExpress

マイクロアレイデータベースArrayExpressに登録されているデータを入手できる。
1. ヒトサンプルでleukemiaというキーワードを含むアレイデータをリストアップしたい場合: 以下のコマンドを実行すると、検索結果がxml形式のファイル(以下の場合:queryleukemiahomo+sapiens.xml)で得られるので、 「ファイル」−「ディレクトリの変更」で結果ファイルを保存したいディレクトリに移動し、以下をコピペ。
param1 <- "leukemia"                                             #キーワードを指定
param2 <- "homo+sapiens"                                         #生物種を指定

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

sets <- queryAE(keywords = param1, species = param2)             #param1, param2で指定した条件で検索を実行


2. すでにArrayExpress IDがE-MEXP-1422だと分かっている場合: 以下のコマンドを実行すると、(8つの)ファイルが得られるので、 「ファイル」−「ディレクトリの変更」でファイルを保存したいディレクトリに移動し、以下をコピペ。
param <- "E-MEXP-1422"                                           #IDを指定

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

rawset <- ArrayExpress(param)                                    #paramで指定したIDのデータをダウンロード


BioconductorのArrayExpressのwebページ

アノテーション情報取得 | Rのパッケージから

自分が取得したアレイデータのアノテーション情報を取得するやり方を示します。ここでは、参考文献1(Nakai et al., BBB, 2008)で用いられた「Affymetrix Rat Genome 230 2.0 Array」のアノテーション情報の取得などを示しますが、AffymetrixだけでなくAgilent, Clonetech, GE, Illumina製など様々な製造メーカーの製品のアノテーション情報も取得可能です。詳しくはこちら(ChipManufacturer)をご覧ください。
ChipManufacturerのページより、「Affymetrix Rat Genome 230 2.0 Array」のアノテーション情報はrat2302.db, rat2302cdf, rat2302probe中に含まれていることが分かります。 このようにして、適宜自分が欲しいチップのアノテーション情報がどのような名前で入手できるのか調べた上で、以下のようにします。
ただ、これだけをやってもいまいち実感はわかないと思います...。また、3.のAgilent Human 1A (V2)チップのデータは22,575遺伝子(正確には22,575行+ヘッダーの1行)分のデータ(例えばGSE1322; サンプルマイクロアレイデータの12(sample13.txt))が得られるはずなのですが、以下のやり方だとなぜかそうなりません(20,173行+ヘッダーの1行となる...しかもsample13.txtの左端の列のID情報と異なっており、対応関係も不明...)。 下手にRで小細工をするよりはアノテーション情報取得 | GEOからで示すような公共データベースからのアノテーション情報取得がいいのではと思っています...。
1. 「Affymetrix Rat Genome 230 2.0 Array」の場合:
#必要なパッケージをロード
library(rat2302.db)                                              #パッケージの読み込み
library(help=rat2302.db)                                         #rat2302.db中にどんな情報が含まれているか見る
ls("package:rat2302.db")                                         #rat2302.db中にどんな情報が含まれているか見る(上とほぼ同じ情報が得られる)
#ここまでの作業で例えばrat2302ACCNUM中にGenBank accession numberとManufacturer identifiersの対応関係についての情報が入っていることなどが分かる
#例えば、"mappedkeys(rat2302ACCNUM)"でGenBank accession numberとの対応があるManufacturer identifiersを表示したり、
#"length(mappedkeys(rat2302ACCNUM))"でGenBank accession numberとの対応があるManufacturer identifiersの数を表示したり、
#"summary(rat2302ACCNUM)"で対応関係のsummaryを表示したりすることができます

#以下は(こんなこともできますという)おまけ
#全遺伝子のidentifierとgene symbolの情報をファイルに保存したい場合
out_f <- "hoge.txt"                                              #出力ファイル名を指定
param <- rat2302SYMBOL                                           #欲しい対応関係情報を指定(e.g., rat2302ENSEMBLやrat2302GENENAMEなど)
out <- unlist(as.list(param))                                    #paramから得られるidentifierとの対応関係情報をoutに格納
tmp <- cbind(names(out), out)                                    #identifierとoutの情報を結合してtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存


Bioconductorのrat2302.dbのwebページ 2. 「Illumina Mousev2」の場合:
#必要なパッケージをロード
library(illuminaMousev2.db)                                      #パッケージの読み込み
library(help=illuminaMousev2.db)                                 #illuminaMousev2.db中にどんな情報が含まれているか見る
#ここまでの作業で例えばilluminaMousev2ENTREZID中にEntrez GeneとManufacturer identifiersの対応関係についての情報が入っていることなどが分かる

#以下は(こんなこともできますという)おまけ
#全遺伝子のidentifierとgene symbolの情報をファイルに保存したい場合
out_f <- "hoge.txt"                                              #出力ファイル名を指定
param <- illuminaMousev2SYMBOL                                   #欲しい対応関係情報を指定(e.g., illuminaMousev2UNIGENEやilluminaMousev2PFAMなど)
out <- unlist(as.list(param))                                    #paramから得られるidentifierとの対応関係情報をoutに格納
tmp <- cbind(names(out), out)                                    #identifierとoutの情報を結合してtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存


BioconductorのilluminaMousev2.dbのwebページ 3. 「Agilent Human 1A (V2)」の場合:
#必要なパッケージをロード
library(hgug4110b.db)                                            #パッケージの読み込み
library(help=hgug4110b.db)                                       #hgug4110b.db中にどんな情報が含まれているか見る
#ここまでの作業で例えばhgug4110bSYMBOL中にGene symbolとManufacturer identifiersの対応関係についての情報が入っていることなどが分かる

#以下は(こんなこともできますという)おまけ
#全遺伝子のidentifierとgene symbolの情報をファイルに保存したい場合
out_f <- "hoge.txt"                                              #出力ファイル名を指定
param <- hgug4110bSYMBOL                                         #欲しい対応関係情報を指定(e.g., hgug4110bUNIPROTやhgug4110bGOなど)
out <- unlist(as.list(param))                                    #paramから得られるidentifierとの対応関係情報をoutに格納
tmp <- cbind(names(out), out)                                    #identifierとoutの情報を結合してtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存


Bioconductorのhgug4110b.dbのwebページ

BioconductorのChipManufacturerのwebページ

参考文献1(Nakai et al., BBB, 2008)

アノテーション情報取得 | GEOから

Gene Expression Omnibus (GEO)からアノテーション情報を取得するやり方を紹介します。 Rとは関係ありませんが、アノテーション情報取得 | Rのパッケージからでうまくいかないものがあるという現状ではこちらのやり方がベターだと思います。
1. Gene Expression Omnibus (GEO)のページで「Platforms」をクリック 2. 「FIND PLATFORM」をクリック 3. アノテーションを得たいメーカーおよび生物種などを指定してもう一度「FIND PLATFORM」をクリック 4. いくつかリストアップされる候補の中から目的のチップ(例ではAgilent Human 1A (V2)) につけられているPlatform ID (GPLXXX; 例ではGPL887)をクリック 5. 表示されたページの一番したのほうで「Download full table」 (または「Annotation SOFT table」)をクリックして得られるファイル(GPL887-5640.txt)を保存 6. 機能解析(GSEA周辺)を行いたいときには、以下の作業を行っておいてください。 ( i)エクセルでGPL887-5640.txtを開き (ii)最終的にIDとGene symbolだけからなるGPL887-5640_symbol.txtのようなファイルを作成 しておけば、前処理 | 同じ遺伝子名を持つものをまとめる用の読み込みファイルとして利用可能です。

正規化(cDNA or two-color or 二色法) について

私はこのあたりについては明るくありませんが、Loess, Splines, Waveletsがよく用いられているようです。このほかにKernel smootingとSupport Vector Regression (SVR)を含めた計5つの正規化法を比較した論文(参考文献1)によると、SVRが最もよいそうです。
Agilent two-colorアレイについては、MAQCのExternal RNA Controls (ERCs)のデータを評価に用いた場合、「Agilent's Feature Extraction software(という専用のdata processing法があるらしい)」よりも単純に「loess正規化」をかけたもののほうがうまく既知のERCsをlog ratioの軸で分離できるという報告(参考文献2)があります。

参考文献1(Fujita et al., BMC Bioinformatics, 2006)
参考文献2(Kerr KF., BMC Bioinformatics, 2007)

正規化 | dual channel (Stanford型マイクロアレイ) (package:limma)

Linear Models for Microarray Data (limma)。ArrayVision, ImaGene, GenePix, QuantArray, or SPOTのアウトプットファイルを入力とすることができるらしい。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動。
library(limma)      #パッケージの読み込み
limmaUsersGuide()   #詳しい説明(PDFファイルが開く)


Bioconductorのlimmaのwebページ

正規化 - dual channel (Stanford型マイクロアレイ) (package:marray)

GenePix fileをそのまま読み込むことができるらしい。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動。
library(marray)      #パッケージの読み込み


Bioconductorのmarrayのwebページ

正規化 | dual channel (Stanford型マイクロアレイ) GPA (Xiong_2008)

Generalized Procrustes Analysis (GPA)法を用いて正規化。

参考文献(Xiong et al., BMC Bioinformatics, 2008)

正規化 | Agilent two-color system | agilp (Chain_2010)

Agilent用のprocessingに関する論文を偶然見つけたので、一応備忘録的に載せています。
参考文献(Chain et al., BMC Bioinformatics, 2010)
CRANのagilpのwebページ
PDFマニュアル

正規化(Affymetrix)について

解析データセットにサンプルを追加したときに、ももともとあったサンプルの発現データは変化するのが嫌な人で
一つ一つのチップデータを独立に正規化したい人(前者):
MAS
・(Rではないが)3パラメータ対数正規分布モデルによる正規化法(SuperNorm)

上記変化は許容して、データセット全体の情報を用いて正規化(標準化)したい人向け(後者):
MBEI, RMA
VSN
PLIER
multi-mgMOS
FARMS
DFW

データセット全体の情報を用いて正規化(標準化)したいんだけど、メモリが足りないなどの理由でできない人向け(Advanced):
RMA+, Extrapolation Strategy, refRMA
RMA++, Extrapolation Averaging

正規化したデータでどんな解析をするかによって、用いる正規化法も変わります。
マーカー遺伝子(二群間で発現が大きく異なる遺伝子とか組織特異的遺伝子)を手持ちのデータセットから探すような場合には、前者後者どちらの方法を用いてもいいと思いますが、候補遺伝子のランキング法との相性がありますので、両者の組合せについての推奨ガイドラインKadota et al., 2009)を参考にされることをお勧めします。(2009/4/24追加)

しかし、例えば分類(判別解析)を行いたい人は前者の方法で得られたデータセットをそのまま用いることができますが、後者はそのまま用いてはいけません!なぜなら手持ちのデータセットをもとにクロスバリデーションで予測精度を調べるときに、テストセットの遺伝子発現プロファイルは手持ちのデータセット全体の情報をもとに作成されたものだからです (つまり、分類 | k-NNで紹介しているようなやり方を、本当はRMA-quantified dataでやってはいけません!これはあくまでも例ですので)。 ちゃんとやるためには、1) トレーニングセットに対して後者の方法で正規化し、分類に用いるマーカー遺伝子を得る、2) テストサンプル(テストセット)とトレーニングセットを含めたデータセットに対して、改めて後者の方法で正規化し、得られたテストサンプルの発現プロファイル情報を用いて分類する、といった手続きを踏まねばなりません。
が、これをやるともともとのトレーニングセットのシグナル強度が変わってしまうので、気持ち悪いという問題がありました。

この問題を解決するための方法(つまり、新規サンプルの正規化を行うときに「元々のトレーニングセット中のデータの正規化をまた行う」ということをせずに、元々のトレーニングセットの正規化に用いたパラメータをそのまま新規サンプルに適用することで、トレーニングセット中のシグナル強度の数値を変えずに、新規サンプルのシグナル強度を外挿により求めるという戦略;Extrapolation Strategy)もいくつか提案されています (2007/11/7現在、私の知る限りでは、RMA法の拡張版としてGoldstein's Extrapolation StrategyrefRMAが挙げられます)。 このような外挿戦略に基づく手法を用いたデータで「分類などを行いたい人」や「RMAで一度にかけられるアレイ数より多くのアレイをRMAにどうにかしてかけたい人」はRMAに基づくExtrapolation Strategyの一種であるRMA+, Extrapolation Strategy, refRMARMA++, Extrapolation Averagingを用いることで目的を達成することができます。

しかし、Advancedのやり方(特にRMA++)でも、非常に沢山のデータに対してやっとのことでRMA++ができたとして、その後1サンプルでも増えたらまた最初から計算のやり直し、ということになるんでしょうか?!なんだか気持ち悪いですね。その点、前者の一つである(SuperNorm)とかならそういう気持ち悪さもないし、よいのではと思います。
ちなみに、CelsiusRMA+, Extrapolation Strategy, refRMAのやり方を採用しており、同一プラットフォームで得られた"a heterogeneous mixture of samples (50 CEL files)"をreference datasetとして常に使っているようです。(この50 CELsを外挿用パラメータを得るために使っているのか、それともこれをfuture datasetと一緒にしてfuture datasetのシグナル強度を得ているかはよく分かりませんでした。)
以下2009/7/9追加:
一番手っ取り早い解決法は前者のMAS( or SuperNorm)を使うことです。
ちなみに2009/7/9までにここで紹介している正規化(前処理)法の出力結果は、全て対数変換(log2変換)後のデータを出力するように変更してあります。
これは、ほとんど全てのデータ解析法が対数変換後のデータを入力データとしているから、というのが一番大きな理由です。
以下2010/8/10追加:
Hookという方法も2008年に出ています。昔から指摘されていてあpoly-Gのところにハイブリしやすいというのを補正した方法のようです。詳細は私も把握していませんが情報まで。

正規化 | Affymetrix GeneChip | IRON (Welsh_2013)

最近発見したものです。たぶんRパッケージではありません。項目のみ。
IRONWelsh et al., BMC Bioinformatics, 2013

正規化 | Affymetrix GeneChip | GRSN (Pelz_2008)

Rコードがsupplementから得られます。項目のみ。
GRSNPelz et al., BMC Bioinformatics, 2008

正規化 | Affymetrix GeneChip | Hook (Binder_2008)

Hookの著者らが出したprobe中のGuanine (G)のバイアスに関する2010年の論文(参考文献3)があります。 Gが三つ以上連続して存在するとシグナル強度が異常に高くなるという傾向があるようで、これをうまく補正してくれるらしいのがHookというものかな?!、というのが現時点での私の認識です(何の保証もしませんよ、念のため)。

Hookの理論に関する参考文献1(Binder and Preibisch, Algorithms Mol. Biol., 2008)
Hookのchipの特徴に関するの参考文献2(Binder et al., Algorithms Mol. Biol., 2008)
参考文献3(Fasold et al., BMC Bioinformatics, 2010)
HookのR-code

正規化 | Affymetrix GeneChip | RMA++, Extrapolation Averaging (Harbron_2007)

RMA+, Extrapolation Strategy, refRMAのやり方は、外挿用RMAパラメータを決めるためのreference dataset次第でいくらでも結果が変わりえます。よって、RMA+, Extrapolation Strategy, refRMAの解析例で示した120 CEL filesのRMA-quantified dataを得る手段としてより頑健な方法は、 一つのRMA+(ランダムに選ばれたreference datasetから外挿用RMAパラメータの取得 --> 120 CEL filesへの適用)を何度か繰り返してその平均値を得る、のがよりよいやり方なのではないでしょうか、というのがRMA++ (or Extrapolation Averaging)の考え方です。要は、RMA+を沢山やってその平均値をとるだけです。

以下では、RMA+, Extrapolation Strategy, refRMAの手順1-4.まで行った後のCELファイルしか含まない「MAQC_AFX_123456_120CELs」ディレクトリに対して、RMA+を10回行ってその平均値を得る(このやり方がRMA++)やり方を述べます。
尚、一つのreference datasetは、4つの異なる種類のサンプルからなる全120サンプル(A: 30 samples, B: 30, C: 30, D: 30)から、一種類につき3サンプルづつランダムに抽出した、計12サンプルのデータとします。

Rの作業ディレクトリをデスクトップ上の「MAQC_AFX_123456_120CELs」に変更し、以下をコピペ
param1 <- 10                                                     #ここで指定した回数分だけRMA+を行う(数が大きいほど時間はかかるがより精度が増す; 1の場合はRefRMAなどと同じ意味)
param2 <- 3                                                      #一種類につき、いくつサンプリングするかを指定(数が大きいほどメモリを食うのでout of memoryにならないできるだけ大きい数を指定する; この場合の最大値は30だが、30で正常に動くのなら、RMA+をやる必要がそもそもない)
param3 <- 5                                                      #ここで指定した数のサンプル数づつ外挿を行う(1以上の数値)

library(RefPlus)                                                 #パッケージの読み込み
list_files <- list.files()                                       #「MAQC_AFX_123456_120CELs」ディレクトリ中のファイル名のリストをゲットしてlist_filesに格納
list_files                                                       #list_filesの中身を表示(最初の20個がSite1, 次の20個がSite2などということが分かる)
#RMA+を"param1"回実行。
#一回のRMA+で(外挿作業を"param3"サンプルずつの24分割しているので)24個のファイルができるので、計24×"param1" = 240個のファイルがここの作業で作成される
#1回目のRMA+で作成されるファイル名:data_RMA_5_1.txt, data_RMA_10_1.txt, ...data_RMA_120_1.txt
#2回目のRMA+で作成されるファイル名:data_RMA_5_2.txt, data_RMA_10_2.txt, ...data_RMA_120_2.txt
#...
#"param1"回目のRMA+で作成されるファイル名:data_RMA_5_10.txt, data_RMA_10_10.txt, ...data_RMA_120_10.txt
for(i in 1:param1){                                              #param1回ループを回す
    #A-Dそれぞれのサンプルから、ランダムに"param2"個ずつ取り出す
    vector_A <- c(1:5, 21:25, 41:45, 61:65, 81:85, 101:105)      #サンプルAの位置情報
    vector_B <- vector_A + 5                                     #サンプルBの位置情報
    vector_C <- vector_B + 5                                     #サンプルCの位置情報
    vector_D <- vector_C + 5                                     #サンプルDの位置情報
    sample_A <- sample(vector_A, param2, replace=FALSE)          #vector_Aからランダムに"param2"個取り出す
    sample_B <- sample(vector_B, param2, replace=FALSE)          #vector_Bからランダムに"param2"個取り出す
    sample_C <- sample(vector_C, param2, replace=FALSE)          #vector_Cからランダムに"param2"個取り出す
    sample_D <- sample(vector_D, param2, replace=FALSE)          #vector_Dからランダムに"param2"個取り出す
    ref_vector <- c(sample_A, sample_B, sample_C, sample_D)      #sample_Aからsample_Dまでのベクトルを結合
    list_files[ref_vector]                                       #確かに全種類のサンプルが"param2"個ずつ含まれていることを確認

    #reference datasetに対してRMAを適用し、外挿用のパラメータを得る
    data = ReadAffy(filenames = list_files[ref_vector])          #計12個のCELファイル(reference dataset)を読み込んでdataに格納
    Para <- rma.para(data, bg = TRUE, exp = TRUE)                #dataに対してRMAを実行し、正規化に用いた外挿用のパラメータParaを得る

    #reference datasetから得られた外挿用パラメータParaを用いて、全サンプルについてRMAを実行
    #メモリの関係で、全120サンプルを"param3"サンプルづつの、計24分割して独立に行う。
    sub_vector <- c(1:param3)                                    #「MAQC_AFX_123456_120CELs」ディレクトリ中の最初の"param3"個の位置情報を格納
    while(sub_vector[param3] <= length(list_files)){             #sub_vector中の"param3"番目の要素の値がlength(list_files)の値以下になるまで繰り返す
        cat(sub_vector, "\n")                                    #今どのサンプルを外挿しているのか表示
        data = ReadAffy(filenames = list_files[sub_vector])      #"param3"個の CEL filesを読み込んでdataに格納
        quantified_data <- rmaplus(data, rmapara = Para, bg = TRUE)#dataに対して外挿用パラメータParaを用いてRMAを実行し、結果をquantified_dataに保存
        write_filename <- paste("data_RMA_", sub_vector[param3], "_", i, ".txt", sep="")#出力用ファイル名(最初のループではdata_RMA_5_1.txt、次はdata_RMA_10_1.txtなど)を作成
        write.table(quantified_data, write_filename, sep="\t",col.names=NA,quote=FALSE) #結果をwrite_filenameで定義したファイル名で保存
        sub_vector <- sub_vector + param3                        #次の"param3" サンプルという情報に変更し、次のループへ
    }                                                            #sub_vector中の"param3"番目の要素の値がlength(list_files)の値以下になるまで繰り返す
    if(i == 1){                                                  #最初のループで得られたref_vectorをref_vector_saveに格納
        ref_vector_save <- ref_vector                            #最初のループで得られたref_vectorをref_vector_saveに格納
    }else{                                                       #2回目以降で得られたref_vectorはref_vector_saveの下の行にどんどん追加していく
        ref_vector_save <- rbind(ref_vector_save, ref_vector)    #2回目以降で得られたref_vectorはref_vector_saveの下の行にどんどん追加していく
    }                                                            #2回目以降で得られたref_vectorはref_vector_saveの下の行にどんどん追加していく
    data <- NULL                                                 #次のループ用に初期化
    quantified_data <- NULL                                      #次のループ用に初期化
    Para <- NULL                                                 #次のループ用に初期化
}                                                                #param1回ループを回す
write.table(ref_vector_save, "ref_vector_save.txt", sep="\t",col.names=NA,quote=FALSE)#"param1"回のRMA+で使われたreference datasetの情報を"ref_vector_save.txt"に保存


#data_RMA_5_1.txt, data_RMA_5_2.txt, ..., data_RMA_5_10.txtの"param1"個のファイルを読み込み、"param1"回の平均値のデータをdata_RMA_5_ave.txtとして保存
#data_RMA_10_1.txt, data_RMA_10_2.txt, ..., data_RMA_10_10.txtの"param1"個のファイルを読み込み、"param1"回の平均値のデータをdata_RMA_10_ave.txtとして保存
#...
#data_RMA_120_1.txt, data_RMA_120_2.txt, ..., data_RMA_120_10.txtの"param1"個のファイルを読み込み、"param1"回の平均値のデータをdata_RMA_120_ave.txtとして保存
sub_vector <- c(1:param3)
while(sub_vector[param3] <= length(list_files)){
    tmp <- paste("^data_RMA_", sub_vector[param3], "_", sep="")#最初のループでは"data_RMA_5_"、次のループでは"data_RMA_10_"からはじまる全てのファイルを抽出できるようその情報をtmpに格納
    filenames <- list.files(pattern = tmp)      #「MAQC_AFX_123456_120CELs」ディレクトリ中の「tmpのパターン」からはじまる全てのファイルをfilenamesに格納
    for(i in 1:length(filenames)){
        if(i == 1){ 
            data.tmp <- read.table(filenames[i], header=TRUE, row.names=1, sep="\t") 
        } else{ 
            data.tmp <- data.tmp + read.table(filenames[i], header=TRUE, row.names=1, sep="\t")
        }
    }
    data <- data.tmp/length(filenames)
    write_filename <- paste("data_RMA_", sub_vector[param3], "_ave.txt", sep="")
    write.table(data, write_filename, sep="\t",col.names=NA,quote=FALSE)
    sub_vector <- sub_vector + param3
}


RMA++の参考文献(Harbron et al., Bioinformatics, 2007)
Goldstein's Extrapolation Averagingの参考文献 (Goldstein, DR, Bioinformatics, 2006)

正規化 | Affymetrix GeneChip | RMA+, Extrapolation Strategy, refRMA (Harbron_2007)

正規化(Affymetrix)についての私見で述べたように、RMAのような「データセット全体の情報を用いて正規化(標準化)」する方法は、もともとあったデータセットに新たなデータを追加してRMAを実行すると、オリジナルのデータセット中のシグナル強度が変化してしまいうれしくありません。 また、パソコンのメモリの問題でせいぜい百サンプル(デバイスにもよるがGoldstein's Extrapolation Strategy論文中では数百サンプルでも可能みたい)程度までしかRMAにかけることができません。 このため、どうにかしてRMAにかけられるぎりぎりの数のサンプル数のreference datasetで正規化のためのパラメータを決定し、そのパラメータを用いて新たなサンプルデータの正規化を行ってやる必要があります。RMA法を基本としたこの外挿戦略(Extrapolation Strategy)の一つがここで紹介しているものです。
尚、Goldstein's Extrapolation StrategyrefRMARMA+は(たぶん)全く同じ方法です。 RefPlusという名前のパッケージでこれらの手法を提供しているHarbronさんが「ここではRMA+という用語を使う」とのこと。

ここでは、例としてMicroArray Quality Control (MAQC) projectで得られた120 CEL files(120サンプルの生のプローブレベルデータを含むファイルという意味)のRMA+-quantified data(54,675行×120列からなるlogスケール遺伝子発現行列)を得るやり方を説明します。
(もちろん、少なくとも私の1GBメモリパソコンでは120サンプルのデータを一度にRMAにかけることはできませんので、)外挿用のRMAパラメータを得るためのreference datasetとして、A-Dそれぞれのサンプルからランダムに3つずつ取り出した計12 CEL filesのデータを用い、 残りの(120 - 12) CEL filesをfuture datasetとして外挿します。
これは、例えばサンプルAとBだけを用いて得たRMAパラメータを用いてCやDの外挿をするよりは、計120サンプル中のラベル(A-Dの情報)の割合を保ったままのreference datasetを用いたほうがいい、という判断からです(おそらく参考文献のどれかで、このようなことが書いてあるはず)。尚、この12という数字は、私のパソコンでかけられる最大のサンプル数です。
1. 120 CEL filesのzipファイルMAQC_AFX_123456_120CELs.zip(670MB!!)をデスクトップにダウンロード MAQCは4種類のサンプル(samples A, B, C, and D;1サンプルにつき5回の複製実験 --> 一連の実験で20 CEL filesが得られる)の実験を計6つの研究所(場所)で行っています。 2. MAQC_AFX_123456_120CELs.zipをデスクトップに解凍(「MAQC_AFX_123456_120CELs」というディレクトリができます) 3. Rの作業ディレクトリをデスクトップ上の「MAQC_AFX_123456_120CELs」に変更
param2 <- 3                                                      #一種類につき、いくつサンプリングするかを指定(数が大きいほどメモリを食うのでout of memoryにならないできるだけ大きい数を指定する; この場合の最大値は30だが、30で正常に動くのなら、RMA+をやる必要がそもそもない)
param3 <- 5                                                      #ここで指定した数のサンプル数づつ外挿を行う(1以上の数値)

library(RefPlus)                                                 #パッケージの読み込み
list_files <- list.files()                                       #「MAQC_AFX_123456_120CELs」ディレクトリ中のファイル名のリストをゲットしてlist_filesに格納
list_files                                                       #list_filesの中身を表示(最初の20個がSite1, 次の20個がSite2などということが分かる)

#A-Dそれぞれのサンプルから、ランダムに"param2"個ずつ取り出す
vector_A <- c(1:5, 21:25, 41:45, 61:65, 81:85, 101:105)          #サンプルAの位置情報
vector_B <- vector_A + 5                                         #サンプルBの位置情報
vector_C <- vector_B + 5                                         #サンプルCの位置情報
vector_D <- vector_C + 5                                         #サンプルDの位置情報
sample_A <- sample(vector_A, param2, replace=FALSE)              #vector_Aからランダムに"param2"個取り出す
sample_B <- sample(vector_B, param2, replace=FALSE)              #vector_Bからランダムに"param2"個取り出す
sample_C <- sample(vector_C, param2, replace=FALSE)              #vector_Cからランダムに"param2"個取り出す
sample_D <- sample(vector_D, param2, replace=FALSE)              #vector_Dからランダムに"param2"個取り出す
ref_vector <- c(sample_A, sample_B, sample_C, sample_D)          #sample_Aからsample_Dまでのベクトルを結合
list_files[ref_vector]                                           #確かに全種類のサンプルが"param2"個ずつ含まれていることを確認

#reference datasetに対してRMAを適用し、外挿用のパラメータを得る
data = ReadAffy(filenames = list_files[ref_vector])              #計12("param2"*4種類のサンプルだから)個のCELファイル(reference dataset)を読み込んでdataに格納
Para <- rma.para(data, bg = TRUE, exp = TRUE)                    #dataに対してRMAを実行し、正規化に用いた外挿用のパラメータParaを得る

#「(120 - 12)サンプルからなるfuture dataset」と「12サンプルからなるreference dataset」に対して、
#reference datasetから得られた外挿用パラメータParaを用いてRMAを実行
#メモリの関係で、全120サンプルを"param3"サンプルづつの、計24分割して独立に行う。
sub_vector <- c(1:param3)                                        #「MAQC_AFX_123456_120CELs」ディレクトリ中の最初の"param3"個の位置情報を格納
while(sub_vector[param3] <= length(list_files)){                 #sub_vector中の"param3"番目の要素の値がlength(list_files)の値と同じになるまで繰り返す
    cat(sub_vector, "\n")                                        #今どのサンプルを外挿しているのか表示
    data = ReadAffy(filenames = list_files[sub_vector])          #"param3"個のCEL filesを読み込んでdataに格納
    quantified_data <- rmaplus(data, rmapara = Para, bg = TRUE)  #dataに対して外挿用パラメータParaを用いてRMAを実行し、結果をquantified_dataに保存
    write_filename <- paste("data_RMA_", sub_vector[param3], ".txt", sep="")#出力用ファイル名(最初のループではdata_RMA_5.txt、次はdata_RMA_10.txtなど)を作成
    write.table(quantified_data, write_filename, sep="\t",col.names=NA,quote=FALSE)#結果をwrite_filenameで定義したファイル名で保存
    sub_vector <- sub_vector + param3                            #次の"param3"サンプルという情報に変更し、次のループへ
}                                                                #sub_vector中の"param3"番目の要素の値がlength(list_files)の値と同じになるまで繰り返す
data <- NULL                                                     #dataを初期化
quantified_data <- NULL                                          #quantified_dataを初期化
Para <- NULL                                                     #Paraを初期化


4. 無事計算が終了すると、data_RMA_5.txt, ..., data_RMA_120.txtまでの24個のファイルが出来上がります。 これが5サンプルごとに分割して出力させたRMA-quantified dataということになります。 全部を一緒にしたファイル(data_RMAall.txt)を作成したいときには例えば以下のようにします(もちろんExcelでもできます):
out_f <- "data_RMAall.txt"                                       #出力ファイル名を指定

#マージしたいファイルのみ抽出し、ソートした情報を得る
filenames <- list.files(pattern = "^data_RMA_")                  #「MAQC_AFX_123456_120CELs」ディレクトリ中の"data_RMA_"からはじまる全てのファイルをfilenamesに格納
tmp <- filenames                                                 #filenamesと同じものをtmpに格納
tmp                                                              #4で作成した順のファイル名になっていないのでうれしくないことが分かる
tmp <- sub("data_RMA_", "", tmp)                                 #ファイル名から、まず"data_RMA_"という文字を削除した情報を得る
tmp                                                              #ちゃんと削除されていることが分かる
tmp <- sub(".txt", "", tmp)                                      #次に、".txt"という文字を削除した情報を得る
filenames_sorted <- filenames[order(as.numeric(tmp))]            #tmp情報を用いてファイル名を作成された順にソートした結果をfilenames_sortedに格納
filenames_sorted                                                 #ちゃんとソートされていることを確認

#"filenames_sorted"中のファイルを読み込んで、結合していく
for(i in 1:length(filenames_sorted)){                            #ファイルの数分だけループを回す
    cat(filenames_sorted[i], "\n")                               #ループを回すごとにファイル名を表示させている
    if(i == 1){                                                  #最初のファイルを読み込んだ結果をdataに格納
        data <- read.table(filenames_sorted[i], header=TRUE, row.names=1, sep="\t")#最初のファイルを読み込んだ結果をdataに格納
    } else{                                                      #二番目以降のファイルを読み込んだ結果は順次右側の列に格納していく
        data <- cbind(data, read.table(filenames_sorted[i], header=TRUE, row.names=1, sep="\t"))#二番目以降のファイルを読み込んだ結果は順次右側の列に格納していく
    }                                                            #ファイルの数分だけループを回す
}                                                                #ファイルの数分だけループを回す
write.table(data, out_f, sep="\t",col.names=NA, quote=FALSE)     #120サンプル分の結合後のデータをout_fで指定した名前で保存


BioconductorのRefPlusのwebページ

参考文献(RMA+: Harbron et al., Bioinformatics, 2007)
参考文献(Goldstein's Extrapolation Strategy: Goldstein, DR, Bioinformatics, 2006)
参考文献(refRMA: Katz et al., BMC Bioinformatics, 2006)

正規化 | Affymetrix GeneChip | DFW (Chen_2007)

Affymetrix chip (GeneChipTM)を用いて得られた*.CELファイルを元に、Distribution Free Weighted method(DFW; Chen et al., Bioinformatics, 2007)を用いてSummary scoreを算出。
Affycomp II spike-in datasetによる評価でFARMSなどを含む他の手法よりも感度・特異度の点でよかったとのこと。
しかしこの正規化法は、R2.7.2あたりだと正常に動作していましたが、比較的最近のバージョン(R2.8.1以降)ではうまく動いてくれません。そのような場合でも、Rの昔のバージョンをインストールしてDFWを実行することによって、DFWを利用することができます。
1. Rの昔のバージョンをインストールを参考にして、R2.7.2をインストールし、起動 2. 「ファイル」−「ディレクトリの変更」で解析したいファイル(*.CELファイル)を置いてあるディレクトリに移動し、以下をコピペ
out_f <- "data_dfw.txt"                                          #出力ファイル名を指定
source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/dfw.R")          #DFWを実行する関数を含むファイルをあらかじめ読み込む
library(affy)                                                    #パッケージの読み込み
data <- ReadAffy()                                               #CELファイルの読み込み
eset <- expresso(data, bgcorrect.method="none", normalize.method="quantiles", pmcorrect.method="pmonly", summary.method="dfw")#DFW法を実行し、結果をesetに保存。
write.exprs(eset, file=out_f)                                    #結果をout_fで指定したファイル名で保存。


参考文献(Chen et al., Bioinformatics, 2007)
R code for DFW (PDF)
DFWについてのppt資料(p10のexpression valueは明記されていませんがc=0.05のときの値のようですね(defaultは0.01)。

正規化 | Affymetrix GeneChip | FARMS (Hochreiter_2006)

Affymetrix chip (GeneChipTM)を用いて得られた*.CELファイルを元に、FARMS(Factor Analysis for Robust Microarray Summarization; Hochreiter et al., Bioinformatics, 2006)アルゴリズムを用いてSummary scoreを算出。 False positiveもRMAやMAS5.0に比べて少なく、計算時間もRMAより早いとのこと。This package is only free for non-commercial users.だそうです。

FARMSは実際には以下の二つのやり方のいずれかを用いて行います:
q.farms(no background correction and quantile normalization;計算時間が早いというメリットがあるのでこっちがデフォルト)
l.farms(no background correction and loess normalization)

2012/05/16現在の最新版は、version1.4.1ですが、実際にダウンロードされる場合は、参考URLで最新版を確認されることをお勧めします。
また、R2.14.2やR2.15.0ではパッケージのインストールがうまくいかなくなっているようです...orz。R2.11.Xあたりだとうまく動くかもしれません。。。

パッケージのインストール方法(最初の一回のみ) i. 「ファイル」−「ディレクトリの変更」でデスクトップに移動 ii. farms_1.4.1.zipファイルをデスクトップにダウンロード iii. Rコマンドライン上で以下をコピー&ペースト
install.packages("farms_1.4.1.zip", repos=NULL)

「ファイル」−「ディレクトリの変更」で解析したいファイル(*.CELファイル)を置いてあるディレクトリに移動。 1. q.farms(quantile normalization; デフォルト)の場合:
out_f <- "data_qfarms.txt"                                       #出力ファイル名を指定
library(affy)                                                    #パッケージの読み込み
library(farms)                                                   #パッケージの読み込み
library(help=farms)                                              #パッケージの説明
data <- ReadAffy()                                               #*.CELファイルの読み込み
eset <- q.farms(data)                                            #qFARMSを実行し、結果をesetに保存
write.exprs(eset, file=out_f)                                    #結果をout_fで指定したファイル名で保存。


2. l.farms(loess normalization)の場合:
out_f <- "data_lfarms.txt"                                       #出力ファイル名を指定
library(affy)                                                    #パッケージの読み込み
library(farms)                                                   #パッケージの読み込み
library(help=farms)                                              #パッケージの説明
data <- ReadAffy()                                               #*.CELファイルの読み込み
eset <- l.farms(data)                                            #lFARMSを実行し、結果をesetに保存
write.exprs(eset, file=out_f)                                    #結果をout_fで指定したファイル名で保存。


参考URL
参考文献1(Hochreiter et al., Bioinformatics, 2006)
参考文献2(Talloen et al., Bioinformatics, 2007)

正規化 | Affymetrix GeneChip | multi-mgMOS (Liu_2005)

Affymetrix chip (GeneChipTM)を用いて得られた*.CELファイルを元に、参考文献1(Liu et al., Bioinformatics, 2005)の方法を用いてSummary scoreを算出。
(このデータセットは使えないといった)批判的なコメントが多数寄せられている、「いわゆるGolden spike data (参考文献3)」だけをもとに、これまた(評判の悪い)「等量でspiked-inされたprobesetsだけ」をもとにしてsummarization後 (MAS, RMA, or multi-mgMOSなどで正規化後、という意味)のデータをさらにloess正規化したものに対してt-testやSAM, Cyber-TなどでAUCを計算してみたら、multi-mgMOSが良かったという論文(参考文献2)があったので、念のため掲載しました。
しかしまあ、参考文献2で評価に用いたのはGolden spike dataだけなのでmulti-mgMOSが本当に使える方法なのかは”かなり”疑問の余地があります。しかも約23,000 probesetsを搭載しているU133Aチップのたった6 arrays程度の正規化でさえ、ものすごく時間がかかります。これだけ遅いと、現実のデータには使えない、ですね。
また、この方法の売りは、MASのPresent/Absent callやFARMSのInformative/non-informative callと同様、計算したシグナル強度(expression level)に対して、そのexpected uncertaintyも計算するところだそうです。この情報を使ったデータ解析法として、「主成分分析(PCA)の改良版 (pumaPCA)(参考文献4)」、「発現変動遺伝子検出法Probability of Positive Log Ratio (PPLR)(参考文献5)」などがあり、いずれもpumaライブラリ中にあります。マニュアルにも、これまた「すごく時間がかかる」といった記述がありましたのであしからず。

「ファイル」−「ディレクトリの変更」で解析したいファイル(*.CELファイル)を置いてあるディレクトリに移動し、以下をコピペ。
out_f <- "data_mmgmos.txt"                                       #出力ファイル名を指定
library(puma)                                                    #パッケージの読み込み
data <- ReadAffy()                                               #*.CELファイルの読み込み
eset <- mmgmos(data)                                             #multi-mgMOSを実行し、結果をesetに保存
write.exprs(eset, file=out_f)                                    #結果をout_fで指定したファイル名で保存。


Bioconductorの(multi-mgMOSを含むパッケージ)pumaのwebページ

参考文献1(Liu et al., Bioinformatics, 2005)
参考文献2(Pearson R., BMC Bioinformatics, 2008)
参考文献3(Choe et al., Genome Biology, 2005)
参考文献4(Sanguinetti et al., Bioinformatics, 2005)
参考文献5(Liu et al., Bioinformatics, 2006)

正規化 | Affymetrix GeneChip | GLA (Zhou_2005)

Affymetrix chip (GeneChipTM)を用いて得られた*.CELファイルを元に、GLA(GLog Average; Zhou and Rocke, Bioinformatics, 2005)アルゴリズムを用いてSummary scoreを算出。
2007/4/20をもって、解析例を削除しました。最新の手法(DFWなど)をご利用ください。

著者らのPPTプレゼンテーション
参考文献(Zhou and Rocke, Bioinformatics, 2005)

正規化 | Affymetrix GeneChip | GCRMA (Wu_2004)

Affymetrix chip (GeneChipTM)を用いて得られた*.CELファイルを元に、GCRMA(Wu et al., J. Am. Stat. Assoc., 2004)アルゴリズムを用いてSummary scoreを算出。

「ファイル」−「ディレクトリの変更」で解析したいファイル(*.CELファイル)を置いてあるディレクトリに移動し以下をコピペ
out_f <- "data_gcrma.txt"                                        #出力ファイル名を指定
library(gcrma)                                                   #パッケージの読み込み
library(help=gcrma)                                              #パッケージの説明
data <- ReadAffy()                                               #*.CELファイルの読み込み
eset <- gcrma(data)                                              #GCRMAを実行し、結果をesetに保存
write.exprs(eset, file=out_f)                                    #結果をout_fで指定したファイル名で保存。


BioconductorのGCRMAのwebページ

参考文献(Wu et al., J. Am. Stat. Assoc., 2004)

正規化 | Affymetrix GeneChip | PLIER (Affymetrix_2004)

Affymetrix chip (GeneChipTM)を用いて得られた*.CELファイルを元に、PLIER(Probe Logarithmic Intensity ERror; Affymetrix社(2004-))アルゴリズムを用いてSummary scoreを算出。Affymetrix社提供のMAS5(2002-)アルゴリズムの次のバージョン、だと思っていたがどうやらそういうわけではないらしい(2008/8/20追加)。
アルゴリズム中でgeneralized logarithmが使われていることから、文献はGLA(GLog Average)に関する論文(Zhou and Rocke, Bioinformatics, 2005)かと思っていたが、GLAとは別のアルゴリズムであるとのこと。
論文中で「PLIER+16」という記述をMAQCの論文などでみたことがあるかと思いますが、これは文字通り通常の出力に16を足しただけです。このプログラムについてのR上での説明は非常に不親切で真実は定かではありませんが、値の分布的におそらく以下の結果は「PLIER+16」なんだろうと思います。
また、MAQCの論文中では「quantile normalizationしてからPLIER」にかけてますので、このやり方も示します。


「ファイル」−「ディレクトリの変更」で解析したいファイル(*.CELファイル)を置いてあるディレクトリに移動し、以下をコピペ。
1. 「デフォルトのPLIER」の場合:
out_f <- "data_plier.txt"                                        #出力ファイル名を指定
library(plier)                                                   #パッケージの読み込み
library(help=plier)                                              #パッケージの説明
data <- ReadAffy()                                               #*.CELファイルの読み込み
eset <- justPlier(data)                                          #PLIERを実行し、結果をesetに保存
write.exprs(eset, file=out_f)                                    #結果をout_fで指定したファイル名で保存。


2. 「quantile normalizationしてからPLIER」の場合:
out_f <- "data_plier.txt"                                        #出力ファイル名を指定
library(plier)                                                   #パッケージの読み込み
library(help=plier)                                              #パッケージの説明
data <- ReadAffy()                                               #*.CELファイルの読み込み
eset <- justPlier(data, normalize=TRUE)                          #quantile normalizationつきのPLIERを実行し、結果をesetに保存
write.exprs(eset, file=out_f)                                    #結果をout_fで指定したファイル名で保存。


BioconductorのPLIERのwebページ

PDFマニュアル
MAQCの論文(Shi et al., Nat. Biotechnol., 2006のSupplement 8)

正規化 | Affymetrix GeneChip | PDNN (Zhang_2003)

Affymetrix chip (GeneChipTM)を用いて得られた*.CELファイルを元に、PDNN(position-dependent nearest-neighbor)アルゴリズムを用いてSummary scoreを算出。
手続きが煩雑ですね。それに今のところHGU95Av2, HGU133A, and MGU74Av2の三つの型にしか対応していないようです。以下ではHGU133Aを例とします。
...うまく動かないので、参考文献2の著者に問い合わせて返ってきた返事が 「PDNN法の使用はお勧めしない、他の手法より劣っていることが証明されてるから(参考文献3)...」 だそうで、その後質問には答えてくれません。 参考文献4でPDNNがいい、と書いてあったので試そうとしたのですが...、 まあ本人?!たちがそういっているので、この方法は無視でもいいのでしょうね。

「ファイル」−「ディレクトリの変更」で解析したいファイル(*.CELファイル)を置いてあるディレクトリに移動し、以下をコピペ
out_f <- "data_pdnn.txt"                                         #出力ファイル名を指定
library(affypdnn)                                                #パッケージの読み込み
data <- ReadAffy()                                               #*.CELファイルの読み込み
energy.file <- system.file("exampleData", "pdnn-energy-parameter_hg-u133a.txt", package = "affypdnn")#チップの型に対応した専用のパラメータファイルの読み込み
params.chiptype <- pdnn.params.chiptype(energy.file, probes.pack = "hgu133aprobe")#チップの型に対応した専用のパラメータファイルの読み込み


BioconductorのPDNNのwebページ

参考文献1(手法の原著論文PDF; Zhang et al., Nat. Biotechnol., 2003)
参考文献2(Rパッケージの論文PDF; Nielsen et al., Bioinformatics, 2005)
参考文献3(Bruun et al., Nucleic Acids Res., 2007)
参考文献4(Jiang et al., BMC Bioinformatics., 2008)

正規化 | Affymetrix GeneChip | VSN (Huber_2002)

Affymetrix chip (GeneChipTM)を用いて得られた*.CELファイルを元に、VSN(Variance stabilization)アルゴリズムを用いてSummary scoreを算出。
VSNはRMAに比べてより低発現領域におけるバラツキのコントロールを厳しくしています。よれゆえ、RMAに比べ、より得られるシグナル強度のダイナミックレンジが狭くなります。

「ファイル」−「ディレクトリの変更」で解析したいファイル(*.CELファイル)を置いてあるディレクトリに移動し、以下をコピペ
out_f <- "data_vsn.txt"                                          #出力ファイル名を指定
library(vsn)                                                     #パッケージの読み込み
data <- ReadAffy()                                               #*.CELファイルの読み込み
eset <- vsnrma(data)                                             #VSNを実行し、結果をesetに保存
write.exprs(eset, file=out_f)                                    #結果をout_fで指定したファイル名で保存。


vsnHuber et al., Bioinformatics, 2002

正規化 | Affymetrix GeneChip | MAS, MBEI, RMA

Affymetrix GeneChipを用いて得られた*.CELファイルを元に、MAS, RMA, GCRMA(RMAの改良版でプローブレベルのシグナル強度をGC含量の関数としてモデル化したもの), やMBEIなど様々なアルゴリズムを用いてPM値やMM値の補正や正規化を行い、最終的にSummarizationまでやってくれる。つまり、特定の遺伝子(クローン)についての(相対)発現強度を見積もってくれる。
注意点としては、MASは解析データセット中にサンプルが一つ増えてももともとあったサンプルの発現データは変化しないが、RMAやMBEIはデータセットが変わると結果が変わるので、これらを使って別々に正規化したサブセット同士を結合して解析をすると誤った結果を導く可能性があります(と思います)。
ちなみにRには(まだ?!)実装されていませんが3パラメータ対数正規分布モデルによる正規化法(SuperNorm)はMASと同じくサンプルごとに独立して正規化(summarization scoreの算出)を行うので、サンプルの増減によるsummarizaton scoreの変化が嫌な人はこちらがお勧めです(2007/4/20)。(ちなみにこの方法はプラットホーム非依存なので2 channel型マイクロアレイでも使えます)
変更点としては、MASとMBEIは、RMAと出力形式を統一すべく、log2で対数変換した後のデータを出力させるように変更しました(2009/6月ごろ)。

「ファイル」−「ディレクトリの変更」で解析したいファイル(*.CELファイル)を置いてあるディレクトリに移動し、以下をコピペ
1. MASアルゴリズムの場合:
out_f <- "data_mas.txt"                                          #出力ファイル名を指定

library(affy)                                                    #パッケージの読み込み
data <- ReadAffy()                                               #*.CELファイルの読み込み
eset <- mas5(data)                                               #MASを実行し、結果をesetに保存
summary(exprs(eset))                                             #得られたesetの遺伝子発現行列のシグナル強度分布を表示(20090709追加)
exprs(eset)[exprs(eset) < 1] <- 1                                #対数変換(log2)できるようにシグナル強度が1未満のものを1にしておく(20090709追加)
summary(exprs(eset))                                             #上記処理後のシグナル強度分布を再び表示させて確認(20090709追加)
exprs(eset) <- log(exprs(eset), 2)                               #底を2として対数変換(20090709追加)
write.exprs(eset, file=out_f)                                    #結果をout_fで指定したファイル名で保存。


参考文献(Hubbell et al., Bioinformatics, 2002) 2. RMAアルゴリズムの場合:
out_f <- "data_rma.txt"                                          #出力ファイル名を指定

library(affy)                                                    #パッケージの読み込み
data <- ReadAffy()                                               #*.CELファイルの読み込み
eset <- rma(data)                                                #RMAを実行し、結果をesetに保存
write.exprs(eset, file=out_f)                                    #結果をout_fで指定したファイル名で保存。


参考文献(Irizarry et al., Biostatistics, 2003) 3. MBEIアルゴリズム(PM onlyモデル)の場合:
out_f <- "data_mbei_pmonly.txt"                                  #出力ファイル名を指定

library(affy)                                                    #パッケージの読み込み
data <- ReadAffy()                                               #*.CELファイルの読み込み
eset <- expresso(data, normalize.method="invariantset", bg.correct=FALSE, pmcorrect.method="pmonly", summary.method="liwong")#dChip(PM onlyモデル)を実行し、結果をesetに保存
summary(exprs(eset))                                             #得られたesetの遺伝子発現行列のシグナル強度分布を表示(20090709追加)
exprs(eset)[exprs(eset) < 1] <- 1                                #対数変換(log2)できるようにシグナル強度が1未満のものを1にしておく(20090709追加)
summary(exprs(eset))                                             #上記処理後のシグナル強度分布を再び表示させて確認(20090709追加)
exprs(eset) <- log(exprs(eset), 2)                               #底を2として対数変換(20090709追加)
write.exprs(eset, file=out_f)                                    #結果をout_fで指定したファイル名で保存。


参考文献(Li and Wong, PNAS, 2001) 4. MBEIアルゴリズム(PM-MMモデル)の場合:
out_f <- "data_mbei.txt"                                         #出力ファイル名を指定

library(affy)                                                    #パッケージの読み込み
data <- ReadAffy()                                               #*.CELファイルの読み込み
eset <- expresso(data, normalize.method="invariantset", bg.correct=FALSE, pmcorrect.method="subtractmm", summary.method="liwong")#dChip(PM-MMモデル)を実行し、結果をesetに保存
summary(exprs(eset))                                             #得られたesetの遺伝子発現行列のシグナル強度分布を表示(20090709追加)
exprs(eset)[exprs(eset) < 1] <- 1                                #対数変換(log2)できるようにシグナル強度が1未満のものを1にしておく(20090709追加)
summary(exprs(eset))                                             #上記処理後のシグナル強度分布を再び表示させて確認(20090709追加)
exprs(eset) <- log(exprs(eset), 2)                               #底を2として対数変換(20090709追加)
write.exprs(eset, file=out_f)                                    #結果をout_fで指定したファイル名で保存。


参考文献(Li and Wong, PNAS, 2001) Bioconductorのaffyのwebページ

解析 | 二つの遺伝子リストファイルから共通遺伝子部分のみを抽出

「1列目:遺伝子名、2列目:数値」からなる二つのファイル(genelist_A.txtgenelist_B.txt;いずれもヘッダー行を含む)があったとします。 そして、同じ遺伝子名のところの数値は同じだったとします。このような前提で二つのファイルで共通して含まれる遺伝子の情報のみ抽出したいときに利用します。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し、以下をコピペ
in_f1 <- "genelist_A.txt"                                        #入力ファイル名を指定
in_f2 <- "genelist_B.txt"                                        #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

#入力ファイルの読み込み
data1 <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#ファイルの読み込み
data2 <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#ファイルの読み込み

#本番
common <- intersect(rownames(data1), rownames(data2))            #二つの遺伝子名のベクトル同士の積集合(intersection)をcommonに格納
obj <- is.element(rownames(data1), common)                       #rownames(data1)で表されるin_f1で読み込んだファイル中の遺伝子名のベクトル中の各要素がベクトルcommon中に含まれるか含まれないか(TRUE or FALSE)の情報をobjに格納(別にdata1でなくてdata2のほうでやってもよい)
out <- data1[obj,]                                               #行列data1からobjがTRUEとなる行のみを抽出した結果をoutに格納
names(out) <- rownames(data1)[obj]

#ファイルに出力
tmp <- cbind(names(out), out)                                    #行の名前、outを列ベクトル単位で結合し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


解析 | 二つのベクトル間の距離を定義する様々な方法を知る

二つのベクトル間の距離を定義する方法は多数存在します。ここでは10 genes ×2 samplesのデータファイル(sample19.txt)を読み込んで二つのサンプル間の距離をいくつかの方法で算出します。
「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し、以下をコピペ
1. 10 genes ×2 samplesのデータファイル(sample19.txt)の場合:
in_f <- "sample19.txt"                                           #入力ファイル名を指定

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#ファイルの読み込み

#本番
dist(t(data), method="euclidean")                                #ユークリッド距離
dist(t(data), method="manhattan")                                #マンハッタン距離
dist(t(data), method="maximum")                                  #最大距離
dist(t(data), method="canberra")                                 #キャンベラ距離
1 - cor(data, method="pearson")                                  #1 - Pearson相関係数

dist(t(data), method="binary")                                   #Binary距離
dist(t(data), method="minkowski")                                #minkowski距離
1 - cor(data, method="spearman")                                 #1 - Spearman相関係数


解析 | 遺伝子ごとの平均発現量など

遺伝子発現行列に対して、一つ一つの遺伝子(行)に対して、様々な基本的な情報を得たい場合に利用します。

「ファイル」−「ディレクトリの変更」で解析したいファイル(sample2.txt)を置いてあるディレクトリに移動し、以下をコピペ
1. 平均発現量を調べたい場合:
in_f <- "sample2.txt"                                            #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")     #ファイルの読み込み

out <- apply(data, 1, mean)                                      #各行の平均値(mean)をoutに格納
tmp <- cbind(rownames(data), data, out)                          #行の名前、data、outを列ベクトル単位で結合し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


2. 中央値(median)を調べたい場合:
in_f <- "sample2.txt"                                            #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")     #ファイルの読み込み

out <- apply(data, 1, median)                                    #各行の中央値(median)をoutに格納
tmp <- cbind(rownames(data), data, out)                          #行の名前、data、outを列ベクトル単位で結合し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


3. 重みつき平均(Tukey biweighted mean)を調べたい場合:
in_f <- "sample2.txt"                                            #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

#必要なパッケージをロード
library(affy)                                                    #tukey.biweight関数が含まれているaffyパッケージの読み込み

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")     #ファイルの読み込み

out <- apply(data, 1, tukey.biweight)                            #各行のtukey.biweight値をoutに格納
tmp <- cbind(rownames(data), data, out)                          #行の名前、data、outを列ベクトル単位で結合し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


解析 | 最大発現量を示す組織を調べたい

遺伝子発現行列に対して、一つ一つの遺伝子(行)に対して、様々な基本的な情報を得たい場合に利用します。

「ファイル」−「ディレクトリの変更」で解析したいファイル(sample2.txt)を置いてあるディレクトリに移動し、以下をコピペ
in_f <- "sample2.txt"                                            #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")     #ファイルの読み込み

out <- colnames(data)[max.col(data)]                             #最大発現量を示す組織名outに格納
tmp <- cbind(rownames(data), data, out)                          #入力データの右側にoutの情報を結合した結果をtmpに格納。
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。

#以下は(こんなこともできますという)おまけ
#最大発現量を示す組織順にソートしてファイルに保存したい場合:
out_f2 <- "hoge2.txt"                                            #出力ファイル名2を指定
tmp2 <- tmp[order(max.col(data)),]                               #最大発現量を示す組織のシリアル番号順にソートした結果をtmp2に格納
write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。


前処理について

以下に書いてあるような前処理の中で私がやるのは基本的には対数(log)変換と(GSEA解析をしたいときに)同じ遺伝子名を持つものをまとめるくらいです。 一応遺伝子発現行列のsummary()をみて、シグナル強度の分布を眺めてよっぽど変だったらサンプル間のシグナル強度の平均値をそろえるとかサンプル間のシグナル強度の中央値をそろえるをやりますが...そこまで変なデータに出会ったことはありません。

前処理 | スケーリング | サンプル間のシグナル強度の平均値をそろえる

よく論文中で各サンプル(各列)の発現データの平均をXにそろえて...などという記述があります。ここでは、二つの例題を示します。

「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動。
1. 10 genes ×2 samplesのデータファイル(sample19.txt)の場合:
in_f <- "sample19.txt"                                           #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定
param <- 10                                                      #各サンプルの正規化後の平均値を指定

#データファイルの読み込み
data_tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="") #ファイルの読み込み

tmp_mean <- apply(data_tmp, 2, mean, na.rm=TRUE)                 #各サンプル(列)の平均シグナル強度を計算した結果をtmp_meanに格納
data <- sweep(data_tmp, 2, param/tmp_mean, "*")                  #各列中の全てのシグナル値にparam/tmp_meanを掛け、その結果をdataに格納
data                                                             #結果を表示
apply(data, 2, mean)                                             #各列のmeanを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data), data)                               #遺伝子IDの列を行列dataの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


2. 6 genes ×11 samplesのデータファイル(sample2.txt)の場合:
in_f <- "sample2.txt"                                            #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定
param <- 100                                                     #各サンプルの正規化後の平均値を指定

#データファイルの読み込み
data_tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="") #ファイルの読み込み

tmp_mean <- apply(data_tmp, 2, mean, na.rm=TRUE)                 #各サンプル(列)の平均シグナル強度を計算した結果をtmp_meanに格納
data <- sweep(data_tmp, 2, param/tmp_mean, "*")                  #各列中の全てのシグナル値にparam/tmp_meanを掛け、その結果をdataに格納
data                                                             #結果を表示
apply(data, 2, mean)                                             #各列のmeanを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data), data)                               #遺伝子IDの列を行列dataの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


前処理 | スケーリング | サンプル間のシグナル強度の中央値をそろえる

よく論文中で各サンプル(各)の発現データの中央値(median)をXにそろえて...などという記述があります。ここではX=50とした場合のやり方を例示します。

「ファイル」−「ディレクトリの変更」で解析したいファイル(sample2.txt)を置いてあるディレクトリに移動。
in_f <- "sample2.txt"                                            #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定
param <- 50                                                      #各サンプルの正規化後の中央値を指定

#データファイルの読み込み
data_tmp <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="") #ファイルの読み込み

tmp_median <- apply(data_tmp, 2, median, na.rm=TRUE)             #各サンプル(列)のシグナル強度のmedianを計算した結果をtmp_medianに格納
data <- sweep(data_tmp, 2, param/tmp_median, "*")                #各列中の全てのシグナル値にparam/tmp_medianを掛け、その結果をdataに格納
data                                                             #結果を表示
apply(data, 2, median)                                           #各列のmedianを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data), data)                               #遺伝子IDの列を行列dataの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


前処理 | スケーリング | 各サンプルのシグナル強度の平均を0、標準偏差を1にする

いわゆるZスケーリング(Zスコア化)というやつです。いくつかのやり方を例示しておきます。

「ファイル」−「ディレクトリの変更」で解析したいファイル(sample2.txt)を置いてあるディレクトリに移動し、以下をコピペ。
1. やり方1:
in_f <- "sample2.txt"                                            #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

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

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")     #ファイルの読み込み

data.z <- normalize(data, byrow=FALSE)                           #列方向に正規化した結果をdata.zに格納
data.z                                                           #結果を表示
apply(data.z, 2, mean)                                           #各列のmeanを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data.z), data.z)                           #遺伝子IDの列を行列data.zの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


2. やり方2:
in_f <- "sample2.txt"                                            #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

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

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")     #ファイルの読み込み

data.z <- genescale(data, axis=2, method="Z")                    #列方向に正規化した結果をdata.zに格納
data.z                                                           #結果を表示
apply(data.z, 2, mean)                                           #各列のmeanを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data.z), data.z)                           #遺伝子IDの列を行列data.zの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


3. やり方3:
in_f <- "sample2.txt"                                            #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")     #ファイルの読み込み

data.z <- scale(data)                                            #列方向に正規化した結果をdata.zに格納
data.z                                                           #結果を表示
apply(data.z, 2, mean)                                           #各列のmeanを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data.z), data.z)                           #遺伝子IDの列を行列data.zの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


CRANのsomのwebページ
PDFマニュアル

前処理 | スケーリング | 各遺伝子のシグナル強度の平均を0、標準偏差を1にする

いわゆるZスケーリング(Zスコア化)というやつです。いくつかのやり方を例示しておきます。

「ファイル」−「ディレクトリの変更」で解析したいファイル(sample2.txt)を置いてあるディレクトリに移動し、以下をコピペ
1. やり方1:
in_f <- "sample2.txt"                                            #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

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

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")     #ファイルの読み込み

data.z <- normalize(data, byrow=TRUE)                            #行方向に正規化した結果をdata.zに格納
data.z                                                           #結果を表示
apply(data.z, 1, mean)                                           #各行のmeanを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data.z), data.z)                           #遺伝子IDの列を行列data.zの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


2. やり方2:
in_f <- "sample2.txt"                                            #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

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

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")     #ファイルの読み込み

data.z <- genescale(data, axis=1, method="Z")                    #行方向に正規化した結果をdata.zに格納
data.z                                                           #結果を表示
apply(data.z, 1, mean)                                           #各行のmeanを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data.z), data.z)                           #遺伝子IDの列を行列data.zの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


3. やり方3:
in_f <- "sample2.txt"                                            #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")     #ファイルの読み込み

tmp <- scale(t(data))                                            #scale関数は列方向のscalingしかしてくれないので、t関数を使って転置行列に対してscale関数を実行し、結果をtmpに格納
data.z <- t(tmp)                                                 #前の行で行列を転置させていたので、もう一度転置しなおした結果をdata.zに格納
data.z                                                           #結果を表示
apply(data.z, 1, mean)                                           #各行のmeanを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data.z), data.z)                           #遺伝子IDの列を行列data.zの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


CRANのsomのwebページ
PDFマニュアル

前処理 | スケーリング | 各サンプル or 遺伝子のシグナル強度の平均を0、MADを1にする

発現データを正規化(mean=0, MAD=1)してくれる。

「ファイル」−「ディレクトリの変更」で解析したい実数データのファイル(GDS1096_rma.txt)を置いてあるディレクトリに移動。
1. 遺伝子()方向にスケーリングしたい場合:
in_f <- "GDS1096_rma.txt"                                        #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納

data.t <- t(data)                                                #行列の転置(この後に使うscale関数が列ごとの操作を行うため、scale関数をそのまま使えるように予め行列を入れ替えておく必要があるため)
data.t.mean.mad <- scale(data.t, apply(data.t,2,mean), apply(data.t,2,mad,constant=1))#各列のmean=0, MAD=1になるようにスケーリングし、結果をdata.t.mean.madに格納
data.mean.mad <- t(data.t.mean.mad)                              #scale関数の適用が終わったので、もう一度行列の転置を行って元に戻し、結果をdata.mean.madに格納
apply(data.mean.mad, 1, mean)                                    #各行のmeanを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data.mean.mad), data.mean.mad)             #遺伝子IDの列を行列data.mean.madの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


2. サンプル()方向にスケーリングしたい場合:
in_f <- "GDS1096_rma.txt"                                        #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納

data.mean.mad <- scale(data, apply(data,2,mean), apply(data,2,mad,constant=1))#各列のmean=0, MAD=1になるようにスケーリングし、結果をdata.mean.madに格納
apply(data.mean.mad, 2, mean)                                    #各列のmeanを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data.mean.mad), data.mean.mad)             #遺伝子IDの列を行列data.mean.madの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


前処理 | スケーリング | 各サンプル or 遺伝子のシグナル強度の中央値を0、標準偏差を1にする

発現データを正規化(median=0, standard deviation (SD)=1)してくれる。

「ファイル」−「ディレクトリの変更」で解析したい実数データのファイル(GDS1096_rma.txt)を置いてあるディレクトリに移動。
1. 遺伝子()方向にスケーリングしたい場合:
in_f <- "GDS1096_rma.txt"                                        #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納

data.t <- t(data)                                                #行列の転置(この後に使うscale関数が列ごとの操作を行うため、scale関数をそのまま使えるように予め行列を入れ替えておく必要があるため)
data.t.m.sd <- scale(data.t, apply(data.t,2,median), apply(data.t,2,sd))#各列のmedian=0, SD=1になるようにスケーリングし、結果をdata.t.m.sdに格納
data.m.sd <- t(data.t.m.sd)                                      #scale関数の適用が終わったので、もう一度行列の転置を行って元に戻し、結果をdata.m.sdに格納
apply(data.m.sd, 1, median)                                      #各行のmedianを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data.m.sd), data.m.sd)                     #遺伝子IDの列を行列data.m.sdの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


2. サンプル()方向にスケーリングしたい場合:
in_f <- "GDS1096_rma.txt"                                        #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
data.m.sd <- scale(data, apply(data,2,median), apply(data,2,sd)) #各列のmedian=0, SD=1になるようにスケーリングし、結果をdata.m.sdに格納
apply(data.m.sd, 2, median)                                      #各列のmedianを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data.m.sd), data.m.sd)                     #遺伝子IDの列を行列data.m.sdの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


前処理 | スケーリング | 各サンプル or 遺伝子のシグナル強度の中央値を0、MADを1にする

発現データを正規化(median=0、Median Absolute Deviation (MAD)=1)してくれる。

「ファイル」−「ディレクトリの変更」で解析したいファイル(GDS1096_rma.txt)を置いてあるディレクトリに移動。
1. 遺伝子()方向にスケーリングしたい場合:
in_f <- "GDS1096_rma.txt"                                        #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納

data.t <- t(data)                                                #行列の転置(この後に使うscale関数が列ごとの操作を行うため、scale関数をそのまま使えるように予め行列を入れ替えておく必要があるため)
data.t.m.mad <- scale(data.t, apply(data.t,2,median), apply(data.t,2,mad,constant=1))#各列のmedian=0, MAD=1になるようにスケーリングし、結果をdata.t.m.madに格納
data.m.mad <- t(data.t.m.mad)                                    #scale関数の適用が終わったので、もう一度行列の転置を行って元に戻し、結果をdata.m.madに格納
apply(data.m.mad, 1, median)                                     #各行のmedianを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data.m.mad), data.m.mad)                   #遺伝子IDの列を行列data.m.madの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


2. サンプル()方向にスケーリングしたい場合:
in_f <- "GDS1096.txt"                                            #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
data.m.mad <- scale(data, apply(data,2,median), apply(data,2,mad,constant=1))#各列のmedian=0, MAD=1になるようにスケーリングし、結果をdata.m.madに格納
apply(data.m.mad, 2, median)                                     #各列のmedianを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data.m.mad), data.m.mad)                   #遺伝子IDの列を行列data.m.madの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


参考文献:Ge et al., Genomics, 2005

前処理 | スケーリング | 各サンプル or 遺伝子のシグナル強度のTukey biweightを0、MADを1にする

発現データを正規化(Tukey's biweight=0、Median Absolute Deviation (MAD)=1)してくれる。

「ファイル」−「ディレクトリの変更」で解析したいファイル(GDS1096_rma.txt)を置いてあるディレクトリに移動。
1. 遺伝子()方向にスケーリングしたい場合:
in_f <- "GDS1096_rma.txt"                                        #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

#必要なパッケージをロード
library(affy)                                                    #tukey.biweight関数が含まれているaffyパッケージの読み込み

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納

data.t <- t(data)                                                #行列の転置(この後に使うscale関数が列ごとの操作を行うため、scale関数をそのまま使えるように予め行列を入れ替えておく必要があるため)
data.t.tukey.mad <- scale(data.t,apply(data.t,2,tukey.biweight),apply(data.t,2,mad,constant=1))#各列のTukey's biweight=0, MAD=1になるようにスケーリングし、結果をdata.t.tukey.madに格納
data.tukey.mad <- t(data.t.tukey.mad)                            #scale関数の適用が終わったので、もう一度行列の転置を行って元に戻し、結果をdata.tukey.madに格納
apply(data.tukey.mad, 1, tukey.biweight)                         #各行のTukey's biweightを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data.tukey.mad), data.tukey.mad)           #遺伝子IDの列を行列data.tukey.madの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


2. サンプル()方向にスケーリングしたい場合:
in_f <- "GDS1096_rma.txt"                                        #入力ファイル名を指定
out_f <- "hoge.txt"                                              #出力ファイル名を指定

#必要なパッケージをロード
library(affy)                                                    #tukey.biweight関数が含まれているaffyパッケージの読み込み

#データファイルの読み込み
data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納

data.tukey.mad <- scale(data,apply(data,2,tukey.biweight), apply(data,2,mad,constant=1))#各列のTukey's biweight=0, MAD=1になるようにスケーリングし、結果をdata.tukey.madに格納
apply(data.tukey.mad, 2, tukey.biweight)                         #各列のTukey's biweightを表示させ、正常に動作しているか確認
tmp <- cbind(rownames(data.tukey.mad), data.tukey.mad)           #遺伝子IDの列を行列data.tukey.madの左端に挿入し、結果をtmpに格納
write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。


前処理 | スケーリング | 各サンプル or 遺伝子のシグナル強度の範囲を0-1にする

「ファイル」−「ディレクトリの変更」で解析したいファイル(sample2.txt)を置いてあるディレクトリに移動し、以下をコピペ
  • 遺伝子()方向にスケーリングしたい場合:
  • in_f <- "sample2.txt"                                            #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(genefilter)                                              #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    data.r <- genescale(data, axis=1, method="R")                    #スケーリングした結果をdata.rに格納
    apply(data.r, 1, range)                                          #各行の最小値と最大値を表示させ、正常に動作しているか確認
    tmp <- cbind(rownames(data.r), data.r)                           #遺伝子IDの列を行列data.rの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
  • サンプル()方向にスケーリングしたい場合:
  • in_f <- "sample2.txt"                                            #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(genefilter)                                              #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    data.r <- genescale(data, axis=2, method="R")                    #スケーリングした結果をdata.rに格納
    apply(data.r, 2, range)                                          #各列の最小値と最大値を表示させ、正常に動作しているか確認
    tmp <- cbind(rownames(data.r), data.r)                           #遺伝子IDの列を行列data.rの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    

    前処理 | スケーリング | シグナル強度を対数(log)変換する

    発現データを対数(log)変換してくれます。ほぼ例外なく底は2なので、ここではそのやり方のみ示します。
    尚、予め「シグナル強度が1未満のものを1にする」ということを行っていますが、これはlogをとれるようにするためです。実際にWADの原著論文(Kadota et al., 2008)中で以下のような操作を行っています(論文中の記述はTable 1を参照のこと)。
    くれぐれもご自身が対数変換しようとしている入力ファイルについて、「シグナル強度の分布を確認し、ダイナミックレンジが4桁程度あることを確認」してください。

    「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し、以下をコピペ
    1. sample2.txtのようなごく一般的な形式のファイルをlog変換したいとき:
    in_f <- "sample2.txt"                                            #入力ファイル名を指定
    out_f <- "sample2_log.txt"                                       #出力ファイル名を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    summary(data)                                                    #シグナル強度の分布を確認し、ダイナミックレンジが4桁程度あることを確認
    data[data < 1] <- 1                                              #シグナル強度が1未満のものを1にする
    data.log <- log(data, base=2)                                    #log2-transformed dataをdata.logに格納
    summary(data.log)                                                #対数変換後のシグナル強度の分布を確認
    tmp <- cbind(rownames(data.log), data.log)                       #遺伝子IDの列を行列data.logの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    2. GDS1096.txtのような"IDENTIFIER"という余分な一列を含むファイルを処理したいとき:
    in_f <- "GDS1096.txt"                                            #入力ファイル名を指定
    out_f <- "GDS1096_log.txt"                                       #出力ファイル名を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data$IDENTIFIER <- NULL                                          #余分なIDENTIFIER列の消去
    summary(data)                                                    #シグナル強度の分布を確認し、ダイナミックレンジが4桁程度あることを確認
    
    data[data < 1] <- 1                                              #シグナル強度が1未満のものを1にする
    data.log <- log(data, base=2)                                    #log2-transformed dataをdata.logに格納
    summary(data.log)                                                #対数変換後のシグナル強度の分布を確認
    tmp <- cbind(rownames(data.log), data.log)                       #遺伝子IDの列を行列data.logの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    

    前処理 | スケーリング | Quantile normalization

    発現データをQuantile normalization(発現強度の順位が同じならその発現強度も同じにする正規化)してくれます。 Jeffery et al., BMC Bioinformatics, 2006の解析で行われた前処理と同じ(RMA-quantified data --> Quantile normalization)です。

    「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し、以下をコピペ
    1. GDS1096_rma.txtの場合:
    in_f <- "GDS1096_rma.txt"                                        #入力ファイル名を指定
    out_f <- "hoge_q1.txt"                                           #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(limma)                                                   #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    data.q <- normalizeQuantiles(as.matrix(data))                    #Quantile normalizationを実行し、結果をdata.qに格納
    rownames(data.q) <- rownames(data)                               #行の名前を追加
    colnames(data.q) <- colnames(data)                               #列の名前を追加
    tmp <- cbind(rownames(data.q), data.q)                           #遺伝子IDの列を行列data.qの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    2. sample19.txtの場合:
    in_f <- "sample19.txt"                                           #入力ファイル名を指定
    out_f <- "hoge_q2.txt"                                           #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(limma)                                                   #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    data.q <- normalizeQuantiles(as.matrix(data))                    #Quantile normalizationを実行し、結果をdata.qに格納
    rownames(data.q) <- rownames(data)                               #行の名前を追加
    colnames(data.q) <- colnames(data)                               #列の名前を追加
    tmp <- cbind(rownames(data.q), data.q)                           #遺伝子IDの列を行列data.qの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    3. sample19_plus1.txtの場合:
    in_f <- "sample19_plus1.txt"                                     #入力ファイル名を指定
    out_f <- "hoge_q3.txt"                                           #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(limma)                                                   #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    data.q <- normalizeQuantiles(as.matrix(data))                    #Quantile normalizationを実行し、結果をdata.qに格納
    rownames(data.q) <- rownames(data)                               #行の名前を追加
    colnames(data.q) <- colnames(data)                               #列の名前を追加
    tmp <- cbind(rownames(data.q), data.q)                           #遺伝子IDの列を行列data.qの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    参考文献(Jeffery et al., BMC Bioinformatics, 2006)

    前処理 | 遺伝子のフィルタリング1

    特定の条件を満たす遺伝子のみを抽出(フィルタリング;filtering)してくれる。遺伝子間クラスタリングなどを行いたいときに、
    a) メモリが足りない!と文句を言われて計算を実行できない
    b) 条件(or サンプル or チップ)間で発現変動していない遺伝子はみてもしょうがない(or 解析データに含める価値がない)ので計算時間を短縮したい
    c) 既出論文のデータ解析において実行されたフィルタリング手順を再現して、同じサブセットで解析したい
    ような場合に以下のお好みの操作を行います。
    注意点としては「フィルタリングしようとしているデータが対数変換(or log変換)されているかどうかをちゃんと把握しておく」ことが大事です。 以下の解析例で用いているsample2.txtは対数変換前のデータなので、解析例1で行っているような「シグナル強度50以上」という条件を満たす遺伝子が存在します。
    しかし、もしこれと同じことを対数変換後のデータで行おうとすると、一般にシグナル強度が2^50 (=1.1259e+15)を超えるような途方もなく大きな数値を出すような機器は存在しないので、条件を満たす遺伝子が存在しないことになります。だからその後の解析で何をやってもエラーが出力されるのです。このあたりに注意して利用してください。

    「ファイル」−「ディレクトリの変更」で解析したいファイル(sample2.txt)を置いてあるディレクトリに移動し、以下をコピペ
    1. 5組織(k=5)以上でシグナル強度50以上(A=50)の遺伝子のみを抽出したい場合:
    in_f <- "sample2.txt"                                            #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 5                                                      #組織数kを指定
    param2 <- 50                                                     #シグナル強度Aを指定
    
    #必要なパッケージをロード
    library(genefilter)                                              #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    f1 <- kOverA(param1, A=param2)                                   #「k組織以上でシグナル強度A以上を持つ遺伝子を抽出」という条件(filter)をf1に格納
    ffun <- filterfun(f1)                                            #フィルタリング用の関数(filtering function)を作成しffunに格納
    which <- genefilter(data, ffun)                                  #フィルタリングを実行し、結果をwhichに格納
    which                                                            #whichの中身を表示 (この場合はgene1, 2, 5がTRUEとなる)
    sum(which)                                                       #条件を満たす遺伝子がいくつあったかを表示 (この場合は3)
    data.f <- data[which,]                                           #条件を満たす遺伝子群の発現データをdata.fに格納
    data.f                                                           #結果を表示
    tmp <- cbind(rownames(data.f), data.f)                           #遺伝子IDの列を行列data.fの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    2. シグナル強度>20(A=20)の組織数の割合が>70%(p=0.7)を満たす遺伝子のみを抽出したい場合:
    in_f <- "sample2.txt"                                            #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 0.7                                                    #組織数の割合pを指定
    param2 <- 20                                                     #シグナル強度Aを指定
    
    #必要なパッケージをロード
    library(genefilter)                                              #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    f1 <- pOverA(p=param1, A=param2)                                 #「シグナル強度がAよりも大きい組織数の割合がpよりも大きい遺伝子を抽出」という条件(filter)をf1に格納
    ffun <- filterfun(f1)                                            #フィルタリング用の関数(filtering function)を作成しffunに格納
    which <- genefilter(data, ffun)                                  #フィルタリングを実行し、結果をwhichに格納
    which                                                            #whichの中身を表示 (この場合はgene1, 2, 5がTRUEとなる)
    sum(which)                                                       #条件を満たす遺伝子がいくつあったかを表示 (この場合は3)
    data.f <- data[which,]                                           #条件を満たす遺伝子群の発現データをdata.fに格納
    data.f                                                           #結果を表示
    tmp <- cbind(rownames(data.f), data.f)                           #遺伝子IDの列を行列data.fの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    3. 少なくとも一つの組織でシグナル強度が92(A=92)以上の遺伝子を抽出したい場合:
    in_f <- "sample2.txt"                                            #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param <- 92                                                      #シグナル強度Aを指定
    
    #必要なパッケージをロード
    library(genefilter)                                              #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    f1 <- maxA(param)                                                #「少なくとも一つの組織でシグナル強度がparam以上の遺伝子を抽出」という条件(filter)をf1に格納
    ffun <- filterfun(f1)                                            #フィルタリング用の関数(filtering function)を作成しffunに格納
    which <- genefilter(data, ffun)                                  #フィルタリングを実行し、結果をwhichに格納
    which                                                            #whichの中身を表示 (この場合はgene2, 5がTRUEとなる)
    sum(which)                                                       #条件を満たす遺伝子がいくつあったかを表示 (この場合は3)
    data.f <- data[which,]                                           #条件を満たす遺伝子群の発現データをdata.fに格納
    data.f                                                           #結果を表示
    tmp <- cbind(rownames(data.f), data.f)                           #遺伝子IDの列を行列data.fの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    Bioconductorのgenefilterのwebページ

    前処理 | 遺伝子のフィルタリング2

    特定の条件を満たす遺伝子のみを抽出(フィルタリング;filtering)してくれる。遺伝子間クラスタリングなどを行いたいときに、
    a) メモリが足りない!と文句を言われて計算を実行できない
    b) 条件(or サンプル or チップ)間で発現変動していない遺伝子はみてもしょうがない(or 解析データに含める価値がない)ので計算時間を短縮したい
    c) 既出論文のデータ解析において実行されたフィルタリング手順を再現して、同じサブセットで解析したい
    ような場合に以下のお好みの操作を行います。
    注意点としては「フィルタリングしようとしているデータが対数変換(or log変換)されているかどうかをちゃんと把握しておく」ことが大事です。 無用の混乱を避けるために、このページで紹介している(特にAffymetirxの)正規化法を適用した結果の出力データは2009/7/9までに全て対数変換後のデータとなるように変更しましたが、 以下の解析例で用いているsample2.txtは対数変換前のデータなので、以下の条件を満たす遺伝子が存在します。

    「ファイル」−「ディレクトリの変更」で解析したいファイル(sample2.txt)を置いてあるディレクトリに移動し、以下をコピペ
    1.発現強度が10以下のものを10に、100以上のものを100とし、 「発現強度max/min < 2.9」または「(max-min) < 42」の行(遺伝子)を解析から除く場合:
    in_f <- "sample2.txt"                                            #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 10                                                     #シグナル強度の下限を指定
    param2 <- 100                                                    #シグナル強度の上限を指定
    param3 <- 2.9                                                    #シグナル強度最大と最小の発現比を指定
    param4 <- 42                                                     #シグナル強度最大と最小の差を指定
    
    library(som)                                                     #パッケージの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.f <- filtering(data, lt=param1, ut=param2, mmr=param3, mmd=param4)#フィルタリングを実行し、結果をdata.fに格納
    data.f                                                           #結果を表示
    tmp <- cbind(rownames(data.f), data.f)                           #遺伝子IDの列を行列data.fの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    2. 「発現強度max/min < 2.9」の行(遺伝子)だけを解析から除く場合: 以下では、上限値と下限値をそれぞれ「読み込んだ遺伝子発現データの最大値と最小値」として param1とparam2に自動的に与えているので、結果として入力時に明示的に指定する必要はありません。 発現強度max-minの値は0を条件として与えています。
    in_f <- "sample2.txt"                                            #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param3 <- 2.9                                                    #シグナル強度最大と最小の発現比を指定
    
    #必要なパッケージをロード
    library(som)                                                     #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    param1 <- min(data)                                              #シグナル強度の下限を計算
    param2 <- max(data)                                              #シグナル強度の上限を計算
    param4 <- 0                                                      #シグナル強度最大と最小の差を0として指定
    data.f <- filtering(data, lt=param1, ut=param2, mmr=param3, mmd=param4)#フィルタリングを実行し、結果をdata.fに格納
    data.f                                                           #結果を表示
    tmp <- cbind(rownames(data.f), data.f)                           #遺伝子IDの列を行列data.fの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    CRANのsomのwebページ
    PDFマニュアル

    前処理 | 遺伝子のフィルタリング3 (NAを含むものを削除)

    サンプルマイクロアレイデータ12の(two-color) Agilentデータ(sample13_7vs7.txt)をエクセルで開くと多くの"NA" (Not Availableの略)という記述を目にしますが、 このような数値でない情報を含むデータは往々にしてうまくデータを読み込んでくれなかったり、解析できなかったりします...。ここでは全ての要素がNAとなっている行を除くなどのやり方を紹介します。
    尚、sample13_7vs7.txtのデータは最初の7列がA群、後の7列がB群の二群間比較用のデータです。

    「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し、以下をコピペ
    1-1. 全ての要素がNAとなっている行を除く場合(やり方1):
    in_f <- "sample13_7vs7.txt"                                      #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(genefilter)                                              #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    out <- apply(data, 1, allNA)                                     #全ての要素がNAならFALSE, それ以外ならTRUEを返すallNA関数を各行に対して適用し、結果をoutに格納
    data.f <- data[out,]                                             #行列dataの中から一つでも要素がNAでない(TRUEに対応)行のみ抽出し、結果をdata.fに格納
    tmp <- cbind(rownames(data.f), data.f)                           #遺伝子IDの列を行列data.fの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    1-2. 全ての要素がNAとなっている行を除く場合(やり方2):
    in_f <- "sample13_7vs7.txt"                                      #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    out <- t(apply(data, 1, is.na))                                  #各要素がNAであるかどうか(TRUE or FALSE)を返すis.na関数を各行に対して適用し、結果をoutに格納
    out2 <- apply(out, 1, sum)                                       #TRUEの数(NAの数)を返すsum関数を各行に対して適用し、結果をout2に格納
    data.f <- data[out2 < ncol(data),]                               #行列dataの中から全ての要素がNAである(out2の値がncol(data)未満に相当)行のみ抽出し、結果をdata.fに格納
    tmp <- cbind(rownames(data.f), data.f)                           #遺伝子IDの列を行列data.fの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    2. 一つでもNAがある行を除く場合:
    in_f <- "sample13_7vs7.txt"                                      #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    out <- t(apply(data, 1, is.na))                                  #各要素がNAであるかどうか(TRUE or FALSE)を返すis.na関数を各行に対して適用し、結果をoutに格納
    out2 <- apply(out, 1, sum)                                       #TRUEの数(NAの数)を返すsum関数を各行に対して適用し、結果をout2に格納
    data.f <- data[out2 == 0,]                                       #行列dataの中から全ての要素がNAでない(out2の値が0に相当)行のみ抽出し、結果をdata.fに格納
    tmp <- cbind(rownames(data.f), data.f)                           #遺伝子IDの列を行列data.fの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    3. 「A群はX(=2)個以上且つB群でY(=4)個以上」のNAでない(≒数値)要素を含む行のみ抽出したい場合:
    in_f <- "sample13_7vs7.txt"                                      #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 7                                                      #A群のサンプル数を指定
    param2 <- 7                                                      #B群のサンプル数を指定
    param3 <- 2                                                      #Xの数を指定
    param4 <- 4                                                      #Yの数を指定
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    #A群のデータについてNAでない要素数を各行についてカウント
    out <- t(apply(data[data.cl == 0], 1, is.na))                    #各要素がNAであるかどうか(TRUE or FALSE)を返すis.na関数を各行のA群のみに対して適用し、結果をoutに格納
    out2 <- apply(out, 1, sum)                                       #TRUEの数(NAの数)を返すsum関数を適用し、結果をout2に格納
    outA <- param1 - out2                                            #param1で指定した数からout2の値を引くことで得た「NAでないA群の要素数」をoutAに格納
    
    #B群のデータについてNAでない要素数を各行についてカウント
    out <- t(apply(data[data.cl == 1], 1, is.na))                    #各要素がNAであるかどうか(TRUE or FALSE)を返すis.na関数を各行のB群のみに対して適用し、結果をoutに格納
    out2 <- apply(out, 1, sum)                                       #TRUEの数(NAの数)を返すsum関数を適用し、結果をout2に格納
    outB <- param2 - out2                                            #param2で指定した数からout2の値を引くことで得た「NAでないB群の要素数」をoutBに格納
    
    data.f <- data[((outA >= param3) & (outB >= param4)),]           #行列dataの中から条件を満たす行のみ抽出し、結果をdata.fに格納
    tmp <- cbind(rownames(data.f), data.f)                           #遺伝子IDの列を行列data.fの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    4. 解析したいファイルがsample13_7vs7_nr.txtで「A群はX(=3)個以上且つB群でY(=3)個以上」のNAやNaNでない(≒数値)要素を含む行のみ抽出したい場合:
    in_f <- "sample13_7vs7_nr.txt"                                   #入力ファイル名を指定
    out_f <- "sample13_7vs7_nr2.txt"                                 #出力ファイル名を指定
    param1 <- 7                                                      #A群のサンプル数を指定
    param2 <- 7                                                      #B群のサンプル数を指定
    param3 <- 3                                                      #Xの数を指定
    param4 <- 3                                                      #Yの数を指定
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    #A群のデータについてNAでない要素数を各行についてカウント
    out <- t(apply(data[data.cl == 0], 1, is.na))                    #各要素がNAであるかどうか(TRUE or FALSE)を返すis.na関数を各行のA群のみに対して適用し、結果をoutに格納
    outNA <- apply(out, 1, sum)                                      #TRUEの数(NAの数)を返すsum関数を適用し、結果をoutNAに格納
    out <- t(apply(data[data.cl == 0], 1, is.nan))                   #各要素がNaNであるかどうか(TRUE or FALSE)を返すis.nan関数を各行のA群のみに対して適用し、結果をoutに格納
    outNaN <- apply(out, 1, sum)                                     #TRUEの数(NaNの数)を返すsum関数を適用し、結果をoutNaNに格納
    outA <- param1 - outNA - outNaN                                  #param1で指定した数からoutNAとoutNaNの値を引くことで得た「NA or NaNでないA群の要素数」をoutAに格納
    
    #B群のデータについてNAでない要素数を各行についてカウント
    out <- t(apply(data[data.cl == 1], 1, is.na))                    #各要素がNAであるかどうか(TRUE or FALSE)を返すis.na関数を各行のB群のみに対して適用し、結果をoutに格納
    outNA <- apply(out, 1, sum)                                      #TRUEの数(NAの数)を返すsum関数を適用し、結果をoutNAに格納
    out <- t(apply(data[data.cl == 1], 1, is.nan))                   #各要素がNaNであるかどうか(TRUE or FALSE)を返すis.nan関数を各行のB群のみに対して適用し、結果をoutに格納
    outNaN <- apply(out, 1, sum)                                     #TRUEの数(NaNの数)を返すsum関数を適用し、結果をoutNaNに格納
    outB <- param2 - outNA - outNaN                                  #param2で指定した数からoutNAとoutNaNの値を引くことで得た「NA or NaNでないB群の要素数」をoutBに格納
    
    data.f <- data[((outA >= param3) & (outB >= param4)),]           #行列dataの中から条件を満たす行のみ抽出し、結果をdata.fに格納
    tmp <- cbind(rownames(data.f), data.f)                           #遺伝子IDの列を行列data.fの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    

    前処理 | 遺伝子のフィルタリング4 (CVが小さいものを削除)

    変動係数(Coefficient of Variation; CV)がX未満の遺伝子(行)を削除してくれます。

    「ファイル」−「ディレクトリの変更」で解析したい対数変換後のファイル(data_GSE7623_rma.txt)を置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "data_GSE7623_rma.txt"                                   #入力ファイル名を指定
    param <- 0.2                                                     #CV値(X)を指定
    out_f <- "data_GSE7623_rma_cv.txt"                               #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(genefilter)                                              #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    out <- genefilter(data, cv(param, Inf))                          #CV値によるフィルタリングを実行し、結果をoutに格納
    data.f <- data[out,]                                             #行列dataの中から一つでも要素がNAでない(TRUEに対応)行のみ抽出し、結果をdata.fに格納
    tmp <- cbind(rownames(data.f), data.f)                           #遺伝子IDの列を行列data.fの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    

    前処理 | 同じ遺伝子名を持つものをまとめる

    例えば、「酸化的リン酸化」のパスウェイに関連する遺伝子セットが自分が見ている条件間で全体として動いているかどうかを調べたい場合に、解析 | 機能解析(GSEA周辺)についてで述べている方法を利用しますが、これを実行するための入力ファイルをここで作成する必要があります。 そのため、「酸化的リン酸化」のパスウェイに関連する遺伝子セット中の特定の遺伝子(遺伝子A)が自分が見ている条件間で発現変動していて、しかもチップ上に重複して多数(別のプローブIDとして)搭載されているような場合には、遺伝子Aだけの効果でそのパスウェイが「動いている」などという誤った結果を導きかねません。 このようなチップ上の重複遺伝子の効果を排除すべく、同じ遺伝子名をもつ複数のプローブIDの発現プロファイルに対しては、その代表値(平均値(mean)や中央値(median)など)を出力して、遺伝子名の重複のない(non-redundant)遺伝子発現行列をファイルとして得たいときに以下の作業を行います。
    ここでは、以下の4つの解析例を示します:
    1. アノテーション情報取得 | GEOからで得られたgene symbolとIDの対応表のファイルを利用(Affymetrix data)
    2. アノテーション情報取得 | GEOからで得られたgene symbolとIDの対応表のファイルを利用(Agilent data)
    3. アノテーション情報取得 | Rのパッケージから得られた対応表の情報を利用
    4. sample18_5vs5.txt(図3)を入力として、4列目で同じ遺伝子のものをまとめる(図4のようにする)場合(同じ遺伝子上の複数のエクソンのstrand情報が+と-両方ある場合にはエラーを吐くように設計)
    5. sample18_5vs5.txt(図3)を入力として、4列目で同じ遺伝子のものをまとめる(図4のようにする)場合(同じ遺伝子上の複数のエクソンのstrand情報が+と-両方ある場合には「2」を、そうでない場合には「1」としたベクトルを最初の一列目に追加で出力するように設計)

    1-3を実行する際、代表値(要約統計量)は、平均値(mean)や中央値(median)など好きなものを指定できます。
    この作業はGSEA解析でも当然やります。"Collapse dataset to gene symbols"に相当するところです。GSEAでは「最大値(このページ中での関数はmaxでGSEAの"max_probe (default)"に相当)」または「中央値(このページ中での関数はmedianでGSEAの"median_of_probes"に相当)」が選択可能です。(2010/09/01追加)
    例えば、2.の例だと、sample13_7vs7.txt中にはABCA10というGene symbolのものが二つ(ID: 7810 and 9681)存在しますが、 この2遺伝子の発現データは図1のようになっていますが、1.をコピペして得られるsample13_7vs7_nr.txt中では図2のようになります。 (NA --> NaNになっているところは本質的な部分ではありません...。) 図1. 図2. 図3. 図4. 1. Affymetrix Rat Genome 230 2.0 Arrayを用いて得られた参考文献1ののデータ(data_rma_2.txt)と アノテーション情報取得 | GEOからの6までを行って得たGPL1355-14795_symbol.txt の二つのファイルを用いて行う場合: (data_rma_2.txtの一列目のID情報とGPL1355-14795_symbol.txtの一列目のID情報の対応がとれる(同じ行の位置でなくてもよい)ことが前提です)
    in_f1 <- "data_rma_2.txt"                                        #入力ファイル1(発現データ)を指定
    in_f2 <- "GPL1355-14795_symbol.txt"                              #入力ファイル2(Gene symbolとIDの対応表のデータ)を指定
    param <- mean                                                    #代表値を指定
    out_f <- "data_rma_2_nr.txt"                                     #出力ファイル名を指定
    
    #IDとGene symbolとの対応関係を含む情報を入手
    sym <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイル2を読み込んでsymに格納。
    symbols <- as.vector(sym[,1])                                    #Gene symbol情報をベクトルに変換し、symbolsに格納
    names(symbols) <- rownames(sym)                                  #symbolsをIDで対応づけられるようにしている
    unique_sym <- unique(symbols)                                    #symbolsの中からnon-redundantな情報のみを抽出し、unique_symに格納
    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"のものを除く
    
    #メイン部分
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")    #入力ファイル1を読み込んでdataに格納
    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と同じprobesを全て抽出し、その平均値(mean)をhogeの一番下の行に追加
    }                                                                #non-redundant gene symbol数分だけループを回す
    rownames(hoge) <- unique_sym                                     #non-redundant gene symbolsをhogeの行の名前として利用
    tmp <- cbind(rownames(hoge), hoge)                               #遺伝子IDの列を行列hogeの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    2. Agilent Human 1A (V2)チップの発現データ(サンプルマイクロアレイデータの12で得たsample13_7vs7.txt)と アノテーション情報取得 | GEOからの6までを行って得たGPL887-5640_symbol.txt の二つのファイルを用いて行う場合: (sample13_7vs7.txtの一列目のID情報とGPL887-5640_symbol.txtの一列目のID情報の対応がとれる(同じ行の位置でなくてもよい)ことが前提です)
    in_f1 <- "sample13_7vs7.txt"                                     #入力ファイル1(発現データ)を指定
    in_f2 <- "GPL887-5640_symbol.txt"                                #入力ファイル2(Gene symbolとIDの対応表のデータ)を指定
    param <- mean                                                    #代表値を指定
    out_f <- "sample13_7vs7_nr.txt"                                  #出力ファイル名を指定
    
    #IDとGene symbolとの対応関係を含む情報を入手
    sym <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイル2を読み込んでsymに格納。
    symbols <- as.vector(sym[,1])                                    #Gene symbol情報をベクトルに変換し、symbolsに格納
    names(symbols) <- rownames(sym)                                  #symbolsをIDで対応づけられるようにしている
    unique_sym <- unique(symbols)                                    #symbolsの中からnon-redundantな情報のみを抽出し、unique_symに格納
    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"のものを除く
    
    #メイン部分
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")    #入力ファイル1を読み込んでdataに格納
    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と同じprobesを全て抽出し、その平均値(mean)をhogeの一番下の行に追加
    }                                                                #non-redundant gene symbol数分だけループを回す
    rownames(hoge) <- unique_sym                                     #non-redundant gene symbolsをhogeの行の名前として利用
    tmp <- cbind(rownames(hoge), hoge)                               #遺伝子IDの列を行列hogeの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    3. Affymetrix Rat Genome 230 2.0 Arrayを用いて得られた参考文献1のデータ (data_GSE7623_rma.txt)を入力として、アノテーション情報取得 | Rのパッケージからの1 を参考にして得られたprobe IDとGene symbolとの対応関係を含む情報を用いて行う場合:
    in_f <- "data_GSE7623_rma.txt"                                   #入力ファイル名を指定
    param <- mean                                                    #代表値を指定
    out_f <- "data_GSE7623_rma_nr.txt"                               #出力ファイル名を指定
    
    #probe IDとGene symbolとの対応関係を含む情報を入手
    source("http://bioconductor.org/biocLite.R")                     #おまじない
    biocLite("rat2302.db")                                           #アノテーション情報取得
    library(rat2302.db)                                              #ライブラリ読み込み
    library(help=rat2302.db)                                         #rat2302.db中にどんな情報が含まれているか見る
    sym_info <- rat2302SYMBOL                                        #何度も必要箇所を書き換えなくてもいいようにrat2302SYMBOLを以後sym_infoとして取り扱う
    symbols <- unlist(as.list(sym_info))                             #全31099 probesに対応するGeneSymbol(SYMBOL)情報を抽出し、symbolsに格納
    unique_sym <- unique(symbols)                                    #non-redundantなGeneSymbol(SYMBOL)情報を抽出し、unique_symに格納
    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"のものを除く
    
    #メイン部分
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    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と同じprobesを全て抽出し、その平均値(mean)をhogeの一番下の行に追加
    }                                                                #non-redundant gene symbol数分だけループを回す
    rownames(hoge) <- unique_sym                                     #non-redundant gene symbolsをhogeの行の名前として利用
    tmp <- cbind(rownames(hoge), hoge)                               #遺伝子IDの列を行列hogeの左端に挿入し、結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    4. sample18_5vs5.txt(図3)を入力として、4列目の情報をもとにでエクソンごとに分かれている同じ遺伝子のものをまとめる(図4のようにする)場合: (同じ遺伝子上の複数のエクソンのstrand情報が+と-両方ある場合にはエラーを吐くように設計)
    in_f <- "sample18_5vs5.txt"                                      #入力ファイルを指定
    out_f <- "sample18_5vs5_nr.txt"                                  #出力ファイル名を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, sep="\t", quote="")        #入力ファイルを読み込んでdataに格納
    
    #genenameに相当する4列目の情報を抽出して加工("-ex"よりも左側の文字列のみ抽出)
    hoge <- strsplit(as.character(data[,4]), "-ex", fixed=TRUE)      #data[,param]を文字列に変換し、"-ex"で区切った結果をリスト形式でhogeに格納
    genename <- unlist(lapply(hoge, "[[", 1))                        #hogeのリスト中の1番目の要素("-ex"で区切った左側部分に相当)のみ抽出してgenenameに格納
    unique_genename <- unique(genename)                              #non-redundantなgenename情報を抽出し、unique_genenameに格納
    
    #1,6列目の情報(chrとstrand)はそのまま、5, 7-16列の情報(lengthとカウントデータ)のみsumしたいので、それぞれをサブセットに分ける
    sub1 <- data[,c(1,6)]                                            #1,6列目の情報のみ抽出しsub1に格納
    sub2 <- data[,c(5,7:16)]                                         #5,7-16列目の情報のみ抽出しsub2に格納
    
    out <- NULL                                                      #最終的に欲しい情報を格納するためのプレースホルダ
    for(i in 1:length(unique_genename)){                             #unique_genenameの要素数分だけループを回す
        out_sub1 <- apply(sub1[which(genename == unique_genename[i]),], 2, unique, na.rm=TRUE)#sub1のところは、複数エクソンの場合は同じ情報がエクソン数分だけあることになるので、unique関数を実行した結果をout_sub1に格納
        out_sub2 <- apply(sub2[which(genename == unique_genename[i]),], 2, sum, na.rm=TRUE)#sub2のところでは、複数エクソンの場合にsum関数を実行した結果(和をとった結果)をout_sub2に格納
        out <- rbind(out, c(out_sub1, unique_genename[i], out_sub2)) #「out_sub1, unique_genename[i], out_sub2」の順番で行列outの下に結果をどんどん追加
    }
    write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    5. sample18_5vs5.txt(図3)を入力として、4列目の情報をもとにでエクソンごとに分かれている同じ遺伝子のものをまとめる(図4のようにする)場合: (同じ遺伝子上の複数のエクソンのstrand情報が+と-両方ある場合には「2」を、そうでない場合には「1」としたベクトルを最初の一列目に追加で出力するように設計)
    in_f <- "sample18_5vs5.txt"                                      #入力ファイルを指定
    out_f <- "sample18_5vs5_nr.txt"                                  #出力ファイル名を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, sep="\t", quote="")        #入力ファイルを読み込んでdataに格納
    
    #genenameに相当する4列目の情報を抽出して加工("-ex"よりも左側の文字列のみ抽出)
    hoge <- strsplit(as.character(data[,4]), "-ex", fixed=TRUE)      #data[,param]を文字列に変換し、"-ex"で区切った結果をリスト形式でhogeに格納
    genename <- unlist(lapply(hoge, "[[", 1))                        #hogeのリスト中の1番目の要素("-ex"で区切った左側部分に相当)のみ抽出してgenenameに格納
    unique_genename <- unique(genename)                              #non-redundantなgenename情報を抽出し、unique_genenameに格納
    
    #1,6列目の情報(chrとstrand)はそのまま、5, 7-16列の情報(lengthとカウントデータ)のみsumしたいので、それぞれをサブセットに分ける
    sub1 <- data[,c(1,6)]                                            #1,6列目の情報のみ抽出しsub1に格納
    sub2 <- data[,c(5,7:16)]                                         #5,7-16列目の情報のみ抽出しsub2に格納
    
    out <- NULL                                                      #最終的に欲しい情報を格納するためのプレースホルダ
    for(i in 1:length(unique_genename)){                             #unique_genenameの要素数分だけループを回す
        tmp <- unlist(apply(sub1[which(genename == unique_genename[i]),], 2, unique, na.rm=TRUE))#sub1のところは、複数エクソンの場合は同じ情報がエクソン数分だけあることになるはずであるが、そうでない可能性があるときに見つけられるようにしている
        out_flag <- length(tmp)                                      #ベクトルtmpの要素数をout_flagに格納(通常はtmpの要素数が2だが、3以上のものを検出するのが目的)
        out_sub1 <- tmp[1:2]                                         #どんな状況になっていようと、とにかくベクトルtmpの最初の二つの要素を出力すべくout_sub1に格納
        out_sub2 <- apply(sub2[which(genename == unique_genename[i]),], 2, sum, na.rm=TRUE)#sub2のところでは、複数エクソンの場合にsum関数を実行した結果(和をとった結果)をout_sub2に格納
        out <- rbind(out, c(out_flag, out_sub1, unique_genename[i], out_sub2)) #「out_sub1, unique_genename[i], out_sub2」の順番で行列outの下に結果をどんどん追加
    }
    write.table(out, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    GSEAの「Run GSEA Page」のところ

    参考文献1(Nakai et al., BBB, 2008)

    解析 | 似た発現パターンを持つ遺伝子の同定

    いわゆるパターンマッチング法(or テンプレートマッチング法; pattern matching; template matching)を適用して、"理想的なパターン" or "指定した遺伝子の発現パターン"に似た発現パターンを持つ遺伝子を検出(ランキング)します。 ここでは、
    1. 指定した組織で理想的な特異的発現パターンを示す上位X個を得たい場合
    2. 上位X個ではなく似ている順に全遺伝子をソートした結果を得たい場合
    3. 指定した遺伝子の発現パターンに似た発現パターンを示す上位X個を得たい場合
    の三つのやり方について紹介します。
    類似度を計算する際に、
    a) 発現データ(遺伝子発現ベクトル)をあらかじめスケーリングするかしない(none)か?するとしたらどのようなスケーリング(range (各遺伝子のシグナル強度の範囲を0-1にする) or zscore (各遺伝子のシグナル強度の平均を0標準偏差を1にする))を行うか?
    b) 距離をどのような方法(euclidean, maximum, manhattan, canberra, correlation, binary)で定義するか?
    も指定する必要があります。 私は距離を普段から「1 - 相関係数」で定義しているので、それに相当するcorrelationを頻用します。また、スケーリングはやりません(none)。

    「ファイル」−「ディレクトリの変更」で解析したいファイル(GDS1096_rma.txt)を置いてあるディレクトリに移動し、以下をコピペ
    1. 指定した組織で選択的(特異的)に発現する遺伝子群の上位10個(X=10)を得たい場合: ここでは、予め作成した「心臓特異的発現パターン」を示す遺伝子群を抽出するための"理想的なパターン(テンプレート)" を含むファイルGDS1096_cl_heart.txtを読み込んで、 発現パターンが似ている上位X個を二つのファイルdata_topranked.txt(発現データ含む)と data_topranked_ID.txt(発現データ含まず遺伝子IDのみ)に保存するやり方を示します。 (発現ベクトルのスケーリングはせず(none)、 類似度は「1 - 相関係数」(correlation)で定義)
    in_f1 <- "GDS1096_rma.txt"                                       #入力ファイル名1(発現データ)を指定
    in_f2 <- "GDS1096_cl_heart.txt"                                  #入力ファイル名2(テンプレート情報)を指定
    out_f1 <- "data_torranded.txt"                                   #出力ファイル名(発現データ含むほう)を指定
    out_f2 <- "data_topranked_ID.txt"                                #出力ファイル名(遺伝子IDのみのほう)を指定
    param1 <- 10                                                     #上位X個のXを指定
    param2 <- "none"                                                 #類似度計算前の発現データのスケーリング法を指定
    param3 <- "correlation"                                          #距離を定義する方法を指定
    
    #必要なパッケージをロード
    library(genefilter)                                              #パッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイル1を読み込んでdataに格納
    data <- as.matrix(data)                                          #as.matrixの意味は、「データの型を"行列として(as matrix)"dataに格納せよ」です。(read.tableで読み込んで得られたdataの型は"データフレーム"のため)
    data_cl <- read.table(in_f2, sep="\t", quote="")                 #入力ファイル2を読み込んでdata_clに格納
    
    template <- data_cl[,2]                                          #バイナリ(0 or 1)情報(2列目)のみ抽出し、templateに格納
    template                                                         #バイナリ(0 or 1)情報の確認
    tmp <- rbind(data, template)                                     #templateというテンプレートパターンを行列dataの最後の行に追加
    template_posi <- which(rownames(tmp) == "template")              #行のラベル情報が"template"に相当する行番号をtemplate_posiに格納
    closeg <- genefinder(tmp, template_posi, param1, scale=param2, method=param3)#上位"param1"個の情報をclosegに格納
    closeg[[1]]$indices                                              #上位"param1"個の行番号を表示
    closeg[[1]]$dists                                                #上位"param1"個の類似度を表示
    topranked <- tmp[closeg[[1]]$indices,]                           #上位"param1"個の遺伝子発現データを抽出し、toprankedに格納
    tmp2 <- cbind(rownames(topranked), topranked)                    #遺伝子IDの列を行列toprankedの左端に挿入し、結果をtmp2に格納
    write.table(tmp2, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f1で指定したファイル名で保存。
    write.table(rownames(topranked), out_f2, sep="\t", append=F, quote=F, row.names=F, col.names=F)#遺伝子IDに関する情報のみ、out_f2で指定したファイル名で保存。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    2. 似ている順に全遺伝子をソートした結果を得たい場合: ここでは、予め作成した「心臓特異的発現パターン」を示す遺伝子群を抽出するための "理想的なパターン(テンプレート)"を含むファイルGDS1096_cl_heart.txtを読み込んで、 「心臓特異的発現パターン」に似ている順に全遺伝子をソートした二つのファイル data_topranked.txt(発現データ含む)とdata_topranked_ID.txt(発現データ含まず遺伝子IDのみ) に保存するやり方を示します。 (発現ベクトルをZスケーリング(zscore)し、類似度は「1 - 相関係数」(correlation)で定義)
    in_f1 <- "GDS1096_rma.txt"                                       #入力ファイル名1(発現データ)を指定
    in_f2 <- "GDS1096_cl_heart.txt"                                  #入力ファイル名2(テンプレート情報)を指定
    out_f1 <- "data_torranded.txt"                                   #出力ファイル名(発現データ含むほう)を指定
    out_f2 <- "data_topranked_ID.txt"                                #出力ファイル名(遺伝子IDのみのほう)を指定
    param2 <- "zscore"                                               #類似度計算前の発現データのスケーリング法を指定
    param3 <- "correlation"                                          #距離を定義する方法を指定
    
    #必要なパッケージをロード
    library(genefilter)                                              #パッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイル1を読み込んでdataに格納
    data <- as.matrix(data)                                          #as.matrixの意味は、「データの型を"行列として(as matrix)"dataに格納せよ」です。(read.tableで読み込んで得られたdataの型は"データフレーム"のため)
    data_cl <- read.table(in_f2, sep="\t", quote="")                 #入力ファイル2を読み込んでdata_clに格納
    
    template <- data_cl[,2]                                          #バイナリ(0 or 1)情報(2列目)のみ抽出し、templateに格納
    template                                                         #バイナリ(0 or 1)情報の確認
    tmp <- rbind(data, template)                                     #templateというテンプレートパターンを行列dataの最後の行に追加
    template_posi <- which(rownames(tmp) == "template")              #行のラベル情報が"template"に相当する行番号をtemplate_posiに格納
    param1 <- nrow(data)                                             #遺伝子数をparam1に格納
    closeg <- genefinder(tmp, template_posi, param1, scale=param2, method=param3)#特異的発現の度合いでランキングされた結果をclosegに格納
    topranked <- tmp[closeg[[1]]$indices,]                           #特異的発現の度合いでランキングされた遺伝子発現データをtoprankedに格納
    tmp2 <- cbind(rownames(topranked), topranked)                    #遺伝子IDの列を行列toprankedの左端に挿入し、結果をtmp2に格納
    write.table(tmp2, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f1で指定したファイル名で保存。
    write.table(rownames(topranked), out_f2, sep="\t", append=F, quote=F, row.names=F, col.names=F)#遺伝子IDに関する情報のみ、out_f2で指定したファイル名で保存。
    
    
    
    3. 遺伝子ID: 207003_atの遺伝子発現プロファイルと発現パターンが似ている上位5個をリストアップしたい場合: (発現ベクトルをRangeスケーリング(range)し、類似度はマンハッタン距離(manhattan)で定義)
    in_f <- "GDS1096_rma.txt"                                        #入力ファイル名1(発現データ)を指定
    out_f1 <- "data_torranded.txt"                                   #出力ファイル名(発現データ含むほう)を指定
    out_f2 <- "data_topranked_ID.txt"                                #出力ファイル名(遺伝子IDのみのほう)を指定
    param1 <- 5                                                      #上位X個のXを指定
    param2 <- "range"                                                #類似度計算前の発現データのスケーリング法を指定
    param3 <- "manhattan"                                            #距離を定義する方法を指定
    param4 <- "207003_at"                                            #遺伝子IDを指定
    
    #必要なパッケージをロード
    library(genefilter)                                              #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    data <- as.matrix(data)                                          #as.matrixの意味は、「データの型を"行列として(as matrix)"dataに格納せよ」です。(read.tableで読み込んで得られたdataの型は"データフレーム"のため)
    template_posi <- which(rownames(data) == param4)                 #param4で指定した遺伝子IDに相当する行番号をtemplate_posiに格納
    closeg <- genefinder(data, template_posi, param1, scale=param2, method=param3)#上位"param1"個の情報をclosegに格納
    topranked <- data[closeg[[1]]$indices,]                          #上位"param1"個の遺伝子発現データを抽出し、toprankedに格納
    tmp2 <- cbind(rownames(topranked), topranked)                    #遺伝子IDの列を行列toprankedの左端に挿入し、結果をtmp2に格納
    write.table(tmp2, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f1で指定したファイル名で保存。
    write.table(rownames(topranked), out_f2, sep="\t", append=F, quote=F, row.names=F, col.names=F)#遺伝子IDに関する情報のみ、out_f2で指定したファイル名で保存。
    
    
    
    4. (ヘッダー行を除く)15987行目(ID_REF: "216617_s_at"の行に相当)の遺伝子発現プロファイルと 発現パターンが似ている上位10個をリストアップしたい場合: (発現ベクトルをZスケーリング(zscore)し、類似度は「1 - 相関係数」(correlation)で定義)
    in_f <- "GDS1096_rma.txt"                                        #入力ファイル名1(発現データ)を指定
    out_f1 <- "data_torranded.txt"                                   #出力ファイル名(発現データ含むほう)を指定
    out_f2 <- "data_topranked_ID.txt"                                #出力ファイル名(遺伝子IDのみのほう)を指定
    param1 <- 10                                                     #上位X個のXを指定
    param2 <- "zscore"                                               #類似度計算前の発現データのスケーリング法を指定
    param3 <- "correlation"                                          #距離を定義する方法を指定
    param4 <- 15987                                                  #目的遺伝子の行番号を指定
    
    #必要なパッケージをロード
    library(genefilter)                                              #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    data <- as.matrix(data)                                          #as.matrixの意味は、「データの型を"行列として(as matrix)"dataに格納せよ」です。(read.tableで読み込んで得られたdataの型は"データフレーム"のため)
    closeg <- genefinder(data, param4, param1, scale=param2, method=param3)#上位"param1"個の情報をclosegに格納
    topranked <- data[closeg[[1]]$indices,]                          #上位"param1"個の遺伝子発現データを抽出し、toprankedに格納
    tmp2 <- cbind(rownames(topranked), topranked)                    #遺伝子IDの列を行列toprankedの左端に挿入し、結果をtmp2に格納
    write.table(tmp2, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f1で指定したファイル名で保存。
    write.table(rownames(topranked), out_f2, sep="\t", append=F, quote=F, row.names=F, col.names=F)#遺伝子IDに関する情報のみ、out_f2で指定したファイル名で保存。
    
    
    
    Bioconductorのgenefilterのwebページ

    解析 | 似た発現パターンを持つサンプルをデータベースから検索

    Blast検索のように、手持ちの(あるいはデータベース中の興味ある)サンプルの発現プロファイルを"query"として、(Gene Expression Omnibus (GEO)などの)マイクロアレイデータベースから似たサンプルを順にソートした結果を得たい場合に利用します。
    (Rではありませんので...)CellMontageのwebページに行って、ご利用ください。
    アグリバイオインフォマティクス教育研究プログラムの講義の中では応用例をいくつか紹介しましたが、例えば未知サンプルの分類や診断をより高精度に行えるのではと思っています。これは、従来は手持ちのデータセットをクロスバリデーションなどでごちゃごちゃいじって分類精度 がどの程度あるのかなどを研究していましたが、CellMontageを利用すると、GEOデータベース中のデータを全て利用可能なので、圧倒的多数のサンプルの類似度をもとに評価できるという利点があります。 というわけで、個人的には、(Rで)マイクロアレイデータ解析のページ中の「解析 | 分類」で紹介しているやり方よりもCellMontageを使いこなすほうがよいのではと思っています。
    こっち方面の研究の方向性としては、Blast-likeな出力結果をもとにして、結果のスコアをどのように重みづけしながら多数決(weighted voting)をとれば分類性能を上げられるのか、をチューニングすることでしょうか。

    CellMontageのwebページ
    CellMontageの日本語での紹介ページ
    「ゲノム解析ツール リンク集」の"類似発現プロファイルを検索する"のwebページ

    解析 | 発現変動遺伝子 | 二群間 | 発現変動遺伝子(でないもの)がどの程度あるのかざっくり知りたい (Ploner_2006)

    発現変動遺伝子(Differentially Expressed Genes; DEGs)のランキング(検出)を行う際にFDRを計算することで上位の遺伝子ですらFDRが1に近いものだと、 「ああこのデータセット中には発現変動遺伝子はないのね...。」という判断がつきます。
    が、そんな回りくどいことをせずとも、以下を実行することで「発現変動遺伝子でないもの(non-DEGs)の割合」が一意に返されます。よって、「1 - その割合」がDEGsの割合ということになるのでざっくりと知ることができるわけです。
    以下では(遺伝子名の列を除く)最初の3列(X=3)がA群、残りの3列(Y=3)がB群からなる(すでに対数変換されている)遺伝子発現データファイル(sample14.txt)の二群間比較用データのnon-DEGsの割合を計算する一連の手順を示します。
    最後に出力される二つの数値が目的のものです。この場合、約65%がnon-DEGsであることがわかります。

    「ファイル」−「ディレクトリの変更」で解析したいサンプルマイクロアレイデータ13中のsample14.txtファイルを置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "sample14.txt"                                           #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 3                                                      #A群のサンプル数を指定
    param2 <- 3                                                      #B群のサンプル数を指定
    
    #必要なパッケージをロード
    library(OCplus)                                                  #パッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    out1 <- fdr1d(data, data.cl, verb=FALSE)                         #入力データ中の発現変動していない遺伝子(non-DEGs)の割合を調べた結果をout1に格納
    out2 <- EOC(data, data.cl)                                       #入力データ中の発現変動していない遺伝子(non-DEGs)の割合を調べた結果をout2に格納
    p0(out1)                                                         #得られたout1の中から目的のnon-DEGsの割合の数値を表示
    p0(out2)                                                         #得られたout2の中から目的のnon-DEGsの割合の数値を表示
    
    
    

    BioconductorのOCplusのwebページ

    参考文献1(Ploner et al., Bioinformatics, 2006)

    解析 | 発現変動遺伝子 | 二群間 | 対応なし |について

    手持ちのアレイデータが以下のような場合にこのカテゴリーに属す方法を適用します:
    ------------------- Aさんの正常サンプル Bさんの正常サンプル Cさんの正常サンプル Dさんの腫瘍サンプル Eさんの腫瘍サンプル Fさんの腫瘍サンプル Gさんの腫瘍サンプル ------------------- 「マーカー遺伝子の検出」が第一目的の場合と「分類精度が高い遺伝子セットを得たい」のが第一目的の場合で用いる方法が違ってきます。もちろん、両者は完全には排他的ではなくかなり密接に関連してはいますが、それぞれの目的に応じた手法が提案されているので使い分けるほうがよろしいかと思います。

    「マーカー遺伝子の検出」が第一目的の場合(filter method;発現強度とサンプルクラス間の統計的な相関に基づいて遺伝子を抽出するやり方):
    最近はFold change系とt-statistic系の組み合わせが主流?!になってきていますが、サンプル数(全部で10サンプル程度?!)が比較的少ないときは前者がよくて、比較的多いサンプル数(30サンプルとか?!)の場合には後者がいいと2007年ごろまで思っていました。 また、どのpreprocessing algorithmsを用いてexpression summary scoreを求めたデータに対して適用するかによっても違ってきます。私の2008年の論文(WAD: Kadota et al., 2008)での結論(おすすめ)は以下の通りです:
    ・「MASアルゴリズム」のときは「WAD
    ・「RMAアルゴリズム」のときは「昔ながらのFold Change」
    ・「DFWアルゴリズム」のときはRank products
    このうちのどれがいいかは分かりませんが、WADはRMAやDFWアルゴリズムでもFold ChangeやRank productsと同程度の成績を保持している一方、Fold ChangeとRank ProductsはMASアルゴリズムのとの相性が非常に悪いので、全体的にはWADが優れているのではという印象です。ちなみにt-statistics系の方法はWAD(Kadota et al., 2008)論文が出る前まではMASアルゴリズムとの相性のよさで存在意義がありましたが...。
    WAD論文中にも書いていますが、「なぜ雨後のたけのこのように手法論文が沢山publishされるのか?!」と思っていましたが、これは手法のデータセット依存性がかなりあるからだと思います。つまり、手法論文中では「シミュレーションデータでうまくいって、"a (せいぜい few) real experimental datasets"でうまくいきました」ということで論文として成立するのですが、"(many) other real datasets"でうまくいく保証がないのです(ここがみそ!)。
    WAD論文では、アレイのデバイスが同じ計36個のreal experimental datasetsに対して、既知の発現変動遺伝子をどれだけ上位にランキングできるかという評価基準(具体的にはAUC)で、全体的にいいのはどれか?を比較した結果の結論が上記の組み合わせ、ということです(2008/6/26追加)。

    その後様々な他のpreprocessing algorithmsとの相性を調べてみました。我々の論文(Kadota et al., 2009)中で提案した推奨ガイドラインは、以下の通りです。(2009/4/24追加)
    -------------------------------------------------------------------
    感度・特異度の高いpreprocessing algorithmsとgene ranking methodsの組合せ:
    ・「MASアルゴリズム」のときは「WAD
    ・「multi-mgMOSアルゴリズム」のときは「WAD
    ・「RMAアルゴリズム」のときは「Rank products
    ・「VSNアルゴリズム」のときは「Rank products
    ・「GCRMAアルゴリズム」のときは「Rank products
    ・「MBEIアルゴリズム」のときは「Rank products
    ・「PLIERアルゴリズム」のときは「Rank products
    ・「FARMSアルゴリズム」のときは「Rank products
    ・「DFWアルゴリズム」のときは「Rank products
    再現性の高いpreprocessing algorithmsとgene ranking methodsの組合せ:
    上記nine algorithmsのいずれの場合でも「WAD
    -------------------------------------------------------------------
    上記ガイドラインはAffymetrix GeneChipデータのみを対象としたものであり、Agilentなど他のメーカーで測定されたデータに対する評価結果はKadota and Shimizu, 2011で報告しています。 評価用データセットはMAQCのもので、Affymetrix, Agilent, Applied Biosystems, Illumina, GE Healthcareの5つのプラットフォームのデータで行っています。 結論としては、どのプラットフォームでも「再現性が高いのはWAD、感度・特異度が高いのはWAD or Rank products」というものであり、上記ガイドラインはプラットフォーム非依存であるという傍証を報告しています。

    「分類精度が高い遺伝子セットを得たい」が第一目的の場合(wrapper method;分類能力の高い遺伝子を抽出するやり方):
    (こちらは私の専門ではないのでまだ知識不足ですのであしからず...)現在このページで紹介しているのはRF(random forest)に基づく方法 (Diaz-Uriarte_2007) だけですが、他にもRで提供されているもの以外でBaker and Kramerの方法などがあります。後者の論文のタイトルを見ればよく分かりますが、ずばり「分類精度が最も高い遺伝子セット」に的を絞って抽出してくれます。

    解析 | 発現変動遺伝子 | 二群間 | 対応なし | WAD (Kadota_2008)

    Weighted Average Difference (WAD)法を用いて発現変動の度合いでランキング。
    「既知発現変動遺伝子のほとんどは平均シグナル強度が高い」という事実に着目して、「一般的なlog ratioの値に対して(log scaleでの)、平均シグナル強度が高い遺伝子ほど1に近い重みをかけることで、上位にランキングされるようにしたもの」がWAD統計量です。
    注意点としては、入力データはlog2-scaleのものを前提としているので、例えばRMAやDFWの出力結果ファイルはそのままWADの入力として用いていいですが、対数変換されていないデータファイルの場合は前処理 | スケーリング | シグナル強度を対数(log)変換するを参考にしてlog2変換したものに対してWADを適用してください。
    以下Aug 2 2011追加。
    WADに対してよく寄せられる質問として、「FDR計算できないんですけど...やWAD統計量ランキングしたときにどこまでを有意だと判断すればいいんでしょうか?」があります。
    私が調べた限りでは、確かにFDRを計算できませんし、WAD統計量の閾値をどこに設定すればいいかはわかりません。これは事実です。
    この原因としては、WAD統計量によるランキング結果の再現性が非常に高い、という特徴に起因しています。 つまり、例えば二群間(A群vs.B群)比較で、AやBのラベル情報をランダムに入れ替えてFDRを計算しようとしても、ランキング結果の再現性が高いが故に「random permutationで得られた結果は、元のランキング結果とほとんど同じランキング結果になってしまう」からです。
    従って、何らかの客観的な閾値が欲しい、という人はSAMなり他の方法で「だいたいFDR < 0.05を満たす遺伝子数はこのくらい」という情報を別に持っておけばいいと思います。
    実際問題としては、例えば(t統計量系の方法である)SAMで決めた任意の閾値を満たす遺伝子数やランキング結果と、 それ以外の(Fold change系の方法である)Rank productsで決めた同じ閾値を満たす遺伝子数やランキング結果は結構違います。 ランキング結果の上位x個という風に数を揃えても20%程度の一致しかないのが普通です。
    では何を信じればいいのでしょうか?私は発現変動の度合いでランキングをした結果の上位に”本物”がより濃縮されている方法がいいと思います。
    しかもそれが様々なプラットフォームや様々な評価基準でも有用性が示されているとしたら、、、WADでいいんじゃないかと思います。
    1. 入力ファイルが既にlog2-transformed dataの場合(通常): 以下では(遺伝子名の列を除く)最初の50列(X=50)が正常サンプル(A群)、残りの52列(Y=52)が腫瘍サンプル(B群)からなる (すでに対数変換されている)遺伝子発現データファイル(data_Singh_RMA_3274.txt)の二群間比較を例とします。 「ファイル」−「ディレクトリの変更」で解析したいサンプルマイクロアレイデータ9中のdata_Singh_RMA_3274.txtファイルを置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param_A <- 50                                                    #A群のサンプル数を指定
    param_B <- 52                                                    #B群のサンプル数を指定
    
    #WAD統計量を計算するための関数を定義
    WAD <- function(data=NULL, data.cl=NULL){                        #WAD統計量を計算するための関数
        x <- data                                                    #WAD統計量を計算するための関数
        cl <- data.cl                                                #WAD統計量を計算するための関数
        mean1 <- rowMeans(as.matrix(x[, cl==0]))                     #WAD統計量を計算するための関数
        mean2 <- rowMeans(as.matrix(x[, cl==1]))                     #WAD統計量を計算するための関数
        x_ave <- (mean1 + mean2)/2                                   #WAD統計量を計算するための関数
        weight <- (x_ave - min(x_ave))/(max(x_ave) - min(x_ave))     #WAD統計量を計算するための関数
        statistic <- (mean2 - mean1)*weight                          #WAD統計量を計算するための関数
        return(statistic)                                            #WAD統計量を計算するための関数
    }                                                                #WAD統計量を計算するための関数
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param_A), rep(1, param_B))                   #A群を0、B群を1としたベクトルdata.clを作成
    
    #WAD統計量の計算とファイル出力
    stat_wad <- WAD(data=data, data.cl=data.cl)                      #WADを実行し、WAD統計量を計算した結果をstat_wadに格納
    rank_wad <- rank(-abs(stat_wad))                                 #WAD統計量の順位を計算した結果をrank_wadに格納
    tmp <- cbind(rownames(data), data, stat_wad, rank_wad)           #入力データの右側に、「WAD統計量」と「その順位」を結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    2. 入力ファイルがlogged dataでない場合: 以下では(遺伝子名の列を除く)最初の6列(X=6)がA群、残りの5列(Y=5)がB群からなる(まだ対数変換されていない) 遺伝子発現データファイル(sample2.txt)の二群間比較を例とします。 「ファイル」−「ディレクトリの変更」で解析したいファイル(sample2.txt)を置いてあるディレクトリに移動し、以下をコピペ。
    in_f <- "sample2.txt"                                            #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param_A <- 6                                                     #A群のサンプル数を指定
    param_B <- 5                                                     #B群のサンプル数を指定
    
    #WAD統計量を計算するための関数を定義
    WAD <- function(data=NULL, data.cl=NULL){                        #WAD統計量を計算するための関数
        x <- data                                                    #WAD統計量を計算するための関数
        cl <- data.cl                                                #WAD統計量を計算するための関数
        mean1 <- rowMeans(as.matrix(x[, cl==0]))                     #WAD統計量を計算するための関数
        mean2 <- rowMeans(as.matrix(x[, cl==1]))                     #WAD統計量を計算するための関数
        x_ave <- (mean1 + mean2)/2                                   #WAD統計量を計算するための関数
        weight <- (x_ave - min(x_ave))/(max(x_ave) - min(x_ave))     #WAD統計量を計算するための関数
        statistic <- (mean2 - mean1)*weight                          #WAD統計量を計算するための関数
        return(statistic)                                            #WAD統計量を計算するための関数
    }                                                                #WAD統計量を計算するための関数
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param_A), rep(1, param_B))                   #A群を0、B群を1としたベクトルdata.clを作成
    
    #発現データのシグナル強度が1未満のものを1にした後にlog2変換
    data[data < 1] <- 1                                              #1未満のシグナル強度のものを1とする
    data <- log(data, 2)                                             #log2スケーリング
    
    #WAD統計量の計算とファイル出力
    stat_wad <- WAD(data=data, data.cl=data.cl)                      #WADを実行し、WAD統計量を計算した結果をstat_wadに格納
    rank_wad <- rank(-abs(stat_wad))                                 #WAD統計量の順位を計算した結果をrank_wadに格納
    tmp <- cbind(rownames(data), data, stat_wad, rank_wad)           #入力データの右側に、「WAD統計量」と「その順位」を結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    参考文献(Kadota et al., Algorithms Mol. Biol., 2008)

    解析 | 発現変動遺伝子 | 二群間 | 対応なし | RF(random forest)に基づく方法 (Diaz-Uriarte_2007)

    決定木の一種。日本語では「ランダム森 or ランダムフォレスト」というらしく、分類性能が非常に高いそうです。
    以下では(遺伝子名の列を除く)最初の50列(X=50)が正常サンプル(A群)、残りの52列(Y=52)が腫瘍サンプル(B群)からなる(すでに対数変換されている)遺伝子発現データファイル(data_Singh_RMA_3274.txt)の二群間比較を例とします。

    「ファイル」−「ディレクトリの変更」で解析したいサンプルマイクロアレイデータ7中のdata_Singh_RMA_3274.txtファイルを置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    param1 <- 50                                                     #A群のサンプル数を指定
    param2 <- 52                                                     #B群のサンプル数を指定
    
    #必要なパッケージをロード
    library(varSelRF)                                                #varSelRFパッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- factor(c(rep(1, param1), rep(2, param2)))             #A群を1、B群を2としたベクトルdata.clを作成
    
    rf.vs1 <- varSelRF(t(data), data.cl)                             #RFをデフォルトのパラメータを用いて実行
    rf.vs1$selected.vars                                             #最終的に選ばれた遺伝子を表示
    
    
    
    CRAN中のvarSelRFパッケージのサイト
    PDFマニュアル
    参考文献1(R package; Diaz-Uriarte R., BMC Bioinformatics, 2007)
    参考文献2(原著論文; Diaz-Uriarte and Andres., BMC Bioinformatics, 2006)

    解析 | 発現変動遺伝子 | 二群間 | 対応なし | shrinkage t statistic (Opgen-Rhein and Strimmer_2007)

    参考文献1の方法(Distribution-Free Shrinkage Approach)を用いて二群間で発現の異なる遺伝子をランキング。このライブラリ中では、他に参考文献2の方法(t statistic using the 90% rule of Efron et al., 2001)、 経験ベイズ(empirical Bayes; Smyth_2004)SAM(Tusher_2001)の計算もやってくれるので、ここでは全部の結果を出力します。
    以下では(遺伝子名の列を除く)最初の50列(X=50)が正常サンプル(A群)、残りの52列(Y=52)が腫瘍サンプル(B群)からなる(すでに対数変換されている)遺伝子発現データファイル(data_Singh_RMA_3274.txt)の二群間比較を例とします。

    「ファイル」−「ディレクトリの変更」で解析したいサンプルマイクロアレイデータ7中のdata_Singh_RMA_3274.txtファイルを置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 50                                                     #A群のサンプル数を指定
    param2 <- 52                                                     #B群のサンプル数を指定
    
    #必要なパッケージをロード
    library(st)                                                      #shrinkage t statisticを計算するためのパッケージの読み込み
    library(samr)                                                    #SAMを計算するためのパッケージの読み込み
    library(limma)                                                   #empirical Bayesを計算するためのパッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(1, param1), rep(2, param2))                     #A群を1、B群を2としたベクトルdata.clを作成
    
    stat_st <- shrinkt.stat(t(data), data.cl)                        #Shrinkage t統計量を計算し結果をstat_stに格納
    rank_st <- rank(-abs(stat_st))                                   #Shrinkage t統計量の順位を計算し結果をrankt_stに格納
    stat_efron <- efront.stat(t(data), data.cl)                      #Efron's t統計量を計算し結果をstat_efronに格納
    rank_efron <- rank(-abs(stat_efron))                             #Efron's t統計量の順位を計算し結果をrank_efronに格納
    stat_ebayes <- modt.stat(t(data), data.cl)                       #Empirical Bayes t統計量を計算し結果をstat_ebayesに格納
    rank_ebayes <- rank(-abs(stat_ebayes))                           #Empirical Bayes t統計量の順位を計算し結果をrank_ebayesに格納
    stat_sam <- sam.stat(t(data), data.cl)                           #SAM's t統計量を計算し結果をstat_samに格納
    rank_sam <- rank(-abs(stat_sam))                                 #SAM's t統計量の順位を計算し結果をrank_samに格納
    tmp <- cbind(rownames(data), data, stat_st, rank_st, stat_efron, rank_efron, stat_ebayes, rank_ebayes, stat_sam, rank_sam)#「それぞれの計算方法で得られた統計量」と「その順位」をShrinkage, Efron, empirical Bayes, SAMの順に右のカラムに結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    CRANのstのwebページ
    CRANのstのPDFマニュアル
    CRANのsamrのwebページ
    CRANのsamrのPDFマニュアル

    Bioconductorのlimmaのwebページ

    参考文献1(Opgen-Rhein and Strimmer, Stat. Appl. Genet. Mol. Biol., 2007)
    参考文献2(Efron et al., J. Amer. Statist. Assoc., 2001)

    解析 | 発現変動遺伝子 | 二群間 | 対応なし | layer ranking algorithm (Chen_2007)

    参考文献1の方法を用いて二群間で発現の異なる遺伝子をランキング。この論文中では三つのlayer ranking algorithms (point-admissible, line-admissible, and Pareto)を提案しています。 MicroArray Quality Control (MAQC)プロジェクトではより再現性の高い発現変動遺伝子セットを抽出するために「倍率変化(Fold change)によるランキング;Fold-change ranking」と「緩めのp-valueカットオフ;non-stringent p-value cutoff」の両方を用いることをお勧めしています(参考文献2)。 これは最近よく使われる候補遺伝子抽出のための手続きであり、前者(log ratio)を横軸、後者(-log(p-value, base=10)など)を縦軸として得られる図を"volcano plot"といいます。しかしこれでは候補遺伝子セットが得られるだけで、その2つのランキングから得られる総合ランキングをどうやって得るかが問題です。参考文献1でChenらは「複数の候補遺伝子ランキング法→総合ランキング」を得るための三つの方法を提案しています。 一つめはpoint-admissible layer ranking (method="rlfq"で指定), 二つめはline-admissible layer ranking (method="convex"で指定), そして三つめはPareto layer ranking (method="pareto"で指定)です。ここでは、一つの解析例を挙げておきます。
    以下では(遺伝子名の列を除く)最初の50列(X=50)が正常サンプル(A群)、残りの52列(Y=52)が腫瘍サンプル(B群)からなる(すでに対数変換されている)遺伝子発現データファイル(data_Singh_RMA_3274.txt)の二群間比較用データを用いて、
    1.「log2(幾何平均版のFold change)の絶対値でのランキング」と「SAM統計量の絶対値でのランキング」→ Pareto layer ranking (method="pareto"で指定)で総合ランキング
    および
    2.「log2(幾何平均版のFold change)の絶対値でのランキング」と「Welch t統計量の絶対値でのランキング」→ Pareto layer ranking (method="pareto"で指定)で総合ランキング
    3.「log2(算術平均版のFold change)の絶対値でのランキング」と「Welch t統計量の絶対値でのランキング」→ Pareto layer ranking (method="pareto"で指定)で総合ランキング
    を得るやり方を示します。
    コピペで動かないままになっていたのを修正しました(2009/11/10, 12:38)。
    「ファイル」−「ディレクトリの変更」で解析したいサンプルマイクロアレイデータ7中のdata_Singh_RMA_3274.txtファイルを置いてあるディレクトリに移動し、以下をコピペ
    1. 「log2(幾何平均版のFold change)の絶対値でのランキング」と「SAM統計量の絶対値でのランキング」の場合:
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 50                                                     #A群のサンプル数を指定
    param2 <- 52                                                     #B群のサンプル数を指定
    param3 <- "pareto"                                               #ランキング法を指定
    
    #必要なパッケージなどをロード
    #source("http://gap.stat.sinica.edu.tw/Software/mvo.R")          #layer ranking algorithmのRスクリプトの読み込み
    source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/mvo.R")          #layer ranking algorithmのRスクリプトの読み込み
    library(samr)                                                    #パッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(1, param1), rep(2, param2))                     #A群を1、B群を2としたベクトルdata.clを作成
    
    data.tmp = list(x=data, y=data.cl, geneid=rownames(data), genenames=rownames(data), logged2=TRUE)#SAMを実行するsamr関数の入力フォーマットに合わせたdata.tmpという入力データを作成
    out <- samr(data.tmp, resp.type="Two class unpaired", nperms=20) #samr関数を実行し、結果をoutに格納
    stat_sam <- out$tt                                               #SAM統計量をstat_samに格納
    rank_sam <- rank(-abs(stat_sam))                                 #SAM統計量の順位をrank_samに格納
    stat_fc <- log2(out$foldchange)                                  #log(FC)統計量をstat_fcに格納
    rank_fc <- rank(-abs(stat_fc))                                   #log(FC)統計量の順位をrank_fcに格納
    ranks <- cbind(stat_sam, stat_fc)                                #SAM統計量とFC統計量をまとめたものをranksに格納。
    
    ranks.out <- mvo(ranks,ignore=c(T,T),opposite=c(F,F), empty=F, method=param3)#param3で指定した総合ランキングを実行
    tmp <- cbind(rownames(data), data, stat_sam, stat_fc, rank_sam, rank_fc, ranks.out)#入力データの右側に「SAM統計量」「log(FC)」「SAM統計量の順位」「log(FC)の順位」「layer ranking」情報を追加してtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    以下の計算を実行すると(結構時間がかかります)一位に"37639_at"と"41468_at"の2つが、二位に"1740_g_at"と"37366_at"が、そして三位に"1890_at"など計三つがランキングされていることが分かります。(hoge.txtをエクセルのタブ区切りテキストで開くとFカラムからこれらの情報が分かります。) ここではPareto layer ranking (method="pareto"で指定)で総合ランキングを得ているので、同じ順位内の遺伝子群は「log2(Fold change)の絶対値でのランキング」または「SAMのd統計量の絶対値でのランキング」いずれかで、同じ順位内の他の遺伝子に対して勝っています。 例えば、総合ランキング三位の三つの遺伝子は、(総合ランキング一位と二位を除いて)"1890_at"は「log ratioの絶対値での順位」がトップ(4位)です。"32598_at"は「d統計量の絶対値での順位」がトップ(4位)。"38827_at"はそれぞれのランキングはともに5位ですが、「log ratioの絶対値での順位」は"32598_at"に勝っており、「d統計量の絶対値での順位」は"1890_at"に勝っているので、順位的に劣っているとはみなさない、というのがここでのPareto layer rankingの考え方です。 2. 「log2(幾何平均版のFold change)の絶対値でのランキング」と「Welch t統計量の絶対値でのランキング」の場合:
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 50                                                     #A群のサンプル数を指定
    param2 <- 52                                                     #B群のサンプル数を指定
    param3 <- "pareto"                                               #ランキング法を指定
    
    #必要な関数などをロード
    source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/mvo.R")          #layer ranking algorithmのRスクリプトの読み込み
    source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")  #Welch t-testを行うWelch_ttest関数を含むファイルをあらかじめ読み込む
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    out <- t(apply(data, 1, Welch_ttest, data.cl))                   #各(行)遺伝子についてt検定を行った結果のt統計量とp値をoutに格納
    stat_t <- out[,1]                                                #t統計量をstat_tに格納
    rank_t <- rank(-abs(stat_t))                                     #t統計量の順位をrank_tに格納
    stat_fc <- apply(data, 1, AD, data.cl)                           #log(FC)統計量(AD統計量)をstat_fcに格納
    rank_fc <- rank(-abs(stat_fc))                                   #log(FC)統計量の順位をrank_fcに格納
    ranks <- cbind(stat_t, stat_fc)                                  #t統計量とFC統計量をまとめたものをranksに格納。
    
    ranks.out <- mvo(ranks,ignore=c(T,T),opposite=c(F,F), empty=F, method=param3)#param3で指定した総合ランキングを実行
    tmp <- cbind(rownames(data), data, stat_t, stat_fc, rank_t, rank_fc, ranks.out)#入力データの右側に「t統計量」「log(FC)」「t統計量の順位」「log(FC)の順位」「layer ranking」情報を追加してtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    3. 「log2(算術平均版のFold change)の絶対値でのランキング」と「Welch t統計量の絶対値でのランキング」の場合:
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 50                                                     #A群のサンプル数を指定
    param2 <- 52                                                     #B群のサンプル数を指定
    param3 <- "pareto"                                               #ランキング法を指定
    
    #必要な関数などをロード
    source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/mvo.R")          #layer ranking algorithmのRスクリプトの読み込み
    source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")  #Welch t-testを行うWelch_ttest関数を含むファイルをあらかじめ読み込む
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    out <- t(apply(data, 1, Welch_ttest, data.cl))                   #各(行)遺伝子についてt検定を行った結果のt統計量とp値をoutに格納
    stat_t <- out[,1]                                                #t統計量をstat_tに格納
    rank_t <- rank(-abs(stat_t))                                     #t統計量の順位をrank_tに格納
    stat_fc <- apply(data, 1, FC, data.cl)                           #log(FC)統計量をstat_fcに格納
    rank_fc <- rank(-abs(stat_fc))                                   #log(FC)統計量の順位をrank_fcに格納
    ranks <- cbind(stat_t, stat_fc)                                  #t統計量とFC統計量をまとめたものをranksに格納。
    
    ranks.out <- mvo(ranks,ignore=c(T,T),opposite=c(F,F), empty=F, method=param3)#param3で指定した総合ランキングを実行
    tmp <- cbind(rownames(data), data, stat_t, stat_fc, rank_t, rank_fc, ranks.out)#入力データの右側に「t統計量」「log(FC)」「t統計量の順位」「log(FC)の順位」「layer ranking」情報を追加してtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    

    Rスクリプトのある場所
    参考文献1(Chen et al., BMC Bioinformatics, 2007)
    参考文献2(MAQC Consortium, Nature Biotechnol., 2006)

    解析 | 発現変動遺伝子 | 二群間 | 対応なし | fdr2d (Ploner_2006)

    一つ上のlayer ranking algorithm (Chen_2007)と同じく、発現変動遺伝子(Differentially Expressed Genes; DEGs)のランキングのために用いた複数の統計量(例えばFold changeとP-value)の結果から総合ランキングを得るとともにそのFDRを計算してくれるようです。 サンプルの並べ替え(permutation)でnon-DEGsの分布を計算し、どうにかしてFDRを計算してくれるみたいです。
    以下では(遺伝子名の列を除く)最初の3列(X=3)がA群、残りの3列(Y=3)がB群からなる(すでに対数変換されている)遺伝子発現データファイル(sample14.txt)の二群間比較用データを用いて、 「標準誤差のlog」と「t統計量」で総合FDRを得るやり方を示します。
    volcano plot (横軸:fold change, 縦軸:t-testなどで得られたp-value)の総合FDRは下記で利用しているfdr2d関数ではサポートされていないようですね。

    「ファイル」−「ディレクトリの変更」で解析したいサンプルマイクロアレイデータ13中のsample14.txtファイルを置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "sample14.txt"                                           #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 3                                                      #A群のサンプル数を指定
    param2 <- 3                                                      #B群のサンプル数を指定
    
    #必要なパッケージをロード
    library(OCplus)                                                  #パッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    tmpout <- fdr1d(data, data.cl, verb=FALSE)                       #入力データ中の発現変動していない遺伝子(non-DEGs)の割合を調べた結果をtmpoutに格納
    p0(tmpout)                                                       #得られたtmpoutの中から目的のnon-DEGsの割合の数値を表示
    out <- fdr2d(data, data.cl, p0=p0(tmpout), verb=FALSE)           #「標準誤差のlog」と「t統計量」の二つの統計量の値を使って総合FDRを計算
    tmp <- cbind(rownames(data), data, out)                          #入力データの右側に「t統計量(tstat)」「標準誤差のlog(logse)」「総合FDR」情報を追加してtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    

    BioconductorのOCplusのwebページ

    参考文献1(Ploner et al., Bioinformatics, 2006)

    解析 | 発現変動遺伝子 | 二群間 | 対応なし | IBMT (Sartor_2006)

    参考文献1の方法を用いて二群間で発現の異なる遺伝子をランキング。経験ベイズの改良版という位置づけですね。a novel Bayesian moderated-Tと書いてますし。

    「ファイル」−「ディレクトリの変更」で解析したいサンプルマイクロアレイデータ7中のdata_Singh_RMA_3274.txtファイルを置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 50                                                     #A群のサンプル数を指定
    param2 <- 52                                                     #B群のサンプル数を指定
    
    #必要なパッケージなどをロード
    library(limma)                                                   #パッケージの読み込み
    source("http://eh3.uc.edu/r/ibmtR.R")                            #IBMTのRスクリプトの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    design <- model.matrix(~data.cl)                                 #おまじない
    data <- as.matrix(data)                                          #おまじない
    fit <- lmFit(data, design)                                       #おまじない
    fit$Amean<-rowMeans(data)                                        #おまじない
    fit <- IBMT(fit,2)                                               #IBMTプログラムの実行
    stat_ibmt <- fit$IBMT.t                                          #得られた統計量をstat_ibmtに格納
    rank_ibmt <- rank(-abs(stat_ibmt))                               #統計量の絶対値でランキングした結果をrank_ibmtに格納
    tmp <- cbind(rownames(data), data, stat_ibmt, rank_ibmt)         #入力データの右側に「IBMT統計量」「その順位」情報を追加してtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    Rスクリプトのある場所
    参考文献(Sartor et al., BMC Bioinformatics, 2006)

    解析 | 発現変動遺伝子 | 二群間 | 対応なし | PPLR (Liu_2006)

    参考文献1の方法を用いて二群間で発現の異なる遺伝子をランキング。 これはmulti-mgMOSなどの前処理法をかけたあとに得られる「発現レベルの不確実性(uncertainty for the expression level)」の情報を使うことで精度向上を目指しているものなので、 ここではmulti-mgMOS/PPLRの組み合わせで発現変動の度合いでランキングする手順を示します。
    また、例として、GEOよりダウンロード可能な参考文献2 (GSE7819)のデータ(GSM189708-GSM189713)の解析(3 SVG-A vs. 3 SVGR2)を示します。
    つまり、*.CELファイル名とサンプルラベルは以下のような関係にあります。 ------------------------------- GSM189708.CEL SVG-A A群 GSM189709.CEL SVG-A A群 GSM189710.CEL SVG-A A群 GSM189711.CEL SVGR2 B群 GSM189711.CEL SVGR2 B群 GSM189711.CEL SVGR2 B群 ------------------------------- 「ファイル」−「ディレクトリの変更」で解析したいファイル(*.CELファイル)を置いてあるディレクトリに移動し、以下をコピペ
    1. PPLRの通常のやり方
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 3                                                      #A群のサンプル数を指定
    param2 <- 3                                                      #B群のサンプル数を指定
    
    #必要なパッケージをロード
    library(puma)                                                    #パッケージの読み込み
    
    data <- ReadAffy()                                               #*.CELファイルの読み込み
    eset_mmgmos <- mmgmos(data)                                      #multi-mgMOSを実行し、結果をeset_mmgmosに保存
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    pData(eset_mmgmos) <- data.frame(                                #各CELファイルとラベル情報を対応づける
        "label"   = data.cl,                                         #各CELファイルとラベル情報を対応づける
        row.names = list.files(pattern = ".CEL")                     #各CELファイルとラベル情報を対応づける
    eset_mmgmos_normd <- pumaNormalize(eset_mmgmos)                  #median scalingを行う
    eset_comb <- pumaComb(eset_mmgmos_normd)                         #PPLRの実行1 (6 hrほどかかるもよう...)
    eset_DE <- pumaDE(eset_comb)                                     #PPLRの実行2
    stat_pplr <- abs(statistic(eset_DE) - 0.5)                       #PPLRが出力する統計量は[0,1]の範囲で0.5が発現変動なしに相当するので、WADやSAMと同じ枠組みで処理できるように得られた統計量から0.5を引いておく
    rank_pplr <- rank(-abs(stat_pplr))                               #統計量の絶対値でランキングした結果をrank_pplrに格納
    tmp <- cbind(rownames(data), data, stat_pplr, rank_pplr)         #入力データの右側に「変換後のPPLR統計量」「その順位」情報を追加してtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    2. (logスケールで)シグナル強度が0以下のものを0にしてからPPLRを実行するやり方(WADなどの手順とそろえたいとき)
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 3                                                      #A群のサンプル数を指定
    param2 <- 3                                                      #B群のサンプル数を指定
    
    #必要なパッケージをロード
    library(puma)                                                    #パッケージの読み込み
    
    data <- ReadAffy()                                               #*.CELファイルの読み込み
    eset_mmgmos <- mmgmos(data)                                      #multi-mgMOSを実行し、結果をeset_mmgmosに保存
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    pData(eset_mmgmos) <- data.frame(                                #各CELファイルとラベル情報を対応づける
        "label"   = data.cl,                                         #各CELファイルとラベル情報を対応づける
        row.names = list.files(pattern = ".CEL")                     #各CELファイルとラベル情報を対応づける
    eset_mmgmos_normd <- pumaNormalize(eset_mmgmos)                  #median scalingを行う
    exprs(eset_mmgmos_normd)[exprs(eset_mmgmos_normd) < 0] <- 0      #シグナル強度が0以下のものを0にする
    eset_comb <- pumaComb(eset_mmgmos_normd)                         #PPLRの実行1 (6 hrほどかかるもよう...)
    eset_DE <- pumaDE(eset_comb)                                     #PPLRの実行2
    stat_pplr <- abs(statistic(eset_DE) - 0.5)                       #PPLRが出力する統計量は[0,1]の範囲で0.5が発現変動なしに相当するので、WADやSAMと同じ枠組みで処理できるように得られた統計量から0.5を引いておく
    rank_pplr <- rank(-abs(stat_pplr))                               #統計量の絶対値でランキングした結果をrank_pplrに格納
    tmp <- cbind(rownames(data), data, stat_pplr, rank_pplr)         #入力データの右側に「変換後のPPLR統計量」「その順位」情報を追加してtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    

    Bioconductorの(PPLRとmulti-mgMOSを含むパッケージ)pumaのwebページ

    参考文献1(Liu et al., Bioinformatics, 2006)
    参考文献2(Manley et al., Virology, 2007)

    解析 | 発現変動遺伝子 | 二群間 | 対応なし | Rank products (Breitling_2004)

    参考文献1の方法を用いて二群間で発現の異なる遺伝子をランキング。非常によく用いられているSAMよりも成績がいいとのこと。 実際、最近の様々な方法を比較した論文(参考文献3)中でも高い評価を受けているようだ。 この方法を使って遺伝子のランキングをした結果はt検定やSAMなどとは”かなり”違います(参考文献4)。

    「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し、以下をコピペ 1. RMA-preprocessed data (A群:4 samples vs. B群:4 samples)の場合: サンプルマイクロアレイデータ21中のdata_rma_2_BAT.txt
    in_f <- "data_rma_2_BAT.txt"                                     #入力ファイル名を指定
    out_f <- "result_rankprod_BAT.txt"                               #出力ファイル名を指定
    param_A <- 4                                                     #A群のサンプル数を指定
    param_B <- 4                                                     #B群のサンプル数を指定
    param3 <- 100                                                    #FDR計算のための並べ替え回数を指定(ここの数値が大きければ大きいほどより正確だがその分だけ時間がかかる。実際の解析ではサンプル数にもよるが最低でも1000程度の数を指定しましょう)
    
    #必要なパッケージをロード
    library(RankProd)                                                #パッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param_A), rep(1, param_B))                   #A群を0、B群を1としたベクトルdata.clを作成
    
    out <- RP(data, data.cl, num.perm = param3, logged = TRUE, na.rm = FALSE, plot = FALSE, rand = 123)#Rank Product (RP)の実行。
    stat_RP <- apply(out$RPs, 1, min)                                #総合RP統計量を計算(20090527追加)
    rank_RP <- as.matrix(rank(stat_RP, ties.method = "min"))         #総合順位を計算(20090527追加)
    stat_fc <- -out$AveFC                                            #総合log(FC)統計量を計算
    rank_fc <- rank(-abs(stat_fc))                                   #総合log(FC)統計量の順位を計算
    
    colnames(out$pfp) <- c("FDR(A群 < B群)","FDR(A群 > B群)")        #列名を変更(20090527追加)
    colnames(out$RPs) <- c("stat(A群 < B群)","stat(A群 > B群)")      #列名を変更(20090527追加)
    colnames(out$RPrank) <- c("rank(A群 < B群)","rank(A群 > B群)")   #列名を変更(20090527追加)
    tmp <- cbind(rownames(data), data, out$pfp, out$RPs, out$RPrank, stat_fc, rank_fc, stat_RP, rank_RP)#入力データの右側にFDR値, 各統計量, 各順位, 総合log(FC)統計量, その順位, 総合RP統計量, その順位の情報を付加したtmpを用意。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    2. RMA-preprocessed data (A群:4 samples vs. B群:4 samples)でFDR < 0.05を満たすprobesetIDの情報のみ抽出したい場合: サンプルマイクロアレイデータ21中のdata_rma_2_BAT.txt (若干IDの数に変動はあると思いますが概ね1800 IDsが得られると思います)出力ファイル例:result_rankprod_BAT_id.txt
    in_f <- "data_rma_2_BAT.txt"                                     #入力ファイル名を指定
    out_f <- "result_rankprod_BAT_id.txt"                            #出力ファイル名を指定
    param_A <- 4                                                     #A群のサンプル数を指定
    param_B <- 4                                                     #B群のサンプル数を指定
    param3 <- 100                                                    #FDR計算のための並べ替え回数を指定(ここの数値が大きければ大きいほどより正確だがその分だけ時間がかかる。実際の解析ではサンプル数にもよるが最低でも1000程度の数を指定しましょう)
    param4 <- 0.05                                                   #FDR閾値を指定
    
    #必要なパッケージをロード
    library(RankProd)                                                #パッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param_A), rep(1, param_B))                   #A群を0、B群を1としたベクトルdata.clを作成
    
    out <- RP(data, data.cl, num.perm = param3, logged = TRUE, na.rm = FALSE, plot = FALSE, rand = 123)#Rank Product (RP)の実行。
    hoge_upB <- rownames(data)[out$pfp[1] < param4]                  #「B群 > A群」の中で指定したFDR閾値を満たすIDを抽出
    hoge_upA <- rownames(data)[out$pfp[2] < param4]                  #「B群 < A群」の中で指定したFDR閾値を満たすIDを抽出
    tmp <- union(hoge_upA, hoge_upB)                                 #(両方で共通して出現しているIDがごくまれにあるので念のため)和集合をとっている
    writeLines(tmp, out_f)                                           #tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    3. RMA-preprocessed data (A群:50 samples vs. B群:52 samples)の場合: (サンプルマイクロアレイデータ7中のdata_Singh_RMA_3274.txt
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param_A <- 50                                                    #A群のサンプル数を指定
    param_B <- 52                                                    #B群のサンプル数を指定
    param3 <- 20                                                     #FDR計算のための並べ替え回数を指定(ここの数値が大きければ大きいほどより正確だがその分だけ時間がかかる。実際の解析ではサンプル数にもよるが最低でも1000程度の数を指定しましょう)
    
    #必要なパッケージをロード
    library(RankProd)                                                #パッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param_A), rep(1, param_B))                   #A群を0、B群を1としたベクトルdata.clを作成
    
    out <- RP(data, data.cl, num.perm = param3, logged = TRUE, na.rm = FALSE, plot = FALSE, rand = 123)#Rank Product (RP)の実行。
    stat_RP <- apply(out$RPs, 1, min)                                #総合RP統計量を計算(20090527追加)
    rank_RP <- as.matrix(rank(stat_RP, ties.method = "min"))         #総合順位を計算(20090527追加)
    stat_fc <- -out$AveFC                                            #総合log(FC)統計量を計算
    rank_fc <- rank(-abs(stat_fc))                                   #総合log(FC)統計量の順位を計算
    
    colnames(out$pfp) <- c("FDR(A群 < B群)","FDR(A群 > B群)")        #列名を変更(20090527追加)
    colnames(out$RPs) <- c("stat(A群 < B群)","stat(A群 > B群)")      #列名を変更(20090527追加)
    colnames(out$RPrank) <- c("rank(A群 < B群)","rank(A群 > B群)")   #列名を変更(20090527追加)
    tmp <- cbind(rownames(data), data, out$pfp, out$RPs, out$RPrank, stat_fc, rank_fc, stat_RP, rank_RP)#入力データの右側にFDR値, 各統計量, 各順位, 総合log(FC)統計量, その順位, 総合RP統計量, その順位の情報を付加したtmpを用意。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    plotRP(out, cutoff = 0.05)                                       #FDRを5%に設定したときのB群(この場合Tumourサンプル)で高発現(2つの図の上)および低発現(2つの図の下)のdifferentially expressed genesが赤色で示される。この場合だとそれぞれ500個程度あることが分かる。
    topGene(out, cutoff = 0.0001, gene.names = rownames(data))       #FDR0.01%を満たす遺伝子をリストアップ。(いっぱいあることが分かります。)尚、オプションのgene.namesはrownames(data)とちゃんと指定してあげないと遺伝子名のところがシリアル番号?!(gene.indexカラムの数字と同じ)になってしまいます。
    topGene(out, num.gene = 10, gene.names = rownames(data))         #上位10遺伝子をリストアップしたいとき
    summary(out)                                                     #outからどのような情報を抽出できるか調べる。
    
    
    
    得られるhoge.txtについて。 FDR列:pfp (percentage of false positive predictionの略;FDRそのもの)値。この列で昇順にソートして0.05未満のもののリストなどをゲットしたりする。 stat列:RPs (RP or RPadvance関数を使ったときはrank product;RSadvance関数を使ったときはrank sum)値。統計量そのものです。低いほど発現変動の度合いが高いことを意味する。 rank列:順位 stat_fc列:log比(Bの算術平均 - A群の算術平均)値。 rank_fc列:stat_fc値の絶対値が大きい順に並べた順位。 stat_RP列:二つある"stat"列の統計量のうち、小さいほうの値。この値が小さいほど発現変動の度合いが大きいと解釈する。 rank_RP列:総合順位。Rank列は、「A群 < B群での順位」と「A群 > B群での順位」が独立に出てくるので、WADの順位との比較を行いたいなどの場合には、この総合順位を用いて行います。

    BioconductorのRankProdのwebページ

    参考文献1(Rank products; Breitling et al., FEBS Lett., 2004)
    参考文献2(Hong et al., Bioinformatics, 2006)
    参考文献3(Jeffery et al., BMC Bioinformatics, 2006)
    参考文献4(Kadota et al., Algorithms Mol. Biol., 2008)
    参考文献5(Nakai et al., BBB, 2008)

    解析 | 発現変動遺伝子 | 二群間 | 対応なし | Empirical bayes statistic

    この方法は、最近の様々な方法を比較した論文(参考文献2)中でも高い評価を受けている。
    基本がt検定なので、SAMなどときわめて似た遺伝子のランキング結果を示す。
    「ファイル」−「ディレクトリの変更」で解析したいサンプルマイクロアレイデータ7中のdata_Singh_RMA_3274.txtファイルを置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 50                                                     #A群のサンプル数を指定
    param2 <- 52                                                     #B群のサンプル数を指定
    
    #必要なパッケージをロード
    library(st)                                                      #shrinkage t statisticを計算するためのパッケージの読み込み
    library(limma)                                                   #empirical Bayesを計算するためのパッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(1, param1), rep(2, param2))                     #A群を1、B群を2としたベクトルdata.clを作成
    
    stat_ebayes <- modt.stat(t(data), data.cl)                       #Empirical Bayes t統計量を計算し結果をstat_ebayesに格納
    rank_ebayes <- rank(-abs(stat_ebayes))                           #Empirical Bayes t統計量の順位を計算し結果をrank_ebayesに格納
    tmp <- cbind(rownames(data), data, stat_ebayes, rank_ebayes)     #入力データの右側に「統計量」と「その順位」を結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    

    Bioconductorのlimmaのwebページ

    参考文献1(Smyth, GK, Stat Appl Genet Mol Biol., 2004)
    参考文献2(Jeffery et al., BMC Bioinformatics, 2006)

    解析 | 発現変動遺伝子 | 二群間 | 対応なし | samroc (Broberg_2003)

    参考文献1の方法を用いて二群間で発現の異なる遺伝子をランキング。ROC curveに基づいてSAM統計量を計算したもの。よく用いられているSAMよりも成績がいいとのこと(参考文献2)。

    「ファイル」−「ディレクトリの変更」で解析したいサンプルマイクロアレイデータ7中のdata_Singh_RMA_3274.txtファイルを置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 50                                                     #A群のサンプル数を指定
    param2 <- 52                                                     #B群のサンプル数を指定
    
    #必要なパッケージをロード
    library(SAGx)                                                    #パッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    out <- samrocNboot(data=data, formula=~as.factor(data.cl))       #samrocを実行
    show(out)                                                        #結果を表示
    stat_samroc <- out@d                                             #samroc統計量をstat_samrocに格納
    rank_samroc <- rank(-abs(stat_samroc))                           #samroc統計量の順位をrank_samrocに格納
    p_samroc <- out@pvalues                                          #p値をp_samrocに格納
    tmp <- cbind(rownames(data), data, stat_samroc, p_samroc, rank_samroc)#入力データの右側に統計量、p値、順位を結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    

    BioconductorのSAGxのwebページ

    参考文献1(Broberg P., Genome Biol., 2003)
    参考文献2(Choe et al., Genome Biol., 2005)

    解析 | 発現変動遺伝子 | 二群間 | 対応なし | SAM

    Significance Analysis of Microarrays (SAM)法。改良版t-statisticを用いて発現強度依存の偏りを補正すべく、従来のt-statisticの数式の分母に補正項(fudge factor)を付加しているところがポイント。
    ここでは、「SAM統計量とその順位」および「log(FC)統計量とその順位」を出力結果として得るやり方を示します。また、入力データは対数変換後のものを想定(logged2=TRUE)しています。

    「ファイル」−「ディレクトリの変更」で解析したいサンプルマイクロアレイデータ9中のdata_Singh_RMA_3274.txtファイルを置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 50                                                     #A群のサンプル数を指定
    param2 <- 52                                                     #B群のサンプル数を指定
    param3 <- 20                                                     #FDR計算のための並べ替え回数を指定(ここの数値が大きければ大きいほどより正確だがその分だけ時間がかかる。実際の解析ではサンプル数にもよるが最低でも1000程度の数を指定しましょう)
    
    #必要なパッケージをロード
    library(samr)                                                    #パッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(1, param1), rep(2, param2))                     #A群を1、B群を2としたベクトルdata.clを作成
    
    data.tmp = list(x=as.matrix(data), y=data.cl, geneid=rownames(data), genenames=rownames(data), logged2=TRUE)#SAMを実行するsamr関数の入力フォーマットに合わせたdata.tmpを作成
    out <- samr(data.tmp, resp.type="Two class unpaired", nperms=param3)#samr関数を実行し、結果をoutに格納。
    summary(out)                                                     #outからどのような情報が抜き出せるか調べる。
    stat_sam <- out$tt                                               #SAM統計量をstat_samに格納
    rank_sam <- rank(-abs(stat_sam))                                 #統計量の絶対値でランキングした結果をrank_samに格納
    stat_fc <- log2(out$foldchange)                                  #log(FC)統計量をstat_fcに格納
    rank_fc <- rank(-abs(stat_fc))                                   #統計量の絶対値でランキングした結果をrank_fcに格納
    tmp <- cbind(rownames(data), data, stat_sam, rank_sam, stat_fc, rank_fc)#入力データの右側に「SAM統計量」「その順位」「log(FC)統計量」「その順位」を結合した結果をtmpに格納。ここでのFold changeの値はunlogged dataのaverage fold change(B群/A群)が計算されています。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    CRANのsamrのwebページ
    CRANのsamrのPDFマニュアル
    参考文献1(Tusher et al., PNAS, 2001)

    解析 | 発現変動遺伝子 | 二群間 | 対応なし | Student's t-test

    等分散性を仮定したt検定を用いて、二群間での発現変動遺伝子の同定を行う。
    ここでは、遺伝子発現データとして、sample16.txtdata_Singh_RMA_3274.txtの二つの場合について紹介します。
    (一般に、入力データは対数変換(log2変換)後のものを与えますが、sample16.txtは諸事情により対数変換前のデータで解析しています。)

    「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し、以下をコピペ 1. 入力データがsample16.txtで、クラスラベル情報ファイル(sample16_cl.txt)を読み込んで解析する場合:
    in_f1 <- "sample16.txt"                                          #入力ファイル名1(発現データ)を指定
    in_f2 <- "sample16_cl.txt"                                       #入力ファイル名2(テンプレート情報)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイル1を読み込んでdataに格納
    hoge <- read.table(in_f2, sep="\t", quote="")                    #入力ファイル2を読み込んでhogeに格納
    data.cl <- hoge[,2]                                              #テンプレートパターンベクトルdata.clを作成
    
    #等分散性を仮定(var.equal=T)してt.testを行い、t統計量とp-valueの値を返す関数Students_ttestを作成。
    Students_ttest <- function(x, cl){
        x.class0 <- x[(cl == 0)]                                     #ラベルが0のものをx.class0に格納
        x.class1 <- x[(cl == 1)]                                     #ラベルが1のものをx.class1に格納
        if((sd(x.class0)+sd(x.class1)) == 0){                        #両方の群の標準偏差が共に0の場合は計算できないので...
            stat <- 0                                                #統計量を0
            pval <- 1                                                #p値を1
            return(c(stat, pval))                                    #として結果を返す
        }
        else{                                                        #A, Bどちらかの群の標準偏差が0(上記条件以外)の場合は
            hoge <- t.test(x.class1, x.class0, var.equal=T)          #通常のt検定を行って、
            return(c(hoge$statistic, hoge$p.value))                  #統計量とp値を結果として返す
        }
    }
    
    out <- t(apply(data, 1, Students_ttest, data.cl))                #各(行)遺伝子についてt検定を行った結果のt統計量とp値をoutに格納 
    colnames(out) <- c("t-statistic", "p-value")                     #オブジェクトoutに列名を付加している 
    tmp <- cbind(rownames(data), data, out)                          #入力データの右側にt検定結果を結合したものをtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    2. 入力データがsample16.txtで、クラスラベル情報ファイルを使わない別のやり方で解析する場合:
    in_f1 <- "sample16.txt"                                          #入力ファイル名1(発現データ)を指定
    param1 <- 6                                                      #A群のサンプル数を指定
    param2 <- 5                                                      #B群のサンプル数を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイル1を読み込んでdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    #等分散性を仮定(var.equal=T)してt.testを行い、t統計量とp-valueの値を返す関数Students_ttestを作成。
    Students_ttest <- function(x, cl){
        x.class0 <- x[(cl == 0)]                                     #ラベルが0のものをx.class0に格納
        x.class1 <- x[(cl == 1)]                                     #ラベルが1のものをx.class1に格納
        if((sd(x.class0)+sd(x.class1)) == 0){                        #両方の群の標準偏差が共に0の場合は計算できないので...
            stat <- 0                                                #統計量を0
            pval <- 1                                                #p値を1
            return(c(stat, pval))                                    #として結果を返す
        }
        else{                                                        #A, Bどちらかの群の標準偏差が0(上記条件以外)の場合は
            hoge <- t.test(x.class1, x.class0, var.equal=T)          #通常のt検定を行って、
            return(c(hoge$statistic, hoge$p.value))                  #統計量とp値を結果として返す
        }
    }
    
    out <- t(apply(data, 1, Students_ttest, data.cl))                #各(行)遺伝子についてt検定を行った結果のt統計量とp値をoutに格納 
    colnames(out) <- c("t-statistic", "p-value")                     #オブジェクトoutに列名を付加している 
    tmp <- cbind(rownames(data), data, out)                          #入力データの右側にt検定結果を結合したものをtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #(A群 vs. B群) t-testでp-value < 0.0015を満たす遺伝子数を表示させたい場合:
    param3 <- 0.0015                                                  #閾値を指定
    sum(out[,2] < param3)                                            #out[,2]に相当する部分がp-value情報のところなので、ここが(param3)未満となっている行数をsum関数を用いてカウントしている
    
    
    
    3. 10000行×6列分の標準正規分布に従う乱数を発生させて、A群3サンプル vs. B群3サンプルの二群間比較として解析を行う場合:
    param1 <- 3                                                      #A群のサンプル数を指定
    param2 <- 3                                                      #B群のサンプル数を指定
    param3 <- 10000                                                  #遺伝子数(行数)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #ランダムデータの生成とラベル情報の作成
    data_tmp <- rnorm(param3*(param1+param2))                        #param3*(param1+param2)個分の乱数を発生させた結果をdata_tmpに格納
    data <- matrix(data_tmp, nrow=param3)                            #param3*(param1+param2)個分の要素からなるベクトルdata_tmpを変換して(param3)個の行数からなる行列を作成した結果をdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    #等分散性を仮定(var.equal=T)してt.testを行い、t統計量とp-valueの値を返す関数Students_ttestを作成。
    Students_ttest <- function(x, cl){
        x.class0 <- x[(cl == 0)]                                     #ラベルが0のものをx.class0に格納
        x.class1 <- x[(cl == 1)]                                     #ラベルが1のものをx.class1に格納
        if((sd(x.class0)+sd(x.class1)) == 0){                        #両方の群の標準偏差が共に0の場合は計算できないので...
            stat <- 0                                                #統計量を0
            pval <- 1                                                #p値を1
            return(c(stat, pval))                                    #として結果を返す
        }
        else{                                                        #A, Bどちらかの群の標準偏差が0(上記条件以外)の場合は
            hoge <- t.test(x.class1, x.class0, var.equal=T)          #通常のt検定を行って、
            return(c(hoge$statistic, hoge$p.value))                  #統計量とp値を結果として返す
        }
    }
    
    out <- t(apply(data, 1, Students_ttest, data.cl))                #各(行)遺伝子についてt検定を行った結果のt統計量とp値をoutに格納 
    colnames(out) <- c("t-statistic", "p-value")                     #オブジェクトoutに列名を付加している 
    tmp <- cbind(rownames(data), data, out)                          #入力データの右側にt検定結果を結合したものをtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #(A群 vs. B群) t-testでp-value < 0.05を満たす遺伝子数を表示させたい場合:
    param4 <- 0.05                                                   #閾値を指定
    sum(out[,2] < param4)                                            #out[,2]に相当する部分がp-value情報のところなので、ここが(param4)未満となっている行数をsum関数を用いてカウントしている
    
    
    
    4. 10000行×6列分の標準正規分布に従う乱数を発生させて、A群3サンプル vs. B群3サンプルの二群間比較として解析を行う場合(FDR値も出力させる):
    param1 <- 3                                                      #A群のサンプル数を指定
    param2 <- 3                                                      #B群のサンプル数を指定
    param3 <- 10000                                                  #遺伝子数(行数)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #ランダムデータの生成とラベル情報の作成
    data_tmp <- rnorm(param3*(param1+param2))                        #param3*(param1+param2)個分の乱数を発生させた結果をdata_tmpに格納
    data <- matrix(data_tmp, nrow=param3)                            #param3*(param1+param2)個分の要素からなるベクトルdata_tmpを変換して(param3)個の行数からなる行列を作成した結果をdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    #等分散性を仮定(var.equal=T)してt.testを行い、t統計量とp-valueの値を返す関数Students_ttestを作成。
    Students_ttest <- function(x, cl){
        x.class0 <- x[(cl == 0)]                                     #ラベルが0のものをx.class0に格納
        x.class1 <- x[(cl == 1)]                                     #ラベルが1のものをx.class1に格納
        if((sd(x.class0)+sd(x.class1)) == 0){                        #両方の群の標準偏差が共に0の場合は計算できないので...
            stat <- 0                                                #統計量を0
            pval <- 1                                                #p値を1
            return(c(stat, pval))                                    #として結果を返す
        }
        else{                                                        #A, Bどちらかの群の標準偏差が0(上記条件以外)の場合は
            hoge <- t.test(x.class1, x.class0, var.equal=T)          #通常のt検定を行って、
            return(c(hoge$statistic, hoge$p.value))                  #統計量とp値を結果として返す
        }
    }
    
    out <- t(apply(data, 1, Students_ttest, data.cl))                #各(行)遺伝子についてt検定を行った結果のt統計量とp値をoutに格納 
    colnames(out) <- c("t-statistic", "p-value")                     #オブジェクトoutに列名を付加している 
    FDR <- p.adjust(out[,2], method="BH")                            #Benjamini and Hochberg (1995)の方法でFDRを計算した結果をFDRに格納。
    tmp <- cbind(rownames(data), data, out, FDR)                     #入力データの右側にt検定結果とFDRを結合したものをtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #(A群 vs. B群) t-testでp-value < 0.05を満たす遺伝子数を表示させたい場合:
    param4 <- 0.05                                                   #閾値を指定
    sum(out[,2] < param4)                                            #out[,2]に相当する部分がp-value情報のところなので、ここが(param4)未満となっている要素数をsum関数を用いてカウントしている
    sum(FDR < param4)                                                #FDR < param4を満たす要素数をsum関数を用いてカウントしている
    
    
    
    5. 10000行×6列分の標準正規分布に従う乱数を発生させて、A群3サンプル vs. B群3サンプルの二群間比較として解析を行う場合(FDR値も出力させる): さらに最初の1000行分についてA群に相当するところのみ数値を+3している(つまり10%がA群で高発現というシミュレーションデータを作成している)
    param1 <- 3                                                      #A群のサンプル数を指定
    param2 <- 3                                                      #B群のサンプル数を指定
    param3 <- 10000                                                  #遺伝子数(行数)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #ランダムデータの生成とラベル情報の作成
    data_tmp <- rnorm(param3*(param1+param2))                        #param3*(param1+param2)個分の乱数を発生させた結果をdata_tmpに格納
    data <- matrix(data_tmp, nrow=param3)                            #param3*(param1+param2)個分の要素からなるベクトルdata_tmpを変換して(param3)個の行数からなる行列を作成した結果をdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    #最初の1000行分について1-3列分のデータを+3している
    head(data)                                                       #+3する前のデータの一部を表示させている
    data[1:1000,1:3] <- data[1:1000,1:3] + 3                         #+3を実行
    head(data)                                                       #+3した後のデータの一部を表示させている
    
    #等分散性を仮定(var.equal=T)してt.testを行い、t統計量とp-valueの値を返す関数Students_ttestを作成。
    Students_ttest <- function(x, cl){
        x.class0 <- x[(cl == 0)]                                     #ラベルが0のものをx.class0に格納
        x.class1 <- x[(cl == 1)]                                     #ラベルが1のものをx.class1に格納
        if((sd(x.class0)+sd(x.class1)) == 0){                        #両方の群の標準偏差が共に0の場合は計算できないので...
            stat <- 0                                                #統計量を0
            pval <- 1                                                #p値を1
            return(c(stat, pval))                                    #として結果を返す
        }
        else{                                                        #A, Bどちらかの群の標準偏差が0(上記条件以外)の場合は
            hoge <- t.test(x.class1, x.class0, var.equal=T)          #通常のt検定を行って、
            return(c(hoge$statistic, hoge$p.value))                  #統計量とp値を結果として返す
        }
    }
    
    out <- t(apply(data, 1, Students_ttest, data.cl))                #各(行)遺伝子についてt検定を行った結果のt統計量とp値をoutに格納 
    colnames(out) <- c("t-statistic", "p-value")                     #オブジェクトoutに列名を付加している 
    FDR <- p.adjust(out[,2], method="BH")                            #Benjamini and Hochberg (1995)の方法でFDRを計算した結果をFDRに格納。
    tmp <- cbind(rownames(data), data, out, FDR)                     #入力データの右側にt検定結果とFDRを結合したものをtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #(A群 vs. B群) t-testでp-value < 0.05を満たす遺伝子数を表示させたい場合:
    param4 <- 0.05                                                   #閾値を指定
    sum(out[,2] < param4)                                            #out[,2]に相当する部分がp-value情報のところなので、ここが(param4)未満となっている要素数をsum関数を用いてカウントしている
    
    sum(FDR < 0.05)                                                  #FDR < 0.05を満たす要素数をsum関数を用いてカウントしている
    sum(FDR < 0.10)                                                  #FDR < 0.10を満たす要素数をsum関数を用いてカウントしている
    sum(FDR < 0.15)                                                  #FDR < 0.15を満たす要素数をsum関数を用いてカウントしている
    sum(FDR < 0.20)                                                  #FDR < 0.20を満たす要素数をsum関数を用いてカウントしている
    sum(FDR < 0.25)                                                  #FDR < 0.25を満たす要素数をsum関数を用いてカウントしている
    
    
    
    6. 入力データがdata_Singh_RMA_3274.txtの場合1:
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 50                                                     #A群のサンプル数を指定
    param2 <- 52                                                     #B群のサンプル数を指定
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    #等分散性を仮定(var.equal=T)してt.testを行い、t統計量とp-valueの値を返す関数Students_ttestを作成。
    Students_ttest <- function(x, cl){
        x.class0 <- x[(cl == 0)]                                     #ラベルが0のものをx.class0に格納
        x.class1 <- x[(cl == 1)]                                     #ラベルが1のものをx.class1に格納
        if((sd(x.class0)+sd(x.class1)) == 0){                        #両方の群の標準偏差が共に0の場合は計算できないので...
            stat <- 0                                                #統計量を0
            pval <- 1                                                #p値を1
            return(c(stat, pval))                                    #として結果を返す
        }
        else{                                                        #A, Bどちらかの群の標準偏差が0(上記条件以外)の場合は
            hoge <- t.test(x.class1, x.class0, var.equal=T)          #通常のt検定を行って、
            return(c(hoge$statistic, hoge$p.value))                  #統計量とp値を結果として返す
        }
    }
    
    out <- t(apply(data, 1, Students_ttest, data.cl))                #各(行)遺伝子についてt検定を行った結果のt統計量とp値をoutに格納 
    stat_t <- out[,1]                                                #t統計量をstat_tに格納
    rank_t <- rank(-abs(stat_t))                                     #t統計量の順位をrank_tに格納
    p_t <- out[,2]                                                   #p値をp_tに格納
    tmp <- cbind(rownames(data), data, stat_t, p_t, rank_t)          #入力データの右側に統計量、p値、その順位を結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #(A群 vs. B群) t-testでp<0.05を満たす遺伝子群のみを抽出したい場合:
    param3 <- 0.05                                                   #閾値を指定
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    sum(p_t < param3)                                                #条件を満たす遺伝子がいくつあったかを表示
    tmp2 <- tmp[p_t < param3,]                                       #条件を満たす遺伝子群の発現データをtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    #発現変動の度合いでソートした結果を得たい場合:
    out_f3 <- "hoge3.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(rank_t),]                                      #順位(rank_t)でソートした結果をtmp2に格納
    write.table(tmp2, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f3で指定したファイル名で保存。
    
    
    
    7. 入力データがdata_Singh_RMA_3274.txtの場合2(関数の定義の部分が少し違うだけです):
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 50                                                     #A群のサンプル数を指定
    param2 <- 52                                                     #B群のサンプル数を指定
    
    #必要な関数などをロード
    source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")  #Student's t-testを行うStudents_ttest関数を含むファイルをあらかじめ読み込む
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    out <- t(apply(data, 1, Students_ttest, data.cl))                #各(行)遺伝子についてt検定を行った結果のt統計量とp値をoutに格納 
    stat_t <- out[,1]                                                #t統計量をstat_tに格納
    rank_t <- rank(-abs(stat_t))                                     #t統計量の順位をrank_tに格納
    p_t <- out[,2]                                                   #p値をp_tに格納
    tmp <- cbind(rownames(data), data, stat_t, p_t, rank_t)          #入力データの右側に統計量、p値、その順位を結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #(A群 vs. B群) t-testでp<0.05を満たす遺伝子群のみを抽出したい場合:
    param3 <- 0.05                                                   #閾値を指定
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    sum(p_t < param3)                                                #条件を満たす遺伝子がいくつあったかを表示
    tmp2 <- tmp[p_t < param3,]                                       #条件を満たす遺伝子群の発現データをtmpに格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    #発現変動の度合いでソートした結果を得たい場合:
    out_f3 <- "hoge3.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(rank_t),]                                      #順位(rank_t)でソートした結果をtmp2に格納
    write.table(tmp2, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f3で指定したファイル名で保存。
    
    
    

    解析 | 発現変動遺伝子 | 二群間 | 対応なし | Welch t-test

    不等分散性を仮定したt検定を用いて、二群間での発現変動遺伝子の同定を行う。
    ここでは、遺伝子発現データとして、sample16.txtdata_Singh_RMA_3274.txtの二つの場合について紹介します。
    (一般に、入力データは対数変換(log2変換)後のものを与えますが、sample16.txtは諸事情により対数変換前のデータで解析しています。)

    「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し、以下をコピペ 1. 入力データがsample16.txtで、クラスラベル情報ファイル(sample16_cl.txt)を読み込んで解析する場合:
    in_f1 <- "sample16.txt"                                          #入力ファイル名1(発現データ)を指定
    in_f2 <- "sample16_cl.txt"                                       #入力ファイル名2(テンプレート情報)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイル1を読み込んでdataに格納
    hoge <- read.table(in_f2, sep="\t", quote="")                    #入力ファイル2を読み込んでhogeに格納
    data.cl <- hoge[,2]                                              #テンプレートパターンベクトルdata.clを作成
    
    #不等分散性を仮定(var.equal=F)してt.testを行い、t統計量とp-valueの値を返す関数Welch_ttestを作成。
    Welch_ttest <- function(x, cl){
        x.class0 <- x[(cl == 0)]                                     #ラベルが0のものをx.class0に格納
        x.class1 <- x[(cl == 1)]                                     #ラベルが1のものをx.class1に格納
        if((sd(x.class0)+sd(x.class1)) == 0){                        #両方の群の標準偏差が共に0の場合は計算できないので...
            stat <- 0                                                #統計量を0
            pval <- 1                                                #p値を1
            return(c(stat, pval))                                    #として結果を返す
        }
        else{                                                        #A, Bどちらかの群の標準偏差が0(上記条件以外)の場合は
            hoge <- t.test(x.class1, x.class0, var.equal=F)          #通常のt検定を行って、
            return(c(hoge$statistic, hoge$p.value))                  #統計量とp値を結果として返す
        }
    }
    
    out <- t(apply(data, 1, Welch_ttest, data.cl))                   #各(行)遺伝子についてt検定を行った結果のt統計量とp値をoutに格納 
    colnames(out) <- c("t-statistic", "p-value")                     #オブジェクトoutに列名を付加している 
    tmp <- cbind(rownames(data), data, out)                          #入力データの右側にt検定結果を結合したものをtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    2. 入力データがsample16.txtで、クラスラベル情報ファイルを使わない別のやり方で解析する場合:
    in_f1 <- "sample16.txt"                                          #入力ファイル名1(発現データ)を指定
    param1 <- 6                                                      #A群のサンプル数を指定
    param2 <- 5                                                      #B群のサンプル数を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイル1を読み込んでdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    #不等分散性を仮定(var.equal=F)してt.testを行い、t統計量とp-valueの値を返す関数Welch_ttestを作成。
    Welch_ttest <- function(x, cl){
        x.class0 <- x[(cl == 0)]                                     #ラベルが0のものをx.class0に格納
        x.class1 <- x[(cl == 1)]                                     #ラベルが1のものをx.class1に格納
        if((sd(x.class0)+sd(x.class1)) == 0){                        #両方の群の標準偏差が共に0の場合は計算できないので...
            stat <- 0                                                #統計量を0
            pval <- 1                                                #p値を1
            return(c(stat, pval))                                    #として結果を返す
        }
        else{                                                        #A, Bどちらかの群の標準偏差が0(上記条件以外)の場合は
            hoge <- t.test(x.class1, x.class0, var.equal=F)          #通常のt検定を行って、
            return(c(hoge$statistic, hoge$p.value))                  #統計量とp値を結果として返す
        }
    }
    
    out <- t(apply(data, 1, Welch_ttest, data.cl))                   #各(行)遺伝子についてt検定を行った結果のt統計量とp値をoutに格納 
    colnames(out) <- c("t-statistic", "p-value")                     #オブジェクトoutに列名を付加している 
    tmp <- cbind(rownames(data), data, out)                          #入力データの右側にt検定結果を結合したものをtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    3. 10000行×8列分の標準正規分布に従う乱数を発生させて、A群4サンプル vs. B群4サンプルの二群間比較として解析を行う場合:
    param1 <- 4                                                      #A群のサンプル数を指定
    param2 <- 4                                                      #B群のサンプル数を指定
    param3 <- 10000                                                  #遺伝子数(行数)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #ランダムデータの生成とラベル情報の作成
    data_tmp <- rnorm(param3*(param1+param2))                        #param3*(param1+param2)個分の乱数を発生させた結果をdata_tmpに格納
    data <- matrix(data_tmp, nrow=param3)                            #param3*(param1+param2)個分の要素からなるベクトルdata_tmpを変換して(param3)個の行数からなる行列を作成した結果をdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    
    #不等分散性を仮定(var.equal=F)してt.testを行い、t統計量とp-valueの値を返す関数Welch_ttestを作成。
    Welch_ttest <- function(x, cl){
        x.class0 <- x[(cl == 0)]                                     #ラベルが0のものをx.class0に格納
        x.class1 <- x[(cl == 1)]                                     #ラベルが1のものをx.class1に格納
        if((sd(x.class0)+sd(x.class1)) == 0){                        #両方の群の標準偏差が共に0の場合は計算できないので...
            stat <- 0                                                #統計量を0
            pval <- 1                                                #p値を1
            return(c(stat, pval))                                    #として結果を返す
        }
        else{                                                        #A, Bどちらかの群の標準偏差が0(上記条件以外)の場合は
            hoge <- t.test(x.class1, x.class0, var.equal=F)          #通常のt検定を行って、
            return(c(hoge$statistic, hoge$p.value))                  #統計量とp値を結果として返す
        }
    }
    
    out <- t(apply(data, 1, Welch_ttest, data.cl))                   #各(行)遺伝子についてt検定を行った結果のt統計量とp値をoutに格納 
    colnames(out) <- c("t-statistic", "p-value")                     #オブジェクトoutに列名を付加している 
    tmp <- cbind(rownames(data), data, out)                          #入力データの右側にt検定結果を結合したものをtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    4. 入力データがdata_Singh_RMA_3274.txtの場合1:
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 50                                                     #A群のサンプル数を指定
    param2 <- 52                                                     #B群のサンプル数を指定
    
    #ランダムデータの生成とラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    #不等分散性を仮定(var.equal=F)してt.testを行い、t統計量とp-valueの値を返す関数Welch_ttestを作成。
    Welch_ttest <- function(x, cl){
        x.class0 <- x[(cl == 0)]                                     #ラベルが0のものをx.class0に格納
        x.class1 <- x[(cl == 1)]                                     #ラベルが1のものをx.class1に格納
        if((sd(x.class0)+sd(x.class1)) == 0){                        #両方の群の標準偏差が共に0の場合は計算できないので...
            stat <- 0                                                #統計量を0
            pval <- 1                                                #p値を1
            return(c(stat, pval))                                    #として結果を返す
        }
        else{                                                        #A, Bどちらかの群の標準偏差が0(上記条件以外)の場合は
            hoge <- t.test(x.class1, x.class0, var.equal=F)          #通常のt検定を行って、
            return(c(hoge$statistic, hoge$p.value))                  #統計量とp値を結果として返す
        }
    }
    
    out <- t(apply(data, 1, Welch_ttest, data.cl))                   #各(行)遺伝子についてt検定を行った結果のt統計量とp値をoutに格納 
    stat_t <- out[,1]                                                #t統計量をstat_tに格納
    rank_t <- rank(-abs(stat_t))                                     #t統計量の順位をrank_tに格納
    p_t <- out[,2]                                                   #p値をp_tに格納
    tmp <- cbind(rownames(data), data, stat_t, p_t, rank_t)          #入力データの右側に統計量、p値、その順位を結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #(A群 vs. B群) t-testでp<0.05を満たす遺伝子群のみを抽出したい場合:
    param3 <- 0.05                                                   #閾値を指定
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    sum(p_t < param3)                                                #条件を満たす遺伝子がいくつあったかを表示
    tmp2 <- tmp[p_t < param3,]                                       #条件を満たす遺伝子群の発現データをtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    #発現変動の度合いでソートした結果を得たい場合:
    out_f3 <- "hoge3.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(rank_t),]                                      #順位(rank_t)でソートした結果をtmp2に格納
    write.table(tmp2, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f3で指定したファイル名で保存。
    
    
    
    5. 入力データがdata_Singh_RMA_3274.txtの場合2(関数の定義の部分が少し違うだけです):
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 50                                                     #A群のサンプル数を指定
    param2 <- 52                                                     #B群のサンプル数を指定
    
    #必要な関数などをロード
    source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")  #Welch t-testを行うWelch_ttest関数を含むファイルをあらかじめ読み込む
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    out <- t(apply(data, 1, Welch_ttest, data.cl))                   #各(行)遺伝子についてt検定を行った結果のt統計量とp値をoutに格納 
    stat_t <- out[,1]                                                #t統計量をstat_tに格納
    rank_t <- rank(-abs(stat_t))                                     #t統計量の順位をrank_tに格納
    p_t <- out[,2]                                                   #p値をp_tに格納
    tmp <- cbind(rownames(data), data, stat_t, p_t, rank_t)          #入力データの右側に統計量、p値、その順位を結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #(A群 vs. B群) t-testでp<0.05を満たす遺伝子群のみを抽出したい場合:
    param3 <- 0.05                                                   #閾値を指定
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    sum(p_t < param3)                                                #条件を満たす遺伝子がいくつあったかを表示
    tmp2 <- tmp[p_t < param3,]                                       #条件を満たす遺伝子群の発現データをtmpに格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    #発現変動の度合いでソートした結果を得たい場合:
    out_f3 <- "hoge3.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(rank_t),]                                      #順位(rank_t)でソートした結果をtmp2に格納
    write.table(tmp2, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f3で指定したファイル名で保存。
    
    
    

    解析 | 発現変動遺伝子 | 二群間 | 対応なし | Mann-Whitney U-test

    Mann-Whitney(マンホイットニー; MW) U検定を用いて、二群間での発現変動遺伝子の同定を行う。入力データは対数変換(log2変換)後のものを例として使用してはいますが、この方法はノンパラメトリックな方法なので、対数変換していようがいまいが同じ結果を返すので、特に気にする必要はありません。

    「ファイル」−「ディレクトリの変更」で解析したいサンプルマイクロアレイデータ9中のdata_Singh_RMA_3274.txtファイルを置いてあるディレクトリに移動し、以下をコピペ 1. やり方1:
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 50                                                     #A群のサンプル数を指定
    param2 <- 52                                                     #B群のサンプル数を指定
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    #MWのU検定を行い、t統計量とp-valueの値を返す関数MW_Utestを作成。
    MW_Utest <- function(x, cl){
        x.class0 <- x[(cl == 0)]                                     #ラベルが0のものをx.class0に格納
        x.class1 <- x[(cl == 1)]                                     #ラベルが1のものをx.class1に格納
        hoge <- wilcox.test(x.class1, x.class0)                      #MWのU検定を行って、
        return(c(hoge$statistic, hoge$p.value))                      #統計量とp値を結果として返す
    }
    
    out <- t(apply(data, 1, MW_Utest, data.cl))                      #各(行)遺伝子についてMWのU検定を行った結果の統計量とp値をoutに格納 
    stat_u <- out[,1]                                                #統計量をstat_uに格納
    rank_u <- rank(-abs(stat_u))                                     #統計量の順位をrank_uに格納
    p_u <- out[,2]                                                   #p値をp_uに格納
    tmp <- cbind(rownames(data), data, stat_u, p_u, rank_u)          #入力データの右側に統計量、p値、その順位を結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #(A群 vs. B群) MWのU検定でp<0.05を満たす遺伝子群のみを抽出したい場合:
    param3 <- 0.05                                                   #閾値を指定
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    sum(p_u < param3)                                                #条件を満たす遺伝子がいくつあったかを表示
    tmp2 <- tmp[p_u < param3,]                                       #条件を満たす遺伝子群の発現データをtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    #発現変動の度合いでソートした結果を得たい場合:
    out_f3 <- "hoge3.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(rank_u),]                                      #順位(rank_u)でソートした結果をtmp2に格納
    write.table(tmp2, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f3で指定したファイル名で保存。
    
    
    
    2. やり方2(関数の定義の部分が少し違うだけです):
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 50                                                     #A群のサンプル数を指定
    param2 <- 52                                                     #B群のサンプル数を指定
    
    #必要な関数などをロード
    source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")  #Student's t-testを行うWelch_ttest関数を含むファイルをあらかじめ読み込む
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    out <- t(apply(data, 1, MW_Utest, data.cl))                      #各(行)遺伝子についてMWのU検定を行った結果の統計量とp値をoutに格納 
    stat_u <- out[,1]                                                #統計量をstat_uに格納
    rank_u <- rank(-abs(stat_u))                                     #統計量の順位をrank_uに格納
    p_u <- out[,2]                                                   #p値をp_uに格納
    tmp <- cbind(rownames(data), data, stat_u, p_u, rank_u)          #入力データの右側に統計量、p値、その順位を結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #(A群 vs. B群) MWのU検定でp<0.05を満たす遺伝子群のみを抽出したい場合:
    param3 <- 0.05                                                   #閾値を指定
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    sum(p_u < param3)                                                #条件を満たす遺伝子がいくつあったかを表示
    tmp2 <- tmp[p_u < param3,]                                       #条件を満たす遺伝子群の発現データをtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    #発現変動の度合いでソートした結果を得たい場合:
    out_f3 <- "hoge3.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(rank_u),]                                      #順位(rank_u)でソートした結果をtmp2に格納
    write.table(tmp2, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f3で指定したファイル名で保存。
    
    
    

    解析 | 発現変動遺伝子 | 二群間 | 対応なし | パターンマッチング法

    パターンマッチング法を用いて、二群間での発現変動遺伝子の同定を行うやり方を紹介します。

    「ファイル」−「ディレクトリの変更」で解析したいサンプルマイクロアレイデータ15中のsample16.txtファイル(遺伝子発現データ)とsample16_cl.txtファイル(クラスラベルデータ)を置いてあるディレクトリに移動し、以下をコピペ 1. クラスラベル情報ファイル(sample16_cl.txt)を読み込んでテンプレートパターン情報を得る場合:
    in_f1 <- "sample16.txt"                                          #入力ファイル名1(発現データ)を指定
    in_f2 <- "sample16_cl.txt"                                       #入力ファイル名2(テンプレート情報)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイル1を読み込んでdataに格納
    hoge <- read.table(in_f2, sep="\t", quote="")                    #入力ファイル2を読み込んでhogeに格納
    data.cl <- hoge[,2]                                              #テンプレートパターンベクトルdata.clを作成
    
    r <- apply(data, 1, cor, y=data.cl)                              #各(行)遺伝子についてテンプレートパターンdata.clとの相関係数を計算した結果をrに格納 
    tmp <- cbind(rownames(data), data, r)                            #入力データの右側に相関係数rのベクトルを結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    2. クラスラベル情報ファイル(sample16_cl.txt)を読み込まずにテンプレートパターン情報を得る場合:
    in_f1 <- "sample16.txt"                                          #入力ファイル名1(発現データ)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 6                                                      #A群のサンプル数を指定
    param2 <- 5                                                      #B群のサンプル数を指定
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイル1を読み込んでdataに格納
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    r <- apply(data, 1, cor, y=data.cl)                              #各(行)遺伝子についてテンプレートパターンdata.clとの相関係数を計算した結果をrに格納 
    tmp <- cbind(rownames(data), data, r)                            #入力データの右側に相関係数rのベクトルを結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    

    解析 | 発現変動遺伝子 | 二群間 | 対応あり | について

    手持ちのアレイデータが以下のような場合にこのカテゴリーに属す方法を適用します(当然比較する二群のサンプル数は同じであるべき!):
    ------------------- Aさんの正常サンプル Bさんの正常サンプル Cさんの正常サンプル ... Aさんの癌サンプル Bさんの癌サンプル Cさんの癌サンプル ... ------------------- ここでは二つの方法を紹介しています。
    一つは有名なSAM(参考文献1)のやりかたです。
    もう一つはSAMで得られた統計量を基本としつつ、シグナル強度が高い遺伝子を上位にランキングするように重みをかけた統計量を返すやり方です。 これは参考文献2のWAD統計量の重みの項だけをSAM統計量にかけた、いわばweighted SAM統計量です。
    WAD統計量はAD統計量×weightで得られるものですが、the weighted SAM統計量 = SAM統計量×weightとして計算しています。
    このweightの計算はいたってシンプルです。例えば計5遺伝子しかないとして、「gene1の対数変換後の平均シグナル強度が8, gene2の〜5, gene3の〜7, gene4の〜11, gene5の〜2」だったとすると、最も平均シグナル強度が高い遺伝子のweight=1, 最も低い遺伝子のweight=0のように規格化しているだけです。
    つまり、 gene1のweight = (8 - min(8, 5, 7, 11, 2))/(max(8, 5, 7, 11, 2) - min(8, 5, 7, 11, 2)) = (8 - 2)/(11 - 2) = 0.6666... gene2のweight = (5 - 2)/(11 - 2) = 0.3333... gene3のweight = (7 - 2)/(11 - 2) = 0.5555... gene4のweight = (11 - 2)/(11 - 2) = 1 gene5のweight = (2 - 2)/(11 - 2) = 0 です。相対平均シグナル強度をweightとしているだけです。
    ただし、A群, B群のサンプル数の違いを考慮する必要はあるので「平均シグナル強度= (mean(A) + mean(B))/2」です。
    参考文献1(Tusher et al., PNAS, 2001)
    参考文献2(Kadota et al., Algorithms Mol. Biol., 2008)

    解析 | 発現変動遺伝子 | 二群間 | 対応あり | SAM (Tusher_2001)

    Significance Analysis of Microarrays (SAM)法で「対応ありの二群間比較(two-class paired)」を行う。
    ここでは例題として用いた102サンプルからなるファイル(data_Singh_RMA_3274.txt)のラベル情報が以下のようになっていると仮定します: ------------------------ 症例 1さんの正常サンプル 症例 2さんの正常サンプル ... 症例51さんの正常サンプル 症例 1さんの腫瘍サンプル 症例 2さんの腫瘍サンプル ... 症例51さんの腫瘍サンプル ------------------------ また、このファイルはすでに底が2でlog変換されているものとします(logged2=TRUE)。
    「ファイル」−「ディレクトリの変更」で解析したいファイル(data_Singh_RMA_3274.txt)を置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 51                                                     #症例数を指定
    param3 <- 60                                                     #FDR計算のための並べ替え回数を指定(ここの数値が大きければ大きいほどより正確だがその分だけ時間がかかる。実際の解析ではサンプル数にもよるが最低でも1000程度の数を指定しましょう)
    
    #必要なパッケージをロード
    library(samr)                                                    #パッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(-(1:param1), 1:param1)                              #症例の正常と腫瘍サンプルを対にして情報を与えたベクトルdata.clを作成(症例1の正常が-1、腫瘍が1などという感じで同じ数字のプラスとマイナスで対になっていることを認識させている)
    
    data.tmp = list(x=as.matrix(data), y=data.cl, geneid=rownames(data), genenames=rownames(data), logged2=TRUE)#SAMを実行するsamr関数の入力フォーマットに合わせたdata.tmpを作成
    out <- samr(data.tmp, resp.type="Two class paired", nperms=param3)#samr関数を実行し、結果をoutに格納。
    summary(out)                                                     #outからどのような情報が抜き出せるか調べる。
    stat_sam <- out$tt                                               #SAM統計量をstat_samに格納
    rank_sam <- rank(-abs(stat_sam))                                 #統計量の絶対値でランキングした結果をrank_samに格納
    stat_fc <- log2(out$foldchange)                                  #log(FC)統計量をstat_fcに格納
    rank_fc <- rank(-abs(stat_fc))                                   #統計量の絶対値でランキングした結果をrank_fcに格納
    tmp <- cbind(rownames(data), data, stat_sam, rank_sam, stat_fc, rank_fc)#入力データの右側に「SAM統計量」「その順位」「log(FC)統計量」「その順位」を結合した結果をtmpに格納。ここでのFold changeの値はunlogged dataのaverage fold change(B群/A群)が計算されています。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    CRANのsamrのwebページ
    CRANのsamrのPDFマニュアル
    参考文献1(Tusher et al., PNAS, 2001)

    解析 | 発現変動遺伝子 | 二群間 | 対応あり | SAM (Tusher_2001)にWADのようなシグナル強度による重みをかけたい

    Significance Analysis of Microarrays (SAM)法で「対応ありの二群間比較(two-class paired)」を行う。
    が、WAD (Kadota_2008)を知っている人は「シグナル強度が高い遺伝子を上位に来るようにランキングしたい」と思います。 そこで、上記SAM統計量にWADの重みの項(weight)をかけた統計量を返すやり方をここでは紹介しています。
    下記を行って得られるhoge.txt中のweight列がWADの重みの項になります。結果として得たい統計量およびランキング結果はstat_sam_wadおよびrank_sam_wadの列になります。 確かに全体としてシグナル強度が高い遺伝子が上位にランクされていることがおわかりいただけると思います。
    ここでは例題として用いた102サンプルからなるファイル(data_Singh_RMA_3274.txt)のラベル情報が以下のようになっていると仮定します: ------------------------ 症例 1さんの正常サンプル 症例 2さんの正常サンプル ... 症例51さんの正常サンプル 症例 1さんの腫瘍サンプル 症例 2さんの腫瘍サンプル ... 症例51さんの腫瘍サンプル ------------------------ また、このファイルはすでに底が2でlog変換されているものとします(logged2=TRUE)。
    「ファイル」−「ディレクトリの変更」で解析したいファイル(data_Singh_RMA_3274.txt)を置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 51                                                     #症例数を指定
    param3 <- 60                                                     #FDR計算のための並べ替え回数を指定(ここの数値が大きければ大きいほどより正確だがその分だけ時間がかかる。実際の解析ではサンプル数にもよるが最低でも1000程度の数を指定しましょう)
    
    #必要なパッケージをロード
    library(samr)                                                    #パッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(-(1:param1), 1:param1)                              #症例の正常と腫瘍サンプルを対にして情報を与えたベクトルdata.clを作成(症例1の正常が-1、腫瘍が1などという感じで同じ数字のプラスとマイナスで対になっていることを認識させている)
    
    data.tmp = list(x=as.matrix(data), y=data.cl, geneid=rownames(data), genenames=rownames(data), logged2=TRUE)#SAMを実行するsamr関数の入力フォーマットに合わせたdata.tmpを作成
    out <- samr(data.tmp, resp.type="Two class paired", nperms=param3)#samr関数を実行し、結果をoutに格納。
    stat_sam <- out$tt                                               #SAM統計量をstat_samに格納
    rank_sam <- rank(-abs(stat_sam))                                 #統計量の絶対値でランキングした結果をrank_samに格納
    
    data.cl <- c(rep(0, param1), rep(1, param1))                     #A群を0、B群を1としたベクトルdata.clを作成
    tmp.class1 <- apply(data[,data.cl == 0], 1, mean)                #A群の(遺伝子ごとの)平均シグナル強度を計算
    tmp.class2 <- apply(data[,data.cl == 1], 1, mean)                #B群の(遺伝子ごとの)平均シグナル強度を計算
    ave_vector <- (tmp.class1 + tmp.class2)/2                        #全サンプルの(遺伝子ごとの)平均シグナル強度を計算しave_vectorに格納
    dr <- max(ave_vector) - min(ave_vector)                          #全サンプルの(遺伝子ごとの)平均シグナル強度のダイナミックレンジ(最大値-最小値)を計算しdrに格納
    weight <- (ave_vector - min(ave_vector))/dr                      #WADの重みの項を計算しweightに格納
    stat_sam_wad <- stat_sam*weight                                  #SAM統計量にWADの重みの項をかけたもの(stat_sam*weight)を計算しstat_sam_wadに格納
    rank_sam_wad <- rank(-abs(stat_sam_wad))                         #the weighted SAM統計量(stat_sam_wad)の絶対値でランキングした結果をrank_sam_wadに格納
    
    tmp <- cbind(rownames(data), data, stat_sam, rank_sam, weight, stat_sam_wad, rank_sam_wad)#入力データの右側に「SAM統計量」「その順位」「weight」「weighted SAM統計量(=SAM*weitht)」「その順位」を結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    CRANのsamrのwebページ
    CRANのsamrのPDFマニュアル
    参考文献1(Tusher et al., PNAS, 2001)

    解析 | 発現変動遺伝子 | 二群間 | 対応あり | 時系列 | について

    手持ちのアレイデータが以下のような場合にこのカテゴリーに属す方法を適用します:
    ------------------- サンプルAの薬剤投与0h後 サンプルAの薬剤投与2h後 サンプルAの薬剤投与4h後 サンプルBの薬剤投与0h後 サンプルBの薬剤投与2h後 サンプルBの薬剤投与4h後 -------------------

    解析 | 発現変動遺伝子 | 二群間 | 対応あり | 時系列 | Di Camillo's method 2 (Di Camillo_2007)

    De Camilloらの提案したMethod 2の方法(Di Camillo et al., BMC Bioinformatics, 2007)を用いて
    「Controlの時系列データ(例えばControl_0h, Control_2h, Control_6h)」と
    「目的サンプルの時系列データ(例えばTarget_0h, Target_2h, Target_6h)」
    といった二群の時系列データに対して、二群間で発現の異なるプロファイルを検出したい場合に用います。

    参考文献(Di Camillo et al., BMC Bioinformatics, 2007)
    R codeのあるウェブページ

    解析 | 発現変動遺伝子 | 二群間 | 対応あり | 時系列 | maSigPro (Conesa_2006)

    maSigPro(Conesa et al., Bioinformatics, 2006)法を用いて時系列データの中から統計的に有意な発現の異なるプロファイルを検出します。おそらく以下のコマンドで抽出するやり方でいいと思います。
    サンプルマイクロアレイデータの10bで示すような「Control (A)の時系列データ」と「Cold (B)の時系列データ」が手元にあり、「A vs. Bで発現の異なる遺伝子」を検出したいときに利用します。

    「ファイル」−「ディレクトリの変更」で解析したい時系列遺伝子発現データのファイル(sample10_2groups.txt)とその実験デザイン情報に関するファイル(sample10_2groups_cl.txt)を置いてあるディレクトリに移動し、以下をコピペ
    in_f1 <- "sample10_2groups.txt"                                  #入力ファイル名(発現データファイル)を指定
    in_f2 <- "sample10_2groups_cl.txt"                               #入力ファイル名(実験デザインファイル)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 0.1                                                    #閾値(FDR; "発現変動している"としたもののうち"本当は発現変動していない"ものが含まれる割合)を指定
    
    #必要なパッケージをロード
    library(maSigPro)                                                #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")    #発現データファイルの読み込み
    edesign <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="") #実験デザインファイルの読み込み
    
    design <- make.design.matrix(edesign, degree=2)                  #regression(回帰)行列の作成。degree=2は、2次の回帰モデルで考えることを意味する
    fit <- p.vector(data, design, Q=param1)                          #発現変動遺伝子の同定。
    tstep <- T.fit(fit)                                              #得られた発現変動遺伝子群の各々について最もよい回帰モデルを決める
    out <- get.siggenes(tstep, rsq=0.7, vars="groups")               #回帰モデルのRsquaredの値が0.7(この値がデフォルト)よりも大きいものを抽出し、outに格納
    gene_id <- out$summary$BvsA[1:out$sig.genes$BvsA$g]              #発現変動遺伝子のIDをgene_idに格納。
    gene_profile <- out$sig.genes$BvsA$sig.profiles                  #発現変動遺伝子の発現プロファイルをgene_profileに格納。
    p_masigpro <- out$sig.genes$BvsA$sig.pvalues[,1]                 #p値をp_masigproに格納。
    rank_masigpro <- rank(abs(p_masigpro))                           #p値の順位をrank_masigproに格納。
    tmp <- cbind(gene_id, gene_profile, p_masigpro, rank_masigpro)   #発現変動遺伝子についてのみ、その遺伝子ID、発現データ、p値、その順位を結合した結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #発現変動の度合いでソートした結果を得たい場合:
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(rank_masigpro),]                               #順位(rank_masigpro)でソートした結果をtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    

    BioconductorのmaSigProのwebページ

    参考文献(Conesa et al., Bioinformatics, 2006)

    解析 | 発現変動遺伝子 | 多群間 | 対応なし |について

    手持ちのアレイデータが以下のような場合にこのカテゴリーに属す方法を適用します:
    ------------------- AさんのControlサンプル BさんのControlサンプル CさんのControlサンプル Dさんの薬剤X刺激後サンプル Eさんの薬剤X刺激後サンプル Fさんの薬剤X刺激後サンプル Gさんの薬剤X刺激後サンプル Hさんの薬剤Y刺激後サンプル Iさんの薬剤Y刺激後サンプル Jさんの薬剤Y刺激後サンプル ------------------- 三群以上の比較は、どの群間で差があるのかまではANOVAなどだけでは分かりません。Rではありませんがpost hoc pattern matching (PPM) algorithm (Hulshizer and Blalock, BMC Bioinformatics, 2007)という方法が最近提唱されているのを発見しましたので、興味ある方は試してみてください。Excel (Visual Basic program)だそうです。
    ちなみにこの方法は4つのステップからなります(頭では理解できているつもりですが、うまく日本語で表現できていません、あしからず):
    1. 1-way ANOVAをやり、post hoc(その後の) testとして全てのペアワイズ比較を全遺伝子についてやる
    2. ANOVAでsignificantとされた遺伝子群の一つ一つに対して、Fisher's Protected Least Significant Difference (PLSD) testingで全てのペアワイズ比較を行った結果にユニークなパターンIDナンバーをふり、各パターンに含まれる遺伝子数を'actual'な数とする
    3. モンテカルロシミュレーションでランダムデータに対して同様のことを行い、得られた各パターンに含まれる遺伝子数を'random'な遺伝子パターンの数とする
    4. 'actual'な数の'random'な数に対するZ-scoreを計算
    ...まあ、お約束的なやり方で何の変哲もありませんね。

    他に2008/3/10に発見した論文として、ranking analysis of F-statistics (RAF) (Tan et al, BMC Bioinformatics, 2008)を紹介しておきます。サンプルサイズが小さい場合に特に有効らしいです。Availabilityについては言及していなかった(たぶん)ですが、問い合わせればプログラムはもらえるかもしれません。

    解析 | 発現変動遺伝子 | 多群間 | 対応なし | 一元配置分散分析(One-way ANOVA)

    一元配置分散分析(One-way ANOVA)を用いて、多群間での発現変動遺伝子の同定を行う。ここでは対応のない3群(A, B, C群)の解析例を示しています。が、この解析結果を受けて「”どこかの群間で差がある”とされた遺伝子に対して、ではどの群間で発現に差があるのか?」を調べるpost-hoc test(ポストホック検定;)を行うのは大変そうですね。 ちなみに一元配置分散分析に対するポストホック検定として用いられるのは「Tukey検定(総当り比較の場合)」や「Dunnet検定(コントロール群のみとの比較の場合)」らしいです。 マイクロアレイの場合、普通は「”どこかの群間で差がある”として絞り込まれた遺伝子群」に対して行う”その後の解析”はクラスタリングだろうと思っていましたが、結構真面目にpost hoc testをやっている人もいますね。
    例えば参考文献1では、ANOVA p-value < 0.01でoverall statistical testをやっておいて、その後の検定(post hoc test)としてScheffe's post hoc testでp-value < 0.05を満たす、という基準を用いています(参考文献5も同じ流れ)。 また、参考文献2では、ANOVA p-value < 0.05でoverall statistical testをやっておいて、その後の検定(post hoc test)としてTukey’s multiple comparison procedure を採用しています。 その後の解析でクラスタリングを行っている論文としては参考文献3参考文献4(これらは2-way ANOVAですが...)が挙げられます。
    ここでは例題として用いた「A群6サンプル、B群5サンプル」の計11サンプルからなる対数変換(log2変換)後のファイル(sample2_log.txt)のラベル情報が「A群3サンプル、B群3サンプル、C群5サンプル」になっていると仮定します:

    「ファイル」−「ディレクトリの変更」で解析したいファイル(sample2_log.txt)を置いてあるディレクトリに移動し、以下をコピペ 1. やり方1:
    in_f <- "sample2_log.txt"                                        #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 3                                                      #A群のサンプル数を指定
    param2 <- 3                                                      #B群のサンプル数を指定
    param3 <- 5                                                      #C群のサンプル数を指定
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(1, param1), rep(2, param2), rep(3, param3))     #A群を1、B群を2、C群を3としたベクトルdata.clを作成
    
    #Oneway ANOVAを行い、F統計量とp値を返す関数Oneway_anovaを作成。
    Oneway_anova <- function(x, cl){
        hoge <- oneway.test(x ~ cl, var=T)                           #Oneway ANOVA (一元配置分散分析)を行って、
        return(c(hoge$statistic, hoge$p.value))                      #統計量とp値を結果として返す
    }
    
    out <- t(apply(data, 1, Oneway_anova, data.cl))                  #各(行)遺伝子についてOneway ANOVAを行った結果の統計量とp値をoutに格納 
    stat_f <- out[,1]                                                #統計量をstat_fに格納
    rank_f <- rank(-abs(stat_f))                                     #統計量の順位をrank_fに格納
    p_f <- out[,2]                                                   #p値をp_fに格納
    tmp <- cbind(rownames(data), data, stat_f, p_f, rank_f)          #入力データの右側に統計量、p値、その順位を結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #Oneway ANOVA (一元配置分散分析)でp<0.05を満たす遺伝子群のみを抽出したい場合:
    param4 <- 0.05                                                   #閾値を指定
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    sum(p_f < param4)                                                #条件を満たす遺伝子がいくつあったかを表示
    tmp2 <- tmp[p_f < param4,]                                       #条件を満たす遺伝子群の発現データをtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    #発現変動の度合いでソートした結果を得たい場合:
    out_f3 <- "hoge3.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(rank_f),]                                      #順位(rank_f)でソートした結果をtmp2に格納
    write.table(tmp2, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f3で指定したファイル名で保存。
    
    
    
    2. やり方2(関数の定義の部分が少し違うだけです):
    in_f <- "sample2_log.txt"                                        #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 3                                                      #A群のサンプル数を指定
    param2 <- 3                                                      #B群のサンプル数を指定
    param3 <- 5                                                      #C群のサンプル数を指定
    
    #必要な関数などをロード
    source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")  #Oneway ANOVAを行い、F統計量とp値を返す関数Oneway_anova関数を含むファイルをあらかじめ読み込む
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(1, param1), rep(2, param2), rep(3, param3))     #A群を1、B群を2、C群を3としたベクトルdata.clを作成
    
    out <- t(apply(data, 1, Oneway_anova, data.cl))                  #各(行)遺伝子についてOneway ANOVAを行った結果の統計量とp値をoutに格納 
    stat_f <- out[,1]                                                #統計量をstat_fに格納
    rank_f <- rank(-abs(stat_f))                                     #統計量の順位をrank_fに格納
    p_f <- out[,2]                                                   #p値をp_fに格納
    tmp <- cbind(rownames(data), data, stat_f, p_f, rank_f)          #入力データの右側に統計量、p値、その順位を結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #Oneway ANOVA (一元配置分散分析)でp<0.05を満たす遺伝子群のみを抽出したい場合:
    param4 <- 0.05                                                   #閾値を指定
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    sum(p_f < param4)                                                #条件を満たす遺伝子がいくつあったかを表示
    tmp2 <- tmp[p_f < param4,]                                       #条件を満たす遺伝子群の発現データをtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    #発現変動の度合いでソートした結果を得たい場合:
    out_f3 <- "hoge3.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(rank_f),]                                      #順位(rank_f)でソートした結果をtmp2に格納
    write.table(tmp2, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f3で指定したファイル名で保存。
    
    
    
    参考文献1(Norris et al., J. Neurosci., 2005)
    参考文献2(Wu et al., BBRC., 2007)
    参考文献3(Yagil et al., Circ. Res., 2005)
    参考文献4(Poulsen et al., J. Neurochem., 2005)
    参考文献5(Mougeot et al., J. Mol. Biol., 2006)

    解析 | 発現変動遺伝子 | 多群間 | 対応なし | Kruskal-Wallis(クラスカル-ウォリス)検定

    Kruskal-Wallis (KW)検定を用いて、多群間での発現変動遺伝子の同定を行う。ここでは対応のない3群(A, B, C群)の解析例を示しています。が、この解析結果を受けて「”どこかの群間で差がある”とされた遺伝子に対して、ではどの群間で発現に差があるのか?」を調べるpost-hoc test(ポストホック検定;)を行うのは大変そうですね。ちなみにKruskal-Wallis検定に対するポストホック検定として用いられるのは「Nemenyi検定」や「ボンフェローニ補正Mann-Whitney検定」らしいです。 この方法はPubMedで調べても、実際にはほとんど使われていないようですね。ANOVAのほうは非常に頻繁に用いられるようですが...。

    ここでは例題として用いた「A群6サンプル、B群5サンプル」の計11サンプルからなる対数変換(log2変換)後のファイル(sample2_log.txt)のラベル情報が「A群3サンプル、B群3サンプル、C群5サンプル」になっていると仮定します:

    「ファイル」−「ディレクトリの変更」で解析したいファイル(sample2_log.txt)を置いてあるディレクトリに移動し、以下をコピペ 1. やり方1:
    in_f <- "sample2_log.txt"                                        #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 3                                                      #A群のサンプル数を指定
    param2 <- 3                                                      #B群のサンプル数を指定
    param3 <- 5                                                      #C群のサンプル数を指定
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(1, param1), rep(2, param2), rep(3, param3))     #A群を1、B群を2、C群を3としたベクトルdata.clを作成
    
    #KW検定を行い、統計量とp値を返す関数Kruskal_wallisを作成。
    Kruskal_wallis <- function(x, cl){
        hoge <- kruskal.test(x ~ cl)                                 #KW検定を行って、
        return(c(hoge$statistic, hoge$p.value))                      #統計量とp値を結果として返す
    }
    
    out <- t(apply(data, 1, Kruskal_wallis, data.cl))                #各(行)遺伝子についてKW検定検定を行った結果の統計量とp値をoutに格納 
    stat_kw <- out[,1]                                               #統計量をstat_kwに格納
    rank_kw <- rank(-abs(stat_kw))                                   #統計量の順位をrank_kwに格納
    p_kw <- out[,2]                                                  #p値をp_kwに格納
    tmp <- cbind(rownames(data), data, stat_kw, p_kw, rank_kw)       #入力データの右側に統計量、p値、その順位を結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #KW検定でp<0.05を満たす遺伝子群のみを抽出したい場合:
    param4 <- 0.05                                                   #閾値を指定
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    sum(p_kw < param4)                                               #条件を満たす遺伝子がいくつあったかを表示
    tmp2 <- tmp[p_kw < param4,]                                      #条件を満たす遺伝子群の発現データをtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    #発現変動の度合いでソートした結果を得たい場合:
    out_f3 <- "hoge3.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(rank_kw),]                                     #順位(rank_kw)でソートした結果をtmp2に格納
    write.table(tmp2, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f3で指定したファイル名で保存。
    
    
    
    2. やり方2(関数の定義の部分が少し違うだけです):
    in_f <- "sample2_log.txt"                                        #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 3                                                      #A群のサンプル数を指定
    param2 <- 3                                                      #B群のサンプル数を指定
    param3 <- 5                                                      #C群のサンプル数を指定
    
    #必要な関数などをロード
    source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")  #KW検定を行い、統計量とp値を返す関数Kruskal_wallis関数を含むファイルをあらかじめ読み込む
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(1, param1), rep(2, param2), rep(3, param3))     #A群を1、B群を2、C群を3としたベクトルdata.clを作成
    
    out <- t(apply(data, 1, Kruskal_wallis, data.cl))                #各(行)遺伝子についてKW検定検定を行った結果の統計量とp値をoutに格納 
    stat_kw <- out[,1]                                               #統計量をstat_kwに格納
    rank_kw <- rank(-abs(stat_kw))                                   #統計量の順位をrank_kwに格納
    p_kw <- out[,2]                                                  #p値をp_kwに格納
    tmp <- cbind(rownames(data), data, stat_kw, p_kw, rank_kw)       #入力データの右側に統計量、p値、その順位を結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #KW検定でp<0.05を満たす遺伝子群のみを抽出したい場合:
    param4 <- 0.05                                                   #閾値を指定
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    sum(p_kw < param4)                                               #条件を満たす遺伝子がいくつあったかを表示
    tmp2 <- tmp[p_kw < param4,]                                      #条件を満たす遺伝子群の発現データをtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    #発現変動の度合いでソートした結果を得たい場合:
    out_f3 <- "hoge3.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(rank_kw),]                                     #順位(rank_kw)でソートした結果をtmp2に格納
    write.table(tmp2, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f3で指定したファイル名で保存。
    
    
    

    解析 | 発現変動遺伝子 | 組織特異的(選択的)パターンについて

    手持ちのアレイデータが以下のような場合にこのカテゴリーに属す方法を適用します(色々な種類のサンプルが沢山ある場合):
    ------------------- サンプルA サンプルB サンプルC サンプルD サンプルE サンプルF サンプルG サンプルH サンプルI サンプルJ サンプルK サンプルL サンプルM ... ------------------- 私はROKUを使います。
    ROKUは二つの方法を組み合わせたものです。
    1. 「全体的な組織特異性の度合い」で遺伝子をランキング(エントロピーの低いものほどより組織特異的)
    このとき、予めデータ変換したものに対してエントロピーを計算することで、組織特異的高発現だけでなく、 特異的低発現パターンなども検出可能という点でデータ変換せずにそのままエントロピーを計算するSchug's H(x) statisticよりも優れていることがROKUKadota et al., 2006)論文中で示されています。
    2. 「特異的なパターンを示す組織の検出」のために赤池情報量規準(AIC)に基づく方法で、特異的組織を外れ値として検出
    単にエントロピーでランキングしただけでは、どこかの組織で特異的な遺伝子が上位にランキングされるだけで、どの組織で特異的なのかという情報は与えてくれません。そのために2番目の手順が必要になります。 ROKU論文(Kadota et al., 2006)中では単に「ここではAICに基づく方法を用いる」と書いており、同じ枠組みで結果を返す他の方法(Sprent's non-parametric method)が優れている可能性がROKUKadota et al., 2006)論文発表時にはまだ残されていました。
    しかし、両者の比較解析論文(Kadota et al., 2007)で、「AICに基づく方法」が「Sprent's non-parametric method」よりも優れていることを結論づけています。
    それゆえ→最初の文章に戻る

    しかし、この方法にも欠点があります。
    一つは「遺伝子ごとにROKU法によって得られたエントロピー値を計算してるが、全体のダイナミックレンジを考慮していない」です。
    これは例えば10000genes×10samplesの遺伝子発現行列データがあったとして、その中の数値の最大値が23000, 最小値が1だったとします。 ある遺伝子の発現ベクトル(1,1,1,1,1,2,1,1,1,1)のエントロピーはROKU法では0となり、左から6番目の組織特異的高発現という判断が下され(てしまい)ますが、同じエントロピーが0の遺伝子ベクトルでも例えば(10000,5,5,5,5,5,5,5,5,5)のほうがより確からしいですよね。
    もう一つは、ROKU法では、単にエントロピーの低い順にランキングするだけで、どの程度低ければいいのか?という指標は与えられていません...。

    (組織特異的遺伝子検出を目的としたものではありませんが...)QDMR法 (Zhang et al., Nucleic Acids Res., 2011)という方法が最近提案されています。 論文自体は、ゲノム中のサンプル間でDNAメチル化の程度が異なる領域(differentially methylated regions; DMRs)を定量化しようという試みの論文ですが、 regionをgeneと読み替えれば、組織特異的遺伝子検出法ROKUの改良版そのもの、ですよね?!

    解析 | 発現変動遺伝子 | 組織特異的(選択的)発現遺伝子 | ROKU

    ROKU(Kadota et al., BMC Bioinformatics, 7, 294, 2006)を用いて、遺伝子発現行列中の遺伝子を全体的な組織特異性の度合いでランキングします。 ROKUは、“組織特異的低発現パターンなど様々な特異的発現パターンを統一的にランキング可能である”という点において、Schug's H(x) statisticの改良版という位置づけになります。
    遺伝子ベクトル中の要素が全て同じ値のときにエラーが出るバグを修正しました(2007/10/1追加)。
    以下を実行して得られる「ファイル(hoge.txt)中の“最後の列(entropy_score列)”の数値」が、「ROKU論文中のAdditional file 1(Suppl.xls)の“H(x')列”の数値」と対応しています。
    このentropy_score列で昇順にソートすることで、全体的な組織特異性の度合いでランキングしていることになります。つまり、上位が「(どの組織で特異的かはこのスコアだけでは分からないが)組織特異性が高い遺伝子」ということになります。 ファイル(hoge.txt)中の残りの結果は「1:特異的高発現、-1:特異的低発現、0:その他」からなる「外れ値行列」なので、 例えば、組織A and Bで1, それ以外の組織で0を示す遺伝子(群)は「AとB特異的高発現遺伝子」ということになります。

    「ファイル」−「ディレクトリの変更」で解析したいファイル(遺伝子発現データ:GDS1096_rma.txt、テンプレートパターン:GDS1096_cl_heart.txt)を置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "GDS1096_rma.txt"                                        #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要な関数などをロード
    source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")  #ROKUを実行するkadota_2006_bmc_bioinformatics関数を含むファイルをあらかじめ読み込む
    library(affy)                                                    #Tukey's Biweightを計算するためのtukey.biweight関数が含まれているパッケージの読み込み
    library(som)                                                     #各遺伝子発現ベクトルを正規化(平均=0, 標準偏差=1)するためのnormalize関数が含まれているパッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    data.z <- normalize(data, byrow=TRUE)                            #正規化を実行し、結果をdata.zに格納
    out <- t(apply(data.z, 1, kadota_2003_physiol_genomics_0.25))    #各遺伝子発現ベクトルについて、Ueda's AIC-based methodを適用し、「特異的高発現=1, 低発現=-1, それ以外=0」の三状態の結果を返す
    colnames(out) <- colnames(data)                                  #outの列名をdataの列名で置換する
    entropy_score <- apply(data, 1, kadota_2006_bmc_bioinformatics)  #一行(一遺伝子)づつ、遺伝子発現ベクトルxを変換(x' = |x - Tbw|> )してからエントロピーH(x')を計算し、entropy_scoreに格納 
    tmp <- cbind(rownames(data), out, entropy_score)                 #左端の列が遺伝子ID, 次にサンプル数分だけの列からなる「外れ値行列情報」、そして最後の列にエントロピー値H(x')からなる行列としてtmpに格納 
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #心臓特異的高発現遺伝子群のみのサブセットをentropy_scoreの低い順に得たい場合:
    in_f2 <- "GDS1096_cl_heart.txt"                                  #入力ファイル名2(心臓で1、それ以外で0のテンプレートパターンファイル)を指定
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    library(genefilter)                                              #似た発現パターンを示す遺伝子をランキングするためのgenefinder関数が含まれているパッケージの読み込み
    data_cl <- read.table(in_f2, sep="\t", quote="")                           #入力ファイル2を読み込んでdata_clに格納
    template <- data_cl[,2]                                          #バイナリ(0 or 1)情報(2列目)のみ抽出し、templateに格納
    tmp <- rbind(out, template)                                      #templateというテンプレートパターンを得られたはずれ値行列outの最後の行に追加した結果をtmpに格納
    closeg <- genefinder(tmp, nrow(out)+1, nrow(out))                #特異的発現の度合いでランキングされた結果をclosegに格納
    obj <- closeg[[1]]$indices[closeg[[1]]$dists == 0]               #テンプレートと完全に同じ遺伝子の行番号情報をobjに格納
    length(obj)                                                      #目的の特異的発現遺伝子がいくつあったかを表示
    tmp <- cbind(rownames(data), data, entropy_score)                #入力データの右側にエントロピー値H(x')を結合した結果をtmpに格納
    tmp2 <- tmp[obj,]                                                #行列tmpの中からobjで示された行番号に相当する行のみ抽出してtmp2に格納
    tmp3 <- tmp2[order(tmp2$entropy_score),]                         #目的の特異的発現遺伝子群をエントロピーの低い順にソートしてtmp3に格納
    write.table(tmp3, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp3の中身をout_f2で指定したファイル名で保存。
    
    #全遺伝子をentropy_scoreの低い順にソートした結果を得たい場合:
    out_f3 <- "hoge3.txt"                                            #出力ファイル名を指定
    tmp <- cbind(rownames(data), out, entropy_score)                 #左端の列が遺伝子ID, 次にサンプル数分だけの列からなる「外れ値行列情報」、そして最後の列にエントロピー値H(x')からなる行列としてtmpに格納 
    tmp2 <- tmp[order(entropy_score),]                               #順位(entropy_score)でソートした結果をtmp2に格納
    write.table(tmp2, out_f3, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f3で指定したファイル名で保存。
    
    
    
    おまけまでやって得られるhoge2.txtをエクセルなどで開くと、心臓特異的高発現遺伝子が231個検出されていることがわかります。ここまで(231個のうちのどれが一番特異的な遺伝子かなどはわからないということ)しかできなかったのがUeda's AIC-based methodですが、ROKUではエントロピーH(x')も計算するので、得られたサブセット内のランキング(hoge.txt中の“最後の列”H(x')の低い順にソート)が可能になりました。

    CRANのsomのwebページ
    CRANのsomのPDFマニュアル

    Bioconductorのgenefilterのwebページ

    参考文献(Kadota et al., BMC Bioinformatics, 2006)

    解析 | 発現変動遺伝子 | 組織特異的(選択的)発現遺伝子 | Sprent's non-parametric method

    Ge et al., Genomics, 86(2), 127-141, 2005で用いられた方法です。一つ一つの遺伝子の発現パターン(遺伝子発現ベクトルx)に対して、特異的高(and/or 低)発現組織の有無を一意的に返してくれるという点でUeda's AIC-based methodと同じです。 ちなみにこの方法よりもUeda's AIC-based methodのほうが優れていることが参考文献1で示されています。
    やっていることは非常にシンプルで、
    1. 各遺伝子発現ベクトルを独立に中央値を=0、MAD=1になるようにスケーリング
    2. データ変換後の値の絶対値がXより大きい組織を"特異的組織"とする
    を行っているだけです。
    ちなみにこのやり方を採用した原著論文(Ge et al., Genomics, 2005)ではX=5としているので、ここではX=5とした場合の解析例を示します。
    以下を実行して得られるファイル(hoge.txt)中の結果は「1:特異的高発現、-1:特異的低発現、0:その他」からなる「外れ値行列」なので、 例えば、組織A and Bで1, それ以外の組織で0を示す遺伝子(群)は「AとB特異的高発現遺伝子」ということになります。

    「ファイル」−「ディレクトリの変更」で解析したいファイル(遺伝子発現データ:GDS1096_rma.txt、テンプレートパターン:GDS1096_cl_heart.txt)を置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "GDS1096_rma.txt"                                        #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 5                                                      #Xの値を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    data.t <- t(data)                                                #行列の転置(この後に使うscale関数が列ごとの操作を行うため、scale関数をそのまま使えるように予め行列を入れ替えておく必要があるため)
    data.t.m.mad <- scale(data.t, apply(data.t, 2, median), apply(data.t, 2, mad, constant=1))#各列のmedian=0, MAD=1になるようにスケーリングし、結果をdata.t.m.madに格納
    data.m.mad <- t(data.t.m.mad)                                    #scale関数の適用が終わったので、もう一度行列の転置を行って元に戻し、結果をdata.m.madに格納
    out <- data.m.mad                                                #out.m.madをoutにコピー
    out[(out <= param1) & (out >= -param1)] <- 0                     #スケーリング後の値で"-param1"以上"param1"以下の値を0に置換
    out[out < -param1] <- -1                                         #スケーリング後の値で-param1未満の値を-1に置換
    out[out > param1] <- 1                                           #スケーリング後の値でparam1より大きい値を1に置換
    colnames(out) <- colnames(data)                                  #outの列名をdataの列名で置換する
    tmp <- cbind(rownames(data), out)                                #遺伝子IDの右側に, サンプル数分だけの「外れ値行列」を結合した結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #心臓特異的高発現遺伝子群のみのサブセットを得たい場合:
    in_f2 <- "GDS1096_cl_heart.txt"                                  #入力ファイル名2(心臓で1、それ以外で0のテンプレートパターンファイル)を指定
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    library(genefilter)                                              #似た発現パターンを示す遺伝子をランキングするためのgenefinder関数が含まれているパッケージの読み込み
    data_cl <- read.table(in_f2, sep="\t", quote="")                           #入力ファイル2を読み込んでdata_clに格納
    template <- data_cl[,2]                                          #バイナリ(0 or 1)情報(2列目)のみ抽出し、templateに格納
    tmp <- rbind(out, template)                                      #templateというテンプレートパターンを得られたはずれ値行列outの最後の行に追加した結果をtmpに格納
    closeg <- genefinder(tmp, nrow(out)+1, nrow(out))                #特異的発現の度合いでランキングされた結果をclosegに格納
    obj <- closeg[[1]]$indices[closeg[[1]]$dists == 0]               #テンプレートと完全に同じ遺伝子の行番号情報をobjに格納
    length(obj)                                                      #目的の特異的発現遺伝子がいくつあったかを表示
    tmp <- cbind(rownames(data[obj,]), data[obj,])                   #dataの中からobjで示された行番号に相当する行のみの遺伝子IDと発現データを結合してtmpに格納 
    write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f2で指定したファイル名で保存。
    
    
    
    参考文献1(Kadota et al., GRSB, 2007)

    解析 | 発現変動遺伝子 | 組織特異的(選択的)発現遺伝子 | Schug's H(x) statistic

    一つ一つの遺伝子の発現パターン(遺伝子発現ベクトルx)に対して、そのエントロピーH(x)を計算します。エントロピーが低い(最小値は0)ほど、その遺伝子の組織特異性の度合いが高いことを意味します。また逆に、エントロピーが高い(最大値はlog2(組織数); 例えば解析組織数が16の場合はlog2(16)=4が最大値となる)ほど、その遺伝子の組織特異性の度合いが低いことを意味します。
    したがって、ここでは各遺伝子についてエントロピーH(x)を計算したのち、H(x)で昇順にソートした結果を出力するところまで行います。但し、エントロピーが低いからといって、どの組織で特異的発現を示すかまでは教えてくれないという弱点があるため、目的組織を指定することは原理的(数式的)に不可能です。
    使い方としては、様々な実験条件のデータが手元にあった場合などで、「どの条件でもいいから特異的な発現パターンを示す遺伝子を上位からソートしたい」ような場合に使えますが、この方法の改良版ROKUのほうが、“組織特異的低発現パターンなど様々な特異的発現パターンを統一的にランキング可能である”という点において理論的にも実際上も優れているので、この目的においてはROKUを利用することをお勧めします。

    「ファイル」−「ディレクトリの変更」で解析したい遺伝子発現行列のファイルを置いてあるディレクトリに移動し、以下をコピペ 1. 入力ファイルがGDS1096_rma.txtの場合:
    in_f <- "GDS1096_rma.txt"                                        #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要な関数などをロード
    source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")  #エントロピーを計算するshannon.entropy関数を含むファイルをあらかじめ読み込む
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    entropy_score <- apply(data, 1, shannon.entropy)                 #エントロピーを計算した結果をentropy_scoreに格納 
    tmp <- cbind(rownames(data), data, entropy_score)                #入力データの右側に計算したentropy_scoreを結合した結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #全遺伝子をentropy_scoreの低い順にソートした結果を得たい場合:
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(entropy_score),]                               #順位(entropy_score)でソートした結果をtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    
    2. 入力ファイルがsample15.txtの場合:
    in_f <- "sample15.txt"                                           #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要な関数などをロード
    source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")  #エントロピーを計算するshannon.entropy関数を含むファイルをあらかじめ読み込む
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    entropy_score <- apply(data, 1, shannon.entropy)                 #エントロピーを計算した結果をentropy_scoreに格納 
    tmp <- cbind(rownames(data), data, entropy_score)                #入力データの右側に計算したentropy_scoreを結合した結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #全遺伝子をentropy_scoreの低い順にソートした結果を得たい場合:
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(entropy_score),]                               #順位(entropy_score)でソートした結果をtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    
    参考文献 (Schug et al., Genome Biol., 2005)

    解析 | 発現変動遺伝子 | 組織特異的(選択的)発現遺伝子 | Schug's Q statistic

    Schugらの方法(Entropy-based Q-statistic)を用いて、任意の1組織(と他の少数の組織)で特異的に発現している遺伝子をランキングします。Schug's H(x) statisticの方法は「どの組織で特異的発現を示すかまでは教えてくれない」という弱点がありました。 その1つの解決策としてSchugらが提案している「指定した目的組織(と他の少数の組織)」で特異的な発現パターンを示す遺伝子を上位からランキングする統計量Qを計算します。
    最終的に得られるhoge.txtファイルをエクセルなどで開いて、目的組織に相当するカラムでQ-statisticを昇順にソートすれば、目的組織特異的遺伝子をランキングすることができます。
    しかし、この方法は目的組織以外の組織でも発現しているようなパターンが上位に来てしまう場合があるという弱点があります。この弱点を改善した方法がROKUです。

    「ファイル」−「ディレクトリの変更」で解析したい遺伝子発現行列のファイル(GDS1096_rma.txt)を置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "GDS1096_rma.txt"                                        #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要な関数などをロード
    source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")  #Schug's Q statisticを計算するshannon.entropy.q関数を含むファイルをあらかじめ読み込む
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    entropy_score <- apply(data, 1, shannon.entropy)                 #エントロピーを計算した結果をentropy_scoreに格納 
    q_score <- t(apply(data, 1, shannon.entropy.q))                  #Schug's Q statisticを計算した結果をq_scoreに格納 
    tmp <- cbind(rownames(data), q_score, entropy_score)             #遺伝子IDの右側に計算したQスコアの行列とentropy_scoreを結合した結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #入力データの左からX番目の組織について特異性の度合いの高い順(その列のQスコアの低い順)にソートした結果を得たい場合:
    #(X=2の場合は"Amygdala"に相当します)
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    param1 <- 2                                                      #Xの値を指定
    tmp2 <- tmp[order(q_score[,param1]),]                            #行列q_scoreを"param1"列でソートした結果をtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    
    参考文献(Schug et al., Genome Biol., 2005)

    解析 | 発現変動遺伝子 | 組織特異的(選択的)発現遺伝子 | Ueda's AIC-based method

    Kadota et al., Physiol. Genomics, 12(3), 251-259, 2003で提案された方法です。一つ一つの遺伝子の発現パターン(遺伝子発現ベクトルx)に対して、特異的高(and/or 低)発現組織の有無を一意的に返してくれます。 この方法は、ROKUの要素技術として使われており、実際の解析にはROKUの利用をお勧めします。 尚、用いている関数("kadota_2003_physiol_genomics_0.50" for Ueda's AIC-based method; "kadota_2003_physiol_genomics_0.25" for ROKU)が両者で微妙に違いますが、 これは論文との整合性(Kadota et al., Physiol. Genomics, 12(3), 251-259, 2003論文中では探索する最大外れ値候補数を全サンプル数の50%に設定;ROKU(Kadota et al., BMC Bioinformatics, 7, 294, 2006)論文中では25%に設定)をとっているためです。
    競合する方法にSprent's non-parametric methodがありますが、それよりも優れていることが参考文献1で示されています。
    以下を実行して得られるファイル(hoge.txt)中の結果は「1:特異的高発現、-1:特異的低発現、0:その他」からなる「外れ値行列」なので、 例えば、組織A and Bで1, それ以外の組織で0を示す遺伝子(群)は「AとB特異的高発現遺伝子」ということになります。

    「ファイル」−「ディレクトリの変更」で解析したいファイル(遺伝子発現データ:GDS1096_rma.txt、テンプレートパターン:GDS1096_cl_heart.txt)を置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "GDS1096_rma.txt"                                        #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要な関数などをロード
    source("http://www.iu.a.u-tokyo.ac.jp/~kadota/R/R_functions.R")  #Ueda's AIC-based methodを実行するkadota_2003_physiol_genomics_0.50関数を含むファイルをあらかじめ読み込む
    library(som)                                                     #各遺伝子発現ベクトルを正規化(平均=0, 標準偏差=1)するためのnormalize関数が含まれているパッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    data.z <- normalize(data, byrow=TRUE)                            #正規化を実行し、結果をdata.zに格納
    out <- t(apply(data.z, 1, kadota_2003_physiol_genomics_0.50))    #各遺伝子発現ベクトルについて、Ueda's AIC-based methodを適用し、「特異的高発現=1, 低発現=-1, それ以外=0」の三状態の結果を返す
    colnames(out) <- colnames(data)                                  #outの列名をdataの列名で置換する
    tmp <- cbind(rownames(data), out)                                #左端の列が遺伝子IDとサンプル数分だけの列からなる「外れ値行列」を結合してtmpに格納 
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #心臓特異的高発現遺伝子群のみのサブセットを得たい場合:
    in_f2 <- "GDS1096_cl_heart.txt"                                  #入力ファイル名2(心臓で1、それ以外で0のテンプレートパターンファイル)を指定
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    library(genefilter)                                              #似た発現パターンを示す遺伝子をランキングするためのgenefinder関数が含まれているパッケージの読み込み
    data_cl <- read.table(in_f2, sep="\t", quote="")                           #入力ファイル2を読み込んでdata_clに格納
    template <- data_cl[,2]                                          #バイナリ(0 or 1)情報(2列目)のみ抽出し、templateに格納
    tmp <- rbind(out, template)                                      #templateというテンプレートパターンを得られたはずれ値行列outの最後の行に追加した結果をtmpに格納
    closeg <- genefinder(tmp, nrow(out)+1, nrow(out))                #特異的発現の度合いでランキングされた結果をclosegに格納
    obj <- closeg[[1]]$indices[closeg[[1]]$dists == 0]               #テンプレートと完全に同じ遺伝子の行番号情報をobjに格納
    length(obj)                                                      #目的の特異的発現遺伝子がいくつあったかを表示
    tmp <- cbind(rownames(data[obj,]), data[obj,])                   #dataの中からobjで示された行番号に相当する行のみの遺伝子IDと発現データを結合してtmpに格納 
    write.table(tmp, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_f2で指定したファイル名で保存。
    
    
    
    CRANのsomのwebページ
    CRANのsomのPDFマニュアル
    参考文献1(Kadota et al., GRSB, 2007)

    解析 | 発現変動遺伝子 | 組織特異的(選択的)発現遺伝子 | パターンマッチング法(テンプレートマッチング法)

    (基本的には、解析 | 似た発現パターンを持つ遺伝子の同定をご覧ください。)
    パターンマッチング法を用いて、指定した理想的なパターンとの類似度が高い遺伝子の同定を行うやり方を紹介します。

    「ファイル」−「ディレクトリの変更」で解析したいサンプルマイクロアレイデータ14中のsample15.txtファイル(遺伝子発現データ)とsample15_cl.txtファイル(sample4で特異的高発現パターンを検出するためのテンプレートパターンのデータ)を置いてあるディレクトリに移動し、以下をコピペ 1. 基本形:
    in_f1 <- "sample15.txt"                                          #入力ファイル名1(発現データ)を指定
    in_f2 <- "sample15_cl.txt"                                       #入力ファイル名2(テンプレート情報)を指定
    out_f <- "hoge1.txt"                                             #出力ファイル名を指定
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイル1を読み込んでdataに格納
    hoge <- read.table(in_f2, sep="\t", quote="")                    #入力ファイル2を読み込んでhogeに格納
    data.cl <- hoge[,2]                                              #テンプレートパターンベクトルdata.clを作成
    
    r <- apply(data, 1, cor, y=data.cl)                              #各(行)遺伝子についてテンプレートパターンdata.clとの相関係数を計算した結果をrに格納 
    
    tmp <- cbind(rownames(data), data, r)                            #入力データの右側に相関係数rのベクトルを結合した結果をtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    
    2. 相関係数の高い順(降順)にソートしたい場合:
    in_f1 <- "sample15.txt"                                          #入力ファイル名1(発現データ)を指定
    in_f2 <- "sample15_cl.txt"                                       #入力ファイル名2(テンプレート情報)を指定
    out_f <- "hoge2.txt"                                             #出力ファイル名を指定
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイル1を読み込んでdataに格納
    hoge <- read.table(in_f2, sep="\t", quote="")                    #入力ファイル2を読み込んでhogeに格納
    data.cl <- hoge[,2]                                              #テンプレートパターンベクトルdata.clを作成
    
    r <- apply(data, 1, cor, y=data.cl)                              #各(行)遺伝子についてテンプレートパターンdata.clとの相関係数を計算した結果をrに格納 
    
    tmp <- cbind(rownames(data), data, r)                            #入力データの右側に相関係数rのベクトルを結合した結果をtmpに格納。
    tmp2 <- tmp[order(r, decreasing=TRUE),]                          #相関係数で降順にソート結果をtmp2に格納。
    write.table(tmp2, out_f, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_fで指定したファイル名で保存。
    
    
    
    3. 相関係数の低い順(昇順)にソートしたい場合:
    in_f1 <- "sample15.txt"                                          #入力ファイル名1(発現データ)を指定
    in_f2 <- "sample15_cl.txt"                                       #入力ファイル名2(テンプレート情報)を指定
    out_f <- "hoge3.txt"                                             #出力ファイル名を指定
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイル1を読み込んでdataに格納
    hoge <- read.table(in_f2, sep="\t", quote="")                    #入力ファイル2を読み込んでhogeに格納
    data.cl <- hoge[,2]                                              #テンプレートパターンベクトルdata.clを作成
    
    r <- apply(data, 1, cor, y=data.cl)                              #各(行)遺伝子についてテンプレートパターンdata.clとの相関係数を計算した結果をrに格納 
    
    tmp <- cbind(rownames(data), data, r)                            #入力データの右側に相関係数rのベクトルを結合した結果をtmpに格納。
    tmp2 <- tmp[order(r, decreasing=FALSE),]                         #相関係数で昇順にソート結果をtmp2に格納。
    write.table(tmp2, out_f, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_fで指定したファイル名で保存。
    
    
    

  • 解析 | 発現変動遺伝子の同定 | 時系列データ | Periodic genes | Lomb-Scargle periodogram (Glynn_2006)

  • 周期性解析によく用いられる方法としてはFast Fourier Transform (FFT) アルゴリズムがありますが、この方法は1) time-pointの間隔が等しくなければいけない, 2) 欠損値があってはいけない、という制約がありました。 Lomb-Scargle periodogram(Glynn et al., Bioinformatics, 2006)を用いることで上記2つの条件を満たさない場合でもうまく取り扱ってくれるようです。もちろん、False Discovery Rate (FDR)をコントロールして有意なperiodicな発現パターンを検出してくれます。

    1. LombScargle.zipファイルをデスクトップにダウンロード
    2. R上ではなく(つまり、「パッケージ」-「ローカルにあるzipファイルからのパッケージのインストール」ではない!!ということ)、普通にLombScargle.zipファイルを解凍
    3. Step-by-Step Instructionsを参考にしながら、自分の時系列データを解析

    参考文献(Glynn et al., Bioinformatics, 2006)
    著者らの(Lomb-Scargle)ウェブページ

    解析 | 発現変動遺伝子の同定 | 時系列データ | Periodic genes | GeneCycle (Ahdesmaki_2005)

    参考文献1, 2の方法を実装したものです。
    ここでは、参考文献3(Laub et al., Science, 2000)の0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150minの計11 time points×1,444 genes (ORFs)からなる時系列データ(sample12.txt)解析を例示します。

    「ファイル」−「ディレクトリの変更」で解析したいファイル(sample12.txt)を置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "sample12.txt"                                           #入力ファイル名を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(GeneCycle)                                               #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    out1 <- avgp(t(data))                                            #平均のピリオドグラムを計算し周波数(frequency)成分ごとの平均パワースペクトル密度(average power spectral density)の結果をout1に格納
    out2 <- t(dominant.freqs(t(data),3))                             #dominantな周波数(frequency)成分の上位3つをout2に格納
    tmp_p <- fisher.g.test(t(data))                                  #Fisher’s Exact g Testを行って得たp値をtmp_pに格納
    tmp_fdr <- fdrtool(tmp_p, statistic="pvalue")                    #False Discovery Rate (FDR)を計算した結果をtmp_fdrに格納
    tmp_robust_p <- robust.g.test(robust.spectrum(t(data)))          #Fisher’s Exact g Testのa robust nonparametric versionでp値を計算した結果をtmp_robust_pに格納
    p_gc <- tmp_fdr$pval                                             #p値をp_gcに格納
    lfdr_gc <- tmp_fdr$lfdr                                          #local FDR値をlfdr_gcに格納
    tmp <- cbind(rownames(data), data, p_gc, lfdr_gc)                #入力データの右側にp値、local FDRを結合した結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #(local)FDRがX未満(たとえば0.1を指定するとこの閾値を満たす遺伝子数のうち本当は発現変動遺伝子でないものが含まれる割合を0.1)の遺伝子数を表示したい場合:
    param1 <- 0.1                                                    #Xの値を指定
    sum(fdr_gc$lfdr < param1)                                        #条件を満たす遺伝子数を表示
    
    #平均のピリオドグラムを得たい場合:
    avgp(t(data))                                                    #平均のピリオドグラムを計算し周波数(frequency)成分ごとの平均パワースペクトル密度(average power spectral density)の結果をout1に格納
    
    #dominantな周波数(frequency)成分の上位3つを得たい場合:
    out2 <- t(dominant.freqs(t(data),3))                             #dominantな周波数(frequency)成分の上位3つをout2に格納
    dim(out2)                                                        #out2の行数と列数を表示(1441遺伝子の一つにつき上位3つの周波数成分が格納されているので1441行3列になる)
    
    
    
    GeneCycleのウェブページ
    CRANのGeneCycleのwebページ
    CRANのGeneCycleのPDFマニュアル
    参考文献1(Ahdesmaki et al., BMC Bioinformatics, 2005)
    参考文献2(Wichert et al., Bioinformatics, 2004)
    参考文献3(Laub et al., Science, 2000)

    解析 | 発現変動遺伝子 | 時系列データ | non-periodic genes | について

    手持ちのアレイデータが以下のような場合にこのカテゴリーに属す方法を適用します(いわゆる「経時変化遺伝子」を検出したいとき):
    ------------------- サンプルAの刺激後 0Hのデータ サンプルAの刺激後 1Hのデータ サンプルAの刺激後 6Hのデータ サンプルAの刺激後24Hのデータ -------------------

    解析 | 発現変動遺伝子 | 時系列データ | non-periodic genes | BETR (Aryee_2009)

    BETR(Aryee et al., BMC Bioinformatics, 2009)法を用いて時系列データの中から統計的に有意な発現の異なるプロファイルを検出します。

    「ファイル」−「ディレクトリの変更」で解析したい時系列遺伝子発現データのファイルとその実験デザイン情報に関するファイルを置いてあるディレクトリに移動し、以下をコピペ
    
    
    

    Bioconductorのbetrのwebページ

    参考文献(Aryee et al., BMC Bioinformatics, 2009)

    解析 | 発現変動遺伝子 | 時系列データ | non-periodic genes | maSigPro (Conesa_2006)

    maSigPro(Conesa et al., Bioinformatics, 2006)法を用いて時系列データの中から統計的に有意な発現の異なるプロファイルを検出します。
    サンプルマイクロアレイデータの10.3で示すような「あるサンプル(A)に刺激を与えて3h, 9h, and 27h後に測定した時系列データ」が手元にあり、「経時的に発現の異なる遺伝子」を検出したい場合に行います。 ここではFDR("発現変動している"としたもののうち"本当は発現変動していない"ものが含まれる割合; 0 < FDR <= 1)を0.5として計算した結果を示してありますが、その閾値を満たす遺伝子数があまりにも少なくて困るような場合には最大で1.0まで設定することが可能です。もちろん最初からFDRを1.0に設定しておいて、(解析可能な)全遺伝子の結果を眺めるという戦略でもいいと思います。

    「ファイル」−「ディレクトリの変更」で解析したい時系列遺伝子発現データのファイルとその実験デザイン情報に関するファイルを置いてあるディレクトリに移動し、以下をコピペ 1. 発現データファイル: sample10_1group.txt, 実験デザインファイル: sample10_1group_cl.txtの場合:
    in_f1 <- "sample10_1group.txt"                                   #入力ファイル名(発現データファイル)を指定
    in_f2 <- "sample10_1group_cl.txt"                                #入力ファイル名(実験デザインファイル)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 0.5                                                    #閾値(FDR; "発現変動している"としたもののうち"本当は発現変動していない"ものが含まれる割合)を指定
    
    #必要なパッケージをロード
    library(maSigPro)                                                #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")    #発現データファイルの読み込み
    
    edesign <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="") #実験デザインファイルの読み込み
    design <- make.design.matrix(edesign, degree=2)                  #regression(回帰)行列の作成。degree=2は、2次の回帰モデルで考えることを意味する
    fit <- p.vector(data, design, Q=param1)                          #発現変動遺伝子の同定。
    tstep <- T.fit(fit)                                              #得られた発現変動遺伝子群の各々について最もよい回帰モデルを決める
    gene_profile <- tstep$sig.profiles                               #発現変動遺伝子の発現プロファイルをgene_profileに格納。
    gene_id <- rownames(gene_profile)                                #発現変動遺伝子のIDをgene_idに格納。
    p_masigpro <- tstep$sol[,1]                                      #p値をp_masigproに格納。
    rank_masigpro <- rank(abs(p_masigpro))                           #p値の順位をrank_masigproに格納。
    tmp <- cbind(gene_id, gene_profile, p_masigpro, rank_masigpro)   #発現変動遺伝子についてのみ、その遺伝子ID、発現データ、p値、その順位を結合した結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #発現変動の度合いでソートした結果を得たい場合:
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(rank_masigpro),]                               #順位(rank_masigpro)でソートした結果をtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    
    2. 発現データファイル: sample11_1group.txt, 実験デザインファイル: sample11_1group_cl.txtの場合:
    in_f1 <- "sample11_1group.txt"                                   #入力ファイル名(発現データファイル)を指定
    in_f2 <- "sample11_1group_cl.txt"                                #入力ファイル名(実験デザインファイル)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 0.5                                                    #閾値(FDR; "発現変動している"としたもののうち"本当は発現変動していない"ものが含まれる割合)を指定
    
    #必要なパッケージをロード
    library(maSigPro)                                                #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")    #発現データファイルの読み込み
    
    edesign <- read.table(in_f2, header=TRUE, row.names=1, sep="\t", quote="") #実験デザインファイルの読み込み
    design <- make.design.matrix(edesign, degree=2)                  #regression(回帰)行列の作成。degree=2は、2次の回帰モデルで考えることを意味する
    fit <- p.vector(data, design, Q=param1)                          #発現変動遺伝子の同定。
    tstep <- T.fit(fit)                                              #得られた発現変動遺伝子群の各々について最もよい回帰モデルを決める
    gene_profile <- tstep$sig.profiles                               #発現変動遺伝子の発現プロファイルをgene_profileに格納。
    gene_id <- rownames(gene_profile)                                #発現変動遺伝子のIDをgene_idに格納。
    p_masigpro <- tstep$sol[,1]                                      #p値をp_masigproに格納。
    rank_masigpro <- rank(abs(p_masigpro))                           #p値の順位をrank_masigproに格納。
    tmp <- cbind(gene_id, gene_profile, p_masigpro, rank_masigpro)   #発現変動遺伝子についてのみ、その遺伝子ID、発現データ、p値、その順位を結合した結果をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #発現変動の度合いでソートした結果を得たい場合:
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(rank_masigpro),]                               #順位(rank_masigpro)でソートした結果をtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    

    BioconductorのmaSigProのwebページ

    参考文献(Conesa et al., Bioinformatics, 2006)
    著者らの(maSigPro)ウェブページ

    解析 | 発現変動遺伝子 | 時系列データ | non-periodic genes | SAM (Tusher_2001)

    Significance Analysis of Microarrays (SAM)法で「経時的に発現の変化する遺伝子」のランキングを行う。
    注意点:例で用いているsample11_1group.txtの一行目のラベル情報(すなわち、"Time0.5","Time2","Time5","Time12.3","Time24")と同じ形式にしてください。"T_0.5"とか"Time_0.5"などとしてはいけません!

    「ファイル」−「ディレクトリの変更」で解析したい対数変換(log2変換)後のファイルを置いてあるディレクトリに移動し、以下をコピペ 1. 発現データファイル: sample10_1group.txtの場合:
    in_f <- "sample10_1group.txt"                                    #入力ファイル名(発現データファイル)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(samr)                                                    #パッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")     #発現データファイルの読み込み
    data <- as.matrix(data)                                          #データの型を変換
    cl.tmp <- strsplit(colnames(data), "_")                          #ラベル情報を"One class timecourse"用に変更1
    data.cl <- NULL                                                  #ラベル情報を"One class timecourse"用に変更2
    for(i in 1:ncol(data)){ data.cl[i] <- cl.tmp[[i]][1] }           #ラベル情報を"One class timecourse"用に変更3
    data.cl <- paste(1, data.cl, sep="")                             #ラベル情報を"One class timecourse"用に変更4
    data.cl[1] <- paste(data.cl[1], "Start", sep="")                 #ラベル情報を"One class timecourse"用に変更5
    data.cl[ncol(data)] <- paste(data.cl[ncol(data)], "End", sep="") #ラベル情報を"One class timecourse"用に変更6
    
    data.tmp <- list(x=data, y=data.cl, geneid=rownames(data), genenames=rownames(data), logged2=TRUE) #SAMを実行するsamr関数の入力フォーマットに合わせたdata.tmpという入力データを作成
    out <- samr(data.tmp, resp.type="One class timecourse", nperms=30, time.summary.type="slope")      #samr関数を実行し、結果をsamr.objに格納。
    stat_sam <- out$tt                                               #統計量をstat_samに格納。
    rank_sam <- rank(-abs(stat_sam))                                 #統計量の絶対値でランキングした結果をrank_samに格納。
    delta.table <- samr.compute.delta.table(out, min.foldchange=0, dels=NULL, nvals=100)               #FDRの計算1
    out2 <- samr.compute.siggenes.table(out, del, data.tmp, delta.table, min.foldchange=0, all.genes=T)#FDRの計算2
    fdr.tmp <- as.numeric(c(out2$genes.up[,7], out2$genes.lo[,7]))   #up-regulated側とdown-regulated側の%FDR値をfdr.tmpに格納
    fdr.tmp <- fdr.tmp/100                                           #%FDR値を100で割る
    names(fdr.tmp) <- c(out2$genes.up[,2], out2$genes.lo[,2])        #fdr.tmpはup側とdown側で発現変動の度合いでランキングされているので、遺伝子名との対応づけを行っている
    fdr_sam <- fdr.tmp[rownames(data)]                               #もとの入力データの遺伝子名の並びに変更した結果をfdr_samに格納
    tmp <- cbind(rownames(data), data, stat_sam, rank_sam, fdr_sam)  #読み込んだ元データの右側に統計量、その順位、FDRを追加してtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #発現変動の度合いでソートした結果を得たい場合:
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(rank_sam),]                                    #順位(rank_sam)でソートした結果をtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    
    2. 発現データファイル: sample11_1group.txt, 実験デザインファイル: sample11_1group_cl.txtの場合:
    in_f <- "sample11_1group.txt"                                    #入力ファイル名(発現データファイル)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(samr)                                                    #パッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")     #発現データファイルの読み込み
    data <- as.matrix(data)                                          #データの型を変換
    data.cl <- paste(1, colnames(data), sep="")                      #ラベル情報を"One class timecourse"用に変更1
    data.cl[1] <- paste(data.cl[1], "Start", sep="")                 #ラベル情報を"One class timecourse"用に変更2
    data.cl[ncol(data)] <- paste(data.cl[ncol(data)], "End", sep="") #ラベル情報を"One class timecourse"用に変更3
    
    data.tmp <- list(x=data, y=data.cl, geneid=rownames(data), genenames=rownames(data), logged2=TRUE) #SAMを実行するsamr関数の入力フォーマットに合わせたdata.tmpという入力データを作成
    out <- samr(data.tmp, resp.type="One class timecourse", nperms=30, time.summary.type="slope")      #samr関数を実行し、結果をsamr.objに格納。
    stat_sam <- out$tt                                               #統計量をstat_samに格納。
    rank_sam <- rank(-abs(stat_sam))                                 #統計量の絶対値でランキングした結果をrank_samに格納。
    delta.table <- samr.compute.delta.table(out, min.foldchange=0, dels=NULL, nvals=100)               #FDRの計算1
    out2 <- samr.compute.siggenes.table(out, del, data.tmp, delta.table, min.foldchange=0, all.genes=T)#FDRの計算2
    fdr.tmp <- as.numeric(c(out2$genes.up[,7], out2$genes.lo[,7]))   #up-regulated側とdown-regulated側の%FDR値をfdr.tmpに格納
    fdr.tmp <- fdr.tmp/100                                           #%FDR値を100で割る
    names(fdr.tmp) <- c(out2$genes.up[,2], out2$genes.lo[,2])        #fdr.tmpはup側とdown側で発現変動の度合いでランキングされているので、遺伝子名との対応づけを行っている
    fdr_sam <- fdr.tmp[rownames(data)]                               #もとの入力データの遺伝子名の並びに変更した結果をfdr_samに格納
    tmp <- cbind(rownames(data), data, stat_sam, rank_sam, fdr_sam)  #読み込んだ元データの右側に統計量、その順位、FDRを追加してtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #発現変動の度合いでソートした結果を得たい場合:
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(rank_sam),]                                    #順位(rank_sam)でソートした結果をtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    
    sample11の解析結果のhoge2.txtにおいて、rank_samのランキング結果とFDR値(fdr_sam)の対応がちゃんととれていないのは、up-regulated側とdown-regulated側がごちゃまぜになっているためです。
    例えば、stat_sam列でソートすると、FDR値の分布がきれい?!になります。fdr_sam列でソートすると、例えばFDR <=0.33...を満たすのは上位3個(gene713, 781, and 492)ですが、このうちの33.3...%(i.e., 3分の1個)は"偽物"という風に解釈します。

    CRANのsamrのwebページ
    CRANのsamrのPDFマニュアル
    参考文献1(Tusher et al., PNAS, 2001)

    解析 | 機能解析(GSEA周辺)について

    ある程度遺伝子機能が分かっている生物種に対して行う解析手段です。GSEAはGene Set Enrichment Analysisの略です。
    基本的に”二群間比較データ”用の解析なのかも...。
    例えば、従来の二群間比較(例. 癌 vs. 正常)のような場合で発現変動遺伝子を検出したい場合には、発現変動の度合いで全遺伝子をランキングし、FDRやp値の閾値を満たす上位x個を抽出してそれらがどのような機能をもつものが多いか(例えば「pathway関連遺伝子群が多い」など)などを調べて論文にしていました。 最近では、「代謝パスウェイに関連している遺伝子セット」や「同じGene Ontologyカテゴリに属する遺伝子セット」などが予め(a priori)分かっている場合が多いので、その情報を用いてFold changeやt統計量などの手段で発現変動の度合いで全遺伝子をランキングした結果に対して、例えば「代謝パスウェイに関連している遺伝子セット」が比較しているサンプル間で”動いている”かどうかを偏りの程度から判断するのがGSEA(遺伝子セットの濃縮度解析?!)の基本的な考え方です。
    当然a priori defined setの偏りの程度を調べるための手段はいくらでも多くのやり方が考えられるので、GSEA法(Subramanian et al., PNAS, 2005)が出て以来、様々な改良版が報告されています。
    実際、Rプログラムが提供されているものだけでも、以下の方法が提案されています:
    PAGE(Kim and Volsky, BMC Bioinformatics, 2005):この論文中に書かれている方法を門田が自作してみたもの。
    PGSEA(Kim and Volsky, BMC Bioinformatics, 2005):PAGEのR版だと書いてはいるが、原著論文に書かれているやり方とは違うと思います...。
    GSEA(Subramanian et al., PNAS, 2005):GSEAのR版ということだが、初心者には非常に扱いづらいので、JAVA版をお勧めします...。
    GSA(Efron and Tibshirani, Ann. Appl. Stat., 2007):20120612に一通り使えるようになりました。

    他にも
    GeneTrail(Backes et al., NAR, 2007)
    Jiang and Gentlemanらによる拡張法 (Bioinformatics, 2007)
    SAM-GS (Dinu et al., BMC Bioinformatics, 2007)
    GSEA-P (Subramanian et al., Bioinformatics, 2007)
    など様々な手法が提案されているようです。

    これは、入力となる(log2変換後の)遺伝子発現データが与えられてから以下の多くのステップを経てGSEA系解析を行うわけですが、各ステップで様々な選択肢があるためです:
    -----------------------------------
    step1(二群間比較用の様々な統計量の中から一つを選択;gene-level statistics)
    t統計量、WAD、SAM、Rank productsなど
    step2(得られた統計量の変換;transformation)
    変換なし、統計量をrankに変換、統計量の絶対値に変換、統計量の二乗に変換など
    step3(遺伝子セットの統計量;gene-set statistics)
    (特定の遺伝子セットに含まれる遺伝子群の変換後の統計量の)平均(mean)、中央値(median)、Wilcoxonの順位和統計量、改良版Kolmogorov-Smirnov統計量など
    step4(帰無仮説;Null hypothesis)
    Q1(競合帰無仮説;competitive null hypothesis):「特定の遺伝子セットに含まれる遺伝子群のgene-set statistic」と「その遺伝子群の以外のgene-set statistic」は同じ
    Q1(完全帰無仮説;complete null hypothesis):「特定の遺伝子セットに含まれる遺伝子群のgene-set statistic」と「(その遺伝子群を含む)全遺伝子セットに含まれる遺伝子のgene-set statistic」は同じ
    Q2(自己充足型帰無仮説;self-contained null hypothesis):「特定の遺伝子セットに含まれる遺伝子群のgene-set statistic」と「sample label permutation(ランダムなラベル情報という意味)によって得られた特定の遺伝子セットに含まれる遺伝子群のgene-set statistic」は同じ
    Q2(グローバル帰無仮説;global null hypothesis):発現変動遺伝子はない、と仮定
    -----------------------------------
    この中で、特にstep2での選択は結果に大きな影響を与える(Ackermann and Strimmer, BMC Bioinformatics, 2009)ので違いをよく認識したうえで利用することをお勧めします。
    例えばオリジナルのPAGE法(Kim_2005)は、「step1:AD統計量(Average Difference)、step2:変換なし、step3:mean、step4:Q1?!」ですので、 ある遺伝子セットに含まれる遺伝子メンバーの半分がA群>>B群、もう半分がA群< ゆえに下記の三つのやり方はオリジナルのPAGE法(Kim_2005)に基づいたものなので、上記問題が起こりうることを認識したうえでご利用ください。
    PAGE法(Kim_2005)の考え方について
    PAGE法(Kim_2005;統計量の変換なし)を用いてGene Ontology解析
    PAGE法(Kim_2005;統計量の変換なし)を用いてPathway解析
    ただし、上記のやり方は「遺伝子メンバーの半分がA群>>B群、もう半分がその逆」のような遺伝子セットAの検出はできないものの、全体としてA群(あるいはB群)で高発現側に偏っているような他の大部分の遺伝子セットは普通に検出できますし、そのような両方向でなく一方向。
    遺伝子セットAのようなものも検出するための一つの手段としては、step2で「統計量の絶対値」あるいは「統計量の二乗」に変換することです。これの前者(統計量の絶対値)を実装したのが下記のものです。
    PAGE法(Kim_2005;統計量の変換あり)を用いてGene Ontology解析
    PAGE法(Kim_2005;統計量の変換あり)を用いてPathway解析

    2009/10/23現在、このページで最後まで解析ができるのはPAGE法(Kim_2005)のみです。
    PAGE法(Kim_2005;統計量の変換なし)の考え方についてでは、原著論文中で実際に解析したデータの追試を行うことで、解析の概略、結果の解釈の仕方などを述べています。
    入力データは、前処理 | 同じ遺伝子名を持つものをまとめるを利用して得られた同じGene Symbolを持たない遺伝子発現データですのでご注意ください。

    参考文献(PAGE法: Kim and Volsky, BMC Bioinformatics, 2005)
    参考文献(Ackermann and Strimmer, BMC Bioinformatics, 2009)

    解析 | 機能解析 | PAGE法(Kim_2005;統計量の変換なし)の考え方について

    PAGE法の参考文献1に書かれているPAGE法で遺伝子セット濃縮度解析(GSEA)解析を行うべく、解析の概略、結果の解釈の仕方などを述べます。
    ここでは、 参考文献1のTable1で示された"OXPHOS_HG-U133A"という遺伝子セット(Gene set)のZ scoreの計算結果がどのようにして得られるのかを示します。
    得られた結果は、若干原著論文(参考文献1)中のTable1の数値とは違いますが、これは参考文献2からとってきたOXPHOS_HG-U133A_probesの遺伝子リストを用いたためかもしれません。 つまり、原著論文では参考文献2から得られた遺伝子リストをそのまま使ったかどうかには言及していないために、その後アップデートされた遺伝子リストを使っていれば結果は異なりうるということです。ですので、細かい違いは気にしなくてもいいと思います。
    ここでは、対数変換前のデータのダウンロードから、発現データファイル中の余分な行や列の除去、前処理や対数変換、サンプル名が長いので文字列の最初の1-8文字分のみをサンプル名とするなどの細かい作業をやってから 17 NGT samples vs. 18 DM2 samplesのPAGE解析を行っています。reannotate_select_cal.eis中のどの列が目的のサンプルに相当するかは、クラスラベル情報を含むファイル(Phenotype_Data.xls)から、全43サンプルのうち、「1-17列がNGTサンプル」、「26-43列がDM2サンプル」のデータであることが分かっているとします。
    a. 「参考文献1のTable1」の解析は参考文献2のデータについて行ったものです。 まずは必要な情報(発現情報や遺伝子セットの情報)をここからゲットします。 ・発現データファイル(Human diabetes expression data)をダウンロード。 ・クラスラベル情報を含むファイル(Phenotype data)をダウンロード。 ・遺伝子セット情報を含むファイル(Probe sets corresponding to gene sets)をダウンロード。 b. ダウンロードした圧縮ファイルを解凍すると以下のファイルが得られます。 ・発現データファイル(reannotate_select_cal.eis; 対数変換されていないpreprocessing前のデータ) ・クラスラベル情報を含むファイル(Phenotype_Data.xls) ・「all_pathways」というディレクトリ中にある”酸化的リン酸化に関係する遺伝子のリスト”ファイル(OXPHOS_HG-U133A_probes) c. 実際にRで読み込むのはreannotate_select_cal.eisOXPHOS_HG-U133A_probesの二つ。 これをデスクトップなりどこか同じディレクトリ内に置く。 d. Rを立ち上げ、読み込む二つのファイルを置いているディレクトリに移動し、以下をコピペ
    in_f1 <- "reannotate_select_cal.eis"                             #入力ファイル名(発現データファイル)を指定
    in_f2 <- "OXPHOS_HG-U133A_probes"                                #入力ファイル名(遺伝子リストファイル)を指定
    param1 <- 1:17                                                   #遺伝子発現行列中のA群(NGTサンプルに相当)の位置(X-Y列)のXとYを指定
    param2 <- 26:43                                                  #遺伝子発現行列中のB群(DM2サンプルに相当)の位置(X-Y列)のXとYを指定
    param3 <- 1:8                                                    #列名(サンプル名)の文字列のX-Y文字目のXとYを指定
    
    #データファイルの読み込み
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")    #発現データファイルの読み込み
    data$NAME <- NULL                                                #余分な列(NAMEという名前の列に相当)の削除
    data <- data[-1,]                                                #余分な行(EWEIGHTという名前の行に相当)の削除
    
    #参考文献1に記載されている通りのデータの前処理(preprocessing)を実行
    mean_value <- 1000                                               #各サンプルの平均発現強度を1000にすべく、mean_valueに格納
    floor_value <- 100                                               #シグナル強度が100未満のものを100にすべく、floor_valueに格納
    tmp_mean <- apply(data, 2, mean, na.rm=TRUE)                     #各サンプル(列)の平均シグナル強度を計算した結果をtmp_meanに格納
    data.tmp <- sweep(data, 2, mean_value/tmp_mean, "*")             #各列中の全てのシグナル値にmean_value/tmp_meanを掛け、その結果をdata.tmpに格納
    data.tmp[data.tmp < floor_value] <- floor_value                  #シグナル強度がfloor_value未満のものをfloor_valueにする
    data.tmp <- log(data.tmp, base=2)                                #log(底は2)をとる
    rownames(data.tmp) <- rownames(data)                             #data_tmpの行の名前をdataの行の名前として利用する
    colnames(data.tmp) <- substr(colnames(data),param3[1],param3[length(param3)])#data_tmpの列の名前が長いのでparam3で指定した領域をdata.tmpの列の名前にする
    
    #全遺伝子(母集団)の倍率変化の平均(myu)と標準偏差(sigma)をまずは求める
    dim(data.tmp)                                                    #行数と列数を確認
    logratio <- apply(data.tmp[,param2], 1, mean, na.rm=TRUE) - apply(data.tmp[,param1], 1, mean, na.rm=TRUE)#全遺伝子の倍率変化(DM2/NGT; logスケールデータなのでこの場合引き算となっている)を計算し、logratioに格納
    mean_set <- mean(logratio)                                       #全遺伝子の倍率変化の平均を計算し、mean_setに格納
    sd_set <- sd(logratio)                                           #全遺伝子の倍率変化の標準偏差を計算し、sd_setに格納
    
    #"in_f2"で指定した中の遺伝子セット(標本)のみの倍率変化の平均(mean_sample)と遺伝子数(標本サイズ)nを求める
    probe_OXPHOS <- read.table(in_f2, row.names=1, quote="")                   #遺伝子リストファイルの読み込み
    mean_sample <- mean(logratio[rownames(probe_OXPHOS)])            #rownames(probe_OXPHOS)で見られる遺伝子セットのみの倍率変化の平均を計算し、mean_sampleに格納
    n <- nrow(probe_OXPHOS)                                          #rownames(probe_OXPHOS)で見られる遺伝子数をnに格納
    
    #Z-score算出式を参考にして、「mean_set, sd_set, mean_sample, n」をもとにZ-scoreおよびそのp値を求める
    zscore <- (mean_sample - mean_set)*sqrt(n)/sd_set                #zscoreを計算
    pvalue <- (1 - pnorm(abs(zscore)))*2                             #pvalueを計算
    zscore                                                           #zscoreを表示
    pvalue                                                           #pvalueを表示
    
    
    
    参考文献1(PAGE法: Kim and Volsky, BMC Bioinformatics, 2005)
    参考文献2(GSEA法のpreliminary versionを提案した論文: Mootha et al., Nature Genet., 2003)
    参考文献3(Nakai et al., BBB, 2008)

    解析 | 機能解析 | PAGE法(Kim_2005;統計量の変換なし)を用いてGene Ontology解析

    参考文献2(Nakai et al., BBB, 2008)(「Affymetrix Rat Genome 230 2.0 Array」を利用)のデータを遺伝子名重複を前処理 | 同じ遺伝子名を持つものをまとめることにより排除して得られた「24 samples×14026 genesからなる遺伝子発現行列ファイルdata_GSE7623_rma_nr.txtを入力として、Gene Ontology解析を行う。
    このときGSEAの開発者らが作成した様々な遺伝子セット情報を収めたMolecular Signatures Database (MSigDB)からダウンロードした.gmt形式ファイルを読み込んで解析を行います。
    ちなみに、ここではlogratioをmean(B)-mean(A)で定義しているので、「logratioが正の値の遺伝子は、B群で発現が上昇した」ということを意味するので、B群で発現が上昇した遺伝子が多数を占める遺伝子セットのZスコア(hoge.txt中のz_page列に相当)は負の大きな値を示します。
    注意点としては、「"Member_num_thischip"列の数値が10未満のものは怪しい」ので、できればリストからは除外しておいたほうがいいです。理由は、原著論文中にも書いていますが、この方法は中心極限定理 (母集団の分布がどんな分布であっても"ある遺伝子セットのメンバーのFold changeの平均(標本平均に相当)"と"チップ上の全遺伝子のFold changeの平均(母平均に相当)"の間の誤差はサンプルサイズ(その遺伝子セットのメンバー数に相当)を大きくしたときに近似的に正規分布に従うという定理)を論拠としており、 "Member_num_thischip(サンプルのサイズに相当)"があまりに小さいと正規分布に従うという前提が成り立たないためです。それで、原著論文では、「PAGE法を利用可能な最低限必要な遺伝子セットを構成するメンバー数(the minimal gene set size)は10程度必要だ。」としています。ここでは、混乱をきたさないように「"Member_num_thischip"列の数値が10未満のものは最初から排除」してもよかったのですが、 8 or 9個しかなくp値が非常に低い場合でも、その遺伝子セットが動いていないと言い切れるわけではないと思うので、一応全ての情報を出力するようにしています。したがって、"p_page"列(p値)で低い順にソートした結果を眺めるのを基本としつつも"Member_num_thischip"列の数値が小さいかどうかにも注意を払うことをお勧めします。
    以下を実行すると、最もよく動いていたGene Ontology IDはGO:0006631であったことが分かります。

    解析例で示す24 samples×14026 genesからなる遺伝子発現行列データ(data_GSE7623_rma_nr.txt)のサンプルラベル情報は以下の通りです。
    ここではLIVサンプルの「fed vs. 24h-fasted」のGene Ontology解析を例示します。LIVのfedサンプル(A群)は17-20列目、24h-fastedサンプル(B群)は21-24列目のデータに相当します。

    ---------------------------------------------------------- GSM184414-184417: Brown adipose tissue (BAT), fed GSM184418-184421: Brown adipose tissue (BAT), 24 h-fasted GSM184422-184425: White adipose tissue (WAT), fed GSM184426-184429: White adipose tissue (WAT), 24 h-fasted GSM184430-184433: Liver tissue (LIV), fed GSM184434-184437: Liver tissue (LIV), 24 h-fasted ---------------------------------------------------------- 1. Molecular Signatures Database (MSigDB)の 「Registration」のページで登録し、遺伝子セットをダウンロード可能な状態にする。 2. Molecular Signatures Database (MSigDB)の 「Download gene sets」の"Download"のところをクリックし、Loginページで登録したe-mail addressを入力。 3. これでMSigDBのダウンロードページに行けるので、 とりあえず「c5: gene ontology gene sets」の「GO biological process gene sets file」を解析すべく、 c5.bp.v2.5.symbols.gmtファイルを(data_GSE7623_rma_nr.txtをダウンロードしたディレクトリと同じところに)ダウンロードする。 4. Rを立ち上げ、読み込む二つのファイルを置いているディレクトリに移動し、以下をコピペ
    in_f1 <- "data_GSE7623_rma_nr.txt"                               #入力ファイル名(発現データファイル)を指定
    in_f2 <- "c5.bp.v2.5.symbols.gmt"                                #入力ファイル名(遺伝子セットファイル)を指定
    param1 <- 17:20                                                  #遺伝子発現行列中のA群(fedサンプルに相当)の位置(X-Y列)のXとYを指定
    param2 <- 21:24                                                  #遺伝子発現行列中のB群(24h-fastedサンプルに相当)の位置(X-Y列)のXとYを指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(PGSEA)                                                   #PGSEAパッケージ(ライブラリ)の読み込み
    
    #データファイルの読み込み
    gmt <- readGmt(in_f2)                                            #遺伝子セット情報を読み込んでgmtに格納(不完全な最終行が見つかりました、と警告が出ますが気にしなくてよい)
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    colnames(data)                                                   #dataの列名を表示。GSM184414-184437まで順番に並んでいることを確認
    
    #Zスコアを算出する関数calc_zを作成
    calc_z <- function(x, AD1, mean_set1, sd_set1){            #Zスコアを算出する関数calc_zを作成
        hoge <- (mean_set1 - mean(AD1[intersect(names(AD1), x)], na.rm=TRUE))*sqrt(length(intersect(names(AD1), x)))/sd_set1#Zスコアを算出する関数calc_zを作成
        return(hoge)                                                 #Zスコアを算出する関数calc_zを作成
    }                                                                #Zスコアを算出する関数calc_zを作成
    
    #PAGE解析のメイン部分
    AD <- apply(data[,param2], 1, mean, na.rm=TRUE) - apply(data[,param1], 1, mean, na.rm=TRUE)#全遺伝子の倍率変化(logなので引き算)を計算し、ADに格納
    names(AD) <- toupper(names(AD))                                  #.gmtファイルは大文字の遺伝子名なのでnames(AD)でみられる遺伝子名も大文字に変換する
    mean_set <- mean(AD)                                             #全遺伝子の倍率変化の平均を計算し、mean_setに格納
    sd_set <- sd(AD)                                                 #全遺伝子の倍率変化の標準偏差を計算し、sd_setに格納
    z_page <- NULL                                                   #おまじない
    for(i in 1:length(gmt)){                                         #length(gmt)回だけループを回す
        z_page <- c(z_page, calc_z(gmt[[i]]@ids, AD, mean_set, sd_set))#gmt[[i]]@idsで表されるi番目の遺伝子セットの遺伝子群のZスコアを計算し、z_pageに格納
    }                                                                #length(gmt)回だけループを回す
    p_page <- (1 - pnorm(abs(z_page)))*2                             #Zスコアに対応するp値を計算し、p_pageに格納
    
    #結果をまとめてファイルに保存
    out <- NULL                                                      #おまじない
    for(i in 1:length(gmt)){                                         #length(gmt)回だけループを回す
        Geneset_name <- gmt[[i]]@reference                           #遺伝子セット名をGeneset_nameに格納
        GO_ID <- substring(gmt[[i]]@desc, 32, 41)                    #遺伝子セット名に対応するGene Ontology IDをGO_IDに格納
        Member_num <- length(gmt[[i]]@ids)                           #各遺伝子セットを構成する遺伝子数をMember_numに格納
        Member_num_thischip <- length(intersect(names(AD), gmt[[i]]@ids))#各遺伝子セットを構成する"このチップに搭載されている"遺伝子数をMember_num_thischipに格納
        out <- rbind(out, c(Geneset_name, GO_ID, Member_num, Member_num_thischip))  #Geneset_name, Member_num, Member_num_thischipの情報をoutに格納
    }                                                                #length(gmt)回だけループを回す
    colnames(out) <- c("Geneset_name", "GO_ID", "Member_num", "Member_num_thischip")#outの列名をGeneset_name, GO_ID, Member_num, Member_num_thischipに変更
    tmp <- cbind(out, z_page, p_page)                                #outの右側にPAGE解析結果のZスコアとp値を追加してtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #p値の低い順にソートした結果を得たい場合:
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(p_page),]                                      #p値(p_page)でソートした結果をtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    
    参考文献1(PAGE法: Kim and Volsky, BMC Bioinformatics, 2005)
    参考文献2(Nakai et al., BBB, 2008)

    解析 | 機能解析 | PAGE法(Kim_2005;統計量の変換あり)を用いてGene Ontology解析

    参考文献2(Nakai et al., BBB, 2008)(「Affymetrix Rat Genome 230 2.0 Array」を利用)のデータを遺伝子名重複を前処理 | 同じ遺伝子名を持つものをまとめることにより排除して得られた「24 samples×14026 genesからなる遺伝子発現行列ファイルdata_GSE7623_rma_nr.txtを入力として、Gene Ontology解析を行う。
    このときGSEAの開発者らが作成した様々な遺伝子セット情報を収めたMolecular Signatures Database (MSigDB)からダウンロードした.gmt形式ファイルを読み込んで解析を行います。
    以下を実行すると、最もよく動いていたGene Ontology IDはGO:0006805であったことが分かりますが、この遺伝子セットを構成する遺伝子数は11個でそのうちこのチップ(Affymetrix Rat Genome 230 2.0 Array)に搭載されているのは4個しかないことが分かります。
    PAGE法(Kim_2005;統計量の変換なし)を用いてGene Ontology解析に書いているように、"Member_num_thischip"列の数値(この場合4)があまりに少ないと偶然に有意であると判断される可能性が上昇しますので、XENOBIOTIC_METABOLIC_PROCESSが動いたと判断するのはまずいと思います。
    また、統計量の変換(この場合AD統計量の”絶対値”を採用しているということ)を行っており、Z検定も行っていないので、もはやPAGE法とはいえないと思います...。

    解析例で示す24 samples×14026 genesからなる遺伝子発現行列データ(data_GSE7623_rma_nr.txt)のサンプルラベル情報は以下の通りです。
    ここではLIVサンプルの「fed vs. 24h-fasted」のGene Ontology解析を例示します。LIVのfedサンプル(A群)は17-20列目、24h-fastedサンプル(B群)は21-24列目のデータに相当します。

    ---------------------------------------------------------- GSM184414-184417: Brown adipose tissue (BAT), fed GSM184418-184421: Brown adipose tissue (BAT), 24 h-fasted GSM184422-184425: White adipose tissue (WAT), fed GSM184426-184429: White adipose tissue (WAT), 24 h-fasted GSM184430-184433: Liver tissue (LIV), fed GSM184434-184437: Liver tissue (LIV), 24 h-fasted ---------------------------------------------------------- 1. Molecular Signatures Database (MSigDB)の 「Registration」のページで登録し、遺伝子セットをダウンロード可能な状態にする。 2. Molecular Signatures Database (MSigDB)の 「Download gene sets」の"Download"のところをクリックし、Loginページで登録したe-mail addressを入力。 3. これでMSigDBのダウンロードページに行けるので、 とりあえず「c5: gene ontology gene sets」の「GO biological process gene sets file」を解析すべく、 c5.bp.v2.5.symbols.gmtファイルを(data_GSE7623_rma_nr.txtをダウンロードしたディレクトリと同じところに)ダウンロードする。 4. Rを立ち上げ、読み込む二つのファイルを置いているディレクトリに移動し、以下をコピペ
    in_f1 <- "data_GSE7623_rma_nr.txt"                               #入力ファイル名(発現データファイル)を指定
    in_f2 <- "c5.bp.v2.5.symbols.gmt"                                #入力ファイル名(遺伝子セットファイル)を指定
    param1 <- 17:20                                                  #遺伝子発現行列中のA群(fedサンプルに相当)の位置(X-Y列)のXとYを指定
    param2 <- 21:24                                                  #遺伝子発現行列中のB群(24h-fastedサンプルに相当)の位置(X-Y列)のXとYを指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(PGSEA)                                                   #PGSEAパッケージ(ライブラリ)の読み込み
    
    #データファイルの読み込み
    gmt <- readGmt(in_f2)                                            #遺伝子セット情報を読み込んでgmtに格納(不完全な最終行が見つかりました、と警告が出ますが気にしなくてよい)
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    colnames(data)                                                   #dataの列名を表示。GSM184414-184437まで順番に並んでいることを確認
    
    #PAGE解析のメイン部分
    AD <- apply(data[,param2], 1, mean, na.rm=TRUE) - apply(data[,param1], 1, mean, na.rm=TRUE)#全遺伝子の倍率変化(logなので引き算)を計算し、ADに格納
    names(AD) <- toupper(names(AD))                                  #.gmtファイルは大文字の遺伝子名なのでnames(AD)でみられる遺伝子名も大文字に変換する
    
    stat_page <- NULL                                                #おまじない
    for(i in 1:length(gmt)){                                         #length(gmt)回だけループを回す
        genenames <- intersect(names(AD), gmt[[i]]@ids)              #i番目の遺伝子セット中の遺伝子リストの中からチップに搭載されている遺伝子のみのGene symbolsをgenenamesに格納
        stat_page <- c(stat_page, mean(abs(AD[genenames])))          #genenamesで表された遺伝子リストのAD統計量の絶対値の平均を計算し、stat_pageに格納
    }                                                                #length(gmt)回だけループを回す
    
    #結果をまとめてファイルに保存
    out <- NULL                                                      #おまじない
    for(i in 1:length(gmt)){                                         #length(gmt)回だけループを回す
        Geneset_name <- gmt[[i]]@reference                           #遺伝子セット名をGeneset_nameに格納
        GO_ID <- substring(gmt[[i]]@desc, 32, 41)                    #遺伝子セット名に対応するGene Ontology IDをGO_IDに格納
        Member_num <- length(gmt[[i]]@ids)                           #各遺伝子セットを構成する遺伝子数をMember_numに格納
        Member_num_thischip <- length(intersect(names(AD), gmt[[i]]@ids))#各遺伝子セットを構成する"このチップに搭載されている"遺伝子数をMember_num_thischipに格納
        out <- rbind(out, c(Geneset_name, GO_ID, Member_num, Member_num_thischip))  #Geneset_name, Member_num, Member_num_thischipの情報をoutに格納
    }                                                                #length(gmt)回だけループを回す
    colnames(out) <- c("Geneset_name", "GO_ID", "Member_num", "Member_num_thischip")#outの列名をGeneset_name, GO_ID, Member_num, Member_num_thischipに変更
    tmp <- cbind(out, stat_page)                                     #outの右側にPAGE解析結果のAD統計量の絶対値の平均を追加してtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #AD統計量の絶対値の平均が高い順にソートした結果を得たい場合:
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(-stat_page),]                                    #stat_pageでソートした結果をtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    
    参考文献1(PAGE法: Kim and Volsky, BMC Bioinformatics, 2005)
    参考文献2(Nakai et al., BBB, 2008)

    解析 | 機能解析 | PAGE法(Kim_2005)を用いてGene Ontology解析した結果をQuickGOにかける

    PAGE法(Kim_2005)を用いてGene Ontology解析では、hoge.txtをエクセルなどで開き、どのGene Ontology IDのものが動いたかをp値でソートすることによりTableを作成することまでが可能です。 解析例(LIVサンプルの「fed vs. 24h-fasted」のGene Ontology解析)で得られた上位10個の結果は以下の通りです。 ------------------------------------------------------------------------------------------------------------ Geneset_name GO_ID Member_num Member_num_thischip z_page p_page FATTY_ACID_METABOLIC_PROCESS GO:0006631 63 52 -7.799532229 6.22E-15 FATTY_ACID_BETA_OXIDATION GO:0006635 11 11 -6.203282697 5.53E-10 CELLULAR_RESPONSE_TO_NUTRIENT_LEVELS GO:0031669 10 10 6.154781714 7.52E-10 CELLULAR_RESPONSE_TO_STRESS GO:0033554 10 10 5.904066843 3.55E-09 CELLULAR_RESPONSE_TO_EXTRACELLULAR_STIMULUS GO:0031668 12 12 5.594950084 2.21E-08 FATTY_ACID_OXIDATION GO:0019395 18 18 -5.167180532 2.38E-07 MONOCARBOXYLIC_ACID_METABOLIC_PROCESS GO:0032787 88 75 -4.879088895 1.07E-06 BIOSYNTHETIC_PROCESS GO:0009058 470 383 4.869245113 1.12E-06 CELLULAR_BIOSYNTHETIC_PROCESS GO:0044249 321 265 4.577997388 4.69E-06 RESPONSE_TO_NUTRIENT_LEVELS GO:0031667 29 29 4.487353561 7.21E-06 ------------------------------------------------------------------------------------------------------------ この結果から、Zスコアの低い4つ(B群で発現が上昇した遺伝子が多数を占める遺伝子セットを意味する)は"FATTY_ACID"や"METABOLIC"などの記述がかぶっているので、 Gene Ontology階層構造の親子関係になっていることが想像できます。この親子関係になっている様子を図で表したいときに以下を行います。
    1. エクセルで開いたhoge.txtをp値の低い順にソートして得られた状態で、上位10個のGene Ontology IDsに相当するセルをコピー 2. QuickGOのウェブページを開き、「Your selection (0 terms)」の部分をクリック もし「Your selection (0 terms)」となってない場合は「Empty」の部分をクリックして、以前の作業で残っていた情報を消す 3. 四角のボックス部分に1.でコピーしておいたGO IDsをペーストし、「Add」ボタンを押す 「Your selection (0 terms)」だったのが、「Your selection (10 terms)」となります 4. 「Your selection (10 terms)」の部分をクリックして、「View selected terms」をクリック 5. 「Select all」の部分をクリックし、「chart」をクリック 6. 以下のようなチャート図が得られるので、図上を右クリックで「名前を付けて画像を保存」とすれば図の完成です
    参考文献(QuickGO; Binns et al., Bioinformatics, 2009)
    QuickGOのウェブページ

    解析 | 機能解析 | PAGE法(Kim_2005;統計量の変換なし)を用いてPathway解析

    PAGE法を用いて、どのパスウェイが動いていたかを調べたいときに用います。
    前処理 | 遺伝子のフィルタリング3の4を適用することによって得られた、各群で少なくとも一つ以上の数値の要素を含むものの、 NAやNaNの要素を含むsample13_7vs7_nr2.txtのようなAgilent two-colorデータの解析例を示します。
    この例では、GSEAの開発者らが作成した様々な遺伝子セット情報を収めたMolecular Signatures Database (MSigDB)からダウンロードしたKEGG gene sets fileファイル(c2.kegg.v2.5.symbols.gmt)を読み込んで解析を行います。
    この例で示す遺伝子発現行列データ(sample13_7vs7_nr2.txt)のサンプルラベル情報はサンプルマイクロアレイデータの12のものと同じです。つまり、最初の7 samplesが面白い話を聞いた患者(A群)で、残りの7 samplesが退屈な講義を聞いた患者(B群)です。

    ちなみに、ここではlogratioをmean(B)-mean(A)で定義しているので、「logratioが正の値の遺伝子は、面白い話(A)を聞いたときに発現が減少し、退屈な話(B)を聞いて発現が上昇した」ということを意味します。よって、logratio > 0を満たす遺伝子が多数を占める遺伝子セットのZスコア(hoge.txt中のz_page列に相当)は負の大きな値を示します。
    得られたhoge.txtファイルをエクセルなどで開き、"p_page"列(p値)で低い順にソートすれば、「A群 vs. B群」の二つの状態間で”動いているパスウェイ”順にソートされたことになる。論文の表とかで示す場合には「p値 < 0.05を満たすものだけ」とか「上位10個だけ」を表示することになります。
    注意点としては、「"Member_num_thischip"列の数値が10未満のものは怪しい」ので、できればリストからは除外しておいたほうがいいです。理由は、原著論文中にも書いていますが、この方法は中心極限定理 (母集団の分布がどんな分布であっても"ある遺伝子セットのメンバーのFold changeの平均(標本平均に相当)"と"チップ上の全遺伝子のFold changeの平均(母平均に相当)"の間の誤差はサンプルサイズ(その遺伝子セットのメンバー数に相当)を大きくしたときに近似的に正規分布に従うという定理)を論拠としており、 "Member_num_thischip(サンプルのサイズに相当)"があまりに小さいと正規分布に従うという前提が成り立たないためです。それで、原著論文では、「PAGE法を利用可能な最低限必要な遺伝子セットを構成するメンバー数(the minimal gene set size)は10程度必要だ。」としています。ここでは、混乱をきたさないように「"Member_num_thischip"列の数値が10未満のものは最初から排除」してもよかったのですが、 8 or 9個しかなくp値が非常に低い場合でも、そのパスウェイが動いていないと言い切れるわけではないと思うので、一応全ての情報を出力するようにしています。したがって、"p_page"列(p値)で低い順にソートした結果を眺めるのを基本としつつも"Member_num_thischip"列の数値が小さいかどうかにも注意を払うことをお勧めします。
    解析例を行って得られたhoge.txtの10未満しかないがp値がそこそこ低いものの一例としては、28番目の"HSA00791_ATRAZINE_DEGRADATION"です。
    1. Molecular Signatures Database (MSigDB)の 「Registration」のページで登録し、遺伝子セットをダウンロード可能な状態にする。 2. Molecular Signatures Database (MSigDB)の 「Download gene sets」の"Download"のところをクリックし、Loginページで登録したe-mail addressを入力。 3. これでMSigDBのダウンロードページに行けるので、 とりあえず「c2: curated gene sets」の「KEGG gene sets file」を解析すべく、 c2.kegg.v2.5.symbols.gmtファイルを(sample13_7vs7_nr.txtをダウンロードしたディレクトリと同じところに)ダウンロードする。 4. Rを立ち上げ、読み込む二つのファイルを置いているディレクトリに移動し、以下をコピペ
    in_f1 <- "sample13_7vs7_nr2.txt"                                 #入力ファイル名(発現データファイル)を指定
    in_f2 <- "c2.kegg.v2.5.symbols.gmt"                              #入力ファイル名(遺伝子セットファイル)を指定
    param1 <- 7                                                      #A群のサンプル数を指定
    param2 <- 7                                                      #B群のサンプル数を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(PGSEA)                                                   #PGSEAパッケージ(ライブラリ)の読み込み
    
    #データファイルの読み込みとラベル情報の作成
    gmt <- readGmt(in_f2)                                            #遺伝子セット情報を読み込んでgmtに格納(不完全な最終行が見つかりました、と警告が出ますが気にしなくてよい)
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    #Zスコアを算出する関数calc_zを作成
    calc_z <- function(x, AD1, mean_set1, sd_set1){                  #Zスコアを算出する関数calc_zを作成
        hoge <- (mean_set1 - mean(AD1[intersect(names(AD1), x)], na.rm=TRUE))*sqrt(length(intersect(names(AD1), x)))/sd_set1#Zスコアを算出する関数calc_zを作成
        return(hoge)                                                 #Zスコアを算出する関数calc_zを作成
    }                                                                #Zスコアを算出する関数calc_zを作成
    
    #PAGE解析のメイン部分
    AD <- apply(data[,data.cl == 1], 1, mean, na.rm=TRUE) - apply(data[,data.cl == 0], 1, mean, na.rm=TRUE)#全遺伝子の倍率変化(logなので引き算)を計算し、ADに格納
    names(AD) <- toupper(names(AD))                                  #.gmtファイルは大文字の遺伝子名なのでnames(AD)でみられる遺伝子名も大文字に変換する
    mean_set <- mean(AD)                                             #全遺伝子の倍率変化の平均を計算し、mean_setに格納
    sd_set <- sd(AD)                                                 #全遺伝子の倍率変化の標準偏差を計算し、sd_setに格納
    z_page <- NULL                                                   #おまじない
    for(i in 1:length(gmt)){                                         #length(gmt)回だけループを回す
        z_page <- c(z_page, calc_z(gmt[[i]]@ids, AD, mean_set, sd_set))#gmt[[i]]@idsで表されるi番目の遺伝子セットの遺伝子群のZスコアを計算し、z_pageに格納
    }                                                                #length(gmt)回だけループを回す
    p_page <- (1 - pnorm(abs(z_page)))*2                             #Zスコアに対応するp値を計算し、p_pageに格納
    
    #結果をまとめてファイルに保存
    out <- NULL                                                      #おまじない
    for(i in 1:length(gmt)){                                         #length(gmt)回だけループを回す
        Geneset_name <- gmt[[i]]@reference                           #遺伝子セット名をGeneset_nameに格納
        Member_num <- length(gmt[[i]]@ids)                           #各遺伝子セットを構成する遺伝子数をMember_numに格納
        Member_num_thischip <- length(intersect(names(AD), gmt[[i]]@ids))#各遺伝子セットを構成する"このチップに搭載されている"遺伝子数をMember_num_thischipに格納
        out <- rbind(out, c(Geneset_name, Member_num, Member_num_thischip))    #Geneset_name, Member_num, Member_num_thischipの情報をoutに格納
    }                                                                #length(gmt)回だけループを回す
    colnames(out) <- c("Geneset_name", "Member_num", "Member_num_thischip")    #outの列名をGeneset_name, Member_num, Member_num_thischipに変更
    tmp <- cbind(out, z_page, p_page)                                #outの右側にPAGE解析結果のZスコアとp値を追加してtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #p値の低い順にソートした結果を得たい場合:
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(p_page),]                                      #p値(p_page)でソートした結果をtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    
    参考文献1(PAGE法: Kim and Volsky, BMC Bioinformatics, 2005)

    解析 | 機能解析 | PAGE法(Kim_2005;統計量の変換あり)を用いてPathway解析

    PAGE法を用いて、どのパスウェイが動いていたかを調べたいときに用います。
    前処理 | 遺伝子のフィルタリング3の4を適用することによって得られた、各群で少なくとも一つ以上の数値の要素を含むものの、 NAやNaNの要素を含むsample13_7vs7_nr2.txtのようなAgilent two-colorデータの解析例を示します。
    この例では、GSEAの開発者らが作成した様々な遺伝子セット情報を収めたMolecular Signatures Database (MSigDB)からダウンロードしたKEGG gene sets fileファイル(c2.kegg.v2.5.symbols.gmt)を読み込んで解析を行います。
    この例で示す遺伝子発現行列データ(sample13_7vs7_nr2.txt)のサンプルラベル情報はサンプルマイクロアレイデータの12のものと同じです。つまり、最初の7 samplesが面白い話を聞いた患者(A群)で、残りの7 samplesが退屈な講義を聞いた患者(B群)です。

    ちなみに、ここではAD統計量をmean(B)-mean(A)で定義しているので、「ADが正の値の遺伝子は、面白い話(A)を聞いたときに発現が減少し、退屈な話(B)を聞いて発現が上昇した」ということを意味します。。
    得られたhoge2.txtファイルは、「A群 vs. B群」の二つの状態間で”動いているパスウェイ”順にソートされた結果です。この場合、論文の表とかで示す場合には「上位10個だけ」などを表示することになります。
    注意点としては、「"Member_num_thischip"列の数値が10未満のものは怪しい」ので、できればリストからは除外しておいたほうがいいです。一般的にメンバー数が10以上とか15以上の遺伝子セットのみ解析というのが多いというのも理由の一つです。例えば参考文献2では、メンバー数が15-500 genesの範囲の遺伝子セットのみを解析対象としています。
    1. Molecular Signatures Database (MSigDB)の 「Registration」のページで登録し、遺伝子セットをダウンロード可能な状態にする。 2. Molecular Signatures Database (MSigDB)の 「Download gene sets」の"Download"のところをクリックし、Loginページで登録したe-mail addressを入力。 3. これでMSigDBのダウンロードページに行けるので、 とりあえず「c2: curated gene sets」の「KEGG gene sets file」を解析すべく、 c2.kegg.v2.5.symbols.gmtファイルを(sample13_7vs7_nr.txtをダウンロードしたディレクトリと同じところに)ダウンロードする。 4. Rを立ち上げ、読み込む二つのファイルを置いているディレクトリに移動し、以下をコピペ
    in_f1 <- "sample13_7vs7_nr2.txt"                                 #入力ファイル名(発現データファイル)を指定
    in_f2 <- "c2.kegg.v2.5.symbols.gmt"                              #入力ファイル名(遺伝子セットファイル)を指定
    param1 <- 7                                                      #A群のサンプル数を指定
    param2 <- 7                                                      #B群のサンプル数を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(PGSEA)                                                   #PGSEAパッケージ(ライブラリ)の読み込み
    
    #データファイルの読み込みとラベル情報の作成
    gmt <- readGmt(in_f2)                                            #遺伝子セット情報を読み込んでgmtに格納(不完全な最終行が見つかりました、と警告が出ますが気にしなくてよい)
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    
    #AD統計量を計算
    AD <- apply(data[,data.cl == 1], 1, mean, na.rm=TRUE) - apply(data[,data.cl == 0], 1, mean, na.rm=TRUE)#全遺伝子の倍率変化(logなので引き算)を計算し、ADに格納
    names(AD) <- toupper(names(AD))                                  #.gmtファイルは大文字の遺伝子名なのでnames(AD)でみられる遺伝子名も大文字に変換する
    
    stat_page <- NULL                                                #おまじない
    for(i in 1:length(gmt)){                                         #length(gmt)回だけループを回す
        genenames <- intersect(names(AD), gmt[[i]]@ids)              #i番目の遺伝子セット中の遺伝子リストの中からチップに搭載されている遺伝子のみのGene symbolsをgenenamesに格納
        stat_page <- c(stat_page, mean(abs(AD[genenames])))          #genenamesで表された遺伝子リストのAD統計量の絶対値の平均を計算し、stat_pageに格納
    }                                                                #length(gmt)回だけループを回す
    
    #結果をまとめてファイルに保存
    out <- NULL                                                      #おまじない
    for(i in 1:length(gmt)){                                         #length(gmt)回だけループを回す
        Geneset_name <- gmt[[i]]@reference                           #遺伝子セット名をGeneset_nameに格納
        Member_num <- length(gmt[[i]]@ids)                           #各遺伝子セットを構成する遺伝子数をMember_numに格納
        Member_num_thischip <- length(intersect(names(AD), gmt[[i]]@ids))#各遺伝子セットを構成する"このチップに搭載されている"遺伝子数をMember_num_thischipに格納
        out <- rbind(out, c(Geneset_name, Member_num, Member_num_thischip))    #Geneset_name, Member_num, Member_num_thischipの情報をoutに格納
    }                                                                #length(gmt)回だけループを回す
    colnames(out) <- c("Geneset_name", "Member_num", "Member_num_thischip")    #outの列名をGeneset_name, Member_num, Member_num_thischipに変更
    tmp <- cbind(out, stat_page)                                     #outの右側にPAGE解析結果のAD統計量の絶対値の平均を追加してtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #AD統計量の絶対値の平均が高い順にソートした結果を得たい場合:
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(-stat_page),]                                    #stat_pageでソートした結果をtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    
    参考文献1(PAGE法: Kim and Volsky, BMC Bioinformatics, 2005)
    参考文献2(Ackermann and Strimmer, BMC Bioinformatics, 2009)

    解析 | 機能解析 | PAGE法(Kim_2005)を用いてPathway解析した後

    まだ作成途中です...
    PAGE法(Kim_2005;統計量の変換なし)を用いてPathway解析では、hoge2.txtをエクセルなどで開き、動いたKEGG Pathwayの上位10個やp値<0.01のものなどをリストアップすることまでが可能です。 解析例(「面白い話(A) vs. 退屈な話(B)」のPathway解析)で得られた上位10個の結果は以下の通りです。 ------------------------------------------------------------------------------------------------------------ Geneset_name Member_num Member_num_thischip z_page p_page HSA04612_ANTIGEN_PROCESSING_AND_PRESENTATION 83 75 -7.417644043 1.19E-13 HSA04650_NATURAL_KILLER_CELL_MEDIATED_CYTOTOXICITY 132 120 -6.455612947 1.08E-10 HSA04660_T_CELL_RECEPTOR_SIGNALING_PATHWAY 93 85 -6.10536501 1.03E-09 HSA04940_TYPE_I_DIABETES_MELLITUS 45 41 -5.127354084 2.94E-07 HSA05221_ACUTE_MYELOID_LEUKEMIA 53 49 -5.043817499 4.56E-07 HSA04720_LONG_TERM_POTENTIATION 69 67 -4.934603559 8.03E-07 HSA04540_GAP_JUNCTION 98 80 -4.240373448 2.23E-05 HSA05220_CHRONIC_MYELOID_LEUKEMIA 76 71 -4.047010307 5.19E-05 HSA04912_GNRH_SIGNALING_PATHWAY 97 93 -3.984577112 6.76E-05 HSA04810_REGULATION_OF_ACTIN_CYTOSKELETON 212 185 -3.852884301 0.000116735 ------------------------------------------------------------------------------------------------------------ この結果から、最も比較した二群間で動いているパスウェイは「HSA04612_ANTIGEN_PROCESSING_AND_PRESENTATION」であり、 遺伝子発現データ取得に用いたチップ上には75個の遺伝子が搭載されていることが分かりますが、 そのパスウェイ構成メンバーのどの遺伝子の発現がどちら向き(A群 > B群 or A群 < B群)に変化したのかまでをパスウェイ上に色でマップしたいときに以下を行います。 1. 知りたいパスウェイIDHSA04612を構成する遺伝子セットのAD統計量情報から対応する色の16進数値を入手すべく、以下をコピペ ・AD統計量が負の値のもの(A群で発現上昇)を水色、AD統計量が正の値のもの(B群で発現上昇)をピンク色で図示したい場合
    param <- "HSA04612"                                              #解析したいパスウェイIDを指定
    param1 <- "#FF00FF"                                              #AD > 0(B群で発現上昇)のものの色(ピンク色)を指定
    param2 <- "#0099FF"                                              #AD < 0(A群で発現上昇)のものの色(水色)を指定
    out_f3 <- "hoge_detail.txt"                                      #元となるAD統計量情報を含む出力ファイル名を指定
    out_f4 <- "hoge_kegg.txt"                                        #KEGG Pathway用出力ファイル名を指定
    
    calc_color <- function(x){                                       #AD統計量から色の16進数値を返す関数calc_colorを作成
        if(x > 0){ tmp_color <- param1 }                             #AD統計量>0のときはparam1で指定した色を返すべくtmp_colorに格納
        if(x < 0){ tmp_color <- param2 }                             #AD統計量<0のときはparam2で指定した色を返すべくtmp_colorに格納
        return(tmp_color)                                            #tmp_colorの中身を結果として返す
    }                                                                #AD統計量から色の16進数値を返す関数calc_colorを作成
    
    posi <- pmatch(param, tmp[,1])                                   #paramで指定したパスウェイIDのgmtファイル中での位置を同定しposiに格納
    genenames <- intersect(names(AD), gmt[[posi]]@ids)               #チップに搭載されている遺伝子のGene symbolsをgenenamesに格納
    tmpAD <- AD[genenames]
    out <- apply(as.matrix(tmpAD), 1, calc_color)
    tmp3 <- cbind(genenames, tmpAD)                                  #genenamesの右側にAD統計量情報を追加してtmp3に格納
    write.table(tmp3, out_f3, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身をout_f3で指定したファイル名で保存。
    tmp4 <- cbind(genenames, out)                                    #genenamesの右側に色の16進数値情報を追加してtmp4に格納
    write.table(tmp4, out_f4, sep=" ", append=F, quote=F, row.names=F, col.names=F)#tmpの中身をout_f4で指定したファイル名で保存。
    
    
    
    ・上記の色使いを基本としつつ、AD <= -1を水色、-1 < AD < 0を薄水色、0 < AD < 1を薄ピンク色、AD >= 1をピンク色の4諧調で図示したい場合 (ちなみにAD統計量は「log2 scaleでの各群の算術平均値の差」なので、 AD <= -1は「A群で2倍以上発現上昇」に相当し、AD >= 1は「B群で2倍以上発現上昇」に相当します。)
    param <- "HSA04612"                                              #解析したいパスウェイIDを指定
    param1 <- "#FF00FF"                                              #AD >= 1(B群で2倍以上発現上昇)のものの色(ピンク色)を指定
    param2 <- "#FFCCFF"                                              #0 < AD < 1(B群で2倍未満発現上昇)のものの色(薄ピンク色)を指定
    param3 <- "#CCFFFF"                                              #-1 < AD< 0(A群で2倍未満発現上昇)のものの色(薄水色)を指定
    param4 <- "#0099FF"                                              #AD <= -1(A群で2倍以上発現上昇)のものの色(水色)を指定
    out_f3 <- "hoge_detail.txt"                                      #元となるAD統計量情報を含む出力ファイル名を指定
    out_f4 <- "hoge_kegg.txt"                                        #KEGG Pathway用出力ファイル名を指定
    
    calc_color <- function(x){                                       #AD統計量から色の16進数値を返す関数calc_colorを作成
        if(x >= 1){ tmp_color <- param1 }                            #AD >= 1のときはparam1で指定した色を返すべくtmp_colorに格納
        if((0 < x) & (x < 1)){ tmp_color <- param2 }                 #0 < AD < 1のときはparam2で指定した色を返すべくtmp_colorに格納
        if((-1 < x) & (x < 0)){ tmp_color <- param3 }                #-1 < AD < 0のときはparam3で指定した色を返すべくtmp_colorに格納
        if(x <= -1){ tmp_color <- param4 }                           #AD <= -1のときはparam4で指定した色を返すべくtmp_colorに格納
        return(tmp_color)                                            #tmp_colorの中身を結果として返す
    }                                                                #AD統計量から色の16進数値を返す関数calc_colorを作成
    
    posi <- pmatch(param, tmp[,1])                                   #paramで指定したパスウェイIDのgmtファイル中での位置を同定しposiに格納
    genenames <- intersect(names(AD), gmt[[posi]]@ids)               #チップに搭載されている遺伝子のGene symbolsをgenenamesに格納
    tmpAD <- AD[genenames]
    out <- apply(as.matrix(tmpAD), 1, calc_color)
    tmp3 <- cbind(genenames, tmpAD)                                  #genenamesの右側にAD統計量情報を追加してtmp3に格納
    write.table(tmp3, out_f3, sep="\t", append=F, quote=F, row.names=F, col.names=F)#tmpの中身をout_f3で指定したファイル名で保存。
    tmp4 <- cbind(genenames, out)                                    #genenamesの右側に色の16進数値情報を追加してtmp4に格納
    write.table(tmp4, out_f4, sep=" ", append=F, quote=F, row.names=F, col.names=F)#tmpの中身をout_f4で指定したファイル名で保存。
    
    
    
    2. Color Objects in KEGG Pathwaysのページを開き、以下を実行 ・「Search against:」のところを自分がマップしたい生物種(この場合は「Homo Sapiens (Human)」)を選択 ・「Alternatively, enter the file name containing the data:」のところの  ”参照”ボタンをクリックして、KEGG Pathway用出力ファイル(out_f4で指定したファイル名:この場合はhoge_kegg.txt)  を読み込ませ、Execボタンを押す ・”Pathway Search Result”のページに切り替わるので、  paramで指定した解析したいパスウェイID(候補リストのトップのほうに位置している場合がほとんど:この場合HSA04612)のものをクリック 参考文献(KEGG; Kanehisa et al., Nucleic Acids Res, 2008)
    KEGG PATHWAYのウェブページ

    解析 | 機能解析 | PAGE(Z-score)法(Kim_2005;統計量の変換なし)を用いてGene Ontology解析

    デフォルトのPAGE法は遺伝子のランキングにAD法を採用していましたが、Z-score変換するやり方(参考文献3)もあります。 参考文献3ではlog10変換したものを取り扱っているので、(a)ではunlogged data(sample17_unlog.txt)を読み込んでlog10変換してますが、log2変換後のデータ(sample17.txt)を取り扱うのが一般的だと思うので、(b)ではlog2変換後のデータを読み込んでそのまま解析しています。
    解析例で示す8 samples×14026 genesからなる遺伝子発現行列データ(sample17_unlog.txt or sample17.txt)は、最初の4サンプルがA群、残りの4サンプルがB群です。

    1. Molecular Signatures Database (MSigDB)の 「Registration」のページで登録し、遺伝子セットをダウンロード可能な状態にする。 2. Molecular Signatures Database (MSigDB)の 「Download gene sets」の"Download"のところをクリックし、Loginページで登録したe-mail addressを入力。 3. これでMSigDBのダウンロードページに行けるので、 とりあえず「c5: gene ontology gene sets」の「GO biological process gene sets file」を解析すべく、 c5.bp.v3.0.symbols.gmtファイルを(data_GSE7623_unlog_nr.txtをダウンロードしたディレクトリと同じところに)ダウンロードする。 4. Rを立ち上げ、読み込む二つのファイルを置いているディレクトリに移動し、以下をコピペ (a) log変換されていないデータ(sample17_unlog.txt)を読み込んでlog10変換して解析する場合:
    in_f1 <- "sample17_unlog.txt"                                    #入力ファイル名(発現データファイル)を指定
    in_f2 <- "c5.bp.v3.0.symbols.gmt"                                #入力ファイル名(遺伝子セットファイル)を指定
    param1 <- 4                                                      #遺伝子発現行列中のA群(fedサンプルに相当)の位置(X-Y列)のXとYを指定
    param2 <- 4                                                      #遺伝子発現行列中のB群(24h-fastedサンプルに相当)の位置(X-Y列)のXとYを指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(PGSEA)                                                   #PGSEAパッケージ(ライブラリ)の読み込み
    
    #データファイルの読み込みとラベル情報の作成
    gmt <- readGmt(in_f2)                                            #遺伝子セット情報を読み込んでgmtに格納(不完全な最終行が見つかりました、と警告が出ますが気にしなくてよい)
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    colnames(data)                                                   #dataの列名を表示させてるだけ
    
    #列(サンプル)ごとにZスコアを算出
    data_log10 <- log10(data)                                        #log10変換した結果をdata_log10に格納
    zscore <- scale(data_log10)                                      #Z-score化した結果をzscoreに格納
    apply(zscore, 2, sd)                                             #Z-score化した結果の各列の標準偏差がちゃんと1になっているか確認している
    apply(zscore, 2, mean)                                           #Z-score化した結果の各列の平均がちゃんと0になっているか確認している
    
    #比較する二群間のZ ratioを算出
    mean_zscore_A <- apply(zscore[,data.cl == 0], 1, mean)           #A群の行(遺伝子)ごとのzscoreの平均値を計算した結果をmean_zscore_Aに格納
    mean_zscore_B <- apply(zscore[,data.cl == 1], 1, mean)           #B群の行(遺伝子)ごとのzscoreの平均値を計算した結果をmean_zscore_Bに格納
    zratio <- (mean_zscore_B - mean_zscore_A)/sd(mean_zscore_B - mean_zscore_A)#Z ratioを計算した結果をzratioに格納
    
    #Zスコアを算出する関数calc_zを作成
    calc_z <- function(x, AD1, mean_set1, sd_set1){                  #Zスコアを算出する関数calc_zを作成
        hoge <- (mean_set1 - mean(AD1[intersect(names(AD1), x)], na.rm=TRUE))*sqrt(length(intersect(names(AD1), x)))/sd_set1#Zスコアを算出する関数calc_zを作成
        return(hoge)                                                 #Zスコアを算出する関数calc_zを作成
    }                                                                #Zスコアを算出する関数calc_zを作成
    
    #PAGE解析のメイン部分
    AD <- zratio                                                     #この行以下の記述を他のPAGE法のものと統一すべくzratioをADとして取り扱う
    names(AD) <- toupper(names(AD))                                  #.gmtファイルは大文字の遺伝子名なのでnames(AD)でみられる遺伝子名も大文字に変換する
    mean_set <- mean(AD)                                             #全遺伝子の倍率変化の平均を計算し、mean_setに格納
    sd_set <- sd(AD)                                                 #全遺伝子の倍率変化の標準偏差を計算し、sd_setに格納
    z_page <- NULL                                                   #おまじない
    for(i in 1:length(gmt)){                                         #length(gmt)回だけループを回す
        z_page <- c(z_page, calc_z(gmt[[i]]@ids, AD, mean_set, sd_set))#gmt[[i]]@idsで表されるi番目の遺伝子セットの遺伝子群のZスコアを計算し、z_pageに格納
    }                                                                #length(gmt)回だけループを回す
    p_page <- (1 - pnorm(abs(z_page)))*2                             #Zスコアに対応するp値を計算し、p_pageに格納
    
    #結果をまとめてファイルに保存
    out <- NULL                                                      #おまじない
    for(i in 1:length(gmt)){                                         #length(gmt)回だけループを回す
        Geneset_name <- gmt[[i]]@reference                           #遺伝子セット名をGeneset_nameに格納
        GO_ID <- substring(gmt[[i]]@desc, 32, 41)                    #遺伝子セット名に対応するGene Ontology IDをGO_IDに格納
        Member_num <- length(gmt[[i]]@ids)                           #各遺伝子セットを構成する遺伝子数をMember_numに格納
        Member_num_thischip <- length(intersect(names(AD), gmt[[i]]@ids))#各遺伝子セットを構成する"このチップに搭載されている"遺伝子数をMember_num_thischipに格納
        out <- rbind(out, c(Geneset_name, GO_ID, Member_num, Member_num_thischip))  #Geneset_name, Member_num, Member_num_thischipの情報をoutに格納
    }                                                                #length(gmt)回だけループを回す
    colnames(out) <- c("Geneset_name", "GO_ID", "Member_num", "Member_num_thischip")#outの列名をGeneset_name, GO_ID, Member_num, Member_num_thischipに変更
    tmp <- cbind(out, z_page, p_page)                                #outの右側にPAGE解析結果のZスコアとp値を追加してtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #p値の低い順にソートした結果を得たい場合:
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(p_page),]                                      #p値(p_page)でソートした結果をtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    
    (b) log2変換されたデータ(sample17.txt)を読み込んでそのまま解析する場合:
    in_f1 <- "sample17.txt"                                          #入力ファイル名(発現データファイル)を指定
    in_f2 <- "c5.bp.v3.0.symbols.gmt"                                #入力ファイル名(遺伝子セットファイル)を指定
    param1 <- 4                                                      #遺伝子発現行列中のA群(fedサンプルに相当)の位置(X-Y列)のXとYを指定
    param2 <- 4                                                      #遺伝子発現行列中のB群(24h-fastedサンプルに相当)の位置(X-Y列)のXとYを指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(PGSEA)                                                   #PGSEAパッケージ(ライブラリ)の読み込み
    
    #データファイルの読み込みとラベル情報の作成
    gmt <- readGmt(in_f2)                                            #遺伝子セット情報を読み込んでgmtに格納(不完全な最終行が見つかりました、と警告が出ますが気にしなくてよい)
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    data.cl <- c(rep(0, param1), rep(1, param2))                     #A群を0、B群を1としたベクトルdata.clを作成
    colnames(data)                                                   #dataの列名を表示させてるだけ
    
    #列(サンプル)ごとにZスコアを算出
    zscore <- scale(data)                                      #Z-score化した結果をzscoreに格納
    apply(zscore, 2, sd)                                             #Z-score化した結果の各列の標準偏差がちゃんと1になっているか確認している
    apply(zscore, 2, mean)                                           #Z-score化した結果の各列の平均がちゃんと0になっているか確認している
    
    #比較する二群間のZ ratioを算出
    mean_zscore_A <- apply(zscore[,data.cl == 0], 1, mean)           #A群の行(遺伝子)ごとのzscoreの平均値を計算した結果をmean_zscore_Aに格納
    mean_zscore_B <- apply(zscore[,data.cl == 1], 1, mean)           #B群の行(遺伝子)ごとのzscoreの平均値を計算した結果をmean_zscore_Bに格納
    zratio <- (mean_zscore_B - mean_zscore_A)/sd(mean_zscore_B - mean_zscore_A)#Z ratioを計算した結果をzratioに格納
    
    #Zスコアを算出する関数calc_zを作成
    calc_z <- function(x, AD1, mean_set1, sd_set1){                  #Zスコアを算出する関数calc_zを作成
        hoge <- (mean_set1 - mean(AD1[intersect(names(AD1), x)], na.rm=TRUE))*sqrt(length(intersect(names(AD1), x)))/sd_set1#Zスコアを算出する関数calc_zを作成
        return(hoge)                                                 #Zスコアを算出する関数calc_zを作成
    }                                                                #Zスコアを算出する関数calc_zを作成
    
    #PAGE解析のメイン部分
    AD <- zratio                                                     #この行以下の記述を他のPAGE法のものと統一すべくzratioをADとして取り扱う
    names(AD) <- toupper(names(AD))                                  #.gmtファイルは大文字の遺伝子名なのでnames(AD)でみられる遺伝子名も大文字に変換する
    mean_set <- mean(AD)                                             #全遺伝子の倍率変化の平均を計算し、mean_setに格納
    sd_set <- sd(AD)                                                 #全遺伝子の倍率変化の標準偏差を計算し、sd_setに格納
    z_page <- NULL                                                   #おまじない
    for(i in 1:length(gmt)){                                         #length(gmt)回だけループを回す
        z_page <- c(z_page, calc_z(gmt[[i]]@ids, AD, mean_set, sd_set))#gmt[[i]]@idsで表されるi番目の遺伝子セットの遺伝子群のZスコアを計算し、z_pageに格納
    }                                                                #length(gmt)回だけループを回す
    p_page <- (1 - pnorm(abs(z_page)))*2                             #Zスコアに対応するp値を計算し、p_pageに格納
    
    #結果をまとめてファイルに保存
    out <- NULL                                                      #おまじない
    for(i in 1:length(gmt)){                                         #length(gmt)回だけループを回す
        Geneset_name <- gmt[[i]]@reference                           #遺伝子セット名をGeneset_nameに格納
        GO_ID <- substring(gmt[[i]]@desc, 32, 41)                    #遺伝子セット名に対応するGene Ontology IDをGO_IDに格納
        Member_num <- length(gmt[[i]]@ids)                           #各遺伝子セットを構成する遺伝子数をMember_numに格納
        Member_num_thischip <- length(intersect(names(AD), gmt[[i]]@ids))#各遺伝子セットを構成する"このチップに搭載されている"遺伝子数をMember_num_thischipに格納
        out <- rbind(out, c(Geneset_name, GO_ID, Member_num, Member_num_thischip))  #Geneset_name, Member_num, Member_num_thischipの情報をoutに格納
    }                                                                #length(gmt)回だけループを回す
    colnames(out) <- c("Geneset_name", "GO_ID", "Member_num", "Member_num_thischip")#outの列名をGeneset_name, GO_ID, Member_num, Member_num_thischipに変更
    tmp <- cbind(out, z_page, p_page)                                #outの右側にPAGE解析結果のZスコアとp値を追加してtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #p値の低い順にソートした結果を得たい場合:
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(p_page),]                                      #p値(p_page)でソートした結果をtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    
    参考文献1(PAGE法: Kim and Volsky, BMC Bioinformatics, 2005)
    参考文献2(Nakai et al., BBB, 2008)

    参考文献3(Cheadle et al., J. Mol. Diagn., 2003)

    解析 | 機能解析 | Parametric Gene Set Enrichment Analysis (PGSEA) (Kim_2005)

    解析 | 機能解析(GSEA周辺)についてでも書きましたが、原著論文(Kim and Volsky, BMC Bioinformatics, 2005)と似て非なるものです...。
    library(PGSEA)                                  #パッケージの読み込み
    library(GSEABase)                               #パッケージの読み込み
    library(org.Hs.eg.db)                           #パッケージの読み込み
    
    
    

    BioconductorのPGSEAのwebページ

    参考文献(Kim and Volsky, BMC Bioinformatics, 2005)

    解析 | 機能解析 | Gene Set Enrichment Analysis (GSEA) (Subramanian_2005)

    t統計量などでランキングした結果に対して、例えばx染色体上の遺伝子群が上位に偏っているかどうかを解析したいときに用いる。a modified Kolmogorov-Smirnov統計量を用いて偏りを調べます。

    1. ソフトウェアダウンロードページから(予め登録が必要)R-GSEAをダウンロード
    2. ダウンロードしたGSEA-P-R.1.0.zipファイルを解凍し、得られたGSEA-P-Rフォルダを「C:/Program Files/R/R-2.9.0/library/」に移動。
    3.
    参考文献(Subramanian et al., PNAS, 2005)
    GSEAのウェブページ
    GSEAのユーザーガイド

    解析 | 機能解析 | Gene set analysis (GSA) (Efron_2007)

    (GSEAと違って)maxmean統計量を用いて偏りを調べます。
    GSEAに代表される発現変動遺伝子セット解析は、基本的にGSEAの開発者らが作成した様々な遺伝子セット情報を収めたMolecular Signatures Database (MSigDB)からダウンロードした.gmt形式ファイルを読み込んで解析を行います。
    *gmt形式ファイルのダウンロード方法は、基本的に以下の通りです: a. Molecular Signatures Database (MSigDB)の 「register」のページで登録し、遺伝子セットをダウンロード可能な状態にする。 b. Molecular Signatures Database (MSigDB)の 「Download gene sets」の"Download"のところをクリックし、Loginページで登録したe-mail addressを入力。 c. これでMSigDBのダウンロードページに行けるので、 「c5: gene ontology gene sets」の「BP: biological process」を解析したい場合はc5.bp.v3.0.symbols.gmtファイルをダウンロードしておく。 「c2: curated gene sets」の「KEGG gene sets」を解析したい場合はc2.cp.kegg.v3.0.symbols.gmtファイルをダウンロードしておく。 「c3: motif gene sets」を解析したい場合はc3.all.v3.0.symbols.gmtファイルをダウンロードしておく。 参考文献2(Nakai et al., BBB, 2008)(「Affymetrix Rat Genome 230 2.0 Array」を利用)のデータを遺伝子名重複を 前処理 | 同じ遺伝子名を持つものをまとめることにより排除して得られた「24 samples×14132 genesからなる遺伝子発現行列ファイルdata_rma_2_nr.txtを入力として、 発現変動遺伝子セット解析を行うやり方を示します。
    尚、ここでは原著論文とは若干異なりますが、サンプルラベル情報を以下のとおり、取り扱います: ---------------------------------------------------------- (data_rma_2_nr.txtの遺伝子名の列(最初の列)を除く) 01 - 04列目: 褐色脂肪(満腹)が4サンプル 05 - 08列目: 褐色脂肪(空腹)が4サンプル 09 - 12列目: 白色脂肪(満腹)が4サンプル 13 - 16列目: 白色脂肪(空腹)が4サンプル 17 - 20列目: 肝臓(満腹)が4サンプル 21 - 24列目: 肝臓(空腹)が4サンプル ----------------------------------------------------------
    「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し、以下をコピペ
    1.褐色脂肪の「満腹 vs. 空腹」のKEGG Pathway解析の場合(FDR < 0.1を満たす遺伝子セットを抽出)
    in_f1 <- "data_rma_2_nr.txt"                                     #入力ファイル名(発現データファイル)を指定
    in_f2 <- "c2.cp.kegg.v3.0.symbols.gmt"                           #入力ファイル名(gmtファイル)を指定
    param1 <- 1:4                                                    #遺伝子発現行列中のA群(満腹サンプルに相当)の位置(X-Y列)のXとYを指定
    param2 <- 5:8                                                    #遺伝子発現行列中のB群(空腹サンプルに相当)の位置(X-Y列)のXとYを指定
    param3 <- 0.1                                                    #FDRの閾値を指定
    out_f1 <- "hoge_upregulated_in_B.txt"                            #出力ファイル名1を指定
    out_f2 <- "hoge_upregulated_in_A.txt"                            #出力ファイル名2を指定
    
    #必要なパッケージをロード
    library(GSA)                                                     #GSAパッケージ(ライブラリ)の読み込み
    
    #データファイルの読み込みとラベル情報の作成
    gmt <- GSA.read.gmt(in_f2)                                       #遺伝子セット情報を読み込んでgmtに格納(不完全な最終行が見つかりました、と警告が出ますが気にしなくてよい)
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    colnames(data)                                                   #dataの列名を表示。GSM184414-184437まで順番に並んでいることを確認
    rownames(data) <- toupper(rownames(data))                        #gene symbolを大文字に変換している(gmtファイルに合わせるためです)
    data <- data[,c(param1, param2)]                                 #発現データの中から、ここで比較するLIVサンプルの列のみを抽出した結果をdataに格納
    data.cl <- c(rep(1, length(param1)), rep(2, length(param2)))     #A群を1、B群を2としたベクトルdata.clを作成。
    
    #GSA本番
    out <- GSA(data, data.cl, genesets=gmt$genesets, genenames=rownames(data), resp.type="Two class unpaired")#GSAを実行し、結果をoutに格納
    tmp <- GSA.listsets(out, geneset.names=gmt$geneset.names, maxchar=max(nchar(gmt$geneset.names)), FDRcut=param3)#(param3)で指定したFDR閾値を満たす遺伝子セットのみ、発現変動の向き(「A群が高発現」と「B群が高発現」)ごとにリストアップした結果をtmpに格納
    
    write.table(tmp$positive, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmp$positiveの中身をout_f1で指定したファイル名で保存。
    write.table(tmp$negative, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp$negativeの中身をout_f2で指定したファイル名で保存。
    
    
    
    2.褐色脂肪の「満腹 vs. 空腹」のKEGG Pathway解析の場合(発現データファイルが異なり、褐色脂肪のみに予めなっている場合:data_rma_2_nr_BAT.txt)
    in_f1 <- "data_rma_2_nr_BAT.txt"                                 #入力ファイル名(発現データファイル)を指定
    in_f2 <- "c2.cp.kegg.v3.0.symbols.gmt"                           #入力ファイル名(gmtファイル)を指定
    param1 <- 4                                                      #A群のサンプル数を指定
    param2 <- 4                                                      #B群のサンプル数を指定
    param3 <- 0.1                                                    #FDRの閾値を指定
    out_f1 <- "hoge_upregulated_in_B.txt"                            #出力ファイル名1を指定
    out_f2 <- "hoge_upregulated_in_A.txt"                            #出力ファイル名2を指定
    
    #必要なパッケージをロード
    library(GSA)                                                     #GSAパッケージ(ライブラリ)の読み込み
    
    #データファイルの読み込みとラベル情報の作成
    gmt <- GSA.read.gmt(in_f2)                                       #遺伝子セット情報を読み込んでgmtに格納(不完全な最終行が見つかりました、と警告が出ますが気にしなくてよい)
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    rownames(data) <- toupper(rownames(data))                        #gene symbolを大文字に変換している(gmtファイルに合わせるためです)
    data.cl <- c(rep(1, param1), rep(2, param2))                     #A群を1、B群を2としたベクトルdata.clを作成。
    
    #GSA本番
    out <- GSA(data, data.cl, genesets=gmt$genesets, genenames=rownames(data), resp.type="Two class unpaired")#GSAを実行し、結果をoutに格納
    tmp <- GSA.listsets(out, geneset.names=gmt$geneset.names, maxchar=max(nchar(gmt$geneset.names)), FDRcut=param3)#(param3)で指定したFDR閾値を満たす遺伝子セットのみ、発現変動の向き(「A群が高発現」と「B群が高発現」)ごとにリストアップした結果をtmpに格納
    
    write.table(tmp$positive, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmp$positiveの中身をout_f1で指定したファイル名で保存。
    write.table(tmp$negative, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp$negativeの中身をout_f2で指定したファイル名で保存。
    
    
    
    3.肝臓の「満腹 vs. 空腹」のGene Ontology(Biological Process)解析の場合(FDR < 0.1を満たす遺伝子セットを抽出)
    in_f1 <- "data_rma_2_nr.txt"                                     #入力ファイル名(発現データファイル)を指定
    in_f2 <- "c5.bp.v3.0.symbols.gmt"                                #入力ファイル名(gmtファイル)を指定
    param1 <- 17:20                                                  #遺伝子発現行列中のA群(満腹サンプルに相当)の位置(X-Y列)のXとYを指定
    param2 <- 21:24                                                  #遺伝子発現行列中のB群(空腹サンプルに相当)の位置(X-Y列)のXとYを指定
    param3 <- 0.1                                                    #FDRの閾値を指定
    out_f1 <- "hoge_upregulated_in_B.txt"                            #出力ファイル名1を指定
    out_f2 <- "hoge_upregulated_in_A.txt"                            #出力ファイル名2を指定
    
    #必要なパッケージをロード
    library(GSA)                                                     #GSAパッケージ(ライブラリ)の読み込み
    
    #データファイルの読み込みとラベル情報の作成
    gmt <- GSA.read.gmt(in_f2)                                       #遺伝子セット情報を読み込んでgmtに格納(不完全な最終行が見つかりました、と警告が出ますが気にしなくてよい)
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    colnames(data)                                                   #dataの列名を表示。GSM184414-184437まで順番に並んでいることを確認
    rownames(data) <- toupper(rownames(data))                        #gene symbolを大文字に変換している(gmtファイルに合わせるためです)
    data <- data[,c(param1, param2)]                                 #発現データの中から、ここで比較するLIVサンプルの列のみを抽出した結果をdataに格納
    data.cl <- c(rep(1, length(param1)), rep(2, length(param2)))     #A群を1、B群を2としたベクトルdata.clを作成。
    
    #GSA本番
    out <- GSA(data, data.cl, genesets=gmt$genesets, genenames=rownames(data), resp.type="Two class unpaired")#GSAを実行し、結果をoutに格納
    tmp <- GSA.listsets(out, geneset.names=gmt$geneset.names, maxchar=max(nchar(gmt$geneset.names)), FDRcut=param3)#(param3)で指定したFDR閾値を満たす遺伝子セットのみ、発現変動の向き(「A群が高発現」と「B群が高発現」)ごとにリストアップした結果をtmpに格納
    
    write.table(tmp$positive, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmp$positiveの中身をout_f1で指定したファイル名で保存。
    write.table(tmp$negative, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp$negativeの中身をout_f2で指定したファイル名で保存。
    
    
    
    4.肝臓の「満腹 vs. 空腹」のGene Ontology(Biological Process)解析の場合(発現データファイルが異なり、褐色脂肪のみに予めなっている場合:data_rma_2_nr_LIV.txt)
    in_f1 <- "data_rma_2_nr_LIV.txt"                                 #入力ファイル名(発現データファイル)を指定
    in_f2 <- "c5.bp.v3.0.symbols.gmt"                                #入力ファイル名(gmtファイル)を指定
    param1 <- 4                                                      #A群のサンプル数を指定
    param2 <- 4                                                      #B群のサンプル数を指定
    param3 <- 0.1                                                    #FDRの閾値を指定
    out_f1 <- "hoge_upregulated_in_B.txt"                            #出力ファイル名1を指定
    out_f2 <- "hoge_upregulated_in_A.txt"                            #出力ファイル名2を指定
    
    #必要なパッケージをロード
    library(GSA)                                                     #GSAパッケージ(ライブラリ)の読み込み
    
    #データファイルの読み込みとラベル情報の作成
    gmt <- GSA.read.gmt(in_f2)                                       #遺伝子セット情報を読み込んでgmtに格納(不完全な最終行が見つかりました、と警告が出ますが気にしなくてよい)
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    rownames(data) <- toupper(rownames(data))                        #gene symbolを大文字に変換している(gmtファイルに合わせるためです)
    data.cl <- c(rep(1, param1), rep(2, param2))                     #A群を1、B群を2としたベクトルdata.clを作成。
    
    #GSA本番
    out <- GSA(data, data.cl, genesets=gmt$genesets, genenames=rownames(data), resp.type="Two class unpaired")#GSAを実行し、結果をoutに格納
    tmp <- GSA.listsets(out, geneset.names=gmt$geneset.names, maxchar=max(nchar(gmt$geneset.names)), FDRcut=param3)#(param3)で指定したFDR閾値を満たす遺伝子セットのみ、発現変動の向き(「A群が高発現」と「B群が高発現」)ごとにリストアップした結果をtmpに格納
    
    write.table(tmp$positive, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmp$positiveの中身をout_f1で指定したファイル名で保存。
    write.table(tmp$negative, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp$negativeの中身をout_f2で指定したファイル名で保存。
    
    
    
    5.肝臓の「満腹 vs. 空腹」のmotif解析の場合(発現データファイルが異なり、褐色脂肪のみに予めなっている場合:data_rma_2_nr_LIV.txt)
    in_f1 <- "data_rma_2_nr_LIV.txt"                                 #入力ファイル名(発現データファイル)を指定
    in_f2 <- "c3.all.v3.0.symbols.gmt"                               #入力ファイル名(gmtファイル)を指定
    param1 <- 4                                                      #A群のサンプル数を指定
    param2 <- 4                                                      #B群のサンプル数を指定
    param3 <- 0.1                                                    #FDRの閾値を指定
    out_f1 <- "upregulated_in_B_LIV_motif.txt"                       #出力ファイル名1を指定
    out_f2 <- "upregulated_in_A_LIV_motif.txt"                       #出力ファイル名2を指定
    
    #必要なパッケージをロード
    library(GSA)                                                     #GSAパッケージ(ライブラリ)の読み込み
    
    #データファイルの読み込みとラベル情報の作成
    gmt <- GSA.read.gmt(in_f2)                                       #遺伝子セット情報を読み込んでgmtに格納(不完全な最終行が見つかりました、と警告が出ますが気にしなくてよい)
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    rownames(data) <- toupper(rownames(data))                        #gene symbolを大文字に変換している(gmtファイルに合わせるためです)
    data.cl <- c(rep(1, param1), rep(2, param2))                     #A群を1、B群を2としたベクトルdata.clを作成。
    
    #GSA本番
    out <- GSA(data, data.cl, genesets=gmt$genesets, genenames=rownames(data), resp.type="Two class unpaired")#GSAを実行し、結果をoutに格納
    tmp <- GSA.listsets(out, geneset.names=gmt$geneset.names, maxchar=max(nchar(gmt$geneset.names)), FDRcut=param3)#(param3)で指定したFDR閾値を満たす遺伝子セットのみ、発現変動の向き(「A群が高発現」と「B群が高発現」)ごとにリストアップした結果をtmpに格納
    
    write.table(tmp$positive, out_f1, sep="\t", append=F, quote=F, row.names=F)#tmp$positiveの中身をout_f1で指定したファイル名で保存。
    write.table(tmp$negative, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp$negativeの中身をout_f2で指定したファイル名で保存。
    
    
    

    CRANのGSAのwebページ
    CRANのGSAのPDFマニュアル
    参考文献(Efron and Tibshirani, Ann. Appl. Stat., 2007)
    GSAのウェブページ

    解析 | 機能解析 | Gene set analysis (GSA)の動作確認

    動作確認用です。。。

    「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動し、以下をコピペ 1. data_rma_2_nr_BAT.txtのデータ
    in_f1 <- "data_rma_2_nr_BAT.txt"                                 #入力ファイル名(発現データファイル)を指定
    in_f2 <- "c2.cp.kegg.v3.0.symbols.gmt"                           #入力ファイル名(gmtファイル)を指定
    param1 <- 4                                                      #A群のサンプル数を指定
    param2 <- 4                                                      #B群のサンプル数を指定
    out_f1 <- "hoge1.txt"                                            #出力ファイル名を指定
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(GSA)                                                     #GSAパッケージ(ライブラリ)の読み込み
    
    #データファイルの読み込みとラベル情報の作成
    gmt <- GSA.read.gmt(in_f2)                                       #遺伝子セット情報を読み込んでgmtに格納(不完全な最終行が見つかりました、と警告が出ますが気にしなくてよい)
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    rownames(data) <- toupper(rownames(data))                        #gene symbolを大文字に変換している(gmtファイルに合わせるためです)
    data.cl <- c(rep(1, param1), rep(2, param2))                     #A群を1、B群を2としたベクトルdata.clを作成。
    
    #log2(B/A)の計算
    logratio <- rowMeans(data[,data.cl==2]) - rowMeans(data[,data.cl==1])
    
    #検証本番
    out1 <- NULL
    out2 <- NULL
    for(i in 1:length(gmt$geneset.names)){
        geneset <- is.element(rownames(data), gmt$genesets[[i]])
        out1 <- rbind(out1, c(gmt$geneset.names[i], length(gmt$genesets[[i]]), sum(geneset), mean(logratio[geneset]), median(logratio[geneset])))
        out2 <- cbind(out2, geneset)
    }
    colnames(out2) <- gmt$geneset.names
    
    colnames(out1) <- c("GeneSet_name", "Member_num", "Member_num_in_thischip", "mean(logratio)", "median(logratio)")
    write.table(out1, out_f1, sep="\t", append=F, quote=F, row.names=F)#out1の中身をout_f1で指定したファイル名で保存。
    
    tmp2 <- cbind(rownames(data), data, logratio, out2)
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    
    2. data_rma_2_nr_LIV.txtのデータ
    in_f1 <- "data_rma_2_nr_LIV.txt"                                 #入力ファイル名(発現データファイル)を指定
    in_f2 <- "c5.bp.v3.0.symbols.gmt"                                #入力ファイル名(gmtファイル)を指定
    param1 <- 4                                                      #A群のサンプル数を指定
    param2 <- 4                                                      #B群のサンプル数を指定
    out_f1 <- "hoge1.txt"                                            #出力ファイル名を指定
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    
    #必要なパッケージをロード
    library(GSA)                                                     #GSAパッケージ(ライブラリ)の読み込み
    
    #データファイルの読み込みとラベル情報の作成
    gmt <- GSA.read.gmt(in_f2)                                       #遺伝子セット情報を読み込んでgmtに格納(不完全な最終行が見つかりました、と警告が出ますが気にしなくてよい)
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    rownames(data) <- toupper(rownames(data))                        #gene symbolを大文字に変換している(gmtファイルに合わせるためです)
    data.cl <- c(rep(1, param1), rep(2, param2))                     #A群を1、B群を2としたベクトルdata.clを作成。
    
    #log2(B/A)の計算
    logratio <- rowMeans(data[,data.cl==2]) - rowMeans(data[,data.cl==1])
    
    #検証本番
    out1 <- NULL
    out2 <- NULL
    for(i in 1:length(gmt$geneset.names)){
        geneset <- is.element(rownames(data), gmt$genesets[[i]])
        out1 <- rbind(out1, c(gmt$geneset.names[i], length(gmt$genesets[[i]]), sum(geneset), mean(logratio[geneset]), median(logratio[geneset])))
        out2 <- cbind(out2, geneset)
    }
    colnames(out2) <- gmt$geneset.names
    
    colnames(out1) <- c("GeneSet_name", "Member_num", "Member_num_in_thischip", "mean(logratio)", "median(logratio)")
    write.table(out1, out_f1, sep="\t", append=F, quote=F, row.names=F)#out1の中身をout_f1で指定したファイル名で保存。
    
    tmp2 <- cbind(rownames(data), data, logratio, out2)
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    

    CRANのGSAのwebページ
    CRANのGSAのPDFマニュアル
    参考文献(Efron and Tibshirani, Ann. Appl. Stat., 2007)
    GSAのウェブページ

    解析 | 機能解析 | pcot2 (Kong_2006)


    library(pcot2)                                 #パッケージの読み込み
    
    
    

    Bioconductorのpcot2のwebページ

    参考文献(Kong et al., Bioinformatics, 2006)

    解析 | 機能解析 | SAFE (Barry_2005)


    library(SAFE)                                 #パッケージの読み込み
    
    
    

    BioconductorのSAFEのwebページ

    参考文献(Barry et al., Bioinformatics, 2005)

    解析 | 機能解析 | Category (Jiang_2007)


    library(Category)                             #パッケージの読み込み
    
    
    

    BioconductorのCategoryのwebページ

    参考文献(Jiang et al., Bioinformatics, 2007)

    解析 | 機能解析 | sigPathway (Tian_2005)


    library(sigPathway)                             #パッケージの読み込み
    
    
    

    BioconductorのsigPathwayのwebページ

    参考文献(Tian et al., PNAS, 2005)

    解析 | 機能解析 | SPIA (Tarca_2009)


    library(SPIA)                                   #パッケージの読み込み
    
    
    

    BioconductorのSPIAのwebページ

    参考文献(Tarca et al., Bioinformatics, 2009)

    解析 | 機能解析 | globaltest (Goeman_2004)

    global testを用いた方法です。
    library(globaltest)                             #パッケージの読み込み
    
    
    

    Bioconductorのglobaltestのwebページ

    参考文献(Goeman et al., Bioinformatics, 2004)

    解析 | 機能解析 | Gene Ontlogy解析 | topGO (Alexa_2006)

    library(topGO)                                  #パッケージの読み込み
    
    
    

    BioconductorのtopGOのwebページ

    参考文献(Alexa et al., Bioinformatics, 2006)

    解析 | クラスタリング | 階層的 | について

    参考文献1(Smolkin and Ghosh, BMC Bioinformatics, 2003)
    参考文献2(Bittner et al., Nature, 2000)
    参考文献3(Ben-Hur et al., Pac. Symp. Biocomput., 2002)
    参考文献4(Jonnalagadda and Srinivasan, BMC Bioinformatics, 2009)

    解析 | クラスタリング | 階層的 | pvclust (Suzuki_2006)

    最も一般的なクラスタリング手法。
    このパッケージはさらに、二つのブートストラップ法により得られたクラスターのp値を表示してくれます。具体的には、 一般的なブートストラップ法によって得られるブートストラップ確率BP(Bootstrap Probability; 多数のサンプリングから特定のクラスターが形成される確率;樹形図上で緑色の数値)とともに、 より高精度なブートストラップ法であるmultiscale bootstrap resamplingにより得られた"近似的に偏りのない(Approximately Unbiased;樹形図上で赤色の数値)" 確率(%)を示してくれます。
    (デフォルトでは)後者の方法により得られたp値が95%以上の確率で頑健なクラスターを四角く囲ってくれるところがこのパッケージの特徴です。 (今は解消されているのかもしれませんが、また私の理解が間違っているのかもしれませんが...)ブートストラップ回数を変えて結果を眺めると、 大元のクラスタリング結果は変わらずに枝に付加されるブートストラップ確率の値が微妙に変わるだけなはず(←この私の理解がまちがっていなければ)なのですが、"同じデータでも"樹形図の形が微妙に変わってしまうという経験をしました(ほかのユーザーからも同様のコメントをいただいたことがあります)。 2010/8/5にあらためて、例題のサンプルデータでリサンプリング回数を10,20,30回の場合でやってみると、ちゃんと樹形図の形が変わらずにブートストラップ確率の数値だけが変わっていたので、私からのバグレポートはできませんでした。どなたかこういう経験をなさったかたは下平先生(と私)までお願いいたします。
    pvclustを行う際には
    ・発現ベクトル間の類似度(method.dist): correlation (デフォルト; 1-相関係数に相当),uncentered, abscorなど
    および
    ・クラスターをまとめる方法(method.hclust): average (デフォルト), single, complete, ward, mcquitty, median, centroid
    を指定してやる必要があります。
    数式などの詳細は参考PDFをごらんください。
    また、ブートストラップ確率を計算するためのresampling回数も指定する必要があります。

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

    1. 36 sample×22,283 genesからなるGDS1096_rma.txtのサンプル間クラスタリングを行う場合:
    in_f <- "GDS1096_rma.txt"                                        #入力ファイル名(発現データファイル)を指定
    param1 <- "correlation"                                          #類似度(method.dist)を指定
    param2 <- "average"                                              #方法(method.hclust)を指定
    param3 <- 20                                                     #resampling回数を指定(この値が大きいほどより正確にブートストラップ確率を求めることができる。実際には100とか500とか...)
    
    #データファイルの読み込みとラベル情報の作成
    library(pvclust)                                                 #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    out <- pvclust(data, method.hclust=param2, method.dist=param1, nboot=param3)#クラスタリングの実行
    plot(out)                                                        #樹形図(デンドログラム)の表示
    
    #以下は(こんなこともできますという)おまけ
    #Approximately Unbiased (au) probability > 0.95を満たす頑健なクラスターを四角で囲み、その条件を満たすクラスターのメンバーをリストアップしたい場合:
    param4 <- "au"                                                   #ブートストラップ確率計算手段を指定
    param5 <- 0.95                                                   #ブートストラップ確率の閾値を指定
    pvrect(out, alpha=param5, pv=param4)                             #条件を満たすクラスターを四角で囲む
    pvpick(out, alpha=param5, pv=param4)                             #条件を満たすクラスターのメンバーをリストアップする
    
    
    
    2. 10 sample×45 genesからなるsample3.txtのサンプル間クラスタリングを特に何も考えずデフォルト設定(resampling回数が1000となるのですごく時間がかかります...)で行う場合:
    in_f <- "sample3.txt"                                            #入力ファイル名(発現データファイル)を指定
    library(pvclust)                                                 #パッケージの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    out <- pvclust(data)                                             #クラスタリングの実行
    plot(out)                                                        #樹形図(デンドログラム)の表示
    
    
    
    3. 10 sample×45 genesからなるsample3.txtの遺伝子間クラスタリングをやる場合(pvclustでの遺伝子間クラスタリングは時間がかかりすぎるのでお勧めできません...):
    in_f <- "sample3.txt"                                            #入力ファイル名(発現データファイル)を指定
    param1 <- "correlation"                                          #類似度(method.dist)を指定
    param2 <- "average"                                              #方法(method.hclust)を指定
    param3 <- 30                                                     #resampling回数を指定(この値が大きいほどより正確にブートストラップ確率を求めることができる。実際には100とか500とか...)
    
    #必要なパッケージをロード
    library(pvclust)                                                 #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    
    out <- pvclust(t(data), method.hclust=param2, method.dist=param1, nboot=param3)#クラスタリングの実行
    plot(out)                                                        #樹形図(デンドログラム)の表示
    
    
    
    CRANのpvclustのwebページ
    CRANのpvclustのPDFマニュアル
    参考文献(Suzuki and Shimodaira, Bioinformatics, 2006)

    解析 | クラスタリング | 階層的 | hclust

    最も一般的なクラスタリング手法。
    ・発現ベクトル間の類似度(dist): euclidean (デフォルト),maximum, manhattan, canberra, binary, minkowski
    および
    ・クラスターをまとめる方法(method): complete (デフォルト), ward, single, average, mcquitty, median, centroid
    を指定してやる必要があります。
    ただし、類似度として一般的?!な「1-相関係数」に相当するものは上記では指定できないので、1.のところで「1-相関係数」を類似度として定義するやり方を紹介しておきます。
    サンプル間クラスタリング程度なら、以下のやり方で得られる樹形図を眺めていろいろ考察することはできるでしょうが、数万遺伝子の遺伝子間クラスタリング結果だと不可能ですので、 特に遺伝子間クラスタリング結果の詳細な解析を行いたい場合には解析 | クラスタリング | 階層的 | hclust後の詳細な解析を参考にしてください(もちろんサンプル間クラスタリング結果の詳細な解析にも利用可能です。)。
    得られる樹形図をそのままpng形式のファイルに保存するやり方に変更しました(2010/1/29追加)。

    「ファイル」−「ディレクトリの変更」で解析したい(sample3.txt)ファイルを置いてあるディレクトリに移動し、以下をコピペ
    1. サンプル間クラスタリング(類似度:「1-Pearson相関係数」、方法:平均連結法(average))でR Graphics画面上に表示したい場合:
    in_f <- "sample3.txt"                                            #入力ファイル名(発現データファイル)を指定
    param2 <- "average"                                              #方法(method)を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    
    data.dist <- as.dist(1 - cor(data))                              #サンプル間の距離を計算し、結果をdata.distに格納
    out <- hclust(data.dist, method=param2)                          #階層的クラスタリングを実行し、結果をoutに格納
    plot(out)                                                        #樹形図(デンドログラム)の表示
    
    
    
    2. サンプル間クラスタリング(類似度:「1-Pearson相関係数」、方法:平均連結法(average))でpng形式のファイルで図の大きさを指定して得たい場合:
    in_f <- "sample3.txt"                                            #入力ファイル名(発現データファイル)を指定
    param2 <- "average"                                              #方法(method)を指定
    out_f <- "hoge.png"                                              #出力ファイル名(クラスタリング結果ファイル)を指定
    param3 <- 500                                                    #クラスタリング結果の横幅(width; 単位はピクセル)を指定
    param4 <- 400                                                    #クラスタリング結果の縦幅(height; 単位はピクセル)を指定
    param5 <- 14                                                     #クラスタリング結果の文字の大きさ(単位はpoint)を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    
    data.dist <- as.dist(1 - cor(data, method="pearson"))            #サンプル間の距離を計算し、結果をdata.distに格納
    out <- hclust(data.dist, method=param2)                          #階層的クラスタリングを実行し、結果をoutに格納
    png(out_f, pointsize=param5, width=param3, height=param4)        #出力ファイルの各種パラメータを指定
    plot(out)                                                        #樹形図(デンドログラム)の表示
    dev.off()                                                        #おまじない
    
    
    
    3. サンプル間クラスタリング(類似度:「1-Spearman相関係数」、方法:平均連結法(average))でpng形式のファイルで図の大きさを指定して得たい場合:
    in_f <- "sample3.txt"                                            #入力ファイル名(発現データファイル)を指定
    out_f <- "hoge.png"                                              #出力ファイル名(クラスタリング結果ファイル)を指定
    param2 <- "average"                                              #方法(method)を指定
    param3 <- 500                                                    #クラスタリング結果の横幅(width; 単位はピクセル)を指定
    param4 <- 400                                                    #クラスタリング結果の縦幅(height; 単位はピクセル)を指定
    param5 <- 14                                                     #クラスタリング結果の文字の大きさ(単位はpoint)を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    
    data.dist <- as.dist(1 - cor(data, method="spearman"))           #サンプル間の距離を計算し、結果をdata.distに格納
    out <- hclust(data.dist, method=param2)                          #階層的クラスタリングを実行し、結果をoutに格納
    png(out_f, pointsize=param5, width=param3, height=param4)        #出力ファイルの各種パラメータを指定
    plot(out)                                                        #樹形図(デンドログラム)の表示
    dev.off()                                                        #おまじない
    
    
    
    4. サンプル間クラスタリング(類似度:ユークリッド距離(euclidean)、方法:平均連結法(average))でR Graphics画面上に表示したい場合:
    in_f <- "sample3.txt"                                            #入力ファイル名(発現データファイル)を指定
    param1 <- "euclidean"                                            #類似度(dist)を指定
    param2 <- "average"                                              #方法(method)を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    
    data.dist <- dist(t(data), method=param1)                        #サンプル間の距離を計算し、結果をdata.distに格納
    out <- hclust(data.dist, method=param2)                          #階層的クラスタリングを実行し、結果をoutに格納
    plot(out)                                                        #樹形図(デンドログラム)の表示
    
    
    
    5. サンプル間クラスタリング(類似度:ユークリッド距離(euclidean)、方法:平均連結法(average))でpng形式のファイルで図の大きさを指定して得たい場合:
    in_f <- "sample3.txt"                                            #入力ファイル名(発現データファイル)を指定
    out_f <- "hoge.png"                                              #出力ファイル名(クラスタリング結果ファイル)を指定
    param1 <- "euclidean"                                            #類似度(dist)を指定
    param2 <- "average"                                              #方法(method)を指定
    param3 <- 500                                                    #クラスタリング結果の横幅(width; 単位はピクセル)を指定
    param4 <- 400                                                    #クラスタリング結果の縦幅(height; 単位はピクセル)を指定
    param5 <- 14                                                     #クラスタリング結果の文字の大きさ(単位はpoint)を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    
    data.dist <- dist(t(data), method=param1)                        #サンプル間の距離を計算し、結果をdata.distに格納
    out <- hclust(data.dist, method=param2)                          #階層的クラスタリングを実行し、結果をoutに格納
    png(out_f, pointsize=param5, width=param3, height=param4)        #出力ファイルの各種パラメータを指定
    plot(out)                                                        #樹形図(デンドログラム)の表示
    dev.off()                                                        #おまじない
    
    
    
    6. 遺伝子間クラスタリング(類似度:ユークリッド距離(euclidean)、方法:平均連結法(average))の場合:
    in_f <- "sample3.txt"                                            #入力ファイル名(発現データファイル)を指定
    param1 <- "euclidean"                                            #類似度(dist)を指定
    param2 <- "average"                                              #方法(method)を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    
    data.dist <- dist(data, method=param1)                           #遺伝子間の距離を計算し、結果をdata.distに格納
    out <- hclust(data.dist, method=param2)                          #階層的クラスタリングを実行し、結果をoutに格納
    plot(out)                                                        #樹形図(デンドログラム)の表示
    
    
    
    7. 遺伝子間クラスタリング(類似度:1 - 相関係数、方法:平均連結法(average))の場合:
    in_f <- "sample3.txt"                                            #入力ファイル名(発現データファイル)を指定
    param2 <- "average"                                              #方法(method)を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    
    data.dist <- as.dist(1 - cor(t(data)))                           #遺伝子間の距離を計算し、結果をdata.distに格納
    out <- hclust(data.dist, method=param2)                          #階層的クラスタリングを実行し、結果をoutに格納
    plot(out)                                                        #樹形図(デンドログラム)の表示
    
    
    

    解析 | クラスタリング | 階層的 | hclust後の詳細な解析

    解析 | クラスタリング | 階層的 | hclustで得られる情報は樹形図(デンドログラム)だけです。 サンプル間クラスタリング程度なら得られる樹形図を眺めていろいろ考察することはできるでしょうが、数万遺伝子の遺伝子間クラスタリング結果だと不可能ですので、 特に遺伝子間クラスタリング結果の詳細な解析を行いたい場合(もちろんサンプル間クラスタリング結果の詳細な解析にも利用可能です)にここで紹介するやり方を利用します。
    ここでは、1. 「102 sample×3,274 genes」からなるdata_Singh_RMA_3274.txtや2. 「10 sample×45 genes」からなるsample3.txtの遺伝子間クラスタリングを行った後、 任意のK個のクラスターに分割した場合にどの遺伝子(or サンプル)がどのクラスターに属するかを知るやり方を紹介します。当然のことながら、Kの最大値は1. の遺伝子間クラスタリングの結果だと3,274で、2.の遺伝子間クラスタリングの結果だと45となります。

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

    1. data_Singh_RMA_3274.txtの遺伝子間クラスタリングの場合(類似度:1 - 相関係数、方法:平均連結法(average)):
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名(発現データファイル)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 10                                                     #K個のクラスターに分割のKを指定
    param2 <- "average"                                              #方法(method)を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    
    #まずはクラスタリングを実行
    data.dist <- as.dist(1 - cor(t(data)))                           #遺伝子間の距離を計算し、結果をdata.distに格納
    out <- hclust(data.dist, method=param2)                          #階層的クラスタリングを実行し、結果をoutに格納
    
    #param1で指定した数に分割しファイルに保存
    cluster <- cutree(out, k=param1)                                 #param1個のクラスターに分割し、結果をclusterに格納
    tmp <- cbind(rownames(data), data, cluster)                      #入力データの右側にclusterの情報を追加してtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #クラスターごとにソートした結果を得たい場合:
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(cluster),]                                     #cluster列の値でソートした結果をtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    
    2. sample3.txt遺伝子間クラスタリングの場合(類似度:ユークリッド距離(euclidean)、方法:平均連結法(average)):
    in_f <- "sample3.txt"                                            #入力ファイル名(発現データファイル)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 3                                                      #K個のクラスターに分割のKを指定
    param2 <- "euclidean"                                            #類似度(dist)を指定
    param3 <- "average"                                              #方法(method)を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    
    #まずはクラスタリングを実行
    data.dist <- dist(data, method=param2)                           #遺伝子間の距離を計算し、結果をdata.distに格納
    out <- hclust(data.dist, method=param3)                          #階層的クラスタリングを実行し、結果をoutに格納
    
    #param1で指定した数に分割しファイルに保存
    cluster <- cutree(out, k=param1)                                 #param1個のクラスターに分割し、結果をclusterに格納
    tmp <- cbind(rownames(data), data, cluster)                      #入力データの右側にclusterの情報を追加してtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    #以下は(こんなこともできますという)おまけ
    #クラスターごとにソートした結果を得たい場合:
    out_f2 <- "hoge2.txt"                                            #出力ファイル名を指定
    tmp2 <- tmp[order(cluster),]                                     #cluster列の値でソートした結果をtmp2に格納
    write.table(tmp2, out_f2, sep="\t", append=F, quote=F, row.names=F)#tmp2の中身をout_f2で指定したファイル名で保存。
    
    
    
    3. data_GSE7623_rma.txtのサンプル間クラスタリングの場合(類似度:1 - 相関係数、方法:平均連結法(average)):
    in_f <- "data_GSE7623_rma.txt"                                   #入力ファイル名(発現データファイル)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    param1 <- 2:10                                                   #K個のクラスターに分割のKを指定(ここでは2-10を一度に指定←こんなこともできます)
    param2 <- "average"                                              #方法(method)を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    colnames(data) <- c(                                             #サンプル名を変更している
    "BAT_fed1", "BAT_fed2", "BAT_fed3", "BAT_fed4",                  #サンプル名を変更している
    "BAT_fasted1", "BAT_fasted2", "BAT_fasted3", "BAT_fasted4",      #サンプル名を変更している
    "WAT_fed1", "WAT_fed2", "WAT_fed3", "WAT_fed4",                  #サンプル名を変更している
    "WAT_fasted1", "WAT_fasted2", "WAT_fasted3", "WAT_fasted4",      #サンプル名を変更している
    "LIV_fed1", "LIV_fed2", "LIV_fed3", "LIV_fed4",                  #サンプル名を変更している
    "LIV_fasted1", "LIV_fasted2", "LIV_fasted3", "LIV_fasted4")      #サンプル名を変更している
    
    #まずはクラスタリングを実行
    data.dist <- as.dist(1 - cor(data))                              #遺伝子間の距離を計算し、結果をdata.distに格納
    out <- hclust(data.dist, method=param2)                          #階層的クラスタリングを実行し、結果をoutに格納
    
    #param1で指定した数に分割しファイルに保存
    cluster <- cutree(out, k=param1)                                 #param1個のクラスターに分割し、結果をclusterに格納
    tmp <- cbind(colnames(data), cluster)                            #サンプル名の右側にk個に分割した(例ではk=2,3,...,10)場合のclusterの情報を追加してtmpに格納。
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    

    解析 | クラスタリング | 階層的 | 最適なクラスター数を見積る

    参考文献1の方法を用いてクラスター数を見積ります。
    もしご自身のデータを実行したときに「メモリが足りない!」などと文句を言われたら、前処理 | 遺伝子のフィルタリング4 (CVが小さいものを削除)を参考にして遺伝子数を減らしてから行ってください。 以下では、前処理 | 遺伝子のフィルタリング4 (CVが小さいものを削除)の例題を実行して得られたAffymetrix Rat Genome 230 2.0 Arrayの対数変換後(log2変換後)の24 samples×2,127遺伝子からなる遺伝子発現データ(data_GSE7623_rma_cv.txt; 参考文献2)のサンプル間クラスタリングにおいて、最適なクラスター数kを見積り、各サンプルがどのクラスターに属しているかの結果を返すところまでを示します。
    解析例で示す24 samples×2,127 genesからなる遺伝子発現行列データのサンプルラベル情報は以下の通りです。
    ---------------------------------------------------------- GSM184414-184417: Brown adipose tissue (BAT), fed GSM184418-184421: Brown adipose tissue (BAT), 24 h-fasted GSM184422-184425: White adipose tissue (WAT), fed GSM184426-184429: White adipose tissue (WAT), 24 h-fasted GSM184430-184433: Liver tissue (LIV), fed GSM184434-184437: Liver tissue (LIV), 24 h-fasted ---------------------------------------------------------- 「ファイル」−「ディレクトリの変更」で解析したいファイル(data_GSE7623_rma_cv.txt)を置いてあるディレクトリに移動し、以下をコピペ
    in_f <- "data_GSE7623_rma_cv.txt"                                #入力ファイル名を指定
    param1 <- 9                                                      #クラスター数の探索範囲の上限
    param2 <- "average"                                              #方法(method)を指定
    param3 <- 100                                                    #ランダムサンプリング回数を指定(できれば1000くらいを指定したほうがよいと思います)
    
    #必要なパッケージをロード
    library(clusterStab)                                             #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    data <- as.matrix(data)                                          #dataのデータ形式をmatrix型に変更
    
    out <- benhur(data, 0.7, param1, seednum=12345, iterations=param3, linkmeth=param2)#最適クラスター数の探索を実行し、結果をoutに格納
    hist(out)                                                        #候補クラスター数ごと(2, 3, ..., param)のJaccard係数分布を表示
    
    
    
    解説:
    ここでやっていることは、候補クラスター数k個について、2, 3, ..., param個の可能性について調べています。(間違っていたらすいません)
    1. まずはk=2の場合について調べます。
    2. もともとのサンプル数(この場合24サンプル)のデータについて階層的クラスタリングを行います。
    3. 得られた樹形図をもとにk個のクラスターに分けます。
    4. もともとのサンプル数のの70%のサンプル(subsamples)をランダムに抽出し階層的クラスタリングを行い、k個のクラスターに分けます。
    5. 3.のsubsamplesと4.のsubsamplesのクラスター間のJaccard係数?!を計算します。
    6. 4と5を"param3"回行い、Jaccard係数?!の分布を調べた結果がk=2のヒストグラムです。
    7. k=3, 4, ..., paramの場合についても同様の計算を行います。
    したがって、Jaccard係数?!が1になった回数が"param3"回であれば一番理想的な結果となるわけです。 ですので、ヒストグラムの見方は、横軸のfrequencyが1.0のところに棒が集中、あるいはできるだけ1.0の近くにmajorityがあるようなヒストグラムを示すkの値が最適なクラスター数、という結論になります。解析例の場合はk=2 or 3が採用されるべきと判断します。

    「以下にエラー plot.new() : 図の余白が大きす...」などとエラーメッセージが出る場合は、Rの画面を広げて、もう一度コマンドを実行してみてください。
    ご自身のデータでヒストグラムの結果ではどのkを採用すればいいか判断がつきづらい場合には、以下をコピペしてみてください。これも見せ方を少し変えているだけで、解析例の場合だと、k=2がもっともよくて、二番目がk=5、三番目がk=6というような見方をします。
    ecdf(out)
    
    
    
    ここまでで、最適なクラスター数が2 or 3個であることがわかりました。次に参考文献3の方法を用いて各クラスターがどれだけ安定なのかをclusterComp関数を用いて調べるとともに、各サンプルがどのクラスターに属しているかの結果を指定した出力ファイル名で保存します。
    param3 <- 2                                                      #得られた最適なクラスター数(例では2)を指定
    out_f <- "hoge.txt"                                              #出力ファイル名を指定
    out2 <- clusterComp(data, param3, method=param2)                 #各クラスターの安定性を見積る
    out2                                                             #out2の中身を表示(cluster1,2ともに100%の安定性であることが分かる)
    str(out2)                                                        #out2というオブジェクトの内容を情報付きで表示
    out2@clusters                                                    #各サンプルがどのクラスターに属するのかを表示
    tmp <- cbind(names(out2@clusters), out2@clusters)                #サンプル名とクラスター番号との対応関係をtmpに格納
    write.table(tmp, out_f, sep="\t", append=F, quote=F, row.names=F)#tmpの中身をout_fで指定したファイル名で保存。
    
    
    

    BioconductorのclusterStabのwebページ

    参考文献1(Ben-Hur et al., Pac. Symp. Biocomput., 2002)
    参考文献2(Nakai et al., BBB, 2008)
    参考文献3(Smolkin and Ghosh, BMC Bioinformatics, 2003)

    解析 | クラスタリング | 非階層的 | K-means

    何個のクラスター(Kの数)にするのがよいか?(cluster validity問題)を探すために提案された指標(選択可)を用いて適切なクラスター数を計算する機能もついている。

    「ファイル」−「ディレクトリの変更」で解析したいファイル(sample3.txt)を置いてあるディレクトリに移動。
    in_f <- "sample3.txt"                                            #入力ファイル名を指定
    
    #必要なパッケージをロード
    library(cclust)                                                  #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    data <- as.matrix(data)                                          #dataのデータ形式をmatrix型に変更
    
    #まずはKをいろいろ変えて得られるクラスターを眺める
    sample3_k2 <- cclust(data, 2, 20, verbose=TRUE, method="kmeans") #K=2として遺伝子のクラスタリングを実行
    sample3_k3 <- cclust(data, 3, 20, verbose=TRUE, method="kmeans") #K=3として遺伝子のクラスタリングを実行
    sample3_k4 <- cclust(data, 4, 20, verbose=TRUE, method="kmeans") #K=4として遺伝子のクラスタリングを実行
    sample3_k5 <- cclust(data, 5, 20, verbose=TRUE, method="kmeans") #K=5として遺伝子のクラスタリングを実行
    sample3_k2
    sample3_k3
    sample3_k4
    sample3_k5
    
    #Cluster validity Indexの一つであるDB(Davies-Bouldin) Indexを用いて、K=2, 3, 4, 5として得られたクラスターを評価する
    clustIndex(sample3_k2, data, index="db")
    clustIndex(sample3_k3, data, index="db")
    clustIndex(sample3_k4, data, index="db")
    clustIndex(sample3_k5, data, index="db")
    
    #K=3でクラスタリングした結果(sample3_k3)から詳細な情報を入手したい場合。(2005.6.6追加)
    names(sample3_k3)                                                #sample3_k3からどのような情報を入手できるのか調べる。
    sample3_k3$cluster                                               #遺伝子の並び順に、どのクラスに属するかをざっと表示
    for(i in 1:nrow(sample3)) cat(rownames(data[i,]),"	",sample3_k3$cluster[i],"\n")#遺伝子の並び順に、どの遺伝子がどのクラスに属するか全体を表示
    
    
    
    DB Indexは、その値が低いものほど分割数が妥当であることを意味する。したがって、いろいろ調べた中で最も値の低かったものを採用(この場合、おそらくK=3)する。 (特にK=5とした場合に、Sizes of Clustersが1になるクラスターがときどき出現する。このような場合clustIndexで調べたときにエラーとなるようだ)
    CRANのcclustのwebページ
    CRANのcclustのPDFマニュアル

    解析 | クラスタリング | 非階層的 | Self-Organizing Maps (SOM)

    マイクロアレイデータ解析で似た発現パターンを示す遺伝子(or 組織)を自己組織化マップ(Self-Organizing Map; SOM)によりクラスタリングしたいときに用います。

    「ファイル」−「ディレクトリの変更」で解析したい(sample2.txt)ファイルを置いてあるディレクトリに移動。
    1. 組織(tissue)間クラスタリングの場合:
    in_f <- "sample2.txt"                                            #入力ファイル名を指定
    
    #必要なパッケージをロード
    library(som)                                                     #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    
    sample2.f <- filtering(data, lt=10, ut=100, mmr=2.9, mmd=42)     #解析に用いる遺伝子のフィルタリング(発現強度が10以下のものを10に、100以上のものを100に、「発現強度max/min < 2.9」または「(max-min) < 42」の行(遺伝子)を解析から除く)
    sample2.f.n <- normalize(sample2.f, byrow=TRUE)                  #行(row)方向の正規化(平均=0,分散=1); (列方向にしたいときはcolにする)
    foo <- som(t(sample2.f.n), xdim=3, ydim=5)                       #SOMの実行(「x軸方向3分割×y軸方向5分割」にする場合)
    plot(foo)                                                        #結果のプロット
    
    
    
    2. 遺伝子(gene)間クラスタリングの場合:
    in_f <- "sample2.txt"                                            #入力ファイル名を指定
    
    #必要なパッケージをロード
    library(som)                                                     #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    
    sample2.f <- filtering(data, lt=10, ut=100, mmr=2.9, mmd=42)     #解析に用いる遺伝子のフィルタリング(発現強度が10以下のものを10に、100以上のものを100に、「発現強度max/min < 2.9」または「(max-min) < 42」の行(遺伝子)を解析から除く)
    sample2.f.n <- normalize(sample2.f, byrow=TRUE)                  #行(row)方向の正規化(平均=0,分散=1); (列方向にしたいときはcolにする)
    foo <- som(sample2.f.n, xdim=3, ydim=5)                          #SOMの実行(「x軸方向3分割×y軸方向5分割」にする場合)
    plot(foo)                                                        #結果のプロット
    
    
    
    CRANのsomのwebページ
    CRANのsomのPDFマニュアル

    解析 | クラスタリング | 非階層的 | 主成分分析(PCA)

    マイクロアレイデータ解析で似た発現パターンを示す遺伝子(or 組織)を主成分分析(principal components analysis; PCA)によりクラスタリングしたいときに用います。

    「ファイル」−「ディレクトリの変更」で解析したい(sample3.txt)ファイルを置いてあるディレクトリに移動。
    in_f <- "sample3.txt"                                            #入力ファイル名を指定
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#発現データを読み込んでdataに格納。
    
    data.pca <- prcomp(t(data))
    names(data.pca)
    plot(data.pca$sdev, type="h", main="PCA s.d.")
    data.pca.sample <- t(data) %*% data.pca$rotation[,1:2]           #第一、二主成分を抽出
    plot(data.pca.sample, main="PCA")                                #第一、二主成分を抽出した結果をプロット
    text(data.pca.sample, colnames(data), col = c(rep("red", 7), rep("black", 3)))#tissue1-7を赤、残りの3つの組織を黒で表示。
    
    
    

    解析 | 分類 | k-Nearest Neighbor (k-NN)

    k-Nearest Neighbor (k-NN) 法を用いて分類します。ここではk=3とする場合について示します(距離の計算は"ユークリッド距離(Euclidean distance)"だけでしか行えないようです)。分類に用いる遺伝子セットの選択(Feature selection)を不等分散性を仮定したt統計量(Welch t statistic)で行う場合の例を紹介します。また、ここでは分類精度を交差検証法の一種であるLeave-one-out cross validation(LOOCV)を用いて行っています。 分類精度は用いる遺伝子数によって変わりますので、ここでは上位2, 3, ..., 15個を分類に用いた場合の結果を出力するようにしています。

    「ファイル」−「ディレクトリの変更」で解析したいサンプルマイクロアレイデータ7中のdata_Singh_RMA_3274.txtファイルを置いてあるディレクトリに移動。
    1. Feature selectionを不等分散性を仮定したt統計量(Welch t statistic)で行う場合:
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "result_loocv.txt"                                      #出力ファイル名を指定
    param_A <- 50                                                    #A群のサンプル数を指定
    param_B <- 52                                                    #B群のサンプル数を指定
    
    #必要なパッケージをロード
    library(class)                                                   #パッケージの読み込み
    
    #ラベルが「0の群」と「1の群」間で不等分散性を仮定(var.equal=F)してt.testを行い、t統計量の値を返す関数Welch_tstatを作成。
    Welch_tstat <- function(x, cl){
        x.class0 <- x[(cl == 0)]                                     #ラベルが0のものをx.class0に格納
        x.class1 <- x[(cl == 1)]                                     #ラベルが1のものをx.class1に格納
        if((sd(x.class0)+sd(x.class1)) == 0){                        #両方の群の標準偏差が共に0の場合はt統計量を計算できない(無限大になる)ので、この場合の統計量を0にする
            statistic <- 0
            return(statistic) 
        }
        else{
            hoge <- t.test(x.class1, x.class0, var.equal=F)
            return(hoge$statistic)
        }
    }
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param_A), rep(1, param_B))                   #A群を0、B群を1としたベクトルdata.clを作成
    
    rank.matrix <- rownames(data)                                    #おまじない(出力ファイルの一列目にrownames(data)情報(つまり遺伝子名に関する情報)を付加するため
    for (i in 1:length(data.cl)){                                    #LOOCVなので、length(data.cl)回数分だけループを回す
        data.tmp <- data[,-i]                                        #i番目の列データを削除した結果をdata.tmpに格納
        data.cl.tmp <- data.cl[-i]                                   #i番目の列データに対応するラベル情報を削除した結果をdata.cl.tmpに格納
        tmpall <- apply(data.tmp, 1, Welch_tstat, data.cl.tmp)       #i番目の列データがないサブセットに対してWelch t-statisticを計算し、結果をtmpallに格納
        rank.matrix <- cbind(rank.matrix, rank(-abs(tmpall)))        #i番目の列データがないサブセットに対してWelch t-statisticを計算して得られたランキング結果をrank.matrixの右側の列に追加
    }
    write.table(rank.matrix, "hoge_loocv.txt", sep = "\t", append=F, quote=F, row.names=F)#LOOCV用の「leave-one-outで得られたi番目の列(サンプル)データを削除した場合のランキング結果」を"hoge_loocv.txt"に出力
    
    result <- c("No. of genes", "Accuracy", "MCC")                   #おまじない(出力ファイルの一行目に左記情報を付加するため)
    data.tmp <- read.table("hoge_loocv.txt", header=TRUE, row.names=1, sep="\t", quote="") #上記出力ファイルの読み込み
    for(g_num in 2:15){                                              #ランキング上位2, 3, ..., 15個を分類に用いた場合の精度を調べるためのループ
        pred.vector <- NULL                                          #おまじない
        for(j in 1:ncol(data.tmp)){                                  #LOOCV用のループ(サンプル数分だけループが回る)
            data.rank <- data.tmp[,j]                                #j番目のカラム中のランキング情報をdata.rankに格納
            data.s <- data[order(data.rank),]                        #もとの遺伝子発現行列data中の並びをdata.rankの並びでソートし直し、その結果をdata.sに格納
            data.sub.train <- data.s[1:g_num,-j]                     #data.sに対して上位g_num個分までのj列目を除く遺伝子発現データをdata.sub.trainに格納(トレーニングデータ)
            data.sub.test <- data.s[1:g_num,j]                       #data.sに対して上位g_num個分までのj列目の遺伝子発現データをdata.sub.testに格納(テストデータ)
            data.cl.train <- data.cl[-j]                             #data.cl中のj番目を除くラベルデータをdata.cl.trainに格納(トレーニングデータ)
            data.cl.test <- data.cl[j]                               #data.cl中のj番目のラベルデータをdata.cl.testに格納(テストデータ)
            predicted <- knn(t(data.sub.train), t(data.sub.test), k=3, factor(data.cl.train))#k-Nearest Neighbor(k=3)の実行
            pred.vector <- c(pred.vector, as.vector(predicted))      #j番目のテストデータの結果をどんどんpred.vectorに格納していく
        }
        CrossTable <- table(true = data.cl, pred = pred.vector)      #当たり外れのクロス集計表を作成
        TN <- CrossTable[1,1]                                        #True Negative(実際のラベルが0のものを正しく0と予測できた数)をTNに格納
        FP <- CrossTable[1,2]                                        #False Positive(実際のラベルが0のものを誤って1と予測してしまった数)をFPに格納
        FN <- CrossTable[2,1]                                        #False Positive(実際のラベルが1のものを誤って0と予測してしまった数)をFNに格納
        TP <- CrossTable[2,2]                                        #True Positive(実際のラベルが1のものを正しく1と予測できた数)をTPに格納
        accuracy = (TP+TN)/(TP+FP+FN+TN)                             #Accuracyの計算
        MCC = (TP*TN-FP*FN)/sqrt((TP+FN)*(TN+FP)*(TP+FP)*(TN+FN))    #Matthews correlation coefficient(マシュー相関係数)の計算
        result <- rbind(result, c(g_num, accuracy, MCC))             #g_num, accuracy, MCCの値をベクトル化して、ベクトルresultの下の行に追加
    }
    write.table(result, out_f, sep = "\t", append=F, quote=F, row.names=F)#結果をout_fで指定したファイル名で出力
    
    
    

    解析 | 分類 | Self-Organizing Maps (SOM)

    Self-Organizing Maps (SOM) 法を用いて分類します。

    「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動。
    library(class)                                                   #パッケージの読み込み
    
    
    

    解析 | 分類 | Support Vector Machine (SVM)

    Support Vector Machine (SVM) 法を用いて分類します。分類に用いる遺伝子セットの選択(Feature selection)をRank product (RankProd; Breitling et al., FEBS Lett., 2004))で行う場合とEmpirical bayes statistic (経験ベイズ; Smyth GK, Stat. Appl, Genet. Mol. Biol., 2004))で行う場合の二通りの例を紹介します。また、ここでは分類精度を交差検証法の一種であるLeave-one-out cross validation(LOOCV)を用いて行っています。 分類精度は用いる遺伝子数によって変わりますので、ここでは上位2, 3, ..., 100個を分類に用いた場合の結果を出力するようにしています。

    「ファイル」−「ディレクトリの変更」で解析したいサンプルマイクロアレイデータ7中のdata_Singh_RMA_3274.txtファイルを置いてあるディレクトリに移動。
    1. Feature selectionをRank product (RankProd; Breitling et al., FEBS Lett., 2004))で行う場合:
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "result_loocv.txt"                                      #出力ファイル名を指定
    param_A <- 50                                                    #A群のサンプル数を指定
    param_B <- 52                                                    #B群のサンプル数を指定
    
    #必要なパッケージをロード
    library(e1071)                                                   #パッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param_A), rep(1, param_B))                   #A群を0、B群を1としたベクトルdata.clを作成
    
    rank.matrix <- rownames(data)                                    #おまじない(出力ファイルの一列目にrownames(data)情報(つまり遺伝子名に関する情報)を付加するため
    for (i in 1:length(data.cl)){                                    #LOOCVなので、length(data.cl)回数分だけループを回す
        data.tmp <- data[,-i]                                        #i番目の列データを削除した結果をdata.tmpに格納
        data.cl.tmp <- data.cl[-i]                                   #i番目の列データに対応するラベル情報を削除した結果をdata.cl.tmpに格納
        tmpall <- RP(data.tmp, data.cl.tmp, num.perm=1, logged=TRUE, na.rm = FALSE, plot = FALSE, rand = 123)#i番目の列データがないサブセットに対してRank productを実行し、結果をtmpallに格納
        tmprankall <- rank(apply(tmpall$RPs, 1, min))                #Rank productは(1) Normal > Tumorの統計量RPと(2) Normal < Tumorの統計量RPの2つを別々の列として結果を返すため、各遺伝子(各行)に対して2つの値の低いほうの値をその遺伝子の統計量とした結果をtmprankallとして返す
        rank.matrix <- cbind(rank.matrix, tmprankall)                #i番目の列データがないサブセットに対してRank productを実行して得られたランキング結果をrank.matrixの右側の列に追加
    }
    write.table(rank.matrix, "hoge_loocv.txt", sep = "\t", append=F, quote=F, row.names=F) #LOOCV用の「leave-one-outで得られたi番目の列(サンプル)データを削除した場合のランキング結果」を"hoge_loocv.txt"に出力
    
    result <- c("No. of genes", "Accuracy", "MCC")                   #おまじない(出力ファイルの一行目に左記情報を付加するため)
    data.tmp <- read.table("hoge_loocv.txt", header=TRUE, row.names=1, sep="\t", quote="")#上記出力ファイルの読み込み
    
    for(g_num in 2:100){                                             #ランキング上位2, 3, ..., 100個を分類に用いた場合の精度を調べるためのループ
        pred.vector <- NULL                                          #おまじない
        for(j in 1:ncol(data.tmp)){                                  #LOOCV用のループ(サンプル数分だけループが回る)
            data.rank <- data.tmp[,j]                                #j番目のカラム中のランキング情報をdata.rankに格納
            data.s <- data[order(data.rank),]                        #もとの遺伝子発現行列data中の並びをdata.rankの並びでソートし直し、その結果をdata.sに格納
            data.sub.train <- data.s[1:g_num,-j]                     #data.sに対して上位g_num個分までのj列目を除く遺伝子発現データをdata.sub.trainに格納(トレーニングデータ)
            data.sub.test <- data.s[1:g_num,j]                       #data.sに対して上位g_num個分までのj列目の遺伝子発現データをdata.sub.testに格納(テストデータ)
            data.cl.train <- data.cl[-j]                             #data.cl中のj番目を除くラベルデータをdata.cl.trainに格納(トレーニングデータ)
            data.cl.test <- data.cl[j]                               #data.cl中のj番目のラベルデータをdata.cl.testに格納(テストデータ)
            svm.model <- svm(x=t(data.sub.train), y=factor(data.cl.train), scale=T, type="C-classification", kernel="linear")#トレーニングデータでsvmの実行
            predicted <- predict(svm.model, t(data.sub.test))        #得られたsvm.modelを用いてj番目のテストデータの予測を行い、結果をpredictedに格納
            pred.vector <- c(pred.vector, as.vector(predicted))      #j番目のテストデータの結果をどんどんpred.vectorに格納していく
        }
        CrossTable <- table(true = data.cl, pred = pred.vector)      #当たり外れのクロス集計表を作成
        TN <- CrossTable[1,1]                                        #True Negative(実際のラベルが0のものを正しく0と予測できた数)をTNに格納
        FP <- CrossTable[1,2]                                        #False Positive(実際のラベルが0のものを誤って1と予測してしまった数)をFPに格納
        FN <- CrossTable[2,1]                                        #False Positive(実際のラベルが1のものを誤って0と予測してしまった数)をFNに格納
        TP <- CrossTable[2,2]                                        #True Positive(実際のラベルが1のものを正しく1と予測できた数)をTPに格納
        accuracy = (TP+TN)/(TP+FP+FN+TN)                             #Accuracyの計算
        MCC = (TP*TN-FP*FN)/sqrt((TP+FN)*(TN+FP)*(TP+FP)*(TN+FN))    #Matthews correlation coefficient(マシュー相関係数)の計算
        result <- rbind(result, c(g_num, accuracy, MCC))             #g_num, accuracy, MCCの値をベクトル化して、ベクトルresultの下の行に追加
    }
    write.table(result, out_f, sep = "\t", append=F, quote=F, row.names=F)#結果をout_fで指定したファイル名で出力
    
    
    
    2. Feature selectionをEmpirical bayes statistic (経験ベイズ; Smyth GK, Stat. Appl, Genet. Mol. Biol., 2004))で行う場合:
    in_f <- "data_Singh_RMA_3274.txt"                                #入力ファイル名を指定
    out_f <- "result_loocv.txt"                                      #出力ファイル名を指定
    param_A <- 50                                                    #A群のサンプル数を指定
    param_B <- 52                                                    #B群のサンプル数を指定
    
    #必要なパッケージをロード
    library(e1071)                                                   #パッケージの読み込み
    
    #データファイルの読み込みとラベル情報の作成
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    data.cl <- c(rep(0, param_A), rep(1, param_B))                   #A群を0、B群を1としたベクトルdata.clを作成
    
    rank.matrix <- rownames(data)                                    #おまじない(出力ファイルの一列目にrownames(data)情報(つまり遺伝子名に関する情報)を付加するため
    for (i in 1:length(data.cl)){                                    #LOOCVなので、length(data.cl)回数分だけループを回す
        data.tmp <- data[,-i]                                        #i番目の列データを削除した結果をdata.tmpに格納
        data.cl.tmp <- data.cl[-i]                                   #i番目の列データに対応するラベル情報を削除した結果をdata.cl.tmpに格納
        design <- model.matrix(~data.cl.tmp)                         #おまじない
        fit <- lmFit(data.tmp, design)                               #おまじない
        eb2 <- eBayes(fit)                                           #おまじない
        tmp.out <- topTable(eb2, coef=2, number=(length(row.names(data))),adjust="fdr")#おまじない
        tmpall <- tmp.out[order(tmp.out[,1]),]                       #おまじない
        rank.matrix <- cbind(rank.matrix, rank(-abs(tmpall$t)))      #i番目の列データがないサブセットに対してEmpirical bayesを実行して得られたランキング結果をrank.matrixの右側の列に追加
    }
    write.table(rank.matrix, "hoge_loocv.txt", sep = "\t", append=F, quote=F, row.names=F) #LOOCV用の「leave-one-outで得られたi番目の列(サンプル)データを削除した場合のランキング結果」をhoge_loocv.txtに出力
    
    result <- c("No. of genes", "Accuracy", "MCC")                   #おまじない(出力ファイルの一行目に左記情報を付加するため)
    data.tmp <- read.table("hoge_loocv.txt", header=TRUE, row.names=1, sep="\t", quote="")#上記出力ファイルの読み込み
    
    for(g_num in 2:100){                                             #ランキング上位2, 3, ..., 100個を分類に用いた場合の精度を調べるためのループ
        pred.vector <- NULL                                          #おまじない
        for(j in 1:ncol(data.tmp)){                                  #LOOCV用のループ(サンプル数分だけループが回る)
            data.rank <- data.tmp[,j]                                #j番目のカラム中のランキング情報をdata.rankに格納
            data.s <- data[order(data.rank),]                        #もとの遺伝子発現行列data中の並びをdata.rankの並びでソートし直し、その結果をdata.sに格納
            data.sub.train <- data.s[1:g_num,-j]                     #data.sに対して上位g_num個分までのj列目を除く遺伝子発現データをdata.sub.trainに格納(トレーニングデータ)
            data.sub.test <- data.s[1:g_num,j]                       #data.sに対して上位g_num個分までのj列目の遺伝子発現データをdata.sub.testに格納(テストデータ)
            data.cl.train <- data.cl[-j]                             #data.cl中のj番目を除くラベルデータをdata.cl.trainに格納(トレーニングデータ)
            data.cl.test <- data.cl[j]                               #data.cl中のj番目のラベルデータをdata.cl.testに格納(テストデータ)
            svm.model <- svm(x=t(data.sub.train), y=factor(data.cl.train), scale=T, type="C-classification", kernel="linear")   #トレーニングデータでsvmの実行
            predicted <- predict(svm.model, t(data.sub.test))        #得られたsvm.modelを用いてj番目のテストデータの予測を行い、結果をpredictedに格納
            pred.vector <- c(pred.vector, as.vector(predicted))      #j番目のテストデータの結果をどんどんpred.vectorに格納していく
        }
        CrossTable <- table(true = data.cl, pred = pred.vector)      #当たり外れのクロス集計表を作成
        TN <- CrossTable[1,1]                                        #True Negative(実際のラベルが0のものを正しく0と予測できた数)をTNに格納
        FP <- CrossTable[1,2]                                        #False Positive(実際のラベルが0のものを誤って1と予測してしまった数)をFPに格納
        FN <- CrossTable[2,1]                                        #False Positive(実際のラベルが1のものを誤って0と予測してしまった数)をFNに格納
        TP <- CrossTable[2,2]                                        #True Positive(実際のラベルが1のものを正しく1と予測できた数)をTPに格納
        accuracy = (TP+TN)/(TP+FP+FN+TN)                             #Accuracyの計算
        MCC = (TP*TN-FP*FN)/sqrt((TP+FN)*(TN+FP)*(TP+FP)*(TN+FN))    #Matthews correlation coefficient(マシュー相関係数)の計算
        result <- rbind(result, c(g_num, accuracy, MCC))             #g_num, accuracy, MCCの値をベクトル化して、ベクトルresultの下の行に追加
    }
    write.table(result, out_f, sep = "\t", append=F, quote=F, row.names=F)#結果をout_fで指定したファイル名で出力
    
    
    
    CRANのe1071のwebページ
    CRANのe1071のPDFマニュアル

    解析 | 分類 | Naive Bayesian (NB)

    Naive Bayesian (NB) 法を用いて分類します。

    「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動。
    library(e1071)                                                   #パッケージの読み込み
    
    
    
    CRANのe1071のwebページ
    CRANのe1071のPDFマニュアル

    解析 | アレイCGH(DNAコピー数)解析 | について

    アレイCGH(Comparative Genomic Hybridization)法は、もともとは腫瘍組織で染色体に異常が生じている領域を正常組織との比較により同定することを目的とした解析技術です。 二色法のマイクロアレイと本質的に同じ。
    目的がDNAコピー数が変化している領域を同定(アレイCGH;この意味において、”DNAコピー数解析”などとも呼ばれます)するか、発現変動遺伝子の同定(従来型の二色法マイクロアレイの利用)などかという程度の違いです。 昔はBACクローンなどがアレイに搭載されていて解像度がそれほど高くありませんでしたが、最近ではタイリングアレイのような感じでかなり高い解像度のデータが得られるようになっているようです。 したがって得られるデータのイメージ図は、「横軸:ゲノム上の位置、縦軸:比較二つのサンプルのlog比」です。
    ここで紹介する各種解析手法は、「比較二つのサンプルのlog比のデータ」を入力として与えて、「”連続してlog比の絶対値が高い領域”のリストやそれの図」を出力として返してくれます。
    ここで紹介している方法は以下の三つです:
    ADaCGH (Diaz-Uriarte_2007)
    GLAD (Hupe_2004)
    DNAcopy (Olshen_2004)
    (2009/12/14現在、DNAcopy (Olshen_2004)の方法しかちゃんと書いてません。)

    解析 | アレイCGH(DNAコピー数)解析 | ADaCGH (Diaz-Uriarte_2007)

    参考文献の方法を用いて解析を行う。
    CRANのADaCGHのwebページ
    CRANのADaCGHのPDFマニュアル
    参考文献(Diaz-Uriarte and Rueda, PLoS ONE, 2007)

    解析 | アレイCGH(DNAコピー数)解析 | GLAD (Hupe_2004)

    参考文献の方法を用いて解析を行う。

    BioconductorのGLADのwebページ

    参考文献(Hupe et al., Bioinformatics, 2004)

    解析 | アレイCGH(DNAコピー数)解析 | DNAcopy (Olshen_2004)

    参考文献の方法を用いて解析を行う。

    BioconductorのDNAcopyのwebページ

    参考文献(Olshen et al., Biostatistics, 2004)

    作図 | ヒートマップ(pseudo-color image)

    論文中でよく見かけるpseudo-color imageを作成してくれます(例えばKadota et al., Physiol. Genomics, 2003の図2を作成してくれます)。
    注意点:色盲の方にも分かるようカラーバリアフリープレゼンテーションを心がけましょう。(上の図は緑と赤を使っているのでよくない例です)

    「ファイル」−「ディレクトリの変更」で解析したいファイルを置いてあるディレクトリに移動。
    1.(「解析 | 似た発現パターンを持つ遺伝子の同定」などで得た)手持ちのファイル(GDS1096_best10_heart.txt)を読み込ませて、ヒートマップを描きたい場合: 条件1:行(遺伝子; row)方向にZ scalingした数値(the rows are scaled to have mean zero and standard deviation one)情報を用いて作図(参考:Golub et al., Science, 1999の図3)。 条件2:色は、「cm.colors」の100段階で表す。
    in_f <- "GDS1096_best10_heart.txt"                               #入力ファイル名を指定
    
    #必要なパッケージをロード
    library(stats)                                                   #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    colnames(data) <- substring(colnames(data), 8, nchar(colnames(data)))#列ラベル中の最初の8文字分(つまり "Normal_")を削除
    heatmap(as.matrix(data), Rowv =NA, Colv=NA, scale="row", col = cm.colors(100), main="Heart-specific genes (Best 10)", xlab="Tissue", ylab="Clone ID", margin=c(8,10))
    
    
    
    2.(「解析 | 似た発現パターンを持つ遺伝子の同定」などで得た)手持ちのファイル(GDS1096_best10_heart.txt)を読み込ませて、ヒートマップを描きたい場合: 条件1:読み込んだそのままの数値情報を用いて作図。 条件2:色は、「heat.colors」の20段階で表す。
    in_f <- "GDS1096_best10_heart.txt"                               #入力ファイル名を指定
    
    #必要なパッケージをロード
    library(stats)                                                   #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    colnames(data) <- substring(colnames(data), 8, nchar(colnames(data)))#列ラベル中の最初の8文字分(つまり "Normal_")を削除
    heatmap(as.matrix(data), Rowv =NA, Colv=NA, scale="none", col = heat.colors(20), main="Heart-specific genes (Best 10)", xlab="Tissue", ylab="Clone ID", margin=c(8,10))   #pseudo-color imageの作成
    
    
    
    3. 手持ちのファイル(GDS1096.txt)を読み込ませて、ヒートマップを描きたい場合: 条件1:行(遺伝子; row)方向にZ scalingした数値(the rows are scaled to have mean zero and standard deviation one)情報を用いて作図(参考:Golub et al., Science, 1999の図3)。 条件2:色は、「heat.colors」の20段階で表す。
    in_f <- "GDS1096.txt"                                            #入力ファイル名を指定
    
    #必要なパッケージをロード
    library(stats)                                                   #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f, header=TRUE, row.names=1, sep="\t", quote="")#入力ファイルを読み込んでdataに格納
    
    data$IDENTIFIER <- NULL                                          #おまじない(余分なカラム「IDENTIFIER」の消去)
    colnames(data) <- substring(colnames(data), 8, nchar(colnames(data)))#列ラベル中の最初の8文字分(つまり "Normal_")を削除
    heatmap(as.matrix(data), Rowv =NA, Colv=NA, scale="row", col = heat.colors(100), main="data", xlab="Tissue", ylab="Clone ID", margin=c(8,6))
    
    
    
    4.「解析 | 似た発現パターンを持つ遺伝子の同定」の解析で得られた(GDS1096を心臓得意的パターン順にソートした)GDS1096_sort_by_heartを読み込ませて、ヒートマップを描きたい場合: 条件1:行(遺伝子; row)方向にZ scalingした数値(the rows are scaled to have mean zero and standard deviation one)情報を用いて作図(参考:Golub et al., Science, 1999の図3)。 条件2:色は、「heat.colors」の20段階で表す。
    in_f1 <- "GDS1096.txt"                                           #入力ファイル名を指定
    in_f2 <- "GDS1096_cl_heart.txt"                                  #入力ファイル名を指定
    
    #必要なパッケージをロード
    library(genefilter)                                              #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1で指定したファイルを読み込んでdataに格納
    data.cl <- read.table(in_f2, sep="\t", quote="")                 #in_f2で指定したファイルを読み込んでdata.clに格納
    
    data$IDENTIFIER <- NULL                                          #おまじない(余分なカラム「IDENTIFIER」の消去)
    data <- as.matrix(data)                                          #as.matrixの意味は、「データの型を"行列として(as matrix)"dataに格納せよ」です。(read.tableで読み込んで得られたdataのデータの型は"データフレーム"なので、そのままではこの場合は使用不可なのでやる必要があります)
    
    template_heart <- data.cl[,2]                                    #ラベル情報(2列目)のみ抽出し、template_heartに格納
    tmp <- rbind(data, template_heart)                               #template_heartというテンプレートパターンを行列dataの最後の行に追加
    ID_REF <- rownames(tmp)                                          #行のラベル情報(つまり遺伝子IDに関する情報)をID_REFに格納
    template_posi <- which(ID_REF == "template_heart")               #行のラベル情報が"template_heart"に相当する行情報をtemplate_posiに格納
    gene_num <- nrow(data)                                          #行数をgene_numに格納
    closeg <- genefinder(tmp, template_posi, gene_num, scale="none", method="correlation")#結果をclosegに格納
    GDS1096_sort_by_heart <- tmp[closeg[[1]]$indices,]               #heart-specificな順に並べられている遺伝子発現データを抽出し、GDS1096_sort_by_heartに格納
    colnames(GDS1096_sort_by_heart) <- substring(colnames(GDS1096_sort_by_heart), 8, nchar(colnames(GDS1096_sort_by_heart)))#列ラベル中の最初の8文字分(つまり "Normal_")を削除
    heatmap(as.matrix(GDS1096_sort_by_heart), Rowv =NA, Colv=NA, scale="row", col = heat.colors(100), main="GDS1096_sort_by_heart", xlab="Tissue", ylab="Clone ID", margin=c(8,6))
    
    
    
    使える色に関する参考URL

    作図 | ROC曲線(ROC curve)

    ROC (Receiver Operating Characteristic)曲線は、横軸が偽陽性率(1-特異度;false positive rate)、縦軸が真陽性率(感度;true positive rate)としてプロットをしたものです。
    例えばWAD (Kadota et al., AMB, 2008)は感度・特異度高く発現変動遺伝子をランキングできる方法だなどと書いていますが、 これはアレイ中の全遺伝子のWADでのランキング結果に対し”真の発現変動遺伝子”をマッピングしてROC曲線を描くと、このROC曲線の下部面積(Area Under the Curve; AUC)の値が大きい(最大値は1)ということを意味します。
    もう少し具体的なイメージはこちらの32ページ目をご覧ください。
    RでどうやってAUC値を得るかについてはこちらの33ページ目をご覧ください。
    一応、以下にも例を示しておきます。 1. x個の遺伝子をWADなどでランキングして、”真の発現変動遺伝子(DEG)”3個が1, 3, 4位だった。このAUC値:
    param1 <- c(1,3,4)                                               #真のDEGの順位情報を指定
    param2 <- 10                                                     #xの値(全遺伝子数のこと、ここでは例として10としてるだけ)を入力
    
    #必要なパッケージをロード
    library(ROC)                                                     #パッケージの読み込み
    
    DEG_posi <- rep(0,param2)                                        #DEGの位置情報の初期値(0)を指定
    DEG_posi <- replace(DEG_posi, param1, 1)                         #DEGに相当する位置を1に置換
    out <- rocdemo.sca(truth=DEG_posi, data=-(1:param2), rule=dxrule.sca)#ROC情報をoutに格納
    AUC(out)                                                         #AUC値を計算
    
    
    
    2. このROC曲線の図:
    param1 <- c(1,3,4)                                               #真のDEGの順位情報を指定
    param2 <- 10                                                     #xの値(全遺伝子数のこと、ここでは例として10としてるだけ)を入力
    
    #必要なパッケージをロード
    library(ROC)                                                     #パッケージの読み込み
    
    DEG_posi <- rep(0,param2)                                        #DEGの位置情報の初期値(0)を指定
    DEG_posi <- replace(DEG_posi, param1, 1)                         #DEGに相当する位置を1に置換
    out <- rocdemo.sca(truth=DEG_posi, data=-(1:param2), rule=dxrule.sca)#ROC情報をoutに格納
    plot(out)                                                        #ROC曲線をプロット
    
    
    
    3. このROC曲線をpng形式のファイルで図の大きさを指定して得たい場合:
    param1 <- c(1,3,4)                                               #真のDEGの順位情報を指定
    param2 <- 10                                                     #xの値(全遺伝子数のこと、ここでは例として10としてるだけ)を入力
    param3 <- 400                                                    #横幅(width; 単位はピクセル)を指定  
    param4 <- 400                                                    #縦幅(height; 単位はピクセル)を指定 
    param5 <- 14                                                     #文字の大きさ(単位はpoint)を指定 
    out_f <- "hoge.png"                                              #出力ファイル名を指定 
    
    #必要なパッケージをロード
    library(ROC)                                                     #パッケージの読み込み
    
    DEG_posi <- rep(0,param2)                                        #DEGの位置情報の初期値(0)を指定
    DEG_posi <- replace(DEG_posi, param1, 1)                         #DEGに相当する位置を1に置換
    out <- rocdemo.sca(truth=DEG_posi, data=-(1:param2), rule=dxrule.sca)#ROC情報をoutに格納
    png(out_f, pointsize=param5, width=param3, height=param4)        #出力ファイルの各種パラメータを指定
    plot(out)                                                        #ROC曲線をプロット
    dev.off()                                                        #おまじない
    
    
    
    4. このROC曲線をpng形式のファイルで図の大きさを指定して得たい場合(x,y軸の文字も指定):
    param1 <- c(1,3,4)                                               #真のDEGの順位情報を指定
    param2 <- 10                                                     #xの値(全遺伝子数のこと、ここでは例として10としてるだけ)を入力
    param3 <- 400                                                    #横幅(width; 単位はピクセル)を指定  
    param4 <- 400                                                    #縦幅(height; 単位はピクセル)を指定 
    param5 <- 14                                                     #文字の大きさ(単位はpoint)を指定 
    param6 <- "1 - specificity"                                      #x軸のラベルを指定
    param7 <- "sensitivity"                                          #y軸のラベルを指定
    out_f <- "hoge.png"                                              #出力ファイル名を指定 
    
    #必要なパッケージをロード
    library(ROC)                                                     #パッケージの読み込み
    
    DEG_posi <- rep(0,param2)                                        #DEGの位置情報の初期値(0)を指定
    DEG_posi <- replace(DEG_posi, param1, 1)                         #DEGに相当する位置を1に置換
    out <- rocdemo.sca(truth=DEG_posi, data=-(1:param2), rule=dxrule.sca)#ROC情報をoutに格納
    png(out_f, pointsize=param5, width=param3, height=param4)        #出力ファイルの各種パラメータを指定
    plot(out, xlab=param6, ylab=param7)                              #ROC曲線をプロット
    dev.off()                                                        #おまじない
    
    5. このROC曲線をpng形式のファイルで図の大きさを指定して得たい場合(x,y軸のラベルを描かないようにしたい):
    
    
    param1 <- c(1,3,4)                                               #真のDEGの順位情報を指定
    param2 <- 10                                                     #xの値(全遺伝子数のこと、ここでは例として10としてるだけ)を入力
    param3 <- 400                                                    #横幅(width; 単位はピクセル)を指定  
    param4 <- 400                                                    #縦幅(height; 単位はピクセル)を指定 
    param5 <- 14                                                     #文字の大きさ(単位はpoint)を指定 
    param6 <- "1 - specificity"                                      #x軸のラベルを指定
    param7 <- "sensitivity"                                          #y軸のラベルを指定
    out_f <- "hoge.png"                                              #出力ファイル名を指定 
    
    #必要なパッケージをロード
    library(ROC)                                                     #パッケージの読み込み
    
    DEG_posi <- rep(0,param2)                                        #DEGの位置情報の初期値(0)を指定
    DEG_posi <- replace(DEG_posi, param1, 1)                         #DEGに相当する位置を1に置換
    out <- rocdemo.sca(truth=DEG_posi, data=-(1:param2), rule=dxrule.sca)#ROC情報をoutに格納
    png(out_f, pointsize=param5, width=param3, height=param4)        #出力ファイルの各種パラメータを指定
    plot(out, xlab="", ylab="")                                      #ROC曲線をプロット
    dev.off()                                                        #おまじない
    
    
    

    BioconductorのROCのwebページ

    解析 | サンプル群間比較 | 二群間 | 対応なし | 並べ替え検定 (package: permtest)

    二種類のサンプル群間の全体的なばらつきをランダムパーミュテーションテスト(Random permutation; 並べ替え検定)で調べたい場合に利用します。ちなみにこれは、差がある遺伝子の抽出を目的としたものではありません。サンプル群間の比較(等分散性などの検定)ですので予めご承知おきください。
    注意点1:解析データ中にはNA(Not Available; データがない)やNaN(Not a Number; 数値でない)があってはいけません。
    注意点2:サンプル(列)数が24以下の場合には、可能な全ての並べ替えの組み合わせを計算するので、並べ替え回数(デフォルトは1000)をnpermsでいくつに設定しようが結果は変わりません。
    注意点3:サンプル間の距離(distance)を任意に定義できません。このパッケージで使えるのはeuclid(squared Euclidean distance)とlogr(-log(Pearson相関係数))だけです。
    注意点4:クラスラベルは一方の群に"1"、そしてもう片方の群には"2"になります。(0 or 1ではありません!!)
    注意点5:クラスラベルを指し示しているファイル(sample1_designmatrix.txt)中の3列目の情報はpaird modeかblocked modeのときにのみ使われます。詳しくは参考PDFをごらんください。

    解析結果の解釈の仕方は以下のとおり:
    「1 variability test(one sided)」のPVALUEが低ければ、帰無仮説(群1と群2はばらつきが同じである)が棄却され、以下のどちらかになる:
    STAT of d11-d22 > 0の場合:対立仮説(群1のばらつきは群2のばらつきよりも大きい)を支持。
    STAT of d11-d22 < 0の場合:対立仮説(群1のばらつきは群2のばらつきよりも小さい)を支持。

    「2 variability test(two sided)」のPVALUEが低ければ、帰無仮説(群1と群2はばらつきが同じである)が棄却され、対立仮説(群1と群2のばらつきは等しくない)が支持される。

    「3 location test」のPVALUEが低ければ、帰無仮説(群1と群2は同じ位置にある)が棄却され、対立仮説(群1と群2は同じ位置にはない)が支持される。

    「4 equivalence test」のPVALUEが低ければ、帰無仮説(群1を基準として、群2は群1と同じばらつき・同じ位置にある)が棄却され、対立仮説(二群は同じ位置にない or 群2はより大きなばらつきをもつ)が支持される。


    「ファイル」−「ディレクトリの変更」で解析したい(sample1.txtsample1_designmatrix.txt)ファイルを置いてあるディレクトリに移動。
    1. デフォルトの設定(サンプル間の距離=euclid(squared Euclidean distance);並べ替え回数=1000)で解析したい場合:
    in_f1 <- "sample1.txt"                                           #入力ファイル1を指定
    in_f2 <- "sample1_designmatrix.txt"                              #入力ファイル2を指定
    
    #必要なパッケージをロード
    library(permtest)                                                #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1の読み込み
    data <- as.matrix(data)                                          #as.matrixの意味は、「データの型を"行列として(as matrix)"dataに格納せよ」です。
    data_designmatrix <- read.table(in_f2, sep="\t", quote="")       #in_f2の読み込み
    data_designmatrix <- as.matrix(data_designmatrix)                #as.matrixの意味は、「データの型を"行列として(as matrix)"data_designmatrixに格納せよ」です。
    
    #本番
    permtest(data, data_designmatrix)                                #permtestの実行
    
    
    
    2. サンプル間の距離=logr(-log(Pearson相関係数));並べ替え回数=10000の条件でで解析したい場合:
    in_f1 <- "sample1.txt"                                           #入力ファイル1を指定
    in_f2 <- "sample1_designmatrix.txt"                              #入力ファイル2を指定
    
    #必要なパッケージをロード
    library(permtest)                                                #パッケージの読み込み
    
    #データファイルの読み込み
    data <- read.table(in_f1, header=TRUE, row.names=1, sep="\t", quote="")#in_f1の読み込み
    data <- as.matrix(data)                                          #as.matrixの意味は、「データの型を"行列として(as matrix)"dataに格納せよ」です。
    data_designmatrix <- read.table(in_f2, sep="\t", quote="")       #in_f2の読み込み
    data_designmatrix <- as.matrix(data_designmatrix)                #as.matrixの意味は、「データの型を"行列として(as matrix)"data_designmatrixに格納せよ」です。
    
    #本番
    permtest(data, data_designmatrix, distance="logr", nperms=10000) #permtestの実行
    
    
    
    CRANのpermtestのwebページ
    CRANのpermtestのPDFマニュアル
    R
    R Tips(竹澤様)
    R Tips(間瀬様)
    Rによる統計処理(青木様)
    R言語クイックリファレンス
    「Rでプログラミング」のページ
    Rのcol()の番号と色の対応関係
    RjpWiki

    Bioconductor

    RStudio
    Subio Platform