Keshani Kaveesha, CC BY-SA 4.0, via Wikimedia Commons
El proceso de modelación estadística clásicamente incluye los siguientes pasos:
La familia exponencial de distribuciones es un conjunto de distribuciones muy especial. Muchas propiedades que poseen la hacen muy atrayente para la modelación estadística. Algunas de las distribuciones más notables de la probabilidad pertenecen a ella, lo que facilita el desarrollo de modelos de regresión relativamente sencillos.
Consideremos una variable aleatoria Y cuya función de probabilidad depende de un parámetro θ. La distribución pertenece a la familia exponencial si y solo sí puede escribirse en la forma
f(y|θ)=exp[a(y)b(θ)+c(θ)+d(y)],en donde a,b,c,d son funciones conocidas.
forma canónica
.Los siguientes son los tres ejemplos más notables de distribuciones de la familia exponencial.
Arriba hemos escrito la forma como comúnmente se conoce esta distribución. Se deja al lector verificar que esta densidad se puede reescribir en la forma.
f(y|θ,σ2)=exp[−y22σ2+yθσ2−θ22σ2−12log(2πσ2)].En este caso, el parámetro de interés de θ y σ2 es un parámetro de ruido. Se tiene que:
Se puede verificar que si una variable aleatoria Y tiene distribución N(θ,σ2), entonces
El siguiente fragmento de
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
mu = 0
sigma = 1
normal = norm(mu, sigma)
x = np.linspace(-4, 4, 100)
y = normal.pdf(x)
plt.plot(x, y, 'b', lw=2, alpha=0.6)
plt.title('Función de densidad de la distribución N(0,1)')
plt.show()
Con el siguiente código calculamos la media varianza y algunos cuantiles de la distribución N(0,1).
# media y varianza de la distribución Normal(0,1)
import numpy as np
from scipy.stats import norm
mu = 0
sigma = 1
normal = norm(mu, sigma)
media, var = normal.stats(moments="mv")
print('Distribución Normal(0,1); media = {}, varianza = {}'.format(media, var, curtosis ))
# calcula algunos cuantiles de la distribución
prob = np.array([0.025, 0.5, 0.975])
cuantiles = normal.ppf(prob)
print('Distribución Normal(0,1); probabilidades={}; cuantiles={}'.format(prob, np.round(cuantiles,3)))
Distribución Normal(0,1); media = 0.0, varianza = 1.0 Distribución Normal(0,1); probabilidades=[0.025 0.5 0.975]; cuantiles=[-1.96 0. 1.96]
La distribución de Poisson es una distribución discreta usada en problemas de conteos. La función de probabildiad tiene la forma
p(y|θ)=e−θθyy!,θ>0,y=0,1,2,….Denotamos esta densidad como Pois(θ) . En foma de la familia exponencial, la distribución puede escribirse como
p(y|θ)=exp[ylogθ−θ−logy!]Entonces se tiene que:
Se puede verificar que si una variable aleatoria Y tiene distribución Pois(θ), entonces
El siguiente fragmento de código dibuja la función de probabilidad Pois(10)
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import poisson
mu = 10
pois = poisson(mu)
import pandas as pd
x = np.arange(30)
prob_p = pois.pmf(x)
data = pd.DataFrame(zip(x,prob_p))
data.columns=['x','p']
ax = sns.barplot(data=data, x='x', y='p')
ax.set(xlabel='x', ylabel='p(x|$\theta$)', title='Distribución Poisson({})'.format(mu))
ax.set_xticklabels(x, rotation=90, size=5)
plt.show()
Con el siguiente código calculamos la media varianza y algunos cuantiles de la distribución Pois(10).
# media y varianza de la distribución Poisson(17.5)
import numpy as np
from scipy.stats import poisson
mu = 10
pois = poisson(mu)
media, var = pois.stats(moments="mv")
print('Distribución Poisson(10); media = {}, varianza {}'.format(media, var))
# calcula algunos cuantiles de la distribución
prob = np.array([0.25, 0.5, 0.75])
cuantiles = pois.ppf(prob)
print('Distribución Poisson(10); probabilidades={}; cuantiles={}'.format(prob, cuantiles))
Distribución Poisson(10); media = 10.0, varianza 10.0 Distribución Poisson(10); probabilidades=[0.25 0.5 0.75]; cuantiles=[ 8. 10. 12.]
La distribución Binomial surge en problemas con ensayos binarios que pueden resultar en éxito (1) o fallo (0). Si se realizan n ensayos (de Bernoulli) de forma independiente y se define la variable aleatoria y como el número de éxitos, entonces se dice que Y tiene distribución Binomial con parámetro θ, cuya densidad es dada por:
p(y|θ)=(ny)θy(1−θ)n−y,y=1,…,n,en donde
(ny)=n!y!(n−y)!es el número de grupos diferentes de tamaño y, que se pueden organizar si se tienen en total n elementos. Esta distribución se denota Binom(n,θ). La densidad se puede reescribir como
p(y|θ)=exp[ylogθ−ylog(1−θ)+nlog(1−θ)+log(ny)],de donde se tiene que:
Se puede verificar que si una variable aleatoria Y tiene distribución Binom(n,θ), entonces se tiene que
El siguiente fragmento de código muestra la función de probabilidad de la distribución Binom(4,0.25)
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import binom
mu = 0.25
n=4
binomial = binom(n, mu)
x = np.arange(4)
prob_p = binomial.pmf(x)
data = pd.DataFrame(zip(x,prob_p))
data.columns=['x','p']
ax = sns.barplot(data=data, x='x', y='p')
ax.set(xlabel='x', ylabel='p(x|$\theta$)', title='Función de probabilidad de la distribución Binomial({},{})'.format(n,mu))
ax.set_xticklabels(x, rotation=0, size=10)
plt.show()
Con el siguiente código calculamos la media varianza y algunos cuantiles de la distribución Binom(4, 0.25).
# media y varianza de la distribución Binomial(4, 0.25)
import numpy as np
from scipy.stats import binom
mu = 0.25
n=4
binomial = binom(n, mu)
media, var = binomial.stats(moments="mv")
print('Distribución Binomial(4, 0.25); media = {}, varianza {}'.format(media, var))
# calcula algunos cuantiles de la distribución
prob = np.array([0.25, 0.5, 0.75])
cuantiles = binomial.ppf(prob)
print('Distribución Binomial(4, 0.25); probabilidades={}; cuantiles={}'.format(prob, cuantiles))
Distribución Binomial(4, 0.25); media = 1.0, varianza 0.75 Distribución Binomial(4, 0.25); probabilidades=[0.25 0.5 0.75]; cuantiles=[0. 1. 2.]
Recordemos que la función de probabilidad (densidad) de una distribución en la familia exponencial se expresa como f(y|θ)=exp[a(y)b(θ)+c(θ)+d(y)].
Adicionalmente la verosimilitud, si no se consideran distribuciones a priori para los parámetros, es la función dada por
f(θ|y)=exp[a(y)b(θ)+c(θ)+d(y)],en donde la y ha sido observada y en consecuencia se conoce y θ es ahora la variable en la función.
Si Y es una variable aleatoria con distribución en la familia exponencial, se puede comprobar que:
En los modelos lineales generalizados clásicos o frecuentista no asumimos una distribución a priori constante. Por ejemplo, es usual tomar como distribución a priori dela parámetros f(θ)=1, que realmente no es una densidad propia, es decir no suma uno necesariamente. Entonces, la posterior no necesariamente resulta siendo una distribución, por lo que la tratamos simplemente como una función de los parámetros.
Un modelo lineal generalizado GLM(por su sigla en inglés), se define de la configura de la siguiente forma. Asumimos que se tienen variables aleatorias independientes Y1,…,Yn, cada una con distribución en la familia exponencial tal que
Componente aleatoria
: f(yi|θ)=exp[yib(θi)+c(θi)+d(yi)].
Todas las distribuciones tiene la misma forma Normal, Binomial, Poisson,..., pero probablemente distintos parámetros. Denotemos y=(y1,…,yn), θ=(θ1,…,θn). Entonces la función de densidad conjunta es dada por
Componente sistemática
: Se supone que las esperanzas de las E[Yi] son dadas por E[Yi]=μi. Antes hemos mencionado que se tiene que E[Y]=−c′(θ)b′(θ). De esta forma las esperanzas μi se relacionan con los parámetros θi, mediante la función invertible h(θ)=−c′(θ)b′(θ). Es decir, tenemos queLos parámetros μi están relacionados con parámetros estructurales β=(β1,…,βp), con p<n en la forma g(μi)=xtiβ,
función de enlace
y en donde x representa un vector de variables observadas.
La idea central es que las xi son realizaciones de un vector aleatorio X=(x1,…,xn) que se supone permite predecir adecuadamente a los valores observados yi.
Es común escribir ^yi=μi, en el sentido que los valores μi son predictores de las yi. Además observe que
^yi=g−1(xtiβ)=g−1(x1β1,…,xpβp).Supongamos que se tienen n variables aleatorias independientes Y=(Y1,…,Yn). Además supondremos que cada una de las variables aleatorias están indexadas por parámetros θi. Es decir Yi∼f(θi). Además vamos a suponer que existe un parámetro estructural de tamaño p, denotado β, y variables aleatorias Xi con realizaciones xij tal que
g(θi)=β1x1i+β2x2i+…+βpxpi.La función g se denomina función de enlace. La ecuación anterior pone en comunicación el parámetro privilegiado θi con una expresión lineal (componente lineal). La función g es necesaria para permitir que la componente lineal del modelo puede ser transportado a la escala del parámetro θi.
En el modelo lineal clásico la función de enlace es la función identidad. Es decir, en ese caso se tiene
θi=β1x1i+β2x2i+…+βpxpi+b.La función de probabilidad conjunta si la variables son independientes es dada por
f(y|β,X)=n∏i=1f(yi|θi)=n∏i=1f(yi|β,X)=exp[n∑i=1yib(θi)+n∑i=1c(θi)+n∑i=1d(yi)]En donde X es la matriz completa de observaciones, que se denomina matriz de diseño, que para efectos prácticos se considera constante. Las columnas de la matriz de diseño representan a las variables explicativas.
La función de log-verosimilitud es dada por
L=n∑i=1Li=logn∏i=1f(yi|β,X)=[n∑i=1yib(θi)+n∑i=1c(θi)+n∑i=1d(yi)]μi=h(θi)g(μi)=β1x1i+β2x2i+…+βpxpi=ηi.Para estimar β se require calcular el gradiente de la función de log-verosimilitud ∇βL. Usando la regla de la cadena para derivadas se tiene que
∂L∂βj=Uj=n∑i=1∂li∂θi∂θi∂μi∂μi∂βj.Puede verificarse directamente que
∂li∂θi=b′(θi)(yi−μi),∂θi∂μi=1∂μi∂θi∂μi∂θi=b′(θi)var(Yi)∂μi∂βj=∂μi∂ηixijEsto es todo lo que se requiere para escribir un algoritmo de optimización basado en el gradiente.
El método de Fisher-Scoring es un algoritmo muy rápido que se implementa usualmente para este problema e estimar los parámetros β, por lo rápido. En problemas con muchos datos y muchas variables puede ser más lento que un método basado en el gradiente e incluso prohibitivo.
El método está basado en la matriz de información
, la cual es la matriz de covarianza de variables score. Concretamente, se tiene que
La matriz de información tiene como elemento ij
Ijk=E(UiUj)=n∑i=1xijxikVar(Yi)(∂μi∂ηj)2.El algoritmo es una variación del método de Newton y tiene como ecuación de actualización
b(m+1)=b(m)+[I(m)]−1U(m)en donde b(m) es la estimación del parámetro β en el paso m.