# creates a data frame named datum from imported csv file
datum=read.csv(file.choose())
# check data was imported properly
# column headers of data file plus first 6 rows of data
head(datum)
# summary statistics for datum
summary(datum)
# runs a linear regression, calls results 'results'
results=lm(datum[,2]~datum[,1],data=datum)
summary(results) # prints a summary of 'results'
+ data1.csv : problème d'homoscédasticité.
+ data2.csv : corrélation des erreurs.
+ data3.csv : normalité des résidus.
+ data4.csv : relation linéaire.
Dans cette partie, on s’intéresse au jeu de données du cancer de la prostate disponible dans le de . Nous avons besoin d’installer le package et charger le jeu de données comme suit
install.packages("lasso2", dep=TRUE)
require(lasso2)
data("Prostate")
?Prostate
Nous allons construire un modèle linéaire multiple pour prédire la variable en fonction des autres variables. Le jeu de données est constitué de 97 observations. Nous allons le diviser en deux parties : un jeu de données apprentissage constitué des 70 premières observations et un jeu de données test constitué des 27 dernières observations du tableau.
Sur le jeu de données apprentissage et à l’aide de la fonction de
require(lasso2)
data("Prostate")
n <- nrow(Prostate)
Prostate.train <- Prostate[1:70,]
Prostate.test <- Prostate[71:97,]
#### AIC
## forward
lm0 <- lm(lcavol ~ 1, data = Prostate.train)
lm1 <- formula(lm(lcavol~ ., data = Prostate.train))
slm.for.aic <- step(lm0, direction = "forward", scope=lm1)
## backward
lm1 <- lm(lcavol ~ ., data = Prostate.train)
slm.back.aic <- step(lm1, direction = "backward")
##both
slm.both.aic <- step(lm1, direction = "both", scope = list(lm1, lm0))
#### BIC
## forward
lm0 <- lm(lcavol ~ 1, data = Prostate.train)
lm1 <- formula(lm(lcavol ~ ., data = Prostate.train))
slm.for.bic <- step(lm0, direction = "forward", scope=lm1, k=log(n))
## backward
lm1 <- lm(lcavol ~ ., data = Prostate.train)
slm.back.bic <- step(lm1, direction = "backward", k=log(n))
##both
slm.both.bic <- step(lm1, direction = "both", scope = list(lm1, lm0),k=log(n))
On préfère le modèle correspondant au critère bic car plus parcimonieux.
Nous allons maintenant comparer les erreurs de prédiction des trois modèles : le modèle sélectionné par critère AIC, le modèle sélectionné par le critère BIC et le modèle complet. Pour cela nous allons faire appel à la fonction de . Pour calculer une erreur de prédiction, il suffit d’utiliser la quantité
mean((x-y)**2)
où et sont deux vecteurs de tailles égales. On peut assimiler au vecteur des vraies valeurs observées d’une certaine variables et les prédictions de ces différentes valeurs.
mean((predict(slm.both.bic)-Prostate.train[,"lcavol"])**2)
mean((predict(slm.both.aic)-Prostate.train[,"lcavol"])**2)
mean((predict(lm1)-Prostate.train[,"lcavol"])**2)
La hiérarchie observée s’explique essentiellement par le nombre de variables incluses dans le modèle.
mean((predict(slm.both.bic, newdata = Prostate.test)-Prostate.test[,"lcavol"])**2)
mean((predict(slm.both.aic, newdata = Prostate.test)-Prostate.test[,"lcavol"])**2)
mean((predict(lm1, newdata = Prostate.test)-Prostate.test[,"lcavol"])**2)
On remarque que le modèle sélectionné par le critère BIC possède la meilleure de prédiction de plus, il fait appel à un nombre minimal de covariables.