2009-04-03 7 views
2

Ich habe eine Reihe von Zahlen, die ich verwenden möchte, um ein Histogramm für einen Standard-Score zu erstellen.Gruppieren von Zahlen für ein Histogramm

Deshalb berechnen I den Mittelwert und die Standardabweichung der Zahl und jedes X normalisieren mit dieser Formel

x‘= (x-mean)/std_dev

Das Ergebnis ist eine Zahl zwischen -4 und 4. Ich möchte dieses Ergebnis darstellen. Ich suche nach einer Möglichkeit, die Zahlen zu gruppieren, um kleine Balken zu vermeiden.

Mein Plan ist Bins in dem Intervall haben [-4,4] bei consecutavice Quartal Einheiten zentriert, dh [-4, -3,75, ..., 3.75,4]

Beispiel: 0,1 => Bin "0.0", 0.3 => Bin "0.25", -1.3 => Bin "-1.5"

Was ist der beste Weg, um das zu erreichen?

Antwort

3

Hier ist eine Lösung, die keine dritte Teil Bibliotheken nicht verwendet. Die Nummern sollten im Array vals sein.

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 

Ich denke, dass es die richtige Rundung durchführt. Aber ich habe nur versucht, es mit:

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

und der Verteilung bekam Art schief, aber das ist wahrscheinlich der zufällige Fehler des Zahlengenerators.

2

Rails Enumerable # group_by - siehe Quelle hier, Sie vorausgesetzt, sie nicht verwenden Rails: http://api.rubyonrails.org/classes/Enumerable.html

Liste Unter der Annahme, xs genannt wird, können Sie so etwas wie die folgenden (ungetestet) tun könnte:

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

Dann werden Sie einen Hash haben, die wie folgt aussieht:

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

Ich glaube, das geht davon aus, dass xs zweimal im Speicher gehalten werden kann. – dfrankow

Verwandte Themen