{"word_count": 261, "character_count": 2407}
Suite a une question posée ce matin en cours, je vais faire un rapide billet pour expliquer comment extraire les valeurs inférieures et supérieures quand on a des intervalles, sous R. Commençons par générer des données,n=200set.seed(123)X=rnorm(n)Y=2+X+rnorm(n,sd = .3)Supposons maintenant que l'on n'observe plus la vraie variable [latex]x[/latex] mais juste une classe (on va créer huit classes, avec chacune un huitième des observations)Q=quantile(x = X,(0:8)/8)Q[1]=Q[1]-.00001Xcut=cut(X,breaks = Q)B=data.frame(Y=Y,X=Xcut)Par exemple, pour la premiere valeur, on aas.character(Xcut[1])[1] "(-0.626,-0.348]"Pour extraire des informations sur ces bornes, on peut utiliser le petit code suivant, qui renvoie la borne inférieure, la borne supérieur, et le milieu de l'intervalleextraire = function(x){  ax=as.character(x)  lower1 = as.numeric( sub("\\((.+),.*", "\\1", ax) )  lower2 = as.numeric( sub("\\[(.+),.*", "\\1", ax) )  upper1 = as.numeric( sub("[^,]*,([^]]*)\\]", "\\1", ax) )  upper2 = as.numeric( sub("[^,]*,([^]]*)\\)", "\\1", ax) )  lower = c(lower1,lower2)  lower=lower[!is.na(lower)]  upper = c(upper1,upper2)  upper=upper[!is.na(upper)]  mid   = (lower+upper)/2  return(c(lower=lower,mid=mid,upper=upper))}On peut vérifier sur notre première observationextraire(Xcut[1]) lower    mid  upper -0.626 -0.487 -0.348Juste pour voir, on peut créer trois variables supplémentaires dans notre base (avec ces trois informations)B2=Vectorize(function(i) extraire(Xcut[i]))(1:n)B$lower=B2[1,]B$mid  =B2[2,]B$upper=B2[3,]et on peut comparer 4 régressions (i) on régresse sur nos 8 classes, i.e. nos 8 facteurs (ii) on régresse sur la borne inférieure de l'intervalle, (iii) sur la valeur "moyenne" de l'intervalle (iv) sur la borne supérieureregF=lm(Y~X,data=B)regL=lm(Y~lower,data=B)regM=lm(Y~mid,data=B)regU=lm(Y~upper,data=B)On peut comparer les prévisions avec nos quatre modelesplot(B$Y,predict(regF),ylim=c(0,4))points(B$Y,predict(regM),col="red")points(B$Y,predict(regU),col="blue")points(B$Y,predict(regL),col="purple")abline(a=0,b=1,lty=2)Pour aller plus loin, on peut aussi comparer les AIC de nos modèles,AIC(regF)[1] 204.5653AIC(regM)[1] 201.1201AIC(regL)[1] 266.5246AIC(regU)[1] 255.0687Si l'utilisation des bornes inférieures et supérieures n'est pas concluante, ici, on notera qu'utiliser la valeur moyenne de l'intervalle donne des résultats un peu meilleurs que d'utiliser 8 facteurs.