एक चर के पैमाने को 0-100 में बदलना


20

मैंने पीसीए तकनीक का उपयोग करके एक सामाजिक पूंजी सूचकांक का निर्माण किया है। इस सूचकांक में सकारात्मक और नकारात्मक दोनों तरह के मूल्य शामिल हैं। मैं इस इंडेक्स को 0-100 स्केल में बदलना / परिवर्तित करना चाहता हूं ताकि व्याख्या करना आसान हो जाए। कृपया मुझे ऐसा करने का एक आसान तरीका सुझाएं।



रसद समारोह logit मॉडल में इस्तेमाल किया काम में रूप में अच्छी तरह आ सकते हैं। विशिष्ट उद्देश्य पर निर्भर करता है।
ओन्ड्रेज

2
मौजूदा डेटा को 0-100 पर स्केल करने से भविष्य में (या अतिरिक्त) डेटा पर लागू होने पर जोखिम छिपा होता है। देखें consumerreports.org/cro/cars/... उदाहरण के लिए, जहां उपभोक्ता रिपोर्ट लिखा था "... हम एक उलझन का सामना करना पड़ा: THE टेस्ला शुरू में उपभोक्ता रिपोर्ट 'रेटिंग प्रणाली है, जो परिभाषा द्वारा पिछले 100 नहीं जाता में 103 रन बनाए। कार ने एक नया बेंचमार्क सेट किया, इसलिए हमें इसके लिए अपने स्कोरिंग में बदलाव करना पड़ा। "
whuber

जवाबों:


33

किसी भी चर (univariate वितरण) मनाया के साथ मीटर मैं एन एल डी और मीटर एक एक्स एल डी मूल्यों (या इन मूल्यों के लिए संभावित सीमा पूर्व निर्धारित किया जा सकता है) सीमा पर पुनः पैमाना जा सकती मीटर मैं एन एन डब्ल्यू करने के लिए मीटर एक एक्स n निम्नलिखित सूत्र द्वारा w :vमैंnएलएक्सएलमैंnnwएक्सnw

एक्सnw-मैंnnwएक्सएल-मैंnएल(v-एक्सएल)+एक्सnw

या

एक्सnw-मैंnnwएक्सएल-मैंnएल(v-मैंnएल)+मैंnnw


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)

या, आप अन्य परिवर्तनों का उपयोग कर सकते हैं। उदाहरण के लिए, लॉन्ड ट्रांसफॉर्म का उल्लेख @ondrej द्वारा किया गया था

plogis(x)*100

या, अन्य परिवर्तन:

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

4

पायथन में इस प्रक्रिया को लागू करने के लिए बस ttnphnss के उत्तर को जोड़ना, उदाहरण के लिए, यह फ़ंक्शन निम्न होगा:

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 तक है।
सोहेल अकरम

हां - यह सभी मूल्यों के लिए काम करता है - उदाहरण के लिए, print rescale([-10, -9, -5, 2, 6]) # [0.0, 6.25, 31.25, 75.0, 100.0]
एंड्रयू तुललोच

3

मैं सुझाव देता हूं कि इंडेक्स को 0-100 के अंतराल पर न बांधें, क्योंकि यह व्याख्या में सुधार नहीं करता है, बल्कि इसे और अधिक कठिन बना देता है। यदि सूचकांक घटक नकारात्मक हो सकते हैं, तो यह संभव है कि सूचकांक नकारात्मक हो जाए, और यह दर्शाता है कि 0-100 रेंज में कुछ कम मूल्य से बेहतर घटकों के साथ क्या हो रहा है, मेरी राय में।


0

R के लिए मानक पैकेज लोड किए गए हैं, आप बस 'आधार' पैकेज से स्केल () का उपयोग कर सकते हैं:

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) 

वेक्टर के रूप में स्केल किए गए x को पुनः प्राप्त करने के लिए 'as.vector ()' का उपयोग करें।


3
चूंकि मूल मूल्य नकारात्मक हो सकते हैं, इसलिए सबसे बड़े मूल्य से विभाजित करना पर्याप्त नहीं होगा। कृपया प्रश्न पर अधिक ध्यान से विचार करें, और --- दिए गए डेविड और मिको ने पहले ही उत्तर पोस्ट कर दिए हैं जो उस पहलू को ध्यान में रखते हैं - ऊपर जाने के लिए अंगूठे प्राप्त करने के लिए, आपको आमतौर पर कुछ योगदान करने की आवश्यकता होगी जो उनके उत्तर में नहीं थे।
Glen_b -Reinstate मोनिका

आप बिल्कुल सही हैं, इसके लिए क्षमा करें।
user161922
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.