Alterando a escala de uma variável para 0-100

20

Eu construí um índice de capital social usando a técnica PCA. Este índice compreende valores positivos e negativos. Desejo transformar / converter esse índice em uma escala de 0 a 100 para facilitar a interpretação. Sugira-me uma maneira mais fácil de fazer isso.

Sohail Akram
fonte
A função logística usada nos modelos de logit também pode ser útil. Depende de finalidade específica.
Ondrej
2
Escalar os dados existentes para 0-100 apresenta riscos ocultos quando serão aplicados a dados futuros (ou adicionais). Veja consumerreports.org/cro/cars/… , por exemplo, onde a Consumer Reports escreveu "... enfrentamos um dilema: o Tesla inicialmente obteve 103 pontos no sistema de classificação dos Consumer Reports ', que por definição não ultrapassa 100. O carro estabeleceu uma nova referência, então tivemos que fazer alterações na nossa pontuação para dar conta disso. "
whuber

Respostas:

33

Qualquer variável (distribuição univariada) com observada m i n o l d e m um x o l d valores (ou estes podem ser pré-ajustados potenciais limites para os valores) pode ser adaptada a gama m i n n e w a m um x n e w pela seguinte fórmula:vmEunoeudmumaxoeudmEunneWmumaxneW

mumaxneW-mEunneWmumaxoeud-mEunoeud(v-mumaxoeud)+mumaxneW

ou

.mumaxneW-mEunneWmumaxoeud-mEunoeud(v-mEunoeud)+mEunneW

ttnphns
fonte
18

Para R, também já existe uma rescalefunção disponível no pacote de escalas , que faz exatamente o que você deseja e o que @AndrewTulloch e @ttnphns descrevem:

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

primeiro, vamos obter alguns dados de exemplo:

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

Aqui estão duas funções que funcionarão em R

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

Ou você pode usar outras transformações. Por exemplo, a transformação logit foi mencionada por @ondrej

plogis(x)*100

ou, outras transformações:

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

Apenas para adicionar à resposta do ttnphnss, implementar este processo no Python (por exemplo), esta função fará o seguinte:

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
fonte
Obrigado, esta fórmula também se aplica a valores negativos? por exemplo, se minha variável original variar de -10 a 10.
Sohail Akram
Sim - ele funciona para todos os valores - por exemplo, print rescale([-10, -9, -5, 2, 6]) # [0.0, 6.25, 31.25, 75.0, 100.0]
Andrew Tulloch
3

Sugiro não vincular o índice ao intervalo de 0 a 100, pois isso não melhora a interpretação, mas torna mais difícil. Se os constituintes do índice puderem ser negativos, é possível que o índice se torne negativo e reflita o que está acontecendo com os constituintes melhor do que algum valor baixo no intervalo de 0 a 100, na minha opinião.

Aksakal
fonte
0

Para R com pacotes padrão carregados, você pode apenas usar scale () do pacote '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 o x escalado como vetor.

user161922
fonte
3
Como os valores originais podem ser negativos, a divisão pelo maior valor não será suficiente. Por favor, considere a pergunta com mais cuidado e --- dado que David e Mikko já postaram respostas que levam esse aspecto em consideração - para obter polegares para cima, geralmente é necessário contribuir com algo que suas respostas não o fizeram.
Glen_b -Reinstala Monica
Você está absolutamente certo, desculpe por isso.
user161922