Зміна шкали змінної до 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 to m a x n e w за такою формулою:vмiнолгмахолгмiннешмахнеш

махнеш-мiннешмахолг-мiнолг(v-махолг)+махнеш

або

.махнеш-мiннешмахолг-мiнолг(v-мiнолг)+мiннеш


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.
Sohail Akram

Так - це працює для всіх значень - наприклад, print rescale([-10, -9, -5, 2, 6]) # [0.0, 6.25, 31.25, 75.0, 100.0]
Ендрю Таллок

3

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


0

Для R із завантаженими стандартними пакунками ви можете просто скористатися шкалою () від "базового" пакета:

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 ()', щоб отримати масштабований х як вектор.


3
Оскільки вихідні значення можуть бути негативними, розділення на найбільше значення буде недостатньо. Будь ласка, розгляньте питання більш уважно, і --- з огляду на те, що Девід і Мікко вже опублікували відповіді, які враховують цей аспект - щоб великі пальці піднімалися вгору, вам, як правило, потрібно внести щось, на що їх відповіді не зробили.
Glen_b -Встановити Моніку

Ви абсолютно праві, вибачте за це.
користувач161922
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.