前言
上一篇數(shù)據(jù)分析:數(shù)據(jù)預(yù)處理--標準化初解釋(一)是在R中初步實現(xiàn)計算各類標準化的方法,沒進一步分析為何要標準的原因,這一次我們借用兩個標準化方法極值標準化和Zscore標準化重新解析標準化的原因。
在構(gòu)建模型過程中,通常使用多變量作為自變量去預(yù)測結(jié)果,多變量很多時候是具有多個不同的單位和量綱的。如果使用原始值去構(gòu)建模型或做預(yù)測,這會導(dǎo)致每個變量對結(jié)果的貢獻度不一致,因此常需要對自變量做 transform和standardization。
比如變量A的范圍是0-1,000,000;變量B的范圍是0-100,在沒標準化前,它們對結(jié)果的貢獻度是不同的。
常用標準化方法
- 極值標準化:
library(dplyr)
data(iris)
min_max_norm <- function(x){
(x -min(x, na.rm = TRUE))/(max(x, na.rm = TRUE) - min(x, na.rm = TRUE))
}
iris_norm <- lapply(iris[, 1:4], min_max_norm) %>% data.frame() %>%
mutate(Species=iris$Species)
head(iris_norm)

Notes: 每個變量的范圍在[0, 1]之間。極值標準化的缺點是會將數(shù)據(jù)拉向均值,對離群點不敏感,相反Zscore則考慮到極值的影響(通過除以標準差實現(xiàn)該效果)。
- Z-score標準化:
scale函數(shù)可用于zscore標準化。
# single variable
iris$Sepal.Width <- (iris$Sepal.Width - mean(iris$Sepal.Width, na.rm = TRUE)) / sd(iris$Sepal.Width, na.rm = TRUE)
# multiple variable
iris_standardize <- as.data.frame(scale(iris[1:4]))
library(dplyr)
iris_new <- iris %>% mutate_each_(list(~scale(.) %>% as.vector),
vars = c("Sepal.Width","Sepal.Length"))
head(iris_new)

Log Transformation
很多時候數(shù)據(jù)是偏斜分布的(左右兩個分布是偏態(tài)分布,中間是正態(tài)分布)。通常使用log2轉(zhuǎn)換使得其分布符合正態(tài)分布。

log(dat$variable)
最近看到一篇文獻對數(shù)據(jù)做了log2transform+median normalization。

質(zhì)譜數(shù)據(jù)(蛋白質(zhì)組+代謝組)的intensity數(shù)值是整型且數(shù)目巨大,先使用log2transform一可以降低量綱影響二可以使得數(shù)據(jù)分布服從正態(tài)分布。

后面再做median normalization是排除log2transform后數(shù)據(jù)對預(yù)測結(jié)果仍然貢獻不一致。
median_norm <- function(x){
value <- as.numeric(x)
x_scale <- (value - stats::median(value, na.rm = TRUE))/stats::IQR(value, na.rm = TRUE)
return(x_scale)
}

問題來了,缺失值該如何處理呢?
systemic information
sessionInfo()
R version 4.0.2 (2020-06-22)
Platform: x86_64-conda_cos6-linux-gnu (64-bit)
Running under: CentOS Linux 8 (Core)
Matrix products: default
BLAS/LAPACK: /disk/share/anaconda3/lib/libopenblasp-r0.3.10.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] PTXQC_1.0.12 tibble_3.1.5 dplyr_1.0.7
loaded via a namespace (and not attached):
[1] tinytex_0.32 tidyselect_1.1.1 xfun_0.24 bslib_0.2.5.1 reshape2_1.4.4 purrr_0.3.4
[7] colorspace_2.0-2 vctrs_0.3.8 generics_0.1.0 viridisLite_0.4.0 htmltools_0.5.1.1 yaml_2.2.1
[13] utf8_1.2.1 rlang_0.4.11 jquerylib_0.1.4 pillar_1.6.4 glue_1.4.2 DBI_1.1.1
[19] gdtools_0.2.2 RColorBrewer_1.1-2 lifecycle_1.0.0 plyr_1.8.6 stringr_1.4.0 munsell_0.5.0
[25] gtable_0.3.0 rvest_0.3.6 kableExtra_1.3.4 evaluate_0.14 knitr_1.33 UpSetR_1.4.0
[31] fansi_0.5.0 Rcpp_1.0.7 scales_1.1.1 webshot_0.5.2 jsonlite_1.7.2 systemfonts_0.3.2
[37] gridExtra_2.3 ggplot2_3.3.5 digest_0.6.27 stringi_1.4.6 ade4_1.7-18 cowplot_1.1.0
[43] grid_4.0.2 tools_4.0.2 magrittr_2.0.1 sass_0.4.0 ggdendro_0.1.22 R6P_0.2.2
[49] seqinr_4.2-4 crayon_1.4.1 tidyr_1.1.4 pkgconfig_2.0.3 ellipsis_0.3.2 MASS_7.3-54
[55] data.table_1.14.0 xml2_1.3.2 assertthat_0.2.1 rmarkdown_2.9 svglite_1.2.3.2 httr_1.4.2
[61] rstudioapi_0.13 R6_2.5.0 compiler_4.0.2