Learn R Programming

VGAM (version 0.8-2)

mix2poisson: Mixture of Two Poisson Distributions

Description

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

Usage

mix2poisson(lphi = "logit", llambda = "loge",
            ephi=list(), el1=list(), el2=list(),
            iphi = 0.5, il1 = NULL, il2 = NULL,
            qmu = c(0.2, 0.8), nsimEIM=100, zero = 1)

Arguments

lphi
Link function for the parameter $\phi$. See Links for more choices.
llambda
Link function applied to each $\lambda$ parameter. See Links for more choices.
ephi, el1, el2
List. Extra argument for each of the links. See earg in Links for general information.
iphi
Initial value for $\phi$, whose value must lie between 0 and 1.
il1, il2
Optional initial value for $\lambda_1$ and $\lambda_2$. These values 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
zero
An integer specifying which linear/additive predictor is modelled as intercepts only. If given, the value must be either 1 and/or 2 and/or 3, and the default is the first one only, meaning $\phi$ is a single parameter even when there are explanator

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.

With grouped data (i.e., using the weights argument) one has to use a large value of nsimEIM; see the example below.

Details

The probability function can be loosely written as $$P(Y=y) = \phi \, Poisson(\lambda_1) + (1-\phi) \, Poisson(\lambda_2)$$ where $\phi$ is the probability an observation belongs to the first group, and $y=0,1,2,\ldots$. 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

rpois, poissonff, mix2normal1.

Examples

Run this code
# Example 1: simulated data
nn = 1000
mu1 = exp(2.5) # also known as lambda1
mu2 = exp(3)
(phi = logit(-0.5, inverse=TRUE))
mdata = data.frame(y = ifelse(runif(nn) < phi, rpois(nn, mu1), rpois(nn, mu2)))
fit = vglm(y ~ 1, mix2poisson, mdata)
coef(fit, matrix=TRUE)

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

# Plot the results
ty = with(mdata, table(y))
plot(names(ty), ty, type="h", main="Red=estimate, blue=truth",
     ylab="Frequency", xlab="y")
abline(v=Coef(fit)[-1], lty=2, col="red", lwd=2)
abline(v=c(mu1, mu2), lty=2, col="blue", lwd=2)

# Example 2: London Times data (Lange, 1997, p.31)
ltdata1 = data.frame(deaths = 0:9,
                     freq = c(162, 267, 271, 185, 111, 61, 27, 8, 3, 1))
ltdata2 = data.frame(y = with(ltdata1, rep(deaths, freq)))

# Usually this does not work well unless nsimEIM is large
fit = vglm(deaths ~ 1, weight=freq, data=ltdata1,
           mix2poisson(iphi=0.3, il1=1, il2=2.5, nsimEIM=5000))

# This works better in general
fit = vglm(y ~ 1, mix2poisson(iphi=0.3, il1=1, il2=2.5), ltdata2)
coef(fit, matrix=TRUE)
Coef(fit)

Run the code above in your browser using DataLab