miércoles, 19 de febrero de 2020

Programando un comando de estimación en Stata: Usando una subrutina para analizar una opción compleja.


David M. Drukker, Director Ejecutivo de Econometría.

Realizo dos mejoras en el comando que implementa el estimador de mínimos cuadrados ordinarios (OLS) que discutí en Programando un comando de estimación en Stata: Permitiendo opciones. 

Primero, agrego una opción para un estimador robusto por conglomerados de la varianza-covarianza del estimador (VCE). En segundo lugar, hago que el comando acepte la sintaxis moderna para un estimador robusto o un clúster robusto del VCE. En el proceso, uso subrutinas en mi programa ado para facilitar el análisis y analizo algunos trucos de análisis avanzados. 

Esta es la décima publicación de la serie Programando un comando de estimación en Stata: Permitir restricciones de muestra y variables factor. Te recomiendo que empieces por el principio. 

Permitiendo un estimador robusto o robusto por conglomerados (VCE)
La sintaxis de myregress9, la cual discuto en Programando un comando de estimación en Stata: Permitiendo opciones, es 

myregress9 depvar [indepvars] [if] [in] [, robust noconstant

La sintaxis de myregress10, el cual analizo aquí, es 

myregress10 depvar [indepvars] [if] [in] [, vce(robust | cluster clustervar) noconstant

Por defecto, myregress10 estima el VCE asumiendo que los errores son independientes e idénticamente distribuidos (IID). Si la opción vce(robust) se especifica, myregress10 usa el estimador robusto de el VCE. Si la opción vce(cluster clustervar) se especifica, myregress10 usa el estimador robusto por conglomerados del VCE. Vea Cameron y Trivedi (2005), Stock y Watson (2010), Wooldridge (2015) para una introducción a OLS; vea Programando un comando de estimación en Stata: Usado comandos matriciales y funciones para calcular objetos MCO para las formulas y las implementaciones matriciales en Stata. 

Recomiendo que dé un clic en el nombre del archivo para descargar el código para mi myregress10.ado. Para evadir el desplazamiento, vea el código en el editor de archivos do, o en su editor de texto favorito para ver los números de línea. 

Code block 1: myregress10.ado





El comando syntax en la línea 5 pone cualquier cosa que el usuario especifique en vce() dentro de una macro local llamada vce. Por ejemplo, si el usuario escribe:




La macro local vce contendrá “hello there”. Si el usuario no especifica algo en la opción vce(), la macro local vce estará vacía. La línea 14 usa está condición para ejecutar las líneas 15-21 solo si el usuario ha especificado algo en la opción vce.

Cuando el usuario especifica algo en la opción vce, la línea 15 llama a la subrutina ado my_vce_parse para analizar qué hay en la macro local vce. my_vce_parse guarda el nombre de la variable clúster en r(clustervar) y aborda condiciones de error, tal como analizo a continuación. La línea 16 guarda “robust” dentro de la macro local vcetype, y la línea 17 guarda el contenido de la macro local r(clustervar) creada por my_vce_parse dentro de la macro local clustervar. 

Si el usuario no especifica algo en vce(), la macro local vcetype estará vacía y la línea 36 asegura que myregress10 calcule un estimador IID del VCE.

Las líneas 19 y 20 se ejecutan solamente si la macro local clustervar no está vacía. La línea 19 la variable a utilizar, cuyo nombre está guardado en la macro local touse, para abordar valores faltantes en la variable clúster, cuyo nombre está guardado en clustervar. La línea 20 ordena la base de datos en orden ascendente de la variable clúster. Los usuarios no quieren comandos de estimación reordenando sus datos. En la línea 2, especifico la opción sortpreserve en program define para mantener la base de datos en el orden en el que estaba cuando myregress fue ejecutado por el usuario.


Las líneas 36-65 calculan el estimador requerido para el VCE. Recuerde que la macro local vcetype está vacía o contiene “robust” y que la macro local clustervar está vacía o contiene el nombre de la variable clúster. Las condicionales if y else usan los valores guardados en vcetype y clustervar para ejecutar uno o tres bloques de código.


1. Las líneas 38-42 calculan un estimador robusto del VCE cuando vcetype contiene “robust” y clustervar está vacía.

2. Las líneas 45-53 calcula un estimador robusto por conglomerados del VCE cuando vcetype contiene “robust” y clustervar contiene el nombre de la variable clúster.

3. Las líneas 60-64 calculan un estimador IID del VCE cuando vcetype no contiene “robust”.


La línea 73 guarda el nombre de la variable clúster en e(clustervar), si la macro local clustervar no está vacía. 

Las líneas 78-111 define la rclass subrutina ado my_vce_parse, la cual realiza dos tareas. Primero, guarda el nombre de la variable clúster en la macro local r(cluster) cuando el usuario especifica vce(cluster clustervar). Segundo, encuentra casos en los cuales el usuario especifique un error de sintaxis en vce() y reporta un error en tales casos. 

Poniendo estos detalles de análisis dentro de una subrutina hace al comando principal más fácil de seguir. Recomiendo que encapsulen detalles en las subrutinas. 

La subrutina ado my_vce_parse es local al comando ado myregress10; el nombre my_vce_parse está en un espacio para nombres local en myregress10, y my_vce_parse puede ser ejecutado solamente desde myregress10

La línea 79 usa syntax para guardar lo que sea que el usuario especifique en la opción vce() de la macro local vce, La línea 81 pone el número de letras en vce dentro de la macro local case. La línea 83 provoca que la subrutina ado my_vce_error despliegue un mensaje de error y reporte un código de error 498 cuando haya más de dos palabras en vce. (RTecuerde que vce debe contener robust, o bien, cluster clustervar.) 

Habiendo descartado los casos con más de dos palabras, la línea 87 guarda lo que la macro local vce contenga en la macro local 0. La línea 88 usa syntax para analizar lo que está en la macro local 0. Si el usuario especifica vce(robust), o una abreviación válida del mismo, syntax guarda “robust” en la macro local robust; de otra manera, la macro local robust estará vacía. Si el usuario especifica vce(cluster algo), o una abreviación válida de cluster, syntax guarda “cluster” en la macro local cluster; de otra manera, la macro local cluster estará vacía. La opción * hace que syntax ponga cualquier opción remanente dentro de la macro local options. En este caso, syntax guardará el algo en la macro local options. 

Recuerde el truco utilizado en las líneas 87 y 88. La opción de analizar es frecuentemente mucho más fácil al guardar lo que la macro local contiene en la macro local 0 y usando syntax para analizarlo. 

Cuando hay dos palabras en la macro local vce, las líneas 91-100 aseguran que la primera palabra sea “cluster” y que la segunda palabra, guardada en la macro local options, sea el nombre de una variable numérica. Cuando todo está bien, la línea 100 guarda el nombre de esta variable numérica en la macro local clustervar. Las líneas 95-98 usan una construcción delicada para desplegar un error personalizado. En lugar de dejar que confirm despliegue un mensaje de error, las líneas 95-98 usan capture y una condicional if para desplegar nuestro mensaje personalizado de error. En detalle, la línea 95 usa confirm para confirmar que la macro local options contenga el nombre de una variable numérica. capture pone el código producido por confirm en el escalar _rc. Cuando options contenga el nombre de una variable numérica, confirm produce el código de retorno 0 y capture guarda este código de retorno positivo en _rc. 

Cuando todo está bien, la línea 109 limpia lo que sea que esté en r(), y la línea 110 guarda el nombre de la variable clúster en r(clustervar). 

Las líneas 113-118 definen la subrutina ado my_vce_error, la cual despliega un mensaje personalizado de error. Semejante a my_vce_parse, ,my_vce_error es local en myregress10.ado. 

Hecho y sin hacer

Agregué una opción para el estimador robusto por conglomerados del VCE, e hice que myregress10 aceptara la sintaxis moderna tanto para un estimador robusto como uno robusto por conglomerados para el VCE. En el proceso, utilice subrutinas en myregress10.ado para facilitar el análisis de sintaxis, y utilice algunos trucos avanzados sobre esto. 

Leer myregress10.ado hubiera sido más difícil de leer si no hubiera usado subrutinas para simplificar la rutina principal. 

Aunque parezca que he cubierto todos los matices posibles, solo he tratado algunos. Escriba help syntax para obtener más detalles sobre las opciones de análisis mediante el comando syntax. 

Referencias
Cameron, A. C., and P. K. Trivedi. 2005. Microeconometrics: Methods and applications. Cambridge: Cambridge University Press.

Stock, J. H., and M. W. Watson. 2010. Introduction to Econometrics. 3rd ed. Boston, MA: Addison Wesley New York.

Wooldridge, J. M. 2010. Econometric Analysis of Cross Section and Panel Data. 2nd ed. Cambridge, Massachusetts: MIT Press.

Wooldridge, J. M. 2015. Introductory Econometrics: A Modern Approach. 6th ed. Cincinnati, Ohio: South-Western.