Last active
October 10, 2016 19:10
-
-
Save MaximilianLloyd/b1f0663f91c246096ea1a4676bbc308f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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