1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
module Statistics
module Distribution
class Geometric
attr_accessor :probability_of_success, :always_success_allowed
def initialize(p, always_success: false)
self.probability_of_success = p.to_f
self.always_success_allowed = always_success
end
def density_function(k)
k = k.to_i
if always_success_allowed
return if k < 0
((1.0 - probability_of_success) ** k) * probability_of_success
else
return if k <= 0
((1.0 - probability_of_success) ** (k - 1.0)) * probability_of_success
end
end
def cumulative_function(k)
k = k.to_i
if always_success_allowed
return if k < 0
1.0 - ((1.0 - probability_of_success) ** (k + 1.0))
else
return if k <= 0
1.0 - ((1.0 - probability_of_success) ** k)
end
end
def mean
if always_success_allowed
(1.0 - probability_of_success) / probability_of_success
else
1.0 / probability_of_success
end
end
def median
if always_success_allowed
(-1.0 / Math.log2(1.0 - probability_of_success)).ceil - 1.0
else
(-1.0 / Math.log2(1.0 - probability_of_success)).ceil
end
end
def mode
if always_success_allowed
0.0
else
1.0
end
end
def variance
(1.0 - probability_of_success) / (probability_of_success ** 2)
end
def skewness
(2.0 - probability_of_success) / Math.sqrt(1.0 - probability_of_success)
end
def kurtosis
6.0 + ((probability_of_success ** 2) / (1.0 - probability_of_success))
end
end
end
end
|