CmhaDSO NGSデータ解析入門者に対する手引き


今回使用するReadデータ(生データ)について

野生型マウスと2型糖尿病マウス(db/db)の膵島における遺伝子発現を 比較した研究( PMID:29542001)データを使用する. 論文上の記載からGEOリポジトリにID番号:GSE107489で登録されていることがわかる. GSE107489@GEOから解析済みデータが入手できるが今回は解析前の生データから再解析する. そこでSRA Run Selectorをクリックし、SRAデータベースのページ(ID:PRJNA420351)に遷移する. Run IDを確認する. Accession ListをダウンロードすればID一覧を得ることができる.

Project Directoryなどの準備

まずは以下のようなプロジェクト専用のdirectory構造を準備しよう. 今回はすでに準備済みのGSE107489 tarballを ダウンロード・解凍して使用する.

$ tar xf GSE107489.tar   # tarballの解凍
GSE107489
├── SCRIPT       # スクリプトファイルの配置directory
│   ├── download_from_gencode.sh  # Reference dataのダウンロードスクリプト
│   ├── make_gid2name.sh          # 遺伝子IDと遺伝子名の対応表作成スクリプト 
│   ├── make_tx2gene.sh           # 転写産物IDと遺伝子IDの対応表作成スクリプト
│   ├── sra.sh                    # 生データ入手するためのスクリプト
│   ├── trim.sh                   # トリミング実行スクリプト
│   ├── map_index.sh              # マッピングインデックス作成スクリプト
│   ├── map.sh                    # マッピング実行スクリプト
│   ├── deg.ipynb                 # 発現差解析スクリプト
│   └── postdeg.sh                # 発現差解析データ整形スクリプト
├── REFERENCE    # download_from_gencode.sh, make_gid2name.sh, make_tx2gene実行結果を配置するdirectory
├── SOURCE       # sra.sh実行結果を配置するdirectory
├── TRIM         # trim.sh実行結果を配置するdirectory
├── INDEX        # map_index.sh実行結果を配置するdirectory
├── MAP          # map.sh実行結果を配置するdirectory
├── DEG          # deg.sh, postdeg.sh実行結果を配置するdirectory
└── sample_info  # 解析対象の試料情報を記述したファイル.

sample_infoの内容は以下の通りである.

SRR6329222 wt_1 wt
SRR6329223 wt_2 wt
SRR6329225 wt_3 wt
SRR6329224 db_1 db
SRR6329226 db_2 db
SRR6329227 db_3 db

解析ソフトウェアのインストール(CONDA環境の準備)

以下のようにRNA-seq解析に必要なツールを導入する.

$ conda create -n sra        # sra環境を作る. 
$ conda create -n trim       # trim環境を作る. 
$ conda create -n map        # map環境を作る. 
$ conda create -n deg        # deg環境を作る. 
$ conda info -e              # 環境の一覧を表示し、確認.
$ conda activate sra                    # sra環境に入る.
$ conda install -c bioconda sra-tools   # sra-tools"をインストール. 
$ conda activate trim                   # trim環境に入る.
$ conda install -c bioconda trim-galore # trim-galore"をインストール. 
$ conda activate map                    # map環境に入る. 
$ conda install -c bioconda salmon      # salmonをインストール. 
$ conda activate deg                    # deg環境に入る. 
$ conda install -c bioconda bioconductor-deseq2 bioconductor-tximport  # DESEQ2とtximportをインストール.
$ conda install -c conda-forge jupyterlab r-irkernel # Jupyter利用に必要なもの.

PCのスレッド数(論理コア数)の確認

解析を実行する前にPCの論理コア(スレッド)数の確認しておく. 以下の例では最大8スレッドまで指定できる.

$ cat /proc/cpuinfo | grep processor | wc -l     # WSL2 user
$ sysctl -n hw.logicalcpu_max                    # macOS user
8

生データの入手

SRAデータベースから生データを入手するためのスクリプトsra.sh の内容は以下の通りである.

# このスクリプトはProject directory上からsh SCRIPT/sra.shのように
# 実行することを想定している.
info=sample_info
thread=8
tmp_dir=/tmp
output_dir=SOURCE

cat $info |
while read i j k ; do
  fasterq-dump $i  \
    -t $tmp_dir    \
    -O $output_dir \
    -e $thread     \
    -p

  gzip $output_dir/$i.fastq
done

解析(データのダウンロードとGZIP圧縮)実行

$ conda activate sra
$ sh SCRIPT/sra.sh

Referenceデータの入手および処理データの作成

GENCODEからReferenceデータを入手するためのスクリプト download_from_gencode.shの内容は以下の通りである.

# このスクリプトはProject directory上からsh SCRIPT/download_from_gencode.shのように
# 実行することを想定している.

MUS=30
HS=41
URL_M=http://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_mouse
URL_H=http://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_human

cd REFERENCE  # (必要なら) DOWNLOADしたファイルを配置するDirectoryに移動

# GTF
curl -O $URL_M/release_M$MUS/gencode.vM$MUS.annotation.gtf.gz
#curl -O $URL_H/release_$HS/gencode.v$HS.annotation.gtf.gz

# TRANSCRIPTOME
curl -O $URL_M/release_M$MUS/gencode.vM$MUS.transcripts.fa.gz
#curl -O $URL_H/release_$HS/gencode.v$HS.transcripts.fa.gz

# GENOME
#curl -O $URL_M/release_M$MUS/GRCm39.primary_assembly.genome.fa.gz
#curl -O $URL_H/release_$HS/GRCh38.primary_assembly.genome.fa.gz

downloadの実行

$ sh SCRIPT/download_from_gencode.sh

Transcription IDとGene IDの対応表tx2geneを作成するスクリプト make_tx2gene.shの内容は以下の通りである.

# このスクリプトはProject directory上からsh SCRIPT/make_tx2gene.shのように
# 実行することを想定している.
  
input_file=gencode.vM30.annotation.gtf.gz
output_file=tx2gene

cd REFERENCE   # (必要なら)事前に*.gtfファイルの配置されたdirectoryに移動しておく.

zcat $input_file              | # zcatが使用できぬ場合はgunzip -c
grep -v '^#'                  | # 冒頭のコメント行を除く処理
awk -F'\t' '$3=="transcript"' | # 3列目がtranscriptであるエントリーのみ抽出
awk -F'\t' '{print $9}'       | # 9列目に遺伝子IDと遺伝子名の情報があるので抽出
awk -F ';' '{print $2, $1}'   | # ;区切りの2,1列目の順に抽出
awk '{print $2, $4}'          | # スペース区切りの2,4列目を抽出
tr -d '"'                     | # 不要な引用符を除く
tr '.' ' '                    | # 以下2行はIDのバージョン番号を取除くための処理
awk '{print $1, $3}'          | # 正規表現で正確にマッチさせ置換する処理の方が望ましい
sort < $output_file

Gene IDと遺伝子名の対応表gid2nameを作成するスクリプト make_gid2name.shの内容は以下の通りである.

# このスクリプトはProject directory上からsh SCRIPT/make_gid2name.shのように
# 実行することを想定している.

input_file=gencode.vM30.annotation.gtf.gz
output_file=gid2name

cd REFERENCE   # (必要なら)事前に*.gtfファイルの配置されたdirectoryに移動しておく.

zcat $input_file            | # zcatが使用できぬ場合はgunzip -c
grep -v '^#'                | # 冒頭のコメント行を除く処理
awk -F'\t' '$3=="gene"'     | # 3列目がgeneであるエントリーのみ抽出
awk -F'\t' '{print $9}'     | # 9列目に遺伝子IDと遺伝子名の情報があるので抽出
awk -F ';' '{print $1, $3}' | # ;区切りの1,3列目を抽出
awk '{print $2, $4}'        | # スペース区切りの2,4列目を抽出
tr -d '"'                   | # 不要な引用符を除く
tr '.' ' '                  | # 以下2行はGene IDのバージョン番号を取除くための処理
awk '{print $1, $3}'        | # 正規表現で正確にマッチさせ置換する処理の方が望ましい
sort < $output_file

ID対応表の作成実行

$ sh SCRIPT/make_tx2gene.sh
$ sh SCRIPT/make_gid2name.sh

トリミングの実行

trim.shスクリプト内容は以下の通りである.

info=sample_info
input_dir=SOURCE
output_dir=TRIM

cat $info |
while read i j k; do
  trim_galore      \
    -o $output_dir \
    $input_dir/$i.fastq.gz
done

解析(トリミング)実行.

$ conda activate trim
$ sh SCRIPT/trim.sh

マッピングの実行

Mappingのためのindex(再利用可)を作成する. map_index.shスクリプト内容は以下の通りである.

thread=8
ref_transcripts=REFERENCE/gencode.vM30.transcripts.fa.gz
output_dir=INDEX

salmon index          \
  -p $thread          \
  -t $ref_transcripts \
  -i $output_dir      \
  -k 31               \
  --gencode

解析(index作成)の実行.

$ conda activate map
$ sh SCRIPT/map_index.sh

map.shスクリプト内容は以下の通りである.

info=sample_info
thread=8
input_dir=TRIM
index_dir=INDEX
output_dir=MAP

cat $info          |
while read i j k ; do
    salmon quant                       \
      -l A                             \
      -i $index_dir                    \
      -r $input_dir/${i}_trimmed.fq.gz \
      -p $thread                       \
      --validateMappings               
      -o $output_dir/$i
done

解析(mapping)実行

$ sh SCRIPT/map.sh

発現差解析の実行

DEG解析のためのRスクリプトdeg.ipynbをJupyter環境から実行する.

$ conda activate deg
$ jupyter lab SCRIPT/deg.ipynb
# load 
library("tximport")
library("jsonlite")
library("DESeq2")

setwd("..")   # GSE107489/SCRIPTからGSE107489へ作業directoryを移動

# set parameters
info_path       <- "sample_info"
tx2gene         <- "tx2gene"
map_dir         <- "MAP"
ref_dir         <- "REFERENCE"
deg_dir         <- "DEG"
output_txi      <- "txi"
output_d2       <- "deseq2"
output_pca      <- "pca.pdf"
output_heatmap  <- "heatmap.pdf"

# sample information
info        <- read.table(info_path, header = FALSE, sep = " ")
info$V3     <- factor(info$V3, levels = c("wt","db"))
path        <- file.path(map_dir, info$V1, "quant.sf")
names(path) <- info$V2
tx2gene     <- read.table(file.path(ref_dir, tx2gene), header = FALSE, sep = " ")

# tximport
txi  <- tximport(path, 
                    type = "salmon",
                    tx2gene = tx2gene,
                    ignoreTxVersion = TRUE )

# DESeq2
dds <- DESeqDataSetFromTximport(txi, info, ~ V3)
dds <- DESeq(dds)
res <- results(dds)

rld     <- rlog(dds)
rld_mat <- assay(rld)
rld_cor <- cor(rld_mat)

# output data
write.table(txi, file.path(deg_dir, output_txi), append = FALSE)
write.table(res, file.path(deg_dir, output_d2),  append = FALSE)
      
pdf(file.path(deg_dir, output_pca))
plotPCA(rld, intgroup = "V3")
dev.off()

pdf(file.path(deg_dir, output_heatmap))
heatmap(rld_cor)
dev.off()

発現差解析データの整形処理

DEGs解析データを整形するためのpostdeg.shの内容は以下の通りである.

input=DEG/deseq2
output=DEG/deseq2_processed.csv
gid2name=REFERENCE/gid2name

cat $input                 |
# ヘッダーを除く
tail -n +2                 |
# 1:ID 3:logFC 7:adjusted_p_val
awk '{print $1, $3, $7}'   |
# 引用符を除く
tr -d '"'                  |
# 欠損値を含む行を除く
awk '$3!="NA"'             |
awk '$4!="NA"'             |
# 2:logFCを2:FCに変換する
awk '{print $1, 2^$2, $3}' |
# 遺伝子名情報を内部結合で追加する
join -o 1.1 2.2 1.2 1.3 - $gid2name |

  # 1番目のファイル: d2_processed 
  # 2番目のファイル: gid2name
  # 
  # 1列目を共通キーとして両者を内部結合している.
  # キー列(1列目)はあらかじめソートされている必要がある. 
  # 
  # -o 1.1 2.2 1.2 1.3 の箇所で何をどの順に出力するかを指定.
  #   1.1: ファイル1の1列目
  #   2.2: ファイル2の2列目
  #   1.2: ファイル1の2列目
  #   1.3: ファイル1の3列目

# EXCELで開きやすいようCSV形式にする
tr ' ' ','               < $output