Ä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.



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


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

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

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]

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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.