変数のスケールを0-100に変更する


20

PCA手法を使用して、ソーシャルキャピタルインデックスを作成しました。このインデックスは、正と負の両方の値で構成されます。このインデックスを0〜100のスケールに変換/変換して、解釈しやすくしたいと思います。最も簡単な方法を教えてください。



ロジスティック関数ロジットモデルで使用されるだけでなく便利になるかもしれません。特定の目的に依存します。
オンドレイ

2
既存のデータを0〜100にスケーリングすると、将来の(または追加の)データに適用される際のリスクが隠されます。たとえば、consumerreports.org / cro / cars /…を参照してください。ConsumerReportsは次のように書いています。「...私たちは困惑しました。テスラは当初、Consumer Reportsのレーティングシステムで103点を獲得しました。車は新しいベンチマークを設定したので、それを考慮して得点を変更する必要がありました。」
whuber

回答:


33

観測されたm i n o l dおよびm a x o l d値(またはこれらは値の事前に設定された潜在的な境界)を持つ変数(単変量分布)m i n n e wからm a x nの範囲に再スケーリングできます次の式によるe wvminoldmaxoldminnewmaxnew

maxnewminnewmaxoldminold(vmaxold)+maxnew

または

maxnewminnewmaxoldminold(vminold)+minnew


18

Rにはrescalescalesパッケージから既に利用可能な関数もあります。これは、まさにあなたが望むことと@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で機能する2つの関数を次に示します。

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の答えに追加するだけで、このプロセスを(たとえば)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の場合。
ソハイルアクラム

はい-すべての値で機能します-たとえば、 print rescale([-10, -9, -5, 2, 6]) # [0.0, 6.25, 31.25, 75.0, 100.0]
アンドリュータロック

3

インデックスを0〜100の間隔にバインドしないことをお勧めします。これにより、解釈が改善されず、むしろ難しくなります。インデックスの構成要素が負になる可能性がある場合、インデックスが負になる可能性があり、私の意見では、0-100の範囲の低い値よりも構成要素で何が起こっているかを反映しています。


0

For R with standard packages loaded, you may just use scale() from 'base' package:

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) 

use 'as.vector()' to retrieve the scaled x as vector.


3
元の値は負になる可能性があるため、最大値で割るだけでは十分ではありません。質問をより慎重に検討してください。そして、DavidとMikkoが既にその側面を考慮した回答を投稿していることを考えてください。
Glen_b -Reinstate Monica

あなたは絶対に正しい、そのために申し訳ありません。
user161922
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.