Le forum du Master ESA économétrie et statistique appliquée - Université d'Orléans

Vous n'êtes pas identifié.

Annonce

Vous êtes sur le forum du master ESA !

Le site du master ESA - description de la formation, notes de cours, contacts... vient de déménager !!!

Venez visiter notre nouveau site : www.master-esa.fr

#1 08-04-2007 20:36:01

alaa-eddine
Member
Date d'inscription: 07-03-2007
Messages: 398

Macro : Paramétre de lissage par la Méthode de la Validation Croisée

Une petite macro faite maison pour trouver le parametre de lissage selon la methode validation croisée.

Code:

%macro lissage(index=);

proc iml;
    use &index;
    read all var _all_ into index;

        n=nrow(index);
        cvb1=j(1000,1,0);
        liss=j(1000,1,0);
        plot=j(1000,2,0);

            do l=1 to 1000 ;

                b=l/1000;
                c1=1/(n*b);
                c2=1/n;
                c3=2/(n-1);
                somme1=0;
                somme2=0;

                    do i=1 to n;

                        do j=1 to n;
                            som1=1/(2*sqrt(3.14))*exp(-1/4*((index[j]-index[i])/b)##2);
                            somme1=somme1+som1;
                            som2=1/sqrt(2*3.14)*exp(-1/2*((index[j]-index[i])/b)##2);
                            somme2=somme2+som2;

                        end;

                    end;

                cvb=c1*((c2*somme1)-(c3*somme2)+(c3*(n/sqrt(2*3.14))));
                cvb1[l,1]=cvb;
                liss[l,1]=l/1000;
                plot[l,1]=cvb;
                plot[l,2]=l/1000;

            end;
        
        resulta=min(cvb1);

        fin=j(1000,2,0);

            do j=1 to 1000;

                if cvb1[j,1]=resulta then fin[j,1]=cvb1[j,1];
                else fin[j,1]=0;
                if cvb1[j,1]=resulta then fin[j,2]=liss[j,1];
                else fin[j,2]=0;

            end;

    create sortie FROM fin ;
    append FROM fin ;
    close sortie ;
    create graph FROM plot ;
    append FROM plot ;
    close graph ;

quit;

data sortie; set sortie;
    label COL1='valeur de la lscv';
    label COL2='paramétre de lissage';
run;

proc print data=sortie label noobs;
    where COL1^=0;
run;

proc sort data=graph; 
    by COL2;
run;

symbol i=join v=none c=blue;
axis1 label=('h' justify=right);
axis2 label=('lscv' justify=right);
proc gplot data=graph;
    plot COL1*COL2 / vref=0 haxis=axis1 vaxis=axis2;
    title 'La fonction lscv';
run;

%mend;

%lissage(index=score);

qlqs explications :

-tout d'abord ca concerne le kernel normal, pour les autres kernel il suffit de mofier ' f ' (cf le pdf de Sonia Jean) ( la flème de faire les '%if' ).

-Ca permet de tracer la lscv en fonction de h ( on remarque que la fonction est globalement convexe ).

-il est possible de l'integrer dans la macro 'klein spady' (c'est le but aprés tout !) modulo qlqs petites modifs (mais ca c'est à vous de chercher big_smile ).

-le calcul est un peu long quand il s'agit d'échatillons "balèz" !

-on fait ce qu'on peut ! big_smile

Bonne utilisation ! (..si utilisation il y a..)

Hors ligne

 

#2 09-04-2007 13:37:10

alaa-eddine
Member
Date d'inscription: 07-03-2007
Messages: 398

Re: Macro : Paramétre de lissage par la Méthode de la Validation Croisée

version light, un peu plus rapide.

Code:

%macro lissage(index=);

proc iml;
    use &index;
    read all var _all_ into index;

            start liss(b) global(index);

                n=nrow(index);
                c1=1/(n*b);
                c2=1/n;
                c3=2/(n-1);
                somme1=0;
                somme2=0;

                    do i=1 to n;

                        do j=1 to n;
                            som1=1/(2*sqrt(3.14))*exp(-1/4*((index[j]-index[i])/b)##2);
                            somme1=somme1+som1;
                            som2=1/sqrt(2*3.14)*exp(-1/2*((index[j]-index[i])/b)##2);
                            somme2=somme2+som2;

                        end;

                    end;

                cvb=-c1*((c2*somme1)-(c3*somme2)+(c3*(n/sqrt(2*3.14))));
                
            return(cvb);
            finish liss;

    options = {1,2};
    parmin=j(1,1,0.1);

    call nlpnra(rc,h,"liss",parmin,options);
    call nlpfdd(f,g,hess,"liss",h);

    param=h;
    print,"Résultats de la méthode de validation croisée",,
    param;

quit;

%mend;

%lissage(index=score);

Hors ligne

 

#3 11-04-2007 15:17:49

alaa-eddine
Member
Date d'inscription: 07-03-2007
Messages: 398

Re: Macro : Paramétre de lissage par la Méthode de la Validation Croisée

Voici le lien du pdf sur le ql je me suis basé pour ecrire ce programme.

http://www.collectionscanada.ca/obj/s4/ … q25615.pdf

Les méthodes d'identification du 'bandwidth parameter' sont mentionnées à partir de la page 17 ( 2.5 choix du paramètre de lissage )

Aprés je ne sais pas si c'est générale comme méthode... espérons le car elles sont faciles !

Hors ligne

 

#4 12-04-2007 19:09:10

esa_ch
Moderator
Date d'inscription: 21-02-2007
Messages: 1415

Re: Macro : Paramétre de lissage par la Méthode de la Validation Croisée

La réponse l'an prochain dans le cours de M2...

Hors ligne

 

#5 13-04-2007 17:20:14

alaa-eddine
Member
Date d'inscription: 07-03-2007
Messages: 398

Re: Macro : Paramétre de lissage par la Méthode de la Validation Croisée

i hope so smile !!

Qui ne tente rien a rien big_smile .Sinon j'ai utilisé l'autre méthode (Pas dure à programmer d'ailleurs !) qui consiste à fixer un h arbitraire ( donc faire une boucle sur les h de 0 à 1 avec un pas de 0.01 puis de 0 à 20 avec un pas de 0.1 ) et ensuite maximiser le taux de bon classement du modèle.

Une dernière question ( après j'arrête lol ) est ce qu'il est possible de booster les performances de SAS afin qu'il puisse calculer plus rapidement ? j'ai vu qu'il y a des options dans la proc iml ( WORKSIZE = et SYMSIZE= )  mais c'est pas bien expliqué dans l'aide... je trouve qu'il fait pas assez ramer le PC !

Voila Voila ! merci pour vos conseils !

cordialement

Hors ligne

 

Pied de page des forums

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson

[ Generated in 0.026 seconds, 8 queries executed ]