SeuratでDEG解析する

はじめに

DEGの解析をすることになった。 RだとDESeq2, edgeRあたり、PythonだとScanpyがマジョリティーっぽい。

で、ツール選定ではなるべくPythonに寄せたかったのでScanpyを使おうとしたのだが、2群間のDEG解析の手法がどうもわからず(群を示すパラメーターを受ける引数がなかった)。

そこで、なるべくPythonに巻き取りやすいようツールを探すとSeuratがよさそうだった。以下、理由

  • Scanpyで扱うAnnDataと相互にやり取りできるらしい
  • 比較的新しめのツールだが、作りっぱなしではなく開発が活発
  • コミュニティも活発な印象

ただいくつかハマったので注意点をメモする

使ってみた

Pandasのデータフレームと流儀が違う部分

  • 列名(多分行名も)はユニークなリスト、重複はダメ
  • 列名、行名へのアクセスはメンバ変数やgetメソッドではなく、列名を取り出す関数にRのseuratオブジェクトを渡す

ハマったところ

  • 同じ群に含まれる細胞ということを示す重複を許すラベルの付け方

    • Idents(seurat) <- identified_col この部分
    • ChatGPTやドキュメントにも記載が見当たらなかったのでだいぶ時間を溶かした
    • https://qiita.com/amufaamo/items/01ee43e1d959caab479f これにIdentって記載があってやってみたらできた
  • どっちが実験群?

    • markers <- FindMarkers(seurat, ident.1 = "treatment", ident.2 = "control")
    • log2FCの説明を見るところident1が実験群
    • ident1, ident2って変数名の説明もよくわからんので時間が溶けた

解析コード

install.packages('Seurat')
library(Seurat)

# csvのデータを読み込む
filename <- "hogehoge.tsv"
output <- "deg_list"

data <- read.table(filename, header=TRUE, row.names = 1)

# データの列名の整形
colnames(data) <- gsub("_", "-", colnames(data))  # アンダースコアをハイフンに書き換える
identified_col <- sub("\\..*", "", colnames(data))  # 列名に含まれるピリオド以下を削除する

# seuratオブジェクト生成
seurat <- CreateSeuratObject(data, project = "hogehoge")
Idents(seurat) <- identified_col  # 細胞にdayごとのラベルをつける
print(Idents(seurat))  # FindMarkersに指定できるidentとして何が使えるかを確認

# 2群間でDEGを取る
markers <- FindMarkers(seurat, ident.1 = "treatment", ident.2 = "control")
print(markers)
write.csv(markers, file = output)

おわりに

write.csvで無理やりファイル出力できることを後で知ったのでもっと資料があるDESeq2とかにした方がさっさと解決できたかもしれん。