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=200 set.seed(123) X=rnorm(n) Y=2+X+rnorm(n,sd = .3) |
Supposons maintenant que l’on n’observe plus la vraie variable x 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]-.00001 Xcut=cut(X,breaks = Q) B=data.frame(Y=Y,X=Xcut) |
Par exemple, pour la premiere valeur, on a
as.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’intervalle
extraire = 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 observation
extraire(Xcut[1]) lower mid upper -0.626 -0.487 -0.348 |
Juste 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érieure
regF=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 modeles
plot(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.5653 AIC(regM) [1] 201.1201 AIC(regL) [1] 266.5246 AIC(regU) [1] 255.0687 |
Si 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.
OpenEdition suggests that you cite this post as follows:
Arthur Charpentier (November 2, 2018). Variable explicative dans un intervalle. Freakonometrics. Retrieved September 14, 2024 from https://doi.org/10.58079/ovc2