示例#1
0
        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));
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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)));
        }
示例#4
0
        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);
        }
示例#5
0
        /// <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);
        }