如何在 r 中标准化数据
在大多数情况下,当人们谈论“标准化”数据集中的变量时,他们的意思是他们想要缩放值,以使变量的平均值为 0,标准差为 1。
标准化变量的最常见原因是当您执行某种类型的多变量分析时(即,您想要了解多个预测变量和响应变量之间的关系)并且希望每个变量对分析有同等的贡献。
当以不同尺度测量变量时,它们对分析的贡献通常并不相同。例如,如果一个变量的值范围为 0 到 100,000,另一个变量的值范围为 0 到 100,则范围较大的变量在分析中将被分配较大的权重。
当一个变量衡量工资(0 到 100,000 美元)等变量,而另一个变量衡量年龄(0 到 100 岁)等变量时,这种情况很常见。
通过标准化变量,我们可以确保每个变量对分析的贡献相同。有两种常见的方法来标准化(或“缩放”)变量:
- 最小-最大归一化: (X – min(X)) / (max(X) – min(X))
- Z 分数的标准化: (X – μ) / σ
然后我们将展示如何在 R 中实现这两种技术。
如何在 R 中标准化(或“缩放”)变量
对于以下每个示例,我们将使用内置的 R 数据集iris来说明如何在 R 中标准化或缩放变量:
#view first six rows of iris dataset
head(iris)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1 5.1 3.5 1.4 0.2 setosa
#2 4.9 3.0 1.4 0.2 setosa
#3 4.7 3.2 1.3 0.2 setosa
#4 4.6 3.1 1.5 0.2 setosa
#5 5.0 3.6 1.4 0.2 setosa
#6 5.4 3.9 1.7 0.4 setosa
最小-最大归一化
最小-最大归一化的公式为:
(X – 最小值(X))/(最大值(X) – 最小值(X))
对于变量的每个值,我们只需找到该值与最小值之间的距离,然后除以范围。
为了在 R 中实现这一点,我们可以定义一个简单的函数,然后使用laply将该函数应用于我们想要的iris数据集中的列:
#define Min-Max normalization function min_max_norm <- function (x) { (x - min(x)) / (max(x) - min(x)) } #apply Min-Max normalization to first four columns in iris dataset iris_norm <- as.data.frame(lapply(iris[1:4], min_max_norm)) #view first six rows of normalized iris dataset head(iris_norm) # Sepal.Length Sepal.Width Petal.Length Petal.Width #1 0.22222222 0.6250000 0.06779661 0.04166667 #2 0.16666667 0.4166667 0.06779661 0.04166667 #3 0.11111111 0.5000000 0.05084746 0.04166667 #4 0.08333333 0.4583333 0.08474576 0.04166667 #5 0.19444444 0.6666667 0.06779661 0.04166667 #6 0.30555556 0.7916667 0.11864407 0.12500000
请注意,现在每一列的值都在 0 和 1 之间。另请注意,第五列“物种”已从此数据框中删除。我们可以使用以下代码轻松添加它:
#add back Species column iris_norm$Species <- iris$Species #view first six rows of iris_norm head(iris_norm) # Sepal.Length Sepal.Width Petal.Length Petal.Width Species #1 0.22222222 0.6250000 0.06779661 0.04166667 setosa #2 0.16666667 0.4166667 0.06779661 0.04166667 setosa #3 0.11111111 0.5000000 0.05084746 0.04166667 setosa #4 0.08333333 0.4583333 0.08474576 0.04166667 setosa #5 0.19444444 0.6666667 0.06779661 0.04166667 setosa #6 0.30555556 0.7916667 0.11864407 0.12500000 setosa
Z 分数标准化
最小-最大归一化技术的缺点是它使数据值更接近平均值。如果我们想确保离群值的权重高于其他值,则 z 分数标准化是更好的实施技术。
z 分数标准化的公式如下:
(X – μ) / σ
对于变量的每个值,我们只需减去变量的平均值,然后除以变量的标准差。
为了在 R 中实现这一点,我们有几种选择:
1.标准化变量
如果我们只是想标准化数据集中的变量,例如鸢尾花数据集中的 Sepal.Width,我们可以使用以下代码:
#standardize Sepal.Width iris$Sepal.Width <- (iris$Sepal.Width - mean(iris$Sepal.Width)) / sd(iris$Sepal.Width) head(iris) # Sepal.Length Sepal.Width Petal.Length Petal.Width Species #1 5.1 1.01560199 1.4 0.2 setosa #2 4.9 -0.13153881 1.4 0.2 setosa #3 4.7 0.32731751 1.3 0.2 setosa #4 4.6 0.09788935 1.5 0.2 setosa #5 5.0 1.24503015 1.4 0.2 setosa #6 5.4 1.93331463 1.7 0.4 setosa
Sepal.Width值现在已缩放,平均值为 0,标准差为 1。如果需要,我们甚至可以检查这一点:
#find mean of Sepal.Width mean(iris$Sepal.Width) #[1] 2.034094e-16 #basically zero #find standard deviation of Sepal.Width sd(iris$Sepal.Width) #[1] 1
2.使用尺度函数标准化多个变量
要标准化多个变量,可以简单地使用尺度函数。例如,以下代码显示如何缩放iris数据集的前四列:
#standardize first four columns of iris dataset
iris_standardize <- as.data.frame(scale(iris[1:4]))
#view first six rows of standardized dataset
head(iris_standardize)
# Sepal.Length Sepal.Width Petal.Length Petal.Width
#1 -0.8976739 1.01560199 -1.335752 -1.311052
#2 -1.1392005 -0.13153881 -1.335752 -1.311052
#3 -1.3807271 0.32731751 -1.392399 -1.311052
#4 -1.5014904 0.09788935 -1.279104 -1.311052
#5 -1.0184372 1.24503015 -1.335752 -1.311052
#6 -0.5353840 1.93331463 -1.165809 -1.048667
请注意,默认情况下,缩放函数会尝试标准化数据框中的每一列。因此,如果我们尝试使用scale(iris),我们会收到错误,因为Species列不是数字且无法标准化:
scale(iris) #Error in colMeans(x, na.rm = TRUE): 'x' must be numeric
但是,可以使用dplyr包仅标准化数据框中的某些变量,同时保持所有其他变量相同。例如,以下代码标准化了Sepal.Width和Sepal.Length变量,同时保持所有其他变量相同:
#load dplyr package library(dplyr) #standardize Sepal.Width and Sepal.Length iris_new <- iris %>% mutate_each_(list(~scale(.) %>% as.vector), vars = c("Sepal.Width","Sepal.Length")) #view first six rows of new data frame head(iris_new) # Sepal.Length Sepal.Width Petal.Length Petal.Width Species #1 -0.8976739 1.01560199 1.4 0.2 setosa #2 -1.1392005 -0.13153881 1.4 0.2 setosa #3 -1.3807271 0.32731751 1.3 0.2 setosa #4 -1.5014904 0.09788935 1.5 0.2 setosa #5 -1.0184372 1.24503015 1.4 0.2 setosa #6 -0.5353840 1.93331463 1.7 0.4 setosa
请注意, Sepal.Length和Sepal.Width已标准化,两个变量的平均值均为 0,标准差为 1,而数据框中的其他三个变量保持不变。