Le rendu de ce devoir est sous forme d'un notebook avec les bouts de condes et les commentaires dans la partie texte (markdown).
À titre indicatif, la liste des fonctions à utiliser : np.log, scipy.special.gamma, scipy.special.gammaln, scipy.stats.norm.cdf, scipy.optimize.minimize, scipy.stats.t, np.var, np.std, scipy.stats.norm.pdf
np.random.RandomState, ``
Pour cet exercice, nous avons besoin d'appeler diverses fonctions. Il est indispensable consulter l'aide en ligne des différentes fonctions pour pouvoir les utiliser.
import numpy as np
from scipy.special import gammaln
from scipy.optimize import minimize
rs = np.random.RandomState(19991231) ## pour fixer le générateur aléatoire
rs.La densité d'une loi de Student est donnée par
$$f(x;\nu,\mu,\sigma^{2})=\frac{\Gamma\left(\frac{\nu+1}{2}\right)}{\Gamma\left(\frac{\nu}{2}\right)}\,\frac{1}{\sqrt{\pi(\nu-2)}}\,\frac{1}{\sigma}\,\frac{1}{\left(1+\frac{\left(x-\mu\right)^{2}}{\sigma^{2}(\nu-2)}\right)^{\frac{\nu+1}{2}}}$$
où $\mu = 0$, $\sigma = 1$ après standardisation et $\Gamma(\cdot)$ est la fonction gamma d'Euler. Écrire une fonction student_loglik qui prend en arguments un nombre positif (correspondant au degré de liberté) et un vecteur d'observations qui retourne la log-vraisemblance. Tester la fonction sur l'échantillon généré précédemment avec le vrai degré de liberté $\nu = 10$.
Pour cet exercice, nous avons besoin de compléter les appels précédents par l'appel au sous-module 'stats' de la librairie 'scipy'
from scipy import stats
Le modèle probit est un modèle de régression binaire (similaire à la régression logistique) qui vise à expliquer une variables aléatoire de Bernoulli $Y\sim B\big(p(x)\big)$ par l'intermédiaire de sa probabilité de succès. Dans le cas d'une seule variable explicative $x$, la fonction de lien associée à ce modèle est donnée par $$p(x)=\Phi\big(\beta_0 + \beta_1 x\big)$$ où $\Phi$ est la fonction de répartition d'une variable aléatoire normale centrée réduite $X \sim \mathcal N (0, 1)$ et $\big(\beta_0, \beta_1\big)$ sont les coefficients de régression.
est une variables aléatoire suivant une loi de Bernoulli de paramètre $p$.
Simuler $1000$ couples $(x_i, y_i)$ suivant un modèle probit où $X_i \sim \mathcal N(0,1)$, $\beta_0 = 0$ et $\beta_1 = 1$. Pour simuler des réalisations d'une variable aléatoire normale centrée réduite ou suivant une loi uniforme, on peut faire appel à nouveau à l'objet rs.
Écrire une fonction probit_loglik qui prend en arguments le vecteur des deux coefficients, le vecteur des réalisations x et le vecteur des réalisations y qui retourne la log-vraisemblance des observations. Tester la fonction sur l'échantillon généré précédemment avec les vraies valeurs des coefficients de régresion $\beta_0 =0, \beta_1 = 1$. Penser à utiliser les fonctions listés précédemment.
Modifier la fonction précédente pour utiliser la fonction minimize du module scipy.optimize pour calculer un estimateur du couple $(\beta_0, \beta_1)$ par maximum de vraisemblance. Nous n'avons pas besoin de spécifier l'intervalle de recherche des paramètres. Tester plusieurs points de départ y compris les vraies valeurs du couple $(\beta_0, \beta_1)$.
Sachant que les dérivés de la log-vraisemblance d'une seule observation
qui est
$$ y_i \frac{\phi\left(\beta_0+\beta_1 x_i \right)}{\Phi\left(\beta_0+\beta_1 x_i \right)} - \left(1-y_i\right)\frac{\phi\left(\beta_0+\beta_1 x_i \right)}{1-\Phi\left(\beta_0+\beta_1 x_i \right)} $$pour $\beta_0$ et
$$ y_i x_i \frac{\phi\left(\beta_0+\beta_1 x_i \right)}{\Phi\left(\beta_0+\beta_1 x_i \right)} - \left(1-y_i\right)x_i\frac{\phi\left(\beta_0+\beta_1 x_i \right)}{1-\Phi\left(\beta_0+\beta_1 x_i \right)} $$for $\beta_1$ où $\Phi(\cdot)$ est la fonction de répartition d'une variable aléatoire suivant une loi normale centrée réduite et $\phi(\cdot)$ sa densité de probabilité. Proposer une approximation de la matrice d'information de Fisher d'une observation. Rappeler la défintion de l'information de Fisher d'une observation. Proposer une approximation basée sur la loi des grands nombres.
Les modules permettent de combiner plusieurs fonctions dans un seul fichier Python et d'accéder à l'aide de import module puis de la syntaxe module.function. Supposons qu'un fichier nommé core.py (fichier à mettre dans le même répertoire du notebook) contienne le code suivant:
r"""Demonstration module.
This is the module docstring.
"""
def square(x):
r"""Returns the square of a scalar input
"""
return x*x
def cube(x):
r"""Returns the cube of a scalar input
"""
return x*x*x
Les fonctions square et cube sont accessibles par d'autres fichiers dans le même répertoire comme suit
import core
y = -3
print(core.square(y))
print(core.cube(y))
Écrire un module probit avec les fonctions internes probit_loglik (implémentée précédemment) et coef_estimate qui retourne les valeurs des coefficients de régression probit estimés par maximum de vraisemblance (penser à fixer le point initial de l'algorithme de minimisation).
(Bonus) Ajouter une fonction confint au module probit qui affiche un intervalle de confiance à $95\%$ de chaque paramètre de régression.