【问题标题】:How can I rescale my variable so that its median is 0, its min does not exceed -1 and its max does not exceed +1?如何重新调整我的变量,使其中位数为 0,最小值不超过 -1,最大值不超过 +1?
【发布时间】:2021-07-10 17:28:37
【问题描述】:

我正在尝试创建箱线图,其中我的变量的中位数对齐为 0。它们的范围不必固定在 [-1, 1],但我希望它们的最小值和最大值落在这个范围内。有什么可以使用的操作吗?

我能够在 [-1, 1] 中标准化我的变量,但我的目标是使中位数对齐为 0,并且它们的范围正好落在(不固定在)[-1, 1] 内。

【问题讨论】:

  • 您可以考虑将向量移动中位数并按移动数字的最大值进行缩放

标签: r range center scaling median


【解决方案1】:

这里有一个函数可以做到这一点。它找到离中位数较远的极端值,然后使用中位数和与中位数的最大距离将所有内容缩放到 -1 和 1 之间的范围内,中位数在中心。如果数据没有范围(即 min = median = max),这将中断,因为这将导致无限的重新缩放因子,但我不确定在这种情况下预期的行为应该是什么。

rescale_center_median <- function(my_numbers) {
  my_median = median(my_numbers, na.rm = TRUE)
  my_range = range(my_numbers, na.rm = TRUE)
  scale_factor = max(abs(my_range-my_median))
  (my_numbers - my_median) / scale_factor
}

测试:

set.seed(42)
rescale_center_median(rnorm(10))
# [1]  0.60393025 -0.58015650 -0.01258313  0.15241963  0.01258313 -0.29963620  0.68991628
# [8] -0.29262249  1.00000000 -0.27308102
median(scaled_numbers)
#[1] 0
> range(scaled_numbers)
[1] -0.4922334  1.0000000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2013-09-09
    相关资源
    最近更新 更多