code: def fit(xs, ys, tran_x: ->(x) { x }, tran_y: ->(y) { y })
        eps    = (10 ** -10)
        n      = 0
        sum_x  = 0.0
        sum_x2 = 0.0
        sum_y  = 0.0
        sum_y2 = 0.0
        sum_xy = 0.0
  
        xs.zip(ys).each do |x, y|
          n        += 1
          sum_x    += tran_x.(x)
          sum_y    += tran_y.(y)
          sum_x2   += tran_x.(x) ** 2
          sum_y2   += tran_y.(y) ** 2
          sum_xy   += tran_x.(x) * tran_y.(y)
        end
  
        txy = n * sum_xy - sum_x * sum_y
        tx  = n * sum_x2 - sum_x ** 2
        ty  = n * sum_y2 - sum_y ** 2
  
        is_linear = tran_x.(Math::E) * tran_y.(Math::E) == Math::E ** 2
  
        if tx.abs < eps # no variation in xs
          raise ArgumentError, "No variation in data #{xs}"
        elsif ty.abs < eps && is_linear # no variation in ys - constant fit
          slope = 0
          intercept = sum_y / n
          residual_sq = 1 # doesn't exist
        else
          slope       = txy / tx
          intercept   = (sum_y - slope * sum_x) / n
          residual_sq = (txy ** 2) / (tx * ty)
        end
  
        [slope, intercept, residual_sq]
      end
docs: Fit the performance measurements to construct a model with
   slope and intercept parameters that minimize the error.
  
   @param [Array[Numeric]] xs
     the data points along X axis
  
   @param [Array[Numeric]] ys
     the data points along Y axis
  
   @return [Array[Numeric, Numeric, Numeric]
     returns slope, intercept and model's goodness-of-fit
  
   @api public