<- read.table("../donnees/ozone_complet.txt", header = T, sep = ";")
ozone dim(ozone)
[1] 1464 23
Importation de l’ozone
<- read.table("../donnees/ozone_complet.txt", header = T, sep = ";")
ozone dim(ozone)
[1] 1464 23
Élimination des individus avec une valeur manquante
<- which(is.na(ozone), arr.ind = T)[,1]
indNA <- ozone[-indNA,] ozone2
Importation du fichier d’ozone sans valeurs manquantes avec les projections
<- read.table("../donnees/ozone_transf.txt", header = T, sep = ";") ozone
et préparation du data-frame qui contiendra les résultats de chaque méthode
<- data.frame(Y = ozone$maxO3) RES
Pour le moment il ne contient qu’une seule colonne avec les données à prévoir.
Nous séparons en 10 blocs en 2 étapes: création des affectations des individus à chaque bloc
<- 10
nbbloc <- rep(1:nbbloc, length = nrow(ozone)) blocseq
Puis nous utilisons une permutation aléatoire de ces affectations
set.seed(1234)
<- sample(blocseq)
bloc set.seed(1234)
<- sample(blocseq) bloc
Chargement du package pour la sélection de variables
library(leaps)
Evaluation de la qualité prédictive de la régression linéaire et de la sélection de variables via BIC (algorithme exhaustif)
for(i in 1:nbbloc){
###MCO global
<- lm(maxO3~.,data=ozone[bloc!=i,])
reg ==i,"MCO"] <- predict(reg,ozone[bloc==i,])
RES[bloc###MCO choix
<- regsubsets(maxO3~., int=T, nbest=1, nvmax=22,
recherche data=ozone[bloc!=i,])
<- summary(recherche)
resume <- colnames(resume$which)[
nomselec $which[which.min(resume$bic),] ][-1]
resume<- formula(paste("maxO3~",paste(nomselec,collapse="+")))
formule <- lm(formule,data=ozone[bloc!=i,])
regbic ==i,"choix"] <- predict(regbic,ozone[bloc==i,])
RES[bloc }
Chargement du package pour lasso, ridge et elasticnet et création des matrices nécessaires à son utilisation :
library(glmnet)
<- model.matrix(maxO3~.,data=ozone)[,-1]
ozone.X <- ozone[,"maxO3"] ozone.Y
Évaluation de la qualité prédictive des régressions lasso, ridge et elasticnet:
for(i in 1:nbbloc){
<- ozone.X[bloc!=i,]
XA <- ozone.Y[bloc!=i]
YA <- ozone.X[bloc==i,]
XT ###ridge
<- cv.glmnet(XA,YA,alpha=0)
tmp <- glmnet(XA,YA,alpha=0,lambda=tmp$lambda.min)
mod ==i,"ridge"] <- predict(mod,XT)
RES[bloc###lasso
<- cv.glmnet(XA,YA,alpha=1)
tmp <- glmnet(XA,YA,alpha=0,lambda=tmp$lambda.min)
mod ==i,"lasso"] <- predict(mod,XT)
RES[bloc###elastic
<- cv.glmnet(XA,YA,alpha=0.5)
tmp <- glmnet(XA,YA,alpha=.5,lambda=tmp$lambda.min)
mod ==i,"elastic"] <- predict(mod,XT)
RES[bloc }
Chargement du package pour les régressions sur composantes
library(pls)
Évaluation de la qualité prédictive des régressions PCR et PLS
for(i in 1:nbbloc){
#####PLS
<- plsr(maxO3~.,data=ozone[bloc!=i,],ncomp=20,
tmp validation="CV",scale=TRUE)
<- MSEP(tmp,estimate=c("train","CV"))
mse <- which.min(mse$val["CV",,])-1
npls <- plsr(maxO3~.,ncomp=npls,data=ozone[bloc!=i,],scale=TRUE)
mod ==i,"PLS"] <- predict(mod,ozone[bloc==i,],ncomp=npls)
RES[bloc#####PCR
<- pcr(maxO3~.,data=ozone[bloc!=i,],ncomp=20,
tmp validation="CV",scale=TRUE)
<- MSEP(tmp,estimate=c("train","CV"))
mse <- which.min(mse$val["CV",,])-1
npcr <- pcr(maxO3~.,ncomp=npcr,data=ozone[bloc!=i,],scale=TRUE)
mod ==i,"PCR"] <- predict(mod,ozone[bloc==i,],ncomp=npcr)
RES[bloc }
Les résultats :
|>
RES ::summarise(across(-Y,~mean((Y-.)^2))) dplyr
MCO choix ridge lasso elastic PLS PCR
1 187.2726 188.8491 187.8304 187.1023 187.0389 187.2622 187.2685
Création d’un data-frame pour les résultats :
<- data.frame(MCO=0,choix=0,ridge=0,lasso=0,elastic=0) res_rep
La fonction
<- function(don,bloc,b) {
sse_reg <- lm(maxO3~.,data=don[bloc!=b,])
m_reg <- predict(m_reg,don[bloc==b,])
previsions return(sum((don[bloc==b,"maxO3"]-previsions)^2))
}
La qualité de la modélisation
set.seed(1234)
<- rep(0,20)
ssereg for (r in 1:20) {
<- sample(blocseq)
bloc for(b in 1:nbbloc){
<- ssereg[r] + sse_reg(ozone,bloc,b)
ssereg[r]
}
}$MCO <- round(mean(ssereg/nrow(ozone)),2) res_rep
La fonction
library(leaps)
<- function(don,bloc,b,nvmax,method) {
sse_regbic <- regsubsets(maxO3~., int=T, nbest=1,data=don[bloc!=b,],
recherche nvmax=nvmax,method=method)
<- summary(recherche)
resume <- colnames(resume$which)[resume$which[which.min(resume$bic),]][-1]
nomselec <- formula(paste("maxO3 ~", paste(nomselec, collapse = "+")))
formule <- lm(formule,data=don[bloc!=b,])
m_reg <- predict(m_reg,don[bloc==b,])
previsions return(sum((don[bloc==b,"maxO3"]-previsions)^2))
}
La qualité de la modélisation
set.seed(1234)
<- rep(0,20)
sseregbic for (r in 1:20) {
<- sample(blocseq)
bloc for(b in 1:nbbloc){
<- sseregbic[r] + sse_regbic(ozone,bloc,b,22,"exhaustive")
sseregbic[r]
}
}$choix <- mean(sseregbic/nrow(ozone)) res_rep
La fonction
library(glmnet)
<- function(X,Y,bloc,b,a) {
sse_glmnet <- cv.glmnet(X[bloc!=b,], Y[bloc!=b,drop=FALSE], alpha=a)
rech <- predict(rech, newx=X[bloc==b,], s=rech$lambda.min)
prev return(sum((Y[bloc==b,"maxO3"] - as.vector(prev))^2))
}
La qualité de la modélisation
<- model.matrix(maxO3~.,data=ozone)[,-1]
X <- data.matrix(ozone[,"maxO3",drop=FALSE])
Y set.seed(1234)
<- rep(0,20)
sselasso for (r in 1:20) {
<- sample(blocseq)
bloc for(b in 1:nbbloc){
<- sselasso[r] + sse_glmnet(X,Y,bloc,b,a=1)
sselasso[r]
}
}$lasso <- round(mean(sselasso/nrow(ozone)),2) res_rep
La qualité de la modélisation
<- model.matrix(maxO3~.,data=ozone)[,-1]
X <- data.matrix(ozone[,"maxO3",drop=FALSE])
Y set.seed(1234)
<- rep(0,20)
sseridge for (r in 1:20) {
<- sample(blocseq)
bloc for(b in 1:nbbloc){
<- sseridge[r] + sse_glmnet(X,Y,bloc,b,a=0)
sseridge[r]
}
}$ridge <- mean(sseridge/nrow(ozone)) res_rep
La qualité de la modélisation
<- model.matrix(maxO3~.,data=ozone)[,-1]
X <- data.matrix(ozone[,"maxO3",drop=FALSE])
Y set.seed(1234)
<- rep(0,20)
sseelasticnet for (r in 1:20) {
<- sample(blocseq)
bloc for(b in 1:nbbloc){
<- sseelasticnet[r] + sse_glmnet(X,Y,bloc,b,a=0.5)
sseelasticnet[r]
}
}$elastic <- mean(sseelasticnet/nrow(ozone)) res_rep
Les résultats
res_rep
MCO choix ridge lasso elastic
1 188.36 189.6025 188.6624 187.92 187.8242