在做表达矩阵的counts值作为RPKM的时候发现的这个知识点细节问题, 因为矩阵需要每一个样本除以它各自的文库大小,然后呢,每个基因又需要除以各自的基因长度。
所以呢,我们的表达矩阵,其实是需要除以两个长度不一的向量,而且方向不一样,一个是按照行来除以,一个是按照列来除以,我最后写的代码是:
rpkm <- function(counts, lengths) {
# 首先对矩阵进行基因长度归一化
# 矩阵除以向量是按照行分开,表达矩阵的行是基因,所以每个基因除以各自的基因长度
rate <- counts / lengths
# 然后对矩阵进行文库大小归一化
t(t(rate) / colSums(counts) )* 1e9
}
对很多朋友来说,是需要解释一下的。
很明显 counts 是表达矩阵,lengths 是不同基因长度向量,而 colSums(counts) 是不同样本的长度向量。
一个简单的例子
这里还是生成随机数:
counts=1:10
dim(counts)=c(2,5)
lengths=c(1:2)
lib=1:5
counts/lengths
counts/lib
t(t(counts)/lib)
结果如下:
可以看到,矩阵除以向量,是按行的顺序来的,如果需要列,就得先转置,再转回来。