Cambiar la escala de una variable a 0-100

20

He construido un índice de capital social utilizando la técnica PCA. Este índice comprende valores tanto positivos como negativos. Quiero transformar / convertir este índice a escala 0-100 para que sea fácil de interpretar. Por favor sugiérame una forma más fácil de hacerlo.

Sohail Akram
fuente
La función logística utilizada en los modelos logit también podría ser útil. Depende de un propósito específico.
Ondrej
2
Escalar los datos existentes a 0-100 tiene riesgos ocultos cuando se aplicarán a datos futuros (o adicionales). Vea consumerreports.org/cro/cars/… , por ejemplo, donde Consumer Reports escribió "... enfrentamos un dilema: Tesla inicialmente obtuvo un puntaje de 103 en el sistema de calificaciones de Consumer Reports, que por definición no supera los 100. El auto estableció un nuevo punto de referencia, por lo que tuvimos que hacer cambios en nuestra puntuación para tenerlo en cuenta ".
whuber

Respuestas:

33

Cualquier variable (distribución univariada) con los y observados (o estos podrían ser límites potenciales preestablecidos para los valores) se puede reescalar al rango a mediante la siguiente fórmula:m i n o l d m a x o l d m i n n e w m a x n e wvmetroyonorteolremetrounaXolremetroyonortenortemiwmetrounaXnortemiw

metrounaXnortemiw-metroyonortenortemiwmetrounaXolre-metroyonorteolre(v-metrounaXolre)+metrounaXnortemiw

o

metrounaXnortemiw-metroyonortenortemiwmetrounaXolre-metroyonorteolre(v-metroyonorteolre)+metroyonortenortemiw .

ttnphns
fuente
18

Para R también hay una rescalefunción disponible del paquete de escalas , que hace exactamente lo que desea y lo que @AndrewTulloch y @ttnphns describieron:

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

Primero, obtengamos algunos datos de ejemplo:

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

Aquí hay dos funciones que funcionarán en R

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

O bien, podría usar otras transformaciones. Por ejemplo, la transformación logit fue mencionada por @ondrej

plogis(x)*100

o, otras transformaciones:

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

Solo para agregar a la respuesta de ttnphnss, para implementar este proceso en Python (por ejemplo), esta función hará el truco:

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
fuente
Gracias, ¿esta fórmula también se aplica a valores negativos? por ejemplo, si mi variable original varía de -10 a 10.
Sohail Akram
Sí - que funciona para todos los valores - por ejemplo, print rescale([-10, -9, -5, 2, 6]) # [0.0, 6.25, 31.25, 75.0, 100.0]
Andrew Tulloch
3

Sugiero no vincular el índice al intervalo 0-100, ya que no mejora la interpretación, sino que lo hace más difícil. Si los componentes del índice pueden ser negativos, entonces es posible que el índice se vuelva negativo, y en mi opinión refleja lo que está sucediendo con los componentes mejor que algún valor bajo en el rango 0-100.

Aksakal
fuente
0

Para R con paquetes estándar cargados, puede usar scale () del paquete '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) 

use 'as.vector ()' para recuperar la x escalada como vector.

usuario161922
fuente
3
Como los valores originales pueden ser negativos, dividir por el valor más grande no será suficiente. Considere la pregunta con más cuidado, y dado que David y Mikko ya han publicado respuestas que tienen en cuenta ese aspecto, para obtener los pulgares para subir, generalmente necesitaría contribuir con algo que sus respuestas no hicieron.
Glen_b -Reinstale a Monica el
Tienes toda la razón, lo siento.
user161922