Le lissage par noyau avec rupture(s) sous SAS
[Repris de mon article dans Statisfaction]
Télécharger : la macro & sa notice.
Voici une petite macro SAS bien utile pour tout ceux qui souhaitent faire du Kernel Smoothing (ou “lissage par noyau”, mais ça fait tellement moins classe). La macro est adaptée au cas des variables qui présentent des ruptures (1 ou 2 max), bien connu des économètres qui font des regressions sur discontinuité.
Rappelons tout d’abord le principe du Kernel Smoothing. Vous avez 2 variables X et Y (continues ou discrètes) et vous souhaitez avoir une première idée de la forme de la relation qui les relient, sans imposer de forme fonctionnelle particulière. Ou comme diraient les économètres “une estimation non paramétrique” de Y=f(X) (oh yeah). Pour cela, on calcule sur des intervalles glissants de X la moyenne pondérée de Y. Le noyau permet simplement de pondérer plus fortement les points à proximité de la valeur de X à une itération donnée.
Si vous n’avez rien compris, regardez plutôt ce petit dessin tiré de Wikipédia:
Lorsque votre relation présente une (ou deux) discontinuité(s), le lissage aura tendance à masquer la réalité de cette rupture. Pour vous donner un exemple, supposons que vous étudiez le taux de formation (Y) en fonction de la taille d’une entreprise (en nombre de salariés, X). Vous savez qu’en général, plus il y a de salariés, plus l’entreprise aura tendance à former (économies d’échelle, facilité à remplacer les salariés absents etc…). Mais vous savez également que les syndicats ont tendance à pousser les entreprises à former. Or, aux seuils de 20 et 50 salairés, les entreprises ont des obligations en matière d’élections de représentants du personnel et de comité d’entreprise. Vous vous attendez donc à ce que le taux de formation à ces seuils “bondissent” de manière discontinue.
Dans ce cas, un lissage classique vous donnerait quelque chose comme (données réelles):
En fait, si les discontinuités à X=50 et X=20 sont perceptibles, elles tendent à être lissées car on calcule la moyenne des taux de formation (Y) en mélangeant les points au-dessus et au-dessous des discontinuités. Pour résoudre le problème, on fait glisser le noyau en le stoppant autour du ou des seuil(s). De cette manière, par exemple, à X=49.5 on ne considère dans le calcul de la moyenne que les observations vérifiant X<50 (et vice versa).
Dans ce cas, on obtient le joli graphe suivant:
Voici un exemple de syntaxe SAS pour le graphique ci-dessus:
%kernel_smooth(
h=5,/*taille de la fenêtre*/
nb_points=50, /* nombre de points */
data=entreprise2014, /*Base de données*/
var=nombre_salaries, /*variable en abscisse (sur laquelle s'applique h)*/
var_mean=taux_formation , /*variable en ordonnée*/
/*Paramètres facultatifs*/
min=10,max=75, /** Étendue pour le nombre de salarié (abscisse). Min/max observés sinon ***/
cut1=20,cut2=50, /*Points de rupture (vide=pas de rupture)*/
where= chiffre_affaires>0,/** Condition sur les observations**/
weight= poids); /** Variable des poids **/
NB: Pour une relation où il n'y a pas de "réelle" rupture, la méthode aura tendance à en "créer" une, surtout si la relation très croissante/décroissante. D'où l'importance de "tester" de faux points de rupture.