22 template<
class TDataType =
float >
32 InitializeClass(inputArray);
36 void SetInput(std::vector< TDataType >& inputArray)
38 InitializeClass(inputArray);
81 m_mode = m_input_Sorted[0];
82 auto number = m_input_Sorted[0];
86 for (
size_t i = 1; i < m_input_Sorted.size(); i++)
88 if (m_input_Sorted[i] == number)
94 if (count > countMode)
100 number = m_input_Sorted[i];
103 mode_calculated =
true;
109 TDataType GetMedian()
111 if (!median_calculated)
113 if (!m_input_Sorted.empty())
115 auto size = m_input_Sorted.size();
118 m_median = (m_input_Sorted[size / 2 - 1] + m_input_Sorted[size / 2]) / 2;
122 m_median = m_input_Sorted[size / 2];
127 std::cerr <<
"Array cannot be empty.\n";
128 return std::numeric_limits< TDataType >::min();
130 median_calculated =
true;
146 if (!kurtosis_calculated)
150 m_kurtosis = weirdStatistics(4);
151 kurtosis_calculated =
true;
160 if (!skewness_calculated)
164 m_skewness = weirdStatistics(3);
165 skewness_calculated =
true;
176 std::cerr <<
"Cannot calculate percentile less than 1. Giving Minimum, instead.\n";
179 auto nth = m_input_Sorted.begin() + (n * m_input_Sorted.size()) / 100;
180 std::nth_element(m_input_Sorted.begin(), nth, m_input_Sorted.end());
187 return (m_max - m_min);
199 return (static_cast<double>(m_max - m_min) / m_variance);
206 for (
size_t i = 0; i < m_input.size(); i++)
208 mad += (m_input[i] - m_mean);
210 return (mad / m_inputSize_double);
216 std::vector< TDataType > truncatedVector;
219 for (
size_t i = 0; i < m_input_Sorted.size(); i++)
221 if ((m_input_Sorted[i] >= lower) && (m_input_Sorted[i] <= upper))
223 truncatedVector.push_back(m_input_Sorted[i]);
227 double truncated_sum = std::accumulate(truncatedVector.begin(), truncatedVector.end(), 0.0);
228 double truncated_mean = truncated_sum / static_cast<double>(truncatedVector.size());
231 for (
size_t i = 0; i < truncatedVector.size(); i++)
233 rmad += std::abs(truncatedVector[i] - truncated_mean);
235 return (rmad / static_cast<double>(truncatedVector.size()));
242 for (
size_t i = 0; i < m_input.size(); i++)
244 mad += (m_input[i] - GetMedian());
246 return (mad / m_inputSize_double);
252 if (!stdDev_calculated)
256 return (m_stdDev / m_mean);
265 return (static_cast<double>(seventyFifth - twentyFifth) / static_cast<double>(seventyFifth + twentyFifth));
277 return (std::sqrt(m_energy / m_inputSize_double));
283 if (!zscores_calculated)
285 if (!stdDev_calculated)
290 for (
const TDataType& element : m_input)
292 m_zscores.push_back((element - m_mean) / m_stdDev);
294 zscores_calculated =
true;
301 std::vector< TDataType > m_input;
302 std::vector< TDataType > m_input_Sorted;
305 double m_inputSize_double = 0, m_sum = 0.0, m_mean = 0.0, m_variance = 0.0, m_stdDev = 0.0, m_kurtosis = 0.0, m_skewness = 0.0,
306 m_max = 0.0, m_min = 0.0, m_energy = 0.0;
308 TDataType m_mode, m_median;
310 std::vector< double > m_zscores;
313 bool stdDev_calculated =
false, kurtosis_calculated =
false, skewness_calculated =
false, zscores_calculated =
false,
314 mode_calculated =
false, median_calculated =
false;
317 void InitializeClass(std::vector< TDataType >& inputArray)
319 m_input = inputArray;
320 m_input_Sorted = inputArray;
321 std::sort(m_input_Sorted.begin(), m_input_Sorted.end());
322 m_inputSize_double = static_cast<double>(m_input.size());
324 stdDev_calculated =
false;
325 kurtosis_calculated =
false;
326 skewness_calculated =
false;
327 zscores_calculated =
false;
328 mode_calculated =
false;
329 median_calculated =
false;
330 m_sum = std::accumulate(m_input.begin(), m_input.end(), 0.0);
331 m_mean = m_sum / m_inputSize_double;
332 auto result = std::minmax_element(m_input.begin(), m_input.end());
333 m_min = *result.first;
334 m_max = *result.second;
335 for (
const TDataType& element : m_input)
337 m_variance += std::pow(static_cast<double>(element - m_mean), 2);
338 m_energy += std::pow(element, 2);
341 m_variance = m_variance / (m_inputSize_double - 1);
345 double weirdStatistics(
size_t power)
347 if (!stdDev_calculated)
351 double returnStat = 0.0;
352 for (
size_t x = 0; x < m_input.size(); x++)
354 returnStat += std::pow(((m_input[x] - m_mean) / m_stdDev), power);
356 return (returnStat / m_inputSize_double);
362 if (!stdDev_calculated)
364 m_stdDev = std::sqrt(m_variance);
365 stdDev_calculated =
true;
double GetCoefficientOfVariation()
Get Coefficient of Variation.
Definition: cbicaStatistics.h:250
double GetRootMeanSquare()
Get the Root Mean Square (also called Quadratic Mean)
Definition: cbicaStatistics.h:275
std::vector< double > GetZScores()
Does exactly what it says.
Definition: cbicaStatistics.h:281
double GetRobustMeanAbsoluteDeviation(size_t lowerQuantile, size_t upperQuantile)
Get the Robust Mean Absolute Deviation.
Definition: cbicaStatistics.h:214
Statistics()
Default Constructor.
Definition: cbicaStatistics.h:27
TDataType GetInterQuartileRange()
Get the InterQuartile Range.
Definition: cbicaStatistics.h:191
double GetMedianAbsoluteDeviation()
Get Median Absolute Deviation.
Definition: cbicaStatistics.h:239
double GetMeanAbsoluteDeviation()
Get the Mean Absolute Deviation.
Definition: cbicaStatistics.h:203
double GetStandardDeviation()
Does exactly what it says.
Definition: cbicaStatistics.h:137
TDataType GetNthPercentileElement(size_t n)
Gets the element at the Nth percentile (always defined between 1-99)
Definition: cbicaStatistics.h:172
double GetSkewness()
Does exactly what it says.
Definition: cbicaStatistics.h:158
double GetMean()
Does exactly what it says.
Definition: cbicaStatistics.h:66
double GetMinimum()
Does exactly what it says.
Definition: cbicaStatistics.h:54
double GetMaximum()
Does exactly what it says.
Definition: cbicaStatistics.h:48
double GetVariance()
Does exactly what it says.
Definition: cbicaStatistics.h:72
Stand-alone helper class to generate statistics in a efficient manner.
Definition: cbicaStatistics.h:23
double GetKurtosis()
Does exactly what it says.
Definition: cbicaStatistics.h:144
void SetInput(std::vector< TDataType > &inputArray)
Set new input.
Definition: cbicaStatistics.h:36
TDataType GetRange()
Get the Range.
Definition: cbicaStatistics.h:185
double GetStudentizedRange()
Get the Studentized Range.
Definition: cbicaStatistics.h:197
~Statistics()
Default Destructor.
Definition: cbicaStatistics.h:42
double GetEnergy()
Get the Energy.
Definition: cbicaStatistics.h:269
double GetSum()
Does exactly what it says.
Definition: cbicaStatistics.h:60
Statistics(std::vector< TDataType > &inputArray)
Constructor with input.
Definition: cbicaStatistics.h:30
double GetQuartileCoefficientOfDispersion()
Get Quartile Coefficient Of Dispersion.
Definition: cbicaStatistics.h:260