22
Paris, le 30/07/98 La macro SAS JOHANSEN : documentation (Alain JACQUOT) I - Introduction La macro JOHANSEN a pour objet : 1. de déterminer le nombre de relations de coïntégration linéairement indépendantes entre des variables supposées intégrées d’ordre 1, à l’aide des tests de la « trace » et du « lambda max » (cf. Johansen, 1988, et Johansen et Juselius, 1990) ; 2. d’estimer, par la méthode du maximum de vraisemblance, conditionnellement au nombre de relations de coïntégration indépendantes, le modèle VECM (vectoriel à correction d’erreur) qui relie ces variables (la méthode du MV pour ce type de modèles a été développée également par Johansen, 1988 et Johansen et Juselius, 1990). Nous supposons dans toute la suite que l’utilisateur est familiarisé avec l’article de Johansen et Juselius, 1990. Sous son expression la plus générale, le modèle VECM estimé par la macro s’écrit sous la forme : , Documentation page 1 / 22

Télécharger la documentation (format Word)

  • Upload
    dothu

  • View
    224

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Télécharger la documentation (format Word)

Paris, le 30/07/98

La macro SAS JOHANSEN :documentation

(Alain JACQUOT)

I   -   Introduction

La macro JOHANSEN a pour objet :

1. de déterminer le nombre de relations de coïntégration linéairement indépendantes entre des variables supposées intégrées d’ordre 1, à l’aide des tests de la « trace » et du « lambda max » (cf. Johansen, 1988, et Johansen et Juselius, 1990) ;

2. d’estimer, par la méthode du maximum de vraisemblance, conditionnellement au nombre de relations de coïntégration indépendantes, le modèle VECM (vectoriel à correction d’erreur) qui relie ces variables (la méthode du MV pour ce type de modèles a été développée également par Johansen, 1988 et Johansen et Juselius, 1990).

Nous supposons dans toute la suite que l’utilisateur est familiarisé avec l’article de Johansen et Juselius, 1990.

Sous son expression la plus générale, le modèle VECM estimé par la macro s’écrit sous la forme :

,

où : -  t est un vecteur aléatoire de taille n constitué des n variables entre lesquelles on cherche à mettre en évidence des relations de coïntégration ;

- les matrices i (i = 1, ....., p-1) sont de format (n,n) ;

- t et t sont les variables supplémentaires rajoutées respectivement dans les « régresseurs » et dans les « niveaux » (la terminologie est celle de Johansen et Juselius, 1990). Ces variables sont implicitement supposées exogènes par rapport aux paramètres du modèle ;

Documentation page 1 / 18

Page 2: Télécharger la documentation (format Word)

-  est de format (n,r), où r est le nombre de relations de coïntégrations linéairement indépendantes entre les variables qui constituent le vecteur t

1.

-  est de format (n+dim t , r) et de format ;

- t est un bruit blanc gaussien de dimension n.

Ce modèle peut être estimé sous des contraintes du type . et/ou . (cf. Johansen et Juselius, 1990).

Lorsque les variables incluses dans les vecteurs t tou se limitent à une constante, un trend, et/ou des indicatrices saisonnières, on trouve les valeurs critiques des tests de valeurs propres (tests dits « de la trace » et « du lambda max ») dans Osterwald-Lenum, 1992.

Le coeur du programme (calculs) est écrit dans le langage matriciel de SAS (SAS-IML) ; les manipulations de variables et les sorties à l’écran sont écrites en langage SAS de base.

La macro n’est pas optimisée et peut s’avérer assez gourmande en temps de calcul (de l’ordre de 1 mn pour une analyse sur trois variables avec un Pentium 90 MHz).

II   -   Mise en oeuvre

1) Syntaxe2

%JOHANSEN(INTAB=_LAST_,P=,R=,RANGE=,DEBUT=,FIN=,H=non,AMAJ=non,ADDNIV=non,ADDREG=non,NBADDNIV=0,NBADDREG=0,V1=,V2=,V3=non,V4=non,V5=non,V6=non, DIAGRES=OUI,TESTWALD=3) ;

- INTAB : nom du tableau SAS contenant les variables du vecteur t , ainsi qu’une variable (obligatoirement de type numérique) qui sert d’identifiant aux observations3. Si le paramètre INTAB n’est pas codé, SAS retient par défaut le dernier tableau SAS créé au cours de la session ;

- P : nombre de retards du modèle VECM. Ce paramètre doit obligatoirement être codé : il n’y a pas de valeur par défaut ;

- R : nombre supposé de relations de coïntégration linéairement indépendantes pour l’estimation du modèle (les tests de la trace et du lambda max permettent de s’assurer a posteriori que l’on a retenu la bonne valeur. Dans le cas où la valeur retenue initialement est invalidée par ces tests, il faut faire retourner la macro). Ce paramètre est obligatoire ;

- RANGE : nom de la variable (obligatoirement de type numérique) qui sert d’identifiant aux observations ;

- DEBUT et FIN : valeurs prises par la variable &RANGE qui servent de bornes à la période d’estimation.Note : pour tenir compte des retards, les estimations commencent en fait à l’observation n° DEBUT+P, et le nombre d’observations effectivement utilisées est égal à FIN-DEBUT-P+1 ;

- H : nom du tableau SAS contenant la matrice H pour une éventuelle estimation sous contrainte du type H. .Exemple : si dim = 4 et si l’on veut que le 4è coefficient de soit égal à la somme des trois autres, on créera (avant de lancer la macro Johansen) un tableau SAS appelé (par ex.) TOTO de la manière suivante (remarque : le nom des variables du tableau TOTO est sans importance) :

1 Il s’agit de relations de cointégration, à une combinaison linéaire près des composantes du vecteur t .2 Il s’agit d’une syntaxe simplifiée. D’autres paramètres existent dans la macro que ceux présentés ici.3 Ce tableau peut éventuellement contenir d’autres variables.

Documentation page 2 / 18

Page 3: Télécharger la documentation (format Word)

DATA TOTO ; INPUT W1 W2 W3 ; CARDS ;1 0 00 1 00 0 11 1 1; RUN ;

et l’on codera H = TOTO dans la macro JOHANSEN. Par défaut, l’estimation est menée sans contrainte du type .  ;

- AMAJ : nom du tableau SAS contenant la matrice A pour une éventuelle estimation sous contrainte du type . (même principe que pour le paramètre H). Par défaut : estimation non contrainte.NB : A est une matrice de format (n,q) en notant q dim . La macro ne fonctionnera que si le bloc supérieur de taille (q,q) de A est inversible. Cette condition est vérifiée en particulier lorsqu’on cherche à tester la nullité des n-q dernières lignes de 4, auquel cas on a :

;

- ADDNIV : nom du tableau SAS contenant les variables supplémentaires figurant dans les « niveaux » (variables du vecteur t ) ainsi que la variable qui sert d’identifiant aux observations (variable codée sous le paramètre RANGE, c.f. supra). Le tableau SAS ne doit pas contenir de variables autres que ces variables. Par défaut, il n’y a pas de variables supplémentaires dans les niveaux ;

- NBADDNIV : nombre de variables rajoutées dans les niveaux (= nb de variables du tableau ADDNIV-1). Par défaut, ce paramètre prend la valeur 0.

- ADDREG et NBADDREG : idem, mais cette fois pour les variables rajoutées dans les « régresseurs » (i.e variables du vecteur t ).

- V1 à V6 : nom des variables utilisées pour l’analyse (variables du vecteur t ). Au moins deux variables doivent être utilisées, i.e les paramètres V1 et V2 sont obligatoires, et les paramètres V3 à V6 facultatifs. NB : Les noms des variables doivent impérativement être écrits en majuscules.

- DIAGRES (=OUI par défaut) réalise éventuellement des diagnostics complémentaires sur les résidus d’estimation (PROC UNIVARIATE + test de Box-Pierce) ;

- TESTWALD : permet de tester la significativité des coefficients de la matrice , par un test de type Wald.TESTWALD=0 : pas de tests ;TESTWALD=1 : on teste la significativité de chaque colonne de ‘;TESTWALD=2 : on teste la significativité de la somme de la 1ère et de la ie colonne de ‘, i 2 ;TESTWALD=3 : correspond à la fois à TESTWALD=1 et à TESTWALD=2. Par défaut TESTWALD=3.

A noter : le calcul des tests de Wald plante (fort logiquement) lorsque les deux conditions suivantes sont simultanément réunies :

a) on a codé TESTWALD=2 ou 3 ;b) l’estimation est menée sous la contrainte de nullité de la somme de 2 colonnes de ‘ (une telle contrainte peut aisément se mettre sous la forme . ).

4 Ce test est un test d’éxogénéité au sens faible des n-q dernières variables de X t par rapport à (cf. Johansen et Juselius, 1990).

Documentation page 3 / 18

Page 4: Télécharger la documentation (format Word)

2) Mots réservés :

la macro JOHANSEN se réserve pour son usage les mots suivants : non, CONST, TREND, DUM01, ... DUM99, ainsi que d’autres mots (trop nombreux pour être énumérés in extenso) dont le premier et le dernier caractère sont un blanc souligné (« underscore »).

3) Sorties à l’écran :

S’impriment successivement à l’écran :

- les valeurs prises par les statistiques de test de la trace et du lambda max ;- les valeurs propres ;- la log-vraisemblance ;- la matrice  ;- les tests de Wald sur la matrice  ;- les matrices , ( , ....., ) . ' 1 1p et  ;- les tests de Box Pierce et les PROC UNIVARIATE sur les résidus des équations.

A noter : ces résultats sont conservés, sous forme de tableaux SAS dans la librairie WORK, et sous forme de matrices IML dans le catalogue _CATMAT_ de la librairie WORK, ce qui permet des calculs complémentaires (identification d’une forme bloc récursive par exemple).

RÉFÉRENCES :

JACQUOT A. (1997) : « Les flexions des taux d’activité sont-elles seulement conjoncturelles ? », Economie et Prévision, n° 127 ;

JOHANSEN S. (1988) : « Statistical Analyses of Cointegration Vectors », Journal of Economic Dynamics and Control, Vol. 12, pp 231-254.

JOHANSEN S., JUSELIUS K. (1990) : « Maximum Likelihood Estimation and Inference on Cointegration With Applications to the Demand for Money », Oxford Bulletin of Economics and Statistics, Vol. 52, N° 2 ;

OSTERWALD-LENUM (1992) : « A Note with Quantiles of the Asymptotic Distribution of the Maximum Likelihood Cointegration Rank Test Statistics », Oxford Bulletin of Economics and Statistics, Vol. 54, n° 3.

ANNEXES :

- annexe n° 1 : texte de la macro.- annexe n° 2 : exemple de sortie (les données sont celles utilisées pour l’article sur les flexions de long terme des taux d’activité).

Documentation page 4 / 18

Page 5: Télécharger la documentation (format Word)

Annexe n°1 :texte de la macro Johansen

options macrogen symbolgen;%macro johansen(intab=_last_,p=,r=,range=,debut=,fin=,h=non,amaj=non,diagres=OUI,testwald=3, v1=,v2=,v3=non,v4=non,v5=non,v6=non,addniv=non,addreg=non,nbaddniv=0,nbaddreg=0, impri=1,cas=0,per=1,ruptc=non,ruptt=non);

/* version avec estimation sous contrainte alpha=a*psi. ne marche que si le bloc superieur de a est inversible. */

proc datasets library=work; delete _catmat_ / mt=catalog;quit;run; proc datasets library=work; delete _alpha_ _alphat_ _alphcl_ _beta_ _betat_ _betnor_ _cl_ _delt_ _gamma_ _gammat_ _gammcl_ _intab_ _lambda_ _loglik_ _pi_ _recap_ _res_ _resid_ _rg_ _rg0_ _rg1_ _wald_ _waldt_ ; quit;run;

/* creation de trois tableaux sas : un pour les niveaux, un pour les regresseurs, et un pour les deltas */

data _intab_; set &intab;

/* calcul du nombre observations : */ %let T=%eval(1+&fin-&debut-&p);

/* determination du nombre de variables : */ %if &v3=non %then %do;%let n=2; data _zw_;set _intab_;keep &range &v1 &v2; if (&range>=&debut and &range<=&fin); data _zz_;set _zw_; rename &v1=l0v1 &v2=l0v2; %end; %else %if &v4=non %then %do;%let n=3; data _zw_;set _intab_;keep &range &v1 &v2 &v3; if (&range>=&debut and &range<=&fin); data _zz_;set _zw_; rename &v1=l0v1 &v2=l0v2 &v3=l0v3; %end; %else %if &v5=non %then %do;%let n=4; data _zw_;set _intab_;keep &range &v1 &v2 &v3 &v4; if (&range>=&debut and &range<=&fin); data _zz_;set _zw_; rename &v1=l0v1 &v2=l0v2 &v3=l0v3 &v4=l0v4; %end; %else %if &v6=non %then %do;%let n=5; data _zw_;set _intab_;keep &range &v1 &v2 &v3 &v4 &v5; if (&range>=&debut and &range<=&fin); data _zz_;set _zw_; rename &v1=l0v1 &v2=l0v2 &v3=l0v3 &v4=l0v4 &v5=l0v5; %end; %else %do;%let n=6; data _zw_;set _intab_;keep &range &v1 &v2 &v3 &v4 &v5 &v6; if (&range>=&debut and &range<=&fin); data _zz_;set _zw_; rename &v1=l0v1 &v2=l0v2 &v3=l0v3 &v4=l0v4 &v5=l0v5 &v6=l0v6; %end;

Texte de la macro page 5 / 18

Page 6: Télécharger la documentation (format Word)

/* generation des retards, des deltas et des dummies : */ %let ctrlp=0; %do %while (&ctrlp<=%eval(&p-1)); %let ctrlp=%eval(&ctrlp+1); %let lctrlp=%eval(&ctrlp-1); %let ctrln=0; %do %while (&ctrln<=%eval(&n-1)); %let ctrln=%eval(&ctrln+1); data _zz_;set _zz_; l1v&ctrln=lag(l0v&ctrln); d&lctrlp.v&ctrln=lag&lctrlp(l0v&ctrln)-lag&ctrlp(l0v&ctrln); %end; %end; %let first=%eval(&debut+&p); data _zw_;set _zw_; if &range>=&first; data _zz_;set _zz_; if &range>=&first;

data _nivp_;set _zz_; keep l1v1-l1v&n &range; data _delt_;set _zz_; keep d0v1-d0v&n; data _regr_;set _zz_; drop d0v1-d0v&n l1v1-l1v&n l0v1-l0v&n;

data _zz_;set _zz_; const=1; trend+const; _per_=1+&per*(-floor((_n_-1)/&per)+((_n_-1)/&per));

%if (&ruptc ne non) %then %do; data _zz_;set _zz_; _rc_=(&range>=&ruptc); %end; %if (&ruptt ne non) %then %do; data _zz_;set _zz_; _rc_=(&range>=&ruptc); _rr_=(&range>=&ruptt); _rt_+_rr_;drop _rr_; %end;

%if (&per>1) %then %do; %let ctrlper=1; %do %while (&ctrlper<=&per); %if (&ctrlper<10) %then %do; data _zz_;set _zz_; dum0&ctrlper=(abs(_per_-&ctrlper)<1e-06); %end; %else %do; dum&ctrlper=(abs(_per_-&ctrlper)<1e-06); %end; %let ctrlper=%eval(&ctrlper+1); %end; %end;

%if (&cas=0) %then %do; %if (&addreg=non) %then %do;%let a=0;%end; %else %do; %let a=%eval(&nbaddreg); data _regr_; merge _regr_ &addreg;by &range; if &range>=&first and &range <=&fin; %end; %if (&addniv=non) %then %do;%let b=0;%end; %else %do;

Texte de la macro page 6 / 18

Page 7: Télécharger la documentation (format Word)

%let b=%eval(&nbaddniv); data _nivp_; merge _nivp_ &addniv;by &range; if &range>=&first and &range <=&fin; %end; %end; %else %if (&cas=1) %then %do; data _regr_;merge _regr_ _zz_(keep=const); %let a=1; %let b=0; %end; %else %if (&cas=2) %then %do; data _nivp_;merge _nivp_ _zz_(keep=const); %let a=0; %let b=1; %end; %else %if (&cas=3) %then %do; %let a=&per; %let b=0; %if (&per<10) %then %do; data _regr_;merge _regr_ _zz_(keep=dum01-dum0&per); %end; %else %do; data _regr_;merge _regr_ _zz_(keep=dum01-dum&per); %end; %end; %else %if (&cas=4) %then %do; %let a=%eval(&per-1); %let b=1; data _nivp_;merge _nivp_ _zz_(keep=const); %if (&per<10) %then %do; data _regr_;merge _regr_ _zz_(keep=dum02-dum0&per); %end; %else %do; data _regr_;merge _regr_ _zz_(keep=dum02-dum&per); %end; %end; %else %if (&cas=5) %then %do; %let a=2; %let b=0; data _regr_;merge _regr_ _zz_(keep=const trend); %end; %else %if (&cas=6) %then %do; %let a=%eval(&per+1); %let b=0; %if (&per<10) %then %do; data _regr_;merge _regr_ _zz_(keep=trend dum01-dum0&per); %end; %else %do; data _regr_;merge _regr_ _zz_(keep=trend dum01-dum&per); %end; %end; %else %if (&cas=7) %then %do; %let a=1; %let b=1; data _nivp_;merge _nivp_ _zz_(keep=trend); data _regr_;merge _regr_ _zz_(keep=const); %end; %else %if (&cas=8) %then %do; %let a=&per; %let b=1; data _nivp_;merge _nivp_ _zz_(keep=trend); %if (&per<10) %then %do; data _regr_;merge _regr_ _zz_(keep=dum01-dum0&per); %end; %else %do; data _regr_;merge _regr_ _zz_(keep=dum01-dum&per); %end;

Texte de la macro page 7 / 18

Page 8: Télécharger la documentation (format Word)

%end; %else %if (&cas=9) %then %do; %let a=0; %let b=2; data _nivp_;merge _nivp_ _zz_(keep=const trend); %end; %else %if (&cas=10) %then %do; %let a=%eval(&per-1); %let b=2; data _nivp_;merge _nivp_ _zz_(keep=const trend); %if (&per<10) %then %do; data _regr_;merge _regr_ _zz_(keep=dum02-dum0&per); %end; %else %do; data _regr_;merge _regr_ _zz_(keep=dum02-dum&per); %end; %end; %else %if (&cas=11) %then %do; %let a=0; %let b=3; data _nivp_;merge _nivp_ _zz_(keep=const trend _rc_); %end; %else %if (&cas=12) %then %do; %let a=0; %let b=4; data _nivp_;merge _nivp_ _zz_(keep=const trend _rc_ _rt_); %end; %else %if (&cas=13) %then %do; %let a=4; %let b=0; data _regr_;merge _regr_ _zz_(keep=const trend _rc_ _rt_); %end; %else %if (&cas=14) %then %do; %let a=2; %let b=2; data _regr_;merge _regr_ _zz_(keep=const _rc_); data _nivp_;merge _nivp_ _zz_(keep=trend _rt_); %end; data _regr_;set _regr_(drop=&range); data _nivp_;set _nivp_(drop=&range);

%let dim=%eval(&a+&n*(&p-1));

proc transpose data=_zw_ out=_zwt_; id &range; data _zwt_;set _zwt_;length indic 3.; if (_name_="&v1") then do;indic=1;end; else if (_name_="&v2") then do;indic=2;end; else if (_name_="&v3") then do;indic=3;end; else if (_name_="&v4") then do;indic=4;end; else if (_name_="&v5") then do;indic=5;end; else if (_name_="&v6") then do;indic=6;end; proc sort data=_zwt_;by indic;

proc transpose data=_nivp_ out=_nivpt_;

/* generation des libelles pour gamma : */ proc transpose data=_regr_ out=_regrt_; %let np=%eval(&n*(&p-1)); %let nppl=%eval(&np+1); data _lib0_; length vv $8. ret $1.; data _lib1_;set _lib0_(obs=0); %let ctrlp=1; %do %while (&ctrlp<&p); %let ctrln=1; %do %while (&ctrln<=&n);

Texte de la macro page 8 / 18

Page 9: Télécharger la documentation (format Word)

data _libx_;set _lib0_; vv="&v&ctrln";ret="&ctrlp"; data _lib1_;set _lib1_ _libx_; %let ctrln=%eval(&ctrln+1); %end; %let ctrlp=%eval(&ctrlp+1); %end; data _lib1_;set _lib1_;_name_="delta "!!vv!!" (-"!!ret!!")"; keep _name_; %if (&dim=&np) %then %do; data _lib_;set _lib1_; %end; %else %do ; proc transpose data=_regr_ out=_regrs_; data _regrs_;set _regrs_; x1=substr(_name_,1,1);x3=substr(_name_,3,1); if (x1='D' and x3='V') then delete; data _lib2_;set _regrs_; keep _name_; data _lib_;set _lib1_ _lib2_; %end;

title6 ; title5 ; title4 ; title3 ; title2 ; title1 ;

proc iml;

reset storage=work._catmat_;

r=&r; %let rpl=%eval(&r+1);

n=&n;

use _regr_; read all var _all_ into z1; use _delt_; read all var _all_ into z0; use _nivp_; read all var _all_ into z2; q0=ncol(z0); q1=ncol(z1); q2=ncol(z2);

%if &amaj=non %then %do; amaj=i(n); %end; %else %do; use &amaj;read all var _all_ into amaj; %end; %if &h=non %then %do; h=i(q2); %end; %else %do; use &h;read all var _all_ into h; %end;

use _zwt_; read all var { _name_ } into listvar; tlistvar=t(listvar); use _nivpt_; read all var { _name_ } into compl; %let npl=%eval(&n+1);npl=&npl;

Texte de la macro page 9 / 18

Page 10: Télécharger la documentation (format Word)

%let dimmo=%eval(&dim-1); if q2>n then do; compl2=compl[ npl:nrow(compl),1]; labcol=t(listvar//compl2); end; else do; labcol=t(listvar); end; labcolt=t(labcol); t=nrow(z0);

b0=(inv(t(z1)*z1))*(t(z1)*z0); b2=(inv(t(z1)*z1))*(t(z1)*z2); r0=z0-z1*b0; r2=z2-z1*b2; s00=(1/t)*t(r0)*r0; s22=(1/t)*t(r2)*r2; s20=(1/t)*t(r2)*r0; s02=(1/t)*t(r0)*r2; sss=s20*inv(s00)*s02; %if (&amaj=non) %then %do; hsssh=t(h)*sss*h; hs22h=t(h)*s22*h; %end; %else %do; amaj1=amaj[1:ncol(amaj),]; ncapl=ncol(amaj)+1; amaj2=amaj[ncapl:nrow(amaj),]; bmaj2=i(nrow(amaj)-ncol(amaj)); bmaj1=inv(t(amaj1))*(-t(amaj2)*bmaj2); bmaj=bmaj1//bmaj2; sak=t(amaj)*s02; sab=t(amaj)*s00*bmaj; sbb=t(bmaj)*s00*bmaj; sbk=t(bmaj)*s02; skb=t(s02)*bmaj; rtilda=r0*t(t(amaj)-sab*inv(sbb)*t(bmaj)); rtildk=r2-r0*t(skb*inv(sbb)*t(bmaj)); skkb=(1/t)*t(rtildk)*rtildk; skab=(1/t)*t(rtildk)*rtilda; sakb=(1/t)*t(rtilda)*rtildk; saab=(1/t)*t(rtilda)*rtilda; hsssh=t(h)*skab*inv(saab)*t(skab)*h; hs22h=t(h)*skkb*h; %end; call geneig(lambda,vecpr,hsssh,hs22h); wx=ncol(hsssh); beta=h*vecpr[1:wx , 1:r]; w=t(s02*h*vecpr); %if &amaj=non %then %do; alpha=t(w[ 1:r, 1:n ]); %end; %else %do; psi=inv(t(amaj)*amaj)*sakb*beta; alpha=amaj*psi; %end; pi=beta*t(alpha); z3=z0-z2*pi; gammat=(inv(t(z1)*z1))*t(z1)*z3; gamma=t(gammat); residus=z3-z1*gammat; omega=(1/t)*t(residus)*residus; lambdmax=-T*log(j(nrow(lambda),1)-lambda); loglik&r=-(t/2)*log(det(s00))+(1/2)*trace(diag(lambdmax[1:r,])); logliknc=-(t/2)*log(det(s00))+(1/2)*trace(diag(lambdmax)); loglik=logliknc//loglik&r; lambdmax=lambdmax[1:n,];

Texte de la macro page 10 / 18

Page 11: Télécharger la documentation (format Word)

q2mo=q2-1;

%if &testwald=3 %then %do; k=i(q2)//((j(q2mo,1,1))||i(q2mo)); %end; %else %if &testwald=2 %then %do; k=((j(q2mo,1,1))||i(q2mo)); %end; %else %if &testwald=1 %then %do; k=i(q2); %end;

hv=h*vecpr; hvtr=hv[,&rpl:ncol(vecpr)]; dhat=diag(lambda[ 1:r,1 ]); %if %eval(&testwald)>0 %then %do; denom=inv(diag(vecdiag(k*hvtr*t(hvtr)*t(k)))); num=diag(vecdiag(k*beta*inv(inv(dhat)-i(&r)) *t(beta)*t(k))); wald=t*vecdiag(num*denom); %end;

/* forme bloc recursive partielle */ omega11=omega[1,1]; omega1a=omega[1,2:n]; omegas=omega[2:n,2:n]; cl2=-omega1a*inv(omegas); cl=j(1,1,1)//t(cl2);

betnorm=beta/beta[1,1]; alphnorm=alpha*beta[1,1]; alphcl=t(cl)*alphnorm; gammcl=t(cl)*gamma; clt=t(cl); resnorm=residus*cl;

create _res_ from resnorm; append from resnorm; close _res_;

alphct=t(alphcl); create _alphcl_ from alphct[ colname=labcolt ]; append from alphct; close _alphcl_;

gammclt=t(gammcl); create _gammcl_ from gammclt[ colname=tlistvar ]; append from gammclt; close _gammcl_;

betnormt=t(betnorm); create _betnor_ from betnormt[ colname=labcolt ]; append from betnormt; close _betnor_;

create _cl_ from clt[colname=tlistvar]; append from clt; close _cl_;

/* fin du calcul de la forme bloc-recursive */

%if %eval(&testwald)>0 %then %do; create _wald_ from wald; append from wald; close _wald_; %end;

Texte de la macro page 11 / 18

Page 12: Télécharger la documentation (format Word)

create _list_ from labcolt; append from labcolt; close _list_;

create _loglik_ from loglik; append from loglik; close _loglik_;

create _pi_ from pi[colname=labcolt]; append from pi; close _pi_;

create _gamma_ from gammat[ colname=tlistvar ]; append from gammat; close _gamma_;

create _lambda_ from lambda; append from lambda; close _lambda_;

talpha=t(alpha); create _alpha_ from talpha[ colname=labcolt ]; append from talpha; close _alpha_;

tbeta=t(beta); create _beta_ from tbeta[ colname=labcolt ]; append from tbeta; close _beta_;

create _rg_ from lambdmax; append from lambdmax; close _rg_;

create _resid_ from residus[ colname=tlistvar ]; append from residus; close _resid_;

store alpha beta gamma lambda residus z0 z1 z2 vecpr h; quit;

data _loglik_;set _loglik_;rename col1=loglik; length nb $10. ; if _n_=1 then nb="r=&n"; else if _n_=2 then nb="r=&r"; data _resid_;merge _zw_(keep=&range) _resid_; data _res_;merge _zw_(keep=&range) _res_; data _gamma_;merge _lib_ _gamma_;

data _rg_;set _rg_;length zz 3; zz=_n_-1;rename col1=lmax; yy=put(zz,$2.); proc sort data=_rg_ out=_rg_; by descending zz; data _rg_;set _rg_; h0="r <="!!yy; trace+lmax;

%if %eval(&testwald)>0 %then %do; data _wald_;set _wald_(rename=(col1=wald)); signif=1-probchi(wald,&r); %end;

data _list_;set _list_;rename col1=zz; data _list2_;set _list_(firstobs=2); length yy $8. ;

Texte de la macro page 12 / 18

Page 13: Télécharger la documentation (format Word)

yy="&v1"; length xx $19. ; xx=compress(yy)!!" + "!!zz; ww=yy!!" + "!!zz; data _list_;set _list_;length xx $19.;xx=zz; length ww $19. ;ww=zz;

%if &testwald=3 %then %do; data _list_;set _list_ _list2_;keep xx ww; %end; %if &testwald=2 %then %do; data _list_;set _list2_;keep xx ww; %end; %if &testwald=1 %then %do; data _list_;set _list_;keep xx ww; %end;

%if %eval(&testwald)>0 %then %do; data _wald_;merge _wald_ _list_; rename xx=test;%end;

%if (&n=2) %then %do; title1 "variables &v1 &v2 "; %end; %else %if (&n=3) %then %do; title1 "variables &v1 &v2 &v3"; %end; %else %if (&n=4) %then %do; title1 "variables &v1 &v2 &v3 &v4"; %end; %else %if (&n=5) %then %do; title1 "variables &v1 &v2 &v3 &v4 &v5"; %end; %else %if (&n=6) %then %do; title1 "variables &v1 &v2 &v3 &v4 &v5 &v6"; %end;

%if (&cas=0) %then %do; %if %eval(&nbaddniv*&nbaddreg)>0 %then %do; title2 "tableaux des var. suppl. ds niveaux et régresseurs : &addniv et &addreg "; %end; %else %do; %if &nbaddniv>0 %then %do; title2 "tableaux des var. suppl. ds niveaux : &addniv "; %end; %else %if &nbaddreg>0 %then %do; title2 "tableaux des var. suppl. ds régresseurs : &addreg "; %end; %end; %end;

data _lambda_;set _lambda_;rename col1=lambda;

proc print data=_rg_;id h0;var lmax trace; title4 "tests de la trace et du lambda max"; title3 "periode &debut &fin, &p retards, r=&r, cas &cas"; proc print data=_lambda_; title4 "valeurs propres"; proc print data=_loglik_;id nb; title4 "log-vraisemblance"; proc print data=_beta_; title4 "matrice beta (transposee)"; %if %eval(&testwald)>0 %then %do; proc print data=_wald_;id test;var wald signif; title4 "tests de signif. sur elements de beta";

Texte de la macro page 13 / 18

Page 14: Télécharger la documentation (format Word)

%end; proc print data=_alpha_; title4 "matrice alpha (transposee)"; proc print data=_gamma_; title4 "matrice gamma (transposee)"; proc print data=_pi_; title4 "matrice pi (transposee)"; %if (&impri=2) %then %do; proc print data=_betnor_; title4 "matrice beta normalisée"; proc print data=_alphcl_; title4 "matrice alpha normalisée"; data _gammcl_;set _gammcl_;drop _name_; data _gammcl_;merge _gammcl_ _gamma_(keep=_name_); proc print data=_gammcl_; title4 "matrice gamma normalisée"; proc print data=_cl_; title4 "termes courants"; %end;

proc transpose data=_alpha_ out=_alphat_ prefix=alpha; proc transpose data=_beta_ out=_betat_ prefix=beta; data _rg_;set _rg_; length debut 8. debuteff 8. fin 8. nb_retar 3. cas 3. var2 $8. ; debut=&debut; debuteff=&first; fin=&fin; nb_retar=&p; cas=&cas; data _lambda_;set _lambda_; length debut 8. debuteff 8. fin 8. nb_retar 3. cas 3. var2 $8. ; debut=&debut; debuteff=&first; fin=&fin; nb_retar=&p; cas=&cas; data _beta_;set _beta_; length debut 8. debuteff 8. fin 8. nb_retar 3. cas 3. var2 $8. ; debut=&debut; debuteff=&first; fin=&fin; nb_retar=&p; cas=&cas; data _alpha_;set _alpha_; length debut 8. debuteff 8. fin 8. nb_retar 3. cas 3. var2 $8. ; debut=&debut; debuteff=&first; fin=&fin; nb_retar=&p; cas=&cas; data _gamma_;set _gamma_; length debut 8. debuteff 8. fin 8. nb_retar 3. cas 3. var2 $8. ; debut=&debut; debuteff=&first; fin=&fin; nb_retar=&p; cas=&cas;

Texte de la macro page 14 / 18

Page 15: Télécharger la documentation (format Word)

data _loglik_;set _loglik_; length debut 8. debuteff 8. fin 8. nb_retar 3. cas 3. var2 $8. ; debut=&debut; debuteff=&first; fin=&fin; nb_retar=&p; cas=&cas; data _pi_;set _pi_; length debut 8. debuteff 8. fin 8. nb_retar 3. cas 3. var2 $8. ; debut=&debut; debuteff=&first; fin=&fin; nb_retar=&p; cas=&cas;

%if (&per<=4) %then %do;%let nb=5;%end; %else %do;%let nb=%eval(&per+2);%end;

%if &diagres=OUI %then %do; %let ctrln=1; %do %while (&ctrln<=&n); proc univariate data=_resid_ normal;id &range; var &&v&ctrln ; title4 "stats descriptives sur residus &v&ctrln "; %bp(intab=_resid_,v=&v&ctrln,ordre=&nb); data _bp&ctrln._;set _bp_; length debut 8. debuteff 8. fin 8. nb_retar 3. cas 3. var2 $8. ; debut=&debut; debuteff=&first; fin=&fin; nb_retar=&p; cas=&cas; %let ctrln=%eval(&ctrln+1); %end; %end;

/* recuperation des resultats (a supprimer) : */ data _alpha_;set _alpha_; rename &v1=alphav1 &v2=alphav2;

%if &diagres=OUI %then %do; proc transpose data=_bp1_ out=_bpt1_ prefix=sig1bp;var signif; by debut debuteff fin nb_retar cas;

proc transpose data=_bp2_ out=_bpt2_ prefix=sig2bp;var signif; by debut debuteff fin nb_retar cas; %end;

data _wald_;set _wald_;length xx $8. ; if substr(ww,10,1)='-' then do; xx="wd"!!substr(ww,12,6); end; else do; xx="wn"!!substr(ww,1,6); end;

proc transpose data=_wald_ out=_waldt_;id xx;var signif; data _waldt_;set _waldt_; length debut 8. debuteff 8. fin 8. nb_retar 3. cas 3. var2 $8. ; debut=&debut;

Texte de la macro page 15 / 18

Page 16: Télécharger la documentation (format Word)

debuteff=&first; fin=&fin; nb_retar=&p; cas=&cas;

data _rg1_;set _rg_(obs=1);rename lmax=lmax1 trace=trace1;

data _rg0_;set _rg_(firstobs=2);rename lmax=lmax0 trace=trace0;

proc transpose data=_gamma_ out=_gammat_ prefix=gamma; by debut debuteff fin nb_retar cas; var &v1;

data _recap_;merge _rg1_ _rg0_ _ _beta_ _alpha_ _gammat_ _loglik_ _waldt_; by debut debuteff fin nb_retar cas var2; %if &diagres=OUI %then %do; data _recap_;merge _recap_ _bpt1_ _bpt2_; by debut debuteff fin nb_retar cas; %end;

data _recap_;set _recap_;drop zz yy h0 _name_;

proc datasets library=work; delete _lib_ _libx_ _lib0_ _lib1_ _lib2_ _list_ _list2_ _nivp_ _nivpt_ _regr_ _regrs_ _regrt_ _xx_ _yy_ _zw_ _zwt_ _zz_; quit;

title6 ; title5 ; title4 ; title3 ; title2 ; title1 ;

%mend johansen;%include 'o:\mae\outils\economet\bp.txt'; /*

libname a 'c:\archive\offretr\donnees';data t1;set a.fr(keep=year);const=1;data t2;set a.fr(keep=year);trend=year-1959;run;data t3;merge t1 t2;;by year;run;%johansen(intab=a.fr,p=2,r=1,cas=0,impri=1, per=1,range=year,debut=1959,fin=1993, h=a.h5,diagres=non,testwald=3, v1=LOGLS,v2=LOGP4,v3=LOGL,addniv=non,addreg=t3, nbaddniv=0,nbaddreg=2);run; */

Texte de la macro page 16 / 18

Page 17: Télécharger la documentation (format Word)

Annexe n°2 :exemple de sorties de la macro Johansen

variables LOGLS LOGP4 LOGL 1 tableaux des var. suppl. ds régresseurs : t3 periode 1959 1993, 2 retards, r=1, cas 0 15:48 Wednesday, July 29, 1998

H0 LMAX TRACE

r <= 1 10.9809 10.9809 r <= 0 21.0388 32.0197

variables LOGLS LOGP4 LOGL 2 tableaux des var. suppl. ds régresseurs : t3 periode 1959 1993, 2 retards, r=1, cas 0 valeurs propres 15:48 Wednesday, July 29, 1998

OBS LAMBDA

1 0.47141 2 0.28305

variables LOGLS LOGP4 LOGL 3 tableaux des var. suppl. ds régresseurs : t3 periode 1959 1993, 2 retards, r=1, cas 0 log-vraisemblance 15:48 Wednesday, July 29, 1998

NB LOGLIK

r=3 581.698 r=1 576.208

variables LOGLS LOGP4 LOGL 4 tableaux des var. suppl. ds régresseurs : t3 periode 1959 1993, 2 retards, r=1, cas 0 matrice beta (transposee) 15:48 Wednesday, July 29, 1998

OBS LOGLS LOGP4 LOGL

1 143.198 -61.2368 -81.9615

Exemple de sorties page 17 / 18

Page 18: Télécharger la documentation (format Word)

variables LOGLS LOGP4 LOGL 5 tableaux des var. suppl. ds régresseurs : t3 periode 1959 1993, 2 retards, r=1, cas 0 tests de signif. sur elements de beta 15:48 Wednesday, July 29, 1998

TEST WALD SIGNIF

LOGLS 221084.75 .00000000 LOGP4 12.73 .00035988 LOGL 23.64 .00000116 LOGLS + LOGP4 23.64 .00000116 LOGLS + LOGL 12.73 .00035988

variables LOGLS LOGP4 LOGL 6 tableaux des var. suppl. ds régresseurs : t3 periode 1959 1993, 2 retards, r=1, cas 0 matrice alpha (transposee) 15:48 Wednesday, July 29, 1998

OBS LOGLS LOGP4 LOGL

1 -.0019464 .00051153 -.00096970

variables LOGLS LOGP4 LOGL 7 tableaux des var. suppl. ds régresseurs : t3 periode 1959 1993, 2 retards, r=1, cas 0 matrice gamma (transposee) 15:48 Wednesday, July 29, 1998

OBS _NAME_ LOGLS LOGP4 LOGL

1 delta LOGLS (-1) -0.01016 -0.14788 -0.39729 2 delta LOGP4 (-1) 0.31831 0.37731 0.62771 3 delta LOGL (-1) -0.06971 -0.05349 0.40975 4 CONST -0.03922 0.02111 -0.02218 5 TREND 0.00060 -0.00036 0.00030

variables LOGLS LOGP4 LOGL 8 tableaux des var. suppl. ds régresseurs : t3 periode 1959 1993, 2 retards, r=1, cas 0 matrice pi (transposee) 15:48 Wednesday, July 29, 1998

OBS LOGLS LOGP4 LOGL

1 -0.27872 0.073250 -0.13886 2 0.11919 -0.031324 0.05938 3 0.15953 -0.041926 0.07948

Exemple de sorties page 18 / 18