jueves, 28 de noviembre de 2019

Stata en la Nube


Kevin Crow, Desarrollador Principal de Software.



A medida que más organizaciones trasladan sus necesidades de TI, gestión de datos y análisis de datos a la nube, a menudo tengo que responder estas preguntas:

¿Puede Stata ejecutarse en la nube?
¿Puedo ejecutar mi copia de Stata en la nube?
¿Cuál es la mejor configuración para Stata en la nube?
¿Cómo funciona Stata en la nube?

Antes de responder estas preguntas, definamos qué es la computación en la nube. Wikipedia define la computación en la nube como la siguiente:

“La computación en la nube es la disponibilidad a pedido de los recursos del sistema informático, especialmente el almacenamiento de datos y la potencia informática, sin una gestión activa directa por parte del usuario. El término se usa generalmente para describir los centros de datos disponibles para muchos usuarios a través de Internet ".

La razón principal por la que veo que nuestros usuarios usan la computación en la nube es para que puedan agregar fácilmente más recursos informáticos (memoria y núcleos) a los proyectos en los que están trabajando para acelerar el desarrollo y el análisis. Lo bueno de los servicios en la nube es que proporcionan una manera fácil de agregar recursos on demand. Básicamente, pagan por los recursos de hardware solo cuando los necesita, lo que ahorra tiempo y dinero y le permite escalar diferentes proyectos en consecuencia.

Ahora hablemos de plataformas en la nube. Las dos plataformas principales que veo que usan nuestros usuarios son Amazon Web Services y Microsoft Azure. Hay otras plataformas, pero estas son las principales plataformas sobre las que escucho preguntas.
Entonces, ¿puede Stata ejecutarse en la nube? Sí, Stata puede. La mayoría de las computadoras en la nube son máquinas virtuales que ejecutan sistemas operativos Linux o Windows, y Stata se ejecuta en ambos. Ahora, ¿qué flavor de Stata deberías usar, IC, SE o MP? Definitivamente recomiendo usar Stata/MP en la nube si está trabajando con grandes conjuntos de datos y los comandos de Stata que desea usar están altamente paralelizados. Para ver una lista de todos los comandos que se han acelerado y cuánto, consulte el Informe de rendimiento de Stata / MP.

Los usuarios a menudo preguntan si se les permite usar su licencia Stata en la nube. La respuesta es absolutamente. No distinguimos entre una estación de trabajo o servidor local, una máquina virtual local y una máquina virtual equivalente en la nube. Su licencia de Stata es suya para usar en cualquier computadora que desee: real, virtual o virtual en la nube.

La pregunta tres es un poco más difícil de responder. La mejor configuración depende en gran medida de sus necesidades específicas. Algunas preguntas que deberá responder son estas:

¿Con qué sistema operativo se sienten cómodos usted o sus usuarios?
¿Cuál es el tamaño típico de los datos con los que trabajará su organización?
¿Cuántos núcleos y cuánta memoria vas a asignar en la nube?
¿Cuántos usuarios accederán a esta máquina virtual en la nube al mismo tiempo?

Tenga en cuenta que estas preguntas no son específicas de la nube y realmente se aplican a cualquier configuración, en la nube o local, donde los recursos se comparten entre los usuarios. La última pregunta es importante. Una vez que su máquina en la nube (o local) tiene varios usuarios que usan Stata simultáneamente, debe asegurarse de tener una máquina lo suficientemente grande con suficiente memoria y núcleos para todos los usuarios. Por ejemplo, si tiene una licencia Stata / MP de 4 núcleos para 2 usuarios, querrá tener una máquina en la nube con al menos 8 núcleos asignados, 4 núcleos para cada usuario de Stata. O querrá activar varias instancias en la nube, dando a los usuarios sus propias máquinas virtuales.

La siguiente consideración es la memoria. Si los usuarios trabajan cada uno con un conjunto de datos Stata de 5 GB de tamaño, necesitará al menos 16 GB de RAM asignados a la máquina Cloud, 10 GB de RAM para los datos en la memoria y un poco más para la sobrecarga del sistema operativo al ejecutarse. O puede asignar dos máquinas en la nube con 8 GB de RAM cada una.

El problema más frecuente que escucho acerca de las personas que usan Stata en la nube es que los usuarios a veces compiten por la RAM porque varios usuarios están tratando de cargar grandes conjuntos de datos en la RAM al mismo tiempo en la misma computadora. La forma más fácil de evitar esto es usar la nube de la forma en que fue diseñada: ponga en funcionamiento múltiples computadoras virtuales para escalar la carga. También es fácil entrenar a los usuarios de Stata para que usen la memoria de manera eficiente. La forma de hacerlo es hacer que carguen solo las variables que necesitan analizar del conjunto de datos en el espacio de memoria de Stata y no llevar a ciegas todo el conjunto de datos a la memoria. Por ejemplo, supongamos que su usuario está trabajando con un conjunto de datos del censo de EE. UU. Que contiene 20,000 variables, pero al usuario realmente le interesa analizar solo 100 de esas variables. Stata tiene la capacidad de cargar solo las variables que necesita de un conjunto de datos de Stata con el comando use.

Si no está seguro de qué variables cargar o necesita buscar las variables exactas para cargar, puede usar la GUI de Stata 16 para buscar fácilmente las variables. Vea el video a continuación para ver cómo.


Una vez que tenga el comando de uso exacto, copie el comando en un archivo do y guárdelo para cargar datos en el futuro.

La pregunta final, sobre qué tan bien funciona Stata en la Nube, depende nuevamente de los mismos problemas discutidos anteriormente. Y no es diferente de hacer la misma pregunta sobre cómo se desempeña Stata en una computadora local.

¿Cuál es el tamaño típico de los conjuntos de datos con los que trabajará su organización? ¿Qué tipo de máquinas virtuales en la nube está utilizando, cuántos núcleos y cuánta memoria le va a asignar? ¿Cuántos usuarios accederán a esta máquina virtual en la nube al mismo tiempo? ¿Qué comandos y modelos de Stata estás usando? Los proveedores de la nube publican las especificaciones de las instancias de máquinas virtuales que puede usar, y Stata funcionará en ellas tal como lo haría en máquinas físicas equivalentes.

El tamaño de los datos, los recursos asignados y la cantidad de personas que usan los recursos simultáneamente serán los principales problemas a considerar al construir su entorno.




¡Gracias por leernos!

martes, 29 de octubre de 2019

Programando un comando de estimación en Stata: Permitir restricciones de muestra y variables factor

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


Modificaré el comando de mínimos cuadrados ordinarios (OLS) que se discutió en Programando un comando de estimación en Stata: Un mejor comando para MCO para permitir restricciones en la muestra, manejar valores perdidos, permitir variables factor, y para lidiar con la perfecta colinealidad de las variables.

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

Restricciones en la muestra

El comando myregress4 descrito en programando un comando de estimación en Stata: Un mejor comando para MCO tiene la sintaxis

myregress4 depvar [indepvars]

Donde indepvars pueden ser variables con operadores de series de tiempo. myregress5 permite restricciones en la muestra y valores perdidos. Tiene la sintaxis

myregress5 depvar [indepvars] [if] [in]

Un usuario puede opcionalmente especificar una expresión if o un rango in para restringir la muestra. También hice que myregress5 manejara valores perdidos en las variables especificadas por el usuario.




El comando syntax en la línea 5 especifica que el usuario puede opcionalmente restringir la muestra al especificar una expresión if o un rango in. Cuando el usuario especifica una expresión if, syntax lo pone dentro de una macro local if; de otra manera, la macro local if estará vacía. Cuando el usuario especifica un rango in, syntax lo pone dentro de una macro local in; de otra manera, la macro local in estará vacía.

Podemos usar las macros locales if e in para manejar restricciones en la muestra especificadas por el usuario, pero estos no se encargan de los valores perdidos en las variables especificadas por los usuarios. 

El comando marksample en la línea 6 crea una macro local llamada touse, la cual contiene el nombre de una variable temporal que es una variable identificadora de la muestra. Cada observación en la variable identificadora de la muestra tiene el valor cero o uno. Es uno si la observación está incluida en la muestra. 
Es cero si la observación está excluida de la muestra. Una observación se puede excluir de la muestra por una expresión if del usuario, por un rango in especificado por el usuario, o porque hay un valor perdido en una de las variables especificadas.

Las líneas 20 a 23 usan la variable identificadora de muestra contenida en la macro local touse para hacer que se cumplan las restricciones en los cálculos MCO.

La línea 28 envía la variable identificadora de muestra dentro de e(sample), la cual es uno si la observación fue incluida en la muestra de estimación y es cero si la observación fue excluida de la muestra de estimación.

La línea 29 guarda el número de observaciones de la muestra en e(N).
El ejemplo 1 ilustra que myregress5 ejecuta la regresión solicitada en la muestra que respeta los valores faltantes en rep78 y a la expresión if



Ejemplo 1: myregress5 con valores faltantes y una expresión if



Permitiendo variables factor



El ejemplo 1 incluye el número de repartaciones como una variable continua, pero puede tratarse mejor como un factor discreto. myregress6 acepta factores. Las listas de variables factor generalmente implican listas de variables que contienen variables perfectamente colineales, por lo que myregress6 también maneja variables perfectamente colineales.



El fv en el parentesis despues de varlist en el comando syntax de la linea 5 modifica el varlist para aceptar variables factor. Cualquier variable factor especificada es guardada en la macro local varlist en una forma canonica.

Los comandos de estimación no permiten que la variable deoendiuente sea una variable factor. El comando _fv_check_deovar en la linea 9 saldrá con un error si la macro local depvar contiene una variable factor.


La línea 15 guarda el número de columnas en la matriz formada por matrix accum en la macro local p. La línea 19 guarda el número de columnas linealmente independientes en la macro local k. Este caculo utiliza diag0cnt() para tener en cuenta las variables perfectamente colineales que se descartaron. (Cada variable descartada pone un cero en la diagonal del inverso generalizado calculado por symin() y diag0cnt() devuelve el número de ceros en la diagonal.)

Sobre la línea 29, especifico la opción builddfvinfo en ereturn post para guardar información escondida que ereturn display, contrast, margins, y pwcompare usan para etiquetar tablas y para decidir cuáles funciones de los parámetros son estimables.

La línea 31 guarda el número de variables linealmente independientes en e(rank) para comandos postestimación.


Ahora, utilizo myregress6 para incluir rep78 como una variable que puede utilizar operadores factoriales. La categoría base es descartada porque se incluye un término constante.



Ejemplo 2: myregress6 con una variable factor




Hecho y sin hacer

Modifiqué el comando de mínimos cuadrados ordinarios (OLS) que se discutió en Programando un comando de estimación en Stata: Un mejor comando para MCO para permitir restricciones en la muestra, manejar valores faltantes, permitir variables factor, y para lidiar con la perfecta colinealidad de las variables. En la siguiente publicación, muestro cómo permitir opciones para errores estándar robustos y para suprimir el término constante.


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, 24 de septiembre de 2019

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

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


Utilizaré el comando syntax para mejorar el comando que se implementa un estimador de MCO, que se discutió en Programando un comando de estimación en Stata: Un primer comando para MCO. Muestro cómo requerir que las variables sean numércias y cómo hacer que el comando acepte variables operadas por series de tiempo.

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

Sintaxis de Stata y el comando syntax

El comando myregress2 descrito en Programando un comando de estimación en Stata: Un primer comando para MCO tiene la sintaxis
myregress2 depvar [indepvars]

La sintaxis requiere que la variable dependiente sea especificada porque depvars no está encerrada entre corchetes. Las variables independientes son opcionales porque indepvars está encerrado entre corchetes. Escriba


Para una introducción a la lectura de diagramas de sintaxis de Stata.

La sintaxis es implementada por el comando syntax en la línea 5 de myregress.ad, el cual comento ampliamente en Programando un comando de estimación en Stata: Un primer comando para MCO. El usuario debe especificar una lista de nombres de variables porque varlist no está encerrada entre corchetes. La sintaxis de el comando syntax sigue las reglas de un diagrama de sintaxis.



El ejemplo 1 ilustra que myregress2 ejecuta la regresión requerida cuando yo especifico una lista de variables.


Ejemplo 1: myregress2 con variables especificas




El ejemplo 2 ilustra que el comando syntax despliega un mensaje de error y detiene la ejecución cuando yo no especifico una lista de variables. Utilizaré set trace on para ver cada línea del código y el resultado que produce.

Ejemplo 2: myregress2 sin lista de variables





El ejemplo 3 ilustra que el comando syntax está verificando que las variables especificadas se encuentren en la base de datos actual. El comando arroja un error porque DoesNotExist no es una variable en la base de datos actual.

Ejemplo 3: myregress2 con una variable que no está en la base de datos






Ya que el comando syntax en la línea 5 no está restringiendo que las variables especificadas a ser numéricas, obtengo el error no observations en el ejemplo 4 en lugar de un error que indique el problema real, el cual es la variable string make.

Ejemplo 4: myregress2 con una variable string



En la línea 5 de myregress3, modifico varlistpara que sólo acepte variables numéricas. Este cambio produce un mensaje de error más informativo cuando trato de incluir una variable string en la regresión.



Ejemplo 5: myregress3 con una variable string



En la línea 5 de myregress4, modifico varlist para que acepte series de tiempo (ts). El comando syntax pone variables de series de tiempo en una forma canónica que es guardarlas en una macro local varlist, que se ilustra en la línea 6 dentro del ejemplo 6.


Ejemplo 6: myregress4 con series de tiempo




Hecho y sin hacer

Uso el comando syntax para mejorar cómo myregress2 maneja las variables especificadas por el usuario. Mostré cómo pedir que todas las variables sean numéricas y cómo hacer que el comando acepte variables series de tiempo. En la siguiente publicación, muestro cómo hacer que el comando permita restricciones en la muestra, cómo lidiar con valores perdidos, cómo permitir variables factor, y cómo lidiar con variables perfectamente colineales.


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 














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!