我们知道一般做表达谱数据分析之前,第一步就是对我们的表达矩阵进行标准化(归一化),去除由于测序深度,或者荧光强度不均一等原因造成的表达差异。否则后续差异表达分析得到的差异基因,很可能并不是真正生物学意义上的差异,而是由于前面提到的这些原因造成的。
做归一化的方法也很多,有根据中位数进行归一化,即将每个样本中所有基因的表达值的中值转换到同一水平。如下图所示
除了中位数标准化之外,我们还可以使用z-score的方法来对表达谱数据进行标准化:
z-score=(表达量-均值)/标准差
那么下面小编就给大家演示一下如何使用前面讲到的☞R中的sweep函数,使用z-score的方法来对表达谱矩阵进行标准化
代码语言:javascript复制#为了保证随机数保持一致,这里设置一下种子序列
set.seed(123)
#随机生成100个数,构造一个10X10的矩阵
data=matrix(runif(100,1,10),nrow=10)
#设置行名是gene1到gene10
rownames(data)=paste0("gene",1:10)
#设置列明是sample1到sample10
colnames(data)=paste0("sample",1:10)
#计算每一行的均值
rowmean=apply(data,1,mean)
#计算每一行的标准差
rowsd=apply(data,1,sd)
#每一行基因表达值减去这一行的均值
data1=sweep(data,1,rowmean)
#每一行基因表达值除以这一行的标准差
data2=sweep(data1,1,rowsd,'/')
data2
得到的结果如下
如果对R里面scale这个函数比较熟悉的小伙伴,可能已经发现了,scale这个函数就能完成z-score的计算,我们来看看这个函数的说明
我们来看看scale这个函数的效果
代码语言:javascript复制#因为scale默认对列做操作,所以这里先用t对表达矩阵做一个转置
#计算完再用t转置回来
data3=t(scale(t(data)))
data3
得到的结果如下,有兴趣的小伙伴可以去对比一下跟使用sweep函数得到的结果。(应该是一样的!!!)