From ac5e8ac13f4c8f0edd466a96990403a33b2cdb67 Mon Sep 17 00:00:00 2001 From: ratplier <133662217+ratplier@users.noreply.github.com> Date: Tue, 25 Nov 2025 16:11:15 -0600 Subject: [PATCH 1/2] improve mean to use kahan summation --- src/sampler.luau | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/sampler.luau b/src/sampler.luau index 56d3a03..a0c7b8f 100644 --- a/src/sampler.luau +++ b/src/sampler.luau @@ -380,9 +380,15 @@ local function ANALYZE(sample: Sample, options: AnalyzeOptions?): SampleStats -- Calculate MAD (median absolute deviation) local mad = calculate_mad(sample, median) + -- Calculate mean (Kahan summation) local sum = 0 + local correction = 0 for _, value in sample do - sum += value + local adjusted_value = value - correction + local target = sum + adjusted_value + + correction = (target - sum) - adjusted_value + sum = target end local mean = sum / n From ff8167049f22790051a4bcd09c0d76143f4a30ae Mon Sep 17 00:00:00 2001 From: ratplier <133662217+ratplier@users.noreply.github.com> Date: Tue, 25 Nov 2025 16:42:57 -0600 Subject: [PATCH 2/2] change kahan to neumaier summation to account for edge cases --- src/sampler.luau | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/sampler.luau b/src/sampler.luau index a0c7b8f..d07fbd1 100644 --- a/src/sampler.luau +++ b/src/sampler.luau @@ -380,17 +380,19 @@ local function ANALYZE(sample: Sample, options: AnalyzeOptions?): SampleStats -- Calculate MAD (median absolute deviation) local mad = calculate_mad(sample, median) - -- Calculate mean (Kahan summation) + -- Calculate mean (Neumaier summation) local sum = 0 local correction = 0 for _, value in sample do - local adjusted_value = value - correction - local target = sum + adjusted_value + local target = sum + value - correction = (target - sum) - adjusted_value - sum = target + if math.abs(sum) >= math.abs(value) then + correction += (sum - target) + value + else + correction += (value - target) + sum + end end - local mean = sum / n + local mean = (sum + correction) / n -- Calculate variance and standard deviation local variance_sum = 0