如何在 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.WidthSepal.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.LengthSepal.Width已标准化,两个变量的平均值均为 0,标准差为 1,而数据框中的其他三个变量保持不变。

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注