Skip to content

Instantly share code, notes, and snippets.

@MaximilianLloyd
Last active October 10, 2016 19:10
Show Gist options
  • Save MaximilianLloyd/b1f0663f91c246096ea1a4676bbc308f to your computer and use it in GitHub Desktop.
Save MaximilianLloyd/b1f0663f91c246096ea1a4676bbc308f to your computer and use it in GitHub Desktop.
// Function used to get best fit. See http://www.varsitytutors.com/hotmath/hotmath_help/topics/line-of-best-fit.html for formula
function LOBF(data, xiden, yiden) {
let Xsum = 0, Ysum = 0, Xmean = 0, Ymean = 0;
for (let i = 0; i < data.length; i++) {
let point = data[i];
Xsum += point[xiden];
Ysum += point[yiden];
}
Xmean = Xsum / data.length;
Ymean = Ysum / data.length;
let top = 0, bottom = 0;
for (let i = 0; i < data.length; i++) {
point = data[i];
top += (point[xiden] - Xmean) * (point[yiden] - Ymean);
bottom += Math.pow((point[xiden] - Xmean), 2);
}
return top / bottom;
}
let data = [
{milesTraveled: 80, numDeliveries:4, gasPrice : 3.84, travelTime: 7},
{milesTraveled: 66, numDeliveries:1, gasPrice : 3.19, travelTime: 5.4},
{milesTraveled: 78, numDeliveries:3, gasPrice : 3.78, travelTime: 6.6},
{milesTraveled: 111, numDeliveries:6, gasPrice : 3.89, travelTime: 7.4},
{milesTraveled: 44, numDeliveries:1, gasPrice : 3.57, travelTime: 4.8},
{milesTraveled: 77, numDeliveries:3, gasPrice : 3.57, travelTime: 6.4},
{milesTraveled: 80, numDeliveries:3, gasPrice : 3.03, travelTime: 7},
{milesTraveled: 66, numDeliveries:2, gasPrice : 3.51, travelTime: 5.6},
{milesTraveled: 109, numDeliveries:5, gasPrice : 3.54, travelTime: 7.3},
{milesTraveled: 76, numDeliveries:3, gasPrice : 3.25, travelTime: 6.4},
];
let slopes = {
milesTraveled: {
travelTime : 0,
numDeliveries: 0,
gasPrice : 0
},
numDeliveries: {
travelTime : 0,
milesTraveled: 0,
gasPrice : 0
},
gasPrice : {
travelTime : 0,
numDeliveries: 0,
milesTraveled: 0
}
};
let SSE = {
milesTraveled: {
travelTime : 0,
numDeliveries: 0,
gasPrice : 0
},
numDeliveries: {
travelTime : 0,
milesTraveled: 0,
gasPrice : 0
},
gasPrice : {
travelTime : 0,
numDeliveries: 0,
milesTraveled: 0
}
};
// Calculate the slopes
slopes.milesTraveled.travelTime = LOBF(data, 'milesTraveled', 'travelTime');
slopes.milesTraveled.numDeliveries = LOBF(data, 'milesTraveled', 'numDeliveries');
slopes.milesTraveled.gasPrice = LOBF(data, 'milesTraveled', 'gasPrice');
slopes.numDeliveries.travelTime = LOBF(data, 'numDeliveries', 'travelTime');
slopes.numDeliveries.milesTraveled = LOBF(data, 'numDeliveries', 'milesTraveled');
slopes.numDeliveries.gasPrice = LOBF(data, 'numDeliveries', 'gasPrice');
slopes.gasPrice.travelTime = LOBF(data, 'gasPrice' , 'travelTime');
slopes.gasPrice.milesTraveled = LOBF(data, 'gasPrice' , 'milesTraveled');
slopes.gasPrice.numDeliveries = LOBF(data, 'gasPrice' , 'numDeliveries');
// Calculate the SSE
for (let i = 0; i < data.length; i++) {
let delivery = data[i];
SSE.milesTraveled.travelTime += Math.pow(delivery.travelTime - (delivery.milesTraveled * slopes.milesTraveled.travelTime),2);
SSE.milesTraveled.numDeliveries += Math.pow(delivery.numDeliveries - (delivery.milesTraveled * slopes.milesTraveled.numDeliveries),2);
SSE.milesTraveled.gasPrice += Math.pow(delivery.gasPrice - (delivery.milesTraveled * slopes.milesTraveled.gasPrice),2);
SSE.numDeliveries.travelTime += Math.pow(delivery.travelTime - (delivery.numDeliveries * slopes.numDeliveries.travelTime),2);
SSE.numDeliveries.milesTraveled += Math.pow(delivery.milesTraveled - (delivery.numDeliveries * slopes.numDeliveries.milesTraveled),2);
SSE.numDeliveries.gasPrice += Math.pow(delivery.gasPrice - (delivery.numDeliveries * slopes.numDeliveries.gasPrice),2);
SSE.gasPrice.travelTime += Math.pow(delivery.travelTime - (delivery.gasPrice * slopes.gasPrice.travelTime),2);
SSE.gasPrice.numDeliveries += Math.pow(delivery.numDeliveries - (delivery.gasPrice * slopes.gasPrice.numDeliveries),2);
SSE.gasPrice.milesTraveled += Math.pow(delivery.milesTraveled - (delivery.gasPrice * slopes.gasPrice.milesTraveled),2);
}
console.log(`
— Multiple Linear Regression —
SUMS:
${JSON.stringify(sums)}
— — — — — — — — — — — — — — — -
Slopes:
${JSON.stringify(slopes)}
— — — — — — — — — — — — — — — -
SSE:
${JSON.stringify(SSE)}
`);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment