linearRegression function

LinearRegressionResult linearRegression(
  1. List<double> x,
  2. List<double> y
)

Computes simple linear regression for the given data points.

Returns the slope, intercept, and R-squared value. Throws if there are fewer than 2 points.

Implementation

LinearRegressionResult linearRegression(
  List<double> x,
  List<double> y,
) {
  if (x.length != y.length) {
    throw ArgumentError('x and y must have the same length');
  }
  if (x.length < 2) {
    throw ArgumentError('At least 2 points are required');
  }

  final n = x.length;

  // Calculate means
  double sumX = 0, sumY = 0;
  for (int i = 0; i < n; i++) {
    sumX += x[i];
    sumY += y[i];
  }
  final meanX = sumX / n;
  final meanY = sumY / n;

  // Calculate slope and intercept
  double ssXY = 0; // Sum of (xi - meanX)(yi - meanY)
  double ssXX = 0; // Sum of (xi - meanX)^2
  double ssYY = 0; // Sum of (yi - meanY)^2

  for (int i = 0; i < n; i++) {
    final dx = x[i] - meanX;
    final dy = y[i] - meanY;
    ssXY += dx * dy;
    ssXX += dx * dx;
    ssYY += dy * dy;
  }

  if (ssXX == 0) {
    // Vertical line - undefined slope
    return LinearRegressionResult(
      slope: double.infinity,
      intercept: double.nan,
      rSquared: 0,
    );
  }

  final slope = ssXY / ssXX;
  final intercept = meanY - slope * meanX;

  // Calculate R-squared
  double rSquared = 0;
  if (ssYY > 0) {
    rSquared = (ssXY * ssXY) / (ssXX * ssYY);
  }

  return LinearRegressionResult(
    slope: slope,
    intercept: intercept,
    rSquared: rSquared,
  );
}