信号量 读者写者问题代码有点不理解

信号量 读者写者问题代码有点不理解,第1张

P(write) 是P *** 作,就是write的值-1,就像P(mutex) P *** 作-1,V *** 作+1,
读者:
BEGIN
P(mutex);//上锁,互斥其他读者,为了保证只有一个读者改变read_count
read_count:=read_count+1;
IF read_count=1 //第一个读者,则上写者的锁,保证读得时候不能让写者写
THEN P(writer)
V(mutex);
读文件;
P(mutex); //同上,互斥读者,为了保证只有一个读者改变read_count
read_count:=read_count-1;
IF read_count=0 //最后一个读者,signal写者,可以写
THEN V(write);
V(mutex);
END;
写者:
BEGIN
P(write);
写文件;
V(write);
END;

RNA-Seq在衡量基因表达水平时,若单纯以比对到基因上的reads数来计算表达量在统计学上是不合理的。影响因素有:
1基因长度:需要基因长度来比较同一细胞内不同基因之间的表达。RNA-seq实验中众所周知的固有技术效果与基因长度有关:RNA(或cDNA)分子在测序之前先进行片段化,较长的转录本会比较短的转录本被剪切成更多的片段。因此,转录本的reads数不仅与其表达水平成正比,而且与其长度成正比。如下图,我们不能单纯的数比对到基因上的read数来比较表达量高低,需要考虑基因长度的影响。
这样来说,序列长的基因永远会被认为表达量较高,从而错误估计基因真正的表达量。为了消除基因长度产生的固有技术误差,在过去十年中,已针对RNA-seq数据开发了许多归一化方法,其中常用的有RPKM、TMM、RLE、upper quartile上四分位处理等。
所以需要对原始的表达矩阵进行标准化,去除掉测序深度和基因长度所带来的噪音。

是指所有细胞中均要稳定表达的一类基因,其产物是对维持细胞基本生命活动所必需的,管家基因是一类始终保持着低水平的甲基化并且一直处于活性转录状态的基因。
矫正的思路很简单,就是在变化的样本中寻找不变的量,那么在不同RNA-seq样本中,那些是不变的量呢?一个很容易想到的就是管家基因。但其实这种办法有一个非常强的先验假设:管家基因的表达量不怎么发生变化。其实管家基因有几千个,这几千个基因有一定程度上的变化是有可能的。因此这种方法不准确。

在RNA-Seq建库的过程中掺入一些预先知道序列信息以及序列绝对数量的内参。这样在进行RNA-Seq测序的时候就可以通过不同样本之间内参(spike-in)的量来做一条标准曲线,就可以非常准确地对不同样本之间的表达量进行矫正

数值概念:计算公式:CPM=C/N1000000
设C为比对到geneA的read 数(read count ),N为比对到所有基因的总read 数
用途:在某些情况下,只想了解每个基因被覆盖到的相对read数,而不希望对其做长度校正,就会使用这个指标。CPM 只对read count相对总read 数做了数量的均一化。如果想进行基因间表达量的比较,则不得不考虑基因长度的不同。如果进一步做长度的均一化,就得到了下面的RPKM

RPKM,全称为reads per kilobase per million mapped reads,指的是每一百万个map 上的reads 中,map到外显子的每1K个碱基上的read数。
一般来说,基因越长,读取的次数(深度)越多,自然其有效读数就越多。而RPKM 就是为了消除这两个干扰的因素。以更好的比较不同结果。
数值概念:计算公式:RPKM=(1000000 C)/(N L/1000)
设C为比对到geneA的read 数(read count ),N为比对到所有基因的总read 数,L为gene A的碱基数,RPKM法能消除基因长度和测序量差异对计算基因表达量的影响,计算得到的基因可直接用于比较不同样品间的基因表达差异
用途:用于与基因表达量相的后续分析,用于单端测序
计算步骤:
首先对总值数据进行标准化(当然正常来说map到的count 肯定不止这么多,这里只是除了10,但一般而言百万级的count 可以除一百万)
相比于RPKM,FPKM 计算的是fragments,也就是一对reads。与RPKM 的差别主要体现在,FPKM在一对reads map上的情况下只计数1,而RPKM 会计为2。适用于双端测序。

与 RPKM/FPKM 的差别在于,TPM 首先进行了基因长度的标准化,接着再进行了测序深度的标准化。
步骤:1长度标准化

2深度标准化

自然从这点来说TPM 的使用范围更为广泛。

参考 excel演示DESeq2归一化原理 - (jianshucom)

要回答这个问题,我们需要先撇开所有形式上的计算,重新思考到底什么是RNA转录本的表达丰度这个问题。
事实上,对于任何一个制备好测序文库的待测样本,它上面任何一个基因的表达量(或者说丰度),都将已是一个客观存在的值,这个值是不管你改变了多少测序环境都不会变的。而且总共有多少个不同的基因在这这一刻进行了表达,实际上也已经是客观定好了
此刻,我们可以假定,对于样本X,其有一个基因g被转录了n次,同时样本X中所有基因的转录总次数假定是m次, 那么正确描述基因g转录丰度的值应该是:rg=n/m
同时,样本X中其他基因的转录丰度的计算也应该和上述公式类似。除了要把分子n换为其他基因对应的转录次数之外,分母m都一样。于是有趣的事情就是,所有基因转录本丰度的均值mean将是一个恒定不变的数,由以上定义这个数就是:mean = (a+b+c++n+)/m/x
x代表基因个数
此时发现 (a+b+c++n+)=m,公式化简变为mean = 1/x
这个期望值竟然和测序状态无关!仅仅由样本中基因的总数所决定的。也就是说,对于同一个物种,不管它的样本是哪种组织(正常的或病变的),也不管有多少个不同的样本,只要它们都拥有相同数量的基因,那么它们的mean都将是一致的。这是一个在进行比较分析的时候,非常有意义的恒等关系。
由于上面的结果是在理论情况下推导出来的,实际上我们无法直接计算这个r,那么我们可以尝试通过其他方法来近似估计r,只要这些近似统计量可以隐式地包含这一恒等关系即可
实际数据来证明FPKM和RPKM犯的错:
假定有两个来自同一个个体不同组织的样本X和Y,这个个体只有5个基因,分别为A、B、C、D和E它们的长度分别如下:

我们可以得到,样本X和Y的转录本的不变量,mean值是:

我们以FPKM的计算的为例子,以下这个表格列出的分别是样本X和Y在这5个基因分别比对上的fragment数和各自总的fragment数量:

于是,按照以上公式我们可以得到样本X和Y在这5个基因上的FPKM值分别为:

样本X在这5个基因上的FPKM均值FPKM_mean = 5,680;
样本Y在这5个基因上的FPKM均值FPKM_mean = 161,840
首先,我们可以把FPKM的计算式拆分成如下两部分。

第一部分的统计量是对一个基因转录本数量的一个等价描述(虽然严格来讲也没那么等价):

第二部分的统计量是测序获得的总有效Fregment数量的百万分之一:

FPKM其实就只是这两部分的商!这有道理吗?分开来看它们似乎都有点道理,但是合起来的时候其实很没逻辑。
尤其是第二部分(N/10^6),本来式子的第一部分是为了描述一个基因的转录本数量,那么正常来讲,第二部分就应该是样本的转录本总数量(或至少是其总数量的等价描述)才能形成合理的比例关系,而且可以看出来FPKM/RPMK是有此意的,这本来就是这个统计量的目的。

可是,它却失败了!
N/10^6的大小其实是由RNA-seq测序深度所决定的,并且是一个和总转录本数量无直接线性关系的统计量——N与总转录本数量之间的关系还受转录本的长度分布所决定,而这个分布往往在不同样本中是有差异的!
比如,在有些基因中,虽然有效比对到基因的Fragment数是相等的,但一般来说长度越长的基因,其被转录的次数就越少。那也就是说,N必须将各个被转录的基因的长度考虑进去才能正确描述总体的转录本数!而FPKM/RPKM显然没有做到这一点,这便是FPKM和RPKM出错的内在原因。

1、关于FPKM, RPKM, TPM
在RNA-Seq的分析中,对基因或者转录本的reads count数目进行标准化是一个很重要的步骤,因为落在一个基因区域内的read数目取决于基因长度和测序深度。基因越长read数目越多,测序深度越高,则一个基因对应的read数目也相对越多。所以必须要标准化,而标准化的两个关键因素就是 基因长度 测序深度 。我们常用RPKM、FPKM和TPM作为转录组数据定量的表示方法。FPKM/RPKM/TPM都是描述相对定量的单位。

RPKM:
Reads Per Kilobase of exon modelper Million mapped reads:主要用来对单端测序(single-end RNA-seq)进行定量的方法。RPKM(推荐软件: Range, Deseq) 。

在一个样本中一个基因的RPKM等于落在这个基因上的总的read数(total exon reads)与这个样本的总read数(mapped reads (Millions))和基因长度(exon length( KB )) 的乘积的比值。

FPKM
Fragments Per Kilobase of exon model per Million mapped fragments: 主要是针对pair-end测序表达量进行计算。FPKM (推荐软件:cufflinks, Stringtie) 和RPKM 的计算方法基本一致。

FPKM和RPKM的区别就是一个是fragment,一个是read。对于单末端测序数据,由于Cufflinks计算的时候是将一个read当做一个fragment来算的,故而FPKM等同于RPKM。 对于双末端测序而言,如果一对paired-read都比对上了,那么这一对paired-read称之为一个fragment,而如果一对paired-Read中只有一个比对上了,另外一个没有比对上,那么就将这个比对上的read称之为一个fragment。而计算RPKM时,如果一对paired-read都比对上了会当成两个read计算,而如果一对paired-read中只有一个比对上了,另外一个没有比对上,那么就计read数为1。 故而即使是理论上将各个参数都设置成一样的,也并不能说FPKM=2RPKM。对于单末端测序,虽然理论上FPKM等同于RPKM, 但是实际上即使是使用同一个mapping软件得到的mapping结果,然后再分别去计算同一个基因的RPKM (自己人工计算,或者用现成的一些软件都能算)和FPKM(用Cufflinks计算),结果却仍然是不同,因为Cufflinks有自己的模型和自己的一些内在算法。

TPM
Transcripts Per Kilobase of exonmodel per Million mapped reads :TPM (推荐软件:RSEM, Stringtie) ,优化的RPKM计算方法,可以用于同一物种不同组织的比较。

TPM概括了基因的长度、表达量和基因数目。TPM可以用于同一物种不同组织间的比较,因为sum值总是唯一的。

不管是计算FPKM、RPKM,还是计算TPM,我们都要先得到一个ReadCount的矩阵(行为基因,列为样本)。在计算FPKM和RPKM时,都是先按列(也就是这个样本的总read数)进行标化,之后再对对个基因的长度进行标准化。而TPM是先对基因长度进行标准化,之后再对列(这个时候就不再是这个样本的总read数了)进行标化。这样使得最终的TPM矩阵的每列都相同(列和都等于1),也就是说每个样本中的TPM的和都是一样的。这样就会使得我们更容易去比较同一个基因在不同样本中所占的read数的比例。而RPKM/FPKM由于最终的表达值矩阵的列和不同,故而不能直接比较同一个基因在不同样本中所占的read数的比例。

reads_count


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/13162009.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-14
下一篇 2023-06-14

发表评论

登录后才能评论

评论列表(0条)

保存