Add Mean Absolute Deviation to the statistics
authorMikael Berthe <mikael@lilotux.net>
Sun, 12 Mar 2017 22:58:20 +0100
changeset 19 afbb4d9ae536
parent 18 f6646f63b11a
child 20 fe86e794b63a
Add Mean Absolute Deviation to the statistics
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)