lunes, 26 de agosto de 2019


Programando un comando de estimación en Stata: Un primer comando para MCO.


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

Muestro cómo escribir un comando de estimación de Stata que implemente el estimador de mínimos cuadrados ordinarios (MCO) al explicar el código. Uso conceptos que presenté en publicaciones anteriores de #StataProgramming. En particular, me baso en Programando un comando de estimación en Stata: Usado comandos matriciales y funciones para calcular objetos MCO, en el cual están las fórmulas para MCO y mostré cómo calcularlas usando comandos y funciones de matriciales, y en Programando un comando de estimación en Stata: Un primer comando ado, en el que introduje algunos conceptos de programación ado. Aunque presento algunos trucos de macro locales que uso todo el tiempo, también me baso en Programando un comando de estimación en Stata: Dónde almacenar tus cosas.

Esta es la sexta publicación de la serie Programando un comando de estimación en Stata. Te recomiendo que empieces por el principio.

Trucos para Macros Locales
Uso muchos trucos para macro locales en mis archivos ado. En esta sección, ilustramos los que uso en los comandos que desarrollo en esta publicación. En cada archivo ado que escribo, hago preguntas sobre listas de nombres de variables almacenadas en macros locales. Con frecuencia utilizo las funciones extendidas para macros y el comando gettoken para hacer estas preguntas y almacenar los resultados en una macro local y almacenar los resultados en una macro local.

La sintaxis para guardar el resultado de una función extendida para macro en una macro local es
local localname : extended_fcn

A continuación, utilizo la función extendida para macro word count para contar el número de elementos en la lista y guardar los resultados en la macro local count.

Ejemplo 1: Guardando y extrayendo el resultado de una función extendida para macros




Hay diversas funciones extendidas para macros, pero solamente ilustro la que utilizo en esta publicación; escriba help extended fcn para obtener una lista completa.

Un token es un elemento en una lista. Frecuentemente utilizo el comando gettoken dividir una lista en partes. 

El comando gettoken tiene la sintaxis
gettoken localname1 [localname2] : localname3

gettoken guarda el primer token en la lista guardada en la macro local localname3 dentro de la macro local localname1. Si se especifica localname2, los tokens restantes se guardan en la macro local localname2.

Utilizo gettoken para guartdar el primer token guardado en mylist dentro de la macro local first, cuyo contenido, subsecuentemente, extraigo y despliego.

Ejemplo 2: Usando gettoken para guardar solamente el primer token





Ahora utilizo gettoken para guardar el primer token guardado en mylist dentro de la macro local first y los tokens remanentes dentro de la macro local left

Subsecuentemente, extraigo y despliego los contenidos de first y left.


Ejemplo 3: Usando gettoken para guardar el primero y los restantes tokens



Frecuentemente quiero incrementar el valor de la macro local por un monto fijo, digamos, 3. Ahora ilustraré una solución que uso.


Ejemplo 4: Actualización de macro local


Cuando el valor actualizado, también conocido como el valor de incremento, es 1, podemos usar el operador de incremento, como aparece a continuación:


Ejemplo 5: Actualización de macro local


Una primera versión de myregress


Eñ codigo en myregress1 implementa una versión de las formulas MCO. Utilizo myregress1 en el ejemplo 6. Debajo del ejemplo 6, comento el codigo y el resultado.



Ejemplo 6: Resultado de myregress


Aquí mis comentarios del código y el resultado del ejemplo 6.

  •          La línea 2 especifica que myregress1 es un comando de clase e que guarda sus resultados en e().
  •          Las líneas 5 a 8 ilustran que el comando syntax guarda los nombres d elas variables especificadas por el usuario en la macro local varlist. Este comportamiento también es explicado en el ejemplo 6.
  •          La línea 10 usa el comando gettoken para guardar el nombre de la primera variable guardada en la macro local varlist dentro de la macro local depvar. La línea 11 despliega este nombre y el uso se ilustra en el ejemplo 6.
  •          La línea 13 usa matrix accum para poner (X’X) y (X’y) dentro de una matriz de Stata llamada zpz, tal como se discutió en  Programando un comando de estimación en Stata: Usado comandos matriciales y funciones para calcular objetos MCO y mayormente ilustrado en las líneas 14 y 15 y el ejemplo 6.
  •         La línea 17 guarda el número de variables en la macro local varlist dentro de la macro local p.
  •          La línea 18 incrementa la macro local p en 1 para contar con el término constante incluido en matrix accum por defecto.
  •          Las líneas 20 a 23 extraen (X’X) y (X’y) de zpz y pone el vector de puntos de estimación  dentro del vector fila b.
  •          La línea 25 pone  dentro de la variable xbhat.
  •          Las líneas 26 y 27 calculan los residuales y los residuales al cuadrado, respectivamente.

               Las líneas 28 a 32 calculan la matriz estimada de varianzas y covarianzas del estimador (VCE) de la suma de residuales al cuadrado.
  •          La línea 33 guarda b y V dentro de e(b) y e(V), respectivamente.
  •         La línea 34 guarda el nombre del comando de estimación (myregress1) en e(cmd).
  •          La línea 35 produce una tabla estándar de resultados de Stata a partir de los resultados en e(b) y e(V).

     myregress1 contiene código que ayuda a ilustrar cómo trabaja, y utiliza nombres codificados para objetos globales como variables Stata y matrices Stata. Los usuarios no desean ver el resultado de las líneas de la ilustración, por lo que deben eliminarse. Los usuarios no desean que sus matrices Stata globales se sobrescriban con un comando que utilizan, que es lo que myregress1 haría a una matriz llamada zpz, xpx, xpxi, b o V.

    El código en myregress2 arregla estos problemas.





  •          La línea 8 usa tepname para poner nombres seguros dentro de las macros locales zpz, xpx, xpxi, b y V.
  •          La línea 9 usa tempvar para poner nombres seguros dentro de las macros locales xbhat, res, res2.
  •          Las líneas 11, 14 a 18 y 25 a 26 usa los nombres seguros en las macros locales creadas por tempname en lugar de los nombres codificados para las matrices.
  •          Las líneas 18 a 20 usan los nombres seguros en las macros locales creadas por tempvar en lugar de los nombres codificados para las variables que crea.
  •      La siguiente imagen muestra el resultado obtenido por myregress2.


Ejemplo 7: Resultado de myregress2



Hecho y sin hacer

Después de revisar algunos trucos con macros locales que uso en la mayoría de los archivos ado que escribo, desarrollo dos versiones de un comando ado que implementa un estimador de MCO. En la siguiente publicación, extenderé este comando para que el usuario pueda solicitar un VCE robusto, o que el término constante pueda ser suprimido, o ambos.


Esto es todo por esta ocasión. Te invitamos a seguir al pendiente de nuestro Blog, ¡Gracias!

No hay comentarios.:

Publicar un comentario