createLinearRegression = (xData, yData, filterFn) => {
let interceptChanges = getBackwardChange(yData).slice(growthLookBack-1)
let forwardReturns = getForwardChange(xData).slice(-interceptChanges.length)
let changesChartData = forwardReturns
.map(
(day, idx) => (
{ returns: day, yChange: interceptChanges[idx]}
)
).filter(filterFn)
let changesChartClean = changesChartData.map(data => [data.yChange, data.returns])
let forwardChangeRegression = simpleStatistics.linearRegression(changesChartClean)
let forwardChangePredictor = simpleStatistics.linearRegressionLine(forwardChangeRegression)
let forwardChangeTrendline = changesChartClean.map(data => ({ y: forwardChangePredictor(data[0]), x: data[0] }))
let forwardChangePredictionRule = vz(forwardChangeTrendline)
.rule()
.x('x')
.y('y');
let forwardPredictionline = forwardChangePredictionRule.copy().line().color('none');
let lastPrediction = forwardChangeTrendline.slice(-1)[0].y
let currentPrediction = forwardChangePredictor(yData.slice(-1)[0])
let chartSupplyRule = vz(changesChartData)
.rule()
.y('returns')
.x('yChange')
.point();
let forwardChangeRsquared = simpleStatistics
.rSquared(
changesChartClean, simpleStatistics.linearRegressionLine(forwardChangeRegression)
)
let chart = vz.layer(chartSupplyRule, forwardPredictionline)
.width(900)
.height(600)
.plot()
return { chart, forwardChangeRsquared, lastPrediction, currentPrediction }
}