从Ruby数组计算四分位数均值?

时间:2012-01-13 20:18:53

标签: ruby arrays math statistics

我有这个数组:

[288.563044, 329.835918, 578.622569, 712.359026, 866.614253, 890.066321, 1049.78037, 1070.29897, 2185.443662, 2492.245562, 4398.300227, 13953.264379]

如何从中计算interquartile mean

维基百科链接解释得最好,但我基本上需要删除底部和前25%,只留下中间50%,其中我需要平均数字。

但是假设数组项的数量可以被4 Here's how to calculate it整除,当它不能被4整除时。

那我该如何做呢?

3 个答案:

答案 0 :(得分:4)

这是一个数组的部分解决方案,其中包含多个4的元素。当我弄明白时,我会把完整的元素放在一边。

arr = [288.563044, 329.835918, 578.622569, 712.359026, 866.614253, 890.066321, 1049.78037,    1070.29897, 2185.443662, 2492.245562, 4398.300227, 13953.264379].sort!
length = arr.size
mean = arr.sort[(length/4)..-(length/4+1)].inject(:+)/(length/2)

我认为这是一个更好的解决方案。

def interquartile_mean(array)
   arr = array.sort
   length = arr.size
   quart = (length/4.0).floor
   fraction = 1-((length/4.0)-quart)
   new_arr = arr[quart..-(quart + 1)]
   (fraction*(new_arr[0]+new_arr[-1]) + new_arr[1..-2].inject(:+))/(length/2.0)
end

答案 1 :(得分:2)

简单案例array_size mod 4 = 0

xs = [5, 8, 4, 38, 8, 6, 9, 7, 7, 3, 1, 6]
q = xs.size / 4
ys = xs.sort[q...3*q]
mean = ys.inject(0, :+) / ys.size.to_f
#=> 6.5

一般情况(array_size >= 4):

xs = [1, 3, 5, 7, 9, 11, 13, 15, 17]
q = xs.size / 4.0
ys = xs.sort[q.ceil-1..(3*q).floor]
factor = q - (ys.size/2.0 - 1)
mean = (ys[1...-1].inject(0, :+) + (ys[0] + ys[-1]) * factor) / (2*q)
#=> 9.0

但是,如果您不尝试自己编码,这将无济于事......

答案 2 :(得分:1)

改进了tokland的答案,增加了Array类并修复了一个边缘情况(编写的方法随着数组大小为4而爆炸)。

class Array
  def interquartile_mean
     a = sort
     l = size
     quart = (l.to_f / 4).floor
     t = a[quart..-(quart + 1)]
     t.inject{ |s, e| s + e }.to_f / t.size
  end
end