TP1 Méthode de Bootstrap¶
1) Motivation¶
Considérons qu'on dispose d'un échantillon $(X_1,\dots,X_n)$ d'une certaine loi $\mathbb{P}_{\theta^\ast}$ qui dépend d'un paramètre $\theta^\ast$ inconnu. Au travers d'exemples, nous allons voir comment estimer $\theta^\ast$ à partir des observations et comment évaluer la qualité et la précision d'un estimateur.
On prendra comme exemple la loi normale et la loi Gamma. Ces deux lois dépendent de deux paramètres:
- pour la loi normale $\theta = (\mu,\sigma)$ dont la densité est $$ f(x;\mu,\sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}}e^{-(x-\mu)^2/(2\sigma^2)}$$
- pour la loi Gamma $\theta = (\alpha,\beta)$ dont la densité est $$ f(x;k,\beta) = \frac{1}{\Gamma(\alpha)\beta^k}x^{k-1}e^{-x/\beta }\mathbf{1}_{]0,+\infty[}(x).$$
2) Le cas d'un échantillon Gaussien¶
- Si $X\sim \mathcal{N}(\mu,\sigma^2)$, on a $\mathbb{E}(X)=\mu$ et $var(X) = \sigma^2$, ce qui nous ammène aux estimateurs
$$ \bar X_n = \frac{1}{n}\sum_{j=1}^n X_j \qquad \text{et}\qquad \bar \sigma^2_n = \frac{1}{n-1}\sum_{j=1}^n (X_j - \bar X_n)^2,$$
de respectivement $\mu$ et $\sigma^2$. La consistance de ces estimateurs est garantie par la loi des grands nombres: presque sûrement
$$\lim_{n\to +\infty} \bar X_n = \mu \qquad\text{et}\qquad \lim_{n\to +\infty} \sigma^2_n = \sigma^2.$$
Concernant la qualité de l'estimation, on remarque tout d'abord que $\bar X_n \sim \mathcal{N}(\mu,\sigma^2/n)$, ou autrement dit
$$ N = \frac{\sqrt{n}}{\sigma}(\bar X_n - \mu) \sim \mathcal{N}(0,1).$$
De plus,
$$ C = \frac{n-1}{\sigma^2} \bar\sigma_n^2 \sim \chi^2_{n-1}$$
où $\chi^2_{n-1}$ représente la loi du $\chi^2$ à $n-1$ degré de liberté. Ainsi,
$$ \frac{\sqrt{n}}{\bar \sigma_n}(\bar X_n - \mu) = \frac{N}{\sqrt{C/(n-1)}}\sim t(n-1) $$
où $t(n-1)$ représente la loi de Students à $n-1$ degrés de liberté.
a) Pour $\mu$.¶
Pour ce paramètre, en notant $q_{n-1,l}$ le quantile d'ordre $l$ de la loi $t(n-1)$ (autrement dit $F_{t(n-1)}(q_{n-1,l}) = l$), on remarque que
$$ \mathbb{P}\Big(\mu \in \Big[\bar X_n - q_{n-1,1-\alpha/2}\frac{\bar \sigma_n}{\sqrt{n}},\bar X_n + q_{n-1,1-\alpha/2}\frac{\bar \sigma_n}{\sqrt{n}}\Big]\Big) = \mathbb{P}\Big( \Big|\frac{\sqrt{n}}{\bar \sigma_n}(\bar X_n - \mu)\Big|\leq q_{n-1,1-\alpha/2}\Big) = \mathbb{P}(|T|\leq q_{n-1,1-\alpha/2}) $$
où $T\sim t(n-1)$ et $\alpha\in]0,1[$. Or, on a
$$\mathbb{P}(|T|\leq q_{n-1,1-\alpha/2}) = 2 F_{t(n-1)}(q_{n-1,1-\alpha/2}) - 1 =1-\alpha.$$
En conclusion,
$$ \mathbb{P}\Big(\mu \in \Big[\bar X_n - q_{n-1,1-\alpha/2}\frac{\bar \sigma_n}{\sqrt{n}},\bar X_n + q_{n-1,1-\alpha/2}\frac{\bar \sigma_n}{\sqrt{n}}\Big]\Big) = 1-\alpha $$
On parle d'intervalle de confiance de niveau $1-\alpha$, et $\alpha$ représente la probabilité que $\mu$ ne soit pas dans l'intervalle. Les valeurs typiques de $\alpha$ sont $0.05$ ou $0.01$.
Regardons un exemple numérique, avec $\alpha=0.05$, $\mu=0$, $\sigma^2=2$ et un échantillon de taille $n=50$, et regardons le comportement des estimateurs et de l'intervalle de confiance.
import numpy as np
import scipy.stats as sps
import matplotlib.pyplot as plt
from IPython.core.pylabtools import figsize
n = 50
mu = 0.
sig = np.sqrt(2)
alpha = 0.05
X = sps.norm(mu, sig).rvs(n)
On peut calculer l'estimation de $\mu$
mu_hat = X.mean()
mu_hat
0.2701274214575453
et de l'écart type
sig_hat = X.std()
sig_hat
1.5049667537317222
et calculer un intervalle de confience
q = sps.t(n-1).ppf(1-alpha/2) #la méthode ppf correspond au pourcentile/quantile
IC1_mu = mu_hat - q * sig_hat / np.sqrt(n)
IC2_mu = mu_hat + q * sig_hat / np.sqrt(n)
print("les bornes de l'IC sont %s et %s" % (IC1_mu, IC2_mu))
les bornes de l'IC sont -0.15757939757862666 et 0.6978342404937172
On peut maintenant répéter ce calcul pour voir jouer le rôle de $\alpha$. Ici $\alpha=0.05$. On peut donc s'attendre à ce qu'en moyenne la vraie valeur de $\mu$ ne soit pas dans l'intervalle de confiance 1 fois sur 20. On va faire 40 répétitions et tracer les intervalles de confiance.
def plot_IC(mu, sig, n, alpha, M):
"""représente graphiquement M IC de niveaux 1- alpha
pour mu à partir d'un échantillon de taille n"""
q = sps.t(n-1).ppf(1-alpha/2)
for j in range(M):
X = sps.norm(mu, sig).rvs(n)
mu_hat = X.mean()
sig_hat = X.std()
IC1 = mu_hat - q * sig_hat / np.sqrt(n)
IC2 = mu_hat + q * sig_hat / np.sqrt(n)
plt.vlines(j, IC1, IC2)
plt.hlines(mu, -1, M)
M = 40
plot_IC(mu, sig, n, alpha, M)
figsize(2,5)
b) Pour $\sigma^2$¶
Pour ce paramètre, en notant encore $q_{n-1,l}$ le quantile d'ordre $l$ de cette fois de la loi $\chi^2(n-1)$ , on remarque que
$$ \mathbb{P}\Big(\sigma^2 \in \Big[\frac{n-1}{q_{n-1,1-\alpha/2}}\bar \sigma_n^2, \frac{n-1}{q_{n-1,\alpha/2}}\bar \sigma_n^2\Big]\Big) = \mathbb{P}\Big(\frac{n-1}{\sigma^2} \bar\sigma^2_n \in [q_{n-1,\alpha/2}, q_{n-1,1-\alpha/2}]\Big) = \mathbb{P}\Big(C \in [q_{n-1,\alpha/2}, q_{n-1,1-\alpha/2}]\Big) $$
où $C\sim \chi^2(n-1)$ et $\alpha\in]0,1[$. Or, on a
$$\mathbb{P}\Big(C \in [q_{n-1,\alpha/2}, q_{n-1,1-\alpha/2}]\Big)= F_{\chi^2(n-1)}(q_{n-1,1-\alpha/2}) - F_{\chi^2(n-1)}(q_{n-1,\alpha/2}) =1-\alpha/2 - \alpha/2 = 1-\alpha.$$
On dit alors que l'intervalle
$$ \Big[\frac{n-1}{q_{n-1,1-\alpha/2}}\bar \sigma_n^2, \frac{n-1}{q_{n-1,\alpha/2}}\bar \sigma_n^2\Big] $$
de confiance de niveau $1-\alpha$ pour $\sigma^2$. Déterminons le pour notre échantillon.
q1 = sps.chi2(n-1).ppf(alpha/2)
q2 = sps.chi2(n-1).ppf(1-alpha/2)
IC1_sig2 = (n - 1) * sig_hat**2 / q2
IC2_sig2 = (n - 1) * sig_hat**2 / q1
print("les bornes de l'IC sont %s et %s" % (IC1_sig2, IC2_sig2))
les bornes de l'IC sont 1.5804259057125298 et 3.5170849427966315
Dans le cas d'un échantillon Gaussien, pour évaluer la précision de l'estimation via les intervalles de confiance, on peut faire appel directement à des lois explicites. Ici pour $\mu$ et $\sigma^2$, on arrive à obtenir des quantités indépendantes de l'échantillon et des paramètres qui nous permettent d'utiliser les quantiles de la loi de Students ou du $\chi^2$.
Dans le cas général, il n'est pas forcement possible de faire de telles manipulations. Comment faire alors? Une porte de sortie est l'utilisation du théorème central limite comme on le verra plus bas avec le cas d'un échantillon de loi Gamma. Une autre possibilité est d'utiliser la méthode du Bootstrap. Nous allons voir deux approche de cette méthode: Le bootstrap paramétrique et non-paramétrique.
La technique du bootstrap date des années 70 et a été inventée par Bradley Efron. Cette technique permet d'analyser la sensibilité des estimations en fonction du jeu de données, elles est uniquement basée sur la réplication du jeu de données original (rééchantillonnage).
3) Le Bootstrap (paramétrique)¶
Supposons qu'on dispose d'un échantillon $\mathbf{X} = (X_1,\dots,X_n)$ d'une certaine loi $\mathbb{P}_{\theta^\ast}$ qui dépend d'un paramètre $\theta^\ast$ inconnu, et supposons qu'on ait une estmation $\hat \theta$ de ce paramètre.
L'idée de la méthode consiste à
- créer de nouveaux échantillons $\mathbf{X}^{(1)},\dots,\mathbf{X}^{(B)}$ (bootstrap sample) à partir de la loi $\mathbb{P}_{\hat \theta}$
- puis à partir de ces échantillons procéder à de nouvelles estimations $\hat \theta^{(1)},\dots,\hat \theta^{(B)}$ (bootstrap replicates)
a) Distribution Bootstrap¶
Avec l'échantillons $\hat \theta^{(1)},\dots,\hat \theta^{(B)}$ on peut construire la loi bootstrap de l'estimateur $\hat \theta$ à l'aide de la fonction de répartition empirique
$$ F_B(x) = \frac{1}{B}\sum_{j=1}^B \mathbf{1}_{\big(\hat \theta^{(j)}\leq x\big)}. $$
b) Intervalle de confiance Bootstrap¶
On peut aussi construire des intervalles de confiance de niveau $1-\alpha$. Pour cela, on ordonne de manière croissante l'échantillon $\hat \theta^{(1)},\dots,\hat \theta^{(B)}$ pour obtenir une famille vérifiant $\tilde \theta^{(1)}<\dots<\tilde \theta^{(B)}$. On retire la proportion $\alpha$ des plus petits échantillons et la proportion $1-\alpha/2$ des plus grands. Autrement dit les éléments $$ \tilde \theta^{([\alpha B/2])} \quad\text{et}\quad \tilde \theta^{([(1-\alpha/2) B])} $$ représentent les bornes de l'intervalle. Ici $[\cdot]$ correspond à la partie entière.
c) Estimation Bootstrap du biais et de la variance¶
Ces estimations sont respectivement données par
$$ \widehat{Biais} =\bar{\hat \theta} - \hat \theta\qquad\text{et}\qquad \widehat{Var} = \frac{1}{B-1}\sum_{j=1}^B \big(\hat\theta^{(j)} - \bar{\hat \theta}\big)^2 $$
avec
$$ \bar{\hat \theta} = \frac{1}{B}\sum_{j=1}^B \hat \theta^{(j)}.$$
A noter que dans cette méthode il y a deux sources d'erreur. Une due au fait qu'on utilise $\hat \theta$ et non $\theta^\ast$ (qu'on ne connait pas) pour rééchantillonner. La deuxième vient du fait qu'on utilise un nombre fini $B$ d'échantillon. On a donc là une erreur de type Monte-Carlo.
d) Revenons à notre exemple avec la loi normale.¶
Commençons par génrer la distribution Bootstrap de $\hat \theta$ de taille $B=20000$.
def dist_boot(data, B):
"""génèe un échantillon bootstrap pour mu et sigma de taille B"""
mu_hat = data.mean()
sig_hat = data.std()
n = len(data)
X = sps.norm(mu_hat, sig_hat).rvs((B, n))
mu_boot = X.mean(axis=1)
sig_boot = X.std(axis=1)
return mu_boot, sig_boot
B = 20000
mu_boot, sig_boot = dist_boot(X, B)
mu_tilde = np.sort(mu_boot)
sig2_tilde = np.sort(sig_boot**2)
Représentons graphiquement l'histogramme normalisée et la fonction de répartition.
figsize(9, 9)
plt.subplot(221)
plt.hist(mu_boot, bins=80, density=True, alpha=0.2, label="échantillon");
plt.vlines(mu, 0, 2.5, label="vraie valeur")
plt.title("histogramme échantillon bootstrap pour $\mu$")
plt.legend()
plt.subplot(222)
y = np.linspace(1/B, 1, B)
plt.plot(mu_tilde, y)
plt.title("fonction de répartition bootstrap pour $\mu$")
plt.subplot(223)
plt.hist(sig_boot**2, bins=80, density=True, alpha=0.2, label="échantillon");
plt.vlines(sig**2, 0, 1, label="vraie valeur")
plt.title("histogramme échantillon bootstrap pour $\sigma^2$")
plt.legend()
plt.subplot(224)
y = np.linspace(1/B, 1, B)
plt.plot(sig2_tilde, y)
plt.title("fonction de répartition bootstrap pour $\sigma^2$");
On peut calculer les bornes pour les IC Bootstrap. On va considérer encore $\alpha = 0.05$.
IC1_mu_boot = mu_tilde[int(np.floor(alpha*B/2))]
IC2_mu_boot = mu_tilde[int(np.floor((1-alpha/2)*B))]
print("les bornes de l'IC pour mu sont %s et %s" % (IC1_mu_boot, IC2_mu_boot))
print("alors que celles calculées explicitement sont %s et %s" % (IC1_mu, IC2_mu))
les bornes de l'IC pour mu sont -0.15195829911475456 et 0.6909207740983553 alors que celles calculées explicitement sont -0.15757939757862666 et 0.6978342404937172
IC1_sig2_boot = sig2_tilde[int(np.floor(alpha*B/2))]
IC2_sig2_boot = sig2_tilde[int(np.floor((1-alpha/2)*B))]
print("les bornes de l'IC pour sigma^2 sont %s et %s" % (IC1_sig2_boot, IC2_sig2_boot))
print("alors que celles calculées explicitement sont %s et %s" % (IC1_sig2, IC2_sig2))
les bornes de l'IC pour sigma^2 sont 1.4275222325481107 et 3.189112308195373 alors que celles calculées explicitement sont 1.5804259057125298 et 3.5170849427966315
On voit que les résultats sont assez similaires sur cette exemple. On peut aussi estimer le biais et la variance Bootstrap
mu_boot_hat = mu_boot.mean()
biais_mu_boot = mu_boot_hat - mu_hat
var_mu_boot = np.mean( (mu_boot - mu_boot_hat)**2 )
print("le biais Bootstrap pour mu est %s" % biais_mu_boot)
print("la variance Bootstrap pour mu est %s" % var_mu_boot)
print("l'écart type pour mu est %s" % np.sqrt(var_mu_boot))
le biais Bootstrap pour mu est 0.00031702053617094217 la variance Bootstrap pour mu est 0.04543845472729605 l'écart type pour mu est 0.21316297691507324
sig2_boot_hat = np.mean(sig_boot**2)
biais_sig2_boot = sig2_boot_hat - X.var()
var_var_boot = np.mean( (sig_boot**2 - sig2_boot_hat)**2 )
print("le biais Bootstrap pour sigma^2 est %s" % biais_sig2_boot)
print("la variance Bootstrap pour sigma^2 est %s" % var_var_boot)
print("l'écart type pour sigma^2 est %s" % np.sqrt(var_var_boot))
le biais Bootstrap pour sigma^2 est -0.04075432194266604 la variance Bootstrap pour sigma^2 est 0.20346919464805688 l'écart type pour sigma^2 est 0.45107559748678144
4) Le cas d'un échantillon de loi Gamma¶
Prennons maintenant un exemple pour lequelle des calculs explicites ne sont pas directement accessibles pour évaluer la précision des estimateurs. On va considérer un échantillon de loi Gamma $\theta^\ast = (\alpha^\ast,\beta^\ast)$ dont la densité est $$ f(x;k,\beta) = \frac{1}{\Gamma(k)\beta^k}x^{k-1}e^{- x/\beta}\mathbf{1}_{]0,+\infty[}(x)$$
n = 2000
k = 1.5
beta = 2
X = sps.gamma(k, scale=beta).rvs(n)
Pour estimer $k$ et $\beta$, on va utiliser les relations
$$ \mathbb{E}(U) =k\, \beta \qquad\text{et}\qquad Var(U) = k \,\beta^2$$
si $U\sim Gamma(k,\beta)$.
Question 1)¶
A l'aide des formules de l'epérance et de la variance déterminer des estimateurs consistant de $k^\ast$ et $\beta^\ast$.
On pourra comparer son résultat avec celui renvoyé par la commande fit
du module scipy.stats
qui utilise l'estimateur du maximum de vraisemblance.
sps.gamma.fit(X, floc=0)
(1.5158713238266452, 0, 1.997800186454287)
Question 2)¶
Déterminer les intervalles de confiance Bootstrap pour $k^\ast$ et $\beta^\ast$ obtenus avec les estimateurs de la question 1) et ceux obtenus avec l'estimateur du maximum de vraisemblance. Les comparer.
Question 3)¶
Comparer les distributions Bootstrap obtenues avec les estimateurs de la question 1 et celles obtenues avec l'estimateur du maximum de vraisemblance. On pourra prendre $B=10000$. Quel estimateur vous paraît le meilleur?
Question 4)¶
Evaluer le biais Bootstrap, la variance Bootstrap, et l'erreur moyenne quadratique Bootstrap des estimateurs de la questions 1 et les comparer avec ceux du maximum de vraisemblance. Que peut-on en conclure?
k_hat = X.mean()**2 / X.var()
k_hat
1.5655993534860209
beta_hat = X.var() / X.mean()
beta_hat
1.934344190062684
Les résultats sont assez similaire à ceux du maximum de vraisemblance sans être exactement les mêmes.
Question 2)¶
Commençons par générer les échantillons Bootstrap.
def dist_boot_gamma(data, B):
k_hat = data.mean()**2 / data.var()
beta_hat = data.var() / data.mean()
n = len(data)
X = sps.gamma(k_hat, scale=beta_hat).rvs((B, n))
k_boot = X.mean(axis=1)**2 / X.var(axis=1)
beta_boot = X.var(axis=1) / X.mean(axis=1)
return k_boot, beta_boot
B = 20000
k_boot, beta_boot = dist_boot_gamma(X, B)
k_tilde, beta_tilde = np.sort(k_boot), np.sort(beta_boot)
On peut aussi obtenir ceux générés avec l'estimateur du maximum de vraisemblance
def dist_boot_gamma_MLE(data, B):
k_hat = data.mean()**2 / data.var()
beta_hat = data.var() / data.mean()
n = len(data)
k_boot, beta_boot = np.zeros(B), np.zeros(B)
X = sps.gamma(k_hat, scale=beta_hat).rvs((B, n))
for j in range(B):
k_boot[j], _, beta_boot[j] = sps.gamma.fit(X[j,:], floc=0)
return k_boot, beta_boot
k_boot_MLE, beta_boot_MLE = dist_boot_gamma_MLE(X, B)
k_tilde_MLE, beta_tilde_MLE = np.sort(k_boot_MLE), np.sort(beta_boot_MLE)
alpha = 0.05
IC1_k = k_tilde[int(np.floor(alpha * B/2))]
IC2_k = k_tilde[int(np.floor((1-alpha/2) * B))]
IC1_beta = beta_tilde[int(np.floor(alpha * B/2))]
IC2_beta = beta_tilde[int(np.floor((1-alpha/2) * B))]
print("les bornes de l'IC pour k sont %s et %s" % (IC1_k, IC2_k))
print("les bornes de l'IC pour beta sont %s et %s" % (IC1_beta, IC2_beta))
les bornes de l'IC pour k sont 1.4464576277946313 et 1.695529149386269 les bornes de l'IC pour beta sont 1.7700821133642024 et 2.110995617624618
IC1_k_MLE = k_tilde_MLE[int(np.floor(alpha * B/2))]
IC2_k_MLE = k_tilde_MLE[int(np.floor((1-alpha/2) * B))]
IC1_beta_MLE = beta_tilde_MLE[int(np.floor(alpha * B/2))]
IC2_beta_MLE = beta_tilde_MLE[int(np.floor((1-alpha/2) * B))]
print("les bornes de l'IC pour k sont %s et %s" % (IC1_k_MLE, IC2_k_MLE))
print("les bornes de l'IC pour beta sont %s et %s" % (IC1_beta_MLE, IC2_beta_MLE))
les bornes de l'IC pour k sont 1.4805872892189715 et 1.6592967578911497 les bornes de l'IC pour beta sont 1.806081141092021 et 2.0621232034262773
Question 3)¶
figsize(9, 9)
plt.subplot(221)
plt.hist(k_boot, bins=80, density=True, alpha=0.2, label="échantillon");
plt.hist(k_boot_MLE, bins=80, density=True, alpha=0.2, label="échantillon MLE");
plt.vlines(k, 0, 4, label="vraie valeur")
plt.title("histogramme échantillon bootstrap pour $k*$")
plt.legend()
plt.subplot(222)
y = np.linspace(1/B, 1, B)
plt.plot(k_tilde, y)
plt.plot(k_tilde_MLE, y)
plt.title("fonction de répartition bootstrap pour $k*$")
plt.subplot(223)
plt.hist(beta_boot, bins=80, density=True, alpha=0.2, label="échantillon");
plt.hist(beta_boot_MLE, bins=80, density=True, alpha=0.2, label="échantillon MLE");
plt.vlines(beta, 0, 2, label="vraie valeur")
plt.title("histogramme échantillon bootstrap pour beta*")
plt.legend()
plt.subplot(224)
y = np.linspace(1/B, 1, B)
plt.plot(beta_tilde, y)
plt.plot(beta_tilde_MLE, y)
plt.title("fonction de répartition bootstrap pour beta*");
L'estimateur du maximum de vraisemblance paraît ici meilleur, car les distributions Bootstrap associées semblent légérement plus centrées sur les vraies valeurs, il semble y avoir moins de variance (moins de dispersion).
Question 4)¶
Commençons par l'estimation des biais.
k_hat_MLE, _, beta_hat_MLE = sps.gamma.fit(X, floc=0)
biais_boot = k_boot.mean() - k_hat
biais_boot
0.004168818711545175
biais_boot_MLE = k_boot_MLE.mean() - k_hat_MLE
biais_boot_MLE
0.05177565556255437
Pour les variances
var_boot = k_boot.var()
var_boot
0.004018804633881902
var_boot_MLE = k_boot_MLE.var()
var_boot_MLE
0.0020597578971435497
On utilise le fait que l'erreur quadratique moyenne (RMSE-Root Mean Square Error) Bootstrap est donnée par
$$ RMSE = \widehat{biais}^2 + \widehat{Var} $$
RMSE = biais_boot**2 + var_boot
RMSE
0.004036183683331631
RMSE_MLE = biais_boot_MLE**2 + var_boot_MLE
RMSE_MLE
0.004740476406075817
La méthode Bootstrap paramétrique avec la méthode d'estimation par maximum de vraisembalance semble être meilleurs, du point de vue de l'erreur quadratique moyenne, que celle utilisant la méthode des moments pour l'estimation de $k$.
Pour l'estimation de $\beta$, on procède de la même manière.
biais_boot = beta_boot.mean() - beta_hat
biais_boot
-0.002114251043044524
biais_boot_MLE = beta_boot_MLE.mean() - beta_hat_MLE
biais_boot_MLE
-0.06469745253641324
var_boot = beta_boot.var()
var_boot
0.007381955898589861
var_boot_MLE = beta_boot_MLE.var()
var_boot_MLE
0.004284551352523174
RMSE = biais_boot**2 + var_boot
RMSE
0.007386425956062876
var_boot_MLE = k_boot_MLE.var()
var_boot_MLE
0.0020597578971435497
La méthode Bootstrap paramétrique avec la méthode d'estimation par maximum de vraisembalance semble être aussi meilleurs, du point de vue de l'erreur quadratique moyenne, que celle utilisant la méthode des moments pour l'estimation de $\beta$. Ceci confirme donc l'impression qu'on avait sur les graphiques de la question 3.