Tomlab RNA-seq

RNA-seq


今回使用する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                    # MAC 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