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.



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


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

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

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]

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.


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.