ฉันสร้างดัชนีทุนทางสังคมโดยใช้เทคนิค PCA ดัชนีนี้ประกอบด้วยค่าทั้งบวกและลบ ฉันต้องการแปลง / แปลงดัชนีนี้เป็นมาตราส่วน 0-100 เพื่อให้ตีความได้ง่าย โปรดแนะนำวิธีที่ง่ายที่สุดให้ฉัน
ฉันสร้างดัชนีทุนทางสังคมโดยใช้เทคนิค PCA ดัชนีนี้ประกอบด้วยค่าทั้งบวกและลบ ฉันต้องการแปลง / แปลงดัชนีนี้เป็นมาตราส่วน 0-100 เพื่อให้ตีความได้ง่าย โปรดแนะนำวิธีที่ง่ายที่สุดให้ฉัน
คำตอบ:
ใด ๆ ตัวแปร (กระจาย univariate) กับสังเกตเมตรฉันn o L dและม. x o L dค่า (หรือเหล่านี้อาจจะตั้งไว้ขอบเขตที่มีศักยภาพสำหรับค่า) สามารถให้ปรับช่วงม. ฉันn n E Wเพื่อเมตรx n อีWจากสูตรดังต่อไปนี้:
หรือ
W
สำหรับ 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
ก่อนอื่นมาขอข้อมูลตัวอย่าง:
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
เพียงเพิ่มคำตอบของ 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]
print rescale([-10, -9, -5, 2, 6])
# [0.0, 6.25, 31.25, 75.0, 100.0]
ฉันขอแนะนำไม่ให้ผูกดัชนีกับช่วงเวลา 0-100 เนื่องจากไม่ปรับปรุงการตีความ แต่ทำให้ยากขึ้น หากองค์ประกอบของดัชนีสามารถลบได้มันเป็นไปได้ที่ดัชนีจะกลายเป็นค่าลบและมันสะท้อนถึงสิ่งที่เกิดขึ้นกับองค์ประกอบที่ดีกว่าค่าต่ำบางอย่างในช่วง 0-100 ในความคิดของฉัน
สำหรับ 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 ที่ปรับสเกลเป็นเวกเตอร์