public static BigDecimal Corr(string[] NumberSeries1, string[] NumberSeries2) { //相关系数计算 BigDecimal Mean1 = 0; BigDecimal Mean2 = 0; BigDecimal Variance1 = 0; BigDecimal Variance2 = 0; BigDecimal cov = Covariance(NumberSeries1, ref Mean1, ref Variance1, NumberSeries2, ref Mean2, ref Variance2); BigDecimal Rho = cov / (MathV.Sqrt((Variance1 * Variance2).ToString())).ToString(); //计算相关系数 return(Rho); }
public static string HypothesisTesting(DataTable MainDT, string ColName, string Statistics, string Operation, string Tail, double Significance, double NullHypothesis) { //假设检验 //Statistics为统计量,Operation为运算(>,<,=) //Tail为单尾双尾,这里内容为双侧、左单侧、右单侧 //Significance为显著性水平 int ColNum = Tabulation.FindCol(MainDT, ColName); string[] Numbers = Tabulation.ReadVector(MainDT, ColNum).ToArray(); StringBuilder Result = new StringBuilder(); Result.Append("假设检验: "); Result.Append(Statistics); Result.Append("\r\n"); Result.Append("显著性水平: "); Result.Append(Significance.ToString()); Result.Append("\t"); Result.Append(Tail); Result.Append("\r\n原假设: "); Result.Append(Statistics); Result.Append(" "); Result.Append(Operation); Result.Append(" "); Result.Append(NullHypothesis.ToString()); Result.Append("\r\n备择假设: "); Result.Append(Statistics); Result.Append(" "); if (Operation == "=") { Result.Append("<>"); } else if (Operation == "<=") { Result.Append(">"); } else { Result.Append("<"); } Result.Append(" "); Result.Append(NullHypothesis.ToString()); Result.Append("\r\n"); BigDecimal sum = 0; BigDecimal mean = 0; BigDecimal Variance = 0; BigDecimal Sd = 0; //Sd为标准差 int count = 0; BigDecimal sum2 = 0; //sum2用于计算数字的平方,方便计算方差 Double TempNum = 0; BigDecimal BigTemp = 0; //BigTemp用于记录BigDecimal类型的临时数据 double Threshold = 0; //Threshold为临界值 double PValue = 0; //Pvalue不用多解释了吧~ foreach (string Num in Numbers) { if (Double.TryParse(Num, out TempNum)) { sum += TempNum; sum2 += (BigDecimal)TempNum * (BigDecimal)TempNum; count++; } } //遍历了该列所有数字 if (Statistics == "均值") { if (count >= 30) { Result.Append(HTHeader_Ztest); } else { Result.Append(HTHeader_Ttest); } if (count <= 1) { return("样本数量过少,无法进行假设检验!\r\n"); } else { //开始计算均值和方差 //方差要乘以调整系数 mean = sum / count; Variance = (sum2 / count - mean * mean) * count / (count - 1); Result.Append(StrManipulation.PadLeftX(StrManipulation.VariableNamePolish(ColName), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(count.ToString(), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(mean.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(MathV.Sqrt(Variance.ToString()).ToString()), ' ', 12)); Result.Append("\t"); if (count >= 30) { //大样本 //z检验 Sd = MathV.Sqrt(Variance.ToString()).ToString(); BigTemp = (mean - NullHypothesis) / (Sd / Math.Sqrt(count)); //BigTemp此时的值为z检验统计量 //样本数count无需大数开方,用普通方法开方即可 if (Tail == "双侧") { Threshold = NORMSINV(1 - Significance / 2); PValue = 2 * (1 - NORMDIST(Math.Abs(Convert.ToDouble(BigTemp.ToString())))); } else if (Tail == "左单侧") { Threshold = NORMSINV(Significance); PValue = 1 - NORMDIST(Math.Abs(Convert.ToDouble(BigTemp.ToString()))); } else if (Tail == "右单侧") { Threshold = NORMSINV(1 - Significance); PValue = 1 - NORMDIST(Math.Abs(Convert.ToDouble(BigTemp.ToString()))); } Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(BigTemp.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(Threshold.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(PValue.ToString()), ' ', 12)); Result.Append("\r\n"); if (PValue < Significance) { Result.Append("在"); Result.Append(Significance.ToString()); Result.Append("的显著性水平上拒绝原假设"); } else { Result.Append("在"); Result.Append(Significance.ToString()); Result.Append("的显著性水平上不拒绝原假设"); } } else { //小样本 //t检验 Sd = MathV.Sqrt(Variance.ToString()).ToString(); BigTemp = (mean - NullHypothesis) / (Sd / Math.Sqrt(count)); //BigTemp此时的值为z检验统计量 //样本数count无需大数开方,用普通方法开方即可 if (Tail == "双侧") { Threshold = TINV(Significance / 2 / 2, count - 1); //每个放进TINV的值都要除以2,这个bug之后会进行修复 PValue = TDIST(Math.Abs(Convert.ToDouble(BigTemp.ToString()) / 2), count - 1, 2); } else if (Tail == "左单侧") { Threshold = TINV(Significance / 2, count - 1); PValue = TDIST(Math.Abs(Convert.ToDouble(BigTemp.ToString()) / 2), count - 1, 1); } else if (Tail == "右单侧") { Threshold = TINV(Significance / 2, count - 1); PValue = TDIST(Math.Abs(Convert.ToDouble(BigTemp.ToString()) / 2), count - 1, 1); } Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(BigTemp.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(Threshold.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(PValue.ToString()), ' ', 12)); Result.Append("\r\n"); if (PValue < Significance) { Result.Append("在"); Result.Append(Significance.ToString()); Result.Append("的显著性水平上拒绝原假设"); } else { Result.Append("在"); Result.Append(Significance.ToString()); Result.Append("的显著性水平上不拒绝原假设"); } } Result.Append("\r\n"); return(Result.ToString()); } } else if (Statistics == "比率") { return("hhh"); } else { //方差 return("hhh"); } }
public static string QuickSummary(DataTable MainDT, int ColNum) { string ColName = MainDT.Columns[ColNum].ColumnName; List <string> Numbers = Tabulation.ReadVector(MainDT, ColNum); StringBuilder Result = new StringBuilder(); BigDecimal sum = 0; BigDecimal mean = 0; BigDecimal Variance = 0; int count = 0; BigDecimal max = 0; BigDecimal min = 0; BigDecimal sum2 = 0; Double TempNum = 0; //sum2用于计算数字的平方,方便计算方差 foreach (string Num in Numbers) { if (Double.TryParse(Num, out TempNum)) { sum += TempNum; sum2 += (BigDecimal)TempNum * (BigDecimal)TempNum; count++; if (count == 1) { max = TempNum; min = TempNum; } else { if (max < TempNum) { max = TempNum; } if (min > TempNum) { min = TempNum; } } } } if (count == 0) { //如果没有获取任何数字 return(""); } else if (count == 1) { //如果只有一个数字,可以计算均值,但是不可以计算标准差 mean = sum / count; Result.Append(StrManipulation.PadLeftX(StrManipulation.VariableNamePolish(ColName), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(count.ToString(), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(mean.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX("NA", ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(min.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(max.ToString()), ' ', 12)); Result.Append("\r\n"); //Temp += Result; return(Result.ToString()); } else { //开始计算均值和方差 //方差要乘以调整系数 mean = sum / count; Variance = (sum2 / count - mean * mean) * count / (count - 1); Result.Append(StrManipulation.PadLeftX(StrManipulation.VariableNamePolish(ColName), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(count.ToString(), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(mean.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(MathV.Sqrt(Variance.ToString()).ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(min.ToString()), ' ', 12)); Result.Append("\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(max.ToString()), ' ', 12)); Result.Append("\r\n"); return(Result.ToString()); } }
public static string CI(string VarName, string [] Numbers, string Tail, string Statistics, double Significance) { //Confidence Interval 置信区间 //Tail为单双尾,Tail = "单尾",Tail = "双尾" //Statistics为统计量 "均值" "比例" int count = 0; //count用于统计样本个数 StringBuilder result = new StringBuilder(); //result记录反馈结果 BigDecimal Sd = 0; //Sd为标准差 double Temp = 0; //Temp用于记录临时数据 BigDecimal BigTemp = 0; //BigTemp用于记录BigDecimal类型的临时数据 if (Tail == "双尾") { Significance = 1 - (1 - Significance) / 2; // 1 - (1 - 0.95)/2 } if (Statistics == "均值" || Statistics == "方差") { BigDecimal Mean = 0; BigDecimal Sum = 0; BigDecimal Sum2 = 0; foreach (string Num in Numbers) { if (double.TryParse(Num, out Temp)) { Sum += Temp; Sum2 += (BigDecimal)Temp * (BigDecimal)Temp; count++; } } if (count <= 1) { return("样本数量过少,无法进行参数估计"); } else { Mean = Sum / count; BigDecimal Variance = (Sum2 / count - Mean * Mean) * count / (count - 1); Sd = MathV.Sqrt(Variance.ToString()).ToString(); result.Append(StrManipulation.PadLeftX(StrManipulation.VariableNamePolish(VarName), ' ', 12)); result.Append("\t"); result.Append(StrManipulation.PadLeftX(count.ToString(), ' ', 12)); result.Append("\t"); result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(Mean.ToString()), ' ', 12)); result.Append("\t"); result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(Sd.ToString()), ' ', 12)); result.Append("\t"); if (Statistics == "均值") { if (count >= 30) { //大样本 BigTemp = NORMSINV(Significance) * Sd / MathV.Sqrt(count).ToString(); } else { //小样本 BigTemp = TINV(1 - Significance, (count - 1)) * Sd / MathV.Sqrt(count).ToString(); } result.Append(StrManipulation.PadLeftX(MathV.NumberPolish((Mean - BigTemp).ToString()), ' ', 12)); result.Append("\t"); result.Append(StrManipulation.PadLeftX(MathV.NumberPolish((Mean + BigTemp).ToString()), ' ', 12)); result.Append("\r\n"); } else { //Statistics == "方差" BigTemp = (count - 1) * Variance; result.Append(StrManipulation.PadLeftX(MathV.NumberPolish((BigTemp / Stat.chi2Ua(1 - Significance, count - 1)).ToString()), ' ', 12)); result.Append("\t"); MessageBox.Show(Significance.ToString()); MessageBox.Show(Stat.chi2Ua(Significance, count - 1).ToString()); result.Append(StrManipulation.PadLeftX(MathV.NumberPolish((BigTemp / Stat.chi2Ua(Significance, count - 1)).ToString()), ' ', 12)); result.Append("\r\n"); } return(result.ToString()); } } else if (Statistics == "比例") { int OneCounts = 0; int ZeroCounts = 0; foreach (string Num in Numbers) { if (Num.Trim() == "1") { OneCounts++; } else if (Num.Trim() == "0") { ZeroCounts++; } } if (ZeroCounts + OneCounts == 0) { return("样本不存在,无法进行参数估计\r\n"); } else { if (ZeroCounts + OneCounts < 30) { result.Append("样本数量较少,进行比例的参数估计可能会不稳定\r\n"); } BigDecimal Proportion = (BigDecimal)OneCounts / ((BigDecimal)ZeroCounts + (BigDecimal)OneCounts); count = ZeroCounts + OneCounts; result.Append(StrManipulation.PadLeftX(StrManipulation.VariableNamePolish(VarName), ' ', 12)); result.Append("\t"); result.Append(StrManipulation.PadLeftX((ZeroCounts + OneCounts).ToString(), ' ', 12)); result.Append("\t"); result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(Proportion.ToString()), ' ', 12)); result.Append("\t"); BigTemp = Proportion * (1 - Proportion); result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(MathV.Sqrt(BigTemp.ToString()).ToString()), ' ', 12)); result.Append("\t"); BigTemp = NORMSINV(Significance) * ((BigDecimal)MathV.Sqrt(BigTemp.ToString()).ToString() / (BigDecimal)MathV.Sqrt(count).ToString()); result.Append(StrManipulation.PadLeftX(MathV.NumberPolish((Proportion - BigTemp).ToString()).ToString(), ' ', 12)); result.Append("\t"); result.Append(StrManipulation.PadLeftX(MathV.NumberPolish((Proportion + BigTemp).ToString()).ToString(), ' ', 12)); result.Append("\r\n"); return(result.ToString()); } } else { return("未知统计量\r\n"); } }