volcano plot 火山图
火山图(Volcano Plot)是做RNA-Seq分析的时候特别常用的一张图,因为它可以非常清晰的展示出哪些基因是我们真正想要的显著性的基因。
我们看看火山图长什么样子
下面说明如何看懂和绘制火山图
标准的火山图常用于展示显著差异表达的基因,这里有两个关键词:显著是指P<0.05,差异表达一般我们按照Fold Change(倍数变化)>=2.0作为标准。
当我们拿到基因表达的P值和Fold Change后,为了用火山图展示结果,一般需要把倍数进行Log2的转化,比如某基因在实验组表达水平是对照组的4倍,log2(4)=2,同样的如果是1/4,也就是0.25,转换后的结果就是-2。
同样的道理,对P值进行-log10的转化,-log10(0.05)约等于1.30103,由于P值越小表示越显著,所以我们进行-log10(P value)转化后,转化值越大表示差异约显著,比如-log10(0.001)=3 > -log10(0.01)=2 > -log10(0.05)=1.30。
上面看不懂没关系,举例说明:
RNA-Seq测序时会有一个对照组的样本,一个处理组的样本,处理组和对照组相比较,会发现某个基因表达量或变高了或变低了。用处理组的表达量除以对照组就会得到一个倍数,这个倍数就叫做Fold Change
,差异表达一般我们按照Fold Change(倍数变化)>=2.0作为标准。为了用火山图更直观的显示结果我们要将横轴的Fold Change
进行Log2处理,对纵轴的P值进行-log10
的处理。
log2(fold change)=0
也就是图中间的位置,就相当于:处理组fpkm/对照组fpkm=1
也就是说对照组和处理组之间的基因表达量是没有变化的。所以说出现在中间位置的点是表达量没有发生变化的基因,越往右边走就说明这些基因的表达量在处理组比对照组大,越往左走说明相对于对照组来说,处理组基因表达量变低。
在该图中,不显著的被设置成了粉色,显著的设置成了绿色。
Y轴是cuffdiff
算的统计检验的P-value
取了log10之后又取了一个负数,所以说-log10(P-value)
越高代表着越显著,也就是说越往左上角和越往右上角的点是越显著的点。
我们用来自于cuffdiff
的输出文件gene_exp.diff
画图,读入R命令:
volcano_plot = read.table(file="gene_exp.diff文件路径",header = T)
注:读表用read.table
函数
读入后,看看这个表张什么样子:
可以看到:
- 第一列、第二列都是基因名;
- 第三列
gene
没写因为已经给了gene_id
了; - 第四列
locus
是该基因在基因组上位置; -
sample_1 sample_2
就是取了个名字不用注意; -
status
那列显示的是,是否通过检验,显示OK的就是进行检验的,显示NOTEST就说明表达量特别特别低不进行检验; -
p-value
是做统计检验看看是否显著,q-value
是对p-value
进行修正,最终以修正过的q-value
为准,q-value<0.05才认为是显著的。
准备画火山图用到的X/Y轴
先准备X轴—log2(fold change)
前面我们交代过了fold change=处理组fpkm/对照组fpkm
所以:
control_FPKM = volcano_plot$value_2 #对照组的fpkm
treat_FPKM = volcano_plot$value_1 #处理组的fpkm
log2_foldchange = log2(treat_FPKM / control_FPKM) #处理组fpkm/对照组fpkm
我们可以看到我们这里重新赋值求的log2_foldchange
,原来的表格里有log2.fold_change
这一列,为什么还要重新求呢?因为原来表格里求反了求的是:对照组fpkm/处理组fpkm,我们这里改正下。
我们看下计算好的log2_foldchange
里面有很多的Inf
和NaN
,这是怎么回事?
> log2_foldchange
[1] 0.3382477530 -0.4605051707 -0.0964487964 -0.0249217524 0.7042396503 NaN Inf
[8] -0.9036291456 NaN NaN 0.4595512248 -0.2834890803 -0.1511719401 -Inf
[15] Inf NaN NaN NaN 0.4606267258 0.1979788743 0.1460252515
[22] -0.3713316852 -0.9538916822 -0.2045978915 -0.2938850235 0.2349539904 0.3777615202 0.4461331227
[29] -0.1815706646 -1.0014515800 Inf -0.3531645487 0.1261928713 2.8901005944 -Inf
[36] -0.0146452448 -0.8561317308 -0.1874764797 0.5134263089 -0.0978467676 -0.3708083209 0.8298739826
这是因为有些control组基因的FPKM是0,除数是零,是不符合数学规则的,所以会出现这种情况。
我们需要处理下:
control_FPKM == 0
判断一下control_FPKM的值是否等于0
把control_FPKM == 0
即除数是0的全都筛选出来
> log2_foldchange[control_FPKM == 0 ]
[1] NaN Inf NaN NaN Inf NaN NaN NaN Inf Inf NaN NaN NaN Inf NaN NaN NaN NaN Inf Inf NaN NaN NaN NaN NaN NaN
[27] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN Inf Inf NaN NaN NaN NaN
[53] NaN NaN Inf NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN Inf NaN NaN NaN Inf NaN
我们可以看到经过log2_foldchange[control_FPKM == 0 ]
操作,把log2_foldchange
里的所有 NaN / Inf
选出来了,之后我们把筛选出的 NaN / Inf
强行赋值为0
log2_foldchange[control_FPKM == 0 ] = 0
查看新生成的log2_foldchange
发现还有一些-Inf
> log2_foldchange
[1] 0.3382477530 -0.4605051707 -0.0964487964 -0.0249217524 0.7042396503 0.0000000000 0.0000000000
[8] -0.9036291456 0.0000000000 0.0000000000 0.4595512248 -0.2834890803 -0.1511719401 -Inf
[15] 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.4606267258 0.1979788743 0.1460252515
[22] -0.3713316852 -0.9538916822 -0.2045978915 -0.2938850235 0.2349539904 0.3777615202 0.4461331227
[29] -0.1815706646 -1.0014515800 0.0000000000 -0.3531645487 0.1261928713 2.8901005944 -Inf
[36] -0.0146452448 -0.8561317308 -0.1874764797 0.5134263089 -0.0978467676 -0.3708083209 0.8298739826
[43] 1.8493688172 0.0889640074 0.3113824129 0.0000000000 1.1102702040 -0.2531163954 0.0957645721
[50] -0.6889365003 0.0000000000 0.0000000000 0.4828096335 -Inf -0.0058634211 -0.1436717399
[57] -0.2029754567 1.9504284898 -0.2426462728 -0.3974959807 0.7211822730 -0.2428425868 0.5005116514
[64] 0.3829284571 -0.0027983348 0.2696816982 -0.1575258190 -0.5746841946 -0.2751886483 0.0894799450
[71] -0.1773208535 -1.6980255555 0.0000000000 0.5061142478 0.3639842228 -Inf -0.1930460419
这是因为当treat_FPKM=0
即分母是0时,求log2就等于负无穷-Inf
所以,同理,我们把treat_FPKM
也处理一下,把log2_foldchange
里所有的-Inf
赋值为0,这时我们就把画图过程中的异常点过滤掉了。
log2_foldchange[treat_FPKM == 0 ] = 0
此时log2_foldchange
里所有的数都是有效数字了,原来NaN / Inf
的地方都变成0
啦~
准备Y轴。
前面我们也交代过Y轴是p-value
取log10
,这时得到的是一个负值,我们再把它变成整数所以乘以-1
即:
log10_p_value = log10(volcano_plot$p_value) * -1
此时,X,Y轴都准备好了,我们开始作图
plot(x=log2_foldchange,y=log10_p_value)
这张图虽然是火山图的样子了,但肯定是不符合paper的要求的,我们还需要对它进行精修,至于怎么精修,明天讲~
参考:
1.理论铺垫部分:如何看懂火山图
2.代码部分:视频里面的代码
3.图形部分:百度图片