Exemplo n.º 1
0
        internal static LPhiObject LPhi(double[] z)
        {
            //# z: can be scalar or vector
            LPhiObject rep = new LPhiObject(z.Length);

            /*
             *  lphi <- function(z)
             *  {
             # z: can be scalar or vector
             #
             #    log.phi <- dnorm(z, log=T)      # log(phi(z))
             #    log.Phi <- pnorm(z, log.p=T)    # log(Phi(z))
             #
             #    r  <- exp(log.phi-log.Phi)      # phi(z)/Phi(z)
             #    r2 <- exp(2*(log.phi-log.Phi))  # phi^2(z) / Phi^2 (z)
             #
             #    list(r=r, r2=r2) # r and r2 are of same length as z
             #  } # end of lphi
             */

            double[] tmp = NormalDistribution.DNorm(z, give_log: true).Substract(NormalDistribution.PNorm(z, log_p: true));
            rep.R  = tmp.Exp();             // phi(z)/Phi(z)
            rep.R2 = tmp.Multiply(2).Exp(); // phi^2(z) / Phi^2 (z)
            return(rep);
        }
Exemplo n.º 2
0
        internal override double[] Start(SGNFnAParam A)
        {
            double s0  = Math.Sqrt(2 * A.B / A.N);
            double g0  = NormalDistribution.PNorm(A.Mu / s0, log_p: true);
            double gp0 = -NormalDistribution.DNorm(A.Mu / s0) * A.Mu / Math.Pow(s0, 2) / NormalDistribution.PNorm(A.Mu / s0);
            double c3  = A.N * (gp0 - 1);
            double c2  = A.N * (1 - g0 + gp0 * s0);
            double c0  = -A.B;

            double[] theta = Tools.Combine(c0, 0, c2, c3);
            double[] roots = Numerics.CubicEquation.GetRealRoots(theta, l: 0).ToArray();
            if (roots.Length == 0)
            {
                roots = Tools.Combine(s0);
            }

            return(roots);
        }