R(とBioConductor)とGEO

R(とBioConductor)で、GEOにて公開されているマイクロアレイのデータを読み込んでみる企画。

準備

Rを起動して、GEOqueryを使えるようにしておく。

 > Sys.setenv("http_proxy"="http://proxy.example.com/")
 > Sys.setenv("ftp_proxy"="http://proxy.example.com/")
 > source("http://bioconductor.org/getBioC.R")
 > biocLite("GEOquery")
 > library(GEOquery)

GEOqueryによるマイクロアレイデータの取得

ひとまず、サンプルとしてGSE7505のデータを取得してみることにする。

 > gse <- getGEO( 'GSE7505' )
 以下にエラー curlPerform(curl = curl, .opts = opts, .encoding = .encoding) : 
  FTP response reading failed

というワケで実行不可能。proxyを超えられないようだ。

 > getGEO
 function (GEO = NULL, filename = NULL, destdir = tempdir(), GSElimits = NULL, 
    GSEMatrix = TRUE, AnnotGPL = FALSE) 
 {
    filename <- filename
    con <- NULL
    if (!is.null(GSElimits)) {
        if (length(GSElimits) != 2) {
            stop("GSElimits should be an integer vector of length 2, like (1,10) to include GSMs 1 through 10")
        }
    }
    if (is.null(GEO) & is.null(filename)) {
        stop("You must supply either a filename of a GEO file or a GEO accession")
    }
    if (is.null(filename)) {
        GEO <- toupper(GEO)
        geotype <- toupper(substr(GEO, 1, 3))
        if (GSEMatrix & geotype == "GSE") {
            return(getAndParseGSEMatrices(GEO))
        }
        filename <- getGEOfile(GEO, destdir = destdir, AnnotGPL)
    }
    if (length(grep("\\.gz$", filename, perl = TRUE)) > 0) {
        con <- gzfile(filename, open = "rt")
    }
    else {
        con <- file(filename, "r")
    }
    ret <- parseGEO(con, GSElimits)
    close(con)
    return(ret)
 }
 <environment: namespace:GEOquery>

どうやら、filename= というオプションがあるので、ファイルをダウンロードしておけば良さそうだ。

 > gse <- getGEO( filename = "GSE7505_family.soft.gz" )
 Parsing....
 ^PLATFORM = GPL5080
 ^SAMPLE = GSM181868
 (中略)
 ^SAMPLE = GSM181929
  50 件以上の警告がありました (警告を見るには warnings() を使って下さい)
 > warnings()
  警告メッセージ: 
 1: In grep("\\.gz$", filename, perl = TRUE) :
    perl=TRUE は UTF-8 ロケールに対してのみ完全実装されています 
 ()

ということで、どういうわけだか、今度はちゃんと読み込むことができたようだ。

 > names(GSMList(gse7505))
  [1] "GSM181867" "GSM181868" "GSM181869" "GSM181870" "GSM181871" "GSM181872"
  [7] "GSM181873" "GSM181874" "GSM181875" "GSM181876" "GSM181877" "GSM181878"
 [13] "GSM181879" "GSM181880" "GSM181881" "GSM181882" "GSM181883" "GSM181884"
 [19] "GSM181885" "GSM181886" "GSM181887" "GSM181888" "GSM181889" "GSM181890"
 [25] "GSM181891" "GSM181892" "GSM181893" "GSM181894" "GSM181895" "GSM181896"
 [31] "GSM181897" "GSM181898" "GSM181899" "GSM181900" "GSM181901" "GSM181902"
 [37] "GSM181903" "GSM181904" "GSM181905" "GSM181906" "GSM181907" "GSM181908"
 [43] "GSM181909" "GSM181910" "GSM181911" "GSM181912" "GSM181913" "GSM181914"
 [49] "GSM181915" "GSM181916" "GSM181917" "GSM181918" "GSM181919" "GSM181920"
 [55] "GSM181921" "GSM181922" "GSM181923" "GSM181924" "GSM181925" "GSM181926"
 [61] "GSM181927" "GSM181928" "GSM181929"
 > 

データの変換

gse7505をRで発現データを扱う時に使われるexprSetに変換する。
もうGEOqueryのドキュメント(pdf)に載ってるそのまんま、ワケも分からずに入力する。

 > gsmplatforms <- lapply(GSMList(gse7505), function(x) {
 + Meta(x)$platform
 + })
 > Table(GSMList(gse7505)[[1]])[1:5, ]
 > Columns(GSMList(gse7505)[[1]])[1:5, ]
 > probesets <- Table(GPLList(gse7505)[[1]])$ID
 > data.matrix <- log2(do.call("cbind", lapply(GSMList(gse7505), function(x) {
 + tab <- Table(x)
 + mymatch <- match(probesets, tab$ID_REF)
 + return(tab$VALUE[mymatch])
 + })))
 > require(Biobase) 
 > rownames(data.matrix) <- probesets
 > colnames(data.matrix) <- names(GSMList(gse7505))
 > pdata <- data.frame(samples = names(GSMList(gse7505)))
 > rownames(pdata) <- names(GSMList(gse7505))
 > pheno <- new("phenoData", pData = pdata, varLabels = as.list("samples"))
  エラー: The phenoData class is defunct, use AnnotatedDataFrame (with ExpressionSet) instead

いやなところでエラーが出る。phenoDataクラスは廃止になったからAnnotatedDataFrameを使え、と。

 > pheno <- new("AnnotatedDataFrame", pData = pdata, varLabels = as.list("samples"))
  以下にエラー .nextMethod(.Object, ...) : 
    クラス "AnnotatedDataFrame" のスロットに対しては不正な名前です: pData, varLabels 
 >

ちょっと、考えないといけないな。

あれ?[Bioc-devel] Refactored Biobase in BioC 2.2 - exprSet and phenoData classes defunct, use ExpressionSet and AnnotatedDataFrameというのがあって、BioConductor2.2以降では、exprSetとphenoDataを使うこと自体が良くないようだ。ここで、今使っているBioConductor2.4を2.1以前に戻すというのは、後向きすぎる解決手段だ。

ExpressionSetとAnnotatedDataFrameを使うにはどうするか?を、ちょっと調べてみることにしよう。
とりあえず、検索してみると、[BioC] biobase phenodataに次のように書いてある。

This will get you an ExpressionSet:

gse6901.eset <- getGEO("GSE6901")[[1]]

Now, gse6901.eset is an ExpressionSet.

https://stat.ethz.ch/pipermail/bioconductor/2008-September/024099.html

なんか、簡単じゃん。やりなおしてみることに。

> gse7505 <- getGEO( filename="GSE7505_family.soft.gz" )[[1]];
 Parsing....
 ^PLATFORM = GPL5080
 ^SAMPLE = GSM181868
 (中略)
 ^SAMPLE = GSM181929
 以下にエラー getGEO(filename = "GSE7505_family.soft.gz")[[1]] : 
   この S4 クラスは部分代入可能ではありません 

どうせいっちゅうんじゃ。

自宅で実行

自宅なら、proxyを使わないので、もっと簡単にできるはず。

 library(GEOquery)
 gse7505.eset <- getGEO('GSE7505')[[1]]
 Found 1 file(s)
 GSE7505_series_matrix.txt.gz
  URL 'ftp://ftp.ncbi.nih.gov/pub/geo/DATA/SeriesMatrix/GSE7505/GSE7505_series_matrix.txt.gz' を試しています 
 ftp data connection made, file length 2036446 bytes
  開かれた URL 
 ==================================================
 downloaded 1.9 Mb

  URL 'http://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?targ=self&acc=GPL5080&form=text&view=full' を試しています 
Content type 'geo/text' length unknown
  開かれた URL 
 .......... .......... .......... .......... ..........
 .......... .......... .......... .......... ..........
 .......... .......... .......... .......... ..........
 .......... .......... .......... .......... ..........
 .......... .......... .......... .......... ..........
 .......... .......... .......... .......... ..........
 .......... .......... .......... .......... ..........
 .......... .......... .......... .......... ..........
 .......... .......... .......... .......... ..........
 .......... .......... .......... .......... ..........
 .......... .......... .......... .......... ..........
 .......... .......... .......... .......... ..........
 ...
 downloaded 603 Kb
 
 File stored at: 
 /var/folders/XX/XXaRkr7wFNma1xCWGoA3fU+++TI/-Tmp-//RtmpbgXdK8/GPL5080.soft
 > gse7505.eset
 ExpressionSet (storageMode: lockedEnvironment)
 assayData: 6728 features, 63 samples 
   element names: exprs 
 phenoData
   sampleNames: GSM181867, GSM181868, ..., GSM181929  (63 total)
   varLabels and varMetadata description:
     title: NA
     geo_accession: NA
     ...: ...
     data_row_count: NA
     (41 total)
 featureData
   featureNames: 1, 2, ..., 6728  (6728 total)
   fvarLabels and fvarMetadata description:
     ID: NA
     CLONE.ID: NA
     ...: ...
     SPOT_ID: NA
     (8 total)
   additional fvarMetadata: Column, Description
 experimentData: use 'experimentData(object)'
 Annotation: GPL5080 
 > 

あっさり完了。会社で数時間悩んだのはなんだったんだ。どうやら、getGEO()に読み込ませるファイルを間違えていたようだ。
BioConductorサイコー!

(多分、続く)