Module: Philiprehberger::MathKit::Regression

Defined in:
lib/philiprehberger/math_kit/regression.rb

Overview

Linear regression analysis

Defined Under Namespace

Classes: Result

Class Method Summary collapse

Class Method Details

.linear(xs, ys) ⇒ Result

Perform ordinary least squares linear regression

Parameters:

  • xs (Array<Numeric>)

    independent variable values

  • ys (Array<Numeric>)

    dependent variable values

Returns:

  • (Result)

    regression result with slope, intercept, and r_squared

Raises:

  • (ArgumentError)

    if arrays differ in size or have fewer than 2 points



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/philiprehberger/math_kit/regression.rb', line 25

def linear(xs, ys)
  raise ArgumentError, 'datasets must have the same size' if xs.size != ys.size
  raise ArgumentError, 'linear regression requires at least 2 data points' if xs.size < 2

  n = xs.size.to_f
  sum_x = xs.sum.to_f
  sum_y = ys.sum.to_f
  sum_xy = xs.zip(ys).sum { |x, y| x * y }.to_f
  sum_x2 = xs.sum { |x| x**2 }.to_f

  denom = (n * sum_x2) - (sum_x**2)
  raise ArgumentError, 'all x values are identical — cannot fit a line' if denom.zero?

  slope = ((n * sum_xy) - (sum_x * sum_y)) / denom
  intercept = (sum_y - (slope * sum_x)) / n

  r_squared = compute_r_squared(ys, xs, slope, intercept)

  Result.new(slope: slope, intercept: intercept, r_squared: r_squared)
end