重新定标变量的中位数为1,最小值为0,最大值没有限制

时间:2019-04-18 18:08:03

标签: r range rescale

我是统计学的新手,所以如果这个问题不重要,请原谅我

我有一个正态分布的变量,范围在-15到+15之间,如下所示:

 df <- data.frame("weight" = runif(1000, min=-15, max=15), stringsAsFactors = FALSE)

此变量的中位数和平均值为0。

我需要转换此变量以将其用作回归中的权重。出于实质性原因,在我的变量中具有负值没有任何意义(它本身是先前转换的结果)。 我的变量的负值应仅减少主要解释变量的影响(因此应限制在0和1之间),而正值应对我的解释变量产生乘数影响(大于1)。虽然值接近我的权重0应该不会对我的解释变量产生影响(接近1)。

因此,我想将变量居中,以使体重的最小值为0,中位数为1,而我不想在最大值上施加约束,认为这样做必将更改均值(它将变得大于1)。只要中位数保持为1,我就不必担心。

到目前为止,我已经考虑过将0到2之间的变量标准化

 library(BBmisc)
 df$normalizedweight <- normalize(df$weight, method = "range",
        range = c(0, 2)) 

但是,此操作对我的归一化变量施加了不必要的约束,因为我的体重影响可能大于2倍,而

为了澄清,在实际数据中,权重的负值完美地反映了权重的正值。理想情况下,一旦我对数据进行了标准化,我希望将相同的数字乘以权重的最大值和最小值,就可以按相同的比例增加/减少该值。 例如,对于我的体重的最大值(10)和最小值,都将响应变量的值设为5,则最小值应为0.1,以便5 * 10和5 * 0.1分别为和成比例地增加/减少是我原始价值的十分之一。

在此先感谢您能提供的所有帮助

最佳

1 个答案:

答案 0 :(得分:1)

一个选项是使用指数转换。您所有的负值都将在0到1之间,并且所有正值都将超过1。中位数将接近1。 此外,由于exp()会产生很大的值(exp(15) = 3 269 017),因此您可以先将其值除以最大值。

sample <- runif(10000, min=-15, max=15)

sample_transform = exp(sample / max(sample))
median(sample_transform)
# [1] 0.9930663
hist(sample_transform)

enter image description here