Ändern der Skalierung einer Variablen auf 0-100

20

Ich habe einen Sozialkapitalindex mit PCA-Technik erstellt. Dieser Index umfasst sowohl positive als auch negative Werte. Ich möchte diesen Index in eine Skala von 0-100 umwandeln, um die Interpretation zu vereinfachen. Bitte schlagen Sie mir den einfachsten Weg vor.

Sohail Akram
quelle
Die in logit-Modellen verwendete Logistikfunktion kann ebenfalls nützlich sein. Hängt vom spezifischen Zweck ab.
Ondrej
2
Das Skalieren vorhandener Daten auf 0-100 birgt verborgene Risiken, wenn sie auf zukünftige (oder zusätzliche) Daten angewendet werden. Siehe beispielsweise consumerreports.org/cro/cars/… , wo Consumer Reports schrieb: "... wir standen vor einem Dilemma: Der Tesla erzielte ursprünglich 103 im Bewertungssystem der Consumer Reports, was per Definition nicht über 100 hinausgeht. Das Auto setzte neue Maßstäbe, deshalb mussten wir unsere Wertung ändern, um dies zu berücksichtigen. "
Whuber

Antworten:

33

Irgendeine Variable (univariate Verteilung) mit beobachteten m i n o l d und m a x o l d - Wert (oder diese Potentialgrenzen für Werte voreingestellt werden kann) kann auf einen Bereich neu skaliert wird m i n n e w an m a x n e w nach folgender Formel:vminoldmaxOldminnewmaxnew

meinxnew-michnnewmeinxOld-michnOld(v-meinxOld)+meinxnew

oder

.meinxnew-michnnewmeinxOld-michnOld(v-michnOld)+michnnew

ttnphns
quelle
18

Für R gibt es auch bereits vorhandene rescaleFunktion von Skalen - Paket, das genau das tut , was Sie wollen und was @AndrewTulloch und @ttnphns beschrieben:

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
quelle
7

Lassen Sie uns zunächst einige Beispieldaten abrufen:

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

Hier sind zwei Funktionen, die in R funktionieren

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

Oder Sie könnten andere Transformationen verwenden. Zum Beispiel wurde die logit-Transformation von @ondrej erwähnt

plogis(x)*100

oder andere Transformationen:

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

Nur um die Antwort von ttnphnss zu ergänzen, um diesen Prozess in Python zu implementieren (zum Beispiel), wird diese Funktion den Trick machen:

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
quelle
Danke, gilt diese Formel auch für negative Werte? Zum Beispiel, wenn meine ursprüngliche Variable zwischen -10 und 10 liegt.
Sohail Akram
Ja - es funktioniert für alle Werte - zum Beispiel print rescale([-10, -9, -5, 2, 6]) # [0.0, 6.25, 31.25, 75.0, 100.0]
Andrew Tulloch
3

Ich empfehle, den Index nicht an ein Intervall von 0 bis 100 zu binden, da dies die Interpretation nicht verbessert, sondern vielmehr erschwert. Wenn die Indexbestandteile negativ sein können, ist es möglich, dass der Index negativ wird, und er spiegelt meiner Meinung nach wider, was mit Bestandteilen besser als ein niedriger Wert im Bereich von 0 bis 100 vor sich geht.

Aksakal
quelle
0

Für R mit geladenen Standardpaketen können Sie einfach scale () aus dem Basispaket verwenden:

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) 

Verwenden Sie 'as.vector ()', um das skalierte x als Vektor abzurufen.

user161922
quelle
3
Da die ursprünglichen Werte negativ sein können, reicht eine Division durch den größten Wert nicht aus. Bitte überlegen Sie sich die Frage genauer und - da David und Mikko bereits Antworten veröffentlicht haben, die diesen Aspekt berücksichtigen - müssen Sie in der Regel etwas beitragen, damit die Daumen nach oben gehen.
Glen_b
Sie haben absolut Recht, tut mir leid.
user161922