Estimador de máxima verossimilhança da distribuição exponencial

Neste notebook do Jupyter vamos demonstrar a dedução matemática do estimador de máxima verossimilhança do parâmetro da distribuição exponencial. Para ver os resultados dos comandos de cada etapa coloque o mouse ao lado esquerdo da célula que tem os comandos e clique em 'Run this cell'

Preparação

Antes de começar importamos a biblioteca de matemática simbólica do Python. Ela permite criar expressões, como funções e suas derivadas, e manipulá-las simbolicamente.

In [3]:
from sympy import *
init_printing()

A função de densidade probabilística

Para uma dada observação $x_i$ a função de densidade probabilística da distribuição exponecial é

In [4]:
x, L, i, n = symbols('x \lambda i n')
f = L*exp(-L*Indexed(x,i))
f
Out[4]:
$\displaystyle \lambda e^{- \lambda {x}_{i}}$

Defina a função de log-verossimilhança negativa

É a soma dos logarítimos dos valores da função acima sobre todos os valores dos dados ($x_i$). Primeiro calculamos o logarítmo da função de massa:

In [5]:
lf = ln(f)
lf=expand_log(lf, force=true)
lf
Out[5]:
$\displaystyle - \lambda {x}_{i} + \log{\left(\lambda \right)}$

e em seguida definimos a sua soma sobre todos os valores de $x_i$

In [6]:
LL = Sum(lf, (i,1,n))
LL=simplify(LL)
LL
Out[6]:
$\displaystyle \log{\left(\lambda \right)} \sum_{i=1}^{n} 1 + \sum_{i=1}^{n} - \lambda {x}_{i}$

O somatório $\sum_{i=1}^n 1$ nada mais é que $n$. Substituímos isto na função obtida acima temos:

In [7]:
g=Sum(1, (i,1,n))
LL=LL.subs(g,n)      
LL
Out[7]:
$\displaystyle n \log{\left(\lambda \right)} + \sum_{i=1}^{n} - \lambda {x}_{i}$

Estimativa de máxima verossimilhança (mle)

É o valor do parâmetro $\lambda$ que maximiza a função de log-verossimilhança (ou minimiza a de log-verossimilhança negativa). Sabemos que as funções têm derivadas zero em seus pontos máximos e mínimos. Então o truque para achar a expressão do mle é encontrar a expressão para o valor de $\lambda$ que faz a derivada da função de log-verossimilhança ser igual a zero. São duas etapas:

Calcule a derivada da função de log-verossimlhança em relação ao parâmetro

Usamos o comando 'diff' para obter a derivada da log-verossimilhança em função do parâmetro $\lambda$:

In [8]:
dLL = diff(LL,L)
dLL=simplify(expand(dLL))
dLL
Out[8]:
$\displaystyle - \sum_{i=1}^{n} {x}_{i} + \frac{n}{\lambda}$

Resolvemos a derivada para o parâmetro

Agora igualamos a derivada da função de log-verossimilhança a zero e resolvemos esta equação para o parãmetro $\lambda$:

In [9]:
simplify(solve(dLL,L))
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-9-2ff49c5b5d68> in <module>
----> 1 simplify(solve(dLL,L))

/usr/lib/python3.8/site-packages/sympy/simplify/simplify.py in simplify(expr, ratio, measure, rational, inverse, doit, **kwargs)
    559         return _eval_simplify(**kwargs)
    560 
--> 561     original_expr = expr = collect_abs(signsimp(expr))
    562 
    563     if not isinstance(expr, Basic) or not expr.args:  # XXX: temporary hack

/usr/lib/python3.8/site-packages/sympy/simplify/radsimp.py in collect_abs(expr)
    595       return Mul._from_args(args, is_commutative=not nc)
    596 
--> 597     return expr.replace(
    598         lambda x: isinstance(x, Mul),
    599         lambda x: _abs(x)).replace(

AttributeError: 'list' object has no attribute 'replace'

Ou seja, o mle do único parâmetro da distribuição exponencial é o inverso da média amostral.