การเปลี่ยนสเกลของตัวแปรเป็น 0-100


20

ฉันสร้างดัชนีทุนทางสังคมโดยใช้เทคนิค PCA ดัชนีนี้ประกอบด้วยค่าทั้งบวกและลบ ฉันต้องการแปลง / แปลงดัชนีนี้เป็นมาตราส่วน 0-100 เพื่อให้ตีความได้ง่าย โปรดแนะนำวิธีที่ง่ายที่สุดให้ฉัน


คำถามที่เกี่ยวข้อง: สูตรมาตรฐานสำหรับการคำนวณอย่างรวดเร็วของคะแนน
chl

ฟังก์ชั่นโลจิสติกที่ใช้ในรุ่น logit อาจจะมาในที่มีประโยชน์เช่นกัน ขึ้นอยู่กับวัตถุประสงค์เฉพาะ
Ondrej

2
การปรับขนาดข้อมูลที่มีอยู่เป็น 0-100 นั้นมีความเสี่ยงที่ซ่อนอยู่เมื่อจะนำไปใช้กับข้อมูลในอนาคต (หรือเพิ่มเติม) ดูที่consumerreports.org/cro/cars/…ตัวอย่างเช่นที่ Consumer Reports เขียนว่า "... เราเผชิญกับความไม่แน่นอน: เทสลาได้คะแนน 103 ในระบบการจัดอันดับของผู้บริโภคในขั้นต้นซึ่งตามนิยามไม่เกิน 100 รถตั้งมาตรฐานใหม่ดังนั้นเราจึงต้องทำการเปลี่ยนแปลงการให้คะแนนของเราเพื่อพิจารณา
whuber

คำตอบ:


33

ใด ๆ ตัวแปร (กระจาย univariate) กับสังเกตเมตรฉันn o L dและม. x o L dค่า (หรือเหล่านี้อาจจะตั้งไว้ขอบเขตที่มีศักยภาพสำหรับค่า) สามารถให้ปรับช่วงม. ฉันn n E Wเพื่อเมตรx n อีWจากสูตรดังต่อไปนี้:โวลต์ม.ผมnโอล.dม.axโอล.dม.ผมnnอีWม.axnอีW

ม.axnอีW-ม.ผมnnอีWม.axโอล.d-ม.ผมnโอล.d(โวลต์-ม.axโอล.d)+ม.axnอีW

หรือ

Wม.axnอีW-ม.ผมnnอีWม.axโอล.d-ม.ผมnโอล.d(โวลต์-ม.ผมnโอล.d)+ม.ผมnnอีW


18

สำหรับ R นอกจากนี้ยังมีrescaleฟังก์ชั่นที่พร้อมใช้งานจากแพคเกจเครื่องชั่งซึ่งทำสิ่งที่คุณต้องการอย่างแน่นอนและสิ่งที่ @AndrewTulloch และ @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

ก่อนอื่นมาขอข้อมูลตัวอย่าง:

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

นี่คือสองฟังก์ชันที่จะทำงานใน R

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

หรือคุณสามารถใช้การแปลงอื่น ตัวอย่างเช่นการแปลง logit ถูกกล่าวถึงโดย @ondrej

plogis(x)*100

หรือแปลงอื่น ๆ :

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

4

เพียงเพิ่มคำตอบของ ttnphnss เพื่อใช้กระบวนการนี้ใน Python (ตัวอย่าง) ฟังก์ชั่นนี้จะทำเคล็ดลับ:

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]

ขอบคุณสูตรนี้ใช้กับค่าลบหรือไม่? ตัวอย่างเช่นถ้าตัวแปรดั้งเดิมของฉันอยู่ในช่วง -10 ถึง 10
Sohail Akram

ใช่ - ใช้ได้กับทุกค่า - ตัวอย่างเช่น print rescale([-10, -9, -5, 2, 6]) # [0.0, 6.25, 31.25, 75.0, 100.0]
Andrew Tulloch

3

ฉันขอแนะนำไม่ให้ผูกดัชนีกับช่วงเวลา 0-100 เนื่องจากไม่ปรับปรุงการตีความ แต่ทำให้ยากขึ้น หากองค์ประกอบของดัชนีสามารถลบได้มันเป็นไปได้ที่ดัชนีจะกลายเป็นค่าลบและมันสะท้อนถึงสิ่งที่เกิดขึ้นกับองค์ประกอบที่ดีกว่าค่าต่ำบางอย่างในช่วง 0-100 ในความคิดของฉัน


0

สำหรับ R ที่โหลดแพ็กเกจมาตรฐานคุณสามารถใช้สเกล () จากแพ็คเกจ '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) 

ใช้ 'as.vector ()' เพื่อเรียกค่า x ที่ปรับสเกลเป็นเวกเตอร์


3
เนื่องจากค่าดั้งเดิมอาจเป็นลบการหารด้วยค่าที่มากที่สุดจะไม่เพียงพอ โปรดพิจารณาคำถามให้ละเอียดยิ่งขึ้นและ --- เนื่องจากเดวิดและมิกโกได้โพสต์คำตอบที่คำนึงถึงเรื่องนั้นไว้แล้ว - เพื่อให้นิ้วโป้งขึ้นไปได้โดยทั่วไปคุณต้องมีส่วนร่วมในการตอบคำถาม
Glen_b -Reinstate Monica

คุณพูดถูกต้องขอโทษจริงๆ
161922
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.