野生型マウスと2型糖尿病マウス(db/db)の膵島における遺伝子発現を 比較した研究( PMID:29542001)データを使用する. 論文上の記載からGEOリポジトリにID番号:GSE107489で登録されていることがわかる. GSE107489@GEOから解析済みデータが入手できるが今回は解析前の生データから再解析する. そこでSRA Run Selectorをクリックし、SRAデータベースのページ(ID:PRJNA420351)に遷移する. Run IDを確認する. Accession ListをダウンロードすればID一覧を得ることができる.
まずは以下のようなプロジェクト専用の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
以下のように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の論理コア(スレッド)数の確認しておく. 以下の例では最大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
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