32 lines
666 B
Ruby
32 lines
666 B
Ruby
require 'facets/math/summed_sqdevs'
|
|
|
|
module Math
|
|
|
|
#
|
|
def self.variance(array, &block)
|
|
sum2 = if block_given?
|
|
sum(array){ |i| j = block[i]; j*j }
|
|
else
|
|
sum(array){ |i| i**2 }
|
|
end
|
|
sum2/array.size - mean(array, &block)**2
|
|
end
|
|
|
|
# Variance of the sample.
|
|
# Variance of 0 or 1 elements is 0.0.
|
|
#
|
|
# TODO: Same as #variance? Then choose one.
|
|
def self.variance2(array)
|
|
return 0.0 if array.size < 2
|
|
summed_sqdevs(array) / (array.size - 1)
|
|
end
|
|
|
|
# Variance of a population.
|
|
# Variance of 0 or 1 elements is 0.0.
|
|
def self.pvariance(array)
|
|
return 0.0 if array.size < 2
|
|
summed_sqdevs(array) / array.size
|
|
end
|
|
|
|
end
|