• Nenhum resultado encontrado

Código de programação do método Stepwise

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 &macroVariavel;

*;

*Inicialização; %LET FINAL=;

*;

*Associa EXCLUSIVAMENTE a Macro à análise do ficheiro A_BASE;

%avalNumVarMacroVar(MacroVar=&macroVariavel)run; *->>>>>>MACRO18; %LET Elementos=&nVarMacro;

*;

%LET I=1;

73

%LET varX=%SCAN(&macroVariavel,&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";

Documentos relacionados