1 //-------------------------------------------------------------
2 // <copyright company=
\92Microsoft Corporation
\92>
3 // Copyright © Microsoft Corporation. All Rights Reserved.
5 //-------------------------------------------------------------
6 // @owner=alexgor, deliant
7 //=================================================================
8 // File: StatisticFormula.cs
10 // Namespace: DataVisualization.Charting
12 // Classes: StatisticFormula, TTestResult, FTestResult, AnovaResult,
15 // Purpose: StatisticFormula class provides helper methods for statistical
16 // calculations like TTest, FTest, Anova, ZTest and others.
17 // Actual calculations are made in the DataFormula class and
18 // the StatisticFormula class mange formula parameters, input and
21 // TTestResult, FTestResult, AnovaResult and ZTestResult
22 // classes are used to store the results of the calculatiions.
24 // StatisticFormula class is exposed to the user through
25 // DataManipulator.StatisticFormula property. Here is an example of
26 // using the Anova test:
28 // AnovaResult result = Chart1.DataManipulator.StatisticFormula.Anova(0.6, "Group1,Group2,Group3");
30 // NOTE: First versions of the chart use single method to execute
31 // ALL formulas. Formula name and parameters were passed as
32 // strings. Input and outpat data was passed through data
35 // This approach was hard to use by the end-user and was
36 // changed to a specific method for each formula. StatisticFormula
37 // class provides that simplified interface for all statistics
38 // formulas. Internally it still uses the DataFormula.Formula
39 // method with string parameters.
41 // Reviewed: AG - April 1, 2003
42 // AG - Microsoft 14, 2007
44 //===================================================================
47 using System.Diagnostics.CodeAnalysis;
50 namespace System.Windows.Forms.DataVisualization.Charting
52 namespace System.Web.UI.DataVisualization.Charting
57 /// The StatisticFormula class provides helper methods for statistical calculations.
58 /// Actual calculations are made in the DataFormula class and the StatisticFormula
59 /// class provide a simplified API which automatically prepares parameters and
60 /// deals with input and output series.
63 [AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
64 [AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
66 public class StatisticFormula
70 // Name used for temporary data series
71 private string _tempOutputSeriesName = "Statistical Analyses Formula Temporary Output Series 2552003";
73 // Reference to the class which describes calculation settings and
74 // provides access to chart common elements.
75 private DataFormula _formulaData = null;
82 /// StatisticFormula Constructor
84 /// <param name="formulaData">Formula Data</param>
85 internal StatisticFormula( DataFormula formulaData )
87 this._formulaData = formulaData;
90 #endregion // Constructor
95 /// This formula performs a Z Test using Normal distribution.
97 /// <param name="hypothesizedMeanDifference">Hypothesized mean difference.</param>
98 /// <param name="varianceFirstGroup">Variance first group.</param>
99 /// <param name="varianceSecondGroup">Variance second group.</param>
100 /// <param name="probability">Probability.</param>
101 /// <param name="firstInputSeriesName">First input series name.</param>
102 /// <param name="secondInputSeriesName">Second input series name.</param>
103 /// <returns>ZTestResult object.</returns>
104 public ZTestResult ZTest(
105 double hypothesizedMeanDifference,
106 double varianceFirstGroup,
107 double varianceSecondGroup,
109 string firstInputSeriesName,
110 string secondInputSeriesName )
113 if (firstInputSeriesName == null)
114 throw new ArgumentNullException("firstInputSeriesName");
115 if (secondInputSeriesName == null)
116 throw new ArgumentNullException("secondInputSeriesName");
118 // Create output class
119 ZTestResult zTestResult = new ZTestResult();
121 // Make string with parameters
122 string parameter = hypothesizedMeanDifference.ToString(System.Globalization.CultureInfo.InvariantCulture);
123 parameter += "," + varianceFirstGroup.ToString(System.Globalization.CultureInfo.InvariantCulture);
124 parameter += "," + varianceSecondGroup.ToString(System.Globalization.CultureInfo.InvariantCulture);
125 parameter += "," + probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
127 // Create temporary output series.
128 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
130 // Set input series string
131 string inputSeriesParameter = firstInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture) + "," + secondInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture);
136 _formulaData.Formula("ZTest", parameter, inputSeriesParameter, _tempOutputSeriesName);
138 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
141 zTestResult.firstSeriesMean = points[0].YValues[0];
142 zTestResult.secondSeriesMean = points[1].YValues[0];
143 zTestResult.firstSeriesVariance = points[2].YValues[0];
144 zTestResult.secondSeriesVariance = points[3].YValues[0];
145 zTestResult.zValue = points[4].YValues[0];
146 zTestResult.probabilityZOneTail = points[5].YValues[0];
147 zTestResult.zCriticalValueOneTail = points[6].YValues[0];
148 zTestResult.probabilityZTwoTail = points[7].YValues[0];
149 zTestResult.zCriticalValueTwoTail = points[8].YValues[0];
153 // Remove Temporary output series
154 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
157 // Return result class
163 /// Perform a T Test using Students distribution (T distribution) with unequal variances.
165 /// <param name="hypothesizedMeanDifference">Hypothesized mean difference.</param>
166 /// <param name="probability">Probability.</param>
167 /// <param name="firstInputSeriesName">First input series name.</param>
168 /// <param name="secondInputSeriesName">Second input series name.</param>
169 /// <returns>TTestResult object.</returns>
170 public TTestResult TTestUnequalVariances(
171 double hypothesizedMeanDifference,
173 string firstInputSeriesName,
174 string secondInputSeriesName )
177 if (firstInputSeriesName == null)
178 throw new ArgumentNullException("firstInputSeriesName");
179 if (secondInputSeriesName == null)
180 throw new ArgumentNullException("secondInputSeriesName");
182 // Create output class
183 TTestResult tTestResult = new TTestResult();
185 // Make string with parameters
186 string parameter = hypothesizedMeanDifference.ToString(System.Globalization.CultureInfo.InvariantCulture);
187 parameter += "," + probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
189 // Create temporary output series.
190 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
192 // Set input series string
195 string inputSeriesParameter = firstInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture) + "," + secondInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture);
198 _formulaData.Formula("TTestUnequalVariances", parameter, inputSeriesParameter, _tempOutputSeriesName);
200 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
203 tTestResult.firstSeriesMean = points[0].YValues[0];
204 tTestResult.secondSeriesMean = points[1].YValues[0];
205 tTestResult.firstSeriesVariance = points[2].YValues[0];
206 tTestResult.secondSeriesVariance = points[3].YValues[0];
207 tTestResult.tValue = points[4].YValues[0];
208 tTestResult.degreeOfFreedom = points[5].YValues[0];
209 tTestResult.probabilityTOneTail = points[6].YValues[0];
210 tTestResult.tCriticalValueOneTail = points[7].YValues[0];
211 tTestResult.probabilityTTwoTail = points[8].YValues[0];
212 tTestResult.tCriticalValueTwoTail = points[9].YValues[0];
216 // Remove Temporary output series
217 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
220 // Return result class
226 /// Perform a T Test using Students distribution (T distribution) with equal variances.
228 /// <param name="hypothesizedMeanDifference">Hypothesized mean difference.</param>
229 /// <param name="probability">Probability.</param>
230 /// <param name="firstInputSeriesName">First input series name.</param>
231 /// <param name="secondInputSeriesName">Second input series name.</param>
232 /// <returns>TTestResult object.</returns>
233 public TTestResult TTestEqualVariances(
234 double hypothesizedMeanDifference,
236 string firstInputSeriesName,
237 string secondInputSeriesName )
240 if (firstInputSeriesName == null)
241 throw new ArgumentNullException("firstInputSeriesName");
242 if (secondInputSeriesName == null)
243 throw new ArgumentNullException("secondInputSeriesName");
245 // Create output class
246 TTestResult tTestResult = new TTestResult();
248 // Make string with parameters
249 string parameter = hypothesizedMeanDifference.ToString(System.Globalization.CultureInfo.InvariantCulture);
250 parameter += "," + probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
252 // Create temporary output series.
253 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
255 // Set input series string
256 string inputSeriesParameter = firstInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture) + "," + secondInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture);
261 _formulaData.Formula("TTestEqualVariances", parameter, inputSeriesParameter, _tempOutputSeriesName);
263 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
266 tTestResult.firstSeriesMean = points[0].YValues[0];
267 tTestResult.secondSeriesMean = points[1].YValues[0];
268 tTestResult.firstSeriesVariance = points[2].YValues[0];
269 tTestResult.secondSeriesVariance = points[3].YValues[0];
270 tTestResult.tValue = points[4].YValues[0];
271 tTestResult.degreeOfFreedom = points[5].YValues[0];
272 tTestResult.probabilityTOneTail = points[6].YValues[0];
273 tTestResult.tCriticalValueOneTail = points[7].YValues[0];
274 tTestResult.probabilityTTwoTail = points[8].YValues[0];
275 tTestResult.tCriticalValueTwoTail = points[9].YValues[0];
279 // Remove Temporary output series
280 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
283 // Return result class
288 /// Performs a T Test using Students distribution (T distribution) with paired samples.
289 /// This is useful when there is a natural pairing of observations in samples.
291 /// <param name="hypothesizedMeanDifference">Hypothesized mean difference.</param>
292 /// <param name="probability">Probability.</param>
293 /// <param name="firstInputSeriesName">First input series name.</param>
294 /// <param name="secondInputSeriesName">Second input series name.</param>
295 /// <returns>TTestResult object.</returns>
296 public TTestResult TTestPaired(
297 double hypothesizedMeanDifference,
299 string firstInputSeriesName,
300 string secondInputSeriesName )
303 if (firstInputSeriesName == null)
304 throw new ArgumentNullException("firstInputSeriesName");
305 if (secondInputSeriesName == null)
306 throw new ArgumentNullException("secondInputSeriesName");
308 // Create output class
309 TTestResult tTestResult = new TTestResult();
311 // Make string with parameters
312 string parameter = hypothesizedMeanDifference.ToString(System.Globalization.CultureInfo.InvariantCulture);
313 parameter += "," + probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
315 // Create temporary output series.
316 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
318 // Set input series string
319 string inputSeriesParameter = firstInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture) + "," + secondInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture);
324 _formulaData.Formula("TTestPaired", parameter, inputSeriesParameter, _tempOutputSeriesName);
326 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
329 tTestResult.firstSeriesMean = points[0].YValues[0];
330 tTestResult.secondSeriesMean = points[1].YValues[0];
331 tTestResult.firstSeriesVariance = points[2].YValues[0];
332 tTestResult.secondSeriesVariance = points[3].YValues[0];
333 tTestResult.tValue = points[4].YValues[0];
334 tTestResult.degreeOfFreedom = points[5].YValues[0];
335 tTestResult.probabilityTOneTail = points[6].YValues[0];
336 tTestResult.tCriticalValueOneTail = points[7].YValues[0];
337 tTestResult.probabilityTTwoTail = points[8].YValues[0];
338 tTestResult.tCriticalValueTwoTail = points[9].YValues[0];
342 // Remove Temporary output series
343 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
346 // Return result class
352 /// Removes empty points from series.
354 /// <param name="seriesName">series name</param>
355 private void RemoveEmptyPoints(string seriesName)
357 Series series = _formulaData.Common.DataManager.Series[seriesName];
358 for (int pointIndex = 0; pointIndex < series.Points.Count; pointIndex++)
360 if (series.Points[pointIndex].IsEmpty)
362 series.Points.RemoveAt(pointIndex--);
368 /// This formula performs a two-sample F Test using the F distribution, and is used to see if the samples have different variances.
370 /// <param name="probability">Probability.</param>
371 /// <param name="firstInputSeriesName">First input series name.</param>
372 /// <param name="secondInputSeriesName">Second input series name.</param>
373 /// <returns>FTestResult object.</returns>
374 public FTestResult FTest(
376 string firstInputSeriesName,
377 string secondInputSeriesName )
380 if (firstInputSeriesName == null)
381 throw new ArgumentNullException("firstInputSeriesName");
382 if (secondInputSeriesName == null)
383 throw new ArgumentNullException("secondInputSeriesName");
385 // Create output class
386 FTestResult fTestResult = new FTestResult();
388 // Make string with parameters
389 string parameter = probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
391 // Set input series string
392 string inputSeriesParameter = firstInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture) + "," + secondInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture);
394 // Create temporary output series.
395 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
398 // remove empty points from the collection.
399 RemoveEmptyPoints(firstInputSeriesName);
400 RemoveEmptyPoints(secondInputSeriesName);
405 _formulaData.Formula("FTest", parameter, inputSeriesParameter, _tempOutputSeriesName);
407 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
410 fTestResult.firstSeriesMean = points[0].YValues[0];
411 fTestResult.secondSeriesMean = points[1].YValues[0];
412 fTestResult.firstSeriesVariance = points[2].YValues[0];
413 fTestResult.secondSeriesVariance = points[3].YValues[0];
414 fTestResult.fValue = points[4].YValues[0];
415 fTestResult.probabilityFOneTail = points[5].YValues[0];
416 fTestResult.fCriticalValueOneTail = points[6].YValues[0];
420 // Remove Temporary output series
421 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
424 // Return result class
431 /// An Anova test is used to determine the existence, or absence of a statistically
432 /// significant difference between the mean values of two or more groups of data.
434 /// <param name="probability">Probability.</param>
435 /// <param name="inputSeriesNames">Comma-delimited list of input series names.</param>
436 /// <returns>AnovaResult object.</returns>
437 public AnovaResult Anova(
439 string inputSeriesNames)
442 if (inputSeriesNames == null)
443 throw new ArgumentNullException("inputSeriesNames");
445 // Create output class
446 AnovaResult anovaResult = new AnovaResult();
448 // Make string with parameters
449 string parameter = probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
451 // Create temporary output series.
452 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
457 _formulaData.Formula("Anova", parameter, inputSeriesNames, _tempOutputSeriesName);
459 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
462 anovaResult.sumOfSquaresBetweenGroups = points[0].YValues[0];
463 anovaResult.sumOfSquaresWithinGroups = points[1].YValues[0];
464 anovaResult.sumOfSquaresTotal = points[2].YValues[0];
465 anovaResult.degreeOfFreedomBetweenGroups = points[3].YValues[0];
466 anovaResult.degreeOfFreedomWithinGroups = points[4].YValues[0];
467 anovaResult.degreeOfFreedomTotal = points[5].YValues[0];
468 anovaResult.meanSquareVarianceBetweenGroups = points[6].YValues[0];
469 anovaResult.meanSquareVarianceWithinGroups = points[7].YValues[0];
470 anovaResult.fRatio = points[8].YValues[0];
471 anovaResult.fCriticalValue = points[9].YValues[0];
475 // Remove Temporary output series
476 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
479 // Return result class
485 #region Distributions
488 /// This method returns the probability for the standard normal cumulative distribution function.
490 /// <param name="zValue">The Z value for which the probability is required.</param>
491 /// <returns>Returns value from the standard normal cumulative distribution function.</returns>
492 [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
493 Justification = "Z is a cartesian coordinate and well understood")]
494 public double NormalDistribution(double zValue)
496 // Make string with parameters
497 string parameter = zValue.ToString(System.Globalization.CultureInfo.InvariantCulture);
499 // Create temporary output series.
500 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
503 double result = double.NaN;
506 _formulaData.Formula("NormalDistribution", parameter, _tempOutputSeriesName, _tempOutputSeriesName);
508 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
511 result = points[0].YValues[0];
515 // Remove Temporary output series
516 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
519 // Return result class
525 /// This method returns the inverse of the standard normal cumulative distribution.
527 /// <param name="probability">Probability.</param>
528 /// <returns>Returns value from the inverse standard normal cumulative distribution function.</returns>
529 public double InverseNormalDistribution( double probability )
532 // Make string with parameters
533 string parameter = probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
535 // Create temporary output series.
536 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
539 double result = double.NaN;
542 _formulaData.Formula("InverseNormalDistribution", parameter, _tempOutputSeriesName, _tempOutputSeriesName);
544 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
547 result = points[0].YValues[0];
551 // Remove Temporary output series
552 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
555 // Return result class
560 /// This method returns the cumulative F distribution function probability.
562 /// <param name="value">F Value.</param>
563 /// <param name="firstDegreeOfFreedom">First degree of freedom.</param>
564 /// <param name="secondDegreeOfFreedom">Second degree of freedom.</param>
565 /// <returns>Returns value from the cumulative F distribution function.</returns>
566 public double FDistribution(
568 int firstDegreeOfFreedom,
569 int secondDegreeOfFreedom )
572 // Make string with parameters
573 string parameter = value.ToString(System.Globalization.CultureInfo.InvariantCulture);
574 parameter += "," + firstDegreeOfFreedom.ToString(System.Globalization.CultureInfo.InvariantCulture);
575 parameter += "," + secondDegreeOfFreedom.ToString(System.Globalization.CultureInfo.InvariantCulture);
577 // Create temporary output series.
578 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
581 double result = double.NaN;
584 _formulaData.Formula("FDistribution", parameter, _tempOutputSeriesName, _tempOutputSeriesName);
586 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
589 result = points[0].YValues[0];
593 // Remove Temporary output series
594 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
597 // Return result class
602 /// Returns the inverse of the F cumulative distribution.
604 /// <param name="probability">Probability.</param>
605 /// <param name="firstDegreeOfFreedom">First degree of freedom.</param>
606 /// <param name="secondDegreeOfFreedom">Second degree of freedom.</param>
607 /// <returns>Returns value from the inverse F distribution function.</returns>
608 public double InverseFDistribution(
610 int firstDegreeOfFreedom,
611 int secondDegreeOfFreedom )
614 // Make string with parameters
615 string parameter = probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
616 parameter += "," + firstDegreeOfFreedom.ToString(System.Globalization.CultureInfo.InvariantCulture);
617 parameter += "," + secondDegreeOfFreedom.ToString(System.Globalization.CultureInfo.InvariantCulture);
619 // Create temporary output series.
620 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
623 double result = double.NaN;
626 _formulaData.Formula("InverseFDistribution", parameter, _tempOutputSeriesName, _tempOutputSeriesName);
628 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
631 result = points[0].YValues[0];
635 // Remove Temporary output series
636 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
639 // Return result class
644 /// Returns the probability for the T distribution (student's distribution).
646 /// <param name="value">T value</param>
647 /// <param name="degreeOfFreedom">Degree of freedom</param>
648 /// <param name="oneTail">If true, one-tailed distribution is used; otherwise two-tailed distribution is used.</param>
649 /// <returns>Returns T Distribution cumulative function</returns>
650 public double TDistribution(
656 // Make string with parameters
657 string parameter = value.ToString(System.Globalization.CultureInfo.InvariantCulture);
658 parameter += "," + degreeOfFreedom.ToString(System.Globalization.CultureInfo.InvariantCulture);
669 // Create temporary output series.
670 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
673 double result = double.NaN;
676 _formulaData.Formula("TDistribution", parameter, _tempOutputSeriesName, _tempOutputSeriesName);
678 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
681 result = points[0].YValues[0];
685 // Remove Temporary output series
686 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
689 // Return result class
695 /// Returns the T-value of the T distribution as a function of probability and degrees of freedom.
697 /// <param name="probability">Probability.</param>
698 /// <param name="degreeOfFreedom">Degree of freedom.</param>
699 /// <returns>Returns Inverse T distribution.</returns>
700 public double InverseTDistribution(
702 int degreeOfFreedom )
705 // Make string with parameters
706 string parameter = probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
707 parameter += "," + degreeOfFreedom.ToString(System.Globalization.CultureInfo.InvariantCulture);
709 // Create temporary output series.
710 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
713 double result = double.NaN;
716 _formulaData.Formula("InverseTDistribution", parameter, _tempOutputSeriesName, _tempOutputSeriesName);
718 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
721 result = points[0].YValues[0];
725 // Remove Temporary output series
726 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
729 // Return result class
734 #endregion // Distributions
736 #region Correlation and Covariance
739 /// This method gets the covariance value for two series of data.
741 /// <param name="firstInputSeriesName">First input series name.</param>
742 /// <param name="secondInputSeriesName">Second input series name.</param>
743 /// <returns>Covariance.</returns>
744 public double Covariance(
745 string firstInputSeriesName,
746 string secondInputSeriesName )
749 if (firstInputSeriesName == null)
750 throw new ArgumentNullException("firstInputSeriesName");
751 if (secondInputSeriesName == null)
752 throw new ArgumentNullException("secondInputSeriesName");
754 // Create temporary output series.
755 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
757 // Set input series string
758 string inputSeriesParameter = firstInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture) + "," + secondInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture);
761 double result = double.NaN;
764 _formulaData.Formula("Covariance", "", inputSeriesParameter, _tempOutputSeriesName);
766 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
769 result = points[0].YValues[0];
773 // Remove Temporary output series
774 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
783 /// This method gets the correlation value for two series of data.
785 /// <param name="firstInputSeriesName">First input series name.</param>
786 /// <param name="secondInputSeriesName">Second input series name.</param>
787 /// <returns>Returns Correlation</returns>
788 public double Correlation(
789 string firstInputSeriesName,
790 string secondInputSeriesName )
793 if (firstInputSeriesName == null)
794 throw new ArgumentNullException("firstInputSeriesName");
795 if (secondInputSeriesName == null)
796 throw new ArgumentNullException("secondInputSeriesName");
798 // Create temporary output series.
799 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
801 // Set input series string
802 string inputSeriesParameter = firstInputSeriesName + "," + secondInputSeriesName;
805 double result = double.NaN;
808 _formulaData.Formula("Correlation", "", inputSeriesParameter, _tempOutputSeriesName);
810 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
813 result = points[0].YValues[0];
817 // Remove Temporary output series
818 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
827 /// This method returns the average of all data points stored in the specified series.
829 /// <param name="inputSeriesName">Input series name.</param>
830 /// <returns>The average of all data points.</returns>
832 string inputSeriesName )
835 if (inputSeriesName == null)
836 throw new ArgumentNullException("inputSeriesName");
838 // Create temporary output series.
839 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
841 // Set input series string
842 string inputSeriesParameter = inputSeriesName;
845 double result = double.NaN;
848 _formulaData.Formula("Mean", "", inputSeriesParameter, _tempOutputSeriesName);
850 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
853 result = points[0].YValues[0];
857 // Remove Temporary output series
858 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
867 /// This method returns the median of all data points in the specified series.
869 /// <param name="inputSeriesName">Input series name.</param>
870 /// <returns>Median.</returns>
871 public double Median(
872 string inputSeriesName )
875 if (inputSeriesName == null)
876 throw new ArgumentNullException("inputSeriesName");
878 // Create temporary output series.
879 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
881 // Set input series string
882 string inputSeriesParameter = inputSeriesName;
885 double result = double.NaN;
888 _formulaData.Formula("Median", "", inputSeriesParameter, _tempOutputSeriesName);
890 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
893 result = points[0].YValues[0];
897 // Remove Temporary output series
898 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
907 /// This method returns the variance for a series.
909 /// <param name="inputSeriesName">Input series name.</param>
910 /// <param name="sampleVariance">If true, the data is a sample of the population. If false, it is the entire population.</param>
911 /// <returns>Variance.</returns>
912 public double Variance(
913 string inputSeriesName,
914 bool sampleVariance )
917 if (inputSeriesName == null)
918 throw new ArgumentNullException("inputSeriesName");
920 // Create temporary output series.
921 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
923 // Set input series string
924 string inputSeriesParameter = inputSeriesName;
927 string parameter = sampleVariance.ToString(System.Globalization.CultureInfo.InvariantCulture);
930 double result = double.NaN;
933 _formulaData.Formula("Variance", parameter, inputSeriesParameter, _tempOutputSeriesName);
935 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
938 result = points[0].YValues[0];
942 // Remove Temporary output series
943 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
952 /// This method returns the beta function for two given values.
954 /// <param name="m">First parameter for beta function</param>
955 /// <param name="n">Second Parameter for beta function</param>
956 /// <returns>Returns beta function for the two given values.</returns>
957 [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
958 Justification = "The Beta Function is a mathematical function where arbitrary letters to indicate inputs are common")]
959 public double BetaFunction(
963 // Fix for the VSTS 230829: The BetaFunction for the m=0,n=0 is double.NaN
964 if (m == 0 && n == 0)
967 // Create temporary output series.
968 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
971 string parameter = m.ToString(System.Globalization.CultureInfo.InvariantCulture);
972 parameter += "," + n.ToString(System.Globalization.CultureInfo.InvariantCulture);
975 double result = double.NaN;
978 _formulaData.Formula("BetaFunction", parameter, _tempOutputSeriesName, _tempOutputSeriesName);
980 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
983 result = points[0].YValues[0];
987 // Remove Temporary output series
988 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
996 /// This method returns the gamma function value for the given variable.
998 /// <param name="value">The value.</param>
999 /// <returns>Returns gamma function</returns>
1000 public double GammaFunction(
1004 // Create temporary output series.
1005 _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
1007 // Formula parameter
1008 string parameter = value.ToString(System.Globalization.CultureInfo.InvariantCulture);
1011 double result = double.NaN;
1014 _formulaData.Formula("GammaFunction", parameter, _tempOutputSeriesName, _tempOutputSeriesName);
1016 DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
1018 // Fill Output value
1019 result = points[0].YValues[0];
1023 // Remove Temporary output series
1024 _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
1035 #region Output classes used to store statistical calculations results
1038 /// The TTestResult class stores the results of the TTest statistical calculations.
1041 [AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
1042 [AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
1044 public class TTestResult
1049 /// First series' mean.
1051 internal double firstSeriesMean = 0.0;
1054 /// Second series' mean.
1056 internal double secondSeriesMean = 0.0;
1059 /// First series' variance.
1061 internal double firstSeriesVariance = 0.0;
1064 /// Second series' variance.
1066 internal double secondSeriesVariance = 0.0;
1071 internal double tValue = 0.0;
1074 /// Degree of freedom.
1076 internal double degreeOfFreedom = 0.0;
1079 /// Probability T one tail.
1081 internal double probabilityTOneTail = 0.0;
1084 /// Critical T one tail.
1086 internal double tCriticalValueOneTail = 0.0;
1089 /// Probability T two tails.
1091 internal double probabilityTTwoTail = 0.0;
1094 /// Critical T two tails.
1096 internal double tCriticalValueTwoTail = 0.0;
1103 /// Gets the mean of the first series.
1105 public double FirstSeriesMean
1109 return firstSeriesMean;
1114 /// Gets the mean of the second series.
1116 public double SecondSeriesMean
1120 return secondSeriesMean;
1125 /// Gets the variance of the first series.
1127 public double FirstSeriesVariance
1131 return firstSeriesVariance;
1136 /// Gets the variance of the second series.
1138 public double SecondSeriesVariance
1142 return secondSeriesVariance;
1147 /// Gets the T value.
1149 public double TValue
1158 /// Gets the degree of freedom.
1160 public double DegreeOfFreedom
1164 return degreeOfFreedom;
1169 /// Gets the probability T one tail value.
1171 [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly",
1172 Justification = "T One Tail is a statistics term. 'Tone' is not the intended word here.")]
1173 public double ProbabilityTOneTail
1177 return probabilityTOneTail;
1182 /// Gets the critical T one tail value.
1184 public double TCriticalValueOneTail
1188 return tCriticalValueOneTail;
1193 /// Gets the probability T two tails value.
1195 public double ProbabilityTTwoTail
1199 return probabilityTTwoTail;
1204 /// Gets the critical T two tails value.
1206 public double TCriticalValueTwoTail
1210 return tCriticalValueTwoTail;
1218 /// The FTestResult class stores the results of the FTest statistical calculations.
1221 [AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
1222 [AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
1224 public class FTestResult
1229 /// First series' mean.
1231 internal double firstSeriesMean = 0.0;
1234 /// Second series' mean.
1236 internal double secondSeriesMean = 0.0;
1239 /// First series' variance.
1241 internal double firstSeriesVariance = 0.0;
1244 /// Second series' variance.
1246 internal double secondSeriesVariance = 0.0;
1251 internal double fValue = 0.0;
1254 /// Probability F one tail.
1256 internal double probabilityFOneTail = 0.0;
1259 /// Critical F one tail.
1261 internal double fCriticalValueOneTail = 0.0;
1268 /// Gets the mean of the first series.
1270 public double FirstSeriesMean
1274 return firstSeriesMean;
1279 /// Gets the mean of the second series.
1281 public double SecondSeriesMean
1285 return secondSeriesMean;
1290 /// Gets the variance of the first series.
1292 public double FirstSeriesVariance
1296 return firstSeriesVariance;
1301 /// Gets the variance of the second series.
1303 public double SecondSeriesVariance
1307 return secondSeriesVariance;
1312 /// Gets the F value.
1314 public double FValue
1323 /// Gets the probability F one tail.
1325 public double ProbabilityFOneTail
1329 return probabilityFOneTail;
1334 /// Gets the critical F one tail.
1336 public double FCriticalValueOneTail
1340 return fCriticalValueOneTail;
1348 /// The AnovaResult class stores the results of the Anova statistical calculations.
1351 [AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
1352 [AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
1354 public class AnovaResult
1359 /// Sum of squares between groups.
1361 internal double sumOfSquaresBetweenGroups = 0.0;
1364 /// Sum of squares within groups.
1366 internal double sumOfSquaresWithinGroups = 0.0;
1369 /// Total sum of squares.
1371 internal double sumOfSquaresTotal = 0.0;
1374 /// Degree of freedom between groups.
1376 internal double degreeOfFreedomBetweenGroups = 0.0;
1379 /// Degree of freedom within groups.
1381 internal double degreeOfFreedomWithinGroups = 0.0;
1384 /// Total degree of freedom.
1386 internal double degreeOfFreedomTotal = 0.0;
1389 /// Mean square variance between groups.
1391 internal double meanSquareVarianceBetweenGroups = 0.0;
1394 /// Mean square variance between groups.
1396 internal double meanSquareVarianceWithinGroups = 0.0;
1401 internal double fRatio = 0.0;
1404 /// F critical value.
1406 internal double fCriticalValue = 0.0;
1413 /// Gets the sum of squares between groups.
1415 public double SumOfSquaresBetweenGroups
1419 return sumOfSquaresBetweenGroups;
1424 /// Gets the sum of squares within groups.
1426 public double SumOfSquaresWithinGroups
1430 return sumOfSquaresWithinGroups;
1436 /// Gets the total sum of squares.
1438 public double SumOfSquaresTotal
1442 return sumOfSquaresTotal;
1447 /// Gets the degree of freedom between groups.
1449 public double DegreeOfFreedomBetweenGroups
1453 return degreeOfFreedomBetweenGroups;
1458 /// Gets the degree of freedom within groups.
1460 public double DegreeOfFreedomWithinGroups
1464 return degreeOfFreedomWithinGroups;
1469 /// Gets the total degree of freedom.
1471 public double DegreeOfFreedomTotal
1475 return degreeOfFreedomTotal;
1480 /// Gets the mean square variance between groups.
1482 public double MeanSquareVarianceBetweenGroups
1486 return meanSquareVarianceBetweenGroups;
1491 /// Gets the mean square variance within groups.
1493 public double MeanSquareVarianceWithinGroups
1497 return meanSquareVarianceWithinGroups;
1502 /// Gets the F ratio.
1504 public double FRatio
1513 /// Gets the F critical value.
1515 public double FCriticalValue
1519 return fCriticalValue;
1527 /// The ZTestResult class stores the results of the ZTest statistical calculations.
1530 [AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
1531 [AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
1533 public class ZTestResult
1538 /// ZTestResult Constructor
1540 public ZTestResult()
1544 #endregion // Constructor
1548 // Internal fields used for public properties
1549 internal double firstSeriesMean;
1550 internal double secondSeriesMean;
1551 internal double firstSeriesVariance;
1552 internal double secondSeriesVariance;
1553 internal double zValue;
1554 internal double probabilityZOneTail;
1555 internal double zCriticalValueOneTail;
1556 internal double probabilityZTwoTail;
1557 internal double zCriticalValueTwoTail;
1560 #endregion // Fields
1565 /// Gets the mean of the first series.
1567 public double FirstSeriesMean
1571 return firstSeriesMean;
1576 /// Gets the mean of the second series.
1578 public double SecondSeriesMean
1582 return secondSeriesMean;
1587 /// Gets the variance of the first series.
1589 public double FirstSeriesVariance
1593 return firstSeriesVariance;
1598 /// Gets the variance of the second series.
1600 public double SecondSeriesVariance
1604 return secondSeriesVariance;
1609 /// Gets the Z Value
1611 public double ZValue
1620 /// Gets the probability Z one tail value.
1622 [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly",
1623 Justification = "Z One Tail is a statistics term. 'Zone' is not the intended word here.")]
1624 public double ProbabilityZOneTail
1628 return probabilityZOneTail;
1633 /// Gets the Z critical value one tail value.
1635 public double ZCriticalValueOneTail
1639 return zCriticalValueOneTail;
1644 /// Gets the probability Z two tail value.
1646 public double ProbabilityZTwoTail
1650 return probabilityZTwoTail;
1655 /// Gets the Z critical value two tail value.
1657 public double ZCriticalValueTwoTail
1661 return zCriticalValueTwoTail;
1665 #endregion // Properties
1668 #endregion // Output Classes