diff --git a/inst/slides/compoisson.Rnw b/inst/slides/compoisson.Rnw index e66e37ee7944cf6a1b528c6f972c81b2f4c34779..0f92a9b558e31ec663c0b928ce148c17b325d59a 100644 --- a/inst/slides/compoisson.Rnw +++ b/inst/slides/compoisson.Rnw @@ -1,5 +1,16 @@ +<<setup-child, include=FALSE>>= +set_parent("slides-mrdcr.Rnw") -\begin{frame}[allowframebreaks]{Distribuiçao COM-Poisson} +## Pacotes utilizados nesta seção +## library(MRDCr) +devtools::load_all() +library(latticeExtra) +library(grid) +library(plyr) + +@ + +\begin{frame}[allowframebreaks]{Distribuição COM-Poisson} \begin{itemize} \item Nome COM-Poisson, advém de seus autores {\bf CO}nway e @@ -7,20 +18,17 @@ Conway-Maxwell-Poisson). \item Proposta em um contexto de filas \cite{Conway1962}, essa distribuição generaliza a Poisson com a adição de um parâmetro. + \item Modifica a relação entre probabilidades consecutivas. + \begin{multicols}{2} + \begin{itemize} + \item {\bf Distribuição Poisson}\\ + $$\frac{P(Y = y-1)}{P(Y = y)} = \frac{y}{\lambda}$$ + \item {\bf Distribuição COM-Poisson}\\ + $$\frac{P(Y = y-1)}{P(Y = y)} = \frac{y^\nu}{\lambda}$$ + \end{itemize} + \end{multicols} \end{itemize} -\begin{block}{Razão de probabilidades consecutivas} - -\begin{multicols}{2} - \begin{itemize} - \item {\bf Distribuição Poisson}\\ - $$\frac{P(Y = y-1)}{P(Y = y)} = \frac{y}{\lambda}$$ - \item {\bf Distribuição COM-Poisson}\\ - $$\frac{P(Y = y-1)}{P(Y = y)} = \frac{y^\nu}{\lambda}$$ - \end{itemize} -\end{multicols} -\end{block} - \framebreak \begin{block}{Densidade de probabilidade} @@ -34,19 +42,6 @@ \end{center} \end{block} -\begin{columns}[t,onlytextwidth] - -\column{.48\textwidth} -\begin{block}{Propriedades} -\begin{itemize} - \itemsep7.5pt\parskip0pt\parsep0pt - \item $\frac{P(Y = y - 1)}{P(Y = y)} = \frac{y^\nu}{\lambda}$ - \item $E(Y) \approx \lambda ^ \frac{1}{\nu} - \frac{\nu - 1}{2\nu}$ - \item $V(Y) \approx \frac{1}{\nu}E(Y)$ - \end{itemize} -\end{block} - -\column{.48\textwidth} \begin{block}{Casos particulares} \begin{itemize} \item Distribuição Poisson, quando $\nu = 1$ @@ -55,69 +50,9 @@ \end{itemize} \end{block} -\end{columns} - -\framebreak - -<<>>= - -library(latticeExtra) -library(grid) -library(compoisson) - -cols <- c(4, 1) -## Parametros da distribuição -lambdas <- c(1.36, 8, 915); nus <- c(0.4, 1, 2.5) -medias <- mapply(com.mean, lambda = lambdas, nu = nus) -variancias <- mapply(com.var, lambda = lambdas, nu = nus) - -## Calculando as probabilidades -y <- 0:30; yy <- rep(y, 3) -py.com <- py.pois <- NULL -for(i in 1:3) py.com <- c(py.com, dcom(y, lambdas[i], nus[i])) -for(i in 1:3) py.pois <- c(py.pois, dpois(y, medias[i])) - -## Criando categorias para split da lattice -caso <- rep(c("1", "2", "3"), each = length(y)) -fl <- expression(lambda == 1.36~","~nu == 0.4, - lambda == 8~","~nu == 1, - lambda == 915~","~nu == 2.5) - -xyplot(py.com ~ c(yy - 0.14) | caso, type = c("h", "g"), - lwd = 2.5, xlab = "y", ylab = expression(P(Y == y)), - col = cols[2], ylim = c(-0.040, 0.25), xlim = extendrange(y), - key = list( - columns = 2, - lines = list(lty=1, col = c(cols[1], cols[2]), lwd = 3), - text = list(c("Poisson", "COM-Poisson"))), - layout = c(NA, 1), - between = list(x = 0.2, y = 0.3), - strip = strip.custom(factor.levels = fl)) + - as.layer(xyplot(py.pois ~ c(yy + 0.14) | caso, - lwd = 2.5, col = cols[1], - type = "h")) -for(i in 1:3){ - trellis.focus("panel", i, 1, highlight=FALSE) - grid.text(label = sprintf("E[Y]: %.1f\nV[Y]: %.1f", - medias[i], variancias[i]), - x = .62, y = 0.02, - default.units = "npc", - gp = gpar(col = cols[2]), - just = c("left", "bottom")) - grid.text(label = sprintf("E[Y]: %.1f\nV[Y]: %.1f", - medias[i], medias[i]), - x = .08, y = 0.02, - default.units = "npc", - gp = gpar(col = cols[1]), - just = c("left", "bottom")) -} -trellis.unfocus() - -@ - \end{frame} -\begin{frame}{Casos Particulares} +\begin{frame}{Distribuição COM-Poisson} \begin{columns}[t] \begin{column}{.3\textwidth} @@ -136,13 +71,12 @@ trellis.unfocus() \only<1>{ \vspace{-1.1cm} -<<fig.height=5, fig.width=7>>= +<<fig.width=7, out.width="0.9\\textwidth">>= ##------------------------------------------- ## Poisson -rm(list = ls()) y <- 0:10 -py <- dcom(y, 5, 1) +py <- dcmp(y, 5, 1, sumto = 30) xyplot(py ~ y, type = c("h", "g"), lwd = 4, xlab = "y", ylab = "", main = expression(~"COM-Poisson"~(~lambda==5~","~nu==1))) @@ -151,13 +85,12 @@ xyplot(py ~ y, type = c("h", "g"), } \only<2>{ \vspace{-1.1cm} -<<fig.height=5, fig.width=7>>= +<<fig.width=7, out.width="0.9\\textwidth">>= ##------------------------------------------- ## Bernoulli -rm(list = ls()) y <- 0:2 -py <- dcom(y, 3, 20) +py <- dcmp(y, 3, 20, sumto = 30) xyplot(py ~ y, type = c("h", "g"), lwd = 4, xlab = "y", ylab = "", main = expression(~"COM-Poisson"~(~lambda==3~","~nu==20))) @@ -166,13 +99,12 @@ xyplot(py ~ y, type = c("h", "g"), } \only<3>{ \vspace{-1.1cm} -<<fig.height=5, fig.width=7>>= +<<fig.width=7, out.width="0.9\\textwidth">>= ##------------------------------------------- ## Geometrica -rm(list = ls()) y <- 0:6 -py <- dcom(y, 0.5, 0) +py <- dcmp(y, 0.5, 0, sumto = 30) xyplot(py ~ y, type = c("h", "g"), lwd = 4, xlab = "y", ylab = "", main = expression(~"COM-Poisson"~(~lambda==0.5~","~nu==0))) @@ -183,6 +115,191 @@ xyplot(py ~ y, type = c("h", "g"), \end{frame} +\begin{frame} + +<<fig.height=4.5>>= + +## Parametros da distribuição +lambdas <- c(1.36, 8, 915); nus <- c(0.4, 1, 2.5) +medias <- mapply(calc_mean_cmp, lambda = lambdas, nu = nus, sumto = 50) +variancias <- mapply(calc_var_cmp, lambda = lambdas, nu = nus, sumto = 50) + +## Calculando as probabilidades +y <- 0:30; yy <- rep(y, 3) +py.com <- py.pois <- NULL +for(i in 1:3) py.com <- c(py.com, dcmp(y, lambdas[i], nus[i], sumto = 50)) +for(i in 1:3) py.pois <- c(py.pois, dpois(y, medias[i])) + +## Criando categorias para split da lattice +caso <- rep(c("1", "2", "3"), each = length(y)) +fl <- expression(lambda == 1.36~","~nu == 0.4, + lambda == 8~","~nu == 1, + lambda == 915~","~nu == 2.5) + +cols <- c(trellis.par.get("dot.symbol")$col, + trellis.par.get("superpose.line")$col[2]) +xyplot(py.com ~ c(yy - 0.15) | caso, type = c("h", "g"), + lwd = 1, xlab = "", ylab = expression(P(Y == y)), + col = cols[1], ylim = c(-0.07, 0.25), xlim = extendrange(y), + scales = list(y = list(at = seq(0, 0.2, 0.05))), + key = list( + columns = 2, + lines = list(lty = 1, col = c(cols[1], cols[2]), lwd = 1), + text = list(c("COM-Poisson", "Poisson"))), + layout = c(NA, 1), + between = list(x = 0.2, y = 0.3), + strip = strip.custom(factor.levels = fl)) + + as.layer(xyplot(py.pois ~ c(yy + 0.15) | caso, + lwd = 2, col = cols[2], + type = "h")) +for(i in 1:3){ + trellis.focus("panel", i, 1, highlight=FALSE) + grid.text(label = sprintf("E[Y]: %.1f\nV[Y]: %.1f", + medias[i], variancias[i]), + x = .62, y = 0.05, + default.units = "npc", + gp = gpar(col = cols[1]), + just = c("left", "bottom")) + grid.text(label = sprintf("E[Y]: %.1f\nV[Y]: %.1f", + medias[i], medias[i]), + x = .08, y = 0.05, + default.units = "npc", + gp = gpar(col = cols[2]), + just = c("left", "bottom")) +} +trellis.unfocus() + +@ + +\end{frame} + +\begin{frame}{Assintocidade da função Z} + +$$ Z(\lambda, \nu) = \sum_{j=0}^\infty \frac{\lambda^j}{(j!)^\nu} $$ + +<<fig.height=3, fig.width=9>>= + +##------------------------------------------- +## Calcula Z para um c(lambda, phi) +funZ <- function(lambda, nu, maxit = 500, tol = 1e-5) { + z <- rep(NA, maxit) + j = 1 + ## + z[j] <- exp(j * log(lambda) - nu * lfactorial(j)) + ## + while (abs(z[j] - 0) > tol && j <= maxit) { + j = j + 1 + z[j] <- exp(j * log(lambda) - nu * lfactorial(j)) + } + return(cbind("j" = 0:j, "z" = c(1, z[!is.na(z)]))) +} + +params <- list(c("lambda" = 1.36, "nu" = 0.4), + c("lambda" = 8, "nu" = 1), + c("lambda" = 915, "nu" = 2.5)) + +zs <- sapply(params, function(x) funZ(x["lambda"], x["nu"]), + simplify = FALSE) +names(zs) <- seq_along(zs) +da <- ldply(zs) + +xyplot(z ~ j | .id, data = da, + type = c("b", "g"), pch = 19, + scales = "free", + ylab = list( + expression(frac(lambda^j, "(j!)"^nu)), + rot = 0), + strip = strip.custom(factor.levels = fl)) + +@ + +\end{frame} + +\begin{frame}{Momentos da distribuição} + +\begin{columns}[t,onlytextwidth] + +\column{.48\textwidth} +Não tem expressão analítica, calculamos utilizando a definição de média e +variância; +\begin{itemize} + \itemsep7.5pt\parskip0pt\parsep0pt + \item E(Y) = $\begin{aligned} + &\sum_{y = 0}^{\infty} y \cdot p(y)& + \end{aligned} + $ + \item V(Y) = $\begin{aligned} + &\sum_{y = 0}^{\infty} y^2 \cdot p(y) - E^2(Y)& + \end{aligned} + $ +\end{itemize} + +\column{.48\textwidth} +Aproximação proposta por \cite{Shimueli2005}, boa aproximação para $\nu +\leq 1$ ou $\lambda > 10^\nu$ \\[0.2cm] +\begin{itemize} + \itemsep7.5pt\parskip0pt\parsep0pt + \item E(Y) $\approx$ $\begin{aligned} + &\lambda ^ \frac{1}{\nu} - \frac{\nu - 1}{2\nu}& + \end{aligned} + $ + \item V(Y) $\approx$ $\begin{aligned} + &\frac{1}{\nu}\cdot E(Y)& + \end{aligned} + $ +\end{itemize} + +\end{columns} + +\end{frame} + +\begin{frame} + +<<fig.width = 9, fig.height = 4.5, out.width = "0.95\\textwidth">>= + +## densidade sob parametrização da média +dcmp.mean <- function (y, mu, nu, sumto) { + sapply(y, function(yi) { + loglambda <- nu * log(mu + (nu - 1) / (2 * nu)) + exp(-llcmp(c(log(nu), loglambda), + y = yi, X = 1, sumto = sumto)) + }) +} + + +grid <- expand.grid(mu = c(2, 8, 15), nu = c(0.5, 1, 2.5)) +y <- 0:30 + +py <- mapply(FUN = dcmp.mean, + mu = grid$mu, + nu = grid$nu, + MoreArgs = list(y = y, sumto = 100), + SIMPLIFY = FALSE) +grid <- cbind(grid[rep(1:nrow(grid), each = length(y)), ], + y = y, + py = unlist(py)) + +useOuterStrips(xyplot(py ~ y | factor(mu) + factor(nu), + ylab = expression(P(Y==y)), + xlab = expression(y), + data = grid, type = "h", + panel = function(x, y, ...) { + m <- sum(x * y) + panel.xyplot(x, y, ...) + panel.abline(v = m, lty = 2) + }), + strip = strip.custom( + strip.names = TRUE, + var.name = expression(mu == ""), + sep = ""), + strip.left = strip.custom( + strip.names = TRUE, + var.name = expression(nu == ""), + sep = "")) +@ + +\end{frame} + \begin{frame}{Modelo de Regressão COM-Poisson} \begin{itemize} @@ -196,7 +313,7 @@ xyplot(py ~ y, type = c("h", "g"), \begin{block}{Função de verossimilhança} \begin{align*} - L(\lambda, \nu ; \underline{y}) &= \prod_i^n \left ( + L(\beta, \nu ; \underline{y}) &= \prod_i^n \left ( \frac{\lambda_i^{y_i}}{(y_i !)^\nu} Z(\lambda_i, \nu)^{-1} \right ) \\ &= \lambda_i^{\sum_i^n y_i}\prod_i^n @@ -208,7 +325,7 @@ xyplot(py ~ y, type = c("h", "g"), \begin{block}{Função de log-verossimilhança} \begin{align*} - l(\lambda, \nu, \underline{y}) &= \log \left ( + \ell(\beta, \nu, \underline{y}) &= \log \left ( \lambda_i^{\sum_i^n y_i}\prod_i^n \frac{Z(\lambda_i, \nu)^{-1}}{(y_i !)^\nu} \right ) \\ &= \sum_i^n y_i \log(\lambda_i) - \nu \sum_i^n \log(y!) - @@ -223,9 +340,10 @@ xyplot(py ~ y, type = c("h", "g"), {\it Vignette} \href{run:../doc/v01_poisson.html}{\tt compoisson.html} \begin{description} - \item[\tt capdesfo]: número de capulhos sob efeito de desfolha (sub) - \item[\tt capmosca]: número de capulhos sob exposição à mosca branca (sub) - \item[\tt ninfas]: número de ninfas de mosca branca em plantas de soja (super) + \item[\tt capdesfo]: Número de capulhos em algodão sob efeito de desfolha (sub) + \item[\tt capmosca]: Número de capulhos em algodão sob exposição à mosca branca (sub) + \item[\tt ninfas]: Número de ninfas de mosca branca em plantas de soja (super) + \item[\tt soja]: Número de vagens, de grãos por planta (equi e super). \end{description} \end{frame}