Sha256: a8135eda6e0ea8c335237372a0d7e50e0873c7ecc1887db49ffedd446023a80d

Contents?: true

Size: 1.09 KB

Versions: 2

Compression:

Stored size: 1.09 KB

Contents

require_relative '../function'

Dentaku::AST::Function.register(:intercept, :list, ->(*args) {
  if args.length != 2
    raise Dentaku::ArgumentError.for(
        :wrong_number_of_arguments,
        function_name: 'INTERCEPT()', exact: 2, given: args.length
    ), 'INTERCEPT() requires exactly two arrays of numbers'
  end

  x_values, y_values = args
  if !x_values.is_a?(Array) || !y_values.is_a?(Array) || x_values.length != y_values.length
    raise Dentaku::ArgumentError.for(
        :invalid_value,
        function_name: 'INTERCEPT()'
    ), 'INTERCEPT() requires arrays of equal length'
  end

  n = x_values.length.to_f
  x_values = x_values.map { |arg| Dentaku::AST::Function.numeric(arg) }
  y_values = y_values.map { |arg| Dentaku::AST::Function.numeric(arg) }

  x_avg = x_values.sum / n
  y_avg = y_values.sum / n

  xy_sum = x_values.zip(y_values).map { |x, y| (x_avg - x) * (y_avg - y) }.sum
  x_square_sum = x_values.map { |x| (x_avg - x)**2 }.sum

  slope = xy_sum / x_square_sum
  intercept = x_values.zip(y_values).map { |x, y| y - slope * x }.sum / n

  BigDecimal(intercept, Float::DIG + 1)
})

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
dentaku-3.5.4 lib/dentaku/ast/functions/intercept.rb
dentaku-3.5.3 lib/dentaku/ast/functions/intercept.rb