10 oct 2015

Trabajando la Encuesta Nacional de Fuerza de Trabajo: un ejemplo aplicado al cálculo de indicadores del mercado laboral dominicano


La siguiente entrada muestra como trabajar usando STATA y desde cero, la encuesta Nacional de Fuerza de Trabajo. Utilizando del archivo Excel que facilita el Banco Central de la República Dominicana, al ser solicitada. El objetivo de la entrada es incentivar el uso de la Encuesta como estudio de análisis del mercado laboral en la República Dominicana. ESPERO OS SIRVA!!!

Al solicitar la base de dato al Banco Central se contará con dos archivos Excel, un diccionario y la base de dato. El primer documento contiene una hoja de cálculo donde se explican los valores de las variables contenidas en las diversas bases, mientras que el segundo archivo contiene una serie de hojas de cálculo con las bases de miembros y de hogares correspondientes a los distintos cuestionarios de la encuesta. A continuación se coloca una imagen de dicho documento.

Ilustración 1. ENFT en Excel: documento sin trabajar recibido desde el Banco Central

Ahora es necesario importar las bases en Stata considerando algunos puntos importantes:

-          Elimina las comas de los formatos números, así evitas Stata te impute las variables como texto.
-          La forma como se muestra la importación corresponde a la versión 12 de Stata, utilizando bases guardades en formato *.txt , (delimitado por tabulaciones). Versiones anteriores a las 11 puedes guardar cada pestaña en formato txt (delimitado por tabulaciones) o cvs (delimitado por coma) y posteriormente importarlos en Stata, pero este último formato puede dar problemas en versiones de Windows anteriores a la versión 8.

-          Confirma el formato de la columna eft_periodo sea el mismo para todas las bases de datos. Existen ocasiones en que las bases tienen 1/2009 y otras ene-2009, esto ocasiona errores al combinar las bases de datos, mediante el marge.

Teniendo claro esto, el próximo paso es guardar cada una de las beses de datos en el formato especificado (*.txt , (delimitado por tabulaciones). Este procedimiento se realiza de una manera trivial en Excel. A continuación se muestra como importar las bases a Stata, luego de guardar cada pestaña en formato “txt” delimitado por tabulaciones (se hace por “guardar como” en Excel).

* =======================================
* Preliminares

cd "C:\Users\AMD\Documents\...\ENFT Abril 2009"
capture log using "ResultsENFT20091", t replace
set more off

* =======================================
* Transforma bases de Excel a Stata

*Organizando y ordenando las bases de datos*
*-----------------------------------------------------------
 insheet using  "miembro20091.txt", tab clear
sort eft_periodo eft_vivienda eft_hogar eft_miembro
save "miembros20091.dta", replace

insheet using "vivienda20091.txt", tab clear
drop eft_factor_exp
keep eft_periodo eft_vivienda eft_estrato-eft_zona eft_tipo_vivienda-eft_monto_probable_alq_dolares
sort eft_periodo eft_vivienda
save "vivienda20091", replace

insheet using "calculadas20091.txt", tab clear
sort eft_periodo eft_vivienda eft_hogar eft_miembro
save "calculadas200904.dta", replace

En este caso solo se colocan tres, que son las bases que utilizaremos en nuestro ejemplo, en caso de necesitar otras variables, que se encuentre en otro cuestionario, el procedimiento es el mismo. Luego a que las bases están listas se procede a unirlas, siempre atendiendo al fin que queremos atender o a que tipos de análisis queremos generar.

* Pegando base de datos
* -----------------------------------------------------------

use "miembros20091.dta", clear

gen VAR_VIVIENDA=.
sort eft_periodo eft_vivienda
merge m:1 eft_periodo eft_vivienda using "vivienda20091.dta"
tab _m

drop _m

gen VAR_CALCULADAS=.
sort eft_periodo eft_vivienda eft_hogar eft_miembro
merge 1:1 eft_periodo eft_vivienda eft_hogar eft_miembro using "calculadas200904.dta"
tab _m
drop _m

A este punto es importante aclarar que el procedimiento anterior permite transferir información de las bases de hogares, donde cada vivienda/hogar es la unidad de análisis a la base de miembros, donde cada observación corresponde a un miembro del hogar. Así en caso que una vivienda indique que contiene una estufa (eft_estufa=1 en la base de vivienda) ese 1 se le coloca a cada uno de los miembros del hogar de esa vivienda, tal como se muestra a continuación. Ahora ya estamos en disposición de realizar cálculos globales utilizando todo el potencial de la encuesta.

. list eft_vivienda eft_hogar eft_miembro eft_estufa in 1/10

     +-------------------------------------------+
     | eft_vi~a   eft_ho~r   eft_~bro   eft_e~fa |
     |-------------------------------------------|
  1. |        1          1          1          1 |
  2. |        1          1          2          1 |
  3. |        1          1          3          1 |
  4. |        3          1          1          1 |
  5. |        3          1          2          1 |
     |-------------------------------------------|
  6. |        3          1          3          1 |
  7. |        3          1          4          1 |
  8. |       13          1          1          1 |
  9. |       13          1          2          1 |
 10. |       13          1          3          1 |

     +-------------------------------------------+

Haciendo un paréntesis y dado que el ejemplo anterior puede no resultar claro, se coloca otro pequeño ejemplo, donde se coloca valores de si o no a la tenencia de estufa y se supone que el tercer hogar no tiene para ilustra de manera más clara la idea:

* En un inicio tenemos dos bases, una de viviendas y una de miembros
* base de viviendas
     +-------------------------------+
     | vivienda      hogar    estufa |
     |-------------------------------|
  1. |        1          1        si |
  2. |        3          1        no |
     |-------------------------------|

* y tenemos una base de miembros, obsérvese que variables como tenencias de electrodomésticos o acceso a servicios se encuentran en el cuestionario de viviendas, sin embargo otras variables como edad se encuentran en la base de miembros, este procedimiento nos permite tener ambos en una misma base.

     +--------------------------------+
     | vivienda      hogar    miembro |
     |--------------------------------|
  1. |        1          1          1 |
  2. |        1          1          2 |
  3. |        1          1          3 |
  4. |        3          1          1 |
  5. |        3          1          2 |
     |--------------------------------|
  6. |        3          1          3 |
  7. |        3          1          4 |
     +--------------------------------+

* Finalmente, lo que se hace al combinar las bases de datos es colocar la información de la base de vivienda a la base de miembros, por tanto, el resultado final es el siguiente:

     +-------------------------------------------+
     | vivienda      hogar    miembro     estufa |
     |-------------------------------------------|
  1. |        1          1          1         si |
  2. |        1          1          2         si |
  3. |        1          1          3         si |
  4. |        3          1          1         no |
  5. |        3          1          2         no |
     |-------------------------------------------|
  6. |        3          1          3         no |
  7. |        3          1          4         no |
     +-------------------------------------------+



Ahora podemos guardar esta base y comenzar a explotar la encuesta.


. save BaseENFT20091.dta, replace

Ahora como hemos anexado la parte de variables calculada, podemos calcular directamente la información que el BCRD pública en su página, con el potencial que contamos con los microdatos que abren, casi de forma infinita, el abanico de análisis disponibles. En los próximos comandos se muestran ejemplos de cómo obtener algunos valores relacionados con el mercado laboral.

* recodifica variable ocupacion 

gen      condi_mer = 1 if ocupado   ==1
replace  condi_mer = 2 if desocupado==1
replace  condi_mer = 3 if inactivo  ==1

label define condi_merlbl 1 "ocupado" 2 "desocupado" 3 "inactivo"
label values condi_mer    condi_merlbl

. table condi_mer [fweight = eft_factor_exp] if  pet==1, row col format(%12.0gc)

-------------------------
 condi_mer |        Freq.
-----------+-------------
   ocupado |    3,577,258
desocupado |      624,227
  inactivo |    3,638,634
           |
     Total |    7,840,119
-------------------------


Con la próxima imagen, extraída directamente de la página del BCRD, se puede observar la similitud entre las cifras publicadas por el Banco y las obtenidas trabajando la ENFT.

Ilustración 2. Compara resultados con respecto a los publicados por el BCRD








15 jul 2015

Tablas de p-valor con asteriscos de significancias en Excel

La entrada proporciona un if, que permite colocar los famosos asteriscos de significancia a los p-valor obtenido de alguna rutina econométrica.

Paso 1.

Crear la tabla con los p-valor. En este ejemplo corresponden a p-valor del test  de cointegración de Engle-Granger, aplicado a series de tipos de cambio.

Brasil México Colombia CostaRica Honduras Chile
0.001 0.3402 0.0626 0.6136 0.001 0.1952
0.1151 0.0552 0.1005 0.1016 0.1049 0.009
0.117 0.117 0.0947 0.1141 0.129 0.1185

Paso 2.

Usando como referencia la celda en la cual se encuentra el p-valor que deseamos obtener (cambias b22 por la celda donde se encuentra tu p-valor), colocamos el siguiente if anidado, en la parte de la nueva tabla que le corresponde:

=SI(B22<0.01;B22&"***";SI(Y(B22>0.01;B22<0.05);B22&"**";SI(Y(B22>0.05;B22<0.1);B22&"*";B22)))

Resultado

Brasil Mexico Colombia CostaRica Honduras Chile
0.001*** 0.3402 0.0626** 0.6136 0.001*** 0.1952
0.1151 0.0552* 0.1005 0.1016 0.1049 0.009***
0.117 0.117 0.0947* 0.1141 0.129 0.1185





























4 mar 2015

Econometria con Matlab: Como usar ventanas móviles para obtener series históricas de betas en el CAPM


En ocasiones necesitamos testar la estabilidad de cierta estimación analizando la evolución de una serie histórica de betas del modelo de regresión lineal.  El método de ventanas móviles permite realizar este tipo de ejercicio. En el siguiente ejemplo se muestra como se puede obtener una serie histórica de betas del CAPM y el Alpha de Jensen. Como usualmente se dispondrá de la rentabilidad del mercado y la de un sin numero de activos, lo que hemos llamado x e y(i) respectivamente, donde i i representa cada una de las columnas de la matriz de activos.

% -------------------------------------------------------------
%la idea es:
% tienes una matriz de variables (Yi), donde i representa cada columna
% y tienes una variable X, que representa tu rendimiento de mercado en el CAPM
% necesitas hacer series temporales de betas: esto lo harás por ventanas móviles, % por tanto
% necesitas un bucle o usar operaciones vectorizadas, opta por un bucle
% necesitas recorrer tu matriz (yi), esto lo harás con otro bucle, como este ya es un segundo bucle, sera un bucle anidados, el primero te sirve para recorrer de columna en columna y el segundo para especificar las observaciones que tendrán una amplitud determinada por tu venta.

% genero variables hipoteticas que simulan rentabilidades
   x = random('Normal',0,1,100,1);     % rentabilidad del mercado
 y_i = random('Normal',0,1,100,5);   % rentabilidad de activos

% Se supone que tienes una base de datos de esta forma. ahora debes hacer el bucle anidado
% no tengo intenrnet, pero hay infinidad de ejemplos de ejemplos en internet de como hacer
% un bucle para recorrer una matriz.

 ventana=90;         % esta ventada determina la amplitud de la ventana
 [f, c]=size(y_i);    % te permite obtener las dimensiones para tu bucle

  for i=1:c        % este bucle te recorre las columna de la matriz
      for obs=1:f-ventana % este te recorre las observaciones de cada columnas
   
  % Regresión del CAPM (recuerda que el CAPM usa exceso de rent respecto al ALR)
  % Ten pendiente que el vector de 1, matricialmente te permite obtener constante      en regresión
       behat = regress(x(obs:obs+ventana-1), [ones(ventana,1) ...                                        y_i(obs:obs+ventana-1,i)]) ;
      
     % Aqui usas las dimensiones, para obtener matrices que almacenan tus betas.
         beta_capm(obs,i)=behat(2);
         alpha_jemsem(obs,i)=behat(1);

   % Analisis de estabilidad de cada beta, opcional. Haces un gráfico para ver la      evolución histórica
   % De cada uno los betas de tus activos.
        figure(i)
            plot(beta_capm(:,i))
     end
end

% Matriz de resultados

beta_capm


Espero os sirva,
Nerys

7 feb 2015

Econometría con Matlab: especificación de estructura ARMA y predicción


Esta guía muestra cómo obtener especificaciones ARMA para una serie de datos y como utilizar dichas especificaciones para obtener predicciones a distintos horizontes de tiempo. Hacerlo para una sola serie, puede ser relativamente fácil, generalizarlo para una matriz de datos y distintos horizontes de tiempo es más interesante.  El mismo se puede aplicar tanto para una serie individual como para una matriz de datos. Los códigos siguiente se corresponden a modificaciones de códigos kevinsheppard® y de los ejemplos cargados de Matwork®.

 1.      Una vez cargado la matriz de datos (conteniendo una o varias series, ordenadas por columnas).
 2.      Identificar estructura ARMA usando el criterio AICs

2           2.1. En la primera parte del código se especifican el numero max de retardo a testear, las opciones del "optimizador" y las matriz  (AICs ) donde se guardaran los el Akaike de cada estimación así como las matrices que guardaran el orden ARMA de cada serie.

%%  Modelizacion de la media

   MAX_AR = 4; MAX_MA = 4;
   models = cell(MAX_AR+1,MAX_MA+1);

    % Options to suppress display.  ARMA models are estimated using lsqnonlin
            options =  optimset('lsqnonlin');
            options.MaxIter = 1000;
            options.Display='none';
    % Setup arrays to hold values
            AICs = zeros(MAX_AR,MAX_MA);
           
    % Get the effective T since MAX_AR will be held back         
            T = length(data(:,1)) - MAX_AR; 
     orden_ar = [];
     orden_ma = [];

2.2. Buscando la especificación ARMA que minimiza el criterio usado

En el siguiente código se recorre la matriz de variables (llamada dato) con el for var, el for i va cambiando la especificación AR y j la MA. Luego se presenta la especificación testeada (disp.), se estima el modelo ARMA (armaxfilter), después se calcula el estadístico AICs, estos se guardan en la matriz AICs que se crea en el bloque anterior. Por último se utiliza find  para  buscar cual especificación arrojo el menor AICs y las matrices orden_ar  y orden_ama permiten guardar la especificación ARMA que se corresponde con dicho estadístico.

   for var=1:length(data(1,1:end));
       n=0;
        for i=0:MAX_AR
            for j=0:MAX_MA
                if i==0 & j==0;
                    disp('Aqui da error')
                else
                disp(['AR: ' num2str(i) ' MA: ' num2str(j)])
          % The MAX_AR term below enforces the holdbac, which is requires
          % when comparing AR models with different lag lengths.  Failing to
          % use this will produce log-likelihods base don different number of
          % observations.
            [p, ser, ll]=armaxfilter(data(:,var),1,i,j,[],[]);

              % Store other values for use later
                    LLs(i+1,j+1) = ll;
                    AICs(i+1,j+1) = ll - 2 * (1+i+j);
                    BICs(i+1,j+1) = ll - log(T) * (1+i+j);
                end
            end
      end

     display('----------------------------- Variable: '), var
      [BIC_AR,BIC_MA] = find(BICs==max(max(BICs)));
             disp('Orden del modelo ARMA: Criterio AICs')
             disp([BIC_AR - 1 BIC_MA - 1])

             orden_ar=[orden_ar, BIC_AR-1];
             orden_ma=[ orden_ma, BIC_MA-1];
      end

3.      Usar la estructura ARMA para predecir

Ahora se puede utilizar esta especiación para obtener predicciones de las series.
-          Nomvar: Crea nombres de las series, para identificar los gráficos (habrán tantos nombres como columna tenga nuestra matriz data)
-          For variable, permite recorrer las series ordenadas en la matriz data(length(data(1,:))  indica que  debe ir hasta la ultima columna)
-          arima  Permite estimar el modelo ARIMA llamado Mdl donde se utilizan las especificaciones ARMA de cada serie, que encontramos en los bloques de códigos anteriores. (Una aclaración importante, es que se supones series integradas por donde el orden de esta es cero para todos los casos, esto dependerá de los datos con que trabajes)
-          ventana  indicas el horizonte de tiempo que quieres que tu modelo prediga (4 indica que el primer grafico mostrara las predicciones del ARIMA para cuatro)
-           no_proyec, Va recorriendo las ventanas de predicciones
-          estimate , Estima el ARIMA en el punto del tiempo determinado, es como si estimáramos el modelo el dia en que inicia la predicción sin conocer lo que sucederá.
-          forecast , Permite obtener las predicciones del modelo
-          Por ultimo se construye el gráfico 

%% Forescat mean response
    nomvar = {'PIB', 'Net Change-Off', 'Desempleo', 'Inflación'...
             'Tipo a Largo', 'Tipo a Corto'}; 

 for variable=1:length(data(1,:));
   Y=data(:,variable);
   [nobs, nvar]=size(Y);
  
   Mdl = arima(orden_ar(variable),0,orden_ma(variable));
   ventana= [4, 8, 31];
  
      for no_proyec = 1:length(ventana);
          EstMdl = estimate(Mdl,Y(1:end-ventana(no_proyec),:));
       [YF YMSE] = forecast(EstMdl,ventana(no_proyec),'Y0',Y(1:end-ventana(no_proyec)));
  
       figure(variable)
        subplot(1,length(ventana),no_proyec)
         h1 = plot(Y,'Color',[.7,.7,.7]);
            hold on
              inicio=nobs-(ventana(no_proyec)-1);
            h2 = plot(inicio:nobs,YF,'b','LineWidth',2);
            h3 = plot(inicio:nobs,YF + 1.96*sqrt(YMSE),'r:',...
                'LineWidth',2);
        plot(inicio:nobs,YF - 1.96*sqrt(YMSE),'r:','LineWidth',2);
               legend([h1 h2 h3],'Observed','Forecast',...
                        '95% Confidence Interval','Location','NorthWest');
               legend('boxoff')
               title({[num2str(ventana(no_proyec)) '-Period Forecasts and Approximate 95%, for: ',num2str(nomvar{variable})]})
        hold off
        end
      end

Tomando datos trimestrales del Net Change-off de USA y una especificación ARIMA(1,0,4), se obtiene el siguiente gráfico, en el mismo se muestra la predicción del modelo en tres puntos del tiempo, el ultimo año, los ultimo dos años, y lo que predecirla antes de la crisis.:

Predicciones ARIMA(1,0,4) de probabilidades de Default  
(Datos trimestrales 1984-2014)
         Fuente: Elaboración propia con datos de FDIC

Una aclaración al final, es que la especificación ARMA de los primeros bloques es del conjunto completo de datos, pudiendo ser esta cambiante en el tiempo. Habría que verificar si en 2006, por ejemplo la especificación ARMA hubiese sido la que se obtiene usando el periodo completo.

24 ene 2015

Notas de Econometria en Matlab (Introducción)

%% ESTADÍSTICOS BÁSICOS DE UNA REGRESIÓN LINEAR SIMPLE

X1 = [ones(size(data,1),1) data(:,1:5)];
 y = data(:,6);
[b,bint,r,rint,stats] = regress(y,X1)

% la parte del comando (ones(size(data,1),1)), crea un vector de 1 que permite que el modelo cuente % con una constante, en caso contrario el modelo no tendría constante. Es decir para estimar un         % modelo de regresión a través del origen, eliminamos esa parte del comando.

stats = regstats(returns(:,1),returns(:,2))
    t = stats.tstat;

CoeffTable = dataset({t.beta,'Coef'},{t.se,'StdErr'}, ...
                     {t.t,'tStat'},{t.pval,'pVal'})

disp('----------------------------------------------')
disp(['R-Cuadra: ' num2str(stats.rsquare)   ' R-adjrsquare: ' num2str(stats.adjrsquare)])
disp(['R-dwstat: ' num2str(stats.dwstat.dw) '    pval-dwstat : ' num2str(stats.dwstat.pval)])
disp(['f_stat  : ' num2str(stats.fstat.f)   '     pval_fstat  : ' num2str(stats.fstat.pval)])

disp('----------------------------------------------')
disp(['Obs: ' num2str(stats.fstat.dfe)])
disp(['mse: '         num2str(stats.mse)])

CoeffTable =

    Coef           StdErr         tStat         pVal  
    0.018291    0.015393    1.1882     0.23481
    0.048474    0.019286    2.5134     0.011987

----------------------------------------------
R-Cuadra: 0.0011546 R-adjrsquare: 0.00097179
R-dwstat: 2.2151        pval-dwstat : 1.9984e-015
f_stat  : 6.317             pval_fstat  : 0.011987
----------------------------------------------
Obs: 5465
mse: 1.2953

%% Análisis de residuos
%    La expresión anterior permite analizar los residuos y la estimación de la variable dependiente

 yestimada = yhat
  residuos = r;

test de normalidad de los residuos:
1. qqplot: [qqplot(residuos)]

8 nov 2014

Gráficos con fechas en Matlab


Como poner fechas en el eje x, en Matlab

Un problema que suele surgir al trabajar con Matlab, es el de querer colocar el tiempo en el eje x del gráfico de linea. En este documento se muestran dos formas de obtener estos gráficos en Matlab. (La segunda alternativa es mucho mas fácil y general) En la siguiente rutina se muestra como hacerlo, utilizando datos financieros que el fichero descarga automáticamente de Yahoo finance.

Alternativa 1
*----------------------------------------------------------------------------------------

%% Grafico de serie de tiempo
%Cargando bases
clear
conect = yahoo;
   activos={'SPY','GDX'};
   fromdate = '1/01/2011';
   todate = floor(now);
 dates = builduniverse(conect,activos,fromdate,todate);
 [f,c]=size(dates)

%% Grafica de serie de tiempo
ts=dates(:,2:end)
ts1 = timeseries(ts,1:f);

ts1.Name = 'Daily Count';
ts1.TimeInfo.Units = 'days';
ts1.TimeInfo.StartDate =  '01-Jan-2011';     % Set start date.
ts1.TimeInfo.Format = 'yyyy';                % Set format for display on x-axis.
ts1.Time = ts1.Time - ts1.Time(1);           % Express time relative to the start date.

plot(ts1,'-'); legend(activos, 'Location','NorthWest'); grid on;
    title('Grafico 1. Cotizaciones diarias de SPY y GDX'); ylabel('cotizaciones');
 
%%

tstool

Alternativa 2
*----------------------------------------------------------------------------------------
El comando  datetick permite hacer gráficos con fechas de forma mucho mas natural. En el siguiente ejemplo se muestra como usarlo. la único a resaltar es que x es una matriz de fechas importadas desde Excel, esas fechas deben tener formato general. Es decir, cambiarle el formato de fecha a general en el Excel (quedan como números).

  plot(x, serie,'Color',[1 0.1 0.2])
    datetick('x','mmm-yy','keepticks'), xlim([x(1) x(end)])
                         
Matlab también permite gráficar dos series con unidades sumamente diferente, como es precios y rentabilidades. En el siguiente ejemplo, X representa una matirz de fechas (importadas desde Excel, en excel es necesario cambiar el formato de fecha a formato general). returns representa una matriz de rentabilidades  y tipos es una matriz de tipos de cambio (por eso se indica que vaya desde la segunda columna (2:end) para que coincidan las dimensiones, porque las rentabilidades pierden la primera observación.

       [hAx,hLine1,hLine2] = plotyy(x(2:end),returns(:,i),x(2:end),tipos(2:end,i),'plot');
           ylabel(hAx(1),'Rentabilidades') % left y-axis
             datetick(hAx(1), 'x','mmm-yy','keepticks')
             hLine2.LineStyle = '-.';
           ylabel(hAx(2),'Tipo de Cambio') % right y-axis
             datetick(hAx(2), 'x','mmm-yy','keepticks')
             title({['Tipo de cambio: ',num2str(nomvar{i})]}), grid off

1 nov 2014

Cartera de Mínima Varianza para n Activos en Matlab


%% Modelo Unifactoriales
 % Master en Banca y Finanzas Cuantitativas
 % Nerys Ramirez

%% Cartera minima varianza para n activos
             c = yahoo;
      fromdate = '1/01/2010';
        todate = floor(now);
       activos = {'SPY','GDX','GLD'};
         dates = builduniverse(c,activos,fromdate,todate);
 
   %Calculando rentabilidades
         returns = diff(log(dates(:,2:end))).*100;
            plot(returns(:,1))
     
   %Buscando los ponderadores de la cartera
    matrix_cov = cov(returns);
             I = ones(size(matrix_cov,1),1);
W_cart_min_var = (inv(matrix_cov)*I)/(I'*inv(matrix_cov)*I)

 
%% Versión 1/Nov/2007

Estimación del modelo HP mediante máxima verosimilitud

El filtro de Hodrick–Prescott (HP) se utiliza ampliamente para descomponer una serie macroeconómica en un componente cíclico y transitorio. ...