Bir değişkenin ölçeğini 0-100 olarak değiştirme


20

PCA tekniğini kullanarak bir sosyal sermaye endeksi oluşturdum. Bu indeks hem pozitif hem de negatif değerleri içerir. Bu dizini yorumlamayı kolaylaştırmak için 0-100 ölçeğine dönüştürmek / dönüştürmek istiyorum. Lütfen bana bunu yapmanın en kolay yolunu önerin.



Lojistik fonksiyon logit modellerinde kullanılan hem işe yarayabilir. Özel amaca bağlıdır.
Ondrej

2
Mevcut verilerin 0-100 arasında ölçeklendirilmesi, gelecekteki (veya ek) verilere uygulanacağı zaman gizli risklere sahiptir. Bkz consumerreports.org/cro/cars/... Tüketici Raporları "yazdığı yer ... bir ikilem karşılaştığı Örneğin: Tesla başlangıçta tanım gereği 100 geçmiş gitmez Consumer Reports' Puanlar sisteminde 103 puan aldı. Araba yeni bir ölçüt belirledi, bu yüzden puanlamamızda değişiklik yapmak zorunda kaldık. "
whuber

Yanıtlar:


33

Herhangi bir değişken (tek değişkenli dağılım) gözlenen ile m ı n O l d ve m , bir X O l d değerleri (ya da bu değerler için potansiyel sınırları önceden olabilir) aralığı yeniden olçeklendirilebilir m ı n , n , e ağırlık için m bir x , n e w aşağıdaki formüle göre:vminoldmaxoldminnewmaxnew

maxnewminnewmaxoldminold(vmaxold)+maxnew

veya

.maxnewminnewmaxoldminold(vminold)+minnew


18

R rescaleiçin ölçekler paketinde zaten tam olarak ne istediğinizi ve @AndrewTulloch ve @ttnphns'ın açıkladığı işlevi de bulabilirsiniz:

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

ilk olarak, bazı örnek verileri alalım:

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

İşte R'de çalışacak iki işlev

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

Veya başka dönüşümler de kullanabilirsiniz. Örneğin, logit dönüşümü @ondrej tarafından belirtildi

plogis(x)*100

veya diğer dönüşümler:

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

4

Sadece ttnphnss'ın cevabına eklemek, bu işlemi Python'da uygulamak için (örneğin), bu işlev hile yapacaktır:

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]

Teşekkürler, bu formül negatif değerler için de geçerli mi? örneğin, orijinal değişkenim -10 ile 10 arasındaysa.
Sohail Akram

Evet - tüm değerler için çalışıyor - örneğin, print rescale([-10, -9, -5, 2, 6]) # [0.0, 6.25, 31.25, 75.0, 100.0]
Andrew Tulloch

3

İndeksi yorumu iyileştirmediği için 0-100 aralığına bağlamamanızı öneririm. Eğer endeks bileşenleri negatif olabilirse, o zaman endeksin negatif olması mümkündür ve bence 0-100 aralığında düşük bir değerden daha iyi bileşenlerle olanları yansıtır.


0

Standart paketlerin yüklü olduğu R için, yalnızca 'temel' paketten scale () kullanabilirsiniz:

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) 

ölçeklendirilmiş x'i vektör olarak almak için 'as.vector ()' kullanın.


3
Orijinal değerler negatif olabileceğinden, en büyük değere bölmek yeterli olmaz. Lütfen soruyu daha dikkatli bir şekilde düşünün ve --- David ve Mikko'nun bu yönü dikkate alan cevaplar yayınladıkları göz önüne alındığında - başparmakların yukarı çıkması için genellikle cevaplarının vermediği bir şeye katkıda bulunmanız gerekir.
Glen_b

Kesinlikle haklısın, bunun için üzgünüm.
user161922
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.