操作记录-2020-09-27:xiaxianyou_RNA_seq

1. 检查上传数据的完整性

操作记录如下:

#显示各数据的完整性代码
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata$ cat *.txt
ea24c0a81c3b146f52180d03fb387f54  s4301_FKDL202588235-1a_1.clean.fq.gz
44e7699dc34c62f7947e4288ea1f0f72  s4301_FKDL202588235-1a_2.clean.fq.gz
8d30a8af5b877eb4b19803059aab89b7  s43023_FKDL202588236-1a_1.clean.fq.gz
f61f25e52a497519dc864d297a42f3d7  s43023_FKDL202588236-1a_2.clean.fq.gz
1498e251add4acdae5d0055bcb50235e  s43113_FKDL202588238-1a_1.clean.fq.gz
230d90a9cef859cff974a8ca5c160e08  s43113_FKDL202588238-1a_2.clean.fq.gz
250908f71a97358188cf6d9c3c5746fa  s4312_FKDL202588237-1a_1.clean.fq.gz
15551245e7bdeee766d45508712a24df  s4312_FKDL202588237-1a_2.clean.fq.gz
0e2d887e46948f58a7bde596bbf127ec  s43159_FKDL202588239-1a_1.clean.fq.gz
caec36ee9d4cc4022014d69420c1b1a0  s43159_FKDL202588239-1a_2.clean.fq.gz
5b33fdc62ccc9d75ad41dd18145d3215  s43168_FKDL202588240-1a_1.clean.fq.gz
3d6082d763a37856e59ff91c01948349  s43168_FKDL202588240-1a_2.clean.fq.gz
#将各数据的完整代码统一写入待检查的文件中
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata$ echo "ea24c0a81c3b146f52180d03fb387f54  s4301_FKDL202588235-1a_1.clean.fq.gz
> 44e7699dc34c62f7947e4288ea1f0f72  s4301_FKDL202588235-1a_2.clean.fq.gz
> 8d30a8af5b877eb4b19803059aab89b7  s43023_FKDL202588236-1a_1.clean.fq.gz
> f61f25e52a497519dc864d297a42f3d7  s43023_FKDL202588236-1a_2.clean.fq.gz
> 1498e251add4acdae5d0055bcb50235e  s43113_FKDL202588238-1a_1.clean.fq.gz
> 230d90a9cef859cff974a8ca5c160e08  s43113_FKDL202588238-1a_2.clean.fq.gz
> 250908f71a97358188cf6d9c3c5746fa  s4312_FKDL202588237-1a_1.clean.fq.gz
> 15551245e7bdeee766d45508712a24df  s4312_FKDL202588237-1a_2.clean.fq.gz
> 0e2d887e46948f58a7bde596bbf127ec  s43159_FKDL202588239-1a_1.clean.fq.gz
> caec36ee9d4cc4022014d69420c1b1a0  s43159_FKDL202588239-1a_2.clean.fq.gz
> 5b33fdc62ccc9d75ad41dd18145d3215  s43168_FKDL202588240-1a_1.clean.fq.gz
> 3d6082d763a37856e59ff91c01948349  s43168_FKDL202588240-1a_2.clean.fq.gz" >check_md5sum.txt
#执行md5sum 命令对其完整性进行检测
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata$ md5sum -c check_md5sum.txt
s4301_FKDL202588235-1a_1.clean.fq.gz: OK
s4301_FKDL202588235-1a_2.clean.fq.gz: OK
s43023_FKDL202588236-1a_1.clean.fq.gz: OK
s43023_FKDL202588236-1a_2.clean.fq.gz: OK
s43113_FKDL202588238-1a_1.clean.fq.gz: OK
s43113_FKDL202588238-1a_2.clean.fq.gz: OK
s4312_FKDL202588237-1a_1.clean.fq.gz: OK
s4312_FKDL202588237-1a_2.clean.fq.gz: OK
s43159_FKDL202588239-1a_1.clean.fq.gz: OK
s43159_FKDL202588239-1a_2.clean.fq.gz: OK
s43168_FKDL202588240-1a_1.clean.fq.gz: OK
s43168_FKDL202588240-1a_2.clean.fq.gz: OK

2.精简文件名称

操作记录如下:

(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata$ mv s4301_FKDL202588235-1a_1.clean.fq.gz s4301_1.clean.fq.gz
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata$ mv s4301_FKDL202588235-1a_2.clean.fq.gz s4301_2.clean.fq.gz
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata$ mv s43023_FKDL202588236-1a_1.clean.fq.gz s43023_1.clean.fq.gz
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata$ mv s43023_FKDL202588236-1a_2.clean.fq.gz s43023_2.clean.fq.gz
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata$ mv s43113_FKDL202588238-1a_1.clean.fq.gz s43113_1.clean.fq.gz
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata$ mv s43113_FKDL202588238-1a_2.clean.fq.gz s43113_2.clean.fq.gz
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata$ mv s4312_FKDL202588237-1a_1.clean.fq.gz s4312_1.clean.fq.gz
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata$ mv s4312_FKDL202588237-1a_2.clean.fq.gz s4312_2.clean.fq.gz
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata$ mv s43159_FKDL202588239-1a_1.clean.fq.gz s43159_1.clean.fq.gz
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata$ mv s43159_FKDL202588239-1a_2.clean.fq.gz s43159_2.clean.fq.gz
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata$ mv s43168_FKDL202588240-1a_1.clean.fq.gz s43168_1.clean.fq.gz
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata$ mv s43168_FKDL202588240-1a_2.clean.fq.gz s43168_2.clean.fq.gz
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata$ ll
total 16G
drwxrwxr-x 2 zexing zexing  4.0K 9月  27 10:35 .
drwxrwxr-x 4 zexing zexing  4.0K 9月  27 10:12 ..
-rw-rw-r-- 1 zexing zexing   860 9月  27 10:25 check_md5sum.txt
-rw-rw-r-- 1 zexing zexing   142 9月  27 10:09 MD5_s4301_FKDL202588235-1a.txt
-rw-rw-r-- 1 zexing zexing   144 9月  27 10:03 MD5_s43023_FKDL202588236-1a.txt
-rw-rw-r-- 1 zexing zexing   144 9月  27 09:57 MD5_s43113_FKDL202588238-1a.txt
-rw-rw-r-- 1 zexing zexing   142 9月  27 09:51 MD5_s4312_FKDL202588237-1a.txt
-rw-rw-r-- 1 zexing zexing   144 9月  27 09:46 MD5_s43159_FKDL202588239-1a.txt
-rw-rw-r-- 1 zexing zexing   144 9月  27 09:39 MD5_s43168_FKDL202588240-1a.txt
-rw-rw-r-- 1 zexing zexing  1.3G 9月  27 10:09 s4301_1.clean.fq.gz
-rw-rw-r-- 1 zexing zexing  1.3G 9月  27 10:06 s4301_2.clean.fq.gz
-rw-rw-r-- 1 zexing zexing  1.5G 9月  27 10:03 s43023_1.clean.fq.gz
-rw-rw-r-- 1 zexing zexing  1.5G 9月  27 10:00 s43023_2.clean.fq.gz
-rw-rw-r-- 1 zexing zexing  1.5G 9月  27 09:57 s43113_1.clean.fq.gz
-rw-rw-r-- 1 zexing zexing  1.6G 9月  27 09:54 s43113_2.clean.fq.gz
-rw-rw-r-- 1 zexing zexing  1.2G 9月  27 09:51 s4312_1.clean.fq.gz
-rw-rw-r-- 1 zexing zexing  1.2G 9月  27 09:48 s4312_2.clean.fq.gz
-rw-rw-r-- 1 zexing zexing  1.5G 9月  27 09:46 s43159_1.clean.fq.gz
-rw-rw-r-- 1 zexing zexing  1.6G 9月  27 09:42 s43159_2.clean.fq.gz
-rw-rw-r-- 1 zexing zexing  948M 9月  27 09:39 s43168_1.clean.fq.gz
-rw-rw-r-- 1 zexing zexing 1017M 9月  27 09:37 s43168_2.clean.fq.gz

3. 使用FastQC软件对数据进行质控

操作记录如下:

#编辑脚本如下:
#上面一行宣告这个script的语法使用bash语法,当程序被执行时,能够载入bash的相关环境配置文件。
# Program:
#       This program is used for analysis of RNA-seq data by FastQC.
#History:
# 2020/09/27         zexing              First release
#fastqc命令为质控命令
#Usage: fastqc [-o output dir] [--(no)extract] [-f fastq|bam|sam] [-c contaminant file] seqfile1 .. seqfileN
#简写代码:fastqc -t 8 -o  seqfile1
#调用程序fastqc,参数-t设置线程数为8,参数-o设置结果输出的目录,参数-c可以加入污染物选项(接头信息),最后为读入文件。
fastqc -t 16 -o /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/fastqc_report/ /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/*.fq.gz

#后台运行命令如下:
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/scripts_log$ nohup bash fastqc_script &
[1] 123084

4. 使用Hisat2软件对测序结果进行比对

操作记录如下:

#编辑脚本如下:
#! /bin/bash
#上面一行宣告这个script的语法使用bash语法,当程序被执行时,能够载入bash的相关环境配置文件。
# Program:
#       This program is used for aligning of RNA-seq data.
#History:
# 2020/09/27         zexing              First release
#对变量${i}利用 for ${i} in A B C D 的方式遍历指定
for i in s4301 s4312 s43023 s43113 s43159 s43168
do
#hisat2命令为序列比对命令
#Usage: hisat2 [options]* -x  {-1  -2  | -U  | --sra-acc } [-S ]
#简写代码:hisat2 -t -p 8 -x  -1 fq.gz -2 fq.gz -S 
#调用程序hisat2,参数-t显示时间,参数-p设定线程数,参数-x指定参考基因组索引文件的前缀(目录及文件前缀)
#参数-1指定双向测序的第一条.fq.gz测序数据,如果多组数据,使用逗号将文件分隔
#参数-2指定双向测序的第二条.fq.gz测序数据,如果多组数据,使用逗号将文件分隔
#参数-S指定比对结果的输出目录及名称
hisat2 -t -p 16 -x /f/xudonglab/zexing/reference/UCSC_mm10/hisat2_index/hisat2_index_mm10 \
-1 /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/${i}_1.clean.fq.gz \
-2 /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/${i}_2.clean.fq.gz \
-S /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/sam/${i}.sam
done

#后台运行命令如下:
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/scripts_log$ nohup bash Hisat2_script &
[1] 123564

5. 使用SAMtools软件对文件进行格式转换、排序

操作记录如下:

#编辑脚本如下:
#!/bin/bash
#上面一行宣告这个script的语法使用bash语法,当程序被执行时,能够载入bash的相关环境配置文件。
# Program:
#这里写一个脚本,将samtools的view、sort、index和flagstat四个命令串联在一起,对RNA-seq数据批量处理。
#History:
# 2020/09/27         李泽兴      First release
#对变量${i}利用 for ${i} in A B C D 的方式遍历指定
#samtools view为格式转换命令
#Usage: samtools view [options]  |  |  [region...]
#-@设置线程数为8, -S输入sam文件,-1b使用快速压缩比生成bam文件,-o设定标准输出文件名。
#简写代码:samtools view -@ 8 -S {$i}.sam -1b -o {$i}.bam
#samtools sort为排序命令
#Usage: samtools sort [options..] [in.bam]
#-@设置线程数为8,-l设置压缩比为5,-o设定标准输出文件名,最后一个为输入.bam文件,该命令默认为染色体位置排序,不影响后期操作。
#简写代码:samtools sort -@ 8 -l 5 -o {$i}.bam.sort {$i}.bam
#index为建立索引命令,目前还不知道这样建立索引有何用处,暂且写下来以备后续使用。
#Usage: samtools index [-bc] [-m INT]  
#-@设置线程数为8,输入bam文件,输出index文件。
#简写代码:samtools index -@ 8 {$i}.bam.sort {$i}.bam.index
#flagstat为查看比对情况命令,目前暂且对这部分不是很熟悉,暂且写下来以备后续使用。
#Usage: samtools flagstat [options] 
#-@设置线程数为8,对于输出内容重定向写入>指定文件
#简写代码:samtools flagstat -@ 8 {$i}.bam.sort > {$i}.bam.flagstat
for i in s4301 s4312 s43023 s43113 s43159 s43168
do
samtools view -@ 16 -S /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/sam/${i}.sam \
-1b -o /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/bam/${i}.bam
samtools sort -@ 16 -l 5 -o /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/bam.sort/${i}.bam.sort \
/f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/bam/${i}.bam
samtools index -@ 16 /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/bam.sort/${i}.bam.sort \
/f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/bam.index/${i}.bam.index
samtools flagstat -@ 16 /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/bam.sort/${i}.bam.sort \
> /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/scripts_log/${i}.bam.flagstat
done

#后台运行命令如下:
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/scripts_log$ nohup bash SAMtools_script &
[1] 127169

6. 使用RSeQC软件对比对结果进行质控

操作记录如下:

#编辑脚本如下:
#!/bin/bash
#上面一行宣告这个script的语法使用bash语法,当程序被执行时,能够载入bash的相关环境配置文件。
#program:
#  This program is running RSeQC software command and saving the output results to special files.
#History:
#    2020/09/27            zexing         First release
#对变量${i}利用 for ${i} in A B C D 的方式遍历指定
#bam_stat.py命令为python一个程序,用于查看比对总体情况。
#Usage: bam_stat.py [options]
#-i参数设定输入文件,重定向写入>指定结果输出文件。
#简写代码:bam_stat.py -i ${i}.bam.sort > ${i}_bam_stat.log
#read_distribution.py命令为python一个程序,用于查看基因组覆盖率。
#Usage: read_distribution.py [options]
#-i参数设定输入文件,-r参数指定参考的bed文件,重定向写入>指定结果输出文件。
#简写代码:read_distribution.py -i ${i}.bam.sort -r RefSeq.bed > ${i}_distribution.log
for i in s4301 s4312 s43023 s43113 s43159 s43168
do
bam_stat.py -i /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/bam.sort/${i}.bam.sort \
> /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/scripts_log/${i}_bam_stat.log
read_distribution.py -i /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/bam.sort/${i}.bam.sort \
-r /f/xudonglab/zexing/reference/BED_file/mm10_RefSeq.bed \
> /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/scripts_log/${i}_distribution.log
done

#后台运行命令如下:
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/scripts_log$ nohup bash QSeQC_script &
[1] 147889

7. 使用Stringtie软件进行拼接和定量

操作记录如下:

#编辑脚本如下:
#!/bin/bash
#上面一行宣告这个script的语法使用bash语法,当程序被执行时,能够载入bash的相关环境配置文件。
#program
#     This program is to perform HTSeq-count assay for RNA-seq data.
#History
#     2020/09/27       zexing            First release
#对变量${i}利用 for ${i} in A B C D 的方式遍历指定
#创建针对不同样品的ballgown/"$i"目录,以存放输出结果
#stringtie为转录本拼接和定量的软件
#利用stringtie分别输出gene count数目和FPKM值,gene count数用户基因差异分析,FPKM值为基因表达值,用于heatmap等绘制
#Usage: stringtie  [options]
#aligned_reads.bam 是输入文件,该输入文件要求必须按基因组位置排序
#参数-o [],设置StringTie组装转录本的输出GTF文件的路径和文件名。
#参数-p 指定组装转录本的线程数(CPU)
#参数-G 使用参考注释基因文件指导组装过程,格式GTF/GFF3。输出文件中既包含已知表达的转录本,也包含新的转录本。
#参数-B 应用该选项,则会输出Ballgown输入表文件(* .ctab),其中包含用-G选项给出的参考转录本的覆盖率数据。
#参数-e 限制reads比对的处理,仅估计和输出与用-G选项给出的参考转录本匹配的组装转录本。使用该选项,则会跳过处理与参考转录本不匹配的组装转录本,这将大大的提升了处理速度。
#参数-A  输出基因丰度的文件(制表符分隔格式)
#简写代码:stringtie {$i}.bam.sort -o path/name.gtf -p 16 -G gene.gtf -eB -A path/name.tab
#此次主要输出两个文件:gtf文件用于转换gene count文件;tab文件包含FPKM数值。
for i in s4301 s4312 s43023 s43113 s43159 s43168
do
mkdir /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/ballgown/"$i"
stringtie /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/bam.sort/"$i".bam.sort \
-o /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/ballgown/"$i"/"$i".gtf \
-p 16 -G /f/xudonglab/zexing/reference/UCSC_mm10/mm10_genes.gtf -e -B \
-A /f/xudonglab/zexing/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/ballgown/"$i"/"$i".gene.tab
done

#后台运行命令如下:
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/scripts_log$ nohup bash Stringtie_script &
[2] 148677

8. 使用prepDE.py脚本提取read counts数值

注意:prepDE.py为python2的脚本,应该先将python设置为低版本后再运行脚本。

操作记录如下:

#从之前的文件夹中将prepDE.py脚本拷贝至当前文件夹中的ballgown子文件夹中
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/ballgown$ cp /f/xudonglab/zexing/projects/zhaoxiujuan/aligned/ballgown_1/prepDE.py ./

#退出当前conda环境
(base) zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned$ conda deactivate

#检查服务器中的python版本信息
zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned$ python --version
Python 2.7.12

#使用python命令直接运行脚本
zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/ballgown$ python prepDE.py

#查看运行结果
zexing@DNA:~/projects/xiaxianyou/RNA_seq/2020_09_23/cleandata/aligned/ballgown$ ll
total 2.0M
drwxrwxr-x 8 zexing zexing 4.0K 9月  28 17:02 .
drwxrwxr-x 8 zexing zexing 4.0K 9月  28 17:01 ..
-rw-rw-r-- 1 zexing zexing 860K 9月  28 17:02 gene_count_matrix.csv
-rw-rw-r-- 1 zexing zexing  12K 9月  28 16:59 prepDE.py
drwxrwxr-x 2 zexing zexing 4.0K 9月  27 15:25 s4301
drwxrwxr-x 2 zexing zexing 4.0K 9月  27 15:12 s43023
drwxrwxr-x 2 zexing zexing 4.0K 9月  27 15:14 s43113
drwxrwxr-x 2 zexing zexing 4.0K 9月  27 15:09 s4312
drwxrwxr-x 2 zexing zexing 4.0K 9月  27 15:17 s43159
drwxrwxr-x 2 zexing zexing 4.0K 9月  27 15:18 s43168
-rw-rw-r-- 1 zexing zexing 1.1M 9月  28 17:02 transcript_count_matrix9以下.csv
#其中"gene_count_matrix.csv"即是DESeq2的输入文件。

以下分析在本地机的Rstudio中完成

9.利用DESeq2包进行差异基因分析

代码如下:

#This script is used for analysis of xiaxianyou RNA-seq data
#History
# Lizexing           2020-09-28             First release
#genecount文件来源于Stringtie软件分析,后面为本地电脑操作
# DESeq2进行差异分析 ----------------------------------------------------------------

#清空环境变量
rm(list=ls())
#设置工作目录
setwd("G:/xiaxianyou/RNA-seq/2020_09_28/gene_count/")
#读入基因表达值,设定行名为gene_id
gene_count <- read.csv("gene_count_matrix.csv",stringsAsFactors = F)
#对gene_id一列进行拆分,去除重复名称
library(stringr)
#设置空的"gene_count_1"向量,行数与上面的测序结果一致
gene_count_1<-rep(NA,nrow(gene_count))
#利用for循环,对gene_count数据框中的重复列进行拆分提取
for (i in 1:nrow(gene_count)){
  gene_count_1[i] <- unlist(str_split(gene_count[i,1], pattern = "\\|"))[1]
}
#显示拆分后的结果
head(gene_count_1)
#对原数据框中的特定序列重新赋值
gene_count$gene_id <- gene_count_1
#显示文件的前6行信息
head(gene_count)
#将第一列作为文件的行名
rownames(gene_count) <- gene_count[,1]
gene_count <-gene_count[,-1]
#显示文件的前6行信息
head(gene_count)
#将各组数据分开
gene_count_group_1 <- gene_count[, 1:4]
gene_count_group_2 <- gene_count[, c(1, 2, 5, 6)]
#将该文件保存至对应目录
write.csv(gene_count_group_1, file = "G:/xiaxianyou/RNA-seq/2020_09_28/gene_count/gene_count_group_1.csv", row.names = TRUE)
write.csv(gene_count_group_2, file = "G:/xiaxianyou/RNA-seq/2020_09_28/gene_count/gene_count_group_2.csv", row.names = TRUE)

#加载DESeq2包
library(DESeq2)
#DESeq2需要三种矩阵,分别为countData表达矩阵,colData样品信息矩阵及design差异表达矩阵
#countData为表达矩阵即gene_count
#colData为样品信息矩阵即coldata
#design为差异表达矩阵即批次和条件(对照、处理)等
#设置condition样品组别、重复数
condition_group_1 <- factor(c(rep("scr", 2), rep("shA17_B", 2)), levels = c("scr","shA17_B"))
condition_group_2 <- factor(c(rep("scr", 2), rep("shA17_C", 2)), levels = c("scr","shA17_C"))
#显示condition设置信息
condition_group_1
condition_group_2
#设置group组对应的样品信息矩阵colData
colData_group_1 <- data.frame(row.names = colnames(gene_count_group_1), condition_group_1)
colData_group_2 <- data.frame(row.names = colnames(gene_count_group_2), condition_group_2)
#显示colData设置信息
colData_group_1
colData_group_2
#在R里面用于构建公式对象,~左边为因变量,右边为自变量。
#标准流程:dds <- DESeqDataSetFromMatrix(countData = cts, colData = coldata, design= ~ batch + condition) 
#countData为表达矩阵即countdata
#colData为样品信息矩阵即coldata
#design为差异表达矩阵即批次和条件(对照、处理)等
#对dds_group进行标准流程构建
dds_group_1 <- DESeqDataSetFromMatrix(gene_count_group_1, colData_group_1, design = ~condition_group_1)
dds_group_2 <- DESeqDataSetFromMatrix(gene_count_group_2, colData_group_2, design = ~condition_group_2)
#对原始dds_group进行normalize
dds_group_1 <- DESeq(dds_group_1)
dds_group_2 <- DESeq(dds_group_2)
#显示dds信息
dds_group_1
dds_group_2

# 对差异分析结果进行保存 -------------------------------------------------------------

#使用DESeq2包中的results()函数,提取差异分析的结果
#Usage:results(object, contrast, name, .....)
#将提取的差异分析结果定义为变量"res" 
#contrast: 定义谁和谁比较,处理组在前,对照组在后
#将group组提取分析结果并保存为res
res_group_1 = results(dds_group_1, contrast=c("condition_group_1","shA17_B","scr"))
res_group_2 = results(dds_group_2, contrast=c("condition_group_2","shA17_C","scr"))

#对结果res利用order()函数按pvalue值进行排序
#创建矩阵时,X[i,]指矩阵X中的第i行,X[,j]指矩阵X中的第j列
#order()函数先对数值排序,然后返回排序后各数值的索引,常用用法:V[order(V)]或者df[order(df$variable),]
#对res_group组进行排序
res_group_1 = res_group_1[order(res_group_1$pvalue),]
res_group_2 = res_group_2[order(res_group_2$pvalue),]

#显示res结果前6行信息
head(res_group_1)
head(res_group_2)

#对res_group矩阵进行总结,利用summary命令统计显示一共多少个genes上调和下调
summary(res_group_1)
summary(res_group_2)

#将差异分析的所有结果进行输出保存
write.csv(res_group_1, file="G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/all_different_genes/all_different_genes_group_1_genecount.csv")
write.csv(res_group_2, file="G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/all_different_genes/all_different_genes_group_2_genecount.csv")

#利用table函数统计显著差异基因的数目
#显著差异的定义为pvalue<0.05
table(res_group_1$pvalue<0.05)
table(res_group_2$pvalue<0.05)

#对具有显著性差异的结果进行过滤、提取
#获取pvalue小于0.05,表达倍数取以2为对数后大于0.584963或者小于-0.584963的差异表达基因(即表达倍数相差1.5倍及以上)
#使用subset()函数过滤需要的结果至新的变量significant_different_genes_group中
#Usage:subset(x, ...),其中x为objects,...为筛选参数或条件
#对group中数据进行过滤、提取
significant_pvalue_different_genes_group_1 <- subset(res_group_1, pvalue < 0.05 & abs(log2FoldChange) > 0.584963)
significant_pvalue_different_genes_group_2 <- subset(res_group_2, pvalue < 0.05 & abs(log2FoldChange) > 0.584963)

#使用dim函数查看该结果的维度、规模
dim(significant_pvalue_different_genes_group_1)
dim(significant_pvalue_different_genes_group_2)
#显示结果的前6行信息
head(significant_pvalue_different0_genes_group_1)
head(significant_pvalue_different_genes_group_2)

#对显著差异基因进行输出保存
write.csv(significant_pvalue_different_genes_group_1, file = "G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/significant_different_genes/significant_pval1ue_different_genes_group_1_genecount.csv")
write.csv(significant_pvalue_different_genes_group_2, file = "G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/significant_different_genes/significant_pvalue_different_genes_group_2_genecount.csv")

10. 利用ggpubr包绘制火山图

代码如下:

# 火山图 ---------------------------------------------------------------------

#代码参考网站:https://www.jianshu.com/p/e651a182c65d
#火山图的图形非常像火山喷发的形状。
#火山图通常用来展示差异表达的基因,常常出现在芯片、转录组、蛋白组、代谢组等组学检测技术的结果中,并且通常伴随热图一起出现。

#清空环境变量
rm(list=ls())
#获取当前工作目录
getwd()
#设置工作目录
setwd("G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/all_different_genes")
#读取数据至deg.data变量中
#此处需要读取DESeq2分析的全部差异基因,包括显著和非显著基因
#对group_1的全部差异基因进行读取
deg.data_group_1 <- read.csv("G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/all_different_genes/all_different_genes_group_1_genecount.csv", header = T, sep = ",")
#对group_2的全部差异基因进行读取
deg.data_group_2 <- read.csv("G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/all_different_genes/all_different_genes_group_2_genecount.csv", header = T, sep = ",")

#更改文件行名称为第一列
rownames(deg.data_group_1) <- deg.data_group_1$X
rownames(deg.data_group_2) <- deg.data_group_2$X

#更改文件列名称为需要的名称
colnames(deg.data_group_1)  <- c("gene_symbol",colnames(deg.data_group_1)[c(2:7)])
colnames(deg.data_group_2)  <- c("gene_symbol",colnames(deg.data_group_2)[c(2:7)])

#显示文件前6行查看文件信息
head(deg.data_group_1)
head(deg.data_group_2)

###画火山图只需要其中的log2FC和padj就可以,xiaxianyou选用pvalue值进行筛选,故此后使用pvalue进行设置
#adj.p.value为校正后的P值,因为基因和基因并不是相互独立的,所以我们需要对P值进行校正来降低结果的假阳性,常用的校正方法为FDR校正
#绘图之前需要对pvalue进行转换,可以拉开差异表达基因之间的间距
#对差异基因pvalue值进行log10转换
deg.data_group_1$logP <- -log10(deg.data_group_1$pvalue)
deg.data_group_2$logP <- -log10(deg.data_group_2$pvalue)

#开始绘制基本热图
#利用ggplot2的两个包绘制火山图
#安装ggpubr包、ggthemes包
#install.packages("ggpubr")
#install.packages("ggthemes")
#设置工作目录
setwd("G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/火山图")

#加载ggpubr包
library(ggpubr)
library(ggthemes)
#x轴为实验组基因表达量比对照组基因表达量的倍数差异
#y轴则为实验组比对照组之后的pvalue值
#火山图上一个点代表一个基因,而颜色则代表他们是显著上调还是显著下调
ggscatter(deg.data_group_1, x="log2FoldChange", y="logP") + theme_base()
ggscatter(deg.data_group_2, x="log2FoldChange", y="logP") + theme_base()

#上述命令出来的图很丑,需要对log2FoldChange和pvalue数据进行过滤
#新加一列Group
deg.data_group_1$Group = "not-significant"
deg.data_group_2$Group = "not-significant"

#将pvalue<0.05且log2FC>=0.584963的基因设为显著上调基因
deg.data_group_1$Group[which((deg.data_group_1$pvalue<0.05) & (deg.data_group_1$log2FoldChange >=0.584963))] ="up-regulated"
deg.data_group_2$Group[which((deg.data_group_2$pvalue<0.05) & (deg.data_group_2$log2FoldChange >=0.584963))] ="up-regulated"

#将pvalue<0.05且log2FC=<-1的基因设为显著下调基因
deg.data_group_1$Group[which((deg.data_group_1$pvalue<0.05) & (deg.data_group_1$log2FoldChange <= -0.584963))] ="down-regulated"
deg.data_group_2$Group[which((deg.data_group_2$pvalue<0.05) & (deg.data_group_2$log2FoldChange <= -0.584963))] ="down-regulated"

#查看上调和下调基因数目
table(deg.data_group_1$Group)
table(deg.data_group_2$Group)

#使用添加了上调和下调基因的数据重新绘制火山图
#使用color参数指定点的颜色
ggscatter(deg.data_group_1, x = "log2FoldChange", y = "logP", 
          color = "Group") + theme_base()

ggscatter(deg.data_group_2, x = "log2FoldChange", y = "logP", 
          color = "Group") + theme_base()

#修改点的大小size和更改差异表达基因的颜色palette
ggscatter(deg.data_group_1, x = "log2FoldChange", y = "logP", 
          color = "Group",
          palette = c("green", "gray", "red"),
          size = 1) + theme_base()

ggscatter(deg.data_group_2, x = "log2FoldChange", y = "logP", 
          color = "Group",
          palette = c("green", "gray", "red"),
          size = 1) + theme_base()

#使用geom_hline和geom_vline分别添加横向和纵向的辅助线
#为火山图添加logP分界线(geom_hline)和logFC分界线(geom_vline)
ggscatter(deg.data_group_1, x = "log2FoldChange", y = "logP", 
          color = "Group",
          palette = c("green", "gray", "red"),
          size = 1) + theme_base() +
  geom_hline(yintercept = 1.30, linetype="dashed") +
  geom_vline(xintercept = c(-0.584963,0.584963), linetype="dashed")

ggscatter(deg.data_group_2, x = "log2FoldChange", y = "logP", 
          color = "Group",
          palette = c("green", "gray", "red"),
          size = 1) + theme_base() +
  geom_hline(yintercept = 1.30, linetype="dashed") +
  geom_vline(xintercept = c(-0.584963,0.584963), linetype="dashed")

#为数据增加新的一列Label,将上调和下调差异表达前十的基因绘制在火山图中
#新加一列Label
deg.data_group_1$Label = ""
deg.data_group_2$Label = ""

#对差异表达基因的pvalue值进行从小到大排序
deg.data_group_1 <- deg.data_group_1[order(deg.data_group_1$pvalue),]
deg.data_group_2 <- deg.data_group_2[order(deg.data_group_2$pvalue),]

#高表达的基因中,选择pvalue最小的10个
up.genes_group_1 <- head(deg.data_group_1$gene_symbol[which(deg.data_group_1$Group == "up-regulated")], 10)
up.genes_group_2 <- head(deg.data_group_2$gene_symbol[which(deg.data_group_2$Group == "up-regulated")], 10)

#低表达的基因中,选择pvalue最小的10个
down.genes_group_1 <- head(deg.data_group_1$gene_symbol[which(deg.data_group_1$Group == "down-regulated")], 10)
down.genes_group_2 <- head(deg.data_group_2$gene_symbol[which(deg.data_group_2$Group == "down-regulated")], 10)

#将up.genes和down.genes合并
deg.top10.genes_group_1 <- c(as.character(up.genes_group_1), as.character(down.genes_group_1))
deg.top10.genes_group_2 <- c(as.character(up.genes_group_2), as.character(down.genes_group_2))

#将top10.gens加入到Label中
deg.data_group_1$Label[match(deg.top10.genes_group_1, deg.data_group_1$gene_symbol)] <- deg.top10.genes_group_1
deg.data_group_2$Label[match(deg.top10.genes_group_2, deg.data_group_2$gene_symbol)] <- deg.top10.genes_group_2

#参数说明:https://www.jianshu.com/p/674f90e020fa
#改变火山图点的颜色和坐标轴标注,使图片更美观
#绘制group1的最终火山图
#对输出的图保存至相应目录
pdf("Group_1_火山图.pdf")
ggscatter(deg.data_group_1, x = "log2FoldChange", y = "logP", 
          color = "Group",
          palette = c("#2f5688", "#BBBBBB", "#CC0000"),
          size = 1,
          label =deg.data_group_1$Label,
          font.label = 8,
          repel =T,
          xlim = c(-15, 15),  # x坐标轴的范围
          xlab = "log2FoldChange",
          ylab = "-log10(P-value)",) + theme_base() +
  geom_hline(yintercept = 1.30, linetype="dashed") +
  geom_vline(xintercept = c(-0.584963,0.584963), linetype="dashed")
dev.off()

#绘制group2的最终火山图
#对输出的图保存至相应目录
pdf("Group_2_火山图.pdf")
ggscatter(deg.data_group_2, x = "log2FoldChange", y = "logP", 
          color = "Group",
          palette = c("#2f5688", "#BBBBBB", "#CC0000"),
          size = 1,
          label =deg.data_group_2$Label,
          font.label = 8,
          repel =T,
          xlim = c(-10, 10),  # x坐标轴的范围
          xlab = "log2FoldChange", 
          ylab = "-log10(P-value)",) + theme_base() +
  geom_hline(yintercept = 1.30, linetype="dashed") +
  geom_vline(xintercept = c(-0.584963,0.584963), linetype="dashed")
dev.off()

11.利用 pheatmap包绘制heatmap图

代码如下:

# heatmap ----------------------------------------------------------------------

#heatmap绘制时,需要使用gene_symbol和FPKM值

#关于FPKM值的说明
#在绘制heatmap热图时,需要使用差异基因所对应的FPKM值,该值的获取有几个办法:
#利用Stringtie的-A参数直接获得
#利用DESeq2的-FPKM参数由count转化获得
#利用ballgown包进行转化获得
#本次采用StringTie的-A参数直接获得

#关于gene_symbol的说明
#对于绘制heatmap图的gene,使用具有差异性的基因进行绘图
#利用之前DESeq2分析得到的abs(log2FoldChange)>=1的基因来做图
#需要根据"significant_different_genes"来从包含FPKM值的文件中将其提取出来,使用到了match()函数

#绘图前的准备工作

#对FPKM数据进行整理
#清空环境变量
rm(list=ls())
#获取当前工作目录
getwd()
#设置工作目录
setwd("G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/")

##将StringTie分析得到的含有FPKM数据的TAB文件导入当前工作环境中
s4301.gene.tab <- read.table("G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s4301.gene.tab", header = TRUE, sep = "\t" , quote = "\"")
s4312.gene.tab <- read.table("G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s4312.gene.tab", header = TRUE, sep = "\t" , quote = "\"")
s43023.gene.tab <- read.table("G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s43023.gene.tab", header = TRUE, sep = "\t" , quote = "\"")
s43113.gene.tab <- read.table("G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s43113.gene.tab", header = TRUE, sep = "\t" , quote = "\"")
s43159.gene.tab <- read.table("G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s43159.gene.tab", header = TRUE, sep = "\t" , quote = "\"")
s43168.gene.tab <- read.table("G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s43168.gene.tab", header = TRUE, sep = "\t" , quote = "\"")

##提取指定列的内容
###对数据中的Gene.ID和FPKM两列数据进行提取
s4301.FPKM <- s4301.gene.tab[,c(1,8)]
s4312.FPKM <- s4312.gene.tab[,c(1,8)]
s43023.FPKM <- s43023.gene.tab[,c(1,8)]
s43113.FPKM <- s43113.gene.tab[,c(1,8)]
s43159.FPKM <- s43159.gene.tab[,c(1,8)]
s43168.FPKM <- s43168.gene.tab[,c(1,8)]

###重命名指定列
###重命名全部的列是name(data) <- c("NO","name")
###重命名单个列是colnames(data)[2] <- 'newname'
colnames(s4301.FPKM)[2] <-"scr-1"
colnames(s4312.FPKM)[2] <-"shA17-B-1"
colnames(s43023.FPKM)[2] <-"scr-2"
colnames(s43113.FPKM)[2] <-"shA17-B-2"
colnames(s43159.FPKM)[2] <-"shA17-C-1"
colnames(s43168.FPKM)[2] <-"shA17-C-2"

###显示新的数据信息
head(s4301.FPKM)
head(s4312.FPKM)
head(s43023.FPKM)
head(s43113.FPKM)
head(s43159.FPKM)
head(s43168.FPKM)

##将得到的各样本的FPKM值数据保存入heatmap目录
write.table(s4301.FPKM, file = "G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s4301.FPKM", row.names = FALSE, quote = FALSE, sep = "\t")
write.table(s4312.FPKM, file = "G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s4312.FPKM", row.names = FALSE, quote = FALSE, sep = "\t")
write.table(s43023.FPKM, file = "G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s43023.FPKM", row.names = FALSE, quote = FALSE, sep = "\t")
write.table(s43113.FPKM, file = "G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s43113.FPKM", row.names = FALSE, quote = FALSE, sep = "\t")
write.table(s43159.FPKM, file = "G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s43159.FPKM", row.names = FALSE, quote = FALSE, sep = "\t")
write.table(s43168.FPKM, file = "G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s43168.FPKM", row.names = FALSE, quote = FALSE, sep = "\t")

#对差异基因list进行整理
##设置工作目录
setwd("G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/significant_different_genes")
##将各实验组的差异基因导入当前工作环境
group_1 <- read.csv("significant_pvalue_different_genes_group_1_genecount.csv")
group_2 <- read.csv("significant_pvalue_different_genes_group_2_genecount.csv")

##将各实验组的差异基因list进行提取
group_1_gene <- group_1[,1]
group_2_gene <- group_2[,1]

##查看各差异基因名信息
View(group_1_gene)
View(group_2_gene)

#利用match函数对差异基因List信息(小文件)和FPKM值信息(大文件)进行提取
##利用match函数提取各样品中差异基因所在的行数并重新命名为row.NO文件
##match(x,y)函数输出结果:x向量在y向量中所处的位置,x向量元素不存在y向量中的返回NA
##match(x, table$i)函数输出结果:返回x向量在table中$i列中所处的位置
##对group1各样品进行处理
s4301_group_1_row.NO <- c(match(group_1_gene, s4301.FPKM$Gene.ID))
s43023_group_1_row.NO <- c(match(group_1_gene, s43023.FPKM$Gene.ID))
s4312_group_1_row.NO <- c(match(group_1_gene, s4312.FPKM$Gene.ID))
s43113_group_1_row.NO <- c(match(group_1_gene, s43113.FPKM$Gene.ID))

##对group2各样品进行处理
s4301_group_2_row.NO <- c(match(group_2_gene, s4301.FPKM$Gene.ID))
s43023_group_2_row.NO <- c(match(group_2_gene, s43023.FPKM$Gene.ID))
s43159_group_2_row.NO <- c(match(group_2_gene, s43159.FPKM$Gene.ID))
s43168_group_2_row.NO <- c(match(group_2_gene, s43168.FPKM$Gene.ID))

#根据以上行数,对各样品的FPKM值进行提取
##对group1各样品的FPKM值进行提取
s4301_group_1_gene_FPKM <- s4301.FPKM[s4301_group_1_row.NO ,]
s43023_group_1_gene_FPKM <- s43023.FPKM[s43023_group_1_row.NO ,]
s4312_group_1_gene_FPKM <- s4312.FPKM[s4312_group_1_row.NO ,]
s43113_group_1_gene_FPKM <- s43113.FPKM[s43113_group_1_row.NO ,]
###查看提取结果,确认各样品行数和基因名一致性
View(s4301_group_1_gene_FPKM)
View(s43023_group_1_gene_FPKM)
View(s4312_group_1_gene_FPKM)
View(s43113_group_1_gene_FPKM)

##对group2各样品的FPKM值进行提取
s4301_group_2_gene_FPKM <- s4301.FPKM[s4301_group_2_row.NO ,]
s43023_group_2_gene_FPKM <- s43023.FPKM[s43023_group_2_row.NO ,]
s43159_group_2_gene_FPKM <- s43159.FPKM[s43159_group_2_row.NO ,]
s43168_group_2_gene_FPKM <- s43168.FPKM[s43168_group_2_row.NO ,]
###查看提取结果,确认各样品行数和基因名一致性
View(s4301_group_2_gene_FPKM)
View(s43023_group_2_gene_FPKM)
View(s43159_group_2_gene_FPKM)
View(s43168_group_2_gene_FPKM)

#利用merge函数对各组实验的FPKM值进行合并
##merge(x,y, by="")
##对group1各样品的FPKM值进行合并
group_1_gene_FPKM <- merge(merge(s4301_group_1_gene_FPKM, s43023_group_1_gene_FPKM, by="Gene.ID"), merge(s4312_group_1_gene_FPKM, s43113_group_1_gene_FPKM,by="Gene.ID"), by="Gene.ID")

##对group2各样品的FPKM值进行合并
group_2_gene_FPKM <- merge(merge(s4301_group_2_gene_FPKM, s43023_group_2_gene_FPKM, by="Gene.ID"), merge(s43159_group_2_gene_FPKM, s43168_group_2_gene_FPKM, by="Gene.ID"), by="Gene.ID")

##查看合并结果,确认
View(group_1_gene_FPKM)
View(group_2_gene_FPKM)

#将各实验组差异基因对应的FPKM数据保存至heatmap文件中
write.table(group_1_gene_FPKM, file = "G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/heatmap/group_1_gene_FPKM", row.names = FALSE)
write.table(group_2_gene_FPKM, file = "G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/heatmap/group_2_gene_FPKM", row.names = FALSE)

#开始绘制heatmap图啦啦啦啦啦啦啦啦啦
#代码参考网站:https://www.jianshu.com/p/d86e4afe1065

#安装包(作者说这种方式下载的pheatmap包版本更新一些)
#install.packages('devtools')
#library(devtools)
#install_github("raivokolde/pheatmap")

#清空环境变量
rm(list=ls())
#获取当前工作目录
getwd()
#设置工作目录
setwd("G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/heatmap/")

#加载包
library(RColorBrewer)#设置颜色用的
library(pheatmap)
#设置配色方案
cc = colorRampPalette(rev(brewer.pal(n=7, name="RdYlBu"))) #Rd=red Yl=yellow Bu=blue
#读入文件,如果确实过多,会无法聚类,最好保证没有缺失,或将缺失替换为0
Group_1<-read.table(file = "group_1_gene_FPKM",row.names = 1,header = T,check.names = F) 
Group_2<-read.table(file = "group_2_gene_FPKM",row.names = 1,header = T,check.names = F)

#如果矩阵内容是fpkm表达量,一般取log10(fpkm+1)绘图
Group_1=log2(Group_1+1)
Group_2=log2(Group_2+1)

#pheatmap参数解释:
#第一个参数是需要用pheatmap画图的数据
#color: 设置颜色。如果想画得更精细一些,可以取cc(1000)
#main: 标题,会显示在最上面
#fontsize: row的字体大小
#scale: 是否归一化为正态分布,可选row,column,none。一般对row进行归一化的情况比较多,column较少。
#border_color: 是否显示边框及边框的颜色,NA不显示, red显示红色。支持简单的颜色单词
#na_col: 设置缺失值的颜色,支持简单颜色单词,一般设置为灰色就满好识别的。
#cluster_rows & cluster_cols: 设置是否对行进行聚类,这个就见仁见智,看你的实际需求了。当缺失值较多的时候是无法进行聚类的。一个解决办法是读取数据的时候不设置缺失值。
#show_rownames & show_colnames: 是否显示行/列的名称
#treeheight_row & treeheight_col: 当前面设置了聚类之后,两边会出现聚类的树,这个参数是设置树的高度的。
#cellheight & cellwidth: 设置每个各自的宽度和高度。有的时候不设置这两个值画出来的树容易放飞自我????
#cutree_row & cutree_col: 是否根据聚类情况把树切开,可以设置切开的份数。
#display_numbers: 设置是否显示每个单元格的值。这个也是个人喜好及文章需求。
#legend: 设置是否显示旁边的bar状图例,emmmm好像还没碰到说不要那个玩意儿的情况。。
#filename: 设置输出文件的名字。可以设置的文件类型有:pdf,png,jpg,tiff,bmp

#绘图group_1
heatmap=pheatmap(Group_1,color = cc(1000),
                 main=" ",
                 fontsize = 15,
                 scale="row",
                 border_color = NA,
                 na_col = "grey",
                 cluster_rows = T,cluster_cols = T,
                 show_rownames = T,show_colnames = T,
                 treeheight_row = 30,treeheight_col = 30,
                 cellheight = 15,cellwidth = 30,
                 cutree_row=2,cutree_col=2,
                 display_numbers = F,legend = T,
                 filename = "Group_1.tiff")

#绘图group_2
heatmap=pheatmap(Group_2,color = cc(1000),
                 main=" ",
                 fontsize = 15,
                 scale="row",
                 border_color = NA,
                 na_col = "grey",
                 cluster_rows = T,cluster_cols = T,
                 show_rownames = T,show_colnames = T,
                 treeheight_row = 30,treeheight_col = 30,
                 cellheight = 15,cellwidth = 30,
                 cutree_row=2,cutree_col=2,
                 display_numbers = F,legend = T,
                 filename = "Group_2.tiff")

12. 利用 clusterProfiler包进行GO_KEGG分析

代码如下:

# GO_KEGG -----------------------------------------------------------------

#参考文章:https://www.jianshu.com/p/435d863e0238,

#清空环境变量
rm(list=ls())

#安装包
#BiocManager::install("clusterProfiler")
#BiocManager::install("stringr")
#加载包
library(clusterProfiler)
library(stringr)
library(DOSE)
library(ggplot2)

#clusterProfiler 包里的一些默认作图方法,例如
#barplot(kegg)  #富集柱形图
#dotplot(kegg)  #富集气泡图
#cnetplot(kegg) #网络图展示富集功能和基因的包含关系
#emapplot(kegg) #网络图展示各富集功能之间共有基因关系
#heatplot(kegg) #热图展示富集功能和基因的包含关系
#Barplot画图参数详解:http://blog.sciencenet.cn/blog-1468811-939797.html

#参考物种的基因注释数据库:人类org.Hs.eg.db,果蝇org.Dm.eg.db,拟南芥org.At.tair.db,小鼠org.Mm.eg.db。
#下载参考小鼠的基因注释库
#BiocManager::install("org.Mm.eg.db")
#加载小鼠的基因注释库
library(org.Mm.eg.db)

#准备输入数据
##待分析的数据就是一串基因名称,可以是ensembl_id、entrze_id或者symbol_id等类型
##读入差异基因的列表(此处根据xiaxianyou的实验结果,选取significant_gene[pvalue<0.05,abs(log2FC)>=1]进行作图分析
##对于上调、下调基因,需要手动分割成两个单独文件

#设置工作目录
setwd("G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/significant_different_genes/")

#对group_1样品进行读入
sig.gene_up_group_1 <- read.csv("G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/significant_different_genes/significant_pvalue_different_genes_group_1_genecount_up.csv")
sig.gene_dn_group_1 <- read.csv("G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/significant_different_genes/significant_pvalue_different_genes_group_1_genecount_down.csv")

#对group_2样品进行读入
sig.gene_up_group_2 <- read.csv("G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/significant_different_genes/significant_pvalue_different_genes_group_2_genecount_up.csv")
sig.gene_dn_group_2 <- read.csv("G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/significant_different_genes/significant_pvalue_different_genes_group_2_genecount_down.csv")

##提取差异基因的列表
gene_up_group_1 <- sig.gene_up_group_1$X
gene_dn_group_1 <- sig.gene_dn_group_1$X

gene_up_group_2 <- sig.gene_up_group_2$X
gene_dn_group_2 <- sig.gene_dn_group_2$X

##调整数据格式为字符
gene_up_group_1 <- as.character(gene_up_group_1)
gene_dn_group_1 <- as.character(gene_dn_group_1)

gene_up_group_2 <- as.character(gene_up_group_2)
gene_dn_group_2 <- as.character(gene_dn_group_2)

##对基因由SYMBOL转换为ENTREZID格式
##select(x, keys, columns, keytype, ...):基于keys, columns和keytype以data.frame数据类型返回数据,可以是一对多的关系
##mapIds(x, keys, column, keytype, ..., multiVals): 类似于select,只不过就返回一个列。
gene_up_group_1.df <- select(org.Mm.eg.db,           #小鼠基因注释库
                            keys = gene_up_group_1,  #样品组信息
                            columns = "ENTREZID",    #指定基因名称类型
                            keytype ="SYMBOL")       #输入的基因名称类型

gene_dn_group_1.df <- select(org.Mm.eg.db,           #小鼠基因注释库
                            keys=gene_dn_group_1,    #样品组信息
                            columns = "ENTREZID",    #指定基因名称类型
                            keytype="SYMBOL")        #输入的基因名称类型

gene_up_group_2.df <- select(org.Mm.eg.db,           #小鼠基因注释库
                            keys=gene_up_group_2,    #样品组信息
                            columns = "ENTREZID",    #指定基因名称类型
                            keytype="SYMBOL")        #输入的基因名称类型

gene_dn_group_2.df <- select(org.Mm.eg.db,           #小鼠基因注释库
                            keys=gene_dn_group_2,    #样品组信息
                            columns = "ENTREZID",    #指定基因名称类型
                            keytype="SYMBOL")        #输入的基因名称类型

#GO富集分析
GO_BP_group_1_up <- enrichGO(gene= gene_up_group_1.df$ENTREZID, #基因列表文件中的基因名称
                            OrgDb = org.Mm.eg.db,               #指定物种的基因数据库,此为小鼠
                            keyType = "ENTREZID",               #指定给定的基因名称类型,此为symbol_id
                            ont = "BP",                         #可选BP、MF、CC,也可以指定 ALL 同时计算 3 者
                            pAdjustMethod = "BH",               #指定p值校正方法
                            pvalueCutoff = 0.05,                #指定p值阈值,不显著的值将不显示在结果中
                            qvalueCutoff = 0.2,                 #指定q值阈值,不显著的值将不显示在结果中
                            readable = TRUE)                    #whether mapping gene ID to gene Name
# minGSSize                         minimal size of genes annotated by Ontology term for testing.
# maxGSSize                         maximal size of genes annotated for testing
# pool                              If ont=’ALL’, whether pool 3 GO sub-ontologies

GO_BP_group_1_dn <- enrichGO(gene= gene_dn_group_1.df$ENTREZID, #基因列表文件中的基因名称
                            OrgDb = org.Mm.eg.db,               #指定物种的基因数据库,此为小鼠
                            keyType = "ENTREZID",               #指定给定的基因名称类型,此为symbol_id
                            ont = "BP",                         #可选BP、MF、CC,也可以指定 ALL 同时计算 3 者
                            pAdjustMethod = "BH",               #指定p值校正方法
                            pvalueCutoff = 0.05,                #指定p值阈值,不显著的值将不显示在结果中
                            qvalueCutoff = 0.2,                 #指定q值阈值,不显著的值将不显示在结果中
                            readable = TRUE)                    #whether mapping gene ID to gene Name 
# minGSSize                         minimal size of genes annotated by Ontology term for testing.
# maxGSSize                         maximal size of genes annotated for testing
# pool                              If ont=’ALL’, whether pool 3 GO sub-ontologies

GO_BP_group_2_up <- enrichGO(gene= gene_up_group_2.df$ENTREZID, #基因列表文件中的基因名称
                            OrgDb = org.Mm.eg.db,               #指定物种的基因数据库,此为小鼠
                            keyType = "ENTREZID",               #指定给定的基因名称类型,此为symbol_id
                            ont = "BP",                         #可选BP、MF、CC,也可以指定 ALL 同时计算 3 者
                            pAdjustMethod = "BH",               #指定p值校正方法
                            pvalueCutoff = 0.05,                #指定p值阈值,不显著的值将不显示在结果中
                            qvalueCutoff = 0.2,                 #指定q值阈值,不显著的值将不显示在结果中
                            readable = TRUE)                    #whether mapping gene ID to gene Name
# minGSSize                         minimal size of genes annotated by Ontology term for testing.
# maxGSSize                         maximal size of genes annotated for testing
# pool                              If ont=’ALL’, whether pool 3 GO sub-ontologies

GO_BP_group_2_dn <- enrichGO(gene= gene_dn_group_2.df$ENTREZID, #基因列表文件中的基因名称
                            OrgDb = org.Mm.eg.db,               #指定物种的基因数据库,此为小鼠
                            keyType = "ENTREZID",               #指定给定的基因名称类型,此为symbol_id
                            ont = "BP",                         #可选BP、MF、CC,也可以指定 ALL 同时计算 3 者
                            pAdjustMethod = "BH",               #指定p值校正方法
                            pvalueCutoff = 0.05,                #指定p值阈值,不显著的值将不显示在结果中
                            qvalueCutoff = 0.2,                 #指定q值阈值,不显著的值将不显示在结果中
                            readable = TRUE)                    #whether mapping gene ID to gene Name
# minGSSize                         minimal size of genes annotated by Ontology term for testing.
# maxGSSize                         maximal size of genes annotated for testing
# pool                             If ont=’ALL’, whether pool 3 GO sub-ontologies


#对GO富集分析的结果进行输出保存
#设置工作目录
setwd("G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/GO_KEGG/")

write.csv(as.data.frame(GO_BP_group_1_up), "GO_BP_group_1_up.csv")
write.csv(as.data.frame(GO_BP_group_1_dn), "GO_BP_group_1_dn.csv")
write.csv(as.data.frame(GO_BP_group_2_up), "GO_BP_group_2_up.csv")
write.csv(as.data.frame(GO_BP_group_2_dn), "GO_BP_group_2_dn.csv")

#对GO富集分析进行绘图并输出保存
tiff("GO_BP_group_1_up.tiff")
barplot(GO_BP_group_1_up, showCategory = 16,title="The GO_BP enrichment analysis of all DEGs ") + 
  scale_size(range=c(2, 12))+
  scale_x_discrete(labels=function(GO_BP_group_1_up) str_wrap(GO_BP_group_1_up, width = 30))
dev.off()

tiff("GO_BP_group_1_dn.tiff")
barplot(GO_BP_group_1_dn, showCategory = 16,title="The GO_BP enrichment analysis of all DEGs ") + 
  scale_size(range=c(2, 12))+
  scale_x_discrete(labels=function(GO_BP_group_1_dn) str_wrap(GO_BP_group_1_dn, width = 30))
dev.off()

tiff("GO_BP_group_2_up.tiff")
barplot(GO_BP_group_2_up, showCategory = 16,title="The GO_BP enrichment analysis of all DEGs ") + 
  scale_size(range=c(2, 12))+
  scale_x_discrete(labels=function(GO_BP_group_2_up) str_wrap(GO_BP_group_2_up, width = 30))
dev.off()

tiff("GO_BP_group_2_dn.tiff")
barplot(GO_BP_group_2_dn, showCategory = 16,title="The GO_BP enrichment analysis of all DEGs ") + 
  scale_size(range=c(2, 12))+
  scale_x_discrete(labels=function(GO_BP_group_2_dn) str_wrap(GO_BP_group_2_dn, width = 30))
dev.off()


#KEGG富集分析
#clusterProfiler的KEGG富集分析方法特殊,它无需加载本地注释库,
#自动使用KEGG的在线数据库进行注释,因此给定的基因名称只能识别entrze id。
#每次打开R计算时,它会自动连接kegg官网获得最近的物种注释信息,因此数据库一定都是最新的

KEGG_group_1_up <- enrichKEGG( gene = gene_up_group_1.df$ENTREZID,   #基因列表文件中的基因名称
                              keyType = 'kegg',                      #kegg 富集
                              organism = 'mmu',                      #物种,mmu 代表小鼠,hsa代表人类,oas代表绵羊
                              pAdjustMethod = 'BH',                  #指定 p 值校正方法
                              pvalueCutoff = 0.05,                   #指定 p 值阈值,不显著的值将不显示在结果中
                              qvalueCutoff = 0.2,                    #指定 q 值阈值,不显著的值将不显示在结果中
                              use_internal_data= FALSE )

KEGG_group_1_dn <- enrichKEGG( gene = gene_dn_group_1.df$ENTREZID,   #基因列表文件中的基因名称
                              keyType = 'kegg',                      #kegg 富集
                              organism = 'mmu',                      #物种,mmu 代表小鼠,hsa代表人类,oas代表绵羊
                              pAdjustMethod = 'BH',                  #指定 p 值校正方法
                              pvalueCutoff = 0.05,                   #指定 p 值阈值,不显著的值将不显示在结果中
                              qvalueCutoff = 0.2,                    #指定 q 值阈值,不显著的值将不显示在结果中
                              use_internal_data= FALSE )

KEGG_group_2_up <- enrichKEGG( gene = gene_up_group_2.df$ENTREZID,   #基因列表文件中的基因名称
                              keyType = 'kegg',                      #kegg 富集
                              organism = 'mmu',                      #物种,mmu 代表小鼠,hsa代表人类,oas代表绵羊
                              pAdjustMethod = 'BH',                  #指定 p 值校正方法
                              pvalueCutoff = 0.05,                   #指定 p 值阈值,不显著的值将不显示在结果中
                              qvalueCutoff = 0.2,                    #指定 q 值阈值,不显著的值将不显示在结果中
                              use_internal_data= FALSE )

KEGG_group_2_dn <- enrichKEGG( gene = gene_dn_group_2.df$ENTREZID,   #基因列表文件中的基因名称
                              keyType = 'kegg',                      #kegg 富集
                              organism = 'mmu',                      #物种,mmu 代表小鼠,hsa代表人类,oas代表绵羊
                              pAdjustMethod = 'BH',                  #指定 p 值校正方法
                              pvalueCutoff = 0.05,                   #指定 p 值阈值,不显著的值将不显示在结果中
                              qvalueCutoff = 0.2,                    #指定 q 值阈值,不显著的值将不显示在结果中
                              use_internal_data= FALSE )

#KEGG分析结果各列内容:
#ID和Description,富集到的KEGG id和描述;
#GeneRatio和BgRatio,分别为富集到该KEGG条目中的基因数目/给定基因的总数目,以及该条目中背景基因总数目/该物种所有已知的KEGG功能基因数目;
#pvalue、p.adjust和qvalue,p值、校正后p值和q值信息;
#geneID和Count,富集到该KEGG条目中的基因名称(分析中使用的entrze id,故这里也显示的entrze id)和数目。
#如期望显示其它类型的基因id,如通俗的symbol id等类型,由于该分析中只能输入entrze id,因此可以通过基因名称转换的方式对entrze id和symbol id作个匹配转换。

#输出结果
write.table(KEGG_group_1_up, 'KEGG_group_1_up.csv', sep = ',', quote = FALSE, row.names = FALSE)
write.table(KEGG_group_1_dn, 'KEGG_group_1_dn.csv', sep = ',', quote = FALSE, row.names = FALSE)
write.table(KEGG_group_2_up, 'KEGG_group_2_up.csv', sep = ',', quote = FALSE, row.names = FALSE)
write.table(KEGG_group_2_dn, 'KEGG_group_2_dn.csv', sep = ',', quote = FALSE, row.names = FALSE)

#将输出结果的"ENTREZID"转为"SYMBOL"
#读取数据

#对group_1_up的gene进行名称类型转换
KEGG_group_1_up_df <- read.csv("KEGG_group_1_up.csv") 
#查看文件的整体信息以确认需要转换的列
KEGG_group_1_up_df
#with({})函数中的花括号语句,只针对括号内的语句执行,无需担心名字的冲突
#with()函数局限性在于赋值仅在此函数的括号内生效
with(KEGG_group_1_up_df, {
  gene = NA    #对变量gene进行一个定义
  for (i in 1:nrow(KEGG_group_1_up_df))        #for(i in seq)语句做循环,#nrow()对数据取行数
  {
    aaa = unlist(str_split(KEGG_group_1_up_df$geneID[i],"/"))  #str_split函数对字符串进行拆分,unlist函数将拆分的数据合并
    gene = c(gene, aaa)      #将所有的拆分结果合并在一起
  }
  KEGG_gene_group_1_up <<- gene[-1]        #对最开始的gene赋值进行剔除
})
#查看最终提取结果
KEGG_gene_group_1_up
#对提取的"ENTREZID"利用select()函数进行转换
#使用birt()函数也可以对ID和symbol进行转换,但是对于重复ID不再进行重复输出
KEGG_gene_group_1_up <- select(org.Mm.eg.db,              #小鼠基因注释库
                              keys=KEGG_gene_group_1_up,  #样品组信息
                              columns = "SYMBOL",         #指定基因名称类型
                              keytype="ENTREZID")         #输入的基因名称类型
#查看最终转换结果
KEGG_gene_group_1_up


#对group_1_dn的gene进行名称类型转换
KEGG_group_1_dn_df <- read.csv("KEGG_group_1_dn.csv") 
#查看文件的整体信息以确认需要转换的列
KEGG_group_1_dn_df
#with({})函数中的花括号语句,只针对括号内的语句执行,无需担心名字的冲突
#with()函数局限性在于赋值仅在此函数的括号内生效
with(KEGG_group_1_dn_df, {
  gene = NA    #对变量gene进行一个定义
  for (i in 1:nrow(KEGG_group_1_dn_df))        #for(i in seq)语句做循环,#nrow()对数据取行数
  {
    aaa = unlist(str_split(KEGG_group_1_dn_df$geneID[i],"/"))  #str_split函数对字符串进行拆分,unlist函数将拆分的数据合并
    gene = c(gene, aaa)      #将所有的拆分结果合并在一起
  }
  KEGG_gene_group_1_dn <<- gene[-1]        #对最开始的gene赋值进行剔除
})
#查看最终提取结果
KEGG_gene_group_1_dn
#对提取的"ENTREZID"利用select()函数进行转换
#使用birt()函数也可以对ID和symbol进行转换,但是对于重复ID不再进行重复输出
KEGG_gene_group_1_dn <- select(org.Mm.eg.db,              #小鼠基因注释库
                              keys=KEGG_gene_group_1_dn,  #样品组信息
                              columns = "SYMBOL",         #指定基因名称类型
                              keytype="ENTREZID")         #输入的基因名称类型
#查看最终转换结果
KEGG_gene_group_1_dn


#对group2_up的gene进行名称类型转换
KEGG_group_2_up_df <- read.csv("KEGG_group_2_up.csv") 
#查看文件的整体信息以确认需要转换的列
KEGG_group_2_up_df
#with({})函数中的花括号语句,只针对括号内的语句执行,无需担心名字的冲突
#with()函数局限性在于赋值仅在此函数的括号内生效
with(KEGG_group_2_up_df, {
  gene = NA    #对变量gene进行一个定义
  for (i in 1:nrow(KEGG_group_2_up_df))        #for(i in seq)语句做循环,#nrow()对数据取行数
  {
    aaa = unlist(str_split(KEGG_group_2_up_df$geneID[i],"/"))  #str_split函数对字符串进行拆分,unlist函数将拆分的数据合并
    gene = c(gene, aaa)      #将所有的拆分结果合并在一起
  }
  KEGG_gene_group_2_up <<- gene[-1]        #对最开始的gene赋值进行剔除
})
#查看最终提取结果
KEGG_gene_group_2_up
#对提取的"ENTREZID"利用select()函数进行转换
#使用birt()函数也可以对ID和symbol进行转换,但是对于重复ID不再进行重复输出
KEGG_gene_group_2_up <- select(org.Mm.eg.db,              #小鼠基因注释库
                              keys=KEGG_gene_group_2_up,  #样品组信息
                              columns = "SYMBOL",         #指定基因名称类型
                              keytype="ENTREZID")         #输入的基因名称类型
#查看最终转换结果
KEGG_gene_group_2_up


#对group2_dn的gene进行名称类型转换
KEGG_group_2_dn_df <- read.csv("KEGG_group_2_dn.csv") 
#查看文件的整体信息以确认需要转换的列
KEGG_group_2_dn_df
#with({})函数中的花括号语句,只针对括号内的语句执行,无需担心名字的冲突
#with()函数局限性在于赋值仅在此函数的括号内生效
with(KEGG_group_2_dn_df, {
  gene = NA    #对变量gene进行一个定义
  for (i in 1:nrow(KEGG_group_2_dn_df))        #for(i in seq)语句做循环,#nrow()对数据取行数
  {
    aaa = unlist(str_split(KEGG_group_2_dn_df$geneID[i],"/"))  #str_split函数对字符串进行拆分,unlist函数将拆分的数据合并
    gene = c(gene, aaa)      #将所有的拆分结果合并在一起
  }
  KEGG_gene_group_2_dn <<- gene[-1]        #对最开始的gene赋值进行剔除
})
#查看最终提取结果
KEGG_gene_group_2_dn

#对提取的"ENTREZID"利用select()函数进行转换
#使用birt()函数也可以对ID和symbol进行转换,但是对于重复ID不再进行重复输出
KEGG_gene_group_2_dn <- select(org.Mm.eg.db,              #小鼠基因注释库
                              keys=KEGG_gene_group_2_dn,  #样品组信息
                              columns = "SYMBOL",         #指定基因名称类型
                              keytype="ENTREZID")         #输入的基因名称类型
#查看最终转换结果
KEGG_gene_group_2_dn


#对转换后的结果输出保存
write.table(KEGG_gene_group_1_up, 'KEGG_gene_group_1_up.csv', sep = ',', quote = FALSE, row.names = FALSE)
write.table(KEGG_gene_group_1_dn, 'KEGG_gene_group_1_dn.csv', sep = ',', quote = FALSE, row.names = FALSE)

write.table(KEGG_gene_group_2_up, 'KEGG_gene_group_2_up.csv', sep = ',', quote = FALSE, row.names = FALSE)
write.table(KEGG_gene_group_2_dn, 'KEGG_gene_group_2_dn.csv', sep = ',', quote = FALSE, row.names = FALSE)


#对KEGG富集分析的结果进行输出保存
tiff("KEGG_group_1_up.tiff")
barplot(KEGG_group_1_up, showCategory = 16,title="The KEGG enrichment analysis of all DEGs ") + 
  scale_size(range=c(2, 12))+
  scale_x_discrete(labels=function(KEGG_group_1_up) str_wrap(KEGG_group_1_up, width = 30))
dev.off()

tiff("KEGG_group_1_dn.tiff")
barplot(KEGG_group_1_dn, showCategory = 16,title="The KEGG enrichment analysis of all DEGs ") + 
  scale_size(range=c(2, 12))+
  scale_x_discrete(labels=function(KEGG_group_1_dn) str_wrap(KEGG_group_1_dn, width = 30))
dev.off()

tiff("KEGG_group_2_up.tiff")
barplot(KEGG_group_2_up, showCategory = 16,title="The KEGG enrichment analysis of all DEGs ") + 
  scale_size(range=c(2, 12))+
  scale_x_discrete(labels=function(KEGG_group_2_up) str_wrap(KEGG_group_2_up, width = 30))
dev.off()

tiff("KEGG_group_2_dn.tiff")
barplot(KEGG_group_2_dn, showCategory = 16,title="The KEGG enrichment analysis of all DEGs ") + 
  scale_size(range=c(2, 12))+
  scale_x_discrete(labels=function(KEGG_group_2_dn) str_wrap(KEGG_group_2_dn, width = 30))
dev.off()

13. 绘制GSEA图

参考文章:CHIP-seq流程学习笔记(10)-使用GSEA软件进行GSEA分析

  1. 准备基因表达文件,代码如下:
# GSEA图 -------------------------------------------------------------------
#Gene Set Enrichment Analysis

#参考文章:https://www.jianshu.com/p/aae9b0322b83,

#做差异分析时需要使用全部差异基因的表达值

#重新提取全部差异基因的表达值FPKM

#关于FPKM值的说明
#在绘制heatmap热图时,需要使用差异基因所对应的FPKM值,该值的获取有几个办法:
#利用Stringtie的-A参数直接获得
#利用DESeq2的-FPKM参数由count转化获得
#利用ballgown包进行转化获得
#本次采用StringTie的-A参数直接获得

#清空环境变量
rm(list=ls())
#获取当前工作目录
getwd()
#设置工作目录
setwd("G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/")

##将之前分析得到的FPKM数据文件导入当前工作环境中
s4301.FPKM <- read.table("G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s4301.FPKM", header = TRUE)
s4312.FPKM <- read.table("G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s4312.FPKM", header = TRUE)
s43023.FPKM <- read.table("G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s43023.FPKM", header = TRUE)
s43113.FPKM <- read.table("G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s43113.FPKM", header = TRUE)
s43159.FPKM <- read.table("G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s43159.FPKM", header = TRUE)
s43168.FPKM <- read.table("G:/xiaxianyou/RNA-seq/2020_09_28/gene_tab/s43168.FPKM", header = TRUE)

#提取全部差异基因list
##设置工作目录
setwd("G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/all_different_genes")
##将各实验组的差异基因导入当前工作环境
group_1 <- read.csv("all_different_genes_group_1_genecount.csv")
group_2 <- read.csv("all_different_genes_group_2_genecount.csv")

##将各实验组的差异基因list进行提取
group_1_gene <- group_1[,1]
group_2_gene <- group_2[,1]

##查看各差异基因名信息
View(group_1_gene)
View(group_2_gene)

#利用match函数对差异基因List信息(小文件)和FPKM值信息(大文件)进行提取
##利用match函数提取各样品中差异基因所在的行数并重新命名为row.NO文件
##match(x,y)函数输出结果:x向量在y向量中所处的位置,x向量元素不存在y向量中的返回NA
##match(x, table$i)函数输出结果:返回x向量在table中$i列中所处的位置
##对group1各样品进行处理
s4301_group_1_row.NO <- c(match(group_1_gene, s4301.FPKM$Gene.ID))
s43023_group_1_row.NO <- c(match(group_1_gene, s43023.FPKM$Gene.ID))
s4312_group_1_row.NO <- c(match(group_1_gene, s4312.FPKM$Gene.ID))
s43113_group_1_row.NO <- c(match(group_1_gene, s43113.FPKM$Gene.ID))

##对group2各样品进行处理
s4301_group_2_row.NO <- c(match(group_2_gene, s4301.FPKM$Gene.ID))
s43023_group_2_row.NO <- c(match(group_2_gene, s43023.FPKM$Gene.ID))
s43159_group_2_row.NO <- c(match(group_2_gene, s43159.FPKM$Gene.ID))
s43168_group_2_row.NO <- c(match(group_2_gene, s43168.FPKM$Gene.ID))

#根据以上行数,对各样品的FPKM值进行提取
##对group1各样品的FPKM值进行提取
s4301_group_1_gene_FPKM <- s4301.FPKM[s4301_group_1_row.NO ,]
s43023_group_1_gene_FPKM <- s43023.FPKM[s43023_group_1_row.NO ,]
s4312_group_1_gene_FPKM <- s4312.FPKM[s4312_group_1_row.NO ,]
s43113_group_1_gene_FPKM <- s43113.FPKM[s43113_group_1_row.NO ,]

##对group2各样品的FPKM值进行提取
s4301_group_2_gene_FPKM <- s4301.FPKM[s4301_group_2_row.NO ,]
s43023_group_2_gene_FPKM <- s43023.FPKM[s43023_group_2_row.NO ,]
s43159_group_2_gene_FPKM <- s43159.FPKM[s43159_group_2_row.NO ,]
s43168_group_2_gene_FPKM <- s43168.FPKM[s43168_group_2_row.NO ,]

#利用merge函数对各组实验的FPKM值进行合并
##merge(x,y, by="")
##对group1各样品的FPKM值进行合并
group_1_gene_FPKM <- merge(merge(s4301_group_1_gene_FPKM, s43023_group_1_gene_FPKM, by="Gene.ID"), merge(s4312_group_1_gene_FPKM, s43113_group_1_gene_FPKM,by="Gene.ID"), by="Gene.ID")

##对group2各样品的FPKM值进行合并
group_2_gene_FPKM <- merge(merge(s4301_group_2_gene_FPKM, s43023_group_2_gene_FPKM, by="Gene.ID"), merge(s43159_group_2_gene_FPKM, s43168_group_2_gene_FPKM, by="Gene.ID"), by="Gene.ID")

#新加一列DESCRIPTION
group_1_gene_FPKM$DESCRIPTION = "na"
group_2_gene_FPKM$DESCRIPTION = "na"

#调整各列的分布顺序
group_1_gene_FPKM <- group_1_gene_FPKM[, c(1, 6, 2, 3, 4, 5)]
group_2_gene_FPKM <- group_2_gene_FPKM[, c(1, 6, 2, 3, 4, 5)]

##查看合并结果,确认
View(group_1_gene_FPKM)
View(group_2_gene_FPKM)

#将各实验组全部差异基因对应的FPKM数据保存至GSEA文件夹中
##设置工作目录
setwd("G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/GSEA/")
write.table(group_1_gene_FPKM, file = "G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/GSEA/group_1_gene_FPKM.txt", row.names = FALSE, quote = FALSE, sep = "\t")
write.table(group_2_gene_FPKM, file = "G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/GSEA/group_2_gene_FPKM.txt", row.names = FALSE, quote = FALSE, sep = "\t")
  1. 准备分组信息文件,设置如下:
    操作记录-2020-09-27:xiaxianyou_RNA_seq_第1张图片第一行: 样品数目(4)、分组数目(2)、固定数值(1)
    第二行: #号必须有、 分组名称
    第三行:每个样品对应的分组名称
  2. 准备geneset文件
  • 使用GSEA官网提供的YAP1 oncogenic signature的gene set进行分析

    操作记录-2020-09-27:xiaxianyou_RNA_seq_第2张图片
    该网站提供的是人的细胞过表达YAP1后,被上调的的47个基因的list,需要首先将其转化为小鼠的同源基因。

    使用biomaRt包对基因类型进行转换,代码如下:

#本脚本主要利用biomaRt包对基因类型进行转换
#参考文章:https://www.jianshu.com/p/33093fc4f2ca
#参考文章:https://www.jianshu.com/p/f7d1f0ffb27e
#关于R包的介绍

#biomaRt包的安装
#BiocManager::install("biomaRt")

#加载biomaRt包
library("biomaRt")

#选择目标数据库和数据集,这里选择人和小鼠的
#useMart一般后面跟两个参数
#第一个参数是借助ensemble数据库
#第二个参数是告诉选择哪个物种的数据集
human = useMart("ensembl", dataset = "hsapiens_gene_ensembl")
class(human)
mouse = useMart("ensembl", dataset = "mmusculus_gene_ensembl")
class(mouse)

#构建测试基因集的向量
setwd("G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/GSEA/")
genes <- read.table("G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/GSEA/geneset.txt")
genes = as.vector(genes$V1)

#由人的基因转化到小鼠的同源基因
genesV2 = getLDS(attributes = c("hgnc_symbol"), 
                 filters = "hgnc_symbol",
                 values = genes ,
                 mart = human,
                 attributesL = c("mgi_symbol"),
                 martL = mouse,
                 uniqueRows=T)

#查看转化后的结果
View(genesV2)

#对结果进行输出保存
write.table(genesV2$MGI.symbol, "G:/xiaxianyou/RNA-seq/2020_09_28/Rtreatment/GSEA/geneset_M.txt", row.names = FALSE, quote = FALSE)

将文件另存为.gmx格式。

  • Browser网站提供的发表文章中的gene set进行分析
    操作记录-2020-09-27:xiaxianyou_RNA_seq_第3张图片
    从网站中检索发表或尚未发表的某个因子(YAP1)的相关ChIP-seq数据,提取相关的潜在靶基因名称。
    操作记录-2020-09-27:xiaxianyou_RNA_seq_第4张图片
    提取基因list后,按上述方法对基因类型进行转换,另存为.gmx格式文件。
  1. 利用GSEA软件进行GSEA作图
  • 导入基因表达文件(.txt)、分组信息文件(cls)和geneset文件(.gmx)

操作记录-2020-09-27:xiaxianyou_RNA_seq_第5张图片

  • 按下图方式设置各个参数

操作记录-2020-09-27:xiaxianyou_RNA_seq_第6张图片

  • 运行输出分析结果,查看index.htlm文件的结果信息

操作记录-2020-09-27:xiaxianyou_RNA_seq_第7张图片

你可能感兴趣的:(操作记录)