linearRegression function
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,
);
}