pkg <- c("bbmle", # função mle2()
"MASS") # função fitdistr()
sapply(pkg, require,
character.only = TRUE)
bbmle MASS
TRUE TRUE
y <- c(5.0, 9.5, 9.8, 7.4, 18.2, 8.3, 7.0, 8.2, 7.4, 4.9,
12.5, 15.3, 8.9, 12.2, 22.2, 1.0, 8.9, 7.3, 4.6, 3.9)
A transformação Box-Cox é dada por:
\[ Y^{*} = \left\{\begin{array}{ll} \frac{Y^{\lambda} - 1}{\lambda} & \mbox{ se } \lambda \neq 0 \\ \log(Y) & \mbox{ se } \lambda = 0 \\ \end{array}\right. .\]
Aqui consideramos um \(\lambda = 0.2\)
lambda <- .2
# y.bc: transformação Box-Cox em y
(y.bc <- (y**(lambda) - 1) / lambda)
[1] 1.898648 2.843587 2.892511 2.461332 3.932732 2.634588 2.378866
[8] 2.616102 2.461332 1.870830 3.286135 3.627963 2.741908 3.245974
[15] 4.294812 0.000000 2.741908 2.441056 1.784558 1.564217
# ll.n: log-verossimilhança da normal
ll.n <- function(mu, sigma.l, y){
saida <- sum(dnorm(y,
mean = mu,
sd = exp(sigma.l),
log = TRUE))
return(-saida)}
# aval.ll.n: avaliando a função de log-verossimilhança da normal
aval.ll.n <- mle2(ll.n,
start = list(mu = mean(y),
sigma.l = log(sd(y))),
method = "BFGS",
data = list(y = y))
list(mu = coef(aval.ll.n)[[1]],
sigma = exp(coef(aval.ll.n)[[2]]))
$mu
[1] 9.125
$sigma
[1] 4.883531
fitdistr(y, "normal")$estimate
mean sd
9.125000 4.883531
logLik(aval.ll.n)
'log Lik.' -60.09614 (df=2)
fitdistr(y, "normal")$loglik
[1] -60.09614
list(mu.ic = confint(aval.ll.n,
method = "quad")[1, ],
sigma.ic = exp(confint(aval.ll.n,
method = "quad")[2, ]))
$mu.ic
2.5 % 97.5 %
6.984738 11.265262
$sigma.ic
2.5 % 97.5 %
3.582178 6.657646
perf.n <- profile(aval.ll.n)
plot(perf.n,
xlab = c(expression(mu), expression(log(sigma))))
list(mu.ic = confint(perf.n)[1, ],
sigma.ic = exp(confint(perf.n)[2, ]))
$mu.ic
2.5 % 97.5 %
6.877702 11.372298
$sigma.ic
2.5 % 97.5 %
3.687679 6.899465
# aval.ll.nt: avaliando a função de log-verossimilhança da normal com resposta transformada
aval.ll.nt <- mle2(ll.n,
start = list(mu = mean(y.bc),
sigma.l = log(sd(y.bc))),
method = "BFGS",
data = list(y = y.bc))
logLik(aval.ll.nt)
'log Lik.' -26.40036 (df=2)
fitdistr(y.bc, "normal")$loglik
[1] -26.40036
\[ l(\theta; y) = l(\theta; y^{*}) - \sum_{i=1}^{n} \log(J_{i}), \]
onde
\(l(\theta; y)\) é a log-verossimilhança na escala da variável original;
\(l(\theta; y^{*})\) é a log-verossimilhança do modelo ajustado com a variável transformada;
\(\sum_{i=1}^{n} \log(J_{i})\) é a soma dos log-Jacobianos para as observações individuais.
Aqui o log-Jacobiano utilizado é dado por:
\[ \log(J) = \left\{\begin{array}{ll} (\frac{1}{\lambda}-1) \log(\lambda \cdot Y^{*} + 1) & \mbox{ se } \lambda \neq 0 \\ Y^{*} & \mbox{ se } \lambda = 0 \\ \end{array}\right.. \]
# J.log: log-Jacobianos
J.log <- (1/(lambda) - 1) * log(lambda * y.bc + 1)
(aval.ll.nt <- logLik(aval.ll.nt) - sum(J.log))
'log Lik.' -59.12448 (df=2)
# ll.ln: log-verossimilhança da log-normal
ll.ln <- function(mu.log, sigma.log, y){
saida <- sum(dlnorm(y,
meanlog = exp(mu.log),
sdlog = exp(sigma.log),
log = TRUE))
return(-saida)}
# aval.ll.ln: avaliando a função de log-verossimilhança da log-normal
aval.ll.ln <- mle2(ll.ln,
start = list(mu.log = log(mean(y)),
sigma.log = log(sd(y))),
method = "BFGS",
data = list(y = y))
exp(coef(aval.ll.ln))
mu.log sigma.log
2.0452607 0.6416122
fitdistr(y, "lognormal")$estimate
meanlog sdlog
2.045257 0.641607
logLik(aval.ll.ln)
'log Lik.' -60.40833 (df=2)
fitdistr(y, "lognormal")$loglik
[1] -60.40833
exp(confint(aval.ll.ln,
method = "quad"))
2.5 % 97.5 %
mu.log 1.7825409 2.3467014
sigma.log 0.4706356 0.8747027
perf.ln <- profile(aval.ll.ln)
plot(perf.ln,
xlab = c(expression(log(mu)), expression(log(sigma))))
exp(confint(perf.ln))
2.5 % 97.5 %
mu.log 1.7499072 2.340571
sigma.log 0.4844939 0.906464
# ll.g: log-verossimilhança da gamma
ll.g <- function(forma.l, escala.l, y){
saida <- sum(dgamma(y,
shape = exp(forma.l),
scale = exp(escala.l),
log = TRUE))
return(-saida)}
Vamos chamar o parâmetro de forma de \(k\), e o parâmetro de escala de \(\theta\).
A esperança (média) e variância da variável aleatória são dados por:
\(E[X] = k \cdot \theta\);
\(Var[X] = k \cdot \theta^{2}\).
Logo,
\[ \text{média} = k \cdot \theta \quad \rightarrow \quad \theta = \frac{\text{média}}{k} \]
\[ \text{variância} = k \cdot \theta^{2} \rightarrow \text{variância} = k \cdot \left( \frac{\text{média}}{k} \right)^{2} = \frac{\text{média}^{2}}{k} \]
e
\[ k = \frac{\text{média}^{2}}{\text{variância}} \]
k <- (mean(y)**2) / var(y)
theta <- mean(y) / k
# aval.ll.g: avaliando a função de log-verossimilhança da gamma
aval.ll.g <- mle2(ll.g,
start = list(forma.l = log(k),
escala.l = log(theta)),
method = "BFGS",
data = list(y = y))
list(forma = exp(coef(aval.ll.g)[[1]]),
escala = exp(coef(aval.ll.g)[[2]]))
$forma
[1] 3.173311
$escala
[1] 2.875546
fitdistr(y, "gamma")$estimate
shape rate
3.1733266 0.3477619
# A fitdistr() usa o parâmetro rate, que é igual a 1 / scale
1 / exp(coef(aval.ll.g)[[2]])
[1] 0.3477601
logLik(aval.ll.g)
'log Lik.' -58.77988 (df=2)
fitdistr(y, "gamma")$loglik
[1] -58.77988
list(forma.ic = exp(confint(aval.ll.g,
method = "quad")[1, ]),
escala.ic = exp(confint(aval.ll.g,
method = "quad")[2, ]))
$forma.ic
2.5 % 97.5 %
1.758834 5.725330
$escala.ic
2.5 % 97.5 %
1.517232 5.449902
perf.g <- profile(aval.ll.g)
plot(perf.g,
xlab = c("forma ( k )", expression("escala ("~theta~")")))
list(forma = exp(confint(perf.g)[1, ]),
escala = exp(confint(perf.g)[2, ]))
$forma
2.5 % 97.5 %
1.663249 5.449225
$escala
2.5 % 97.5 %
1.617788 5.924838
Normal (natural) | Normal (transformada) | Log-Normal | Gamma |
---|---|---|---|
-60.09614 | -59.12448 | -60.40833 | -58.77988 |
As diferenças são pequenas, mas pelo valor da verossimilhança, o melhor ajuste é obtido com a distribuição Gamma, seguido da distribuição Normal (com variável transformada), Normal (variável na escala original) e Log-Normal.