/// <summary> /// Computes the log density of the Student t-distribution. /// </summary> /// <param name="x">The location at which to compute the log density.</param> /// <returns>the log density at <paramref name="x"/>.</returns> public double DensityLn(double x) { // TODO JVG we can probably do a better job for Cauchy special case if (_dof >= 1e+8d) { return(Normal.DensityLn(_location, _scale, x)); } var d = (x - _location) / _scale; return(SpecialFunctions.GammaLn((_dof + 1.0) / 2.0) - (0.5 * ((_dof + 1.0) * Math.Log(1.0 + (d * d / _dof)))) - SpecialFunctions.GammaLn(_dof / 2.0) - (0.5 * Math.Log(_dof * Math.PI)) - Math.Log(_scale)); }
/// <summary> /// Run example /// </summary> /// <a href="http://en.wikipedia.org/wiki/Normal_distribution">Normal distribution</a> public void Run() { // 1. Initialize the new instance of the Normal distribution class with parameters Mean = 0, StdDev = 1 var normal = new Normal(0, 1); Console.WriteLine(@"1. Initialize the new instance of the Normal distribution class with parameters Mean = {0}, StdDev = {1}", normal.Mean, normal.StdDev); Console.WriteLine(); // 2. Distributuion properties: Console.WriteLine(@"2. {0} distributuion properties:", normal); // Cumulative distribution function Console.WriteLine(@"{0} - Сumulative distribution at location '0.3'", normal.CumulativeDistribution(0.3).ToString(" #0.00000;-#0.00000")); // Probability density Console.WriteLine(@"{0} - Probability density at location '0.3'", normal.Density(0.3).ToString(" #0.00000;-#0.00000")); // Log probability density Console.WriteLine(@"{0} - Log probability density at location '0.3'", normal.DensityLn(0.3).ToString(" #0.00000;-#0.00000")); // Entropy Console.WriteLine(@"{0} - Entropy", normal.Entropy.ToString(" #0.00000;-#0.00000")); // Largest element in the domain Console.WriteLine(@"{0} - Largest element in the domain", normal.Maximum.ToString(" #0.00000;-#0.00000")); // Smallest element in the domain Console.WriteLine(@"{0} - Smallest element in the domain", normal.Minimum.ToString(" #0.00000;-#0.00000")); // Mean Console.WriteLine(@"{0} - Mean", normal.Mean.ToString(" #0.00000;-#0.00000")); // Median Console.WriteLine(@"{0} - Median", normal.Median.ToString(" #0.00000;-#0.00000")); // Mode Console.WriteLine(@"{0} - Mode", normal.Mode.ToString(" #0.00000;-#0.00000")); // Variance Console.WriteLine(@"{0} - Variance", normal.Variance.ToString(" #0.00000;-#0.00000")); // Standard deviation Console.WriteLine(@"{0} - Standard deviation", normal.StdDev.ToString(" #0.00000;-#0.00000")); // Skewness Console.WriteLine(@"{0} - Skewness", normal.Skewness.ToString(" #0.00000;-#0.00000")); Console.WriteLine(); // 3. Generate 10 samples Console.WriteLine(@"3. Generate 10 samples"); for (var i = 0; i < 10; i++) { Console.Write(normal.Sample().ToString("N05") + @" "); } Console.WriteLine(); Console.WriteLine(); // 4. Generate 100000 samples of the Normal(0, 1) distribution and display histogram Console.WriteLine(@"4. Generate 100000 samples of the Normal(0, 1) distribution and display histogram"); var data = new double[100000]; for (var i = 0; i < data.Length; i++) { data[i] = normal.Sample(); } ConsoleHelper.DisplayHistogram(data); Console.WriteLine(); // 5. Generate 100000 samples of the Normal(-10, 0.2) distribution and display histogram Console.WriteLine(@"5. Generate 100000 samples of the Normal(-10, 0.01) distribution and display histogram"); normal.Mean = -10; normal.StdDev = 0.01; for (var i = 0; i < data.Length; i++) { data[i] = normal.Sample(); } ConsoleHelper.DisplayHistogram(data); }