using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Science.Statistics.BasicStatistics { public class StandardDeviationAndAverage { public StandardDeviationAndAverage() { } public StandardDeviationAndAverage(List data) { LengthOfData = data.Count; Average avg = new Average(data); mean = avg.Value; int j, n = data.Count; degreesOfFreedom = n - 1; for (sigma = 0.0, j = 0; j < n; j++) sigma += (data[j]-mean) * (data[j]-mean); sigma /= (double)n; sigma = Math.Sqrt(sigma); } public StandardDeviationAndAverage(List number, List data) { Average avg = new Average(number, data); mean = avg.Value; int j, n = 0; for (sigma = 0.0, j = 0; j < number.Count; j++) { sigma += (double)number[j]*((data[j] - mean) * (data[j] - mean)); n += number[j]; } degreesOfFreedom = n - 1; sigma /= (double)n; sigma = Math.Sqrt(sigma); } private double sigma; public double StandardDeviation { get { return sigma; } set { sigma = value; } } private int degreesOfFreedom; public int DegreesOfFreedom { get { return degreesOfFreedom; } set { degreesOfFreedom = value; } } private double sigmap; public double StandardDeviationPlus { get { return sigmap; } set { sigmap = value; } } private double mean; public double Average { get { return mean; } set { mean = value; } } private int count; public int LengthOfData { get { return count; } set { count = value; } } public static StandardDeviationAndAverage Add( StandardDeviationAndAverage first, StandardDeviationAndAverage second) { StandardDeviationAndAverage third = new StandardDeviationAndAverage(); third.LengthOfData = first.LengthOfData + second.LengthOfData; third.Average = ((double)first.LengthOfData * first.Average + (double)second.LengthOfData * second.Average)/ (double)third.LengthOfData; double x = (double)first.LengthOfData*(first.Average*first.Average+first.StandardDeviation*first.StandardDeviation); double y = (double)second.LengthOfData*(second.Average*second.Average+second.StandardDeviation*second.StandardDeviation); third.StandardDeviation = Math.Sqrt((x+y)/(double)third.LengthOfData - third.Average*third.Average); return third; } public void FindStandardDeviationPlus() { double df = (double)degreesOfFreedom; sigmap = sigma * Math.Sqrt((df + 1.0) / df); } public void ByBootstrapMethod() { sigma = (1.0 - 0.0)*Math.Sqrt(mean*(1.0 - mean)); } public void ChangeScale(double scale) { sigma *= scale; } } }