L’objectif de cette première partie du projet est de construire un modèle de régression linéaire multiple capable d’expliquer et de prédire le prix final d’une maison à partir de six variables explicatives : la surface, le nombre de pièces, la distance au centre-ville, le temps de trajet, le numéro dans la rue et l’âge du vendeur. L’objectif est de comprendre quels facteurs influencent réellement le prix et de construire un modèle fiable.
Le fichier immobilier.csv contient 100 observations et 7
variables.
Les variables présentes sont : surface, nb_pieces, distance_centre,
temps_trajet, numero_rue, age_vendeur, prix.
Le contrôle des valeurs manquantes montre qu’il n’y a aucune valeur
manquante, ce qui permet d’estimer directement le modèle sans étape
d’imputation.
stats_desc <- data.frame(
Moyenne = sapply(immobilier, mean),
Ecart_type = sapply(immobilier, sd),
Minimum = sapply(immobilier, min),
Mediane = sapply(immobilier, median),
Maximum = sapply(immobilier, max)
)
knitr::kable(round(stats_desc, 2), caption = "Statistiques descriptives")| Moyenne | Ecart_type | Minimum | Mediane | Maximum | |
|---|---|---|---|---|---|
| surface | 122.71 | 27.38 | 50.72 | 121.85 | 185.62 |
| nb_pieces | 4.81 | 1.24 | 2.00 | 5.00 | 8.00 |
| distance_centre | 15.60 | 4.75 | 6.22 | 15.18 | 26.47 |
| temps_trajet | 36.10 | 9.86 | 14.60 | 34.89 | 60.38 |
| numero_rue | 71.48 | 41.68 | 2.00 | 72.00 | 143.00 |
| age_vendeur | 53.48 | 10.42 | 26.00 | 53.50 | 84.00 |
| prix | 355.13 | 89.29 | 114.36 | 350.56 | 595.64 |
Le prix moyen observé est de 355.13 milliers d’euros. La surface
moyenne est de 122.71 m², pour 4.81 pièces en moyenne.
La dispersion des prix (89.29 milliers d’euros) indique que
l’échantillon est suffisamment hétérogène pour justifier une
modélisation explicative.
La régression linéaire multiple repose sur plusieurs hypothèses essentielles :
library(corrplot)
# Matrice de corrélation
mat_cor <- cor(immobilier)
# Heatmap
corrplot(mat_cor,
method = "color",
type = "upper",
addCoef.col = "black",
tl.col = "black",
tl.srt = 45,
number.cex = 0.7)La variable la plus corrélée au prix est la surface
(0.933), suivie du nombre de pièces (0.828).
À l’inverse, la corrélation entre le prix et la distance au
centre est négative (-0.343), ce qui est cohérent avec
l’intuition économique.
Enfin, distance_centre et temps_trajet sont
très fortement corrélés (0.949), ce qui laisse anticiper un problème de
multicolinéarité.
par(mfrow = c(1, 3))
plot(immobilier$surface, immobilier$prix,
xlab = "Surface (m²)", ylab = "Prix (k€)",
main = "Prix et surface", pch = 19)
abline(lm(prix ~ surface, data = immobilier), lwd = 2)
plot(immobilier$distance_centre, immobilier$prix,
xlab = "Distance au centre (km)", ylab = "Prix (k€)",
main = "Prix et distance", pch = 19)
abline(lm(prix ~ distance_centre, data = immobilier), lwd = 2)
plot(immobilier$distance_centre, immobilier$temps_trajet,
xlab = "Distance au centre (km)", ylab = "Temps de trajet (min)",
main = "Distance et temps", pch = 19)
abline(lm(temps_trajet ~ distance_centre, data = immobilier), lwd = 2)Les graphiques confirment trois résultats simples.
D’abord, la relation entre le prix et la surface est globalement
croissante et quasi linéaire. Ensuite, le prix tend à
diminuer quand la distance au centre augmente. Enfin, le temps de trajet
croît fortement avec la distance au centre, ce qui confirme l’existence
d’une information redondante entre ces deux variables.
Dans un premier temps, nous estimons un modèle de régression linéaire utilisant l’ensemble des variables explicatives disponibles.
Une validation croisée à 10 groupes est utilisée afin d’évaluer la performance du modèle sur des données non utilisées lors de l’estimation. Ce choix permet d’obtenir une estimation fiable de l’erreur tout en conservant un bon équilibre entre biais et variance. Dans un premier temps, nous estimons un modèle de régression linéaire multiple reliant le prix aux variables explicatives.
Le modèle s’écrit sous la forme :
\[ prix_i = \beta_0 + \beta_1 surface_i + \beta_2 nb\_pieces_i + \beta_3 distance\_centre_i + \beta_4 temps\_trajet_i + \beta_5 numero\_rue_i + \beta_6 age\_vendeur_i + \varepsilon_i \]
library(knitr)
# Résumé du modèle
sum_mod <- summary(premier_model)
# Création du tableau des coefficients
df_coefs <- as.data.frame(sum_mod$coefficients)
df_coefs$Variable <- rownames(df_coefs)
rownames(df_coefs) <- NULL
# Renommer colonnes
colnames(df_coefs) <- c("Coefficient", "Erreur_std", "t_stat", "p_value", "Variable")
# Réorganiser
df_coefs <- df_coefs[, c("Variable", "Coefficient", "p_value")]
# Affichage propre
kable(df_coefs, digits = 3, caption = "Coefficients estimés du modèle")| Variable | Coefficient | p_value |
|---|---|---|
| (Intercept) | 63.210 | 0.005 |
| surface | 3.072 | 0.000 |
| nb_pieces | -3.059 | 0.512 |
| distance_centre | -5.351 | 0.003 |
| temps_trajet | 0.557 | 0.512 |
| numero_rue | 0.002 | 0.979 |
| age_vendeur | -0.133 | 0.596 |
Une augmentation de 1 m² de la surface entraîne en moyenne une augmentation du prix de 3.072 milliers d’euros, ce qui confirme que la taille du bien est le facteur le plus déterminant.
À l’inverse, une augmentation de 1 km de la distance au centre-ville réduit le prix d’environ 5.351 milliers d’euros, ce qui reflète l’importance de la localisation.
Le coefficient associé au nombre de pièces est négatif, ce qui peut sembler contre-intuitif, mais s’explique par sa forte corrélation avec la surface : cette dernière capte déjà l’essentiel de l’information liée à la taille du logement.
Le temps de trajet a un effet positif mais non significatif, probablement en raison de sa forte corrélation avec la distance au centre.
Enfin, les variables numéro de rue et âge du vendeur ont un impact très faible et non significatif sur le prix, ce qui suggère qu’elles n’apportent pas d’information pertinente dans le modèle.
immobilier$groupe <- sample(rep(1:10, length.out = nrow(immobilier)))
mse <- numeric(10)
for(i in 1:10){
train <- immobilier[immobilier$groupe != i, ]
test <- immobilier[immobilier$groupe == i, ]
mod <- lm(prix ~ . - groupe, data = train)
pred <- predict(mod, newdata = test)
mse[i] <- mean((test$prix - pred)^2)
}
# Tableau détaillé
df_cv <- data.frame(
Groupe = paste("Groupe", 1:10),
MSE = round(mse, 2)
)
# Moyennes
mse_moy <- mean(mse)
rmse_moy <- sqrt(mse_moy)
# R² du modèle global
r2 <- summary(premier_model)$r.squared
r2_adj <- summary(premier_model)$adj.r.squared
# Ligne finale
df_final <- rbind(
df_cv,
data.frame(Groupe = "Moyenne",
MSE = round(mse_moy, 2))
)
# Affichage principal
knitr::kable(df_final, caption = "Validation croisée (MSE par groupe)")| Groupe | MSE |
|---|---|
| Groupe 1 | 626.44 |
| Groupe 2 | 1309.24 |
| Groupe 3 | 534.87 |
| Groupe 4 | 1315.99 |
| Groupe 5 | 775.41 |
| Groupe 6 | 772.85 |
| Groupe 7 | 347.33 |
| Groupe 8 | 830.70 |
| Groupe 9 | 403.12 |
| Groupe 10 | 606.85 |
| Moyenne | 752.28 |
# Tableau résumé
resume_modele <- data.frame(
R2 = round(r2, 4),
R2_ajuste = round(r2_adj, 4),
RMSE_CV = round(rmse_moy, 2)
)
knitr::kable(resume_modele, caption = "Indicateurs globaux du modèle")| R2 | R2_ajuste | RMSE_CV |
|---|---|---|
| 0.9223 | 0.9173 | 27.43 |
La validation croisée montre que les valeurs de MSE restent relativement proches d’un groupe à l’autre, ce qui indique une bonne stabilité du modèle. La moyenne du MSE est d’environ 761, ce qui correspond à une erreur de prédiction d’environ 27 600 € (RMSE). Par ailleurs, les coefficients \(R^2\) et \(R^2\) ajusté sont élevés, confirmant que le modèle explique bien la variabilité du prix. Globalement, le modèle présente donc de bonnes performances prédictives.
library(ggplot2)
library(patchwork)
# Création des résidus
df_res <- data.frame(
Ajustes = fitted(premier_model),
Residus = rstudent(premier_model)
)
# 1. Q-Q plot (normalité)
p1 <- ggplot(df_res, aes(sample = Residus)) +
stat_qq() +
stat_qq_line(color = "red") +
labs(title = "Q-Q plot des résidus") +
theme_minimal()
# 2. Résidus vs valeurs ajustées (homoscédasticité)
p2 <- ggplot(df_res, aes(x = Ajustes, y = Residus)) +
geom_point(alpha = 0.5) +
geom_hline(yintercept = 0, color = "red") +
labs(title = "Résidus vs valeurs ajustées",
x = "Valeurs ajustées",
y = "Résidus") +
theme_minimal()
# Affichage combiné
p1 + p2Les résidus sont globalement bien distribués autour de zéro et suivent approximativement une loi normale. Aucune structure particulière n’apparaît, ce qui suggère que les hypothèses du modèle sont globalement respectées.
library(ggplot2)
# Calcul des distances de Cook
cook <- cooks.distance(premier_model)
# Création du data frame
df_cook <- data.frame(
Observation = 1:length(cook),
Cook = cook
)
# Graphique
ggplot(df_cook, aes(x = Observation, y = Cook)) +
geom_col(fill = "steelblue") +
geom_hline(yintercept = 4/length(cook), color = "red", linetype = "dashed") +
labs(title = "Distance de Cook",
x = "Observation",
y = "Influence") +
theme_minimal()Le graphique des distances de Cook montre que la majorité des observations ont une influence faible sur le modèle. Toutefois, quelques points dépassent le seuil, dont un particulièrement élevé, indiquant une forte influence sur l’estimation des coefficients. Malgré cela, ces observations restent peu nombreuses, ce qui suggère que le modèle demeure globalement stable, même si ces points méritent une attention particulière.
# Fonction VIF corrigée
calcul_vif <- function(modele){
X <- model.matrix(modele)
# enlever intercept
X <- X[, colnames(X) != "(Intercept)", drop = FALSE]
vif_vals <- numeric(ncol(X))
names(vif_vals) <- colnames(X)
for(i in seq_along(vif_vals)){
y <- X[, i]
x <- X[, -i, drop = FALSE]
# éviter bug si une seule variable
if(ncol(x) == 0){
vif_vals[i] <- NA
} else {
reg <- lm(y ~ ., data = as.data.frame(x))
vif_vals[i] <- 1 / (1 - summary(reg)$r.squared)
}
}
return(vif_vals)
}
# Calcul
vif_vals <- calcul_vif(premier_model)
# Tableau propre
table_vif <- data.frame(
Variable = names(vif_vals),
VIF = round(as.numeric(vif_vals), 2)
)
# Supprimer éventuels doublons (sécurité)
table_vif <- table_vif[!duplicated(table_vif$Variable), ]
knitr::kable(table_vif, caption = "Facteurs d'inflation de variance (VIF)")| Variable | VIF |
|---|---|
| surface | 4.99 |
| nb_pieces | 4.97 |
| distance_centre | 10.53 |
| temps_trajet | 10.46 |
| numero_rue | 1.03 |
| age_vendeur | 1.02 |
Les valeurs du VIF mettent en évidence la présence de colinéarité entre certaines variables explicatives. En particulier, distance_centre (10.53) et temps_trajet (10.46) présentent des VIF élevés, supérieurs à 10, ce qui indique une forte redondance d’information entre ces deux variables.
Les variables surface et nb_pieces ont des VIF proches de 5, suggérant une colinéarité modérée. En revanche, numero_rue et age_vendeur ont des VIF proches de 1, ce qui signifie qu’elles ne sont pas corrélées avec les autres variables.
Ainsi, ces résultats confirment que certaines variables apportent une information similaire, ce qui peut expliquer l’instabilité de certains coefficients dans le modèle.
library(lmtest)
library(knitr)
# Tableau des tests
tests <- data.frame(
Test = c("Shapiro-Wilk", "Breusch-Pagan", "Durbin-Watson", "RESET"),
p_value = round(c(
shapiro.test(residuals(premier_model))$p.value,
bptest(premier_model)$p.value,
dwtest(premier_model)$p.value,
resettest(premier_model)$p.value
), 4),
stringsAsFactors = FALSE
)
# Affichage
kable(tests, caption = "Tests de diagnostic du modele")| Test | p_value |
|---|---|
| Shapiro-Wilk | 0.2662 |
| Breusch-Pagan | 0.0248 |
| Durbin-Watson | 0.2324 |
| RESET | 0.8992 |
Les tests de diagnostic montrent que la majorité des hypothèses du modèle sont respectées. Le test de Shapiro-Wilk (p-value = 0.2662) indique que les résidus suivent une distribution normale. Le test de Durbin-Watson (p-value = 0.2324) confirme l’indépendance des résidus, et le test RESET (p-value = 0.8992) ne met en évidence aucun problème de spécification du modèle.
En revanche, le test de Breusch-Pagan (p-value = 0.0248) révèle la présence d’une hétéroscédasticité, ce qui signifie que la variance des erreurs n’est pas parfaitement constante.
Dans cette partie, nous avons construit un modèle de régression linéaire multiple permettant de prédire le prix d’un bien immobilier en fonction de six variables explicatives.
Le modèle estimé est le suivant :
\[ \hat{prix} = 63.210 + 3.072 \cdot surface - 3.059 \cdot nb\_pieces - 5.351 \cdot distance\_centre + 0.557 \cdot temps\_trajet + 0.002 \cdot numero\_rue - 0.133 \cdot age\_vendeur \]
Ce modèle explique environ 92.23% de la variabilité du prix (\(R^2 = 0.9223\)), ce qui indique une très bonne qualité d’ajustement. La validation croisée montre une erreur de prédiction moyenne d’environ 27 400 €, ce qui reste raisonnable compte tenu du niveau des prix.
Les résultats mettent en évidence que la surface et la distance au centre sont les variables les plus influentes, tandis que les autres variables ont un impact plus limité une fois les effets principaux pris en compte.
L’objectif de cette deuxième partie est de vérifier empiriquement le théorème du biais d’optimisme de la log-vraisemblance dans le cas des modèles linéaires.
Lorsqu’un modèle est estimé puis évalué sur les mêmes données, sa performance est généralement surestimée. En effet, le modèle a déjà utilisé ces observations pour estimer ses paramètres. La log-vraisemblance calculée sur l’échantillon d’apprentissage est donc trop optimiste par rapport à la performance que l’on obtiendrait sur de nouvelles données.
Le théorème étudié en cours indique que ce biais d’optimisme converge vers le nombre de paramètres du modèle, noté \(k\), lorsque la taille de l’échantillon \(n\) augmente.
On cherche donc à observer empiriquement que :
\[ \mathbb{E}\left[\ell_{\text{train}}(\hat{\theta}_{MLE})\right] + n\mathbb{E}\left[H(p_{\text{vrai}},p_{\hat{\theta}_{MLE}})\right] \xrightarrow[n\to\infty]{} k \]
Dans notre étude, nous utilisons des simulations de Monte Carlo. Nous générons plusieurs jeux de données selon un modèle linéaire connu, nous estimons le modèle, puis nous comparons la log-vraisemblance obtenue sur l’échantillon d’apprentissage à celle obtenue sur un grand échantillon test indépendant.
Cette démarche est répétée pour plusieurs tailles d’échantillon \(n\) et plusieurs nombres de variables explicatives \(p\), afin d’observer si le biais moyen estimé se rapproche bien du nombre de paramètres \(k\).
Nous considérons un modèle linéaire gaussien de la forme :
\[ Y = X\beta + \varepsilon \]
avec :
\[ \varepsilon \sim \mathcal{N}(0,\sigma^2) \]
Les variables explicatives sont simulées selon une loi normale centrée réduite. Le bruit aléatoire suit également une loi normale. Ce cadre correspond aux hypothèses classiques du modèle linéaire gaussien.
Dans les simulations, le vrai modèle est connu, ce qui permet de comparer la performance du modèle estimé sur les données d’apprentissage avec sa performance attendue sur de nouvelles observations.
Si le modèle contient \(p\) variables explicatives, le nombre total de paramètres estimés est :
\[ k = p + 2 \]
Le terme \(p\) correspond aux coefficients des variables explicatives, le premier \(+1\) correspond à l’intercept, et le second \(+1\) correspond à la variance de l’erreur \(\sigma^2\).
Pour chaque couple \((n,p)\), nous appliquons la procédure suivante.
D’abord, nous générons un échantillon d’apprentissage de taille \(n\). Ensuite, nous estimons un modèle linéaire sur cet échantillon et nous calculons la log-vraisemblance d’apprentissage \(\ell_{\text{train}}\).
Puis, nous générons un grand échantillon test indépendant. Ce grand échantillon test permet d’approcher la performance attendue du modèle sur de nouvelles données. On calcule alors la log-vraisemblance moyenne par observation sur cet échantillon test, puis on la multiplie par \(n\) afin d’obtenir une quantité comparable à la log-vraisemblance d’apprentissage.
Le biais d’optimisme est donc estimé par :
\[ \ell_{\text{train}} - n \times \overline{\ell}_{\text{test}} \]
où \(\overline{\ell}_{\text{test}}\) désigne la log-vraisemblance moyenne par observation sur l’échantillon test.
Cette procédure est répétée \(B = 1000\) fois pour chaque couple \((n,p)\), afin d’obtenir un biais moyen stable.
simulation_biais <- function(n, p, B = 1000, sigma = 1, n_test = 10000) {
biais <- numeric(B)
# Nombre de paramètres : p coefficients + intercept + variance sigma^2
k <- p + 2
for (b in 1:B) {
# Coefficients vrais du modèle
beta_true <- rep(1, p + 1)
# ---------------------------------------------------
# 1. Génération de l'échantillon d'apprentissage
# ---------------------------------------------------
X_train_vars <- matrix(rnorm(n * p), nrow = n, ncol = p)
X_train <- cbind(1, X_train_vars)
eps_train <- rnorm(n, mean = 0, sd = sigma)
y_train <- as.vector(X_train %*% beta_true + eps_train)
# Estimation du modèle linéaire
modele <- lm(y_train ~ X_train_vars)
beta_hat <- coef(modele)
# Estimateur MLE de sigma^2 : RSS / n
residus <- residuals(modele)
sigma2_hat <- sum(residus^2) / n
# Log-vraisemblance sur l'échantillon d'apprentissage
ll_train <- loglik_gaussian(
y = y_train,
X = X_train,
beta_hat = beta_hat,
sigma2_hat = sigma2_hat
)
# ---------------------------------------------------
# 2. Génération d'un grand échantillon test indépendant
# ---------------------------------------------------
X_test_vars <- matrix(rnorm(n_test * p), nrow = n_test, ncol = p)
X_test <- cbind(1, X_test_vars)
eps_test <- rnorm(n_test, mean = 0, sd = sigma)
y_test <- as.vector(X_test %*% beta_true + eps_test)
# Log-vraisemblance moyenne par observation sur le test
ll_test_moyenne <- loglik_gaussian(
y = y_test,
X = X_test,
beta_hat = beta_hat,
sigma2_hat = sigma2_hat
) / n_test
# Quantité comparable à la log-vraisemblance train
ll_test_equivalent <- n * ll_test_moyenne
# Biais d'optimisme estimé
biais[b] <- ll_train - ll_test_equivalent
}
data.frame(
n = n,
p = p,
k = k,
biais_moyen = mean(biais),
ecart_type = sd(biais),
difference_biais_k = mean(biais) - k,
rapport_biais_k = mean(biais) / k
)
}Afin d’étudier la convergence du biais d’optimisme, nous faisons varier deux éléments : la taille de l’échantillon \(n\) et le nombre de variables explicatives \(p\).
Les tailles d’échantillon retenues sont :
\[ n \in \{50, 100, 500, 1000\} \]
Ces valeurs permettent de comparer le comportement du biais pour des petits et grands échantillons.
Les nombres de variables explicatives retenus sont :
\[ p \in \{1, 3, 5, 10\} \]
Comme le nombre total de paramètres vaut \(k = p + 2\), ces choix permettent d’étudier des modèles de complexité croissante.
Ainsi, nous pouvons observer si le biais moyen estimé se rapproche de \(k\), et si cette approximation devient meilleure lorsque \(n\) augmente.
Le tableau suivant présente, pour chaque combinaison de \(n\) et \(p\), le biais moyen estimé par simulation. Ce biais est comparé au nombre de paramètres \(k\).
La colonne difference_biais_k mesure l’écart entre le
biais moyen estimé et \(k\). Plus cette
valeur est proche de zéro, plus le résultat empirique est proche du
théorème.
La colonne rapport_biais_k permet également d’évaluer la
proximité entre le biais moyen et \(k\). Un rapport proche de 1 indique que le
biais estimé est proche du nombre de paramètres.
library(knitr)
kable(
resultats,
digits = 3,
caption = "Résultats des simulations du biais d'optimisme"
)| n | p | k | biais_moyen | ecart_type | difference_biais_k | rapport_biais_k |
|---|---|---|---|---|---|---|
| 50 | 1 | 3 | 3.302 | 6.255 | 0.302 | 1.101 |
| 50 | 3 | 5 | 5.913 | 7.356 | 0.913 | 1.183 |
| 50 | 5 | 7 | 9.225 | 8.119 | 2.225 | 1.318 |
| 50 | 10 | 12 | 18.599 | 11.470 | 6.599 | 1.550 |
| 100 | 1 | 3 | 3.297 | 8.092 | 0.297 | 1.099 |
| 100 | 3 | 5 | 4.916 | 8.351 | -0.084 | 0.983 |
| 100 | 5 | 7 | 7.766 | 8.915 | 0.766 | 1.109 |
| 100 | 10 | 12 | 14.820 | 10.351 | 2.820 | 1.235 |
| 500 | 1 | 3 | 2.401 | 16.608 | -0.599 | 0.800 |
| 500 | 3 | 5 | 4.613 | 16.393 | -0.387 | 0.923 |
| 500 | 5 | 7 | 7.931 | 16.749 | 0.931 | 1.133 |
| 500 | 10 | 12 | 12.477 | 18.027 | 0.477 | 1.040 |
| 1000 | 1 | 3 | 2.917 | 23.255 | -0.083 | 0.972 |
| 1000 | 3 | 5 | 5.835 | 23.771 | 0.835 | 1.167 |
| 1000 | 5 | 7 | 8.278 | 24.104 | 1.278 | 1.183 |
| 1000 | 10 | 12 | 12.920 | 24.375 | 0.920 | 1.077 |
Le graphique ci-dessous compare le biais moyen estimé au nombre de paramètres \(k\). La droite en pointillés représente la situation théorique idéale où le biais serait exactement égal à \(k\).
Si le théorème est vérifié empiriquement, les points doivent se situer autour de cette droite, en particulier pour les grandes tailles d’échantillon.
library(ggplot2)
ggplot(resultats, aes(x = k, y = biais_moyen, color = factor(n))) +
geom_point(size = 3) +
geom_line(aes(group = factor(n))) +
geom_abline(intercept = 0, slope = 1, linetype = "dashed") +
labs(
title = "Convergence du biais d'optimisme vers k",
x = "Nombre de paramètres k",
y = "Biais moyen estimé",
color = "Taille n"
) +
theme_minimal()Les résultats obtenus montrent que le biais moyen estimé est globalement proche du nombre de paramètres \(k\). Sur le graphique, les points issus des simulations se situent autour de la droite en pointillés, qui correspond à la situation théorique où le biais est exactement égal à \(k\).
On observe que les résultats sont plus stables lorsque la taille de l’échantillon augmente. Pour les grandes valeurs de \(n\), notamment \(n = 500\) et \(n = 1000\), les points sont généralement plus proches de la droite de référence. Cela est cohérent avec le théorème, car il s’agit d’un résultat asymptotique : l’approximation devient meilleure lorsque \(n\) devient grand.
Pour les petites tailles d’échantillon, comme \(n = 50\), les écarts peuvent être plus importants. Cela ne contredit pas le théorème, car celui-ci ne garantit pas une égalité exacte pour un petit échantillon. Il indique seulement une convergence lorsque la taille de l’échantillon tend vers l’infini.
Les résultats montrent également que le biais augmente avec le nombre de paramètres \(k\). Les modèles les plus complexes, c’est-à-dire ceux avec davantage de variables explicatives, présentent un biais d’optimisme plus élevé. Cela s’explique par le fait qu’un modèle avec plus de paramètres a plus de flexibilité pour s’ajuster aux données d’apprentissage.
Ainsi, les simulations confirment l’idée principale du théorème : la log-vraisemblance d’apprentissage donne une vision trop optimiste de la performance du modèle, et ce biais est approximativement égal au nombre de paramètres estimés.
Les résultats obtenus montrent que le biais moyen d’optimisme est proche du nombre de paramètres \(k\), en particulier lorsque la taille de l’échantillon augmente.
Pour les petites valeurs de \(n\), l’écart entre le biais moyen et \(k\) peut être plus important. Cela est normal, car le théorème est un résultat asymptotique : il devient plus précis lorsque \(n\) tend vers l’infini.
On observe également que lorsque le nombre de paramètres augmente, le biais d’optimisme augmente aussi. Cela confirme l’idée qu’un modèle plus complexe a davantage tendance à s’ajuster aux données d’apprentissage, ce qui rend sa performance apparente plus optimiste.
Ainsi, les simulations confirment empiriquement le résultat théorique étudié en cours.
Cette étude par simulation met en évidence le biais d’optimisme dans les modèles linéaires gaussiens. Lorsque le modèle est estimé et évalué sur les mêmes données, la log-vraisemblance d’apprentissage surestime la performance réelle du modèle.
Les résultats obtenus montrent que ce biais se rapproche du nombre de paramètres \(k\), conformément au théorème étudié. Cette conclusion justifie l’utilisation de critères comme l’AIC, qui corrigent la log-vraisemblance par une pénalisation liée au nombre de paramètres du modèle.
Ainsi, plus un modèle est complexe, plus il est nécessaire de corriger sa performance apparente afin d’éviter une évaluation trop optimiste.