重新缩放一个变量,中位数为 1,最小值为 0,最大值没有限制

Rescale a variable with median 1, minimum value 0 and no limit on the maximum value

我是统计学的新手,如果这个问题很琐碎,请原谅我

我有一个正态分布的变量,范围在 -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)) 

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

澄清一下,在真实数据中,权重的负值完全反映了权重的正值。理想情况下,一旦我对数据进行了标准化,我希望将相同的数字乘以权重的最大值和最小值,increase/decrease 值将按相同的比例。 例如,对于我的体重的最大值 (10) 和最小值,响应变量的值为 5,最小值应为 0.1,因此 5*10 和 5*0.1 将与比例 increase/decrease 我原来价值的 10 倍。

我提前感谢你能提供的所有帮助

最佳

一种选择是使用指数变换。你所有的负值都在 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)