入门而已,主要是为了熟悉转录组分析的基本流程,得到差异表达基因,所以在数据上选择了比较小的单端测序数据,同时也不考虑论文出处,仅简单分析数据。
数据来源:Accession number GSE104590
数据说明:SRR6130341、SRR6130340、SRR6130339为对照,SRR6130338、SRR6130336、SRR6130334为处理。
获取测序信息:
esearch -db sra -query PRJNA313294 | efetch -format runinfo > datainfo.csv
提取SRA文件名称:
cat datainfo.csv | cut -f 1,16 -d , | grep SRR.*SINGLE | cut -f 1 -d "," > single_ids.txt
下载数据:
mkdir -p reads # 创建reads目录
cat single_ids.txt | xargs -n 1 fastq-dump -O reads
# 重命名
xargs是给命令传递参数的过滤器,上面命令中-n参数表示命令执行时传递参数的个数,这里每次传递一个,即一个SRA文件名称。
由于是单端测序,所以在fastq-dump中没有加其他参数,直接将其转成fastq文件。在处理SRR6130339出现错误,后改成手动下载,然后用fastq-dump处理。
下载参考基因组文件:
mkdir -p refs
# 下载基因组序列
URL1=ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/150/675/GCF_000150675.1_ASM15067v2/GCF_000150675.1_ASM15067v2_genomic.fna.gz
curl $URL1 | gunzip GCF_000150675.1_ASM15067v2_genomic.fna.gz
mv GCF_000150675.1_ASM15067v2_genomic.fna ./refs
# 重命名
move GCF_000150675.1_ASM15067v2_genomic.fna genome.fna
# 下载GFF文件
URL2=ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/150/675/GCF_000150675.1_ASM15067v2/GCF_000150675.1_ASM15067v2_genomic.gff.gz
curl $URL2 | gunzip GCF_000150675.1_ASM15067v2_genomic.gff.gz
mv GCF_000150675.1_ASM15067v2_genomic.gff ./refs
# GFF转GTF
gffread GCF_000150675.1_ASM15067v2_genomic.gff -T -o genome.gtf
用hisat2为基因组建立索引:
REF=refs/genome.fna
IDX=refs/genome.fna
hisat2-build $REF $IDX
命令会在refs文件夹中生成8个以genome.fna为前缀的的ht2文件,如genome.fna.1.ht2。
批量化处理文件,新建一个sh文件:
mkdir -p bam
set -euo pipefail
IDX=refs/genome.fna
for sample in SRR6130341.1 SRR6130340.1 SRR6130339 SRR6130338.1 SRR6130336.1 SRR6130334.1;
do
R1=reads/${sample}.fastq
BAM=bam/${sample}.bam
hisat2 -p -x $IDX -U $R1 | samtools sort > $BAM
samtools index $BAM
done
注: 这里并没有提前对fastq文件做质控处理。
统计reads数:
GTF=refs/genome.gtf
featureCounts -a $GTF -o counts.txt bam/SRR*.bam
counts.txt文件
其中包含许多计算相对表达量不需要的信息,所以进行精简一下:
cat counts.txt | cut -f 1, 7-12 > simple_counts.txt
然后利用simple_counts文件在R中用DESeq2计算相对表达量,切换到Rstudio,在切换到工作目录:
# 实验设计重复.
cond1_num = as.integer(3)
cond2_num = as.integer(3)
# 设置好处理和对照.
cond_1 = rep("mock", cond1_num)
cond_2 = rep("treat", cond2_num)
library(DESeq2)
# 读取文件
countData = read.table("sample_counts.txt", header=TRUE, row.names=1, sep="\t")
# 按要求构建好dataframe
samples = names(countData)
condition = factor(c(cond_1, cond_2))
colData = data.frame(samples=samples, condition=condition)
# 创建 DESEq2 dataset.
dds = DESeqDataSetFromMatrix(countData=countData, colData=colData, design = ~condition)
#设置需要比较的参考
dds$condition = relevel(dds$condition,"mock")
#
dds = DESeq(dds)
res = results(dds)
# 用 padj and foldChange 排序.
sorted = res[with(res, order(padj, -log2FoldChange)), ]
# 转成dataframe.
sorted.df = data.frame("id"=rownames(sorted),sorted)
# 生成txt文件.
write.table(sorted.df, file="sort_df.txt", sep="\t", row.name=FALSE, col.names=TRUE, quote=FALSE)
# 标准化
nc = counts(dds,normalized=TRUE)
# 转成dataframe.
dt = data.frame("id"=rownames(nc),nc)
# 保存文件.
write.table(dt, file="norm-matrix-deseq2.txt", sep="\t", row.name=FALSE, col.names=TRUE,quote=FALSE)