Изменение масштаба переменной на 0-100


20

Я построил индекс социального капитала с использованием методики PCA. Этот индекс содержит значения как положительные, так и отрицательные. Я хочу преобразовать / преобразовать этот индекс в масштаб 0-100, чтобы его было легко интерпретировать. Пожалуйста, предложите мне самый простой способ сделать это.



Логистическая функция используется в логит модели может пригодиться , как хорошо. Зависит от конкретной цели.
Ондрей

2
Масштабирование существующих данных до 0-100 имеет скрытые риски, когда они будут применяться к будущим (или дополнительным) данным. См consumerreports.org/cro/cars/... , например, где Consumer Reports пишет»... мы столкнулись с дилеммой: Тесла первоначально набрало 103 в системе рейтингов Потребительского, который по определению не проходит мимо 100. Машина установила новый эталон, поэтому нам пришлось вносить изменения в нашу оценку, чтобы учесть это ».
whuber

Ответы:


33

Любая переменная (одномерное распределение) с наблюдаемыми значениями m i n o l d и m a x o l d (или это могут быть предварительно заданные потенциальные границы значений) может быть изменена в диапазоне от m i n n e w до m a x n e w по следующей формуле:vмяNоLdмaИксоLdмяNNевесмaИксNевес

мaИксNевес-мяNNевесмaИксоLd-мяNоLd(v-мaИксоLd)+мaИксNевес

или

.мaИксNевес-мяNNевесмaИксоLd-мяNоLd(v-мяNоLd)+мяNNевес


18

Для R есть также уже имеющиеся rescaleфункции от чешуи пакета, который делает именно то , что вы хотите и что описано @AndrewTulloch и @ttnphns:

library(scales)
rescale(c(-10, -9, -5, 2, 6), to = c(0, 100)) ## Use scales:::rescale() if you have several packages loaded using the same function name
[1]   0.00   6.25  31.25  75.00 100.00

7

во-первых, давайте возьмем пример данных:

x <- runif(20, -10, 10)

Вот две функции, которые будут работать в R

rescale <- function(x) (x-min(x))/(max(x) - min(x)) * 100
rescale(x)

Или вы можете использовать другие преобразования. Например, преобразование logit было упомянуто @ondrej

plogis(x)*100

или другие преобразования:

pnorm(x)*100
pnorm(x, 0, 100) * 100
punif(x, min(x), max(x))*100

4

Просто добавьте к ответу ttnphnss, чтобы реализовать этот процесс в Python (например), эта функция сделает свое дело:

from __future__ import division

def rescale(values, new_min = 0, new_max = 100):
    output = []
    old_min, old_max = min(values), max(values)

    for v in values:
        new_v = (new_max - new_min) / (old_max - old_min) * (v - old_min) + new_min
        output.append(new_v)

    return output

print rescale([1, 2, 3, 4, 5])
# [0.0, 25.0, 50.0, 75.0, 100.0]

Спасибо, эта формула также применяется к отрицательным значениям? например, если моя исходная переменная находится в диапазоне от -10 до 10.
Сохаил Акрам

Да - это работает для всех значений - например, print rescale([-10, -9, -5, 2, 6]) # [0.0, 6.25, 31.25, 75.0, 100.0]
Эндрю Таллох

3

Я предлагаю не привязывать индекс к интервалу 0-100, так как это не улучшает интерпретацию, а скорее усложняет ее. Если составляющие индекса могут быть отрицательными, то вполне возможно, что индекс становится отрицательным, и он отражает то, что происходит с составляющими, лучше, чем какое-то низкое значение в диапазоне 0-100, на мой взгляд.


0

Для R с загруженными стандартными пакетами вы можете просто использовать scale () из базового пакета:

x=c(2,4,8,16)
x.scaled = scale(x,FALSE,max(x))  # divide each value in x by max(x)
x.scaled = as.vector(x.scaled) 

используйте as.vector (), чтобы получить масштабированный x как вектор.


3
Поскольку исходные значения могут быть отрицательными, деления на наибольшее значение будет недостаточно. Пожалуйста, рассмотрите вопрос более тщательно, и, учитывая, что Дэвид и Микко уже опубликовали ответы, в которых учитывается этот аспект, - чтобы получить одобрение, вам, как правило, нужно внести что-то, чего не дали их ответы.
Glen_b

Вы абсолютно правы, извините за это.
user161922
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.