function linearRegression(data, options = {}) {
let {stroke, x, y, z} = options;
let [vstroke, cstroke] = maybeColor(stroke, "currentColor");
if (z === undefined && vstroke != null) z = vstroke;
const X1 = [];
const Y1 = [];
const X2 = [];
const Y2 = [];
const S = vstroke ? [] : undefined;
return Plot.link(data, {
...Plot.transform(options, (data, facets) => {
const X = Plot.valueof(data, x);
const Y = Plot.valueof(data, y);
const Z = z !== undefined ? Plot.valueof(data, z) : undefined;
const [x1, x2] = d3.extent(X);
const regressionFacets = [];
for (const facet of facets) {
let F = facet.filter(i => defined(X[i]) && defined(Y[i]));
const regressionFacet = [];
for (const I of Z ? d3.group(F, i => Z[i]).values() : [F]) {
const f = linearRegressionLine(I, X, Y);
const i = I[0];
X1[i] = x1;
X2[i] = x2;
Y1[i] = f(x1);
Y2[i] = f(x2);
regressionFacet.push(i);
}
regressionFacets.push(regressionFacet);
}
return {data, facets: regressionFacets};
}),
x1: X1,
y1: Y1,
x2: X2,
y2: Y2
});
}