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.

martes, 16 de abril de 2019

Programando un comando de estimación en Stata: Macros globales versus Macros locales.

Artículo original escrito por David M. Drukker, Director Ejecutivo de Econometría.


En este post analizo un par de ejemplos que ilustran las diferencias entre las macros globales y las macros locales. Pueden ver esta publicación como un apéndice técnico de la publicación anterior en la serie #StataProgramming, que introdujo macros globales y macros locales.

En cada comando que escribo, uso macros locales para almacenar cosas en un área de trabajo que no alterará los datos de un usuario y también facilitará la lectura de mi código. Una buena comprensión de las diferencias entre las macros globales y las macros locales me ayuda a escribir mejor código. Las diferencias esenciales entre las macros globales y las macros locales se pueden resumir en dos puntos:


  1. Solo hay una macro global con un nombre específico en Stata, y se puede acceder o cambiar su contenido por un comando de Stata ejecutado en cualquier nivel de Stata.
  2. En contraste, cada nivel de Stata puede tener una macro local de un nombre específico, y los comandos ejecutados en otros niveles de Stata no pueden acceder o cambiar el contenido de cada uno.

Sí se siente listo y cómodo con 1 y 2, omita el resto de esta publicación.

Las macros globales son globales

Los do-files globala.do y global.do, en los bloques de código globala y global, ilustran lo que significa ser global.


La forma más fácil de ver lo que este código hace es ejecutarlo; el resultado está en el ejemplo 1.


Ejemplo 1: Resultado de do globala


La linea 5 de globalb.do puede acceder al contenido de vlist creado en la linea 5 del globala.do porque vlist es una macro global.

La figura 1 presenta este mismo punto gráficamente: la macro global vlist está en la memoria global, y un comando ejecutado en cualquier lugar puede acceder o cambiar el contenido de vlist.


Macros locales son locales

Los do-files locala.do y local.do en los bloques de código 3 y 4 ilustran lo que significa ser local.


La forma más fácil de ver lo que este código hace es ejecutarlo; el resultado está en el ejemplo 2.

Ejemplo 2: Resultado de do locala


El código en los bloques 3 y 4 y la salida en el ejemplo 2 ilustran que un comando ejecutado a nivel de localb.do no puede cambiar la macro local mylist que es local a locala.do. La línea 8 de locala.do muestra los contenidos de mylist para locala.do. El contenido sigue siendo a b c después de que localb.do termine porque la macro local mylist creada en la línea 3 de locala.do es local para locala.do y no se ve afectada por la mylist creada en la línea 3 de localb.do.

La figura 2 muestra este punto gráficamente. Se puede acceder y cambiar el contenido de la macro local mylist que es local para locala.do mediante comandos ejecutados en locala.do, pero no mediante comandos ejecutados en localb.do. De manera análoga, los comandos ejecutados en localb.do pueden acceder y cambiar el contenido de la macro local mylist que es local a localb.do, pero no los comandos ejecutados en locala.do.



Hecho y sin hacer

Básicamente en esta publicación proporcioné un apéndice técnico de la publicación anterior. Ilustré que las macros globales son globales y que las macros locales son locales. Utilizaré los conceptos desarrollados hasta ahora para presentar un comando ado en la siguiente publicación.




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

jueves, 21 de febrero de 2019

Programando un comando de estimación en Stata: Dónde almacenar tus cosas.

¡Hola! La siguiente entrada es la segunda de la serie #StataProgramming

Artículo original escrito por David M. Drukker, Director Ejecutivo de Econometría.

Si me dices "yo programo en Stata", eso me hace feliz, pero no sé a qué te refieres. ¿Escribes scripts para hacer reproducible tu investigación, o escribes comandos de Stata que cualquiera puede usar y reutilizar? En la serie #StataProgramming, te mostraré cómo escribir tus propios comandos, pero empiezo por el principio. La discusión de la diferencia entre scripts y comandos aquí presenta algunos conceptos y construcciones de programación esenciales que utilizo para escribir scripts y comandos.

Este es el segundo post de la serie Programando un comando de estimación en Stata. Te recomiendo que empieces por el principio. Consulte  Programming an estimation command in Stata: A map to posted entries para un mapa de todas las publicaciones de esta serie.


Scripts versus comandos

Un script es un programa que siempre realiza las mismas tareas en las mismas entradas y produce exactamente los mismos resultados. Los scripts en Stata se conocen como archivos do y los archivos que los contienen terminan en .do. Por ejemplo, podría escribir un archivo do para

  1. leer en el conjunto de datos del Estudio Nacional Longitudinal de la Juventud (NLSY),
  2. limpiar los datos,
  3. formar una muestra para alguna población, y
  4. ejecutar un montón de regresiones en la muestra.

Esta estructura está en el corazón de la investigación reproducible; producir los mismos resultados a partir de las mismas entradas cada vez que se ejecute el archivo. Los do-files tienen una estructura única. Por ejemplo, no podría decirle a este do-file que quiero que realice las tareas análogas en el Estudio Panel sobre Dinámica de Ingresos (PSID). Los comandos son programas reutilizables que toman argumentos para realizar una tarea en cualquier tipo de datos. Por ejemplo, la regresión realiza mínimos cuadrados ordinarios en las variables especificadas independientemente de que provengan de NLSY, PSID o cualquier otro conjunto de datos. Los comandos de Stata se escriben en el lenguaje automático do-file (ado); los archivos que los contienen terminan en .ado. Los comandos de Stata escritos en el lenguaje ado se conocen como comandos ado.


Un ejemplo de do-file

Los comandos en el bloque de código 1 están contenidos en el archivo doex.do en el directorio de trabajo actual de mi computadora.


Ejecutamos los comandos al escribir do doex lo cual produce

Ejemplo 1: Resultado de do doex



  1. La línea 1 en doex.do es un comentario que ayuda a documentar el código, pero no es ejecutado por Stata. Los símbolos // inician un comentario. Todo lo que sigue a los signos // en esa línea es ignorado por Stata.
  2. En el comentario en la línea 1, puse un número de versión y la fecha en que cambié este archivo por última vez. La fecha y la versión me ayudan a realizar un seguimiento de los cambios que realizo mientras trabajo en el proyecto. Esta información también me ayuda a responder preguntas de otras personas con las que he compartido una versión de este archivo.
  3. La línea 2 especifica la definición del lenguaje Stata que uso. Stata cambia con el tiempo. La configuración de la versión garantiza que el archivo Do se siga ejecutando y que los resultados no cambien a medida que evolucione el lenguaje Stata.
  4. La línea 3 lee el conjunto de datos accident.dta.
  5. La línea 4 resume las variables accidents y tickets.


Almacenando cosas en Stata

Programar en Stata es como poner cosas en cajas, hacer que Stata cambie las cosas en las cajas y sacar las cosas cambiadas de las cajas. Por ejemplo, el bloque de código 2 contiene el código para doex2.do, cuya salida muestro en el ejemplo 2.



Ejemplo 2: Resultado de do doex2


En la línea 4 del bloque de código 2 genero la nueva variable In_traffic la cual resumo en la línea 5. doex2.do usa generate para cambiar lo que está dentro de la caja In_traffic y utiliza summarize para sacar una función de las cosas cambiadas de la caja. Las variables son el tipo de caja frecuentemente más utilizado en Stata, pero cuando estás programando, también lo serán las matrices.

Solo puede haber una variable llamada traffic en un conjunto de datos Stata y su contenido se puede ver o cambiar de forma interactiva, mediante un archivo do o un comando ado-file. De manera similar, solo puede haber una matriz de Stata llamada beta en una sesión de Stata y su contenido se puede ver o modificar de forma interactiva, mediante un do-file o un comando ado-file. Las variables de Stata y las matrices de Stata son cuadros globales porque solo puede haber una variable de Stata o una matriz de Stata en una sesión de Stata y su contenido se puede ver o cambiar en cualquier lugar de una sesión de Stata.

Lo opuesto a lo global es local. Si es local en Stata, solo se puede acceder a su contenido o cambiarlo en la sesión interactiva, en un archivo particular do, o en un archivo particular ado.

Aunque estoy discutiendo do-files en este momento, recuerde que estamos aprendiendo técnicas para escribir comandos. Es esencial comprender las diferencias entre las macros globales y las macros locales para programar comandos en Stata. Las macros globales, como las variables, podrían contener datos que los usuarios de su comando no desean cambiar. Por ejemplo, un comando que escribas nunca debe cambiar la variable de un usuario de una manera que no fue solicitada.


Niveles en Stata

La noción de que hay niveles en Stata puede ayudar a explicar la diferencia entre las macros globales y las macros locales. Supongamos que ejecuto 2 do-files o ado-files. Piense en la sesión interactiva de Stata como el nivel 0, y piense que cada archivo do o ado son los niveles 1 y 2 de Stata. Las macros globales como variables y matrices viven en la memoria global a la que se puede acceder o cambiar desde un comando ejecutado en el nivel 0, 1 o 2. Las macros locales solo pueden ser accedidas o cambiadas por un comando dentro de un nivel particular de Stata. (Esta descripción no es exactamente cómo funciona Stata, pero los detalles sobre cómo Stata realmente manejan los niveles no son importantes aquí).

La figura 1 muestra esta estructura.

Memoria por nivel en Stata


La figura 1 aclara

  • que los comandos ejecutados en todos los niveles de Stata pueden acceder y cambiar los objetos en la memoria global,
  • que solo los comandos ejecutados en el nivel 0 de Stata pueden acceder y cambiar los objetos locales al nivel 0 de Stata,
  • que solo los comandos ejecutados en el nivel 1 de Stata pueden acceder y cambiar los objetos locales al nivel 1 de Stata, y
  • que solo los comandos ejecutados en el nivel 2 de Stata pueden acceder y cambiar los objetos locales al nivel 2 de Stata.


Macros globales y locales: almacenamiento y extracción

Las macros son cajas de Stata que contienen información como caracteres, también conocidos como cadenas. Stata tiene macros globales y macros locales. Las macros globales son globales y las macros locales son locales. Se pueden acceder y cambiar a las macros globales mediante un comando ejecutado en cualquier nivel de Stata. A las macros locales se puede acceder y cambiar solo mediante un comando ejecutado en un nivel de Stata específico.

La forma más fácil de comenzar a entender las macros globales es poner algo en una macro global y luego volver a sacarla. El bloque de código 3 contiene el código para global1.do que almacena y recupera información de una macro global.



Ejemplo 3: Resultado de global1.do


La línea 3 del bloque de código 3 coloca la cadena y x1 x2 en la macro global llamada vlist. Para extraer lo que pongo en una macro global, prefijo el nombre de macro global con un $. La línea 4 del bloque de código y su salida en el ejemplo 3 ilustran este uso al extraer y mostrar el contenido de vlist.

El bloque de código 4 contiene el código para local1.do y su salida se muestra en el ejemplo 4. Ilustran cómo colocar algo en una macro local y cómo extraer algo de ella.



Ejemplo 4: Resultado de local1.do


La línea 3 del bloque de código 4 coloca la cadena y x1 x2 en la macro local llamada vlist. Para extraer lo que pongo en una macro local, encierro el nombre de la macro local entre una comilla a la izquierda (`) y una comilla a la derecha ('). La línea 4 del bloque de código 3 muestra lo que está contenido en la macro local vlist y su salida en el ejemplo 4 ilustra este uso.


Obteniendo cosas de los comandos de Stata

Ahora que tenemos las cajas, te mostraré cómo almacenar cosas computadas por Stata en estas cajas. Los comandos de análisis, como summarize, almacenan sus resultados en r(). Los comandos de estimación, como regress, almacenan sus resultados en e(). Algo tautológico, los comandos que almacenan sus resultados en r() también se conocen como comandos r-class y los comandos que almacenan sus resultados en e() también se conocen como comandos e-class.

Puedo usar return list para ver los resultados almacenados por un comando r-class. A continuación, enumero lo que summarize ha almacenado en r() y calculo la media a partir de los resultados almacenados. 


Ejemplo 5: Obteniendo resultados de un comando r-class


Los comandos de estimación son más formales que los comandos de análisis, así que guardan más cosas.

Los comandos oficiales de estimación de Stata guardan muchas cosas, porque siguen muchas reglas que facilitan la postestimación para los usuarios. No se alarme por la cantidad de cosas almacenadas por poisson. A continuación, enumero los resultados almacenados por poisson y creo una matriz de Stata que contiene las estimaciones de coeficientes. 


Ejemplo 6: Obteniendo resultados de un comando e-class




Hecho y sin hacer

En este segundo post de la serie #StataProgramming, discutí la diferencia entre scripts y comandos, proporcioné una introducción a los conceptos de objetos de memoria global y local, comenté sobre las macros globales y las macros locales, y mostré cómo acceder a los resultados almacenados por otros comandos

En la siguiente publicación de la serie #StataProgramming, analizo un ejemplo que ilustra las diferencias entre las macros globales y las macros locales.

¡Gracias por leernos!

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