Mengubah skala variabel menjadi 0-100

20

Saya telah membangun indeks modal sosial menggunakan teknik PCA. Indeks ini terdiri dari nilai-nilai positif dan negatif. Saya ingin mengubah / mengonversi indeks ini ke skala 0-100 agar mudah ditafsirkan. Tolong sarankan saya cara termudah untuk melakukannya.

Sohail Akram
sumber
Fungsi logistik yang digunakan dalam model logit mungkin berguna juga. Tergantung pada tujuan tertentu.
Ondrej
2
Penskalaan data yang ada ke 0-100 memiliki risiko tersembunyi saat akan diterapkan ke data yang akan datang (atau tambahan). Lihat consumerreports.org/cro/cars/… , misalnya, di mana Consumer Reports menulis "... kami menghadapi kesulitan: Tesla awalnya mencetak 103 dalam sistem Peringkat Laporan Konsumen, yang menurut definisi tidak melampaui 100. Mobil itu menetapkan patokan baru, jadi kami harus melakukan perubahan pada skor kami untuk memperhitungkannya. "
whuber

Jawaban:

33

Setiap variabel (distribusi univariat) dengan yang diamati m i n o l d dan m sebuah x o l d nilai-nilai (atau ini bisa diatur batas potensi nilai-nilai) dapat Rescaled untuk berbagai m i n n e w untuk m sebuah x n e w dengan rumus berikut:vmsayanHaildmSebuahxHaildmsayannewmSebuahxnew

mSebuahxnew-msayannewmSebuahxHaild-msayanHaild(v-mSebuahxHaild)+mSebuahxnew

atau

.mSebuahxnew-msayannewmSebuahxHaild-msayanHaild(v-msayanHaild)+msayannew

ttnphns
sumber
18

Untuk R ada juga rescalefungsi yang sudah tersedia dari paket skala , yang melakukan persis apa yang Anda inginkan dan apa yang dijelaskan oleh @AndrewTulloch dan @ttnphns:

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

pertama, mari kita ambil beberapa contoh data:

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

Berikut adalah dua fungsi yang akan berfungsi di R

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

Atau, Anda bisa menggunakan transformasi lain. Misalnya, transformasi logit disebutkan oleh @ondrej

plogis(x)*100

atau, transformasi lainnya:

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

Hanya untuk menambahkan jawaban ttnphnss, untuk mengimplementasikan proses ini dengan Python (misalnya), fungsi ini akan melakukan trik:

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
sumber
Terima kasih, apakah rumus ini juga berlaku pada nilai negatif ?? misalnya, jika variabel asli saya berkisar dari -10 hingga 10.
Sohail Akram
Ya - itu bekerja untuk semua nilai - misalnya, print rescale([-10, -9, -5, 2, 6]) # [0.0, 6.25, 31.25, 75.0, 100.0]
Andrew Tulloch
3

Saya menyarankan untuk tidak mengikat indeks ke interval 0-100, karena tidak meningkatkan interpretasi, tetapi membuatnya lebih sulit. Jika konstituen indeks bisa negatif, maka ada kemungkinan indeks menjadi negatif, dan itu mencerminkan apa yang terjadi dengan konstituen yang lebih baik daripada beberapa nilai rendah di kisaran 0-100, menurut saya.

Aksakal
sumber
0

Untuk R dengan paket standar dimuat, Anda bisa menggunakan skala () dari paket '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) 

gunakan 'as.vector ()' untuk mengambil x yang diskalakan sebagai vektor.

pengguna161922
sumber
3
Karena nilai asli bisa negatif, membaginya dengan nilai terbesar tidak akan cukup. Harap pertimbangkan pertanyaan ini dengan lebih hati-hati, dan --- mengingat David dan Mikko telah memposting jawaban yang mempertimbangkan aspek itu - untuk mendapatkan jempol naik, Anda umumnya harus menyumbangkan sesuatu jawaban mereka tidak.
Glen_b -Reinstate Monica
Anda benar sekali, maaf untuk itu.
user161922