Thay đổi thang đo của biến thành 0-100


20

Tôi đã xây dựng một chỉ số vốn xã hội bằng cách sử dụng kỹ thuật PCA. Chỉ số này bao gồm các giá trị cả tích cực và tiêu cực. Tôi muốn chuyển đổi / chuyển đổi chỉ số này thành tỷ lệ 0-100 để dễ hiểu. Xin đề nghị cho tôi một cách dễ nhất để làm như vậy.



Hàm logistic được sử dụng trong các mô hình logit cũng có thể có ích. Phụ thuộc vào mục đích cụ thể.
Ondrej

2
Thu nhỏ dữ liệu hiện có thành 0-100 có rủi ro tiềm ẩn khi nó sẽ được áp dụng cho dữ liệu trong tương lai (hoặc bổ sung). Xem consumerreports.org/cro/cars/... , ví dụ, nơi tạp chí Consumer Reports đã viết" ... chúng ta phải đối mặt với một tình thế khó khăn: Các Tesla ban đầu ghi 103 trong hệ thống Ratings các tạp chí Consumer Reports', mà theo định nghĩa không đi qua 100. Chiếc xe đã thiết lập một chuẩn mực mới, vì vậy chúng tôi đã phải thay đổi cách tính điểm của mình để tính đến nó. "
whuber

Câu trả lời:


33

Bất kỳ biến nào (phân phối đơn biến) với các giá trị và được quan sát (hoặc chúng có thể được đặt lại giới hạn tiềm năng cho các giá trị) có thể được định cỡ lại thành phạm vi đến theo công thức sau:m i n o l d m a x o l d m i n n e w m a x n e wvmtôinotôidmmộtxotôidmtôinnewmmộtxnew

mmộtxnew-mtôinnewmmộtxotôid-mtôinotôid(v-mmộtxotôid)+mmộtxnew

hoặc là

mmộtxnew-mtôinnewmmộtxotôid-mtôinotôid(v-mtôinotôid)+mtôinnew .


18

Đối với R cũng đã có sẵn rescalechức năng từ gói quy mô , thực hiện chính xác những gì bạn muốn và những gì @AndrewTulloch và @ttnphns đã mô tả:

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

đầu tiên, hãy lấy một số dữ liệu mẫu:

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

Đây là hai chức năng sẽ hoạt động trong R

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

Hoặc, bạn có thể sử dụng các biến đổi khác. Ví dụ: biến đổi logit được đề cập bởi @ondrej

plogis(x)*100

hoặc, các biến đổi khác:

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

4

Chỉ cần thêm vào câu trả lời của ttnphnss, để thực hiện quy trình này trong Python (ví dụ), hàm này sẽ thực hiện thủ thuật:

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]

Cảm ơn, công thức này cũng áp dụng cho các giá trị âm ?? ví dụ: nếu biến ban đầu của tôi nằm trong khoảng từ -10 đến 10.
Sohail Akram

Có - nó hoạt động cho tất cả các giá trị - ví dụ: print rescale([-10, -9, -5, 2, 6]) # [0.0, 6.25, 31.25, 75.0, 100.0]
Andrew Tulloch

3

Tôi đề nghị không ràng buộc chỉ số với khoảng 0-100, vì nó không cải thiện việc giải thích, mà là làm cho nó khó khăn hơn. Nếu các thành phần chỉ số có thể âm, thì theo tôi, có thể chỉ số đó trở thành âm và nó phản ánh những gì đang diễn ra với các thành phần tốt hơn một số giá trị thấp trong phạm vi 0-100, theo ý kiến ​​của tôi.


0

Đối với R với các gói tiêu chuẩn được tải, bạn chỉ có thể sử dụng thang đo () từ gói 'cơ sở':

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) 

sử dụng 'as.vector ()' để lấy tỷ lệ x dưới dạng vectơ.


3
Vì các giá trị ban đầu có thể âm, nên chia cho giá trị lớn nhất sẽ không đủ. Vui lòng xem xét câu hỏi cẩn thận hơn và --- đưa ra David và Mikko đã đăng câu trả lời có tính đến khía cạnh đó - để đưa ngón tay cái đi lên, bạn thường cần đóng góp điều gì đó mà câu trả lời của họ không có.
Glen_b -Reinstate Monica

Bạn hoàn toàn đúng, xin lỗi vì điều đó.
dùng161922
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.