参考:https://qiita.com/quzq/items/c1a4929f47d986b0f77f

回帰直線とは全データの中心的な分布傾向を示す直線で、全データの誤差の二乗が最小になるような線である。
これは最小二乗法によって求められる。

モデル関数を f(x) = ax + b という一次関数とすると、
aとbは次のように求められる。

引用:https://ja.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95
// 回帰直線を求める(最小二乗法)
const lsm = coordinates => {
  const n = coordinates.length;
  // Xの合計
  const sigX = coordinates.reduce((acc, c) => acc + c.x, 0);
  // Yの合計
  const sigY = coordinates.reduce((acc, c) => acc + c.y, 0);
  // Xの2乗の合計
  const sigXX = coordinates.reduce((acc, c) => acc + c.x * c.x, 0);
  // X×Yの2乗の合計
  const sigXY = coordinates.reduce((acc, c) => acc + c.x * c.y, 0);
  // a(傾き)を求める
  const a = (n * sigXY - sigX * sigY) / (n * sigXX - Math.pow(sigX, 2));
  // b(切片)を求める
  const b = (sigXX * sigY - sigXY * sigX) / (n * sigXX - Math.pow(sigX, 2));
  return { a, b };
}