Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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");
            }
        }
Esempio n. 3
0
        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());
            }
        }
Esempio n. 4
0
        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");
            }
        }