mix2normal1               package:VGAM               R Documentation

_M_i_x_t_u_r_e _o_f _T_w_o _U_n_i_v_a_r_i_a_t_e _N_o_r_m_a_l _D_i_s_t_r_i_b_u_t_i_o_n_s

_D_e_s_c_r_i_p_t_i_o_n:

     Estimates the five parameters of a mixture of two univariate 
     normal distributions by maximum likelihood estimation.

_U_s_a_g_e:

     mix2normal1(lphi="logit", lmu="identity", lsd="loge",
                 ephi=list(), emu1=list(), emu2=list(), esd1=list(), esd2=list(),
                 iphi=0.5, imu1=NULL, imu2=NULL, isd1=NULL, isd2=NULL,
                 qmu=c(0.2, 0.8), esd=FALSE, zero=1)

_A_r_g_u_m_e_n_t_s:

    lphi: Link function for the parameter phi. See below for more
          details. See 'Links' for more choices.

     lmu: Link function applied to each mu parameter. See 'Links' for
          more choices.

     lsd: Link function applied to each sd parameter. See 'Links' for
          more choices.

ephi, emu1, emu2, esd1, esd2: List. Extra argument for each of the
          links. See 'earg' in 'Links' for general information. If
          'esd=TRUE' then 'esd1' is used and not 'esd2'.

    iphi: Initial value for phi, whose value must lie between 0 and 1.

imu1, imu2: Optional initial value for mu1 and mu2. The default is to
          compute initial values internally using the argument 'qmu'.

isd1, isd2: Optional initial value for sd1 and sd2. The default is to
          compute initial values internally based on the argument
          'qmu'.

     qmu: Vector with two values giving the probabilities relating to
          the sample quantiles for obtaining initial values for mu1 and
          mu2. The two values are fed in as the 'probs' argument into
          'quantile'.

     esd: Logical indicating whether the two standard deviations should
          be  constrained to be equal. If set 'TRUE', the appropriate
          constraint matrices will be used.

    zero: An integer specifying which linear/additive predictor is
          modelled as intercepts only.  If given, the value or values
          must be from the set 1,2,...,5.  The default is the first one
          only, meaning phi is a single parameter even when there are
          explanatory variables. Set 'zero=NULL' to model all
          linear/additive predictors as functions of the explanatory
          variables.

_D_e_t_a_i_l_s:

     The probability function can be loosely written as 

         f(y) = phi * N(mu1, sd1^2) + (1-phi) * N(mu2, sd2^2)

     where phi is the probability an observation belongs to the first
     group. The parameters mu1 and mu2 are the means, and  sd1 and sd2
     are the standard deviations. The parameter phi satisfies 0 < phi <
     1. The mean of Y is phi*mu1 + (1-phi)*mu2 and this is returned as
     the fitted values. By default, the five linear/additive predictors
     are (logit(phi), mu1, log(sd1), mu2, log(sd2))^T. If 'esd=TRUE'
     then sd1=sd2 is enforced.

_V_a_l_u_e:

     An object of class '"vglmff"' (see 'vglmff-class'). The object is
     used by modelling functions such as 'vglm', and 'vgam'.

_W_a_r_n_i_n_g:

     Numerical problems can occur. Half-stepping is not uncommon. If
     failure to converge occurs, try obtaining better initial values,
     e.g., by using 'iphi' and 'qmu' etc.

     This function uses a quasi-Newton update for the working weight
     matrices (BFGS variant). It builds up approximations to the weight
     matrices, and currently the code is not fully tested. In
     particular, results based on the weight matrices (e.g., from
     'vcov' and 'summary') may be quite incorrect, especially when the
     arguments 'weights' is used to input prior weights.

     This 'VGAM' family function should be used with caution.

_N_o_t_e:

     Fitting this model successfully to data can be difficult due to
     numerical problems and ill-conditioned data.  It pays to fit the
     model several times with different initial values, and check that
     the best fit looks reasonable. Plotting the results is
     recommended. This function works better as mu1 and mu2 become more
     different.

     Convergence is often slow, especially when the two component
     distributions are not well separated. The control argument 'maxit'
     should be set to a higher value, e.g., 200, and use 'trace=TRUE'
     to monitor convergence.  If appropriate in the first place,
     setting 'esd=TRUE' often makes the optimization problem much
     easier in general.

_A_u_t_h_o_r(_s):

     T. W. Yee

_R_e_f_e_r_e_n_c_e_s:

     Everitt, B. S. and Hand, D. J. (1981) _Finite Mixture
     Distributions_. London: Chapman & Hall.

_S_e_e _A_l_s_o:

     'normal1', 'Normal', 'mix2poisson'.

_E_x_a_m_p_l_e_s:

     n = 1000
     mu1 =  99   # Mean IQ of geography professors
     mu2 = 150   # Mean IQ of mathematics professors
     sd1 = sd2 = 16
     phi = 0.3
     y = ifelse(runif(n) < phi, rnorm(n, mu1, sd1), rnorm(n, mu2, sd2))

     # Good idea to have trace=TRUE:
     fit = vglm(y ~ 1, mix2normal1(esd=TRUE), maxit=200)
     coef(fit, matrix=TRUE) # the estimates
     c(phi, mu1, sd1, mu2, sd2) # the truth

     ## Not run: 
     # Plot the results
     xx = seq(min(y), max(y), len=200)
     plot(xx, (1-phi)*dnorm(xx, mu2, sd2), type="l", xlab="IQ",
          main="Red=estimate, blue=truth", col="blue")
     phi.est = logit(coef(fit)[1], inverse=TRUE)
     sd.est = exp(coef(fit)[3])
     lines(xx, phi*dnorm(xx, mu1, sd1), col="blue")
     lines(xx, phi.est * dnorm(xx, Coef(fit)[2], sd.est), col="red")
     lines(xx, (1-phi.est) * dnorm(xx, Coef(fit)[4], sd.est), col="red")
     abline(v=Coef(fit)[c(2,4)], lty=2, col="red")
     abline(v=c(mu1, mu2), lty=2, col="blue")
     ## End(Not run)

