Statistics.cs 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT license.
  3. // See the LICENSE file in the project root for more information.
  4. //
  5. // Purpose: StatisticFormula class provides helper methods for statistical
  6. // calculations like TTest, FTest, Anova, ZTest and others.
  7. // Actual calculations are made in the DataFormula class and
  8. // the StatisticFormula class mange formula parameters, input and
  9. // output series.
  10. // :
  11. // TTestResult, FTestResult, AnovaResult and ZTestResult
  12. // classes are used to store the results of the calculatiions.
  13. // :
  14. // StatisticFormula class is exposed to the user through
  15. // DataManipulator.StatisticFormula property. Here is an example of
  16. // using the Anova test:
  17. // :
  18. // AnovaResult result = Chart1.DataManipulator.StatisticFormula.Anova(0.6, "Group1,Group2,Group3");
  19. // :
  20. // NOTE: First versions of the chart use single method to execute
  21. // ALL formulas. Formula name and parameters were passed as
  22. // strings. Input and outpat data was passed through data
  23. // series.
  24. // :
  25. // This approach was hard to use by the end-user and was
  26. // changed to a specific method for each formula. StatisticFormula
  27. // class provides that simplified interface for all statistics
  28. // formulas. Internally it still uses the DataFormula.Formula
  29. // method with string parameters.
  30. //
  31. using System;
  32. using System.Diagnostics.CodeAnalysis;
  33. namespace FastReport.DataVisualization.Charting
  34. {
  35. /// <summary>
  36. /// The StatisticFormula class provides helper methods for statistical calculations.
  37. /// Actual calculations are made in the DataFormula class and the StatisticFormula
  38. /// class provide a simplified API which automatically prepares parameters and
  39. /// deals with input and output series.
  40. /// </summary>
  41. public class StatisticFormula
  42. {
  43. #region Fields
  44. // Name used for temporary data series
  45. private string _tempOutputSeriesName = "Statistical Analyses Formula Temporary Output Series 2552003";
  46. // Reference to the class which describes calculation settings and
  47. // provides access to chart common elements.
  48. private DataFormula _formulaData = null;
  49. #endregion // Fields
  50. #region Constructor
  51. /// <summary>
  52. /// StatisticFormula Constructor
  53. /// </summary>
  54. /// <param name="formulaData">Formula Data</param>
  55. internal StatisticFormula( DataFormula formulaData )
  56. {
  57. this._formulaData = formulaData;
  58. }
  59. #endregion // Constructor
  60. #region Tests
  61. /// <summary>
  62. /// This formula performs a Z Test using Normal distribution.
  63. /// </summary>
  64. /// <param name="hypothesizedMeanDifference">Hypothesized mean difference.</param>
  65. /// <param name="varianceFirstGroup">Variance first group.</param>
  66. /// <param name="varianceSecondGroup">Variance second group.</param>
  67. /// <param name="probability">Probability.</param>
  68. /// <param name="firstInputSeriesName">First input series name.</param>
  69. /// <param name="secondInputSeriesName">Second input series name.</param>
  70. /// <returns>ZTestResult object.</returns>
  71. public ZTestResult ZTest(
  72. double hypothesizedMeanDifference,
  73. double varianceFirstGroup,
  74. double varianceSecondGroup,
  75. double probability,
  76. string firstInputSeriesName,
  77. string secondInputSeriesName )
  78. {
  79. // Check arguments
  80. if (firstInputSeriesName == null)
  81. throw new ArgumentNullException("firstInputSeriesName");
  82. if (secondInputSeriesName == null)
  83. throw new ArgumentNullException("secondInputSeriesName");
  84. // Create output class
  85. ZTestResult zTestResult = new ZTestResult();
  86. // Make string with parameters
  87. string parameter = hypothesizedMeanDifference.ToString(System.Globalization.CultureInfo.InvariantCulture);
  88. parameter += "," + varianceFirstGroup.ToString(System.Globalization.CultureInfo.InvariantCulture);
  89. parameter += "," + varianceSecondGroup.ToString(System.Globalization.CultureInfo.InvariantCulture);
  90. parameter += "," + probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
  91. // Create temporary output series.
  92. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  93. // Set input series string
  94. string inputSeriesParameter = firstInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture) + "," + secondInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture);
  95. // Execute formula
  96. try
  97. {
  98. _formulaData.Formula("ZTest", parameter, inputSeriesParameter, _tempOutputSeriesName);
  99. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  100. // Fill Output class
  101. zTestResult.firstSeriesMean = points[0].YValues[0];
  102. zTestResult.secondSeriesMean = points[1].YValues[0];
  103. zTestResult.firstSeriesVariance = points[2].YValues[0];
  104. zTestResult.secondSeriesVariance = points[3].YValues[0];
  105. zTestResult.zValue = points[4].YValues[0];
  106. zTestResult.probabilityZOneTail = points[5].YValues[0];
  107. zTestResult.zCriticalValueOneTail = points[6].YValues[0];
  108. zTestResult.probabilityZTwoTail = points[7].YValues[0];
  109. zTestResult.zCriticalValueTwoTail = points[8].YValues[0];
  110. }
  111. finally
  112. {
  113. // Remove Temporary output series
  114. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  115. }
  116. // Return result class
  117. return zTestResult;
  118. }
  119. /// <summary>
  120. /// Perform a T Test using Students distribution (T distribution) with unequal variances.
  121. /// </summary>
  122. /// <param name="hypothesizedMeanDifference">Hypothesized mean difference.</param>
  123. /// <param name="probability">Probability.</param>
  124. /// <param name="firstInputSeriesName">First input series name.</param>
  125. /// <param name="secondInputSeriesName">Second input series name.</param>
  126. /// <returns>TTestResult object.</returns>
  127. public TTestResult TTestUnequalVariances(
  128. double hypothesizedMeanDifference,
  129. double probability,
  130. string firstInputSeriesName,
  131. string secondInputSeriesName )
  132. {
  133. // Check arguments
  134. if (firstInputSeriesName == null)
  135. throw new ArgumentNullException("firstInputSeriesName");
  136. if (secondInputSeriesName == null)
  137. throw new ArgumentNullException("secondInputSeriesName");
  138. // Create output class
  139. TTestResult tTestResult = new TTestResult();
  140. // Make string with parameters
  141. string parameter = hypothesizedMeanDifference.ToString(System.Globalization.CultureInfo.InvariantCulture);
  142. parameter += "," + probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
  143. // Create temporary output series.
  144. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  145. // Set input series string
  146. try
  147. {
  148. string inputSeriesParameter = firstInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture) + "," + secondInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture);
  149. // Execute formula
  150. _formulaData.Formula("TTestUnequalVariances", parameter, inputSeriesParameter, _tempOutputSeriesName);
  151. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  152. // Fill Output class
  153. tTestResult.firstSeriesMean = points[0].YValues[0];
  154. tTestResult.secondSeriesMean = points[1].YValues[0];
  155. tTestResult.firstSeriesVariance = points[2].YValues[0];
  156. tTestResult.secondSeriesVariance = points[3].YValues[0];
  157. tTestResult.tValue = points[4].YValues[0];
  158. tTestResult.degreeOfFreedom = points[5].YValues[0];
  159. tTestResult.probabilityTOneTail = points[6].YValues[0];
  160. tTestResult.tCriticalValueOneTail = points[7].YValues[0];
  161. tTestResult.probabilityTTwoTail = points[8].YValues[0];
  162. tTestResult.tCriticalValueTwoTail = points[9].YValues[0];
  163. }
  164. finally
  165. {
  166. // Remove Temporary output series
  167. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  168. }
  169. // Return result class
  170. return tTestResult;
  171. }
  172. /// <summary>
  173. /// Perform a T Test using Students distribution (T distribution) with equal variances.
  174. /// </summary>
  175. /// <param name="hypothesizedMeanDifference">Hypothesized mean difference.</param>
  176. /// <param name="probability">Probability.</param>
  177. /// <param name="firstInputSeriesName">First input series name.</param>
  178. /// <param name="secondInputSeriesName">Second input series name.</param>
  179. /// <returns>TTestResult object.</returns>
  180. public TTestResult TTestEqualVariances(
  181. double hypothesizedMeanDifference,
  182. double probability,
  183. string firstInputSeriesName,
  184. string secondInputSeriesName )
  185. {
  186. // Check arguments
  187. if (firstInputSeriesName == null)
  188. throw new ArgumentNullException("firstInputSeriesName");
  189. if (secondInputSeriesName == null)
  190. throw new ArgumentNullException("secondInputSeriesName");
  191. // Create output class
  192. TTestResult tTestResult = new TTestResult();
  193. // Make string with parameters
  194. string parameter = hypothesizedMeanDifference.ToString(System.Globalization.CultureInfo.InvariantCulture);
  195. parameter += "," + probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
  196. // Create temporary output series.
  197. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  198. // Set input series string
  199. string inputSeriesParameter = firstInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture) + "," + secondInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture);
  200. // Execute formula
  201. try
  202. {
  203. _formulaData.Formula("TTestEqualVariances", parameter, inputSeriesParameter, _tempOutputSeriesName);
  204. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  205. // Fill Output class
  206. tTestResult.firstSeriesMean = points[0].YValues[0];
  207. tTestResult.secondSeriesMean = points[1].YValues[0];
  208. tTestResult.firstSeriesVariance = points[2].YValues[0];
  209. tTestResult.secondSeriesVariance = points[3].YValues[0];
  210. tTestResult.tValue = points[4].YValues[0];
  211. tTestResult.degreeOfFreedom = points[5].YValues[0];
  212. tTestResult.probabilityTOneTail = points[6].YValues[0];
  213. tTestResult.tCriticalValueOneTail = points[7].YValues[0];
  214. tTestResult.probabilityTTwoTail = points[8].YValues[0];
  215. tTestResult.tCriticalValueTwoTail = points[9].YValues[0];
  216. }
  217. finally
  218. {
  219. // Remove Temporary output series
  220. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  221. }
  222. // Return result class
  223. return tTestResult;
  224. }
  225. /// <summary>
  226. /// Performs a T Test using Students distribution (T distribution) with paired samples.
  227. /// This is useful when there is a natural pairing of observations in samples.
  228. /// </summary>
  229. /// <param name="hypothesizedMeanDifference">Hypothesized mean difference.</param>
  230. /// <param name="probability">Probability.</param>
  231. /// <param name="firstInputSeriesName">First input series name.</param>
  232. /// <param name="secondInputSeriesName">Second input series name.</param>
  233. /// <returns>TTestResult object.</returns>
  234. public TTestResult TTestPaired(
  235. double hypothesizedMeanDifference,
  236. double probability,
  237. string firstInputSeriesName,
  238. string secondInputSeriesName )
  239. {
  240. // Check arguments
  241. if (firstInputSeriesName == null)
  242. throw new ArgumentNullException("firstInputSeriesName");
  243. if (secondInputSeriesName == null)
  244. throw new ArgumentNullException("secondInputSeriesName");
  245. // Create output class
  246. TTestResult tTestResult = new TTestResult();
  247. // Make string with parameters
  248. string parameter = hypothesizedMeanDifference.ToString(System.Globalization.CultureInfo.InvariantCulture);
  249. parameter += "," + probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
  250. // Create temporary output series.
  251. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  252. // Set input series string
  253. string inputSeriesParameter = firstInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture) + "," + secondInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture);
  254. // Execute formula
  255. try
  256. {
  257. _formulaData.Formula("TTestPaired", parameter, inputSeriesParameter, _tempOutputSeriesName);
  258. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  259. // Fill Output class
  260. tTestResult.firstSeriesMean = points[0].YValues[0];
  261. tTestResult.secondSeriesMean = points[1].YValues[0];
  262. tTestResult.firstSeriesVariance = points[2].YValues[0];
  263. tTestResult.secondSeriesVariance = points[3].YValues[0];
  264. tTestResult.tValue = points[4].YValues[0];
  265. tTestResult.degreeOfFreedom = points[5].YValues[0];
  266. tTestResult.probabilityTOneTail = points[6].YValues[0];
  267. tTestResult.tCriticalValueOneTail = points[7].YValues[0];
  268. tTestResult.probabilityTTwoTail = points[8].YValues[0];
  269. tTestResult.tCriticalValueTwoTail = points[9].YValues[0];
  270. }
  271. finally
  272. {
  273. // Remove Temporary output series
  274. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  275. }
  276. // Return result class
  277. return tTestResult;
  278. }
  279. /// <summary>
  280. /// Removes empty points from series.
  281. /// </summary>
  282. /// <param name="seriesName">series name</param>
  283. private void RemoveEmptyPoints(string seriesName)
  284. {
  285. Series series = _formulaData.Common.DataManager.Series[seriesName];
  286. for (int pointIndex = 0; pointIndex < series.Points.Count; pointIndex++)
  287. {
  288. if (series.Points[pointIndex].IsEmpty)
  289. {
  290. series.Points.RemoveAt(pointIndex--);
  291. }
  292. }
  293. }
  294. /// <summary>
  295. /// This formula performs a two-sample F Test using the F distribution, and is used to see if the samples have different variances.
  296. /// </summary>
  297. /// <param name="probability">Probability.</param>
  298. /// <param name="firstInputSeriesName">First input series name.</param>
  299. /// <param name="secondInputSeriesName">Second input series name.</param>
  300. /// <returns>FTestResult object.</returns>
  301. public FTestResult FTest(
  302. double probability,
  303. string firstInputSeriesName,
  304. string secondInputSeriesName )
  305. {
  306. // Check arguments
  307. if (firstInputSeriesName == null)
  308. throw new ArgumentNullException("firstInputSeriesName");
  309. if (secondInputSeriesName == null)
  310. throw new ArgumentNullException("secondInputSeriesName");
  311. // Create output class
  312. FTestResult fTestResult = new FTestResult();
  313. // Make string with parameters
  314. string parameter = probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
  315. // Set input series string
  316. string inputSeriesParameter = firstInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture) + "," + secondInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture);
  317. // Create temporary output series.
  318. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  319. // remove empty points from the collection.
  320. RemoveEmptyPoints(firstInputSeriesName);
  321. RemoveEmptyPoints(secondInputSeriesName);
  322. // Execute formula
  323. try
  324. {
  325. _formulaData.Formula("FTest", parameter, inputSeriesParameter, _tempOutputSeriesName);
  326. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  327. // Fill Output class
  328. fTestResult.firstSeriesMean = points[0].YValues[0];
  329. fTestResult.secondSeriesMean = points[1].YValues[0];
  330. fTestResult.firstSeriesVariance = points[2].YValues[0];
  331. fTestResult.secondSeriesVariance = points[3].YValues[0];
  332. fTestResult.fValue = points[4].YValues[0];
  333. fTestResult.probabilityFOneTail = points[5].YValues[0];
  334. fTestResult.fCriticalValueOneTail = points[6].YValues[0];
  335. }
  336. finally
  337. {
  338. // Remove Temporary output series
  339. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  340. }
  341. // Return result class
  342. return fTestResult;
  343. }
  344. /// <summary>
  345. /// An Anova test is used to determine the existence, or absence of a statistically
  346. /// significant difference between the mean values of two or more groups of data.
  347. /// </summary>
  348. /// <param name="probability">Probability.</param>
  349. /// <param name="inputSeriesNames">Comma-delimited list of input series names.</param>
  350. /// <returns>AnovaResult object.</returns>
  351. public AnovaResult Anova(
  352. double probability,
  353. string inputSeriesNames)
  354. {
  355. // Check arguments
  356. if (inputSeriesNames == null)
  357. throw new ArgumentNullException("inputSeriesNames");
  358. // Create output class
  359. AnovaResult anovaResult = new AnovaResult();
  360. // Make string with parameters
  361. string parameter = probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
  362. // Create temporary output series.
  363. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  364. // Execute formula
  365. try
  366. {
  367. _formulaData.Formula("Anova", parameter, inputSeriesNames, _tempOutputSeriesName);
  368. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  369. // Fill Output class
  370. anovaResult.sumOfSquaresBetweenGroups = points[0].YValues[0];
  371. anovaResult.sumOfSquaresWithinGroups = points[1].YValues[0];
  372. anovaResult.sumOfSquaresTotal = points[2].YValues[0];
  373. anovaResult.degreeOfFreedomBetweenGroups = points[3].YValues[0];
  374. anovaResult.degreeOfFreedomWithinGroups = points[4].YValues[0];
  375. anovaResult.degreeOfFreedomTotal = points[5].YValues[0];
  376. anovaResult.meanSquareVarianceBetweenGroups = points[6].YValues[0];
  377. anovaResult.meanSquareVarianceWithinGroups = points[7].YValues[0];
  378. anovaResult.fRatio = points[8].YValues[0];
  379. anovaResult.fCriticalValue = points[9].YValues[0];
  380. }
  381. finally
  382. {
  383. // Remove Temporary output series
  384. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  385. }
  386. // Return result class
  387. return anovaResult;
  388. }
  389. #endregion // Test
  390. #region Distributions
  391. /// <summary>
  392. /// This method returns the probability for the standard normal cumulative distribution function.
  393. /// </summary>
  394. /// <param name="zValue">The Z value for which the probability is required.</param>
  395. /// <returns>Returns value from the standard normal cumulative distribution function.</returns>
  396. [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
  397. Justification = "Z is a cartesian coordinate and well understood")]
  398. public double NormalDistribution(double zValue)
  399. {
  400. // Make string with parameters
  401. string parameter = zValue.ToString(System.Globalization.CultureInfo.InvariantCulture);
  402. // Create temporary output series.
  403. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  404. // Execute formula
  405. double result = double.NaN;
  406. try
  407. {
  408. _formulaData.Formula("NormalDistribution", parameter, _tempOutputSeriesName, _tempOutputSeriesName);
  409. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  410. // Fill Output class
  411. result = points[0].YValues[0];
  412. }
  413. finally
  414. {
  415. // Remove Temporary output series
  416. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  417. }
  418. // Return result class
  419. return result;
  420. }
  421. /// <summary>
  422. /// This method returns the inverse of the standard normal cumulative distribution.
  423. /// </summary>
  424. /// <param name="probability">Probability.</param>
  425. /// <returns>Returns value from the inverse standard normal cumulative distribution function.</returns>
  426. public double InverseNormalDistribution( double probability )
  427. {
  428. // Make string with parameters
  429. string parameter = probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
  430. // Create temporary output series.
  431. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  432. // Execute formula
  433. double result = double.NaN;
  434. try
  435. {
  436. _formulaData.Formula("InverseNormalDistribution", parameter, _tempOutputSeriesName, _tempOutputSeriesName);
  437. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  438. // Fill Output class
  439. result = points[0].YValues[0];
  440. }
  441. finally
  442. {
  443. // Remove Temporary output series
  444. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  445. }
  446. // Return result class
  447. return result;
  448. }
  449. /// <summary>
  450. /// This method returns the cumulative F distribution function probability.
  451. /// </summary>
  452. /// <param name="value">F Value.</param>
  453. /// <param name="firstDegreeOfFreedom">First degree of freedom.</param>
  454. /// <param name="secondDegreeOfFreedom">Second degree of freedom.</param>
  455. /// <returns>Returns value from the cumulative F distribution function.</returns>
  456. public double FDistribution(
  457. double value,
  458. int firstDegreeOfFreedom,
  459. int secondDegreeOfFreedom )
  460. {
  461. // Make string with parameters
  462. string parameter = value.ToString(System.Globalization.CultureInfo.InvariantCulture);
  463. parameter += "," + firstDegreeOfFreedom.ToString(System.Globalization.CultureInfo.InvariantCulture);
  464. parameter += "," + secondDegreeOfFreedom.ToString(System.Globalization.CultureInfo.InvariantCulture);
  465. // Create temporary output series.
  466. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  467. // Execute formula
  468. double result = double.NaN;
  469. try
  470. {
  471. _formulaData.Formula("FDistribution", parameter, _tempOutputSeriesName, _tempOutputSeriesName);
  472. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  473. // Fill Output class
  474. result = points[0].YValues[0];
  475. }
  476. finally
  477. {
  478. // Remove Temporary output series
  479. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  480. }
  481. // Return result class
  482. return result;
  483. }
  484. /// <summary>
  485. /// Returns the inverse of the F cumulative distribution.
  486. /// </summary>
  487. /// <param name="probability">Probability.</param>
  488. /// <param name="firstDegreeOfFreedom">First degree of freedom.</param>
  489. /// <param name="secondDegreeOfFreedom">Second degree of freedom.</param>
  490. /// <returns>Returns value from the inverse F distribution function.</returns>
  491. public double InverseFDistribution(
  492. double probability,
  493. int firstDegreeOfFreedom,
  494. int secondDegreeOfFreedom )
  495. {
  496. // Make string with parameters
  497. string parameter = probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
  498. parameter += "," + firstDegreeOfFreedom.ToString(System.Globalization.CultureInfo.InvariantCulture);
  499. parameter += "," + secondDegreeOfFreedom.ToString(System.Globalization.CultureInfo.InvariantCulture);
  500. // Create temporary output series.
  501. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  502. // Execute formula
  503. double result = double.NaN;
  504. try
  505. {
  506. _formulaData.Formula("InverseFDistribution", parameter, _tempOutputSeriesName, _tempOutputSeriesName);
  507. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  508. // Fill Output class
  509. result = points[0].YValues[0];
  510. }
  511. finally
  512. {
  513. // Remove Temporary output series
  514. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  515. }
  516. // Return result class
  517. return result;
  518. }
  519. /// <summary>
  520. /// Returns the probability for the T distribution (student's distribution).
  521. /// </summary>
  522. /// <param name="value">T value</param>
  523. /// <param name="degreeOfFreedom">Degree of freedom</param>
  524. /// <param name="oneTail">If true, one-tailed distribution is used; otherwise two-tailed distribution is used.</param>
  525. /// <returns>Returns T Distribution cumulative function</returns>
  526. public double TDistribution(
  527. double value,
  528. int degreeOfFreedom,
  529. bool oneTail )
  530. {
  531. // Make string with parameters
  532. string parameter = value.ToString(System.Globalization.CultureInfo.InvariantCulture);
  533. parameter += "," + degreeOfFreedom.ToString(System.Globalization.CultureInfo.InvariantCulture);
  534. if( oneTail )
  535. {
  536. parameter += ",1";
  537. }
  538. else
  539. {
  540. parameter += ",2";
  541. }
  542. // Create temporary output series.
  543. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  544. // Execute formula
  545. double result = double.NaN;
  546. try
  547. {
  548. _formulaData.Formula("TDistribution", parameter, _tempOutputSeriesName, _tempOutputSeriesName);
  549. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  550. // Fill Output class
  551. result = points[0].YValues[0];
  552. }
  553. finally
  554. {
  555. // Remove Temporary output series
  556. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  557. }
  558. // Return result class
  559. return result;
  560. }
  561. /// <summary>
  562. /// Returns the T-value of the T distribution as a function of probability and degrees of freedom.
  563. /// </summary>
  564. /// <param name="probability">Probability.</param>
  565. /// <param name="degreeOfFreedom">Degree of freedom.</param>
  566. /// <returns>Returns Inverse T distribution.</returns>
  567. public double InverseTDistribution(
  568. double probability,
  569. int degreeOfFreedom )
  570. {
  571. // Make string with parameters
  572. string parameter = probability.ToString(System.Globalization.CultureInfo.InvariantCulture);
  573. parameter += "," + degreeOfFreedom.ToString(System.Globalization.CultureInfo.InvariantCulture);
  574. // Create temporary output series.
  575. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  576. // Execute formula
  577. double result = double.NaN;
  578. try
  579. {
  580. _formulaData.Formula("InverseTDistribution", parameter, _tempOutputSeriesName, _tempOutputSeriesName);
  581. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  582. // Fill Output class
  583. result = points[0].YValues[0];
  584. }
  585. finally
  586. {
  587. // Remove Temporary output series
  588. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  589. }
  590. // Return result class
  591. return result;
  592. }
  593. #endregion // Distributions
  594. #region Correlation and Covariance
  595. /// <summary>
  596. /// This method gets the covariance value for two series of data.
  597. /// </summary>
  598. /// <param name="firstInputSeriesName">First input series name.</param>
  599. /// <param name="secondInputSeriesName">Second input series name.</param>
  600. /// <returns>Covariance.</returns>
  601. public double Covariance(
  602. string firstInputSeriesName,
  603. string secondInputSeriesName )
  604. {
  605. // Check arguments
  606. if (firstInputSeriesName == null)
  607. throw new ArgumentNullException("firstInputSeriesName");
  608. if (secondInputSeriesName == null)
  609. throw new ArgumentNullException("secondInputSeriesName");
  610. // Create temporary output series.
  611. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  612. // Set input series string
  613. string inputSeriesParameter = firstInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture) + "," + secondInputSeriesName.ToString(System.Globalization.CultureInfo.InvariantCulture);
  614. // Execute formula
  615. double result = double.NaN;
  616. try
  617. {
  618. _formulaData.Formula("Covariance", "", inputSeriesParameter, _tempOutputSeriesName);
  619. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  620. // Fill Output value
  621. result = points[0].YValues[0];
  622. }
  623. finally
  624. {
  625. // Remove Temporary output series
  626. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  627. }
  628. // Return result
  629. return result;
  630. }
  631. /// <summary>
  632. /// This method gets the correlation value for two series of data.
  633. /// </summary>
  634. /// <param name="firstInputSeriesName">First input series name.</param>
  635. /// <param name="secondInputSeriesName">Second input series name.</param>
  636. /// <returns>Returns Correlation</returns>
  637. public double Correlation(
  638. string firstInputSeriesName,
  639. string secondInputSeriesName )
  640. {
  641. // Check arguments
  642. if (firstInputSeriesName == null)
  643. throw new ArgumentNullException("firstInputSeriesName");
  644. if (secondInputSeriesName == null)
  645. throw new ArgumentNullException("secondInputSeriesName");
  646. // Create temporary output series.
  647. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  648. // Set input series string
  649. string inputSeriesParameter = firstInputSeriesName + "," + secondInputSeriesName;
  650. // Execute formula
  651. double result = double.NaN;
  652. try
  653. {
  654. _formulaData.Formula("Correlation", "", inputSeriesParameter, _tempOutputSeriesName);
  655. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  656. // Fill Output value
  657. result = points[0].YValues[0];
  658. }
  659. finally
  660. {
  661. // Remove Temporary output series
  662. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  663. }
  664. // Return result
  665. return result;
  666. }
  667. /// <summary>
  668. /// This method returns the average of all data points stored in the specified series.
  669. /// </summary>
  670. /// <param name="inputSeriesName">Input series name.</param>
  671. /// <returns>The average of all data points.</returns>
  672. public double Mean(
  673. string inputSeriesName )
  674. {
  675. // Check arguments
  676. if (inputSeriesName == null)
  677. throw new ArgumentNullException("inputSeriesName");
  678. // Create temporary output series.
  679. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  680. // Set input series string
  681. string inputSeriesParameter = inputSeriesName;
  682. // Execute formula
  683. double result = double.NaN;
  684. try
  685. {
  686. _formulaData.Formula("Mean", "", inputSeriesParameter, _tempOutputSeriesName);
  687. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  688. // Fill Output value
  689. result = points[0].YValues[0];
  690. }
  691. finally
  692. {
  693. // Remove Temporary output series
  694. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  695. }
  696. // Return result
  697. return result;
  698. }
  699. /// <summary>
  700. /// This method returns the median of all data points in the specified series.
  701. /// </summary>
  702. /// <param name="inputSeriesName">Input series name.</param>
  703. /// <returns>Median.</returns>
  704. public double Median(
  705. string inputSeriesName )
  706. {
  707. // Check arguments
  708. if (inputSeriesName == null)
  709. throw new ArgumentNullException("inputSeriesName");
  710. // Create temporary output series.
  711. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  712. // Set input series string
  713. string inputSeriesParameter = inputSeriesName;
  714. // Execute formula
  715. double result = double.NaN;
  716. try
  717. {
  718. _formulaData.Formula("Median", "", inputSeriesParameter, _tempOutputSeriesName);
  719. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  720. // Fill Output value
  721. result = points[0].YValues[0];
  722. }
  723. finally
  724. {
  725. // Remove Temporary output series
  726. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  727. }
  728. // Return result
  729. return result;
  730. }
  731. /// <summary>
  732. /// This method returns the variance for a series.
  733. /// </summary>
  734. /// <param name="inputSeriesName">Input series name.</param>
  735. /// <param name="sampleVariance">If true, the data is a sample of the population. If false, it is the entire population.</param>
  736. /// <returns>Variance.</returns>
  737. public double Variance(
  738. string inputSeriesName,
  739. bool sampleVariance )
  740. {
  741. // Check arguments
  742. if (inputSeriesName == null)
  743. throw new ArgumentNullException("inputSeriesName");
  744. // Create temporary output series.
  745. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  746. // Set input series string
  747. string inputSeriesParameter = inputSeriesName;
  748. // Formula parameter
  749. string parameter = sampleVariance.ToString(System.Globalization.CultureInfo.InvariantCulture);
  750. // Execute formula
  751. double result = double.NaN;
  752. try
  753. {
  754. _formulaData.Formula("Variance", parameter, inputSeriesParameter, _tempOutputSeriesName);
  755. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  756. // Fill Output value
  757. result = points[0].YValues[0];
  758. }
  759. finally
  760. {
  761. // Remove Temporary output series
  762. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  763. }
  764. // Return result
  765. return result;
  766. }
  767. /// <summary>
  768. /// This method returns the beta function for two given values.
  769. /// </summary>
  770. /// <param name="m">First parameter for beta function</param>
  771. /// <param name="n">Second Parameter for beta function</param>
  772. /// <returns>Returns beta function for the two given values.</returns>
  773. [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
  774. Justification = "The Beta Function is a mathematical function where arbitrary letters to indicate inputs are common")]
  775. public double BetaFunction(
  776. double m,
  777. double n )
  778. {
  779. // Fix for the VSTS 230829: The BetaFunction for the m=0,n=0 is double.NaN
  780. if (m == 0 && n == 0)
  781. return double.NaN;
  782. // Create temporary output series.
  783. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  784. // Formula parameter
  785. string parameter = m.ToString(System.Globalization.CultureInfo.InvariantCulture);
  786. parameter += "," + n.ToString(System.Globalization.CultureInfo.InvariantCulture);
  787. // Execute formula
  788. double result = double.NaN;
  789. try
  790. {
  791. _formulaData.Formula("BetaFunction", parameter, _tempOutputSeriesName, _tempOutputSeriesName);
  792. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  793. // Fill Output value
  794. result = points[0].YValues[0];
  795. }
  796. finally
  797. {
  798. // Remove Temporary output series
  799. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  800. }
  801. // Return result
  802. return result;
  803. }
  804. /// <summary>
  805. /// This method returns the gamma function value for the given variable.
  806. /// </summary>
  807. /// <param name="value">The value.</param>
  808. /// <returns>Returns gamma function</returns>
  809. public double GammaFunction(
  810. double value )
  811. {
  812. // Create temporary output series.
  813. _formulaData.Common.DataManager.Series.Add( new Series(_tempOutputSeriesName) );
  814. // Formula parameter
  815. string parameter = value.ToString(System.Globalization.CultureInfo.InvariantCulture);
  816. // Execute formula
  817. double result = double.NaN;
  818. try
  819. {
  820. _formulaData.Formula("GammaFunction", parameter, _tempOutputSeriesName, _tempOutputSeriesName);
  821. DataPointCollection points = _formulaData.Common.DataManager.Series[_tempOutputSeriesName].Points;
  822. // Fill Output value
  823. result = points[0].YValues[0];
  824. }
  825. finally
  826. {
  827. // Remove Temporary output series
  828. _formulaData.Common.DataManager.Series.Remove(_formulaData.Common.DataManager.Series[_tempOutputSeriesName]);
  829. }
  830. // Return result
  831. return result;
  832. }
  833. #endregion
  834. }
  835. #region Output classes used to store statistical calculations results
  836. /// <summary>
  837. /// The TTestResult class stores the results of the TTest statistical calculations.
  838. /// </summary>
  839. public class TTestResult
  840. {
  841. #region Fields
  842. /// <summary>
  843. /// First series' mean.
  844. /// </summary>
  845. internal double firstSeriesMean = 0.0;
  846. /// <summary>
  847. /// Second series' mean.
  848. /// </summary>
  849. internal double secondSeriesMean = 0.0;
  850. /// <summary>
  851. /// First series' variance.
  852. /// </summary>
  853. internal double firstSeriesVariance = 0.0;
  854. /// <summary>
  855. /// Second series' variance.
  856. /// </summary>
  857. internal double secondSeriesVariance = 0.0;
  858. /// <summary>
  859. /// T value.
  860. /// </summary>
  861. internal double tValue = 0.0;
  862. /// <summary>
  863. /// Degree of freedom.
  864. /// </summary>
  865. internal double degreeOfFreedom = 0.0;
  866. /// <summary>
  867. /// Probability T one tail.
  868. /// </summary>
  869. internal double probabilityTOneTail = 0.0;
  870. /// <summary>
  871. /// Critical T one tail.
  872. /// </summary>
  873. internal double tCriticalValueOneTail = 0.0;
  874. /// <summary>
  875. /// Probability T two tails.
  876. /// </summary>
  877. internal double probabilityTTwoTail = 0.0;
  878. /// <summary>
  879. /// Critical T two tails.
  880. /// </summary>
  881. internal double tCriticalValueTwoTail = 0.0;
  882. #endregion
  883. #region Properties
  884. /// <summary>
  885. /// Gets the mean of the first series.
  886. /// </summary>
  887. public double FirstSeriesMean
  888. {
  889. get
  890. {
  891. return firstSeriesMean;
  892. }
  893. }
  894. /// <summary>
  895. /// Gets the mean of the second series.
  896. /// </summary>
  897. public double SecondSeriesMean
  898. {
  899. get
  900. {
  901. return secondSeriesMean;
  902. }
  903. }
  904. /// <summary>
  905. /// Gets the variance of the first series.
  906. /// </summary>
  907. public double FirstSeriesVariance
  908. {
  909. get
  910. {
  911. return firstSeriesVariance;
  912. }
  913. }
  914. /// <summary>
  915. /// Gets the variance of the second series.
  916. /// </summary>
  917. public double SecondSeriesVariance
  918. {
  919. get
  920. {
  921. return secondSeriesVariance;
  922. }
  923. }
  924. /// <summary>
  925. /// Gets the T value.
  926. /// </summary>
  927. public double TValue
  928. {
  929. get
  930. {
  931. return tValue;
  932. }
  933. }
  934. /// <summary>
  935. /// Gets the degree of freedom.
  936. /// </summary>
  937. public double DegreeOfFreedom
  938. {
  939. get
  940. {
  941. return degreeOfFreedom;
  942. }
  943. }
  944. /// <summary>
  945. /// Gets the probability T one tail value.
  946. /// </summary>
  947. [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly",
  948. Justification = "T One Tail is a statistics term. 'Tone' is not the intended word here.")]
  949. public double ProbabilityTOneTail
  950. {
  951. get
  952. {
  953. return probabilityTOneTail;
  954. }
  955. }
  956. /// <summary>
  957. /// Gets the critical T one tail value.
  958. /// </summary>
  959. public double TCriticalValueOneTail
  960. {
  961. get
  962. {
  963. return tCriticalValueOneTail;
  964. }
  965. }
  966. /// <summary>
  967. /// Gets the probability T two tails value.
  968. /// </summary>
  969. public double ProbabilityTTwoTail
  970. {
  971. get
  972. {
  973. return probabilityTTwoTail;
  974. }
  975. }
  976. /// <summary>
  977. /// Gets the critical T two tails value.
  978. /// </summary>
  979. public double TCriticalValueTwoTail
  980. {
  981. get
  982. {
  983. return tCriticalValueTwoTail;
  984. }
  985. }
  986. #endregion
  987. }
  988. /// <summary>
  989. /// The FTestResult class stores the results of the FTest statistical calculations.
  990. /// </summary>
  991. public class FTestResult
  992. {
  993. #region Fields
  994. /// <summary>
  995. /// First series' mean.
  996. /// </summary>
  997. internal double firstSeriesMean = 0.0;
  998. /// <summary>
  999. /// Second series' mean.
  1000. /// </summary>
  1001. internal double secondSeriesMean = 0.0;
  1002. /// <summary>
  1003. /// First series' variance.
  1004. /// </summary>
  1005. internal double firstSeriesVariance = 0.0;
  1006. /// <summary>
  1007. /// Second series' variance.
  1008. /// </summary>
  1009. internal double secondSeriesVariance = 0.0;
  1010. /// <summary>
  1011. /// F value.
  1012. /// </summary>
  1013. internal double fValue = 0.0;
  1014. /// <summary>
  1015. /// Probability F one tail.
  1016. /// </summary>
  1017. internal double probabilityFOneTail = 0.0;
  1018. /// <summary>
  1019. /// Critical F one tail.
  1020. /// </summary>
  1021. internal double fCriticalValueOneTail = 0.0;
  1022. #endregion
  1023. #region Properties
  1024. /// <summary>
  1025. /// Gets the mean of the first series.
  1026. /// </summary>
  1027. public double FirstSeriesMean
  1028. {
  1029. get
  1030. {
  1031. return firstSeriesMean;
  1032. }
  1033. }
  1034. /// <summary>
  1035. /// Gets the mean of the second series.
  1036. /// </summary>
  1037. public double SecondSeriesMean
  1038. {
  1039. get
  1040. {
  1041. return secondSeriesMean;
  1042. }
  1043. }
  1044. /// <summary>
  1045. /// Gets the variance of the first series.
  1046. /// </summary>
  1047. public double FirstSeriesVariance
  1048. {
  1049. get
  1050. {
  1051. return firstSeriesVariance;
  1052. }
  1053. }
  1054. /// <summary>
  1055. /// Gets the variance of the second series.
  1056. /// </summary>
  1057. public double SecondSeriesVariance
  1058. {
  1059. get
  1060. {
  1061. return secondSeriesVariance;
  1062. }
  1063. }
  1064. /// <summary>
  1065. /// Gets the F value.
  1066. /// </summary>
  1067. public double FValue
  1068. {
  1069. get
  1070. {
  1071. return fValue;
  1072. }
  1073. }
  1074. /// <summary>
  1075. /// Gets the probability F one tail.
  1076. /// </summary>
  1077. public double ProbabilityFOneTail
  1078. {
  1079. get
  1080. {
  1081. return probabilityFOneTail;
  1082. }
  1083. }
  1084. /// <summary>
  1085. /// Gets the critical F one tail.
  1086. /// </summary>
  1087. public double FCriticalValueOneTail
  1088. {
  1089. get
  1090. {
  1091. return fCriticalValueOneTail;
  1092. }
  1093. }
  1094. #endregion
  1095. }
  1096. /// <summary>
  1097. /// The AnovaResult class stores the results of the Anova statistical calculations.
  1098. /// </summary>
  1099. public class AnovaResult
  1100. {
  1101. #region Fields
  1102. /// <summary>
  1103. /// Sum of squares between groups.
  1104. /// </summary>
  1105. internal double sumOfSquaresBetweenGroups = 0.0;
  1106. /// <summary>
  1107. /// Sum of squares within groups.
  1108. /// </summary>
  1109. internal double sumOfSquaresWithinGroups = 0.0;
  1110. /// <summary>
  1111. /// Total sum of squares.
  1112. /// </summary>
  1113. internal double sumOfSquaresTotal = 0.0;
  1114. /// <summary>
  1115. /// Degree of freedom between groups.
  1116. /// </summary>
  1117. internal double degreeOfFreedomBetweenGroups = 0.0;
  1118. /// <summary>
  1119. /// Degree of freedom within groups.
  1120. /// </summary>
  1121. internal double degreeOfFreedomWithinGroups = 0.0;
  1122. /// <summary>
  1123. /// Total degree of freedom.
  1124. /// </summary>
  1125. internal double degreeOfFreedomTotal = 0.0;
  1126. /// <summary>
  1127. /// Mean square variance between groups.
  1128. /// </summary>
  1129. internal double meanSquareVarianceBetweenGroups = 0.0;
  1130. /// <summary>
  1131. /// Mean square variance between groups.
  1132. /// </summary>
  1133. internal double meanSquareVarianceWithinGroups = 0.0;
  1134. /// <summary>
  1135. /// F ratio.
  1136. /// </summary>
  1137. internal double fRatio = 0.0;
  1138. /// <summary>
  1139. /// F critical value.
  1140. /// </summary>
  1141. internal double fCriticalValue = 0.0;
  1142. #endregion
  1143. #region Properties
  1144. /// <summary>
  1145. /// Gets the sum of squares between groups.
  1146. /// </summary>
  1147. public double SumOfSquaresBetweenGroups
  1148. {
  1149. get
  1150. {
  1151. return sumOfSquaresBetweenGroups;
  1152. }
  1153. }
  1154. /// <summary>
  1155. /// Gets the sum of squares within groups.
  1156. /// </summary>
  1157. public double SumOfSquaresWithinGroups
  1158. {
  1159. get
  1160. {
  1161. return sumOfSquaresWithinGroups;
  1162. }
  1163. }
  1164. /// <summary>
  1165. /// Gets the total sum of squares.
  1166. /// </summary>
  1167. public double SumOfSquaresTotal
  1168. {
  1169. get
  1170. {
  1171. return sumOfSquaresTotal;
  1172. }
  1173. }
  1174. /// <summary>
  1175. /// Gets the degree of freedom between groups.
  1176. /// </summary>
  1177. public double DegreeOfFreedomBetweenGroups
  1178. {
  1179. get
  1180. {
  1181. return degreeOfFreedomBetweenGroups;
  1182. }
  1183. }
  1184. /// <summary>
  1185. /// Gets the degree of freedom within groups.
  1186. /// </summary>
  1187. public double DegreeOfFreedomWithinGroups
  1188. {
  1189. get
  1190. {
  1191. return degreeOfFreedomWithinGroups;
  1192. }
  1193. }
  1194. /// <summary>
  1195. /// Gets the total degree of freedom.
  1196. /// </summary>
  1197. public double DegreeOfFreedomTotal
  1198. {
  1199. get
  1200. {
  1201. return degreeOfFreedomTotal;
  1202. }
  1203. }
  1204. /// <summary>
  1205. /// Gets the mean square variance between groups.
  1206. /// </summary>
  1207. public double MeanSquareVarianceBetweenGroups
  1208. {
  1209. get
  1210. {
  1211. return meanSquareVarianceBetweenGroups;
  1212. }
  1213. }
  1214. /// <summary>
  1215. /// Gets the mean square variance within groups.
  1216. /// </summary>
  1217. public double MeanSquareVarianceWithinGroups
  1218. {
  1219. get
  1220. {
  1221. return meanSquareVarianceWithinGroups;
  1222. }
  1223. }
  1224. /// <summary>
  1225. /// Gets the F ratio.
  1226. /// </summary>
  1227. public double FRatio
  1228. {
  1229. get
  1230. {
  1231. return fRatio;
  1232. }
  1233. }
  1234. /// <summary>
  1235. /// Gets the F critical value.
  1236. /// </summary>
  1237. public double FCriticalValue
  1238. {
  1239. get
  1240. {
  1241. return fCriticalValue;
  1242. }
  1243. }
  1244. #endregion
  1245. }
  1246. /// <summary>
  1247. /// The ZTestResult class stores the results of the ZTest statistical calculations.
  1248. /// </summary>
  1249. public class ZTestResult
  1250. {
  1251. #region Constructor
  1252. /// <summary>
  1253. /// ZTestResult Constructor
  1254. /// </summary>
  1255. public ZTestResult()
  1256. {
  1257. }
  1258. #endregion // Constructor
  1259. #region Fields
  1260. // Internal fields used for public properties
  1261. internal double firstSeriesMean;
  1262. internal double secondSeriesMean;
  1263. internal double firstSeriesVariance;
  1264. internal double secondSeriesVariance;
  1265. internal double zValue;
  1266. internal double probabilityZOneTail;
  1267. internal double zCriticalValueOneTail;
  1268. internal double probabilityZTwoTail;
  1269. internal double zCriticalValueTwoTail;
  1270. #endregion // Fields
  1271. #region Properties
  1272. /// <summary>
  1273. /// Gets the mean of the first series.
  1274. /// </summary>
  1275. public double FirstSeriesMean
  1276. {
  1277. get
  1278. {
  1279. return firstSeriesMean;
  1280. }
  1281. }
  1282. /// <summary>
  1283. /// Gets the mean of the second series.
  1284. /// </summary>
  1285. public double SecondSeriesMean
  1286. {
  1287. get
  1288. {
  1289. return secondSeriesMean;
  1290. }
  1291. }
  1292. /// <summary>
  1293. /// Gets the variance of the first series.
  1294. /// </summary>
  1295. public double FirstSeriesVariance
  1296. {
  1297. get
  1298. {
  1299. return firstSeriesVariance;
  1300. }
  1301. }
  1302. /// <summary>
  1303. /// Gets the variance of the second series.
  1304. /// </summary>
  1305. public double SecondSeriesVariance
  1306. {
  1307. get
  1308. {
  1309. return secondSeriesVariance;
  1310. }
  1311. }
  1312. /// <summary>
  1313. /// Gets the Z Value
  1314. /// </summary>
  1315. public double ZValue
  1316. {
  1317. get
  1318. {
  1319. return zValue;
  1320. }
  1321. }
  1322. /// <summary>
  1323. /// Gets the probability Z one tail value.
  1324. /// </summary>
  1325. [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly",
  1326. Justification = "Z One Tail is a statistics term. 'Zone' is not the intended word here.")]
  1327. public double ProbabilityZOneTail
  1328. {
  1329. get
  1330. {
  1331. return probabilityZOneTail;
  1332. }
  1333. }
  1334. /// <summary>
  1335. /// Gets the Z critical value one tail value.
  1336. /// </summary>
  1337. public double ZCriticalValueOneTail
  1338. {
  1339. get
  1340. {
  1341. return zCriticalValueOneTail;
  1342. }
  1343. }
  1344. /// <summary>
  1345. /// Gets the probability Z two tail value.
  1346. /// </summary>
  1347. public double ProbabilityZTwoTail
  1348. {
  1349. get
  1350. {
  1351. return probabilityZTwoTail;
  1352. }
  1353. }
  1354. /// <summary>
  1355. /// Gets the Z critical value two tail value.
  1356. /// </summary>
  1357. public double ZCriticalValueTwoTail
  1358. {
  1359. get
  1360. {
  1361. return zCriticalValueTwoTail;
  1362. }
  1363. }
  1364. #endregion // Properties
  1365. }
  1366. #endregion // Output Classes
  1367. }