Você está na página 1de 12

Introdução

A estimação por máxima verossimilhança possui várias boas propriedades. O estimador de


máxima verossimilhança (EMV) é consistente (converge para o valor verdadeiro),
normalmente assintótico (distribuição assintórica segue uma normal padrão) e eficiente (é o
estimador de menor variância possível). Por isso, e outros motivos, ele é um estimador muito
comumemente utilizado em estatística e econometria.
A intuição do EMV é a seguinte: temos uma amostra e estimamos os parâmetros que
maximizam a probabilidade de que esta amostra tenha sido gerada por uma certa
distribuição de probabilidade. Em termos práticos, eu primeiro suponho a forma da
μ �
� σ maneira
distribuição dos meus dados (e.g. normal), depois eu estimo os parâmetros μ e σ de
que eles maximizem a probabilidade de que a minha amostra siga uma distribuição normal
(tenha sido "gerada" por uma normal).
Há vários pacotes que ajudam a implementar a estimação por máxima verossimilhança no R.
Neste post vou me ater apenas a dois pacotes: o optimx e o maxLik. O primeiro deles agrega
funções de otimização de diversos outros pacotes numa sintaxe unificada centrada em
algumas poucas funções. O último é feito especificamente para estimação de máxima
verossimilhança então traz algumas comodidades como a estimação automática de erros-
padrão.
Vale lembrar que o problema de MV é, essencialmente, um problema de otimização, então é
possível resolvê-lo simplesmente com a função optim do R. Os dois pacotes simplesmente
trazem algumas comodidades.
1library(maxLik)
2library(optimx)
3# Para reproduzir os resultados
4set.seed(33)
R

Exemplo com distribuição Poisson


A ideia da estimação por máxima verossimilhança é de encontrar os parâmetros que
maximizam a probabilidade de que um certo conjunto de dados sejam gerados por algum
processo específico. Agora, em português: imagine que temos uma � amostra aleatória; não
1
sabemos qual distribuição os dados seguem, mas vamos supor que eles seguem alguma
,
distribuição específica, por exemplo, uma Poisson. O formato da Poisson depende do

λ� a ideia então é de encontrar o valor de λ que
parâmetro λ e λ� melhor 2aproxima a distribuição
empírica/observada dos dados. Isto é, dado uma amostra aleatória x1,x2,…,xn buscamos
, o
λ

valor de λ que … gerados por uma
maximiza a probabilidade de que os dados tenham sido
distribuição de Poisson. ,


x
n
� O formato da
A Poisson é uma distribuição discreta parametrizada por um valor λ>0.
>
λ Lembrando que a função de distribuição

distribuição varia com o valor de λ. da Poisson é
0
dada pela expressão:
0
ff(k,λ)=Pr(X=k)=k!λke−λ,k=0,1,2,…
� (�,�)=Pr(�=�)=���−��!,�=0,1,2,…
O λ

( código abaixo faz o gráfico da função acima para diferentes valores de λ.
k
,
Para montar a função de log-verossimilhança começamos com a função de verossimilhança
λ
de uma observação i qualquer
Max �>0ln(�)∑�=1 i ���−��
� e depois montamos a distribuição conjunta dos dados.
−∑�=1�ln(
)Lembrando
��!) que a função de verossimilhança i� dada por:
da Poisson para uma observação i é
a�
= (��,�)=����
f(xi,λ)=xi!λxie−λ
x
P

Supondo
(
���! que a amostra é de fato aleatória, a distribuição conjunta dos dados é
λsimplesmente o produtório das distribuições individuais, isto é:
rx
>
in(0∏k=1f(xk,λ)=n∏k=1(λxke−λxk!)=λ∑xke−nλ∏nk=1(xk!)
Aplicando
,X
l log chegamos na função de log-verossimilhança:
L(λ;x
λ= 1,…,xn)=ln(n∏k=1f(xk,λ))=ln(λ∑xk)+ln(e−nλ)
n
−ln(
()k n∏k=1(xk!))=ln(λ)n∑k=1xk−nλ−n∑k=1ln(xk!)
)
λ=

Dada uma amostra aleatória x1,x2,…,xn buscamos λ

o valor de λ que maximiza a função acima.
Isto é, temos o seguinte problema 1 de otimização:
)λ= ,
λ>0Maxln(λ)k=1∑nxk−nλ−k=1∑nln(xk!)
nxλ �

ionde os valores de xk são os nossos dados observados. Para implementar este procedimento

k 2
ek R primeiro montamos
no �
k a função
, log-verossimilhança no código abaixo. Em seguida vamos
e
− a função base optim que …
usar
= resolve problemas de minimização. Como a função optim serve
− ,
1λpara minimizar funções precisamos implementar o negativo da função de log-
λ � maximizar f(x) é
x
verossimilhança (lembrando que � equivalente à minimizar −f(x)).

k
ki1ll_pois <- function(x, theta) { � ( �
!−
2 n <- length(x) x � � (
!3 ll <- log(theta) * sum(x) - n * theta n -� sum(log(factorial(x)))
,n ) �
4 return(-ll) ∼
k
5} ) )
λ P ) R
=
− o
Vamos simular 1000 observações xi i
∼Poisson(λ=5).
n0
1amostra <- rpois(1000, lambda = 5)
s

, s
R

kPodemos tornar mais claro o procedimento de estimação olhando para o gráfico da função.
1
=
o
O código abaixo plota o gráfico danfunção de log-verossimilhança para valores de λ no
1,
λ

[
intervalo [0,20]. Note que a função( parece atingir um máximo em torno de 5, 55 o valor
l2 0 do parâmetro. �
verdadeiro
,n
1eixo_lambda, <- seq(0, 20, .001) =
(… 2
2plot(eixo_lambda, 5
-ll_pois(amostra, eixo_lambda), type = "l",
3 xlab =0bquote(lambda), )λ
x ]
k 0 =
! ] 5
) )
4 ylab = bquote("L("~lambda~";"~x[1]~", ... ,"~x[n]~")"),
5 main = "Função log-verossimilhança da Poisson")
6abline(v = 5, col = "indianred")
R

λ

Para estimar λ usamos a função optim. É preciso definir algum valor inicial para que o
otimizador numérico comece a procurar pelo máximo global. Em casos mais simples, de
funções globalmente côncavas, esta escolha não apresenta grandes consequências. Em casos
mais complicados, o resultado da estimação pode ser bastante sensível à escolha de valor
inicial porque o otimizador pode cair em máximos/mínimos locais. No final do post discuto
brevemente algumas soluções. Neste exemplo escolho arbitrariamente começar no valor 1. 11
Neste caso também poderíamos usar o fato de que a esperança da Poisson é igual a λ, λ logo,

pela Lei dos Grandes Números, a média amostral já deve estar próxima do verdadeiro valor
λ Assim, poderíamos também ter escolhido mean(amostra) como valor inicial.

de λ.
1fit <- optim(par = 1, fn = ll_pois, x = amostra,
2 method = "BFGS", hessian = TRUE)
3fit
R

1## $par
2## [1] 4.938
3##
4## $value
5## [1] 2202.837
6##
7## $counts
8## function gradient
9## 34 9
10##
11## $convergence
12## [1] 0
13##
14## $message
15## NULL
16##
17## $hessian
18## [,1]
19## [1,] 202.5112
...
A saída da função traz várias informações técnicas sobre a otimização numérica. A estimativa
4
pontual computada foi de 4.938 - bastante próxima do verdadeiro valor do parâmetro.
.
Usando a função str podemos observar a estrutura do objeto fit criado acima. As principais
9
informações que podemos extrair são as estimativas dos parâmetros fit$par e a hessiana
3
calculada nestes parâmetros  fit$hessian.
1str(fit)
8 3
8 R

1## List of 6
2## $ par : num 4.94
3## $ value : num 2203
4## $ counts : Named int [1:2] 34 9
5## ..- attr(*, "names")= chr [1:2] "function" "gradient"
6## $ convergence: int 0
7## $ message : NULL
8## $ hessian : num [1, 1] 203
Usando a estimativa da hessiana podemos computar o erro-padrão da estimativa. Lembre
que a variância assintótica do estimador de máxima verossimilhança é o inverso da matriz de
informação de Fisher que pode ser expressa como o negativo do valor esperado da hessiana.
Isto é, podemos encontrar a variância assintótica calculando o inverso da hessiana (como
fizemos a minimização do negativo da função log-verossimilhança não precisamos calcular o
negativo da hessiana).
1(ep <- sqrt(1/fit$hess))
R

1## [,1]
2## [1,] 0.0702709
Com o erro-padrão podemos calcular intervalos de confiança e estatística t.
1(ic <- c(fit$par - 1.96 * ep, fit$par + 1.96 * ep))
R

1## [1] 4.800269 5.075731


1(est_t <- (fit$par - 5) / ep)
R

1## [,1]
2## [1,] -0.8823045

Usando o pacote optimx
A função optim já é bastante antiga e um novo pacote, chamado optimx, foi criado. A ideia do
pacote é de agregar várias funções de otimização que estavam espalhadas em diversos
pacotes diferentes. As principais funções do pacote são optimx e optimr. Mais informações
sobre o pacote podem ser encontradas aqui.
A sintaxe das funções é muito similar à sintaxe original do optim. O código abaixo faz o mesmo
procedimento de estimação que o acima. Por padrão a função executa dois otimizadores: o
BFGS e Nelder-Mead
1summary(fit <- optimx(par = 1, fn = ll_pois, x = amostra))
R

1## p1 value fevals gevals niter convcode kkt1 kkt2 xtime


2## Nelder-Mead 4.9375 2202.837 32 NA NA 0 NA NA 0.002
3## BFGS 4.9380 2202.837 34 9 NA 0 NA NA 0.003
Uma das principais vantagens do optimx é a possibilidade de usar vários métodos de
otimização numérica numa mesma função.
1(fit <- optimx(par = 1,
2 fn = ll_pois,
3 x = amostra,
4 method = c("nlm", "BFGS", "Rcgmin", "nlminb")))
R

1## p1 value fevals gevals niter convcode kkt1 kkt2 xtime


2## nlm 4.937998 2202.837 NA NA 8 0 NA NA 0.002
3## BFGS 4.938000 2202.837 34 9 NA 0 NA NA 0.002
4## Rcgmin 4.938000 2202.837 15 10 NA 0 NA NA 0.002
5## nlminb 4.938000 2202.837 10 12 9 0 NA NA 0.002
Como este exemplo é bastante simples os diferentes métodos parecem convergir para
valores muito parecidos.

Usando o pacote maxLik


A função maxLik (do pacote homônimo) traz algumas comodidades: primeiro, ela maximiza
as funções de log-verossimilhança, ou seja, não é preciso montar a função com sinal de
menos como fizemos acima; segundo, ela já calcula erros-padrão e estatísticas-t dos
coeficientes estimados. Além disso, ela também facilita a implementação de gradientes e
hessianas analíticos e conta com métodos de otimização bastante populares como o BHHH.
Mais detalhes sobre a função e o pacote podem ser encontradas aqui.
Para usar a função precisamos primeiro reescrever a função log-verossimilhança, pois agora
não precisamos mais buscar o negativo da função. Como o R já vem com as funções de
densidade de várias distribuições podemos tornar o código mais enxuto usando o dpois que
implementa a função densidade da Poisson. O argumento log = TRUE retorna as
p
� �
probabilidades p como log(p).
1ll_pois <- function(x, theta) �{
2 ll <- dpois(x, theta, log =� TRUE)
3 return(sum(ll)) (
4}
� R
)
p a estimação. Note que a saída agora traz várias informações
O comando abaixo executa
relevantes. )
1summary(fit <- maxLik(ll_pois, start = 1, x = amostra))
R

1## --------------------------------------------
2## Maximum Likelihood estimation
3## Newton-Raphson maximisation, 8 iterations
4## Return code 8: successive function values within relative tolerance limit (reltol)
5## Log-Likelihood: -2202.837
6## 1 free parameters
7## Estimates:
8## Estimate Std. error t value Pr(> t)
9## [1,] 4.93801 0.07452 66.27 <2e-16 ***
10## ---
11## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
12## --------------------------------------------
...
Podemos implementar manualmente o gradiente e a hessiana da função. Neste caso, a
estimativa do parâmetro continua a mesma mas o erro-padrão diminui um pouco. Note que
também podemos fornecer estas informações para a função optimx. Derivando a função de
log-verossimilhança:
∂L(λ;x)∂λ=1λn∑k=1xk−n∂2L(λ;x)∂λ2=−1λ2n∑k=1xk
O código abaixo implementa o gradiente e a hessiana e faz a estimação. O valor estimado
continua praticamente o mesmo, mas o erro-padrão fica menor.
1grad_pois <- function(x, theta) {
2 (1 / theta) * sum(x) - length(x)
3}
4hess_pois <- function(x, theta) {
5 -(1 / theta^2) * sum(x)
6}
7summary(fit2 <- maxLik(ll_pois,
8 grad = grad_pois,
9 hess = hess_pois,
10 start = 1,
11
�(�,�)=12x�� = amostra))
f... 2exp(−(�−�)22�2)

( R

x1## --------------------------------------------
,2## Maximum Likelihood estimation
3## Newton-Raphson maximisation, 7 iterations
θ4## Return code 1: gradient close to zero (gradtol)
5## Log-Likelihood: -2202.837
)6## 1 free parameters
=7## Estimates:
8## Estimate Std. error t value Pr(> t)

19##(�� ,�)=12��
[1,] 4.93800 2�−70.27 <2e-16 ***
0.07027
(��−�)22�2
10## ---
(√
11## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
x
2 --------------------------------------------
12##
...


Exemplo com a distribuição normal
θ2
)e
=
x
A distribuição normal tem dois parâmetros: μ e σ. μ �
� σ Lembrando que o primeiro indica a média
e1
p o segundo a desvio-padrão. A função de densidade de probabilidade é dada por:

(f(x,θ)=2πσ21exp(2σ2−(x−μ)2)
− �
onde θ=(μ,σ).
2 O gráfico abaixo mostra como o formato da função varia conforme o valor
destes =parâmetros. Basicamente, quando a média aumenta, estamos "deslocando para a
π
( (
direita" e quando aumentamos o desvio-padrão estamos "achatando" a distribuição.
σ
x �
2− ,
eμ �
Lembrando
− ) que a função de distribuição de probabilidade da normal para uma observação i�i
σ
)(f(xi,θ)=2πσ21e2σ2−(xi−μ)2
x2
)
iFazendo o produtório da expressão acima para cada ii �
2

μ

2
22
σ
)2
∏�=1��(��,�)=(2��2)−�2exp(−12�2∏�=1�(��−�
L

∏(��,�)=−�2ln(2�)−�ln(�)−12�2∑�=1�(��−�)2
)2)
i=1∏Nf(xi,θ)=(2πσ2)−2Nexp(−2σ21i=1∏N(xi−μ)2)
(i
e= agora passando log, temos:
x
1L(xi,θ)=−2Nln(2π)−Nln(σ)−2σ21i=1∑N(xi−μ)2
i
, fMontamos a função log-verossimilhança usando a função dnorm

1ll_norm <- function(theta) {
2 ll <- dnorm(x, theta[1], theta[2], log = TRUE)
x
3
)4} -sum(ll)
i
=
,
R


Vamos �
simular uma amostra aleatória x1,x2,…,x1000 onde �
cada xi segue uma distribuição
θ 331
22 desvio-padrão 3 (i.e., 99 �
normal
N com média 2 e variância 9). i
)Primeiro vamos usar a função optimx ,
2
= �
1# warnings por causa dos valores negativos no log
l( <- rnorm(n = 1000, mean = 2, sd = 3)
2x 2
3(fit <- optimx(par = c(1, 1), fn = ll_norm, method , = "BFGS"))
n
2 R

(1##
π p1 ,
p2 value fevals gevals niter convcode kkt1 kkt2 xtime
2
2##
σ
BFGS 2.138082 3.058111 2536.736 47 �20 NA 0 TRUE TRUE 0.004
Note que a função retorna mensagens 1de erro indicando que a função retornou NaNs. Isto

acontece porque o otimizador experimenta 0 valores não-positivos para σ eσ isto não é

)admissível pois ln(σ), l 0
que aparece no segundo termo da equação acima, não é definido

para σ<0. � Além ndisso, σ não σ
� pode ser igual0 a zero pois ele aparece no denominador do último
N ( 0
N <
2termo à direita da expressão da log-verossimilhança.
0

le 00
Intuitivamente isto

é bastante σ

óbvio: σ representa � sua
o desvio-padrão da distribuição e σ2 a
22
x
n
variância: não podemos ter valores negativos ou nulos para estas expressões.
Podemos
)
restringir os valores dos parâmetros usando os argumentos upper e lower para evitar
(p
as mensagens de warning, mas, na prática, isto não costuma fazer diferença no resultado final
(
σ
da estimação. Note que podemos deixar a restrição livre usando Inf e -Inf que correspondem
)−
∞ −
a ∞ e −∞.
1
− ∞
1fit <- optimx(par = c(1, 1),
2
1
2 fn = ll_norm,
3 method = "L-BFGS-B",
σ
2
4 upper = c(Inf, Inf),
5
2σ lower = c(-Inf, 0))
N 6fit
2 R

N
1## p1 p2 value fevals gevals niter convcode kkt1 kkt2
i∑
2## L-BFGS-B 2.138093 3.058112 2536.736 11 11 NA 0 TRUE TRUE
=
3## xtime
i
14## L-BFGS-B 0.002
=
1(
(
x
ix

i
μ

)
μ
2)
)2
Propriedades dos estimadores de MV
A teoria dos estimadores de máxima verossimilhança nos garante que eles
são consistentes (i.e. que eles aproximam o valor verdadeiro dos parâmetros)
e normalmente assintóticos (a distribuição assintótica segue uma distribuição normal) desde
que algumas condições de regularidade sejam atentdidas.
Podemos demonstrar ambas as propriedades fazendo algumas simulações no R.

Consistência
Vamos montar um experimento simples: simulamos 5000 amostras aleatórias de tamanho

1000 seguindo uma distribuição N(2,3); μ �
� σ suas
computamos as estimativas para μ e σ e
( e depois analisamos suas propriedades.
respectivas variâncias assintóticas
2
1.Simular uma amostra segundo uma distribuição.
,
2.Estimata os parâmetros da distribuição.
3
3.Calcula a variância assintótica dos
) estimadores.
4.Repete 5000 vezes os passos 1-3.3
)
O código abaixo implementa exatamente este experimento. Note que a matriz de informação
de Fisher é aproximada pela hessiana.
1r <- 5000; n <- 1000
2estimativas <- matrix(ncol = 4, nrow = r)
3for(i in 1:r) {
4 x <- rnorm(n = n, mean = 2, sd = 3)
5 fit <- optimr(par = c(1, 1), fn = ll_norm, method = "BFGS", hessian = TRUE)
6 # Guarda o valor estimado do parâmetro
7 estimativas[i, 1:2] <- fit$par
8 estimativas[i, 3:4] <- diag(n * solve(fit$hess))
9}
R


A consistência dos estimadores θ^MV significa que eles aproximam os valores verdadeiros
^
� medida que aumenta o tamanho da amostra. Isto é, se tivermos uma
do parâmetros θ0 à
00� �
amostra grande N→∞ então podemos ter confiança de que nossos estimadores estão muito
→ verdadeiros �
próximos dos valores V dos parâmetros θ^MV→θ0

∞ ^ cada parâmetro - lembrando que μ0 �
O código abaixo calcula a média das estimativas para
∞ M

=2 e que σ0=3. Além disso, o histograma das estimativas mostra como as estimativas 0
0 V =
concentram-se em torno do valor verdadeiro do parâmetro

(indicado pela linha vertical).
2
1par(mfrow== c(1, 2)) 2
3 dos estimadores de MV �
2# Consistência
3
3mu <- estimativas[, 1]; sigma <- estimativas[, 2] 0θ
4mean(mu) 0
R

1## [1] 2.000883


1mean(sigma)
R

1## [1] 2.997335


1hist(mu, main = bquote("Estimativas para "~~mu), freq = FALSE, xlim = c(1.5, 2.5))
2abline(v = 2, col = "indianred")
3hist(sigma, main = bquote("Estimativas para "~~sigma), freq = FALSE, xlim = c(2.7, 3.3))
4abline(v = 3, col = "indianred")
R

Normalmente assintótico
Dizemos que os estimadores de máxima verossimilhança são normalmente assintóticos
porque a sua distribuição assintótica segue uma normal padrão. Especificamente, temos que:
zθ=√N^θMV−θ√Vast→N(0,1)
V
onde Vast é a variância assintótica do estimador. O código abaixo calcula a expressão acima

para os dois parâmetros e apresenta o histograma dos dados com uma normal padrão

superimposta.

t
No loop acima usamos o fato que a matriz de informação de Fisher pode ser estimada pela
hessiana. O código abaixo calcula a expressão acima para os dois parâmetros e apresenta o
histograma dos dados com uma normal padrão superimposta.
1# Normalidade assintótica
2
3# Define objetos para facilitar a compreensão
4mu_hat <- estimativas[, 1]
5sigma_hat <- estimativas[, 2]
6var_mu_hat <- estimativas[, 3]
7var_sg_hat <- estimativas[, 4]
8
9# Centra a estimativa
10mu_centrado <- mu_hat - 2
11sigma_centrado <- sigma_hat - 3
12# Computa z_mu z_sigma
13mu_normalizado <- sqrt(n) * mu_centrado / sqrt(var_mu_hat)
14sigma_normalizado <- sqrt(n) * sigma_centrado / sqrt(var_sg_hat)
...
R

1# Monta o gráfico para mu


2
3# Eixo x
4grid_x <- seq(-3, 3, 0.01)
5
6hist(mu_normalizado,
7 main = bquote("Histograma de 5000 simulações para z"[mu]),
8 freq = FALSE,
9 xlim = c(-3, 3),
10 breaks = "fd",
11 xlab = bquote("z"[mu]),
12 ylab = "Densidade")
13lines(grid_x, dnorm(grid_x, mean = 0, sd = 1), col = "dodgerblue")
14legend("topright", lty = 1, col = "dodgerblue", legend = "Normal (0, 1)")
...
R

1# Monta o gráfico para sigma2


2
3hist(sigma_normalizado,
4 main = bquote("Histograma de 5000 simulações para z"[sigma]),
5 freq = FALSE,
6 xlim =c(-3, 3),
7 breaks = "fd",
8 xlab = bquote("z"[sigma]), ylab = "Densidade")
9lines(grid_x, dnorm(grid_x, mean = 0, sd = 1), col = "dodgerblue")
10legend("topright", lty = 1, col = "dodgerblue", legend = "Normal (0, 1)")
R

Escolha de valores inicias


Como comentei acima, o método de estimação por MV exige que o usuário escolha valores
iniciais (chutes) para os parâmetros que se quer estimar.
O exemplo abaixo mostra o caso em que a escolha de valores iniciais impróprios leva a
estimativas muito ruins.
1# sensível a escolha de valores inicias
2x <- rnorm(n = 1000, mean = 15, sd = 4)
3(fit <- optim(par = c(1, 1), fn = ll_norm, method = "BFGS", hessian = TRUE))
R

1## $par
2## [1] 618.6792 962.0739
3##
4## $value
5## [1] 7984.993
6##
7## $counts
8## function gradient
9## 107 100
10##
11## $convergence
12## [1] 1
13##
14## $message
15## NULL
16##
17## $hessian
18## [,1] [,2]
19## [1,] 0.001070703 -0.0013531007
20## [2,] -0.001353101 0.0001884928
...
� � Uma das
Note que as estimativas estão muito distantes dos valores corretos μ=15 e σ=4.
= como
soluções, já mencionada acima, é de usar os momentos da distribuição = valores iniciais.
1 � � 4
μ σ
O código abaixo usa os momentos empíricos como valores inicias para μ e σ:
5 4
μinicial=1nn∑i=1xiσinicial= ⎷1nn∑i=1(xi−μinicial)2 5
1(chute_inicial <- c(mean(x), sqrt(var(x))))
R

1## [1] 14.859702 3.930849


1(est <- optimx(par = chute_inicial, fn = ll_norm))
R

1## p1 p2 value fevals gevals niter convcode kkt1 kkt2


2## Nelder-Mead 14.85997 3.929097 2787.294 47 NA NA 0 TRUE TRUE
3## BFGS 14.85970 3.928884 2787.294 15 2 NA 0 TRUE TRUE
4## xtime
5## Nelder-Mead 0.001
6## BFGS 0.000
Agora as estimativas estão muito melhores. Outra opção é experimentar com otimizadores
diferentes. Aqui a função optimx se prova bastante conveniente pois admite uma grande
variedade de métodos de otimizãção.
Note como os métodos BFGS e CG retornam valores muito distantes dos verdadeiros. Já o
método bobyqa retorna um valor corretor para o parâmetro da média, mas erra no parâmetro
da variânica. Já os métodos nlminb e Nelder-Mead ambos retornam os valores corretos.
1# Usando outros métodos numéricos
2optimx(par = c(1, 1), fn = ll_norm,
3 method = c("BFGS", "Nelder-Mead", "CG", "nlminb", "bobyqa"))
R

1## p1 p2 value fevals gevals niter convcode kkt1


2## BFGS 618.67917 962.073907 7984.993 107 100 NA 1 TRUE
3## Nelder-Mead 14.85571 3.929621 2787.294 83 NA NA 0 TRUE
4## CG 46.43586 628.570987 7358.601 204 101 NA 1 TRUE
5## nlminb 14.85970 3.928883 2787.294 23 47 19 0 TRUE
6## bobyqa 15.20011 8.993240 3211.556 109 NA NA 0 FALSE
7## kkt2 xtime
8## BFGS FALSE 0.006
9## Nelder-Mead TRUE 0.001
10## CG FALSE 0.008
11## nlminb TRUE 0.001
12## bobyqa FALSE 0.032
...
Vale notar também alguns detalhes técnicos da saída. Em particular, convcode == 0 significa
que o otimizador conseguiu convergir com sucesso, enquanto convcode == 1 indica que o
otimizador chegou no límite máximo de iterações sem convergir. Vemos que tanto o BFGS e o
CG falharam em convergir e geraram os piores resultados.
Já o kkt1 e kkt2 verificam as condições de Karush-Kuhn-Tucker (às vezes apresentadas apenas
como condições de Kuhn-Tucker). Resumidamente, a primeira condição verifica a
parte necessária do teorema enquanto a segunda condição verifica a parte suficiente. Note
que o bobyqa falha em ambas as condições (pois ele não é feito para este tipo de problema).
Os métodos que retornam os melhores valores, o Nelder-Mead e nlminb são os únicos que
convergiram com sucesso e que atenderam a ambas as condições de KKT. Logo, quando for
comparar os resltados de vários otimizadores distintos, vale estar atento a estes valores.
Mais detalhes sobre os métodos podem ser encontrados na página de ajuda da função ?
optimx.

Aplicações
•Estimando um modelo de mínimos quadrados por máxima verossimilhança
•Estimando um logit por máxima verossimilhança
•Estimando uma regressão de Poisson usando MV
•Aproximando distribuições por máxima verossimilhança

Você também pode gostar