-
Notifications
You must be signed in to change notification settings - Fork 0
/
Statistics.cs
204 lines (203 loc) · 7.48 KB
/
Statistics.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
namespace System
{
/// <summary>
/// Specifies constant that define the sorting order at <see cref="System.Statistics.Rank(double, Orderby, double[])"/>.
/// </summary>
public enum Orderby
{
/// <summary>
/// Sort by ascending.
/// </summary>
Ascending,
/// <summary>
/// Sort by descending.
/// </summary>
Descending
};
/// <summary>
/// Provides static methods for statistical functions.
/// </summary>
public static class Statistics
{
/// <summary>
/// Returns the average of parameters.
/// </summary>
/// <param name="a">A real numbers array.</param>
/// <returns>The average of a. If a is blanked array, it returns NaN.</returns>
public static double Average(params double[] a)
{
double result = 0;
foreach (double i in a) result += i;
return result / a.Length;
}
/// <summary>
/// Returns the quantity of parameters.
/// </summary>
/// <param name="a">A real numbers array.</param>
/// <returns>The quantity of a.</returns>
public static int Count(params double[] a)
{
return a.Length;
}
/// <summary>
/// Returns the geometric mean of parameters.
/// </summary>
/// <param name="a">A real numbers array.</param>
/// <returns>The geometric mean of a.</returns>
public static double GeometricMean(params double[] a)
{
double result = 1;
foreach (double i in a) result *= i;
return Math.Pow(result, 1.0 / a.Length);
}
/// <summary>
/// Returns the harmonic mean of parameters.
/// </summary>
/// <param name="a">A real numbers array.</param>
/// <returns>The harmonic mean of a.</returns>
public static double HarmonicMean(params double[] a)
{
double result = 0;
foreach (double i in a) result += (1.0 / i);
return a.Length / result;
}
/// <summary>
/// Returns the k-th largest value from data array.
/// </summary>
/// <param name="k">The position from the largest in the a.</param>
/// <param name="a">A real numbers array.</param>
/// <returns>The k-th largest value from the a.</returns>
public static double Large(int k, double[] a)
{
Array.Sort(a);
return a[a.Length - k];
}
/// <summary>
/// Returns the maximum value of parameters.
/// </summary>
/// <param name="a">A real numbers array.</param>
/// <returns>The maximum value of a.</returns>
public static double Max(params double[] a)
{
Array.Sort(a);
return a[a.Length - 1];
}
/// <summary>
/// Returns the median value of parameters.
/// </summary>
/// <param name="a">A real numbers array.</param>
/// <returns>The median value of a.</returns>
public static double Median(params double[] a)
{
if (a.Length == 0) return double.NaN;
else if (a.Length == 1) return a[0];
Array.Sort(a);
if (a.Length % 2 == 0)
return a[a.Length / 2 - 1] + ((a[a.Length / 2] - a[a.Length / 2 - 1]) / 2);
else if (a.Length % 2 == 1)
return a[a.Length / 2];
else return double.NaN;
}
/// <summary>
/// Returns the minimum value of parameters.
/// </summary>
/// <param name="a">A real numbers array.</param>
/// <returns>The minimum value of a.</returns>
public static double Min(params double[] a)
{
Array.Sort(a);
return a[0];
}
/// <summary>
/// Returns the population standard deviation of parameters.
/// </summary>
/// <param name="a">A real numbers array.</param>
/// <returns>The population standard deviation of a.</returns>
public static double PStdev(params double[] a)
{
return Math.Sqrt(PVariance(a));
}
/// <summary>
/// Returns the population variance of parameters.
/// </summary>
/// <param name="a">A real numbers array.</param>
/// <returns>The population variance of a.</returns>
public static double PVariance(params double[] a)
{
double result = 0;
double avr = Average(a);
foreach (double i in a) result += Math.Pow(i - avr, 2);
return result / a.Length;
}
/// <summary>
/// Returns the ranking of value from data array.
/// </summary>
/// <param name="value">The value for which you want to find the rank</param>
/// <param name="a">A real numbers array.</param>
/// <returns>The rank of value about a.</returns>
/// <exception cref="ArgumentOutOfRangeException">When</exception>
public static int Rank(double value, params double[] a)
{
return Rank(value, Orderby.Descending, a);
}
/// <summary>
/// Returns the ranking of value from data array.
/// </summary>
/// <param name="value">A value for which you want to find the rank</param>
/// <param name="orderby">The sorting order of a</param>
/// <param name="a">A real numbers array.</param>
/// <returns>The rank of value about a.</returns>
public static int Rank(double value, Orderby orderby, params double[] a)
{
Array.Sort(a);
for(int i = 0; i < a.Length; i++)
if(a[i] == value)
if (orderby == Orderby.Descending) return a.Length - i;
else return i + 1;
throw new ArgumentOutOfRangeException();
}
/// <summary>
/// Returns the k-th smallest value from data array.
/// </summary>
/// <param name="k">The position from the smallest in the a.</param>
/// <param name="a">A real numbers array.</param>
/// <returns>The k-th smallest value from the a.</returns>
public static double Small(int k, params double[] a)
{
Array.Sort(a);
return a[k - 1];
}
/// <summary>
/// Returns the sample standard deviation of parameters.
/// </summary>
/// <param name="a">A real numbers array.</param>
/// <returns>The sample standard deviation of a.</returns>
public static double Stdev(params double[] a)
{
return Math.Sqrt(Variance(a));
}
/// <summary>
/// Returns the sum of parameters.
/// </summary>
/// <param name="a">A real numbers array.</param>
/// <returns>The sum of a.</returns>
public static double Sum(params double[] a)
{
double result = 0;
foreach (double i in a) result += i;
return result;
}
/// <summary>
/// Returns the sample variance of parameters.
/// </summary>
/// <param name="a">A real numbers array.</param>
/// <returns>The sample variance of a.</returns>
public static double Variance(params double[] a)
{
double result = 0;
double avr = Average(a);
foreach (double i in a) result += Math.Pow(i - avr, 2);
return result / (a.Length - 1);
}
}
}