Learn R Programming

VGAM (version 0.9-1)

mix2exp: Mixture of Two Exponential Distributions

Description

Estimates the three parameters of a mixture of two exponential distributions by maximum likelihood estimation.

Usage

mix2exp(lphi = "logit", llambda = "loge", iphi = 0.5, il1 = NULL,
        il2 = NULL, qmu = c(0.8, 0.2), nsimEIM = 100, zero = 1)

Arguments

lphi, llambda
Link functions for the parameters $\phi$ and $\lambda$. The latter is the rate parameter and note that the mean of an ordinary exponential distribution is $1 / \lambda$. See Links for more cho
iphi, il1, il2
Initial value for $\phi$, and optional initial value for $\lambda_1$ and $\lambda_2$. The last two have values that must be positive. The default is to compute initial values internally using the argument qmu.
qmu
Vector with two values giving the probabilities relating to the sample quantiles for obtaining initial values for $\lambda_1$ and $\lambda_2$. The two values are fed in as the probs argument into
nsimEIM, zero

Value

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

Warning

This VGAM family function requires care for a successful application. In particular, good initial values are required because of the presence of local solutions. Therefore running this function with several different combinations of arguments such as iphi, il1, il2, qmu is highly recommended. Graphical methods such as hist can be used as an aid.

Details

The probability function can be loosely written as $$P(Y=y) = \phi\,Exponential(\lambda_1) + (1-\phi)\,Exponential(\lambda_2)$$ where $\phi$ is the probability an observation belongs to the first group, and $y>0$. The parameter $\phi$ satisfies $0 < \phi < 1$. The mean of $Y$ is $\phi / \lambda_1 + (1-\phi) / \lambda_2$ and this is returned as the fitted values. By default, the three linear/additive predictors are $(logit(\phi), \log(\lambda_1), \log(\lambda_2))^T$.

See Also

rexp, exponential, mix2poisson.

Examples

Run this code
lambda1 <- exp(1); lambda2 <- exp(3)
(phi <- logit(-1, inverse = TRUE))
mdata <- data.frame(y1 = rexp(nn <- 1000, lambda1))
mdata <- transform(mdata, y2 = rexp(nn, lambda2))
mdata <- transform(mdata, Y  = ifelse(runif(nn) < phi, y1, y2))
fit <- vglm(Y ~ 1, mix2exp, mdata, trace = TRUE)
coef(fit, matrix = TRUE)

# Compare the results with the truth
round(rbind('Estimated' = Coef(fit),
            'Truth' = c(phi, lambda1, lambda2)), dig = 2)

with(mdata, hist(Y, prob = TRUE, main = "Orange = estimate, blue = truth"))
abline(v = 1 / Coef(fit)[c(2, 3)],  lty = 2, col = "orange", lwd = 2)
abline(v = 1 / c(lambda1, lambda2), lty = 2, col = "blue", lwd = 2)

Run the code above in your browser using DataLab