in src/converter/data/dataSmooth.ts [128:180]
private calcAlphaBeta(
robustnessWeights: number[],
itrn: number,
timePoint: number,
ileft: number,
iright: number,
points: IDataRepresentationPoint[],
): IAlphaBeta {
const edge: number = (points[itrn].x.getTime() - points[ileft].x.getTime())
> (points[iright].x.getTime() - points[itrn].x.getTime())
? ileft
: iright;
let w: number;
let sumWeights: number = 0;
let sumX: number = 0;
let sumXSquared: number = 0;
let sumY: number = 0;
let sumXY: number = 0;
const denom: number = Math.abs(1 / (points[edge].x.getTime() - timePoint));
for (let k: number = ileft; k <= iright; ++k) {
const xk: number = points[k].x.getTime();
const yk: number = points[k].y;
const dist: number = k < itrn ? timePoint - xk : xk - timePoint;
w = this.science_stats_loessTricube(dist * denom) * robustnessWeights[k];
const xkw: number = xk * w;
sumWeights += w;
sumX += xkw;
sumXSquared += xk * xkw;
sumY += yk * w;
sumXY += yk * xkw;
}
const meanX: number = sumX / sumWeights;
const meanY: number = sumY / sumWeights;
const meanXY: number = sumXY / sumWeights;
const meanXSquared: number = sumXSquared / sumWeights;
const beta: number = (Math.sqrt(Math.abs(meanXSquared - meanX * meanX)) < this.accuracy)
? 0 : ((meanXY - meanX * meanY) / (meanXSquared - meanX * meanX));
const alpha: number = meanY - beta * meanX;
return {
alpha,
beta,
w
}
}