/// <summary> /// Piecewise linear regression /// </summary> /// <param name="regResults"></param> /// <param name="NObs"></param> /// <param name="Z"></param> /// <param name="Beta"></param> /// <param name="NVar"></param> /// <param name="DepVarMean"></param> /// <param name="B"></param> /// <param name="StkSprdPLOut"></param> /// <param name="CoefLabel"></param> public void Reg(StreamWriter regResults, int NObs, double[,] Z, double[] Beta, int NVar, double DepVarMean, double[] B, StreamWriter StkSprdPLOut, string[] CoefLabel) { // // Find X"X. // //Write(9,*) "NObs =", NObs regResults.WriteLine("NObs = " + NObs); regResults.WriteLine("X'X Matrix"); for (k = 1; k <= NVar; k++) { for (n = 1; n <= NObs; n++) Mean[k] = Mean[k] + Z[n, k]; for (l = 1; l <= NVar; l++) { XPrimeX[k, l] = 0; for (m = 1; m <= NObs; m++) { XPrimeX[k, l] = XPrimeX[k, l] + (Z[m, k] * Z[m, l]); } if (l < 8) regResults.Write(string.Format("{0,10:#######.00}", XPrimeX[k, l])); else regResults.WriteLine(string.Format("{0,10:#######.00}", XPrimeX[k, l])); } } for (k = 1; k <= NVar; k++) Mean[k] = Mean[k] / NObs; // for (n = 1; n <= NObs; n++) DepVarMean = DepVarMean + B[n]; // DepVarMean = DepVarMean / NObs; // // Invert X"X. // int Indic = -1; //Flag to invert X"X Invert invert = new Invert(); double Deter = invert.Matrix(NVar, XPrimeX, Dum, 1e-19, Indic, NVar + 1); regResults.WriteLine("X'X Inverse"); for (k = 1; k <= NVar; k++) { for (int l = 1; l <= NVar - 1; l++) // Use Write for 1st NVar-1 cols. regResults.Write(string.Format("{0,10:####.00000}", XPrimeX[k, l])); regResults.WriteLine(string.Format("{0,10:####.00000}", XPrimeX[k, NVar])); } // // Get X"Y. // regResults.WriteLine("XPrimeY"); for (k = 1; k <= 8; k++) { XPrimeY[k] = 0; for (l = 1; l <= NObs; l++) { XPrimeY[k] = XPrimeY[k] + (Z[l, k] * B[l]); } regResults.WriteLine(k + " " + string.Format("{0,10:########.00000}", XPrimeY[k])); } // // Last step to compute Betas. // regResults.WriteLine("Betas"); for (k = 1; k <= NVar; k++) { for (l = 1; l <= NVar; l++) { Beta[k] = Beta[k] + (XPrimeX[l, k] * XPrimeY[l]); } regResults.WriteLine(k + " " + string.Format("{0,10:########.00000}", Beta[k])); } // // Get SER, R2, & t-stats. // double SSR = 0; double YY = 0; double SumY = 0; for (i = 1; i <= NObs; i++) { YHat[i] = 0; for (j = 1; j <= NVar; j++) // For all betas. YHat[i] = YHat[i] + Beta[j] * Z[i, j]; SSR = SSR + (B[i] - YHat[i]) * (B[i] - YHat[i]); YY = YY + B[i] * B[i]; SumY = SumY + B[i]; // B is not a Beta; it is the dep. var. } // double TotSS = YY - (SumY * SumY) / NObs; double XSS = TotSS - SSR; double RSqrd = XSS / TotSS; // double SER = Math.Sqrt(SSR / (NObs - NVar)); // // Write table in new coef. file. // DateTime TimeNow = DateTime.Now; // To put run time on output file. StkSprdPLOut.WriteLine("Coefficients for weekly stock equation estimated on " + TimeNow); StkSprdPLOut.WriteLine(); StkSprdPLOut.WriteLine(" Est Coef t-Stat Variable Mean"); StkSprdPLOut.WriteLine("--------- ------ ----------------- -------"); for (j = 1; j <= NVar; j++) { if (XPrimeX[j, j] <= 0) { string msg = XPrimeX[j, j] + " Inv(X'X) element " + " " + j + " is negative."; Warning.Message(msg, "Terminate", 1); } StkSprdPLOut.WriteLine(string.Format("{0,9:###.00000}", Beta[j]) + string.Format("{0,7:###.000}", Beta[j] / (SER * Math.Sqrt(XPrimeX[j, j]))) + CoefLabel[j] + string.Format("{0,8:###.0000}", Mean[j])); //430 Format(f9.5,f7.2,1x,a17,f8.4) } // // Write summary stats below table. // StkSprdPLOut.WriteLine("--------- ------ ----------------- -------"); StkSprdPLOut.WriteLine(" R-Squared = " + RSqrd); StkSprdPLOut.WriteLine(" SER = " + SER); StkSprdPLOut.WriteLine(" Number of obs = " + NObs); StkSprdPLOut.WriteLine(" Dep. Var. Mean = " + DepVarMean); // return; }
/// <summary> /// Piecewise linear regression /// </summary> /// <param name="regResults"></param> /// <param name="NObs"></param> /// <param name="Z"></param> /// <param name="Beta"></param> /// <param name="NVar1"></param> /// <param name="DepVarMean"></param> /// <param name="B"></param> /// <param name="StkSprdPLOut"></param> /// <param name="CoefLabel"></param> public void Reg(StreamWriter regResults, int NObs, double[,] Z, double[] Beta, int NVar, double DepVarMean, double[] B, StreamWriter StkSprdPLOut, string[] CoefLabel) { NVar1 = NVar - 1; // See note above. // // Find X'X. // regResults.WriteLine("NObs = " + NObs); regResults.WriteLine("X'X Matrix"); for (k = 1; k <= NVar1; k++) { for (n = 1; n <= NObs; n++) Mean[k] = Mean[k] + Z[n, k]; // Accumulate for means. for (l = 1; l <= NVar1; l++) { XPrimeX[k, l] = 0; for (m = 1; m <= NObs; m++) XPrimeX[k, l] = XPrimeX[k, l] + (Z[m, k] * Z[m, l]); if (l < NVar1) { // Switch print masks depending on magnitude of number. // if (XPrimeX[k, l] >= 10000000 || XPrimeX[k, l] <= -1000000) regResults.Write(string.Format("{0,10:#########0}", XPrimeX[k, l])); else regResults.Write(string.Format("{0,10:######0.00}", XPrimeX[k, l])); } else if (XPrimeX[k, l] >= 10000000 || XPrimeX[k, l] <= -1000000) regResults.WriteLine(string.Format("{0,10:#########0}", XPrimeX[k, l])); else regResults.WriteLine(string.Format("{0,10:######0.00}", XPrimeX[k, l])); } // End for l } // End for k for (k = 1; k <= NVar1; k++) Mean[k] = Mean[k] / NObs; // Compute means. // for (n = 1; n <= NObs; n++) { DepVarMean = DepVarMean + B[n]; //Console.WriteLine(n + " " + B[n] + " " + DepVarMean); // 12-2-14 } // DepVarMean = DepVarMean / NObs; // // Invert X'X. // int Indic = -1; //Flag to invert X'X Invert invert = new Invert(); double Deter = invert.Matrix(NVar1, XPrimeX, Dum, 1e-19, Indic, NVar1 + 1); // // If Dum[0] is 1, Invert encountered a fatal error. Close output files & exit. // if (Dum[0] == 1) { regResults.Close(); StkSprdPLOut.Close(); Warning.Message("Fatal error in Invert. Closing output files.", "Terminate", 1); } regResults.WriteLine("X'X Inverse"); for (k = 1; k <= NVar1; k++) { for (int l = 1; l <= NVar1 - 1; l++) // Use Write for 1st NVar1-1 cols. regResults.Write(string.Format("{0,10:####.00000}", XPrimeX[k, l])); regResults.WriteLine(string.Format("{0,10:####.00000}", XPrimeX[k, NVar1])); } // // Get X'Y. // regResults.WriteLine("XPrimeY"); for (k = 1; k <= NVar1; k++) { XPrimeY[k] = 0; for (l = 1; l <= NObs; l++) { XPrimeY[k] = XPrimeY[k] + (Z[l, k] * B[l]); } regResults.WriteLine(string.Format("{0,10:#########0}", k) + string.Format("{0,10:######.000}", XPrimeY[k])); } // // Last step to compute Betas. // regResults.WriteLine("Betas"); for (k = 1; k <= NVar1; k++) { for (l = 1; l <= NVar1; l++) { Beta[k] = Beta[k] + (XPrimeX[l, k] * XPrimeY[l]); } regResults.WriteLine(string.Format("{0,10:#########0}", k) + string.Format("{0,10:#####.0000}", Beta[k])); } // // Get SER, R2, & t-stats. // double SSR = 0; double YY = 0; double SumY = 0; for (i = 1; i <= NObs; i++) { YHat[i] = 0; for (j = 1; j <= NVar1; j++) // For all betas. YHat[i] = YHat[i] + Beta[j] * Z[i, j]; SSR = SSR + (B[i] - YHat[i]) * (B[i] - YHat[i]); YY = YY + B[i] * B[i]; SumY = SumY + B[i]; // B is not a Beta; it is the dep. var. } // double TotSS = YY - (SumY * SumY) / NObs; double XSS = TotSS - SSR; double RSqrd = XSS / TotSS; // double SER = Math.Sqrt(SSR / (NObs - NVar1)); // // Write table in new coef. file. // DateTime TimeNow = DateTime.Now; // To put run time on output file. StkSprdPLOut.WriteLine("Coefficients for weekly stock equation estimated on " + TimeNow); StkSprdPLOut.WriteLine(); StkSprdPLOut.WriteLine(" Est Coef t-Stat Variable Mean"); StkSprdPLOut.WriteLine(" --------- ------ -------------- -------"); for (j = 1; j <= NVar1; j++) { if (XPrimeX[j, j] <= 0) { string msg = XPrimeX[j, j] + " Inv(X'X) element " + " " + j + " is <= 0."; regResults.Close(); Warning.Message(msg, "Terminate", 1); } double tStat = Beta[j] / (SER * Math.Sqrt(XPrimeX[j, j])); StkSprdPLOut.WriteLine(" " + string.Format("{0,9:##0.00000}", Beta[j]) + string.Format("{0,7:##0.000}", tStat) + " " + CoefLabel[j] + "\t" + string.Format("{0,8:##0.0000}", Mean[j])); } // // To remind us that MAHDD is not in the reg., but still available, give it a zero // coef & show it on the last line. // StkSprdPLOut.WriteLine(" " + string.Format("{0,9:##0.00000}", 0) + string.Format("{0,7:##0.000}", 0) + " " + CoefLabel[j] + "\t" + string.Format("{0,8:##0.0000}", 0)); // // Write summary stats below table. // StkSprdPLOut.WriteLine(" --------- ------ --------------- -------"); StkSprdPLOut.WriteLine(string.Format("{0,7:#0.0000}", RSqrd) + " = R-Squared"); StkSprdPLOut.WriteLine(string.Format("{0,7:#0.0000}", SER) + " = SER"); StkSprdPLOut.WriteLine(string.Format("{0,7:######0}", NObs) + " = Number of obs"); StkSprdPLOut.WriteLine(string.Format("{0,7:###0.00}", DepVarMean) + " = Dep. Var. Mean"); StkSprdPLOut.WriteLine(); }