Module: DTW::Statistics

Defined in:
lib/dtwrb/statistics.rb,
sig/dtwrb.rbs

Constant Summary collapse

NORMAL_CONSISTENCY_SCALE =

1 / Phi^-1(3/4). Scaling the median absolute deviation by it makes the statistic a consistent estimator of sigma for normally distributed data.

Returns:

  • (::Float)
1.4826
ESTIMATORS =

Returns:

{
  median: method(:median),
  mean: method(:mean),
  median_absolute_deviation: method(:median_absolute_deviation),
  mad: method(:median_absolute_deviation),
  standard_deviation: method(:standard_deviation)
}.freeze

Class Method Summary collapse

Class Method Details

.mean(values) ⇒ ::Float?

Parameters:

  • (::Array[::Numeric])

Returns:

  • (::Float, nil)


19
20
21
22
23
# File 'lib/dtwrb/statistics.rb', line 19

def mean(values)
  return nil if values.empty?

  values.sum(0.0) / values.length
end

.median(values) ⇒ ::Float?

Parameters:

  • (::Array[::Numeric])

Returns:

  • (::Float, nil)


11
12
13
14
15
16
17
# File 'lib/dtwrb/statistics.rb', line 11

def median(values)
  return nil if values.empty?

  sorted = values.sort
  middle = sorted.length / 2
  sorted.length.odd? ? sorted[middle].to_f : 0.5 * (sorted[middle - 1] + sorted[middle])
end

.median_absolute_deviation(values) ⇒ ::Float

Parameters:

  • (::Array[::Numeric])

Returns:

  • (::Float)


25
26
27
28
29
30
# File 'lib/dtwrb/statistics.rb', line 25

def median_absolute_deviation(values)
  return 0.0 if values.length < 2

  center = median(values)
  NORMAL_CONSISTENCY_SCALE * median(values.map { |value| (value - center).abs })
end

.resolve(estimator) ⇒ _Estimator

Parameters:

  • (estimator)

Returns:



47
# File 'lib/dtwrb/statistics.rb', line 47

def resolve(estimator) = Resolver.call(estimator, ESTIMATORS, "estimator")

.standard_deviation(values) ⇒ ::Float

Parameters:

  • (::Array[::Numeric])

Returns:

  • (::Float)


32
33
34
35
36
37
# File 'lib/dtwrb/statistics.rb', line 32

def standard_deviation(values)
  return 0.0 if values.length < 2

  center = mean(values)
  Math.sqrt(values.sum(0.0) { |value| (value - center) ** 2 } / (values.length - 1))
end