在数据分析之前,我们通常需要先将数据标准化(normalization),利用标准化后的数据进行数据分析。 数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间, 其中最典型的就是数据的归一化处理,即将数据统一映射到[0,1]区间上。 数据归一化后可以提升模型的收敛速度和精度。
### 1. 离差标准化
# 数据映射到[0,1]
mat <- matrix(data = sample(0:10000,1000,replace=TRUE),
nrow = 100, ncol = 10, byrow = TRUE,
dimnames = list(paste0("gene", 1:100),
paste0("sample", 1:10)))
normalize <- function(x){
return ((x-min(x))/(max(x)-min(x)))
}
apply(mat,2,normalize) # 对列操作
# 数据映射到[-1,1]
normalize2 <- function(x){
return ((x-mean(x))/(max(x)-min(x)))
}
class(mat) # [1] "matrix" "array"
mat_norm <- apply(mat,2,normalize2)
class(mat_norm) # [1] "matrix" "array"
### 2. log函数转换
# 所有的数据都要大于等于1
# 除以log10(max)后在[0,1]区间上
# log(x, base)
log(10) #default 自然对数
log(10,10)
log(10,2)
lognorm <- function(x){
return (log(x,10)/log(max(x),10))
}
mat_lognorm <- apply(mat,2,lognorm)
# 二代测序数据基因表达数据,往往+1 再取log
### 3.z-score标准化,标准差标准化
# 经过该方法处理的数据的均值是0,标准差是1
# z = (x-μ)/σ
scale(mat) #
class(scale(mat)) # [1] "matrix" "array"
# x <- 1:10
x <- matrix(1:10, ncol = 2)
scale(x) # z-score normalization
#scale(x,center = TRUE, scale = TRUE)
### 4. 各种包中的标准化函数
# R语言很多bioconductor包都有自己的数据标准化预处理方法