private static double GetLikelihood_Normal(List <RDataRecord> data, double[] beta_hat) { int N = data.Count; int k = beta_hat.Length; double residual_sum_of_squares = 0; double[] y = new double[N]; for (int i = 0; i < N; ++i) { y[i] = data[i].YValue; } double sigma = StdDev.GetStdDev(y, Mean.GetMean(y)) / (N - k - 1); for (int i = 0; i < N; ++i) { double linear_predictor = 0; RDataRecord rec = data[i]; for (int j = 0; j < k; ++j) { linear_predictor += rec.data[j] * beta_hat[j]; } double residual = rec.YValue - linear_predictor; residual_sum_of_squares += residual * residual; } return(System.Math.Exp(-residual_sum_of_squares / (2 * sigma)) / System.Math.Sqrt(2 * System.Math.PI * sigma)); }
/// <summary> /// /// </summary> /// <param name="vcovmat">variance-covariance matrix for the model coefficients</param> private void UpdateStatistics(IMatrix vcovmat, IMatrix W) { int n = vcovmat.RowCount; int m = b.Dimension; for (int i = 0; i < n; ++i) { mStats.StandardErrors[i] = System.Math.Sqrt(vcovmat[i, i]); for (int j = 0; j < n; ++j) { mStats.VCovMatrix[i][j] = vcovmat[i, j]; } } double[] outcomes = new double[m]; for (int i = 0; i < m; i++) { double cross_prod = 0; for (int j = 0; j < n; ++j) { cross_prod += A[i, j] * mX[j]; } mStats.Residuals[i] = b[i] - mLinkFunc.GetInvLink(cross_prod); outcomes[i] = b[i]; } mStats.ResidualStdDev = StdDev.GetStdDev(mStats.Residuals, 0); mStats.ResponseMean = Mean.GetMean(outcomes); mStats.ResponseVariance = System.Math.Pow(StdDev.GetStdDev(outcomes, mStats.ResponseMean), 2); mStats.R2 = 1 - mStats.ResidualStdDev * mStats.ResidualStdDev / mStats.ResponseVariance; mStats.AdjustedR2 = 1 - mStats.ResidualStdDev * mStats.ResidualStdDev / mStats.ResponseVariance * (n - 1) / (n - mX.Length - 1); }
/// <summary> /// Calculate the adjusted R^2 (the explained variablity by the regression model) /// The higher the adjusted R^2, the better the fitted regression model /// </summary> /// <param name="residuals">the residuals {y_i - X_i * beta_hat }_i</param> /// <param name="y">The outcomes (i.e. sample values of the response variable)</param> /// <param name="k">The number of parameters (i.e. the predictor coefficients in the regression model)</param> /// <param name="n">The number of sample data points (i.e., the number records in the training data)</param> /// <returns></returns> public static double CalcAdjustedRSquare(double[] residuals, double[] y, int k, int n) { double Var_e = 0; for (int i = 0; i < residuals.Length; ++i) { Var_e = residuals[i] * residuals[i]; } double Var_y = System.Math.Pow(StdDev.GetStdDev(y, Mean.GetMean(y)), 2); return(1 - (Var_e / (n - k - 1)) / (Var_y / (n - 1))); }
protected void UpdateStatistics(double[] W) { IMatrix AtWA = At.ScalarMultiply(W).Multiply(A); IMatrix AtWAInv = QRSolver.Invert(AtWA); int n = AtWAInv.RowCount; int m = b.Dimension; for (int i = 0; i < n; ++i) { mStats.StandardErrors[i] = System.Math.Sqrt(AtWAInv[i, i]); for (int j = 0; j < n; ++j) { mStats.VCovMatrix[i][j] = AtWAInv[i, j]; } } double[] outcomes = new double[m]; for (int i = 0; i < m; i++) { double cross_prod = 0; for (int j = 0; j < n; ++j) { cross_prod += A[i, j] * mX[j]; } mStats.Residuals[i] = b[i] - mLinkFunc.GetInvLink(cross_prod); outcomes[i] = b[i]; } mStats.ResidualStdDev = StdDev.GetStdDev(mStats.Residuals, 0); mStats.ResponseMean = Mean.GetMean(outcomes); mStats.ResponseVariance = System.Math.Pow(StdDev.GetStdDev(outcomes, mStats.ResponseMean), 2); mStats.R2 = 1 - mStats.ResidualStdDev * mStats.ResidualStdDev / mStats.ResponseVariance; mStats.AdjustedR2 = 1 - mStats.ResidualStdDev * mStats.ResidualStdDev / mStats.ResponseVariance * (n - 1) / (n - mX.Length - 1); }
/// <summary> /// In this particular instance, it is assumed that W = sigma^(-2) I, that is e is identical and uncorrelated /// </summary> /// <param name="A"></param> /// <param name="b"></param> /// <param name="x"></param> public GlmStatistics(double[][] A, double[] b, double[] x) { int m = A.GetLength(0); int n = A.GetLength(1); mResiduals = new double[m]; for (int i = 0; i < m; ++i) { double cross_prod = 0; for (int j = 0; j < n; ++j) { cross_prod += A[i][j] * x[j]; } mResiduals[i] = b[i] - cross_prod; } double residual_mu = 0; mResidualStdDev = StdDev.GetStdDev(mResiduals, residual_mu); mResponseMean = Mean.GetMean(b); mResponseVariance = System.Math.Pow(StdDev.GetStdDev(b, mResponseMean), 2); // (A.transpose * A).inverse * sigma^2 IMatrix AtA = new SparseMatrix(n, n); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { double cross_prod = 0; for (int k = 0; k < m; ++k) { cross_prod += A[i][k] * A[k][j]; } AtA[i, j] = cross_prod; } } IMatrix AtAInv = QRSolver.Invert(AtA); double sigmaSq = mResidualStdDev * mResidualStdDev; mVcovMatrix = new double[n][]; for (int i = 0; i < n; ++i) { mVcovMatrix[i] = new double[n]; for (int j = 0; j < n; ++j) { mVcovMatrix[i][j] = AtAInv[i, j] * sigmaSq; } } mStandardErrors = new double[n]; for (int i = 0; i < n; ++i) { mStandardErrors[i] = System.Math.Sqrt(mVcovMatrix[i][i]); } mR2 = 1 - sigmaSq / mResponseVariance; mAdjustedR2 = 1 - sigmaSq / mResponseVariance * (n - 1) / (n - x.Length - 1); }