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.



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 .


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

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

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]

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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.