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!

lunes, 27 de mayo de 2019

Programando un comando de estimación en Stata: Usado comandos matriciales y funciones para calcular objetos MCO.

Extracto traducido por MultiON Consulting, basado en el original escrito por David M. Druker - Director Ejecutivo de Econometría.

A continuación, presento las fórmulas para calcular el estimador de mínimos cuadrados ordinarios (MCO), y discuto algunas implementaciones de archivos do de ellas. Analizo las fórmulas y el cálculo de los errores estándar basados en la independencia, los errores estándar robustos y los errores estándar robustos agrupados. Introduzco a los comandos matriciales de Stata y las funciones de matriciales que uso en los comandos tipo ado, y que analizo en las próximas publicaciones.

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


Fórmulas MCO

Recordemos que las estimaciones puntuales de MCO están dadas por


Donde xi es el vector 1 x k de variables independientes, yi es la variable independiente para cada una de las N observaciones en la muestra, y el modelo para yi es


Si el término es independiente e idénticamente distribuído, estimamos la matriz de varianzas y covarianzas del estimador (VCE) con

Donde

Vea Cameron y Trivedi (2005), Stock y Watson (2010), o Wooldridge (2015) para una introducción a MCO.


Implementación matricial en Stata

Utilizo el comando matrix accum para calcular la suma de los productos sobre las observaciones. Escribiendo


Se pone 

dentro de la matriz de Stata zpz, donde  

El 1 aparece porque matrix accum tiene incluido el término constante por defecto, como casi todos los comandos de estimación.

Debajo, uso matrix accum para calcular
el cual contiene
y

Ejemplo 1: Usando matrix accum


Ahora, extraigo
de las filas 2-4 y columnas 2-4 de zpz y
de las filas 2-4 y columna 1 de zpz.


Ejemplo 2: Extrayendo submatrices


Ahora calcularé el término beta estimado de las matrices formadas en el ejemplo 2.


Ejemplo 3: Calculando beta estimado


Transpuse b para hacerla un vector fila ya que las estimaciones puntuales en Stata son guardadas como vectores fila.

El ejemplo 3 ilustra que la matriz b contiene los coeficientes estimados y los nombres de las variables sobre las cuales se han estimado estos coeficientes. Para aclarar, nuestro modelo es


Y b contiene la información de que -220.16 es el coeficientes etimado de mpg, 43.56 es el coeficiente estimado para trunk, y el valor de la constante.

Podemos calcular la combinación lineal 
 sobre las observaciones usando la información en b, ya que b contiene tanto el valor como el nombre de cada coeficiente.

Uso matrix score para calcular esta combinación lineal para cada observación, y uso generate para reiterar qué es esta combinación lineal.


Ejemplo 4: Usando matrix score para calcular: 


Uso las predicciones para E[price|mpg, trunk] en xbhat1 para calcular los residuales y la VCE estimada.


Ejemplo 5: Calculando la VCE estimada


(Consulte Programando un comando de estimación en Stata: Dónde almacenar tus cosas.
 para discusiones sobre el uso de los resultados de los comandos de clase r y el uso de macros locales).

Verifico que mis calculos para el beta estimado y de la VCE  coincidan con los resultados de regress.


Ejemplo 6: Comparando contra regress



Errores Estándar Robustos

El estimador robusto usado frecuentemente de la VCE está dado por

Donde
Vea Cameron y Trivedi (2005), Stock y Watson (2010), o Wooldridge (2015) para derivaciones y discusiones.

matrix accum con ponderaciones
calcula la fórmula para M. Debajo, uso matrix accum para calcular M


Ejemplo 7: Una VCE robusta

Ahora verifico que mis cálculos coincidan con aquellos reportados por regress.


Ejemplo 8: Comparando cálculos de VCE robusta



Errores Estándar Robustos Agrupados

El estimador robusto agrupado de la VCE es frecuentemente usado cuando los datos tienen una estructura panel, también conocida como estructura longitudinal. Esta VCE explica la correlación intragrupo de los errores, y está dada por

Donde



Ejemplo 9: Una VCE robusta agrupada


Ahora verifico que mis cálculos coincidan con los reportados por regress.


Ejemplo 10: Comparando cálculos de VCE robusta agrupada



Hecho y sin hacer

Revisé las fórmulas que subyacen en el estimador de MCO y mostré cómo calcularlas utilizando los comandos y funciones matriciales de Stata. En las siguientes dos publicaciones, escribo un comando ado que implementa estas fórmulas.


Referencias

Cameron, A. C., y P. K. Trivedi. 2005. Microeconometrics: Methods and applications. Cambridge: Cambridge University Press.
Stock, J. H., y 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.



Este blog es administrado por MultiON Consulting S.A. de C.V.

martes, 23 de abril de 2019

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

Extracto traducido y basado del publicado por David M. Drukker, Director Ejecutivo de Econometría.


Analizo el código de un comando de estimación simple para centrarme en los detalles de cómo implementar un comando de estimación. El comando que discuto estima la media por el promedio de la muestra. Comienzo por revisar las fórmulas y un do-file que las implementa. Posteriormente introduzco la programación de archivos ado y discuto dos versiones del comando. En el camino, ilustro algunas de las características de postestimación que funcionan después del comando.

Esta es la cuarta publicación de la serie Programando un comando de estimación en Stata


Las fórmulas para nuestro estimador

Las fórmulas para el promedio de la muestra y su varianza muestral estimada, asumiendo un proceso distribuido de forma independiente e idéntica, son


El código mean1.do realiza estos cálculos en price de la base de datos auto.




mean1.do utiliza summarize para calcular las estadísticas descriptivas. Las líneas 5-7 y la línea 11 almacenan los resultados guardados por summarize en r() en macros locales que posteriormente se usan para calcular las fórmulas. Le recomiendo que utilice double, en lugar del formato predeterminado float para calcular todas las variables utilizadas en las fórmulas, ya que casi siempre vale la pena ocupar la memoria adicional para obtener la precisión adicional que ofrece el double sobre float. (Esencialmente, cada variable ocupa el doble de espacio, pero obtienes los cálculos correctos de aproximadamente 10-16 en lugar de 10−8).

Estos cálculos producen lo siguiente


Ejemplo 1: Cálculo de la media y su varianza muestral.


Ahora verifico que mean produzca los mismos resultados.


Ejemplo 2: Resultados de mean.




Un primer archivo ado

El código en mymean1.ado realiza los mismos cálculos que mean1.do. (El archivo mymean1.ado está en mi directorio de trabajo actual)


La línea 1 de mymean1.ado especifica que el archivo define el comando mymean1. El nombre del comando debe ser el mismo que el nombre del archivo que precede al sufijo .ado. El comando mymean1 realiza los mismos cálculos que el do-file mean1.do.


Ejemplo 3: Resultados de mymean1



Un comando ligeramente mejor

Queremos que nuestro comando sea reutilizable; queremos que estime la media de cualquier variable en la memoria, en lugar de solo para price realizado por mymean1.ado. En la línea 5 de mymean2.ado, utilizamos el comando syntax para almacenar el nombre de la variable especificada por el usuario en la macro local varlist que utilizamos en el resto de los cálculos.


El comando extremadamente útil syntax coloca los elementos de la sintaxis de Stata especificados por el usuario en macros locales y arroja errores cuando el usuario comete un error. Discutiré syntax con mayor detalle en publicaciones posteriores.

Comienzo por ilustrar cómo replicar los resultados anteriores.


Ejemplo 4: Resultados de mymean2 price


Ahora demostraré que funciona para otra variable.


Ejemplo 5: Resultados de mymean2 trunk



Almacenando los resultados en e()

mymean2.ado no almacena los resultados que despliega. Arreglaremos este problema en mymean3.ado. La línea 2 especifica la opción e-class en program define para hacer a mymean3 un comando de clase e. La línea 18 utiliza ereturn post para mover la matriz de estimaciones puntuales (b) y la varianza-covarianza estimada del estimados (VCE) dentro de e(b) y e(v). El marco de estimación-postestimación usa nombres de parámetros para visualización, pruebas de hipótesis y otras características. En las líneas 15 y 16, colocamos esos nombres en las columnas del vector de estimaciones y el VCE estimado. En la línea 17, colocamos esos nombres en la fila del VCE estimado.


El comando ereturn display en la línea 19 de mymean3.ado fácilmente crea una tabla de salida estándar usando los resultados ahora almacenados en e(b) y e(V).


Ejemplo 6: Resultados de mymean3 trunk



Estimación – postestimación

test, lincom, testnl, nlcom, y otras características estimación-posestimación basadas en la prueba Wald, funcionan después de mymean3 porque toda la información requerida está almacenada en  e(b) y e(V).

Para ilustrarlo, realizo una prueba Wald con hipótesis nula de que la media de trunk es 11.



Ejemplo 7: Las pruebas funcionan después de mymean3


Los resultados almacenados en e() son el pegamento que mantiene unido el marco de estimación-postestimación. Hasta ahora solo hemos almacenado e(b) y e(V), por lo que aún no funcionan todas las características estándar. (Pero llegaremos allí en la serie #StataProgramming).


Usando nombres temporales para objetos globales

Las variables y matrices de Stata son globales, como se explicó en mi anterior publicación de blog. Necesitamos algunos nombres seguros para los objetos globales. Estos nombres seguros no deberían estar en uso en ningún otro lugar, y deberían ser temporales, ya que queremos que Stata borre los objetos correspondientes cuando finalice el comando. Los comandos tempvar y tempname ponen nombres seguros en macros locales y luego borran los objetos correspondientes cuando el archivo ado o do finaliza. Descartamos explícitamente e2, si existía, en la línea 9 del bloque de código 2, en la línea 12 del bloque de código 3 y en la línea 11 del bloque de código 4. No necesitamos una línea de este tipo en el bloque de código, porque estamos utilizando nombres temporales de variables.

En la línea 7 de mymean4.ado, el comando tempvar coloca un nombre seguro en la macro local e2. En la línea 8 de mymean4.ado, el comando tempname coloca nombres seguros en las macros locales b y V. Ilustro el formato seguido por estos nombres seguros al mostrarlos en las líneas 9–11. La salida revela que a un par de guiones bajos le siguen números y letras mayúsculas. La línea 15 ilustra el uso de estos nombres seguros. En lugar de crear la matriz b, creamos la matriz cuyo nombre está almacenado en la macro local b. En la línea 8, el comando tempname creó la macro local b para mantener un nombre seguro.


El código produce la siguiente salida

Ejemplo 8: Resultados de mymean4 trunk


Removiendo las líneas que despliegan los nombres seguros contenidos en las macros locales obtenemos mymean5.ado.



Este código produce el resultado


Ejemplo 9: Resultados de mymean5 trunk



Hecho y sin hacer

Ilustré algunas técnicas básicas de programación de archivos ado mediante la implementación de un comando que estima la media de la variable. Aunque tenemos un comando que produce resultados correctos y fáciles de leer, que tienen algunas características de estimación - postestimación, solo hemos tachado la superficie de lo que normalmente queremos hacer en un comando de estimación. Profundizo un poco más en las siguientes publicaciones al desarrollar un comando que realiza una estimación de mínimos cuadrados ordinarios.



Gracias por leernos. Siga al pendiente de nuestras próximas entradas y siéntase libre de compartir este blog con sus colegas y amigos.

Para cualquier información referente a Stata, escríbanos a: info@multion.com 

Este blog es administrado por MultiON Consulting S.A. de C.V.