From 9c6318b1f84be9552fec20de6b4ed8520fa12f9b Mon Sep 17 00:00:00 2001 From: Nate-Wessel Date: Wed, 27 Nov 2024 15:24:03 +0000 Subject: [PATCH 1/4] recalculate mean, add standard deviation --- frontend/src/travelTimeQuery.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/frontend/src/travelTimeQuery.js b/frontend/src/travelTimeQuery.js index 2f65c33..f8b006c 100644 --- a/frontend/src/travelTimeQuery.js +++ b/frontend/src/travelTimeQuery.js @@ -80,6 +80,19 @@ export class TravelTimeQuery { record.set('hoursInRange', this.hoursInRange) record.set('mean_travel_time_minutes', this.#results?.travel_time?.minutes) record.set('mean_travel_time_seconds', this.#results?.travel_time?.seconds) + // get the standard deviation of the travel time observations + // start by calculating the mean again, separately + let sum_obs = this.#results.observations.reduce((cumsum, tt) => { + return cumsum + tt.seconds + }, 0) + let mean_obs = sum_obs / this.#results.observations.length + console.log(mean_obs) + // sum of the squared deviations from the mean + let sum_sq_dev = this.#results.observations.reduce((cumsum, tt) => { + return cumsum + Math.abs(mean_obs - tt.seconds) + }, 0) + let variance = sum_sq_dev / this.#results.observations.length + record.set('tt_sd_seconds', Math.sqrt(variance)) // turning these off in the frontend until they're ready for production //record.set('moe_lower_p95', this.#results?.confidence?.intervals?.['p=0.95']?.lower?.seconds) //record.set('moe_upper_p95', this.#results?.confidence?.intervals?.['p=0.95']?.upper?.seconds) From b5d806c2d1e1581114ee5fbb800fb8ef913f8bc5 Mon Sep 17 00:00:00 2001 From: Nate-Wessel Date: Wed, 27 Nov 2024 16:07:56 +0000 Subject: [PATCH 2/4] report corridor length in meters --- frontend/src/corridor.js | 3 +++ frontend/src/travelTimeQuery.js | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/src/corridor.js b/frontend/src/corridor.js index cc0ec26..095ce56 100644 --- a/frontend/src/corridor.js +++ b/frontend/src/corridor.js @@ -48,6 +48,9 @@ export class Corridor extends Factor { } get segments(){ return this.#segments } get links(){ return this.segments.flatMap( seg => seg.links ) } + get length_in_meters(){ + return this.links.reduce((cs,link)=>cs+link.length_m, 0) + } get viaStreets(){ return new Set( this.links.map( link => link.name ) ) } diff --git a/frontend/src/travelTimeQuery.js b/frontend/src/travelTimeQuery.js index f8b006c..3e3fc73 100644 --- a/frontend/src/travelTimeQuery.js +++ b/frontend/src/travelTimeQuery.js @@ -78,21 +78,21 @@ export class TravelTimeQuery { this.holidaysAreRelevant ? this.#holidayOption.holidaysIncluded : 'NA' ) record.set('hoursInRange', this.hoursInRange) - record.set('mean_travel_time_minutes', this.#results?.travel_time?.minutes) - record.set('mean_travel_time_seconds', this.#results?.travel_time?.seconds) // get the standard deviation of the travel time observations // start by calculating the mean again, separately + // this is because the tt means we use aren't straight averages, for historical reasons let sum_obs = this.#results.observations.reduce((cumsum, tt) => { return cumsum + tt.seconds }, 0) let mean_obs = sum_obs / this.#results.observations.length - console.log(mean_obs) + record.set('mean_travel_time_seconds', mean_obs) // sum of the squared deviations from the mean let sum_sq_dev = this.#results.observations.reduce((cumsum, tt) => { return cumsum + Math.abs(mean_obs - tt.seconds) }, 0) let variance = sum_sq_dev / this.#results.observations.length record.set('tt_sd_seconds', Math.sqrt(variance)) + record.set('length_in_meters', this.corridor.length_in_meters) // turning these off in the frontend until they're ready for production //record.set('moe_lower_p95', this.#results?.confidence?.intervals?.['p=0.95']?.lower?.seconds) //record.set('moe_upper_p95', this.#results?.confidence?.intervals?.['p=0.95']?.upper?.seconds) From bd55abe558a6a69d67124cc03b78b554e7174709 Mon Sep 17 00:00:00 2001 From: Nate-Wessel Date: Wed, 27 Nov 2024 19:43:35 +0000 Subject: [PATCH 3/4] ooooops, average SQUARED deviation from the mean --- frontend/src/travelTimeQuery.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/travelTimeQuery.js b/frontend/src/travelTimeQuery.js index 3e3fc73..55f4c2b 100644 --- a/frontend/src/travelTimeQuery.js +++ b/frontend/src/travelTimeQuery.js @@ -88,7 +88,7 @@ export class TravelTimeQuery { record.set('mean_travel_time_seconds', mean_obs) // sum of the squared deviations from the mean let sum_sq_dev = this.#results.observations.reduce((cumsum, tt) => { - return cumsum + Math.abs(mean_obs - tt.seconds) + return cumsum + (mean_obs - tt.seconds)**2 }, 0) let variance = sum_sq_dev / this.#results.observations.length record.set('tt_sd_seconds', Math.sqrt(variance)) From ec9be2a155026cb287567ab44087af3d97f9b783 Mon Sep 17 00:00:00 2001 From: Nate-Wessel Date: Wed, 27 Nov 2024 21:38:12 +0000 Subject: [PATCH 4/4] N-1 for sample stat --- frontend/src/travelTimeQuery.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/travelTimeQuery.js b/frontend/src/travelTimeQuery.js index 55f4c2b..a68f37b 100644 --- a/frontend/src/travelTimeQuery.js +++ b/frontend/src/travelTimeQuery.js @@ -90,8 +90,8 @@ export class TravelTimeQuery { let sum_sq_dev = this.#results.observations.reduce((cumsum, tt) => { return cumsum + (mean_obs - tt.seconds)**2 }, 0) - let variance = sum_sq_dev / this.#results.observations.length - record.set('tt_sd_seconds', Math.sqrt(variance)) + let sample_variance = sum_sq_dev / (this.#results.observations.length - 1) + record.set('tt_sd_seconds', Math.sqrt(sample_variance)) record.set('length_in_meters', this.corridor.length_in_meters) // turning these off in the frontend until they're ready for production //record.set('moe_lower_p95', this.#results?.confidence?.intervals?.['p=0.95']?.lower?.seconds)