Weighted Mean
class Array #sum (and mean) found on http://snippets.dzone.com/posts/show/2161 def sum inject( nil ) { |sum,x| sum ? sum + x.to_f : x.to_f } end def mean sum.to_f / size end #http://en.wikipedia.org/wiki/Mean#Weighted_arithmetic_mean def weighted_mean(weights_array) raise "Each element of the array must have an accompanying weight. Array length = #{self.size} versus Weights length = #{weights_array.size}" if weights_array.size != self.size w_sum = weights_array.sum w_prod = 0 self.each_index {|i| w_prod += self[i] * weights_array[i].to_f} w_prod.to_f / w_sum.to_f end end
Example
>> a = [1,2,3] => [1, 2, 3] >> w = [1,1,1] => [1, 1, 1] >> a.weighted_arithmetic_mean(w) => 2.0 >> a.mean => 2.0 >> w = [5,2,1] => [5, 2, 1] >> a.weighted_arithmetic_mean(w) => 1.5