Modification de l'échelle d'une variable à 0-100

20

J'ai construit un indice de capital social en utilisant la technique PCA. Cet indice comprend des valeurs à la fois positives et négatives. Je veux transformer / convertir cet index en échelle 0-100 pour le rendre facile à interpréter. Veuillez me suggérer un moyen le plus simple de le faire.

Sohail Akram
la source
La fonction logistique utilisée dans les modèles logit pourrait également être utile. Dépend d'un objectif spécifique.
Ondrej
2
La mise à l'échelle des données existantes à 0-100 présente des risques cachés lorsqu'elle sera appliquée à des données futures (ou supplémentaires). Voir consumerreports.org/cro/cars/… , par exemple, où Consumer Reports a écrit "... nous avons fait face à un dilemme: la Tesla a initialement marqué 103 dans le système de notation des rapports des consommateurs, qui par définition ne dépasse pas 100. La voiture a établi une nouvelle référence, nous avons donc dû apporter des modifications à notre score pour en tenir compte. "
whuber

Réponses:

33

Toute variable (distribution univariée) avec les valeurs et observées (ou celles-ci pourraient être des limites potentielles prédéfinies pour les valeurs) peut être redimensionnée pour s'étendre de à par la formule suivante:m i n o l d m a x o l d m i n n e w m a x n e wvmjenolmuneXolmjennewmuneXnew

muneXnew-mjennewmuneXol-mjenol(v-muneXol)+muneXnew

ou

muneXnew-mjennewmuneXol-mjenol(v-mjenol)+mjennew .

ttnphns
la source
18

Pour R, il existe également une rescalefonction déjà disponible dans le package échelles , qui fait exactement ce que vous voulez et ce que @AndrewTulloch et @ttnphns ont décrit:

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
Mikko
la source
7

tout d'abord, permet d'obtenir des exemples de données:

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

Voici deux fonctions qui fonctionneront dans R

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

Ou, vous pouvez utiliser d'autres transformations. Par exemple, la transformation logit a été mentionnée par @ondrej

plogis(x)*100

ou, d'autres transformations:

pnorm(x)*100
pnorm(x, 0, 100) * 100
punif(x, min(x), max(x))*100
David LeBauer
la source
4

Juste pour ajouter à la réponse de ttnphnss, pour implémenter ce processus en Python (par exemple), cette fonction fera l'affaire:

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]
Andrew Tulloch
la source
Merci, cette formule s'applique-t-elle également aux valeurs négatives ?? par exemple, si ma variable d'origine varie de -10 à 10.
Sohail Akram
Oui - cela fonctionne pour toutes les valeurs - par exemple, print rescale([-10, -9, -5, 2, 6]) # [0.0, 6.25, 31.25, 75.0, 100.0]
Andrew Tulloch
3

Je suggère de ne pas lier l'index à l'intervalle 0-100, car cela n'améliore pas l'interprétation, mais le rend plus difficile. Si les constituants de l'indice peuvent être négatifs, alors il est possible que l'indice devienne négatif, et il reflète ce qui se passe avec les constituants mieux qu'une valeur faible dans la plage 0-100, à mon avis.

Aksakal
la source
0

Pour R avec des packages standard chargés, vous pouvez simplement utiliser scale () du package 'base':

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) 

utilisez 'as.vector ()' pour récupérer le x mis à l'échelle comme vecteur.

user161922
la source
3
Étant donné que les valeurs d'origine peuvent être négatives, la division par la plus grande valeur ne sera pas suffisante. Veuillez examiner la question plus attentivement et --- étant donné que David et Mikko ont déjà posté des réponses qui tiennent compte de cet aspect - pour que les pouces montent, vous devriez généralement contribuer quelque chose que leurs réponses n'ont pas fait.
Glen_b -Reinstate Monica
Vous avez absolument raison, désolé pour cela.
user161922