1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * https://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 /* 19 * This is not the original file distributed by the Apache Software Foundation 20 * It has been modified by the Hipparchus project 21 */ 22 package org.hipparchus.stat.descriptive; 23 24 import java.util.Arrays; 25 26 import org.hipparchus.util.MathUtils; 27 28 /** 29 * Reporting interface for basic univariate statistics. 30 */ 31 public interface StatisticalSummary { 32 33 /** 34 * Computes aggregated statistical summaries. 35 * <p> 36 * This method can be used to combine statistics computed over partitions or 37 * subsamples - i.e., the returned StatisticalSummary should contain 38 * the same values that would have been obtained by computing a single 39 * StatisticalSummary over the combined dataset. 40 * 41 * @param statistics StatisticalSummary instances to aggregate 42 * @return summary statistics for the combined dataset 43 * @throws org.hipparchus.exception.NullArgumentException if the input is null 44 */ 45 static StatisticalSummary aggregate(StatisticalSummary... statistics) { 46 MathUtils.checkNotNull(statistics); 47 return aggregate(Arrays.asList(statistics)); 48 } 49 50 /** 51 * Computes aggregated statistical summaries. 52 * <p> 53 * This method can be used to combine statistics computed over partitions or 54 * subsamples - i.e., the returned StatisticalSummary should contain 55 * the same values that would have been obtained by computing a single 56 * StatisticalSummary over the combined dataset. 57 * 58 * @param statistics iterable of StatisticalSummary instances to aggregate 59 * @return summary statistics for the combined dataset 60 * @throws org.hipparchus.exception.NullArgumentException if the input is null 61 */ 62 static StatisticalSummary aggregate(Iterable<? extends StatisticalSummary> statistics) { 63 MathUtils.checkNotNull(statistics); 64 65 long n = 0; 66 double min = Double.NaN; 67 double max = Double.NaN; 68 double sum = Double.NaN; 69 double mean = Double.NaN; 70 double m2 = Double.NaN; 71 72 for (StatisticalSummary current : statistics) { 73 if (current.getN() == 0) { 74 continue; 75 } 76 77 if (n == 0) { 78 n = current.getN(); 79 min = current.getMin(); 80 sum = current.getSum(); 81 max = current.getMax(); 82 m2 = current.getVariance() * (n - 1); 83 mean = current.getMean(); 84 } else { 85 if (current.getMin() < min) { 86 min = current.getMin(); 87 } 88 if (current.getMax() > max) { 89 max = current.getMax(); 90 } 91 92 sum += current.getSum(); 93 final double oldN = n; 94 final double curN = current.getN(); 95 n += curN; 96 final double meanDiff = current.getMean() - mean; 97 mean = sum / n; 98 final double curM2 = current.getVariance() * (curN - 1d); 99 m2 = m2 + curM2 + meanDiff * meanDiff * oldN * curN / n; 100 } 101 } 102 103 final double variance = n == 0 ? Double.NaN : 104 n == 1 ? 0d : 105 m2 / (n - 1); 106 107 return new StatisticalSummaryValues(mean, variance, n, max, min, sum); 108 } 109 110 /** 111 * Returns the <a href="http://www.xycoon.com/arithmetic_mean.htm"> 112 * arithmetic mean </a> of the available values 113 * @return The mean or Double.NaN if no values have been added. 114 */ 115 double getMean(); 116 117 /** 118 * Returns the variance of the available values. 119 * @return The variance, Double.NaN if no values have been added 120 * or 0.0 for a single value set. 121 */ 122 double getVariance(); 123 124 /** 125 * Returns the standard deviation of the available values. 126 * @return The standard deviation, Double.NaN if no values have been added 127 * or 0.0 for a single value set. 128 */ 129 double getStandardDeviation(); 130 131 /** 132 * Returns the maximum of the available values 133 * @return The max or Double.NaN if no values have been added. 134 */ 135 double getMax(); 136 137 /** 138 * Returns the minimum of the available values 139 * @return The min or Double.NaN if no values have been added. 140 */ 141 double getMin(); 142 143 /** 144 * Returns the number of available values 145 * @return The number of available values 146 */ 147 long getN(); 148 149 /** 150 * Returns the sum of the values that have been added to Univariate. 151 * @return The sum or Double.NaN if no values have been added 152 */ 153 double getSum(); 154 155 }