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
-
.linear(xs, ys) ⇒ Result
Perform ordinary least squares linear regression.
Class Method Details
.linear(xs, ys) ⇒ Result
Perform ordinary least squares linear regression
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 |