7. APÊNDICE
7.2. Código de programação do método Stepwise
O código de Programação é composto por 3 blocos de código:
1. “0.TESE_Criar biblioteca.sas” – Criação de biblioteca (pasta ou directório) de repositório da informação utilizada (informação base e tabelas geradas pelo programa).
2. “0.TESE_Importar_Amostra.sas” – Importação da informação contida no ficheiro
Excel (variáveis explicada e explicativas para análise pelo programa) para tabelas
SAS que são armazenadas na biblioteca definida no primeiro bloco.
3. “1.TESE_StepWise.sas” – Execução do método StepWise de selecção de variáveis explicativas para a classificação de rating.
Apresenta-se nos pontos seguintes o detalhe do código desenvolvido. 0.TESE_Criar biblioteca.sas
%macro Bibliotecas();
libname STEP "C:\Documents and Settings\davide.silva\My Documents\CONSULT\_SUPORTES Consult\01_MESTRADO\TESE\TESE - Programas\Bibliotecas SAS\Step";
%mend;
%bibliotecas;
0.TESE_Importar_Amostra.sas
**** Importar informação do ficheiro Excel *******;
*Importar Base de Dados - Amostra C para construção do Modelo; PROC IMPORT OUT= Step.A_Base
DATAFILE= "C:\Documents and Settings\davide.silva\My Documen ts\CONSULT\_SUPORTES Consult\01_MESTRADO\TESE\20110510 - TESE EXEMPLO2.xls" DBMS=EXCEL REPLACE; SHEET="'5#Amostra$'"; GETNAMES=YES; MIXED=NO; SCANTEXT=YES; USEDATE=YES; SCANTIME=YES; RUN;
64
PROC IMPORT OUT= Step.A_InfoPasso_Tipo
DATAFILE= "C:\Documents and Settings\davide.silva\My Documen ts\CONSULT\_SUPORTES Consult\01_MESTRADO\TESE\20110510 - TESE EXEMPLO2.xls" DBMS=EXCEL REPLACE; SHEET="'5#InfoPasso_Tipo$'"; GETNAMES=YES; MIXED=NO; SCANTEXT=YES; USEDATE=YES; SCANTIME=YES; RUN;
*Importar tabela para construção da análise do critério de Akaike em cada passo do processo;
PROC IMPORT OUT= Step.A_Passo_AIC_Tipo
DATAFILE= "C:\Documents and Settings\davide.silva\My Documen ts\CONSULT\_SUPORTES Consult\01_MESTRADO\TESE\20110510 - TESE EXEMPLO2.xls" DBMS=EXCEL REPLACE; SHEET="'5#Passo_AIC_Tipo$'"; GETNAMES=YES; MIXED=NO; SCANTEXT=YES; USEDATE=YES; SCANTIME=YES; RUN;
*Importar matriz de correlações entre variáveis; PROC IMPORT OUT= Step.A_Correl
DATAFILE= "C:\Documents and Settings\davide.silva\My Documen ts\CONSULT\_SUPORTES Consult\01_MESTRADO\TESE\20110510 - TESE EXEMPLO2.xls" DBMS=EXCEL REPLACE; SHEET="'5#Correl_Bin$'"; GETNAMES=YES; MIXED=NO; SCANTEXT=YES; USEDATE=YES; SCANTIME=YES; RUN;
*Importar Matriz de sinais teóricos das variáveis; PROC IMPORT OUT= Step.A_Sinais
DATAFILE= "C:\Documents and Settings\davide.silva\My Documen ts\CONSULT\_SUPORTES Consult\01_MESTRADO\TESE\20110510 - TESE EXEMPLO2.xls" DBMS=EXCEL REPLACE; SHEET="'5#Sinais$'"; GETNAMES=YES; MIXED=NO; SCANTEXT=YES; USEDATE=YES; SCANTIME=YES; RUN;
*Importar tabela de classificação das variáveis explicativas entre categoricas e contínuas;
PROC IMPORT OUT= Step.A_Tipo_Variavel
DATAFILE= "C:\Documents and Settings\davide.silva\My Documen ts\CONSULT\_SUPORTES Consult\01_MESTRADO\TESE\20110510 - TESE EXEMPLO2.xls" DBMS=EXCEL REPLACE;
SHEET="'5#Tipo_Variavel$'"; GETNAMES=YES;
65 SCANTEXT=YES; USEDATE=YES; SCANTIME=YES; RUN; 1.TESE_StepWise.sas
*MACROS deste procedimento:
; *MACRO1 -> createMacro_namesOfVars ; *MACRO2 -> obterVarName ; *MACRO3 -> N_obs_AND_vars ; *MACRO4 -> actualizaPasso ; *MACRO5 -> seleccionarModelo ; *MACRO6 -> Logistica ; *MACRO7 -> getInformacao ; *MACRO8 -> validarTendencia ; *MACRO9 -> analizaCorrel ; *MACRO10 -> testeWald ; *MACRO11 -> getVarType ; *MACRO12 -> removeVarFromMacroVar ; *MACRO13 -> getInformacao ; *MACRO14 -> decisaoPassoAIC ; *MACRO15 -> actualizaModelo ; *MACRO16 -> updateModelo ; *MACRO17 -> finalizeProcess ; *MACRO18 -> avalNumVarMacroVar ; ************************** MACRO18 ********************************************;
*Esta Macro permite averiguar o número de variáveis referenciadas numa Macro-Variável;
*Ex: X= V1 V2 --- nVarMacro=2;
%MACRO avalNumVarMacroVar(MacroVar); * Determinar número de elementos
de MacroVar; *Inicialização; %LET nVarMacro=;
66
%LET X= ;
*Depuração dessas situações; %IF &X=&MacroVar %then
%LET nVarMacro=0;
%ELSE
%DO;
*A_Base é a BD que contém TODAS as variáveis;
data Step.Var_MacroVar(keep=&MacroVar); set Step.A_Base;
run;
proc Transpose Data=Step.Var_MacroVar NAME=_NAME_ OUT=Step.Var_MacroVar2 (Keep=_Name_);
run;
Data _NULL_;
set Step.Var_MacroVar2;
Call Symput('nVarMacro',_N_); run;
*** Limpeza de DataSets ***;
proc datasets library=Step;
delete Var_MacroVar Var_MacroVar2; run;
*************; %END;
*** Limpeza de DataSets ***;
proc datasets library=Step;
delete Var_macrovar Var_macrovar2; run;
%PUT A Macro-Variável &MacroVar faz referência a &nVarMacro variáveis ;
*"nVarMacro" contém o número de variáveis; %MEND avalNumVarMacroVar;
************************** FIM MACRO18 *****************************************; ************************** MACRO17
*********************************************;
** FINAL PROCESSO ************************************ BD_Base com VAR MODELO *********;
* --- Ordenada segundo entrada Variáveis no Modelo + EXPORTAÇÕES --- --- *;
*************************************************************************** ************;
%MACRO finalizeProcess;
* --- ; * TASK 1: Criação de Dataset com ordenação de Saída do modelo; * --- ;
%avalNumVarMacroVar(&varModelo)run; *->>>>>>MACRO18; *Inicializações;
%LET I=1;
proc sort Data=Step.A_Base; BY &Index;run;
Data Step.BD_Modelo(keep=&Index &Score); set Step.A_Base;run;
*Processo de Construção;
%DO %WHILE (&I le &nVarMacro);
%LET V=%SCAN(&varModelo,&I);
Data Step.X_BD_Modelo(keep=&Index &V); set Step.A_Base;
run;
Data Step.BD_Modelo;
67
BY &Index; run;
%LET I=%EVAL(&I+1);
proc datasets library=Step; delete X_BD_Modelo; run;
%END;
* --- ; * TASK 2: Exportação de Ficheiros Relevantes;
* --- ; * Convergencia do criterio maxima verosimilhança;
proc export Data=Step.Log_ConvergenceStatus
Outfile="C:\Documents and Settings\davide.silva\My
Documents\CONSULT\_SUPORTES Consult\01_MESTRADO\TESE\TESE - Programas\0- Convergencia"
DBMS=Excel2000 REPLACE; run;
* Exportações dos InfoPassos;
proc export Data=Step.Log_InfoPasso_Total
Outfile="C:\Documents and Settings\davide.silva\My
Documents\CONSULT\_SUPORTES Consult\01_MESTRADO\TESE\TESE - Programas\2- Infopassos"
DBMS=Excel2000 REPLACE; run;
* Exportação da InfoAIC;
proc export Data=Step.Info_AIC
Outfile="C:\Documents and Settings\davide.silva\My
Documents\CONSULT\_SUPORTES Consult\01_MESTRADO\TESE\TESE - Programas\1- Infopasso_AIC"
DBMS=Excel2000 REPLACE; run;
* Exportação da BD ordenada;
proc export Data=Step.BD_Modelo
Outfile="C:\Documents and Settings\davide.silva\My
Documents\CONSULT\_SUPORTES Consult\01_MESTRADO\TESE\TESE - Programas\3- BD_Modelo"
DBMS=Excel2000 REPLACE; run;
* Exportação da Informação de Modelo Final Seleccionado;
proc export Data=Step.Log_fitstatistics
Outfile="C:\Documents and Settings\davide.silva\My
Documents\CONSULT\_SUPORTES Consult\01_MESTRADO\TESE\TESE - Programas\4- Log_fitstatistics"
DBMS=Excel2000 REPLACE; run;
proc export Data=Step.Log_globaltests
Outfile="C:\Documents and Settings\davide.silva\My
Documents\CONSULT\_SUPORTES Consult\01_MESTRADO\TESE\TESE - Programas\4- Log_globaltests"
DBMS=Excel2000 REPLACE; run;
proc export Data=Step.Log_modelinfo
Outfile="C:\Documents and Settings\davide.silva\My
Documents\CONSULT\_SUPORTES Consult\01_MESTRADO\TESE\TESE - Programas\4- Log_modelinfo"
DBMS=Excel2000 REPLACE; run;
68
Outfile="C:\Documents and Settings\davide.silva\My
Documents\CONSULT\_SUPORTES Consult\01_MESTRADO\TESE\TESE - Programas\4- Log_parameterestimates"
DBMS=Excel2000 REPLACE; run;
proc export Data=Step.Log_TypeIII
Outfile="C:\Documents and Settings\davide.silva\My
Documents\CONSULT\_SUPORTES Consult\01_MESTRADO\TESE\TESE - Programas\4- Log_TypeIII" DBMS=Excel2000 REPLACE; run; * --- ; %MEND finalizeProcess; ************************** FIM MACRO17 *****************************************; ************************** MACRO16 *********************************************;
* Actualiza macroVar "varPasso" e "varForaPasso", "newAIC" e "oldAIC"; %MACRO updateModelo;
*;
%LET varModelo=&varPasso;
%LET varFora=&varForaPasso;
%PUT *******************************************************************;
%PUT * Passo &Passo ****** FOI EFECTUADO!! ***** AIC=&newAIC ****************;
%PUT *******************************************************************;
%PUT * Modelo: &varModelo ******;
%PUT * Fora do Modelo: &varFora ******;
%PUT *******************************************************************; *; %LET oldAIC=&newAIC; %LET newAIC=; *; %MEND updateModelo; ************************** FIM MACRO16 *****************************************; ************************** MACRO15 *********************************************;
*Esta Macro permite actualizar o modelo, consoante a variável introduzida/removida;
*através de alteração das Macro-Variáveis: varFora e varModelo;
%MACRO actualizaModelo; * Recalcula o Modelo Escolhido e Prossegue; *;
*Inicialização das variáveis;
%LET varPasso=;%LET varForaPasso=;
*;
%PUT No Passo &Passo decidiu-se pela inclusão da Variável: &varToEnter;
*;
*Adiciona-se a Variável às variáveis do modelo no passo anterior; %LET varPasso=&varModelo &varToEnter;
%PUT Assim, o modelo é composto por: varPasso= &varPasso;
*;
*Inicia-se varForaPasso como as últimas variáveis fora excepto a que entra; %LET varForaPasso=&varFora;
*;
69
%removeVarFromMacroVar(varToRemove=&varToEnter,macroVariavel=&varFora);run;
*->>>>>>MACRO12;
%LET varForaPasso=&FINAL;
%PUT Logo, fora do modelo estão: varForaPasso= &varForaPasso;
*;
*Corre-se o procedimento da Logística para depois aplicar teste Wald;
%Logistica(BDAnalise=Step.A_Base,studyVar=&varPasso,indicaCateg=&Categ) run; *->>>>>>MACRO6;
*;
%LET varOUT=;
%testeWald(MaxWALD=&p_Wald_max,studyVar=&varPasso);run; *->>>>>>MACRO10; *...a macro-var "varOUT" contém as variáveis não significativas do passo; %LET varToGetOut=&varOUT;
*Indicação das variáveis não significativas; %PUT Variáveis Não Significativas: &varToGetOut;
*; *;
* SAÍDA DE VARIÁVEIS NÃO SIGNIFICATIVAS DO MODELO... APLICÁVEL PARA PASSO >= 2;
%IF &Passo gt 1 %THEN %do;
* Determinação de quantas se tem que eliminar; %LET nVarMacro=;
%avalNumVarMacroVar(MacroVar=&varToGetOut)run; *->>>>>>MACRO18; %LET nVarGetOut=&nVarMacro;
%LET K=1;
%DO %WHILE(&K le &nVarGetOut);
%LET X=%SCAN(&varToGetOut,&K);
%LET FINAL=;
%removeVarFromMacroVar(varToRemove=&X,macroVariavel=&varPasso);run;
*->>>>>>MACRO12;
%LET varPasso=&FINAL;
%LET varForaPasso=&varForaPasso &X;
%LET K=%EVAL(&K+1);
%END;
*Visualização;
%PUT No Passo &Passo: Var. no Modelo:&varPasso, Var. Fora Modelo:&varForaPasso;
%end;
*;
*Indica-se no InfoPasso_(...) qual a situação seleccionada;
data Step.Infopasso_&Passo; set Step.Infopasso_&Passo; if varIN="&varToEnter" then
Seleccionada="X"; run;
*;
* Recalcula-se o modelo sobre varPasso para determinar o REAL valor de AKAIKE após WALD;
%LET newAIC=;
%Logistica(BDAnalise=Step.A_Base,studyVar=&varPasso,indicaCateg=&Categ) run; *->>>>>>MACRO6;
%LET newAIC=&AIC;
%PUT newAIC: &newAIC;
*;
*** CHAMADA AO PROCEDIMENTO DE DECISÃO ***********; %LET decisaoAIC=;
70
%PUT decisaoAIC: &decisaoAIC;
* "decisaoAIC"=1 - Segue, "decisaoAIC"=0 - Stop;
*O AIC entra no processo de decisão se o passo indicado pelo utilizador foi atingido;
%IF &Passo le &PassoActivAIC %THEN %DO;
%LET decisaoAIC=1;
%END;
*;
%IF &decisaoAIC eq 1 %then %DO; %updateModelo;run; *->>>>>>MACRO16; %END; %ELSE %DO; %Logistica(BDAnalise=Step.A_Base,studyVar=&varModelo,indicaCateg=&Cat eg)run; *->>>>>>MACRO6;
%PUT STOP! O AIC não sofreu um decréscimo
(newAIC=&newAIC>=oldAIC=&oldAIC).;
%PUT Passo não deve ser efectuado. PARAR STEPWISE!!!!!!!!!!;
%END; *; %MEND actualizaModelo; ************************** FIM MACRO15 *****************************************; ************************** MACRO14 *********************************************;
*Analisa situação indicando na MacroVar "decisaoAIC" se o passo deve ser dado (1)
*ou não (0). Esta macroVariável indicará se se deve ou não prosseguir; %MACRO decisaoPassoAIC; * Permite verificar se o AKAIKE decresce entre Passos;
*;
%PUT O AIC do Passo anterior foi &oldAIC. Neste Passo (&Passo) é &newAIC;
*;
%LET decisaoAIC=0;
*;
%IF (&newAIC lt &oldAIC) OR (&Passo eq 1) %THEN
%LET decisaoAIC=1;
*;
*decisaoAIC= 1-SIM e 0-NãO;
%PUT Efectua-se o passo? decisaoAIC: &decisaoAIC;
*Coloca informação no Dataset InfoAIC;
data Step.PassoAIC; set Step.A_passo_AIC_Tipo; if Passo=999 then do Passo=&Passo; if &Passo eq 1 then AIC_anterior=.; else AIC_anterior="&oldAIC"; AIC_passo="&newAIC"; end;
71
run;
*;
data Step.Info_AIC;
set Step.Info_AIC Step.PassoAIC; run;
*;
proc datasets library=Step; delete PassoAIC; run; *; %MEND decisaoPassoAIC; ************************** FIM MACRO14 *****************************************; ************************** MACRO13 *********************************************;
*Esta Macro reúne a informação importante dos outputs da logística; *confinando-a em tabelas 'InfoPasso_(nº passo);
%MACRO getInformacao; * Constrói Ficheiros Informativos de Cada Passo; ******************************;
*Inicialização;
%LET AIC=;%LET _2LogVero=;
**************************************************************; *** Obter Quadro resumo e valores que permitirão a decisão ***;
data Step.X_info(keep=Passo); set Step.Log_fitstatistics; Passo=_N_;
if Criterion eq 'AIC' then
call Symput ('AIC',InterceptAndCovariates);
if Criterion eq '-2 Log L' then
call Symput ('_2LogVero',InterceptAndCovariates);
run;
%PUT AIC=&AIC e Verosimilhança=&_2LogVero;
*;
*Colocá-las numa linha informativa do Passo;
data Step.X_info2;
set Step.X_info Step.infoPasso_&Passo; run;
*;
*---; *VALIDAÇÃO DOS SINAIS DOS COEF. DO MODELO; *---;
%validarTendencia run; *->>>>>>MACRO8;
*...se sinalOK=1 tudo bem, mas se for =0 o modelo contraria teoria económica;
%PUT SinalOK= &sinalOK;
*;
*VALIDAÇÃO DE CORRELAÇÕES ENTRE VARIÁVEIS DO MODELO; *---;
%analizaCorrel(studyVar=&varTeste,BDcorrel=Step.A_Correl)run; *- >>>>>>MACRO9;
*Se correlSTATUS=0 o modelo é válido... senão assume o valor 1; %PUT correlSTATUS= &correlSTATUS;
*;
*---;
*APLICAÇÃO DOS TESTES DE WALD SOBRE VARIÁVEIS MODELO; *---;
%testeWald(MaxWALD=&p_Wald_max,studyVar=&varTeste);run; *->>>>>>MACRO10; *...a macro-var "varOUT" contém as variáveis não significativas do passo; %PUT Variáveis Não-Significativas: &varOUT;
72
*---;
data Step.X_info3; set Step.X_info2;
*Selecção de apenas 1 linha;
Where Passo=1 and varIN=""; Variaveis_Modelo="&varModelo"; AIC="&AIC"; _2LogVero="&_2LogVero"; varIn="&varIn"; naoSignif="&varOUT"; Passo=Passo*&Passo; if &sinalOK eq 1 then Tend_Validas="Sim"; if &sinalOK eq 0 then Tend_Validas="Não"; if &correlSTATUS eq 1 then Correl_Validas="Não"; if &correlSTATUS eq 0 then Correl_Validas="Sim"; run; *---; data Step.infoPasso_&Passo;
set Step.infoPasso_&Passo Step.X_info3; run;
*---; *** Limpeza de DataSets ***;
proc datasets library=Step; delete X_info X_info2 X_info3; run; *******************; %MEND getInformacao; ************************** FIM MACRO13 *****************************************; ************************** MACRO12 *********************************************; * --- ---- *;
* Macro que permite eliminar instanciação de UMA variável de uma Macro- Variável *;
* Ex: X= V1 V2 V3 --- (elim. V2) --- X= V1 V3 *;
* --- ---- *;
%MACRO removeVarFromMacroVar(varToRemove,macroVariavel); * Remover Var de MacroVar;
*;
%PUT Deseja eliminar instanciação de &varToRemove de ¯oVariavel;
*;
*Inicialização; %LET FINAL=;
*;
*Associa EXCLUSIVAMENTE a Macro à análise do ficheiro A_BASE;
%avalNumVarMacroVar(MacroVar=¯oVariavel)run; *->>>>>>MACRO18; %LET Elementos=&nVarMacro;
*;
%LET I=1;
73
%LET varX=%SCAN(¯oVariavel,&I);
%IF &varX eq &varToRemove %THEN %LET I=%EVAL(&I+1);
%ELSE
%DO;
%LET FINAL=&FINAL &varX;
%LET I=%EVAL(&I+1);
%END;
%END;
*;
%PUT A Macro-Variável obtida, após eliminação de &varToRemove, é &FINAL;
*; %MEND removeVarFromMacroVar; ************************** FIM MACRO12 *****************************************; ************************** MACRO11 *********************************************;
*Classifica uma variável dada como input como Categórica/Não Categórica; *Ex: Qual o tipo de Var1? - - - &Tipo_Var=Categórica;
%MACRO getVarType(varName); * Obter tipo Variável (Categ/Não Categ);
*---; %LET Tipo_Var=;
*---;
data Step.X_varType_Draft1; set Step.A_Tipo_Variavel; where Variavel eq "&varName"; run;
*---;
proc sort DATA=Step.X_varType_Draft1; BY Variavel;run;
*---;
data _NULL_;
set Step.X_varType_Draft1; Array r{1} Tipo;
call Symput('Tipo_Var',r(1)); run;
*---;
%PUT A variável é do tipo &Tipo_Var;
*--- --; *** Limpeza de DataSets ***;
proc datasets library=Step; delete X_vartype_draft1; run; *---; %MEND getVarType; ************************** FIM MACRO11 *****************************************; ************************** MACRO10 *********************************************;
* ANÁLISE WALD - Incluindo na MacroVar "varOUT" as Não Signif. *********; %MACRO testeWald(MaxWALD,studyVar); * Efectua Testes de Wald sobre um Modelo;
*;
*FASE 0: Generalidades necessárias à análise; *---; *Obtenção do número de variáveis do modelo;
%avalNumVarMacroVar(MacroVar=&studyVar);run; *->>>>>MACRO18; %LET numVarIN=&nVarMacro;
74
*;
*---;
*FASE 1: Verificar se Existem Variáveis Categóricas no Modelo. A análise é distinta:
- Sim Existem! - A análise tem por base o ficheiro Log_TypeIII - Não Existem! - A análise tem por base o ficheiro
Log_parameterestimates;
**************************** Averiguação da Existência de Var Categóricas *** INICIO;
%LET existCateg=N;
%LET J=1;
%DO %WHILE (&J le &numVarIN);
%LET Var=%Scan(&studyVar,&J);
%getVarType(varName=&Var);run; *->>>>>>>>MACRO11; %PUT &Var é do tipo &Tipo_Var;
%IF &Tipo_Var ne Contínua %THEN %DO;
%LET existCateg=S;
%LET J=&numVarIN;
%END;
%LET J=%EVAL(&J+1);
%END;
******************************* Averiguação da Existência de Var Categóricas *** FIM;
*;
****************************** Selecção do Ficheiro a utilizar na análise *** INICIO;
%IF &existCateg eq S %THEN %DO;
data Step.Wald_Data1(keep=Variable ProbChiSq); set Step.Log_TypeIII;
where Variable ne "Intercept"; run;
%END;
%ELSE
%DO;
data Step.Wald_Data1(keep=Variable ProbChiSq); set Step.Log_parameterestimates;
where Variable ne "Intercept"; run;
%END;
********************************* Selecção do Ficheiro a utilizar na análise *** FIM;
*;
*FASE 2: Análise de Wald Propriamente Dita; *;
****************************** Teste de Wald sobre cada Variável Modelo *** INICIO;
%LET varOUT=; *inicialização;
%LET pValueWald=0;
%LET J=1;
%DO %WHILE (&J le &numVarIN);
%LET Var=%Scan(&studyVar,&J);
*;
data _NULL_;
set Step.Wald_data1;
if Variable eq "&Var" then
call symput ('pValueWald',ProbChiSq);
run;
75
%IF &pValueWald gt &MaxWALD %THEN %DO;
%LET varOUT=&varOUT &Var;
%END;
%LET J=%EVAL(&J+1);
%END;
********************************* Teste de Wald sobre cada Variável Modelo *** FIM;
*;
**** A Macro Variável "varOUT" contém indicação das variáveis não signif. ****;
%PUT As variáveis não significativas deste modelo: &varOUT;
*;
*** Limpeza de DataSets *** União de Resultados ***;
proc datasets library=Step; delete Wald_Data1; run; *; %MEND testeWald; ************************** FIM MACRO10 *****************************************; ************************** MACRO9 *********************************************;
*Macro que averigua se as variáveis em análise são correlacionadas; *"correlSTATUS" guarda info (sim=1/não=0) se existe correlação entre as variáveis;
%MACRO analizaCorrel(studyVar,BDcorrel); *Analisa correlação entre var modelo; *; *Inicialização de MacroVariáveis; %LET correlStatus=0; %LET sumCorrel=0; %LET nVarCorrel=0; *; *Cópia;
data Step.X_Correl(keep=Correl &studyVar); set &BDcorrel;
run;
*;
*Selecção das variáveis;
proc Transpose Data=Step.X_Correl NAME=_NAME_ OUT=Step.X_Correl2 (Keep=_Name_); run; *; data Step.X_Correl3(keep=Correl); set Step.X_Correl2; Correl=_Name_; run; *;
*Construção da matriz pequena (#studyvar)x(#studyvar);
data Step.X_Correl4;
merge Step.X_Correl3(in=a) Step.X_Correl(in=b); BY Correl;
if a and b then output Step.X_Correl4; run;
*;
proc sort Data=Step.X_Correl3; BY Correl;run;
proc sort Data=Step.X_Correl; BY Correl;run;
76
*;
*Obtenção da soma dos elementos da matriz;
proc sort DATA=Step.X_Correl4; BY Correl;run;
proc means DATA=Step.X_Correl4 NOPRINT;
output out=Step.X_Correl5(Drop=_TYPE_ _FREQ_) sum=; run;
proc Transpose Data=Step.X_Correl5 NAME=_NAME_ OUT=Step.X_Correl6(keep=COL1);
run;
proc sort DATA=Step.X_Correl6; BY COL1;run;
proc means DATA=Step.X_Correl6 NOPRINT;
output out=Step.X_Correl7(Drop=_TYPE_ _FREQ_) sum=; run;
data _NULL_;
set Step.X_Correl7;
*MacroVariável que contém a soma dos elementos da matriz;
call symput('sumCorrel',COL1); run;
*;
*Determinação do número de variáveis em análise;
%avalNumVarMacroVar(MacroVar=&studyVar)run; *->>>>>>MACRO18; %Let nVarCorrel=&nVarMacro;
*;
*DECISÃO ACERCA DAS CORRELAÇÕES (&correlSTATUS);
* Se soma dos elementos da submatriz é igual ao número de variáveis em análise
*(situação correspondente a uma matriz identidade), não existe correlação entre
* as variáveis. Caso seja superior as variáveis estão correlacionadas; %IF &sumCorrel gt &nVarCorrel %THEN
%LET correlSTATUS=1;
*;
*** Limpeza de DataSets *** União de Resultados ***;
proc datasets library=Step;
delete X_correl X_correl2 X_correl3 X_correl4 X_correl5 X_correl6 X_correl7;
run; *; %MEND analizaCorrel; ************************** FIM MACRO9 *****************************************; ************************** MACRO8 *********************************************;
*Esta Macro "olha" para SINAL COEF. e verifica se estão de acordo com a *teoria económica. Para isso compara com o sinal indicado em A_Sinais;
%MACRO validarTendencia; * Verifica se tendências coincidem com Teo.
Económica;
*sinalOK - indica se a tendência é concordante (1) ou não (0); %LET sinalOK=1;
*---;
Data Step.X_ModeloAnalise(Drop=ClassVal0 DF); set Step.Log_parameterestimates;
Where Variable ne 'Intercept'; run;
proc Sort DATA=Step.X_ModeloAnalise; BY Variable;run;
77
Data Step.X_Sinais; set Step.A_Sinais; Variable=Variavel; run;
proc Sort DATA=Step.X_Sinais; BY Variable; run;
*---;
*NOTA: Processo "merge" é CAPS Sensitive; *---;
Data Step.X_ModeloAnalise2(Drop=Variavel); merge Step.X_ModeloAnalise Step.X_Sinais; BY Variable; run; Data Step.X_ModeloAnalise3; set Step.X_ModeloAnalise2; where Estimate ne .; run; *---; *Análise variável a variável;
Data Step.X_ModeloAnalise4; set Step.X_ModeloAnalise3;
*Se a variável é significativa e Sinal Real*Teórico é negativo - NÃO OK!;
IF (ProbChiSq lt &p_Wald_max) AND (Estimate*Sinal lt 0) THEN Verify='XX'; ELSE Verify='ok'; run; *---;
*Análise e Passagem para a MACRO-VARIÁVEL;
data _NULL_;
set Step.X_ModeloAnalise4; if Verify = 'XX' then
call Symput('sinalOK',0); run;
*---; *** Limpeza de DataSets ***;
proc datasets library=Step;
delete X_modeloanalise X_modeloanalise2 X_modeloanalise3 X_modeloanalise4 X_Sinais; run; *---; %MEND validarTendencia; ************************** FIM MACRO8 *****************************************; ************************** MACRO7 ********************************************;
*Esta Macro reúne a informação importante dos outputs da logística; *confinando-a em tabelas 'InfoPasso_(nº passo);
%MACRO getInformacao; * Constrói Ficheiros Informativos de Cada Passo; ******************************;
*Inicialização;
%LET AIC=; %LET _2LogVero=;
**************************************************************; *** Obter Quadro resumo e valores que permitirão a decisão ***;
data Step.X_info(keep=Passo); set Step.Log_fitstatistics; Passo=_N_;
78
if Criterion eq 'AIC' then
call Symput ('AIC',InterceptAndCovariates);
if Criterion eq '-2 Log L' then
call Symput ('_2LogVero',InterceptAndCovariates);
run;
%PUT AIC=&AIC e Verosimilhança=&_2LogVero;
*;
*Colocá-las numa linha informativa do Passo;
data Step.X_info2;
set Step.X_info Step.infoPasso_&Passo; run;
*;
*---; *VALIDAÇÃO DOS SINAIS DOS COEF. DO MODELO; *---;
%validarTendencia run; *->>>>>>>MACRO8;
*...se sinalOK=1 tudo bem, mas se for =0 o modelo contraria teoria económica;
%PUT SinalOK= &sinalOK;
*;
*VALIDAÇÃO DE CORRELAÇÕES ENTRE VARIÁVEIS DO MODELO; *---;
%analizaCorrel(studyVar=&varTeste,BDcorrel=Step.A_Correl)run; *- >>>>>MACRO9;
*Se correlSTATUS=0 o modelo é válido... senão assume o valor 1; %PUT correlSTATUS= &correlSTATUS;
*;
*---;
*APLICAÇÃO DOS TESTES DE WALD SOBRE VARIÁVEIS MODELO; *---;
%testeWald(MaxWALD=&p_Wald_max,studyVar=&varTeste);run; *->>>>>>>MACRO10; *...a macro-var "varOUT" contém as variáveis não significativas do passo; %PUT Variáveis Não-Significativas: &varOUT;
*;
*---;
data Step.X_info3; set Step.X_info2;
*Selecção de apenas 1 linha;
Where Passo=1 and varIN=""; Variaveis_Modelo="&varModelo"; AIC="&AIC"; _2LogVero="&_2LogVero"; varIn="&varIn"; naoSignif="&varOUT"; Passo=Passo*&Passo; if &sinalOK eq 1 then Tend_Validas="Sim"; if &sinalOK eq 0 then Tend_Validas="Não"; if &correlSTATUS eq 1 then Correl_Validas="Não";