scale() 的值范围是多少?

What's the range of values of scale()?

提问人:skidjoe 提问时间:9/19/2020 更新时间:9/19/2020 访问量:545

问:

我正在尝试弄清楚任何比例值之间的值范围?

我有一个 47*2 的数据框,其值如下:

43109 43026 
43857 42904 
43753 43714

我正在该函数上运行 scale()。我试图弄清楚值范围之间的界限。这是固定的,还是随输入而变化?

我认为这些值将在最接近的值之间标准化,这是正确的吗?

对不起,菜鸟的问题。scale() 的文档让我感到困惑。

R 刻度

评论


答:

2赞 Ben Bolker 9/19/2020 #1

默认情况下,减去均值并除以 的标准差。因此,没有固定的最小值/最大值。切比雪夫不等式表示(只要数据的分布具有有限均值和有限非零方差),预计一定比例的值在均值的标准差范围内,因此对于缩放数据,值的绝对值通常小于 。scalex1-1/k^2k1-1/k^2k

由于您有大约 100 个值,因此除了 1 个 (99%) 之外,其他所有值都可能具有 <10,前提是分布不是很疯狂。如果数据呈正态分布,则 99% 的数据将缩放值< 2.58 ()。qnorm((1+0.99)/2)

1赞 Steffen Moritz 9/19/2020 #2

您的意思是使用默认设置? 这些将是:

scale(x, center = TRUE, scale = TRUE)

这里从文档中获取默认设置的相关信息,(重要部分为您标记,不相关部分删除):

如果 center 为 TRUE,则通过从其对应列中减去 x 的列均值(省略 NA)来完成居中,如果 center 为 FALSE,则不进行居中。

比例值决定了如何执行列缩放(居中后)。如果 scale 为 TRUE,则通过 x 的(居中)列除以其标准差来完成缩放。

你可以这样更好地看待这一点

# read in example data for you
aaa <- c(43109,43026, 43857,42904,43753, 43714)

# Get the results for scale
scale(aaa)

正如我所说,默认调用意味着您调用 .scalescale(x, center = T, scale = T)

从您知道的描述中可以看出,它的作用是首先居中,然后对这些居中数据进行缩放。

您可以通过调用以下命令来深入了解这些步骤:

scale(aaa, center = T, scale = F)

这基本上只是给你第一步。

[,1]
[1,] -284.8333
[2,] -367.8333
[3,]  463.1667
[4,] -489.8333
[5,]  359.1667
[6,]  320.1667
attr(,"scaled:center")
[1] 43393.83    

这些是我选择的数据的第一步(居中)的结果()。你可以看到,是列的平均值。行是相应的值减去列均值。例如,对于第一个值,以此类推,对于其他行。43109,43026, 43857,42904,43753, 4371443393.8343109 - 43393.83 = -284.8333

2赞 Alexlok 9/19/2020 #3

使用默认参数

如果 scale 为 TRUE,则通过将 x 的(居中)列除以其标准差(如果 center 为 TRUE)来完成缩放

因此,这意味着如果 Y 是矩阵中一列的向量,那么在该列之后将被 替换为 。您可以验证这一点:scale()(Y - mean(Y))/sd(Y)

mat_scaled1 <- scale(mat)

colmeans <- colMeans(mat)
colsds <- matrixStats::colSds(mat)

mat_scaled2 <- matrix(NA_real_, nrow=20, ncol=20)
for(i in seq_len(ncol(mat))){
  mat_scaled2[,i] <- (mat[,i] - colmeans[i])/colsds[i]
}

all.equal(mat_scaled1, mat_scaled2,check.attributes = FALSE)
#> [1] TRUE

因此,矩阵的值可以远高于标准差(您可以根据上下文将它们称为“异常值”)。如果你真的想知道值的全部范围,你需要除以最大值。

mat_scaled_max <- scale(mat, center = FALSE, scale = matrixStats::colMaxs(mat))

max(mat_scaled_max)
#> [1] 1