转录组上游流程

author: "余顺太"
date: "2020-03-23"

knitr::opts_chunk$set(echo = TRUE)

主要参考的生信技能树文章:
原创10000+生信教程大神给你的RNA实战视频演练

上游流程一般不用学,公司测好序一般会直接给表达矩阵。

NCBI搜索文章 Spatially and functionally distinct subclasses of breast cancer-associated fibroblasts revealed by single cell RNA sequencing
进入Data availability部分,拿到GSE的id号——点开超链接GSE111229进入GEO数据库,

dqvo7t.png

准备工作

  1. 安装conda

在中国大陆的小伙伴,需要更改镜像源配置

$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda
$ conda config --set show_channel_urls yes
  1. 安装软件
    为了避免污染linux工作环境,推荐在conda中创建各个流程的安装环境,比如:
$ conda create -n rna python=2 #创建名为rna的软件安装环境
$ conda info --envs #查看当前conda环境
$ conda activate rna #激活conda的rna环境,曾健明使用的source activate rna,并不好用。

------------------以下为补充内容------------------
转录组分析需要用到的软件列表
质控:fastqc, multiqc, trimmomatic, cutadapt, trim-galore
比对:star, hisat2, bowtie2, tophat, bwa, subread
计数:htseq, bedtools, deeptools, salmon
------------------以上为补充内容------------------

conda install -y sra-tools multiqc trim-galore subread hisat2

$ conda search packagename #安装之前先检索是否存在该软件

$ conda install -y sra-tools  #
$ conda install -y trimmomatic
$ conda install -y cutadapt multiqc #
$ conda install -y trim-galore #
$ conda install -y star hisat2 bowtie2  #
$ conda install -y subread tophat htseq bedtools deeptools  #
$ conda install -y salmon
$ conda deactivate #注销当前的rna环境

转录组流程


第一步:sra数据下载和转fastq格式

下载SRA数据,去GEO里面找到SRA再找到文件。使用SRA Toolkit的prefetch进行下载,prefetch放在sratoolkit文件夹下的bin目录。

1.下载SRA Toolkit

SRA Toolkit的下载如下:


dqxqV1.png

找到对应的版本,右键复制链接地址,linux命令行使用wget下载

2.下载sra数据

prefetch下载数据,先将sratoolkit写入环境变量,然后直接下载
sra数据的下载浪费了老子一天的时间也没下载下来,去他马勒戈壁的,不下啦!(关掉电脑过了一夜,删掉了sratoolkit那个文件夹又TMD可以下了。)

$ conda activate rna
$ prefetch SRR6791442  #可以直接下载,下载的结果在~/ncbi/public/sra里面,这个文件夹会被自动创造出来。

也可以批量下载

$ cat srr.list
SRR6791441
SRR6791442
SRR6791443
SRR6791444
SRR6791445

$ cat srr.list |while read id; do (nohup prefetch $id &); done  #曾健明说因为有管道命令,所以do后用()括起来。亲测有效,如果不写入bashrc则prefetch需要使用绝对变量。
$ ps -ef|grep prefetch  #可以看到正在下载的东西
$ ps -l  #上一步执行之后使用jobs -l没有反应,使用ps-l会有反应。  #事实上这两个都不太准确,应该用top命令。
$ less nohup.out|grep failed  #虽然自动下载,但是有些是错的,需要重新下载。

我一个一个下的(这种方法下载的不是.sra结尾,但是文件是一样的):


dqxl9O.png

每一个细胞都是一个单独的sra文件,是单细胞单样本;10X是只有一个样本,但是这个样本有4000到8000个细胞,但是这么多样本只有一个fastq文件,通过UMI和barcode去把细胞分开。

3.sra格式转fastq格式

单个sra格式文件转fastq格式

$ fastq-dump SRR6791442.sra   #格式转还用到的软件是fastq-dump,该软件在sratoolkit的bin目录下。但是如果用conda装的软件,直接激活conda环境就可以直接用了。

sra格式批量转fastq格式

$ ls ./*sra |while read id; do (nohup fastq-dump --split-3 --gzip --skip-technical --clip ${id} &); done  #曾健明说因为有管道命令,所以do后用()括起来。 #因为是单端测序所以只会转一个文件,若是双端测序会产生两个。

几个参数的意思(查一下~):
--split-3:一个样本被拆分成两个fastq文件
--gzip:可以产生fastq的压缩文件,更省空间。
--skip-technical:
--clip:
-O #可以选择输出的位置,O是大写的。

曾健明说转了之后批量做比对,比对用hisat,所以要找到参考基因组的索引。如何下载参考基因组???


第二步:质量控制

1. fsatqc

对单个文件进行fastqc

$ fastqc SRR1039510_1.fastq.gz  #对SRR1039510_1.fastq.gz进行fastqc。
$ fastqc -t 10 SRR1039510_1.fastq.gz  #-t是线程,多线程更快一些。
$ fastqc -t 10 SRR1039510_1.fastq.gz -o /data1/lixianlong/YST/  #-o将结果输出到指定位置。

文件批量fastqc

$ ls *gz | xargs fastqc -t 2  #每个id_fastqc.html(比如SRR6791441_fastqc.html)都是一个质量报告

xargs命令可以将前面的文件作为参数传给后面的命令,也可以用while read id do,不可以用管道,因为管道传的是文件名不是文件。

2. multiqc

fastqc生成质控报告,multiqc将各个样本的质控报告整合为一个。

$ multiqc ./   #这一步生成的multiqc_report.html,是所有样本的整合报告,要确保已经安装了multiqc。
$ zless SRR1039508_1.fastq.gz  #可以看到length是63,也就是算上adapter的长度是63。

在SRR1039508_1_fastqc.html文件里的Overrepresented sequences那一项里面可以找到adapter


dqzNM4.png
$ zcat SRR1039508_1.fastq.gz|grep GTCTTCTGCTTG 

fastqc质控报告如何看自己去查!


第三步: 去除低质量reads和去除接头

运行如下代码,得到名为config的文件,包含两列数据(双端测序需要的)

$ mkdir $wkd/clean 
$ cd $wkd/clean 
$ ls /home/jmzeng/project/airway/raw/*_1.fastq.gz >1
$ ls /home/jmzeng/project/airway/raw/*_2.fastq.gz >2
$ paste 1 2  > config

1.对单独一个文件进行trim-galore (如果trim-galore安装在了其他conda环境中,执行下列操作前需要先激活该环境。执行完之后再失活该环境).

bin_trim_galore=trim_galore  #这一步本是多此一举,但是很多时候并不想将软件写入环境变量,就可是在这里使用绝对路径,之后引用变量就可以了。
dir='/data1/lixianlong/YST/clean'  #将结果导向的位置。
fq1='~/ncbi/public/sra/SRR1039508_1.fastq.gz'
fq2='~/ncbi/public/sra/SRR1039508_2.fastq.gz'
$bin_trim_galore -q 25 --phred33 --length 36 -e 0.1 --stringency 3 --paired -o $dir  $fq1 $fq2 

可以将得到的文件再进行fastqc和multiqc,和trim-galore之前的fastqc以及multiqc结果进行对比就可以看出差别,如果觉得不太满意可以再去调节参数。trim-galore之后得到的是干净的测序数据,就可以用来跑后面的流程了。
强烈警告:这个软件的名字叫做trim-galore,conda安装的使用也是使用 conda install trim-galore,但是安装成功之后可执行文件是trim_galore,并不是trim-galore,二者中间的横是不一样的,这点一定注意!否则无法执行。

--quality:设定Phred quality score阈值,默认为20。
--phred33::选择-phred33或者-phred64,表示测序平台使用的Phred quality score。
--adapter:输入adapter序列。也可以不输入,Trim Galore! 会自动寻找可能性最高的平台对应的adapter。自动搜选的平台三个,也直接显式输入这三种平台,即--illumina、--nextera和--small_rna。
--stringency:设定可以忍受的前后adapter重叠的碱基数,默认为1(非常苛刻)。可以适度放宽,因为后一个adapter几乎不可能被测序仪读到。
--length:设定输出reads长度阈值,小于设定值会被抛弃。因为前面发现算上adapter的长度是63,所以这里的length将阈值设为36,表示去掉两端adapter之后,长度小于36的会被丢弃。而如果算上adapter的长度是150,一般会将这里的length设为50,意思是将两端adapter去掉之后,长度小于50的会被丢弃。
-e:不是特别所谓
--stringency:adapter比对到多少算adapter,这里可以写成3,4,5都可以,后期可以慢慢调。

--paired:对于双端测序结果,一对reads中,如果有一个被剔除,那么另一个会被同样抛弃,而不管是否达到标准。
--retain_unpaired:对于双端测序结果,一对reads中,如果一个read达到标准,但是对应的另一个要被抛弃,达到标准的read会被单独保存为一个文件。
--gzip和--dont_gzip:清洗后的数据zip打包或者不打包。
--output_dir:输入目录。需要提前建立目录,否则运行会报错。
-- trim-n : 移除read一端的reads

2.使用循环对文件进行批量的trim-galore操作

$ cat > qc.sh  
    bin_trim_galore=trim_galore  #这一步本是多此一举,但是很多时候并不想将软件写入环境变量,就可是在这里使用绝对路径,之后引用变量就可以了。
    dir='/data1/lixianlong/YST/clean'  #将结果导向的位置。
    cat $1 |while read id   
    do
        arr=(${id})  # $id 表示$1的每一行,这里是config的每一行,以空格键分割。
        fq1=${arr[0]}  # 空格键分割的第一个元素
        fq2=${arr[1]}  # 空格键分割的第二个元素,曾健明说直接拿来用就好,为什么这样他也不知道。余顺太发现这个其实属于《LINUX命令行与shell脚本》6.7 数组变量的内容。
        nohup $bin_trim_galore -q 25 --phred33 --length 36 -e 0.1 --stringency 3 --paired -o $dir  $fq1 $fq2 &
   done 
$ bash qc.sh config  #config就是qc.sh脚本的$1

第四步:比对

为什么需要比对?
NGS测序下来的短序列(read)存储于FASTQ文件里面。虽然它们原本都来自于有序的基因组,但在经过DNA建库和测序之后,文件中不同read之间的前后顺序关系就已经全部丢失了。因此,FASTQ文件中紧挨着的两条read之间没有任何位置关系,它们都是随机来自于原本基因组中某个位置的短序列而已。因此,我们需要先把这一大堆的短序列捋顺,一个个去跟该物种的 参考基因组【注】比较,找到每一条read在参考基因组上的位置,然后按顺序排列好,这个过程就称为测序数据的比对。这也是核心流程真正意义上的第一步,只有完成了这个序列比对我们才有下一步的数据分析。
【注】参考基因组:指该物种的基因组序列,是已经组装成的完整基因组序列,常作为该物种的标准参照物,比如人类基因组参考序列,fasta格式。

序列比对本质上是一个寻找最大公共子字符串的过程。BLAST使用的是动态规划的算法来寻找这样的子串,但在面对巨量的短序列数据时,类似BLAST这样的软件实在太慢了!因此,需要更加有效的数据结构和相应的算法来完成这个搜索定位的任务,BWA就是其中最优秀的一个,它将BW(Burrows-Wheeler)压缩算法和后缀树相结合,能够让我们以较小的时间和空间代价,获得准确的序列比对结果。

为参考基因组构建索引——这其实是在为参考序列进行Burrows Wheeler变换(wiki: 块排序压缩),以便能够在序列比对的时候进行快速的搜索和定位。
$ bwa index human.fasta

以我们人类的参考基因组(3Gb长度)为例,这个构造过程需要消耗几个小时的时间(一般3个小时左右)。完成之后,你会看到类似如下几个以human.fasta为前缀的文件:
.
├── human.fasta.amb
├── human.fasta.ann
├── human.fasta.bwt
├── human.fasta.pac
└── human.fasta.sa
这些就是在比对时真正需要被用到的文件。这一步完成之后,我们就可以将read比对至参考基因组了:

转录组比对hisat2,subjunc,star这三个工具比较流行,基因组比对bwa,bowtie2比较流行;比对最重要的是用参考基因组构建索引,现有的参考基因组存储网站三个:ENSEMBL,UCSC,NCBI。每个软件构建索引的方式并不一样。现有比对工具在做mapping之前,都需要下载对应物种的参考基因组然后构建index。索引构建,自己去查一下各个软件构建索引的代码。索引构建非常慢,至少两个小时。
ENSEMBL的命名规则则是采用GRCh/m的方式,GRCh37对应hg19,hg38对应GRCh38。

1.参考基因组下载

1.打开USCS官网:http://genome.ucsc.edu/
Downloads —— Genome Data —— Human —— 找到Feb. 2009 (GRCh37/hg19)那里——点击Genome sequence files and select annotations (2bit, GTF, GC-content, etc) ——找到chromFa.tar.gz —— 右键复制链接地址wget下载

dqzyRO.png

下载hg19:(YST用的)

wget http://hgdownload.cse.ucsc.edu/goldenPath/hg19/bigZips/chromFa.tar.gz  #可以新建一个文件夹叫 genome/hg19 ,然后下载在该文件夹中
tar -zxvf chromFa.tar.gz
cat *.fa > hg19.fa  #对解压后的.fa文件进行合并, 这一步将所有的染色体信息整合在一起,重定向写入hg19.fa文件,得到参考基因组
rm chr*.fa  #合并完成后删除合并前文件。

参考基因组注释下载(用于构建index)???
进入人和小鼠基因组注释信息官网GENCODE,选择data->human->GRCh37-mapped Releases,下载最新第26版本的hg19人类基因组注释信息。点击进入下载页面,将GTF和GFF3全部下载,解压。


其它的参考基因组下载方式

$ wget http://hgdownload.cse.ucsc.edu/goldenPath/mm10/bigZips/chromFa.tar.gz  #小鼠基因组,叫 genome/mm10,然后下载在该文件夹中.
$ wget http://hgdownload.cse.ucsc.edu/goldenPath/hg38/bigZips/hg38.fa.gz   #可以新建一个文件夹叫 genome/hg38 ,然后下载在该文件夹中。
$ gunzip hg38.fa.gz  # 使用gunzip进行解压。

2.建立索引

hisat索引文件下载(YST用的)
人类和小鼠的索引有现成的,HISAT2官网可以直接下载进行序列比对。HISAT2是TopHat2/Bowti2的继任者,使用改进的BWT算法,实现了更快的速度和更少的资源占用。

cd ~/reference
mkdir -p index/hisat && cd index/hisat
nohup wget ftp://ftp.ccb.jhu.edu/pub/infphilo/hisat2/data/hg19.tar.gz  &   # 我下的这个
nohup wget ftp://ftp.ccb.jhu.edu/pub/infphilo/hisat2/data/hg38.tar.gz  &
nohup wget ftp://ftp.ccb.jhu.edu/pub/infphilo/hisat2/data/grcm38.tar.gz &
nohup wget ftp://ftp.ccb.jhu.edu/pub/infphilo/hisat2/data/mm10.tar.gz &  #小鼠的index
  
tar zxvf hg19.tar.gz
tar zxvf grcm38.tar.gz
tar zxvf hg38.tar.gz

有时候没有现成的index,我们就需要自己用HISAT2重新构建索引;包括外显子、剪切位点及SNP索引的建立。
hisat2构建索引方式自己去查

bowtie软件建立索引文件

cd ~/reference
mkdir -p index/bowtie && cd index/bowtie
nohup time ~/biosoft/bowtie/bowtie2-2.2.9/bowtie2-build  ~/reference/genome/hg19/hg19.fa  ~/reference/index/bowtie/hg19 1>hg19.bowtie_index.log 2>&1 &
nohup time ~/biosoft/bowtie/bowtie2-2.2.9/bowtie2-build  ~/reference/genome/hg38/hg38.fa  ~/reference/index/bowtie/hg38 1>hg38.bowtie_index.log 2>&1 &
nohup time ~/biosoft/bowtie/bowtie2-2.2.9/bowtie2-build  ~/reference/genome/mm10/mm10.fa  ~/reference/index/bowtie/mm10 1>mm10.bowtie_index.log 2>&1 &

bwa软件建立索引文件

cd ~/reference
mkdir -p index/bwa && cd index/bwa
nohup time ~/biosoft/bwa/bwa-0.7.15/bwa index   -a bwtsw   -p ~/reference/index/bwa/hg19  ~/reference/genome/hg19/hg19.fa 1>hg19.bwa_index.log 2>&1   &
nohup time ~/biosoft/bwa/bwa-0.7.15/bwa index   -a bwtsw   -p ~/reference/index/bwa/hg38  ~/reference/genome/hg38/hg38.fa 1>hg38.bwa_index.log 2>&1   &
nohup time ~/biosoft/bwa/bwa-0.7.15/bwa index   -a bwtsw   -p ~/reference/index/bwa/mm10  ~/reference/genome/mm10/mm10.fa 1>mm10.bwa_index.log 2>&1   &

3.mapping

3.1 单个进行的mapping

对每个文件的前1000行进行mapping(这里只是为了尝试一下,为了节省时间就只比对前1000行了。)

$ ls /data1/lixianlong/YST/clean/*.gz
$ ls /data1/lixianlong/YST/clean/*.gz|while read id; do (zcat $id |head -1000); done
$ ls /data1/lixianlong/YST/clean/*.gz|while read id; do (echo $(basename $id)); done|paste - -  #与basename相对的是dirname,basename实现掐头功能,dirname实现去尾功能。
$ ls /data1/lixianlong/YST/clean/*.gz|while read id; do (zcat $id|head -1000 >  $(basename $id)); done  #将每个文件的前1000行留存下来,但是此时的名字虽然还是gz,其实并不是压缩文件了,可以直接用head和cat可以打开,这里只是没有改名字而已。文件名的后缀没有任何意义,真正起决定作用的是内容。可以新建一个文件夹运行这句代码,否则,源文件会被覆盖掉。
$ ls *|while read id; do (echo ${id%%.*});done  #这样可以将.fq.gz都去掉,但是这里只是展示去掉之后的名字是什么,并没有真正去掉。
$ ls *|while read id; do (mv $id ${id%%.*});done  #这里将所有文件都去掉名字后面的.fq.gz
$ ls *|while read id; do (mv $id $id.fq.gz);done  #这里也可以将所有文件名字都加上.fq.gz
$ ls /data1/lixianlong/YST/clean/*.gz|while read id; do (zcat $id|head -1000 >  $(basename $id ".gz")); done  #也可以这样改掉,$id和".gz"一定要有空格,没有空格就是添加东西,有空格才是删掉。

对SRR1039508_1_val_1.fq.gz和SRR1039508_2_val_2.fq.gz的前1000行进行mapping

$ fq1=/data1/lixianlong/YST/clean/try/SRR1039508_1_val_1  #SRR1039508_1_val_1.fq.gz的前1000行保存在了文件SRR1039508_1_val_1里面
$ fq2=/data1/lixianlong/YST/clean/try/SRR1039508_2_val_2  #RR1039508_2_val_2.fq.gz的前1000行保存在了文件SRR1039508_2_val_2里面
$ hisat2_hg19_index='/data1/lixianlong/YST/reference/index/hisat/hg19/genome'  #注意:hg19下面有很多文件,这里只写前缀genome!
$ hisat2 -p 10 -x $hisat2_hg19_index -1 $fq1 -2 $fq2 -S map.sam  # 使用hisat2进行mapping,-S是将结果输出,mapping得到sam文件
$ hisat2 -p 10 -x $hisat2_hg19_index -1 $fq1 -2 $fq2 > map.sam  # >和-S有同样功能。

使用hisat2比对得到的是97.40%的比对率,但是此处如果使用bwa比对率就是89.20%,比对率严重下降,因为hisat使用的是参考转录组,而bwa使用的是参考基因组,存在跨内含子的问题,导致比对率下降。事实上,对RNA-seq数据来说,不要使用bwa和bowtie这样的软件,它需要的是能进行跨越内含子比对的工具。

对SRR1039508_1_val_1.fq.gz和SRR1039508_2_val_2.fq.gz进行mapping

$ fq1=/data1/lixianlong/YST/clean/SRR1039508_1_val_1.fq.gz
$ fq2=/data1/lixianlong/YST/clean/SRR1039508_2_val_2.fq.gz
$ dir=/data1/lixianlong/YST/mapping_result
$ hisat2_hg19_index='/data1/lixianlong/YST/reference/index/hisat/hg19/genome'  #注意:hg19下面有很多文件,这里只写前缀genome!
$ hisat2 -p 10 -x $hisat2_hg19_index -1 $fq1 -2 $fq2 -S $dir/SRR1039508.sam  # 使用hisat2进行mapping,-S是将结果输出,使用>也可以,mapping得到sam文件

可以将以上代码包装进mapping.sh,然后qsub -cwd -l vf=8g,p=8 -V mapping.sh就可以了,qstat可以查询状态,qdel可以删除作业。

使用其他比对软件要用其它比对软件的index,index不是通用的。

$ ls *.sam|head  #这个head的是管道前的output
$ ls *.sam|xargs head  # 这个head的是前面输出结果的每一个变量所代表的文件,一定要掌握xargs的用法,有空搜索一下。
$ ls *.sam|xargs -i head {}   # ls *.sam|xargs head 的完整写法 

3.2 批量mapping

$ ls *gz|cut -d"_" -f1|sort -u|while read id; do
$ ls -lh ${id}_1_val_1.fq.gz ${id}_2_val_2.fq.gz 
$ hisat2 –p 10 –x /data1/lixianlong/YST/reference/index/hisat/hg19/genome -1 ${id}_1_val_1.fq.gz -2 ${id}_2_val_2.fq.gz –S ${id}_hisat.sam 
$ done

4.sam格式转bam格式

批量转换

$ ls *.sam|while read id; do (samtools sort -O bam -@ 5 -o $(basename $id ".sam").bam $id);done  #sam文件转成bam文件,文件变的更小,sort是很耗时间的。-@表示线程数量
$ top -u lixianlong  # %CPU那一列就可以看出线程数,如果是五个线程,则状态最好的时候%CPU那一列值会接近500.
$ ls *bam|xargs -i samtools index {}  #为bam文件建立索引。{}类似于$id,就是ls *bam的每一个结果会通过xargs传给后面的参数,这个参数就是{}。
#排好序并构建好索引,之后就可以使用IGV看了。

$ samtools view SRR1039508.bam |less -S # bam文件的查看使用samtools view,因为bam文件是按染色体sort过的,
$ samtools tview 08.bam  #曾健明说这个用不着,平时都用IGV,因为IGV是可视化的,所以跳转很方便。
$ /  #会出现goto,随便输入一个位置chr1:65891003看下,通过这种方式可快速到达指定位置。
$ samtools tview --reference /data1/lixianlong/YST/reference/genome/hg19/hg19.fa 08.bam   #可以看到比对的情况,输入 chr1:220142425再试下。
$ samtools flagstat 08.bam  # 也可以对bam文件进行统计,得到比对率之类的信息。samtools flagstat不能对sam进行统计,只能对bam统计。

sam格式怎样看自己去看微信公众号之类的里面的介绍。

转成bam之后将sam删除掉,因为sam太占内存,而且转成bam之后sam就没啥用了,bam本身就是sam的压缩。

曾健明说bam文件其实也可以进行qc

5.对bam文件再次fastqc

$ ls *bam|while read id; do (samtools flagstat -@ 10 $id > $(basename ${id} ".bam").flagstat ); done  #实现批量操作,-@指定线程数量。
$ multiqc ./

第五步: counts

counts的原理就是比较基因上各个坐标对应的reads的个数多少。

# 如果一个个样本单独计数,输出多个文件使用代码是:
featureCounts -T 5 -p -t exon -g gene_id -a 
# 如果一个个样本单独计数,输出多个文件使用代码是:
$ for fn in {508..523}
$ do
$ featureCounts -T 5 -p -t exon -g gene_id  -a /public/reference/gtf/gencode/gencode.v25.annotation.gtf.gz -o $fn.counts.txt SRR1039$fn.bam  
$ done
# 如果是批量样本的bam进行计数,使用代码是:
$ mkdir $wkd/align 
$ cd $wkd/align 
$ source activate rna
$ gtf="/public/reference/gtf/gencode/gencode.v25.annotation.gtf.gz"   
$ featureCounts -T 5 -p -t exon -g gene_id  -a $gtf -o  all.id.txt  *.bam  1>counts.id.log 2>&1 &  # -T线程,-p双端测序,-t exon根据外显子来count,-g gene_id 表示count之后取基因名,得到的  all.id.txt文件就是表达矩阵,这个featureCounts有很多参数可调。
$ source deactivate 

曾健明说对count也可以跑multiqc,就会生成一个报告,告诉你每个样本的比对率,比对上了多少兆reads。每一步都有qc,fastq文件有qc,bam文件也可以qc,count之后又有qc。表达矩阵拿到R里面去做差异分析也有qc,每一步都要搞清楚参数有没有用对,qc无处不在!
有了这个表达矩阵之后所有的下游分析就可以开始了。

第六步:DEG

1. 对得到的表达矩阵进行初步探索

rm(list = ls())  #清空环境变量,读表达矩阵要做的第一步。
options(stringsAsFactors = F)  #读表达矩阵要做的第二步。
a=read.table('all.id.txt',header = T)  #如果不加header = T,则表头位置是V1,V2,V3...,为了把列名放在表头的位置要加header = T。
tmp=a[1:14,1:7]
meta=a[,1:6]  #左边的6列是meta信息,meta信息就存着每一个基因的名字,坐标和长度。
exprSet=a[,7:ncol(a)]  #7列之后的是表达矩阵信息,
colnames(exprSet)
a2=exprSet[,'SRR1039516.hisat.bam']

#因为曾健明使用bowtie,bwa,hisat,subjunc这几种比对软件,他做了一下相关性分析,看一下几种比对软件结果的相关性。
library(corrplot)  #看相关性的第一种方法。
png('cor.png')  #打开一个画板
corrplot(cor(log2(exprSet+1)))  #log多少其实没有太所谓,+1的目的是为了防止0值。 #作图
dev.off()  #关闭画板。

library(pheatmap)  #看相关性的第二种方法。画heatmap的包有十多个,这里只用了这一个。
png('heatmap.png')
m=cor(log2(exprSet+1))
pheatmap(scale(cor(log2(exprSet+1))))  #进行一下归一化,这样热图差异更明显。曾健明的结果发现同一个软件的比对结果聚集在了一起,说明这些软件的差异性要比样本之间的差异性要大。
dev.off()

曾健明说:转录组上游基本上就是在讲linux命令,转录组下游就是在讲R语言。转录组和外显子组测序分析本身就不存在,只不过是利用linux和R的命令来分析数据。

2. 使用airway数据包做示范

library(airway)   #airway是个数据包,从Bioconductor上面下载,数据包就是整个包就是为了提供一个数据。
data(airway)
airway  # 我们想取airway的表达矩阵,可以先看一下airway,因为airway是一个表达矩阵。
?RangedSummarizedExperiment 
exprSet=assay(airway) #发现使用assay可以取到表达矩阵。
colnames(exprSet)

# 首先对这个表达矩阵看一下相关性
library(corrplot)  #看相关性的第一种方法。
png('cor.png')  #打开一个画板
corrplot(cor(log2(exprSet+1)))  #log多少其实没有太所谓,+1的目的是为了防止0值。 #作图
dev.off()  #关闭画板。从右下角Files里面可以看到图,发现相关性都接近于1

library(pheatmap)  #看相关性的第二种方法。画heatmap的包有十多个,这里只用了这一个。
png('heatmap.png')
m=cor(log2(exprSet+1))
pheatmap(scale(cor(log2(exprSet+1))))  #进行一下归一化,这样热图差异更明显。曾健明的结果发现同一个软件的比对结果聚集在了一起,说明这些软件的差异性要比样本之间的差异性要大。
dev.off()

#是否符合样本的实际特征呢?
tmp=colData(airway)
tmp=as.data.frame(tmp)  #dex那一列点一下可以排序,发现SRR1039509,SRR1039513,SRR1039517,SRR1039521这四个是处理,另外四个是不处理的,从上面pheatmap的结果可以看到SRR1039509,SRR1039513,SRR1039521,但是SRR1039517却没有聚在一起。

# 也可以使用hclust去查看是否符合样本的实际特征
## hclust
group_list=colData(airway)[,3]
colnames(exprSet)=paste(group_list,1:ncol(exprSet),sep='_')
# Define nodePar
nodePar <- list(lab.cex = 0.6, pch = c(NA, 19), cex = 0.7, col = "blue")
hc=hclust(dist(t(log2(exprSet+1))))
par(mar=c(5,5,5,10))
png('hclust.png',res=120)
plot(as.dendrogram(hc), nodePar = nodePar, horiz = TRUE)
dev.off()  #从图上的结果可以看到trt_6没有聚到一起,trt_6就是SRR1039517.如何确定trt_6就是SRR1039517? 通过view(tmp)就可以看到原始的排序,trt6对应的就是SRR1039517.从avgLength那一列也可以看出来,SRR1039517是87,而另外三个trt都是126

exprSet=assay(airway) #使用assay可以取到表达矩阵。
colnames(exprSet)
a1=exprSet[,'SRR1039516']
a1  # a1就是每个基因的counts数
group_list=colData(airway)[,3]

3. 使用airway数据包产生的a1和all.id.txt(我们自己做的矩阵)产生的a2进行比较。

a2=data.frame(id=meta[,1],a2=a2)  # a2是自己做出来的数据
a1=data.frame(id=names(a1),a1=as.numeric(a1))  # a1是airway数据包产生的,a1=as.numeric(a1)表示只要它的数字内容。
library(stringr)  #使用stringr包的str_split可以实现分割。
a2$id <- str_split(a2$id,'\\.',simplify = T)[,1]  # 因为a2的基因名字是有问题的,比如ENSG00000237613.2,所以要将.2去除,只留前面的名字。
# 对a2的id列进行分割,\\.表示以点为分割位置,[,1]表示分割好之后取分割好的第一列。
tmp=merge(a1,a2,by='id')  #可以根据id将a1和a2合并
png('tmp.png')
plot(tmp[,2:3])
dev.off()  #从得到的图上可以看到有一些离群点的存在。

5款流行比对工具大比拼

RNA-seq比对软件STAR的学习笔记


一定要看的文章(晚上服务器比较好用,先不看了,明天看。2020年3月27日)
从零开始完整学习全基因组测序(WGS)数据分析:第1节 DNA测序技术
从零开始完整学习全基因组测序(WGS)数据分析:第2节 FASTA和FASTQ
从零开始完整学习全基因组测序(WGS)数据分析:第3节 数据质控
从零开始完整学习全基因组测序(WGS)数据分析:第4节 构建WGS主流程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342