Modifica della scala di una variabile su 0-100


20

Ho costruito un indice di capitale sociale usando la tecnica PCA. Questo indice comprende valori sia positivi che negativi. Voglio trasformare / convertire questo indice in scala 0-100 per facilitarne l'interpretazione. Per favore, suggeriscimi un modo più semplice per farlo.



Anche la funzione logistica utilizzata nei modelli logit potrebbe essere utile. Dipende da uno scopo specifico.
Ondrej,

2
Il ridimensionamento dei dati esistenti su 0-100 comporta rischi nascosti quando saranno applicati a dati futuri (o aggiuntivi). Vedi consumerreports.org/cro/cars/… , ad esempio, dove Consumer Reports ha scritto "... abbiamo dovuto affrontare un dilemma: inizialmente Tesla ha ottenuto 103 punti nel sistema di valutazione dei Consumer Reports, che per definizione non supera i 100. L'auto ha fissato un nuovo punto di riferimento, quindi abbiamo dovuto apportare modifiche al nostro punteggio per renderlo conto ".
whuber

Risposte:


33

Qualsiasi variabile (distribuzione univariata) con e osservati (o questi potrebbero essere limiti potenziali preimpostati per i valori) può essere ridimensionata per variare da a con la seguente formula:m i n o l d m a x o l d m i n n e w m a x n e wvmionoldmun'Xoldmionnewmun'Xnew

mun'Xnew-mionnewmun'Xold-mionold(v-mun'Xold)+mun'Xnew

o

mun'Xnew-mionnewmun'Xold-mionold(v-mionold)+mionnew .


18

Per R esiste anche una rescalefunzione già disponibile dal pacchetto scale , che fa esattamente quello che vuoi e quello che @AndrewTulloch e @ttnphns hanno descritto:

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

per prima cosa, otteniamo alcuni dati di esempio:

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

Ecco due funzioni che funzioneranno in R

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

O potresti usare altre trasformazioni. Ad esempio, la trasformazione del logit è stata menzionata da @ondrej

plogis(x)*100

o altre trasformazioni:

pnorm(x)*100
pnorm(x, 0, 100) * 100
punif(x, min(x), max(x))*100

4

Solo per aggiungere alla risposta di ttnphnss, per implementare questo processo in Python (per esempio), questa funzione farà il trucco:

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]

Grazie, questa formula si applica anche ai valori negativi ?? ad esempio, se la mia variabile originale varia da -10 a 10.
Sohail Akram,

Sì - funziona per tutti i valori - per esempio, print rescale([-10, -9, -5, 2, 6]) # [0.0, 6.25, 31.25, 75.0, 100.0]
Andrew Tulloch

3

Suggerisco di non associare l'indice all'intervallo 0-100, poiché non migliora l'interpretazione, ma piuttosto lo rende più difficile. Se i componenti dell'indice possono essere negativi, è possibile che l'indice diventi negativo e rifletta ciò che sta succedendo con i componenti meglio di un valore basso nell'intervallo 0-100, secondo me.


0

Per R con pacchetti standard caricati, puoi semplicemente usare scale () dal pacchetto '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) 

usa 'as.vector ()' per recuperare la x in scala come vettore.


3
Poiché i valori originali possono essere negativi, la divisione per il valore più grande non sarà sufficiente. Ti preghiamo di considerare la domanda con più attenzione e, dato che David e Mikko hanno già pubblicato risposte che tengono conto di quell'aspetto, per ottenere il pollice in su, in genere dovresti contribuire con qualcosa che le loro risposte non hanno fatto.
Glen_b

Hai assolutamente ragione, scusa per quello.
user161922
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.