2009-04-03 11 views
2

標準スコアのヒストグラムを生成するために使用したい数値の束があります。ヒストグラムの番号をグループ化する

。したがってIこの式

X」=(X-平均)/ std_dev

結果と各Xを意味し、数値の標準偏差を計算し、正規-4との間の数であります4.その結果をグラフ化したい。私は小さい棒に避けるために数字をグループ化する方法を探しています。

私の計画、すなわちconsecutavice四半期ユニットを中心区間[-4,4]内のビンを持つことである[-4、-3.75、...、3.75,4]

例:0.1 => bin "0.0"、0.3 => bin "0.25"、-1.3 => Bin "-1.5"

これを達成する最良の方法は何ですか?

答えて

3

はここで任意の第三部のライブラリを使用しないソリューションです。番号は配列valsにある必要があります。

MULTIPLIER = 0.25 
multipliers = [] 
0.step(1, MULTIPLIER) { |n| multipliers << n } 

histogram = Hash.new 0 

# find the appropriate "bin" and create the histogram 
vals.each do |val| 
    # create an array with all the residuals and select the smallest 
    cmp = multipliers.map { |group| [group, (group - val%1).abs] } 
    bin = cmp.min { |a, b| a.last <=> b.last }.first 
    histogram[val.truncate + bin] += 1 
end 

適切な丸めを実行すると思います。しかし、私は唯一でそれを試してみました:

vals = Array.new(10000) { (rand * 10) % 4 * (rand(2) == 0 ? 1 : -1) } 

と分布は一種の歪んだが、それはおそらく乱数ジェネレータのせいです。

2

Railsの可算#のGROUP_BYを提供 - あなたはRailsの使用していないと仮定すると、ここではソースを参照してください:あなたのリストがXSと呼ば​​れていると仮定すると、http://api.rubyonrails.org/classes/Enumerable.html

を、次の(未テスト)のような何かができる:

bars = xs.group_by {|x| #determine bin here} 

次に、あなたは次のようになりますハッシュがあります:

bars = { 0 => [elements,in,first,bin], 1 => [elements,in,second,bin], etc } 
+0

これは、xsがメモリに2回保持できると仮定していると思います。 – dfrankow

関連する問題