#D. NERINI, Nov. 2009
#Comparaison prevision avec Arbre de classification et analyse discriminante
#sur donnees etang de Berre disponible dans la rubrique precedente 'data mining"
#oxy : % oxygene dissous, a predire
#dens : densite de l eau
#moyve : moyenne du vt (m/s)
#maxve : maximum vent (m/s)
#deb : debit centrale (m3/s/j)
#debv : debit de la veille
#deb7 : debit cumule (m3/s/semaine)
#deb15 : debit cumule (m3/s/quinzaine)
##Ne pas hesiter a regarder l aide de R lorsque la fonction utilisee
#n est pas explicite
##Bien lire le script avant de le lancer pour le faire fonctionner par etape
#lecture des données apres stockage ou vous voulez
x=read.table("oxy.dat",header=T,row.names=1)
###Enlevement des données manquantes marquees par NA
ind=which(is.na(x[,1]))
x=x[-ind,]
library(tree)
#library(rpart) aussi a utiliser
#arbre de regression
#on fabrique une formule pour eviter de l ecrire a chaque fois
form0 = as.formula(paste("oxy~ ", "dens+moyve+maxve+deb+debv+deb7+deb15"))
#arbre de regression
xt=tree(form0,data=x)
plot(xt)
text(xt)
#prevision avec echantillon de construction + representation
xpred=predict(xt)
plot(x[,1],xpred,xlab="observed",ylab="predited")
abline(1,1,lty=2)
#analyse discriminante
library(MASS)
#on va creer des classes d oxygene
x11()
ind=which(x[,1]!=0)
plot(density(x[ind,1]))
#la densité nous informe d'une coupure bien sentie aux alentours de 50
## 2 classes
y=x
ind=which(x[,1]<50)
y[ind,1]="ano"
ind=which(x[,1]>=50)
y[ind,1]="oxy"
form1=as.formula(paste("as.factor(oxy)~ ","dens+moyve+maxve+deb+debv+deb7+deb15"))
ylda=lda(form1,data=y)
x11()
plot(ylda)
#prevision avec l echantillon de construction
ypred=predict(ylda)
ycla=y[,1]
misrate=1-sum(ypred$cla==ycla)/length(ycla)
###Avec un chantillon temoin : 1/3 des données
n=dim(y)[1]
nts=round(1/3*n,0)
ind=sample(1:n,nts,replace=F)
yts=y[ind,]
yls=y[-ind,]
###arbre classif
ytree=tree(form1,data=yls)
x11()
plot(ytree)
text(ytree)
##Prevision avec ech de construction
ypred=predict(ytree)
#regarder comment est fait ypred pr comprendre la suite
ind=apply(ypred,1,which.max)
ypred=colnames(ypred)[ind]
misrate=sum(yls[,1]!=ypred)/length(ypred)
##Avec echantillon test
ypredt=predict(ytree,yts)
ind=apply(ypredt,1,which.max)
ypredt=colnames(ypredt)[ind]
misrats=sum(yts[,1]!=ypredt)/length(ypredt)
##misrate<misrats evidemment
###Predicteurs agrégés (bagged predictors) et prevision
#Cette partie va mettre du temps a tourner car l operation de bagging est repetee
# 100 fois...
#Commencez par changer KK=10
KK=100
restot=matrix(-99,(KK-1),2)
n=nrow(y)
##cette fosi ci, 1/2 des données pr echantillon test
##ceci va permettre de montrer l amelioration de la convergence
nts=round(1/2*n,0)
ind=sample(1:n,nts,replace=F)
yts=y[ind,]
yls=y[-ind,]
nls=nrow(yls)
for(K in 2:KK){
restree=matrix(-99,nts,K)
reslda=matrix(-99,nts,K)
for (k in 1:K){
indB=sample(1:nls,nls,replace=T)
yB=yls[indB,]
#Avec un arbre
ytree=tree(form1,data=yB)
ytreepred=predict(ytree,yts)
ind=apply(ytreepred,1,which.max)
ytreepred=colnames(ytreepred)[ind]
restree[,k]=ytreepred
#Avec discriminante
ylda=lda(form1,data=yB)
yldapred=predict(ylda,yts)
ycla=as.character(yldapred$class)
reslda[,k]=ycla
}
##Avant de continuer on REGARDE le contenu de restree et rescla
#apply permet de renvoyer pour les lignes de restree une table de frequence
#sortie sous forme de liste
pourtree=apply(restree,1,table)
#A partir de la liste precedente, je detecte pour chaque element de la liste
#le max
pourtree=lapply(pourtree,which.max)
#je recupere le nom du max, hehe
pourtree=lapply(pourtree,names)
#je mets la liste sous forme d un vecteur
pourtree=unlist(pourtree)
#meme chose pour lda
pourlda=apply(reslda,1,table)
pourlda=lapply(pourlda,which.max)
pourlda=lapply(pourlda,names)
pourlda=unlist(pourlda)
#Je calcule maintenant les taux de mauvaise classif dans les deux cas
#avec ech temoin
mcr.tree=sum(yts[,1]!=pourtree)/length(pourtree)
mcr.lda=sum(yts[,1]!=pourlda)/length(pourlda)
####ceci est repete pour differentes valeurs de K (de 2 a KK) et stocké dans restot sous la forme
#d une matrice de dimension K-1 lignes et 2 colonnes
restot[K-1,]=cbind(mcr.tree,mcr.lda)
}
##le graphique ci-dessous represente l evolution du taux de mauvaise classification pr arbre et lda
## qd le nombre K de predicteurs agreges augmente
#l arbre de regression donne une meilleure prevision dans ce cas et les taux de mauvaise classification
#se stabilisent au cours des iterations, ceci de maniere plus rapide pour lda
x11()
matplot(2:KK,restot, type="b",col=c(1,2), lty=1,pch=1,ylab="Misclassification rate",xlab="num. of aggregated predictors")