Seurat v3.0って何がすごいのか

まだプレリリース版のSeruat v3.0ですが、
10Xのサイトで以下のように言及されたことにより、こちらを使用する人が増えている気がします。

Seurat 3.0 is specifically designed to handle the type of multi-data experiments enabled by Feature Barcoding technology, and can also read the latest output file produced by Cell Ranger 3.0
引用:https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/rkit

そしてSeuratで大人気のPBMCを用いた解析チュートリアルですが、
実はSeurat v3.0対応版が2018年12月10日に公開されています。
PBMC 3k guided clustering

2系 → 3系で何が変わったか

2系と3系の違いについては、以下にざっくり書かれています。
https://satijalab.org/seurat/essential_commands.html

大きく分けて以下の3つの変更点がありました。

  • cellranger3系のデータ読み込みに対応した
  • データの参照、抽出、結合が容易になった
  • より高機能な可視化が可能になった

順に見ていきましょう。

cellranger3系のデータ読み込みに対応した

cellranger2系 → cellranger3系では、出力されるデータフォーマットに変更がありました。

2系

$ tree filtered_gene_bc_matrices/hg19/
filtered_gene_bc_matrices/hg19/
├── barcodes.tsv
├── genes.tsv
└── matrix.mtx

3系

$ tree filtered_feature_bc_matrix
filtered_feature_bc_matrix
├── barcodes.tsv.gz
├── features.tsv.gz
└── matrix.mtx.gz

何が違うのか。

  • genes → featuresと表現するようになった
  • 各ファイルがgz圧縮された。

こんなところです。
前者の変更は、features.csvではRNAのデータのみでなく、CITE-seqにより取得することのできる表面タンパクの発現データを格納することができるようになったことが理由のようです。

Seurat v3.0のRead10X関数では、このデータフォーマットの読み込みに対応しています。 CITE-seqの結果を含んだデータを読み込むと、Read10X関数の結果は以下のようにリスト形式で格納されます。

> pbmc.data
$`Gene Expression`
33538 x 713 sparse Matrix of class "dgCMatrix"
   [[ suppressing 33 column names ‘AAACCCAAGTGGTCAG’, ‘AAAGGTATCAACTACG’, ‘AAAGTCCAGCGTGTCC’ ... ]]
   [[ suppressing 33 column names ‘AAACCCAAGTGGTCAG’, ‘AAAGGTATCAACTACG’, ‘AAAGTCCAGCGTGTCC’ ... ]]
                                                                                    
MIR1302-2HG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ......
FAM138A     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ......

$`Antibody Capture`
17 x 713 sparse Matrix of class "dgCMatrix"
   [[ suppressing 34 column names ‘AAACCCAAGTGGTCAG’, ‘AAAGGTATCAACTACG’, ‘AAAGTCCAGCGTGTCC’ ... ]]
                                                                                 
CD3_TotalSeqB              3 3444 1733    8  13    8   37  101 2111 1641   16 381
CD4_TotalSeqB              6 3995 3401   13 180  653  633  328   16 2833  283   2

$Gene Expressionには通常のscRNA発現量データが、
$Antibody Captureには表面タンパクの発現量データが格納されています。

Read10X関数のソースコードを見に行くと、genes.tsvのあるなしでキチンと分岐されているので
cellranger2系のデータも読み込むことができます。

Read10X <- function(data.dir = NULL, gene.column = 2) {
・
・
    barcode.loc <- paste0(run, "barcodes.tsv")
    gene.loc <- paste0(run, "genes.tsv")
    features.loc <- paste0(run, "features.tsv.gz")
    matrix.loc <- paste0(run, "matrix.mtx")
    # Flag to indicate if this data is from CellRanger >= 3.0
    pre_ver_3 <- file.exists(gene.loc)
    if (!pre_ver_3) {
      addgz <- function(s) {
        return(paste0(s, ".gz"))
      }
      barcode.loc <- addgz(s = barcode.loc)
      matrix.loc <- addgz(s = matrix.loc)
    }

データの参照、抽出、結合が容易になった

データの参照

2系
slotを参照する必要がありました。

# 細胞ラベル
object@cell.names
# 遺伝子ラベル
rownames(x = object@data) 

3系
data.frame型のオブジェクトからデータを抽出する際に使用するcolnamesncol関数を使用できるようになってます。

# 細胞ラベル
colnames(x = pbmc)
Cells(object = pbmc)

# 遺伝子ラベル
rownames(x = pbmc)

# 細胞数
ncol(x = pbmc)

# 遺伝子数
nrow(x = pbmc)

データの抽出

2系
FilterCells 関数やSubsetData関数を使う必要がありました。

FilterCells(object = object, subset.names = "name", low.threshold = low, high.threshold = high)
SubsetData(object = object, subset.name = "name", low.threshold = low, high.threshold = high)    

3系
3系では、data.frame型で使用するsubset関数が使用できます。

# 特定セルタイプに属する細胞
subset(x = pbmc, idents = c("CD4 T cells", "CD8 T cells"), invert = TRUE)

# 特定の遺伝子発現を持った細胞
subset(x = pbmc, subset = MS4A1 > 3)

データのマージ

2系
MergeSeurat関数を使う必要がありました。

MergeSeurat(object1 = object1, object2 = object2)    

3系
これまたdata.frame型で使用するmerge関数が使用できます。

# 2つ
merge(x = pbmc1, y = pbmc2)
# 2つ以上
merge(x = pbmc1, y = list(pbmc2, pbmc3))

各種スロットについて

3系では2系と比較してスロットの構成がよりシンプルになっています。

2系

> slotNames(pbmc.seurat2)
 [1] "raw.data"     "data"         "scale.data"   "var.genes"    "is.expr"
 [6] "ident"        "meta.data"    "project.name" "dr"           "assay"
[11] "hvg.info"     "imputed"      "cell.names"   "cluster.tree" "snn"
[16] "calc.params"  "kmeans"       "spatial"      "misc"         "version"

3系

> slotNames(pbmc.seurat3)
 [1] "assays"       "meta.data"    "active.assay" "active.ident" "graphs"      
 [6] "neighbors"    "reductions"   "project.name" "misc"         "version"     
[11] "commands"     "tools"     

より高機能な可視化が可能になった

以下の例に加え、ヒートマップの色使いが若干綺麗になってたりします(気のせいかも)。

JackStrawPlot

3系ではすべてのPCについてのJackStrawPlotを、重ねて描画することが可能になりました。
これにより、クラスタリングに使用すべき有意な(重要な)PCの選定がより簡単になったということができます。

2系 f:id:kimoppy126:20190304235740p:plain 3系 f:id:kimoppy126:20190304235718p:plain

TSNEPlot (DimPlot)

Seuratの可視化はggplotをラップしているので、可視化の際は足し算的にオプションを追加することができます。 Seurat3系では、TSNEPlot関数は、PCAPlot関数等と共に、DimPlot関数として統合されました。
このDimPlot関数では、以下のようなテーマを足し算的に追加することができます。

テーマ 機能
DarkTheme ダークテーマを使用する
FontSize フォントサイズを変更する
NoAxes 軸の削除
NoLegend legendを消す
RotatedAxis x軸のラベルを回転する

2系 2系の場合、画像の諸々を変えるにはプロットの描画関数で引数を指定する必要がありました。

TSNEPlot(object, do.label = FALSE, pt.size = 1)

f:id:kimoppy126:20190306064544p:plain 3系 3系では足し算的に画像の諸々を変えることが出来ます。

DimPlot(object = pbmc) + DarkTheme ()

f:id:kimoppy126:20190306002758p:plain

DimPlot(object = pbmc) + FontSize(40)

f:id:kimoppy126:20190306004310p:plain

DimPlot(object = pbmc) + NoAxes()

f:id:kimoppy126:20190306004357p:plain

DimPlot(object = pbmc) + RotatedAxis()

f:id:kimoppy126:20190306004436p:plain

総括

Seuratは、その扱いやすさ、プロットのわかりやすさから人気を集めています。
3系はまだプレリリース版であり、ドキュメントが整備されておらず未実装な関数がいくつか存在します。そのため、cellranger 3系のデータを使用して解析を行いたい場合や、CITE-seqのデータを用いて解析するようなケースを除けば、まだ2系を使用して解析するのが良いのではないかと思います。

3系の公式リリースに期待しましょう。