重新缩放一个变量,中位数为 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)
我是统计学的新手,如果这个问题很琐碎,请原谅我
我有一个正态分布的变量,范围在 -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)