From 936ff7fe77f8939f1f9f2d3403e15273e400e5c5 Mon Sep 17 00:00:00 2001 From: Eduardo Junior <edujrrib@gmail.com> Date: Fri, 20 May 2016 11:45:48 -0300 Subject: [PATCH] =?UTF-8?q?Adiciona=20fun=C3=A7=C3=A3o=20para=20c=C3=A1lcu?= =?UTF-8?q?lo=20da=20m=C3=A9dia=20e=20vari=C3=A2ncia=20da=20COM-Poisson?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NAMESPACE | 2 + R/cmp.R | 104 +++++++++++++++++++++++++++++++++++++++++++ man/calc_mean_cmp.Rd | 37 +++++++++++++++ man/calc_var_cmp.Rd | 38 ++++++++++++++++ 4 files changed, 181 insertions(+) create mode 100644 man/calc_mean_cmp.Rd create mode 100644 man/calc_var_cmp.Rd diff --git a/NAMESPACE b/NAMESPACE index c95b30f..11ac489 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,6 +1,8 @@ # Generated by roxygen2: do not edit by hand export(apc) +export(calc_mean_cmp) +export(calc_var_cmp) export(cmp) export(convergencez) export(dcmp) diff --git a/R/cmp.R b/R/cmp.R index a5f0713..96f679c 100644 --- a/R/cmp.R +++ b/R/cmp.R @@ -239,6 +239,110 @@ dcmp <- function(y, lambda, nu, sumto) { }) } +#' @name calc_mean_cmp +#' @author Eduardo E. R. Junior, \email{edujrrib@gmail.com} +#' @export +#' @title Calcula o Valor Esperado para a Distribuição +#' Conway-Maxwell-Poisson +#' @description Função para calcular a média do tipo \eqn{E(Y) = \mu = +#' \sum y\cdot \Pr(y)} para uma variável aleatória COM-Poisson a +#' partir dos parâmetros \eqn{\lambda > 0} e \eqn{\nu \geq 0}. +#' @param lambda Valor do parâmetro \eqn{\lambda} da distribuição +#' COM-Poisson. Quando \eqn{\nu = 1}, o parâmetro \eqn{\lambda = +#' E(Y)} é a média. +#' @param nu Valor do parâmetro \eqn{\nu} da distribuição COM-Poisson. +#' @param sumto Número de incrementos a serem considerados para a +#' cálculo da constante normalizadora Z. +#' @param tol Tolerância para interromper a procura pelo valor de +#' \code{ymax}, valor cuja probabilidade correspondente é inferior a +#' \code{tol}, para valores os valores de \code{lambda} e +#' \code{nu} informados. +#' @return Um vetor de tamanho igual ao do maior vetor, \code{lambda} ou +#' \code{nu} com os valores correspondentes de \eqn{\mu}. + +calc_mean_cmp <- function(lambda, nu, sumto, tol = 1e-5) { + ## Faz com que os parâmetros sejam vetores de mesmo tamanho. + names(lambda) <- NULL + names(nu) <- NULL + pars <- data.frame(lambda = lambda, nu = nu) + ## Calcula o ymax usando mu + 5 (sqrt(sigma)) + sigma <- lambda^(1/nu)/nu - (nu - 1)/(2 * nu^2) + ymax <- with(pars, ceiling(max(lambda + 5 * sqrt(sigma)))) + ## Agora verifica se a prob(ymax) é de fato pequena, se não, soma 1. + lambdamax <- max(pars$lambda) + numin <- min(pars$nu) + pmax <- dcmp(y = ymax, lambda = lambdamax, nu = numin, sumto) + while (pmax > tol) { + ymax <- ymax + 1 + pmax <- dcmp(y = ymax, lambda = lambdamax, nu = numin, sumto) + } + ## Define o vetor onde avaliar a densidade COM-Poisson. + y <- 1:ymax + estmean <- mapply(lambda = pars$lambda, + nu = pars$nu, + MoreArgs = list(y = y, sumto = sumto), + FUN = function(lambda, nu, y, sumto) { + py <- dcmp(y, lambda, nu, sumto) + sum(y * py) + }, + SIMPLIFY = TRUE) + names(estmean) <- NULL + return(estmean) +} + +#' @name calc_var_cmp +#' @author Eduardo E. R. Junior, \email{edujrrib@gmail.com} +#' @export +#' @title Calcula o Valor da Variância para a Distribuição +#' Conway-Maxwell-Poisson +#' @description Função para calcular a variância do tipo \eqn{V(Y) = +#' E(Y^2) - E^2(Y) = \sum y^2\cdot \Pr(y) - \left ( \sum y\cdot +#' \Pr(y) \right )^2} para uma variável aleatória COM-Poisson a +#' partir dos parâmetros \eqn{\lambda > 0} e \eqn{\nu \geq 0}. +#' @param lambda Valor do parâmetro \eqn{\lambda} da distribuição +#' COM-Poisson. Quando \eqn{\nu = 1}, o parâmetro \eqn{\lambda = +#' E(Y)} é a média. +#' @param nu Valor do parâmetro \eqn{\nu} da distribuição COM-Poisson. +#' @param sumto Número de incrementos a serem considerados para a +#' cálculo da constante normalizadora Z. +#' @param tol Tolerância para interromper a procura pelo valor de +#' \code{ymax}, valor cuja probabilidade correspondente é inferior a +#' \code{tol}, para valores os valores de \code{lambda} e \code{nu} +#' informados. +#' @return Um vetor de tamanho igual ao do maior vetor, \code{lambda} ou +#' \code{nu} com os valores correspondentes de \eqn{\mu}. + +calc_var_cmp <- function(lambda, nu, sumto, tol = 1e-5) { + # Faz com que os parâmetros sejam vetores de mesmo tamanho. + names(lambda) <- NULL + names(nu) <- NULL + pars <- data.frame(lambda = lambda, nu = nu) + # Calcula o ymax usando mu + 5 (sqrt(sigma)) + sigma <- lambda^(1/nu)/nu - (nu - 1)/(2 * nu^2) + ymax <- with(pars, ceiling(max(lambda + 5 * sqrt(sigma)))) + # Agora verifica se a prob(ymax) é de fato pequena, se não, soma 1. + lambdamax <- max(pars$lambda) + numin <- min(pars$nu) + pmax <- dcmp(y = ymax, lambda = lambdamax, nu = numin, sumto) + while (pmax > tol) { + ymax <- ymax + 1 + pmax <- dcmp(y = ymax, lambda = lambdamax, nu = numin, sumto) + } + # Define o vetor onde avaliar a densidade COM-Poisson. + y <- 1:ymax + esty2 <- mapply(lambda = pars$lambda, + nu = pars$nu, + MoreArgs = list(y = y, sumto = sumto), + FUN = function(lambda, nu, y, sumto) { + py <- dcmp(y, lambda, nu, sumto) + c(sum(y * py)^2, sum(y^2 * py)) + }, + SIMPLIFY = TRUE) + estvar <- diff(esty2) + names(estvar) <- NULL + return(estvar) +} + #' @title Ajuste do Modelo Conway-Maxwell-Poisson #' @author Eduardo E. R. Junior, \email{edujrrib@gmail.com} #' @export diff --git a/man/calc_mean_cmp.Rd b/man/calc_mean_cmp.Rd new file mode 100644 index 0000000..ad7abdf --- /dev/null +++ b/man/calc_mean_cmp.Rd @@ -0,0 +1,37 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/cmp.R +\name{calc_mean_cmp} +\alias{calc_mean_cmp} +\title{Calcula o Valor Esperado para a Distribuição + Conway-Maxwell-Poisson} +\usage{ +calc_mean_cmp(lambda, nu, sumto, tol = 1e-05) +} +\arguments{ +\item{lambda}{Valor do parâmetro \eqn{\lambda} da distribuição +COM-Poisson. Quando \eqn{\nu = 1}, o parâmetro \eqn{\lambda = +E(Y)} é a média.} + +\item{nu}{Valor do parâmetro \eqn{\nu} da distribuição COM-Poisson.} + +\item{sumto}{Número de incrementos a serem considerados para a +cálculo da constante normalizadora Z.} + +\item{tol}{Tolerância para interromper a procura pelo valor de +\code{ymax}, valor cuja probabilidade correspondente é inferior a +\code{tol}, para valores os valores de \code{lambda} e +\code{nu} informados.} +} +\value{ +Um vetor de tamanho igual ao do maior vetor, \code{lambda} ou + \code{nu} com os valores correspondentes de \eqn{\mu}. +} +\description{ +Função para calcular a média do tipo \eqn{E(Y) = \mu = + \sum y\cdot \Pr(y)} para uma variável aleatória COM-Poisson a + partir dos parâmetros \eqn{\lambda > 0} e \eqn{\nu \geq 0}. +} +\author{ +Eduardo E. R. Junior, \email{edujrrib@gmail.com} +} + diff --git a/man/calc_var_cmp.Rd b/man/calc_var_cmp.Rd new file mode 100644 index 0000000..094ad71 --- /dev/null +++ b/man/calc_var_cmp.Rd @@ -0,0 +1,38 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/cmp.R +\name{calc_var_cmp} +\alias{calc_var_cmp} +\title{Calcula o Valor da Variância para a Distribuição + Conway-Maxwell-Poisson} +\usage{ +calc_var_cmp(lambda, nu, sumto, tol = 1e-05) +} +\arguments{ +\item{lambda}{Valor do parâmetro \eqn{\lambda} da distribuição +COM-Poisson. Quando \eqn{\nu = 1}, o parâmetro \eqn{\lambda = +E(Y)} é a média.} + +\item{nu}{Valor do parâmetro \eqn{\nu} da distribuição COM-Poisson.} + +\item{sumto}{Número de incrementos a serem considerados para a +cálculo da constante normalizadora Z.} + +\item{tol}{Tolerância para interromper a procura pelo valor de +\code{ymax}, valor cuja probabilidade correspondente é inferior a +\code{tol}, para valores os valores de \code{lambda} e \code{nu} +informados.} +} +\value{ +Um vetor de tamanho igual ao do maior vetor, \code{lambda} ou + \code{nu} com os valores correspondentes de \eqn{\mu}. +} +\description{ +Função para calcular a variância do tipo \eqn{V(Y) = + E(Y^2) - E^2(Y) = \sum y^2\cdot \Pr(y) - \left ( \sum y\cdot + \Pr(y) \right )^2} para uma variável aleatória COM-Poisson a + partir dos parâmetros \eqn{\lambda > 0} e \eqn{\nu \geq 0}. +} +\author{ +Eduardo E. R. Junior, \email{edujrrib@gmail.com} +} + -- GitLab