【シングルセル解析】[Seurat] scRNAseq公開データ読み込み例 ~ Visium ~

2023/05/19に公開

前置き

scRNAseqデータはfastqファイルが巨大なためかfastqファイルでの公開は減ってきて、1次処理したファイル (cellrangerのoutputや単純な発現マトリクス、解析データも含めたannData、rdsファイルなど)がGEOやZenodo、各国管理のデポジット先に様々な形式で落ちている。
全くもって統一されていないので、まずは読み込むことに時間を喰う。本記事では自身が経験したデータ読み込み例をここに追記していく。

この記事はVisiumデータを主に扱う。その他ファイル形式のものはそれぞれの記事に記録する。


Visium

例) GSE203552

https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE203552

GEOからGSE203552_RAW.tarをダウンロードし、解凍。visiumと名前が入ったファイルが幾つかある。4検体の識別IDがprefixについていて、各検体にpng, csv, json, h5ファイルが存在する。


ひとまず.gzファイルを解凍しておく

# gzファイルを解凍
files <- dir(pattern = ".gz")
for(i in seq(length(files))){
  R.utils::gunzip(files[i])
}

いざLoad10X_Spatial機能でデータを読み込もうとするとreadPNGでエラーが出る。

hoge <- Load10X_Spatial(data.dir = getwd(),filename = "GSM6176208_filtered_feature_bc_matrix_p1_visium.h5")

Error in readPNG(source = file.path(image.dir, image.name)) :
unable to open C:/Users/Ryota_Chijimatsu/Desktop/GSE203552_RAW/spatial/tissue_lowres_image.png

Visiumデータを読み込むときに画像ファイルも読み込むのだが、画像ファイルのパスに関する引数は無いのでファイルの場所とファイル名を指定通りにしておく必要がありそうだ。

Spacerangerの出力と揃うようにspatialフォルダを作ってtissue_lowers_image.pngというファイル名にしておく。

画像を移してLoad10X_Spatialを実行すると次のようなエラーが出る。

Error: lexical error: invalid char in json text.
C:/Users/Ryota_Chijimatsu/Docum
(right here) ------^

spatialフォルダにscalefactors_json.jsonとtissue_positions_list.csvも入れておく必要があった。

以下のようにすれば4検体を順次読み込める。(元のファイルは保持)

# 各ファイル形式のパスを取得
path_h5 <- dir(pattern = "visium.h5")
path_png <- dir(pattern = "png")
path_json <- dir(pattern = "scalefactors")
path_csv <- dir(pattern = "tissue_positions_list")

# spatialフォルダを作成
dir.create("spatial")

# Load10X_Spatialの保存先用リスト
visium_list <- list()

# 各検体のデータを順次読み込んでvisium_listに保存
for(i in seq(length(path_h5))){
  # png, json, csvファイルをファイル名を変更して、spatialフォルダにコピー
  file.copy(from = path_png[i],
            to = "spatial/tissue_lowres_image.png",
            overwrite = TRUE)
  file.copy(from = path_json[i],
            to = "spatial/scalefactors_json.json",
            overwrite = TRUE)
  file.copy(from = path_csv[i],
            to = "spatial/tissue_positions_list.csv",
            overwrite = TRUE)  
  
  # h5ファイルを読み込む
  visium_list[[i]] <- Load10X_Spatial(data.dir = getwd(),
                                      filename = path_h5[i])
}

# 不要であればspatialフォルダを削除
unlink("spatial", recursive = TRUE)


画像スケール情報の上書き

読み込めたと思ったら更なる落とし穴があった。

Visium切片上で値をplotしてもvisium slideの枠の左上にplotされ、HE画像もoverlapしない。

SpatialFeaturePlot(visium_list[[1]],
                            features = c("nCount_Spatial", "nFeature_Spatial")) &
  theme(legend.position = "right")

Visiumの生データをSpacerangerで処理して得られる画像データにhigh resolutionの物とlow resolutionの物があり、Load10X_Spatialではlow resolution画像しか想定していないようだ。
しかし、このdepositデータにはhigh resolutionの物しかない。。。

他のデータを見ているとhigh resolutionは2000 * 1954 pxでlow resolutionは600 * 587 pxの画像サイズで3.3333倍ダウンサンプリングされているようだ。

読み込み時に使用したscalefactors_json.jsonファイルにhigh resolution, low resolutionそれぞれのscale factorが記載されていて、それがSeuratオブジェクト内にも記録されていた。

使用したhigh resolutionをlow resolution画像のscale.factorで扱われているようなので、この情報を上書きしてやると、スポットがHE画像に重なるようになった。

scale.factorの修正
visium_list[[1]]@images[["slice1"]]@scale.factors[["lowres"]] <- visium_list[[1]]@images[["slice1"]]@scale.factors[["hires"]]

SpatialFeaturePlot(visium_list[[1]],
                            features = c("nCount_Spatial", "nFeature_Spatial")) &
  theme(legend.position = "right")

spotサイズが本来より小さい気がするので、こちらも修正しておく。spot.radiusという項目を上書き。

spot sizeの修正
visium_list[[1]]@images[["slice1"]]@spot.radius <- visium_list[[1]]@images[["slice1"]]@spot.radius*3.3333

SpatialFeaturePlot(visium_list[[1]],
                            features = c("nCount_Spatial", "nFeature_Spatial")) &
  theme(legend.position = "right")


画像をダウンサンプリングしてから読み込み

上記のように無理やり情報を上書きすると、今後の解析の際のエラーに繋がりかねないので、読み込み画像をlow resolutionになるようにダウンサンプリングしてから使う方が良いかもしれない。
また実際にhigh resolution画像で解析を進めるとplot類がいちいち遅い。

EBImageパッケージで画像をダウンサンプリングしてから使うように変更。

# BiocManager::install("EBImage")
library(EBImage)

(path_h5 <- dir(pattern = "visium.h5"))
(path_png <- dir(pattern = "png"))
(path_json <- dir(pattern = "scalefactors"))
(path_csv <- dir(pattern = "tissue_positions_list"))

dir.create("spatial")

visium_list <- list()
for(i in seq(length(path_h5))){
  file.copy(from = path_json[i],
            to = "spatial/scalefactors_json.json",
            overwrite = TRUE)
  file.copy(from = path_csv[i],
            to = "spatial/tissue_positions_list.csv",
            overwrite = TRUE)  
  
  # 画像を読み込み
  img <- readImage(files = path_png[i])
  # 幅600pxになるようにダウンサンプリング
  img <- resize(img, w = 600)
  # spatialフォルダに書き出し
  writeImage(img, "spatial/tissue_lowres_image.png")
  
  visium_list[[i]] <- Load10X_Spatial(data.dir = getwd(),
                                      filename = path_h5[i])
}

unlink("spatial", recursive = TRUE)

ちゃんとspot位置もあっていた。

SpatialFeaturePlot(visium_list[[1]],
                            features = c("nCount_Spatial", "nFeature_Spatial")) &
  theme(legend.position = "right")

Discussion