private void button_Cal_Click(object sender, EventArgs e) { List <int> BlackList = new List <int>(); double [] ans = (double [])MathV.CalExpression(textBox_expression.Text.Replace("\r\n", ""), MainForm.MainDT, ref BlackList); int ColNum = 0; if (checkBox_NewCol.Checked == true) { MainForm.MainDT.Columns.Add(); ColNum = MainForm.MainDT.Columns.Count - 1; } else { ColNum = Tabulation.FindCol(MainForm.MainDT, comboBox_Output.Text); } if (ColNum == -1) { return; } int RealData = 0; int RowsCount = MainForm.MainDT.Rows.Count; for (int i = 0; i < RowsCount; i++) { if (BlackList.IndexOf(i) == -1) { MainForm.MainDT.Rows[i][ColNum] = ans[RealData].ToString(); RealData++; } } Tabulation.InitDataSet(MainForm.MainDT, ref MainForm.nMax, ref MainForm.pageCount, ref MainForm.pageCurrent, ref MainForm.nCurrent, MainForm.S.label_CurrentPage, MainForm.S.label_TotalPage, MainForm.S.dataGridView1, MainForm.S.textBox_CurrentPage, MainForm.pageSize); }
private void comboBox_Cols_TextChanged(object sender, EventArgs e) { int ColNum = Tabulation.FindCol(MainForm.MainDT, comboBox_Cols.Text); if (ColNum != -1) { Classification = Tabulation.Classification(MainForm.MainDT, ColNum); int len = Classification.Length; if (len > 0) { if (len > 2) { MessageBox.Show("选项超过两种,请使用多选单选题进行分析!"); } else { listBox_TwoChoices.Items.Clear(); listBox_TwoChoices.Items.AddRange(Classification); CountTimes = Tabulation.LikilihoodCount(Classification, MainForm.MainDT, ColNum); StringBuilder OutPut = new StringBuilder(); for (int i = 0; i < len; i++) { OutPut.Append(Classification[i]); OutPut.Append("\t"); OutPut.Append(CountTimes[i].ToString()); OutPut.Append("\r\n"); } textBox_Likihood.Clear(); textBox_Likihood.AppendText(OutPut.ToString()); label4.Text = "其中有多少样本选择了\"" + listBox_TwoChoices.Items[0].ToString() + "\"?"; } } } }
private void comboBox_Cols_TextChanged(object sender, EventArgs e) { int ColNum = Tabulation.FindCol(MainForm.MainDT, comboBox_Cols.Text); if (ColNum != -1) { Classification = Tabulation.Classification(MainForm.MainDT, ColNum); int len = Classification.Length; if (len > 0) { listBox_MultiChoices.Items.Clear(); listBox_MultiChoices.Items.AddRange(Classification); textBox_Times.Clear(); for (int i = 0; i < len; i++) { textBox_Times.AppendText("0\r\n"); } CountTimes = Tabulation.LikilihoodCount(Classification, MainForm.MainDT, ColNum); StringBuilder OutPut = new StringBuilder(); for (int i = 0; i < len; i++) { OutPut.Append(Classification[i]); OutPut.Append("\t"); OutPut.Append(CountTimes[i].ToString()); OutPut.Append("\r\n"); } textBox_Likihood.Clear(); textBox_Likihood.AppendText(OutPut.ToString()); } } }
private void button_add_Click(object sender, EventArgs e) { if (comboBox_x.Text.Trim() != "") { QuickPlot.QPlot(dt, chart_basic, Tabulation.FindCol(dt, comboBox_x.Text), Tabulation.FindCol(dt, comboBox_y.Text), comboBox_type.Text, textBox_Legend.Text, checkBox_IsXLabel.Checked); } else { QuickPlot.QPlot(dt, chart_basic, -1, Tabulation.FindCol(dt, comboBox_y.Text), comboBox_type.Text, textBox_Legend.Text, checkBox_IsXLabel.Checked); } }
string BayesClassification() { int dtRowsCount = dt.Rows.Count; int dtColsCount = dt.Columns.Count; StringBuilder ResultText = new StringBuilder(); string[][] Classification = new string[dtColsCount][]; List <List <string> > Data = new List <List <string> >(); for (int j = 0; j < dtColsCount; j++) { Data.Add(new List <string>()); //对每列的数据进行定义 for (int i = 0; i < dtRowsCount; i++) { //确保录入的行中无空缺 if (IdentifyNARow(i, dtColsCount)) { //按行读取每列的数据 Data[j].Add(dt.Rows[i][j].ToString()); } } } //现在我们获得了一个Data矩阵 double Temp = 0; List <string> AllClassi = new List <string>(); List <string> EachProbs = new List <string>(); for (int i = 0; i < dtColsCount; i++) { ResultText.Append("第"); ResultText.Append((i + 1).ToString()); ResultText.Append("项特征内的各个类别:\r\n"); Classification[i] = Data[i].Distinct().ToArray(); foreach (string SingleStr in Classification[i]) { ResultText.Append(SingleStr); ResultText.Append(" "); } ResultText.Append("\r\n"); foreach (string SingleStr in Classification[i]) { ResultText.Append("P("); ResultText.Append(SingleStr); ResultText.Append(") = "); Temp = FindElement(SingleStr, Data[i].ToArray()) / Convert.ToDouble(Data[i].Count); ResultText.Append(Temp.ToString()); ResultText.Append("\r\n"); AllClassi.Add(SingleStr); EachProbs.Add(Temp.ToString()); } ResultText.Append("\r\n"); } double count = 0; int TotalTimes = 0; //int InterestCol = FindCol(comboBox_Class.Text); int InterestCol = Tabulation.FindCol(dt, comboBox_Class.Text); int InterestColCount = Data[InterestCol].Count; List <string> str = new List <string>(); List <string> Probs = new List <string>(); string StrAndDis = ""; for (int j = 0; j < dtColsCount; j++) { if (j != InterestCol) { foreach (string EachStr in Classification[j]) { foreach (string EachDis in Classification[InterestCol]) { count = 0; for (int i = 0; i < InterestColCount; i++) { if (Data[InterestCol][i].Trim() == EachDis) { if (Data[j][i].Trim() == EachStr) { count++; } } } StrAndDis = EachStr + "|" + EachDis; ResultText.Append("P("); ResultText.Append(StrAndDis); ResultText.Append(") = "); Temp = count / FindElement(EachDis, Data[InterestCol].ToArray()); ResultText.Append(Temp.ToString()); ResultText.Append("\r\n"); str.Add(StrAndDis); Probs.Add(Temp.ToString()); TotalTimes++; } } } } ResultText.Append("所有类别组合数量总计:"); ResultText.Append(TotalTimes.ToString()); //以下数组用于记录训练集所获得的结果 Result[0] = AllClassi.ToArray(); Result[1] = EachProbs.ToArray(); Result[2] = str.ToArray(); Result[3] = Probs.ToArray(); Result[4] = Classification[InterestCol]; return(ResultText.ToString()); }
private void button_Regression_Click(object sender, EventArgs e) { string ColNums = textBox_Cols.Text; char[] separator = { ',' }; //string是以逗号分隔的 string[] AllNum = ColNums.Split(separator); //按照逗号分割 List <int> Cols = new List <int>(); foreach (string SingleNum in AllNum) { if (SingleNum != "") { Cols.Add(Convert.ToInt32(SingleNum) - 1); } } int[] AllColNums = Cols.ToArray(); int yCol = Tabulation.FindCol(MainForm.MainDT, comboBox_y.Text); List <List <string> > data = new List <List <string> >(); int RowsCount = MainForm.MainDT.Rows.Count; int InputColsCount = AllColNums.Length; //计算总共要录入的列数 int count = 0; //计算实际录入数据数 List <string> Ydata = new List <string>(); for (int i = 0; i < InputColsCount; i++) { data.Add(new List <string>()); } for (int i = 0; i < RowsCount; i++) { if (Tabulation.IdentifyNARow(MainForm.MainDT, i, AllColNums)) { //确认该行无空格 if (MainForm.MainDT.Rows[i][yCol].ToString().Trim() != "") { Ydata.Add(MainForm.MainDT.Rows[i][yCol].ToString().Trim()); for (int j = 0; j < InputColsCount; j++) { data[j].Add(MainForm.MainDT.Rows[i][j].ToString()); } count++; } } } if (count > 2) { BigDecimal[,] IndependentVariables = new BigDecimal[count, InputColsCount + 1]; //第一列全是1 for (int i = 0; i < count; i++) { IndependentVariables[i, 0] = 1; } for (int i = 0; i < count; i++) { for (int j = 0; j < InputColsCount; j++) { //录入时,BigDecimal数组列数要+1,因为第一列全是1 IndependentVariables[i, j + 1] = data[j][i]; } } BigDecimal[,] DependentVariable = new BigDecimal[count, 1]; for (int i = 0; i < count; i++) { DependentVariable[i, 0] = Ydata[i]; } BigDecimal[,] bhat = Stat.MultiRegBeta(IndependentVariables, DependentVariable); StringBuilder Result = new StringBuilder(); Result.Append(comboBox_y.Text); Result.Append(" = "); int ColumnNumberCount = 0; foreach (BigDecimal EachNum in bhat) { if (ColumnNumberCount == 0) { Result.Append(MathV.NumberPolish(EachNum.ToString())); Result.Append(" + "); } else if (ColumnNumberCount == InputColsCount) { Result.Append(MathV.NumberPolish(EachNum.ToString())); Result.Append(" "); Result.Append(MainForm.MainDT.Columns[AllColNums[ColumnNumberCount - 1]].ColumnName); } else { Result.Append(MathV.NumberPolish(EachNum.ToString())); Result.Append(" "); Result.Append(MainForm.MainDT.Columns[AllColNums[ColumnNumberCount - 1]].ColumnName); Result.Append(" + "); } ColumnNumberCount++; } MainForm.S.richTextBox1.AppendText(Result.ToString()); } }
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"); } }
private void button_Regression_Click(object sender, EventArgs e) { string ColNums = textBox_Cols.Text; char[] separator = { ',' }; //string是以逗号分隔的 string[] AllNum = ColNums.Split(separator); //按照逗号分割 List <int> Cols = new List <int>(); foreach (string SingleNum in AllNum) { if (SingleNum != "") { Cols.Add(Convert.ToInt32(SingleNum) - 1); } } int[] AllColNums = Cols.ToArray(); //MessageBox.Show(AllColNums[0].ToString()); //MessageBox.Show(AllColNums[1].ToString()); int yCol = Tabulation.FindCol(MainForm.MainDT, comboBox_y.Text); List <List <string> > data = new List <List <string> >(); int RowsCount = MainForm.MainDT.Rows.Count; int InputColsCount = AllColNums.Length; //计算总共要录入的列数 int count = 0; //计算实际录入数据数 List <string> Ydata = new List <string>(); for (int i = 0; i < InputColsCount; i++) { data.Add(new List <string>()); } for (int i = 0; i < RowsCount; i++) { if (Tabulation.IdentifyNARow(MainForm.MainDT, i, AllColNums)) { //确认该行无空格 if (MainForm.MainDT.Rows[i][yCol].ToString().Trim() != "") { Ydata.Add(MainForm.MainDT.Rows[i][yCol].ToString().Trim()); for (int j = 0; j < InputColsCount; j++) { data[j].Add(MainForm.MainDT.Rows[i][AllColNums[j]].ToString()); //此处队长有bug,已改正 } count++; } } } if (count > 2) { BigDecimal[,] IndependentVariables = new BigDecimal[count, InputColsCount + 1]; StringBuilder Result = new StringBuilder(); if (count <= InputColsCount + 1) { Result.Append("样本量过少,无法估计"); } else { //第一列全是1 for (int i = 0; i < count; i++) { IndependentVariables[i, 0] = 1; } for (int i = 0; i < count; i++) { for (int j = 0; j < InputColsCount; j++) { //录入时,BigDecimal数组列数要+1,因为第一列全是1 IndependentVariables[i, j + 1] = data[j][i]; } } //MathV.ArrayPrint(IndependentVariables); BigDecimal[,] DependentVariable = new BigDecimal[count, 1]; for (int i = 0; i < count; i++) { DependentVariable[i, 0] = Ydata[i]; } int len12 = IndependentVariables.GetLength(1);//列数 BigDecimal[,] b1 = MathV.MatTrans(IndependentVariables); BigDecimal[,] b2 = MathV.MatTimes(b1, IndependentVariables); try { BigDecimal[,] b3 = MathV.MatInv(b2, len12); if (b3 != null) { BigDecimal[,] bhat = Stat.MultiRegBeta(b1, b3, IndependentVariables, DependentVariable); BigDecimal[,] value_beta = Stat.MultiRegP(b3, bhat, IndependentVariables, DependentVariable); string[] RandF = Stat.MultiRegR(bhat, IndependentVariables, DependentVariable).Split(separator); //MathV.ArrayPrint(bhat); Result.Append(StrManipulation.PadRightX(StrManipulation.VariableNamePolish("拟合R^2:"), ' ', 12)); Result.Append(MathV.NumberPolish(RandF[0])); Result.Append("\r\n"); Result.Append(StrManipulation.PadRightX(StrManipulation.VariableNamePolish("调整后R^2:"), ' ', 12)); Result.Append(MathV.NumberPolish(RandF[1])); Result.Append("\r\n"); Result.Append(StrManipulation.PadRightX(StrManipulation.VariableNamePolish("回归F值:"), ' ', 12)); Result.Append(MathV.NumberPolish(RandF[2])); Result.Append("\r\n"); Result.Append(StrManipulation.PadRightX(StrManipulation.VariableNamePolish("回归P值:"), ' ', 12)); Result.Append(MathV.NumberPolish(Stat.FINV(Convert.ToDouble(RandF[2]), count - InputColsCount - 1, InputColsCount).ToString())); Result.Append("\r\n \r\n"); Result.Append(comboBox_y.Text + " = "); int ColumnNumberCount = 0; foreach (BigDecimal EachNum in bhat) { if (ColumnNumberCount == 0) { Result.Append(MathV.NumberPolish(EachNum.ToString())); Result.Append(" + "); } else if (ColumnNumberCount == InputColsCount) { Result.Append(MathV.NumberPolish(EachNum.ToString())); Result.Append(" "); Result.Append(MainForm.MainDT.Columns[AllColNums[ColumnNumberCount - 1]].ColumnName); } else { Result.Append(MathV.NumberPolish(EachNum.ToString())); Result.Append(MainForm.MainDT.Columns[AllColNums[ColumnNumberCount - 1]].ColumnName); Result.Append(" + "); } ColumnNumberCount++; } Result.Append("\r\n检验P值: "); for (int i = 0; i < InputColsCount + 1; i++) { Result.Append(MathV.NumberPolish(value_beta[i, 0].ToString())); Result.Append(" \t"); } Result.Append("\r\n检验t值: "); for (int i = 0; i < InputColsCount + 1; i++) { Result.Append(MathV.NumberPolish(value_beta[i, 1].ToString())); Result.Append(" \t"); } Result.Append("\r\n \r\n"); } else { Result.Append("矩阵不可逆,回归方程无解"); } } catch (Exception ex) { MessageBox.Show("存在重复自变量"); } } MainForm.S.richTextBox1.AppendText(Result.ToString()); } }
private void button1_Click(object sender, EventArgs e) { string ColNums = textBox_Cols.Text; char[] separator = { ',' }; //string是以逗号分隔的 string[] AllNum = ColNums.Split(separator); //按照逗号分割 List <int> Cols = new List <int>(); foreach (string SingleNum in AllNum) { if (SingleNum != "") { Cols.Add(Convert.ToInt32(SingleNum) - 1); } } int[] AllColNums = Cols.ToArray(); //MessageBox.Show(AllColNums[0].ToString()); //MessageBox.Show(AllColNums[1].ToString()); int yCol = Tabulation.FindCol(MainForm.MainDT, comboBox_y.Text); List <List <string> > data = new List <List <string> >(); int RowsCount = MainForm.MainDT.Rows.Count; int InputColsCount = AllColNums.Length; //计算总共要录入的列数 int count = 0; //计算实际录入数据数 List <string> Ydata = new List <string>(); for (int i = 0; i < InputColsCount; i++) { data.Add(new List <string>()); } for (int i = 0; i < RowsCount; i++) { if (Tabulation.IdentifyNARow(MainForm.MainDT, i, AllColNums)) { //确认该行无空格 if (MainForm.MainDT.Rows[i][yCol].ToString().Trim() != "") { Ydata.Add(MainForm.MainDT.Rows[i][yCol].ToString().Trim()); for (int j = 0; j < InputColsCount; j++) { data[j].Add(MainForm.MainDT.Rows[i][AllColNums[j]].ToString()); //此处队长有bug,已改正 } count++; } } } if (count > 2) { BigDecimal[,] IndependentVariables = new BigDecimal[count, InputColsCount + 1]; StringBuilder Result = new StringBuilder(); if (count <= InputColsCount + 1) { Result.Append("样本量过少,无法估计"); } else { //第一列全是1 for (int i = 0; i < count; i++) { IndependentVariables[i, 0] = 1; } for (int i = 0; i < count; i++) { for (int j = 0; j < InputColsCount; j++) { //录入时,BigDecimal数组列数要+1,因为第一列全是1 IndependentVariables[i, j + 1] = data[j][i]; } } //MathV.ArrayPrint(IndependentVariables); BigDecimal[,] DependentVariable = new BigDecimal[count, 1]; for (int i = 0; i < count; i++) { DependentVariable[i, 0] = Ydata[i]; } int len12 = IndependentVariables.GetLength(1); //列数 BigDecimal[,] b1 = MathV.MatTrans(IndependentVariables); BigDecimal[,] b2 = MathV.MatTimes(b1, IndependentVariables); BigDecimal[,] b3 = MathV.MatInv(b2, len12); if (b3 != null) { BigDecimal[,] bhat = Stat.MultiRegBeta(b1, b3, IndependentVariables, DependentVariable); BigDecimal[,] value_beta = Stat.MultiRegP(b3, bhat, IndependentVariables, DependentVariable); string[] RandF = Stat.MultiRegR(bhat, IndependentVariables, DependentVariable).Split(separator); //回归诊断开始 //#初步判断 : 根据R^2 adjR^2 Fvalue tvalue Result.Append("1.初步诊断 \r\n"); if ((BigDecimal)RandF[1] < 0.70) { Result.Append(" 调整后R^2较小,可能存在遗漏变量\r\n"); } if ((BigDecimal)RandF[0] - (BigDecimal)RandF[1] > 0.1) { Result.Append(" 调整后R^2与R^2差值较大,可能存在冗余变量\r\n"); } if (Stat.FDIST(Convert.ToDouble(RandF[2]), InputColsCount, count - 1) > 0.01) { Result.Append(" 模型拟合情况不好,建议更改解释变量\r\n"); } else { Result.Append(" 模型拟合情况较好\r\n"); } int count_nonsignifi = 0; for (int i = 0; i < InputColsCount + 1; i++) { if (i == 0) { if (value_beta[i, 0] > 0.05) { Result.Append(" 常数项在95%置信水平下不显著\r\n"); count_nonsignifi++; } } else { if (value_beta[i, 0] > 0.05) { Result.Append(" 变量" + (i + 1).ToString() + "在95%置信水平下不显著\r\n"); count_nonsignifi++; } } } if ((BigDecimal)RandF[0] > 0.7 && count_nonsignifi > ((InputColsCount + 1) / 2)) { Result.Append(" 高拟合优度伴随着大量非显著解释变量,存在多重共线性\r\n"); } Result.Append("\r\n"); //#遗漏变量 : 拉姆齐检验 Result.Append("2.模型设定偏误检验(拉姆齐检验)\r\n"); BigDecimal[,] Y_hat = new BigDecimal[count, 1]; Y_hat = MathV.MatTimes(IndependentVariables, bhat); BigDecimal[,] Ramsey_indep = new BigDecimal[count, InputColsCount + 3]; for (int i = 0; i < count; i++) { for (int j = 0; j < InputColsCount + 3; j++) { if (j < InputColsCount + 1) { Ramsey_indep[i, j] = IndependentVariables[i, j]; } else if (j == InputColsCount + 1) { Ramsey_indep[i, j] = Y_hat[i, 0] * Y_hat[i, 0]; } else { Ramsey_indep[i, j] = Y_hat[i, 0] * Y_hat[i, 0] * Y_hat[i, 0]; } } } BigDecimal[,] b1_ramsey = MathV.MatTrans(Ramsey_indep); BigDecimal[,] b2_ramsey = MathV.MatTimes(b1_ramsey, Ramsey_indep); BigDecimal[,] b3_ramsey = MathV.MatInv(b2_ramsey, InputColsCount + 3); if (b3_ramsey != null && count > InputColsCount + 3) { BigDecimal[,] bhat_ramsey = Stat.MultiRegBeta(b1_ramsey, b3_ramsey, Ramsey_indep, DependentVariable); string[] RandF_ramsey = Stat.MultiRegR(bhat_ramsey, Ramsey_indep, DependentVariable).Split(separator); double R2_ramsey = Convert.ToDouble(RandF_ramsey[0]); double F_ramsey = (R2_ramsey - Convert.ToDouble(RandF[0])) * (count - InputColsCount - 2) / ((1 - R2_ramsey) * 2); double F_P_ramsey = Stat.FDIST(Convert.ToDouble(RandF_ramsey[2]), 2, count - InputColsCount - 2); if (F_P_ramsey <= 0.001) { Result.Append(" 模型在99.9%的置信水平下认为存在偏误\r\n"); } else { Result.Append(" 模型设定在99.9%的置信水平下认为无偏误\r\n"); } } else { Result.Append(" !样本量过少,无法进行拉姆齐检验\r\n"); } Result.Append(""); Result.Append("\r\n3.多重共线性检验:方差膨胀因子(VIF)\r\n"); //#多重共线性检验:方差膨胀因子(VIF) int count_vif; if (InputColsCount == 1) { Result.Append(" !一个自变量无法进行方差膨胀因子检验\r\n"); } else { for (int i = 0; i < InputColsCount; i++) { BigDecimal[,] Vif_dep = new BigDecimal[count, 1]; BigDecimal[,] Vif_indep = new BigDecimal[count, InputColsCount]; for (int j = 0; j < count; j++) { count_vif = 0; Vif_dep[j, 0] = IndependentVariables[j, i + 1]; for (int k = 0; k < InputColsCount + 1; k++) { if (k != i + 1) { Vif_indep[j, count_vif] = IndependentVariables[j, k]; count_vif++; } } } //MathV.ArrayPrint(Vif_indep); // MathV.ArrayPrint(Vif_dep); BigDecimal[,] b1_vif = MathV.MatTrans(Vif_indep); BigDecimal[,] b2_vif = MathV.MatTimes(b1_vif, Vif_indep); BigDecimal[,] b3_vif = MathV.MatInv(b2_vif, InputColsCount); if (b3_vif != null) { BigDecimal[,] bhat_vif = Stat.MultiRegBeta(b1_vif, b3_vif, Vif_indep, Vif_dep); string[] RandF_vif = Stat.MultiRegR(bhat_vif, Vif_indep, Vif_dep).Split(separator); //MessageBox.Show(RandF_vif[0]); BigDecimal VIF = 1 / (1 - Convert.ToDouble(RandF_vif[0])); if (VIF <= 10) { Result.Append(" 变量" + (i + 1).ToString() + "在模型中共线性较弱,可以保留\r\n"); } else if (VIF > 10 && VIF < 100) { Result.Append(" 变量" + (i + 1).ToString() + "在模型中共线性较强,建议剔除\r\n"); } else { Result.Append(" 变量" + (i + 1).ToString() + "在模型中共线性极强,强烈建议剔除\r\n"); } } } } //#异方差 : White 检验 Result.Append("\r\n4.异方差检验:怀特检验与LM统计量\r\n"); //Y_hat2 与 u^hat2 BigDecimal[,] u_hat2 = new BigDecimal[count, 1]; BigDecimal[,] u_hat = new BigDecimal[count, 1]; BigDecimal[,] Y_hat2 = new BigDecimal[count, 1]; BigDecimal[,] White_indep = new BigDecimal[count, 3]; BigDecimal[,] White_dep = new BigDecimal[count, 1]; for (int i = 0; i < count; i++) { u_hat2[i, 0] = (DependentVariable[i, 0] - Y_hat[i, 0]) * (DependentVariable[i, 0] - Y_hat[i, 0]); Y_hat2[i, 0] = Y_hat[i, 0] * Y_hat[i, 0]; u_hat[i, 0] = (DependentVariable[i, 0] - Y_hat[i, 0]); White_indep[i, 0] = 1; White_indep[i, 1] = Y_hat[i, 0]; White_indep[i, 2] = Y_hat2[i, 0]; White_dep[i, 0] = u_hat2[i, 0]; } BigDecimal[,] b1_white = MathV.MatTrans(White_indep); BigDecimal[,] b2_white = MathV.MatTimes(b1_white, White_indep); BigDecimal[,] b3_white = MathV.MatInv(b2_white, 3); if (b3_white != null) { BigDecimal[,] bhat_white = Stat.MultiRegBeta(b1_white, b3_white, White_indep, White_dep); string[] RandF_white = Stat.MultiRegR(bhat_white, White_indep, White_dep).Split(separator); BigDecimal LM_white = count * Convert.ToDouble(RandF_white[0]); //MessageBox.Show(LM_white.ToString()); BigDecimal P_white = 1 - Stat.chi2(Convert.ToDouble(LM_white.ToString()), 2); //MessageBox.Show(P_white2.ToString()); Result.Append(" LM统计量 \t"); Result.Append(" =\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(LM_white.ToString()), ' ', 12)); Result.Append("\r\n"); Result.Append(" LM > chi(2)\t"); Result.Append(" =\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(P_white.ToString()), ' ', 12)); Result.Append("\r\n"); if (P_white > 0.05) { Result.Append(" 在95%的置信度上认为样本同方差\r\n \r\n"); } else { Result.Append(" 在95%的置信度上认为样本异方差\r\n"); Result.Append(" 解决方法:变量取对数回归,结果如下:\r\n"); BigDecimal[,] ln_indep = new BigDecimal[count, InputColsCount + 1]; BigDecimal[,] ln_dep = new BigDecimal[count, 1]; for (int i = 0; i < count; i++) { for (int j = 0; j < InputColsCount; j++) { ln_indep[i, j + 1] = Math.Log(Convert.ToDouble(IndependentVariables[i, j + 1].ToString())); } ln_indep[i, 0] = 1; ln_dep[i, 0] = Math.Log(Convert.ToDouble(DependentVariable[i, 0].ToString())); } BigDecimal[,] b1_ln = MathV.MatTrans(ln_indep); BigDecimal[,] b2_ln = MathV.MatTimes(b1_ln, ln_indep); BigDecimal[,] b3_ln = MathV.MatInv(b2, len12); if (b3_ln != null) { BigDecimal[,] bhat_ln = Stat.MultiRegBeta(b1_ln, b3_ln, ln_indep, ln_dep); BigDecimal[,] value_beta_ln = Stat.MultiRegP(b3_ln, bhat_ln, ln_indep, ln_dep); string[] RandF_ln = Stat.MultiRegR(bhat_ln, ln_indep, ln_dep).Split(separator); //MathV.ArrayPrint(bhat); Result.Append(StrManipulation.PadRightX(StrManipulation.VariableNamePolish("拟合R^2:"), ' ', 12)); Result.Append(MathV.NumberPolish(RandF_ln[0])); Result.Append("\r\n"); Result.Append(StrManipulation.PadRightX(StrManipulation.VariableNamePolish("调整后R^2:"), ' ', 12)); Result.Append(MathV.NumberPolish(RandF_ln[1])); Result.Append("\r\n"); Result.Append(StrManipulation.PadRightX(StrManipulation.VariableNamePolish("回归F值:"), ' ', 12)); Result.Append(MathV.NumberPolish(RandF_ln[2])); Result.Append("\r\n"); Result.Append("\r\n"); Result.Append(comboBox_y.Text); Result.Append(" = "); int ColumnNumberCount = 0; foreach (BigDecimal EachNum in bhat_ln) { if (ColumnNumberCount == 0) { Result.Append(MathV.NumberPolish(EachNum.ToString())); Result.Append(" + "); } else if (ColumnNumberCount == InputColsCount) { Result.Append(MathV.NumberPolish(EachNum.ToString())); Result.Append(" "); Result.Append(" ln " + MainForm.MainDT.Columns[AllColNums[ColumnNumberCount - 1]].ColumnName); } else { Result.Append(MathV.NumberPolish(EachNum.ToString())); Result.Append(" ln " + MainForm.MainDT.Columns[AllColNums[ColumnNumberCount - 1]].ColumnName); Result.Append(" + "); } ColumnNumberCount++; } Result.Append("\r\n检验P值: "); for (int i = 0; i < InputColsCount + 1; i++) { Result.Append(MathV.NumberPolish(value_beta_ln[i, 0].ToString())); Result.Append(" \t"); } Result.Append("\r\n检验t值: "); for (int i = 0; i < InputColsCount + 1; i++) { Result.Append(MathV.NumberPolish(value_beta_ln[i, 1].ToString())); Result.Append(" \t"); } Result.Append("\r\n\r\n"); } else { Result.Append("矩阵不可逆,回归方程无解 \r\n"); } } } //#自相关(3阶内) : Result.Append("5.自相关检验:拉格朗日乘子(LM) \r\n"); BigDecimal[,] u_hat_Auto = new BigDecimal[count - 3, 1]; BigDecimal[,] indep_Auto = new BigDecimal[count - 3, InputColsCount + 4]; for (int i = 0; i < count - 3; i++) { u_hat_Auto[i, 0] = u_hat[i + 3, 0]; for (int j = 0; j < InputColsCount + 1; j++) { indep_Auto[i, j] = IndependentVariables[i + 3, j]; } indep_Auto[i, InputColsCount + 1] = u_hat[i + 2, 0]; indep_Auto[i, InputColsCount + 2] = u_hat[i + 1, 0]; indep_Auto[i, InputColsCount + 3] = u_hat[i, 0]; } BigDecimal[,] b1_Auto = MathV.MatTrans(indep_Auto); BigDecimal[,] b2_Auto = MathV.MatTimes(b1_Auto, indep_Auto); BigDecimal[,] b3_Auto = MathV.MatInv(b2_Auto, InputColsCount + 4); if (b3_Auto != null) { BigDecimal[,] bhat_Auto = Stat.MultiRegBeta(b1_Auto, b3_Auto, indep_Auto, u_hat_Auto); string[] RandF_Auto = Stat.MultiRegR(bhat_Auto, indep_Auto, u_hat_Auto).Split(separator); BigDecimal LM_Auto = (count - 3) * Convert.ToDouble(RandF_Auto[0].ToString()); BigDecimal P_Auto = 1 - Stat.chi2(Convert.ToDouble(LM_Auto.ToString()), 3); Result.Append(" LM统计量 \t"); Result.Append(" =\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(LM_Auto.ToString()), ' ', 12)); Result.Append("\r\n"); Result.Append(" LM > chi(2)\t"); Result.Append(" =\t"); Result.Append(StrManipulation.PadLeftX(MathV.NumberPolish(P_Auto.ToString()), ' ', 12)); Result.Append("\r\n"); if (P_Auto <= 0.05) { Result.Append(" 在95%的置信水平下拒绝原假设,认为模型序列存在自相关\r\n \r\n"); } else { Result.Append(" 在95%的置信水平下接受原假设,认为模型序列不存在自相关\r\n \r\n"); } } MainForm.S.richTextBox1.AppendText(Result.ToString()); } } } }