# HG changeset patch # User Mikael Berthe # Date 1489355900 -3600 # Node ID afbb4d9ae5363b423698de045b94cfae5725f3e0 # Parent f6646f63b11a59e8bd4812db839075f5e177151b Add Mean Absolute Deviation to the statistics diff -r f6646f63b11a -r afbb4d9ae536 gobm65.go --- a/gobm65.go Sun Feb 26 17:06:21 2017 +0100 +++ b/gobm65.go Sun Mar 12 22:58:20 2017 +0100 @@ -395,6 +395,34 @@ return sDev, nil } +// avgAbsoluteDeviation computes the average absolute deviation (or Mean +// Absolute Deviation) of the measurement set +func avgAbsoluteDeviation(items []measurement) (measurement, error) { + var dev measurement + + if len(items) <= 1 { + return dev, fmt.Errorf("cannot compute deviation: set too small") + } + + var sumSys, sumDia, sumPul float64 + avg, err := average(items) + if err != nil { + return dev, err + } + + for _, data := range items { + sumSys += math.Abs(float64(data.Systolic - avg.Systolic)) + sumDia += math.Abs(float64(data.Diastolic - avg.Diastolic)) + sumPul += math.Abs(float64(data.Pulse - avg.Pulse)) + } + + dev.Systolic = int(sumSys / float64(len(items))) + dev.Diastolic = int(sumDia / float64(len(items))) + dev.Pulse = int(sumPul / float64(len(items))) + + return dev, nil +} + func main() { inFile := flag.String([]string{"-input-file", "i"}, "", "Input JSON file") outFile := flag.String([]string{"-output-file", "o"}, "", "Output JSON file") @@ -583,6 +611,13 @@ fmt.Printf("Standard deviation: %d;%d;%d\n", d.Systolic, d.Diastolic, d.Pulse) } + d, err = avgAbsoluteDeviation(items) + if err != nil { + log.Println("Error:", err) + } else { + fmt.Printf("Average absolute deviation: %d;%d;%d\n", + d.Systolic, d.Diastolic, d.Pulse) + } } if *stats && len(items) > 0 { m, err := median(items)