20 ago 2014

Análisis de Datos con STATA (Modulo I/IV)

Tabla de Contenido
  1. Análisis exploratorio
  2. Trabajando con variables
      2.1. Creando, modificando y eliminando variables
      2.2.  Colocando etiquetas a las variables 
      2.3. Operadores de series temporales
      2.4. Operadores lógicos, variables categóricas e indicadores
      2.5. Variables en cadena
      Anexo capitulo 2
 Referencias bibliográficas 

LO RECOMENDABLE ES INSTALAR STATA PARA IR REPRODUCIENDO 
LOS COMANDO USADOS

1. Análisis exploratorio

Este permite analizar las variables contenidas en una base de datos, verificando observaciones duplicadas, posibles problemas de la base o las características de las variables presentes. Según John W. Tukey , este análisis "es, básicamente, el tratamiento estadístico al que se someten las muestras recogidas durante un proceso de investigación en cualquier campo científico". Los siguientes comandos no se explican porque las salidas se entienden triviales. (para los ejemplos  base de hogares del CASEM 2010). 

codebook Nom_Var1, mv
codebook, compact
codebook, problems
labelbook

. codebook renta
--------------------------------------------------------------------------------
renta                                                                (unlabeled)
--------------------------------------------------------------------------------

                  type:  numeric (long)

                 range:  [0,140000]                   units:  1
         unique values:  199                      missing .:  0/61847

                  mean:   221.133
              std. dev:   1119.29

           percentiles:        10%       25%       50%       75%       90%
                                 0         0         0         0       750

los estadisticos calculados con el siguiente comando se pueden recuperar y usar luego, pero entiendo que es mas sencillo llamar su calculo directamente.

summarize, d

. summarize  renta, d

                            renta
-------------------------------------------------------------
      Percentiles      Smallest
 1%            0              0
 5%            0              0
10%            0              0       Obs               61847
25%            0              0       Sum of Wgt.       61847

50%            0                      Mean            221.133
                        Largest       Std. Dev.      1119.293
75%            0          28000
90%          750          40000       Variance        1252817
95%         1500         111222       Skewness       51.97967
99%         3500         140000       Kurtosis       5572.351

describe
describe, numbers
. describe renta

              storage  display     value
variable name   type   format      label      variable label
--------------------------------------------------------------------------------
renta           long   %12.0g                 

inspect

. inspect renta

renta:                                          Number of Observations
--------                                    ------------------------------
                                            Total   Integers   Nonintegers
|  #                         Negative           -         -          -
|  #                         Zero           53629     53629          -
|  #                         Positive        8218      8218          -
|  #                                        -----     -----      -----
|  #                         Total          61847     61847          -
|  #   .   .   .   .         Missing            -
+----------------------                     -----
0                140000                     61847
(More than 99 unique values)

El comando count permite, utilizando condicionales lógicos, contabilizar observaciones que cumplen con determinadas características.

count if income<0
by division: count if sex==3

datasignature report  // determina si los datos han cambiado

*Distintas forma de usar el comando
. browse pais year
. browse in 1/13
. browse if porcent==.
. browse pais year tasamort in 5/-5 if porcent>=15


El browse puede hacer muchas de las mismas cosas que hace la orden list. Pero es más conveniente porque lo deja desplazarse. El comando duplicates, permite, de diferentes formas verificar posibles observacioens duplicadas. (La tercera linea muestra una variable dicotomica que contabiliza las obs. duplicadas)

duplicates — Report, tag, or drop duplicate observations
duplicates report
duplicates tag, generate(newvar)//genera una new var que identifica duplicados
duplicates drop   //elimina duplicados
duplicates list

STATA también permite generar estadísticos de cada variables:

egen meanIncome = mean(income)
egen meanIncome = sum(children)
egen nPeople    = count(personID)
egen meanIncome = sd(income

2. Trabajando con variables

Aunque no se presenta en los informes finales, el tratamiento de variables es imprescindible para el análisis de datos. Stata te permite manejar diferentes tipos de variables según la información que contenga, Números, Fechas y Textos (string o formato en cadena), todas las opciones que se pueden realizar con una variable se resume en el menú Varmanage al que se puede acceder colocando en la ventana de comando la siguiente instrucción:

varmanage                    [Abre el gestor de variables]

Para cambiar el nombre de una variable solo es necesario utilizar el comando [rename] seguido del nombre de la variable que deseamos cambiar el nombre y del nuevo nombre.

. Rename var1 new_non_var    
      

2.1. Creando, modificando y eliminando variables

Las variables no pueden comenzar por números, ni tener espacios en blanco en su nombre ademas que el software es sensible a mayúsculas y minúsculas. Ademas si ya existe otra variable con ese nombre el programa dará un mensaje de error. El comando para generar variables es generate, que puede abreviarse como gen. Ejemplos:

. generate var4 =var1 +var2
. generate var5 = var1 /var2 if dum==1  // genera una variable con condicionante
. generate x=uniform()                  //generando numeros aleatorios
. generate x=invnorm(uniform())        //generando num aleat. N(0,1) 
. gen “non_var” = int(runiform()*100)+1         [genera valores aleatorios]
. gen aleatorio_bi    = int(runiform(n,q)    [gen valores ale, binomial]
. gen aleatorio_normal= rnormal(n,q)     [gen valores ale, distribución normal]

El comando drawnorm permite generar bases de números aleatorios. Por ejemplo se puede usar el siguiente comando para generar 1000 observaciones de números aleatorios normales, para cada una de las variables.

. drawnorm x1 x2 x3, n(1000)

En la segunda de estas órdenes, Stata asignará un “missing value”,., a aquellas observaciones que no cumplen la condición señalada después de if (En la creación de variables es importante manejar los operadores lógicos y la orden by). También podemos generar una variable considerando cada valor de una variable de referencia. Para ello es necesario que los datos estén ordenados según dicha variable. Ejemplo :

. bysort iden: gen var4 =sum(var2 )

la orden by trata las observaciones por grupos según el valor de la variable especificada
después de by (Alonso Borrego & Sánchez Mangas). Con un ejemplo es mas facil de entender, si utilizamos el sigiente comando hipotético, estaremos obteniendo una nueva variable que me asigna en cada observación la edad media de cada hogar (by hogar).  

. bysort hogares: gen mean_edad = mean(edad)

Además, podemos opcionalmente especificar la precisión de la variable que vamos a generar. Por ejemplo:

. gen double var5 =ln(var1 )
gen t = daily(dstr, "mdy")   //formato de fechas

Cuando se desea alterar valores de una variable se utiliza replace. STATA no permite crear dos variables con el mismo nombre, pero si remplazar parte del contenido de una variable. Funciona exactamente igual que [generate] pero funciona con variables ya existente. En el siguiente ejemplo se ve como utilizar dicho comando, en el mismo se remplaza por 65 el valor de la edad de todas las personas con edad mayor a 65 años. ES RECOMENDABLE NO ALTERAR VALORES ORIGINALES DE LAS BASES, MEJOR CREAR VARIABLES NUEVAS.

. replace edad=65 if edad>=65

El comando recode, también es útil para trabajar variables, ademas permite colocar etiquetas de clases a las variables, esto ultimo es muy útil para clasificar datos por clases.

. generate age=edad
. recode age 16/24=1 25/34=2 35/44=3 45/54=4 55/64=5 *=9

Esto permite crear una nueva variable, categorizada con números que representan rangos de edad, pero la presentación de la información generalmente requiere etiquetas para que los datos sean presentables. Una forma de colocar etiquetas a las variables es:

. label age “Categorical Age Variable”  //recomendable para entender de que va cada var
. label define age 1 “Menor de 24” 2 “25-34” 3 “35-44” 4 “45-54” 5 “55-64” 9 “Mayor a 64”

Una forma alteratvia es:

. recode age (16/24=1 “Under 24”) (else=99) …. , into(nom,nw_var) 

"Existe una extensión del comando generate, el comando egen. Este comando genera variables que vienen expresadas como ciertas funciones de otras variables. También es posible declarar la precisión de la variable que queremos generar", así como combinar el comando con if e in. Ejemplos:

.  egen var7=max(var1 +var2 ) if dum==1
.  egen d=fill(10 20 to 50 10 20 to 50)
. egen rank = rank(mpg)

El comando también permite llamar estadísticos de las variables y contar valores perdidos:

. egen stdedad = std(edad)
. egen       e = max(edad)
. egen    nobsMiss = rownonmiss(varlist) /*cuenta valores perdidos*/

Este comando es especialmente útil cuando queremos obtener sumatorias de variables, y se aprovecha para itroducir la diferencia entre los comandos rowtotal y sum. Ejemplo. Tenemos tres variables esco exp_lab y pens, que representan años de escolaridad, experiencia laboral y años de pensionado.

. egen agesum = rowtotal(esco exp_lab y pens) //suma directametne
. gen  ageAcu = sum(agesum)                   //suma acumulada
. egen sum = total(agesum)

. list in 1/3

  Esco  exp_lab  pens  agesum    ageAcu Sum
1.   16       32    2       50       50   66
2.    8        4    .       12       62   66
3.    4        .    .        4       66   66

Ademas el comando sum() arroja resultados distintos, dependiendo de si se usa gen o egen. Siempre lo mejor es un ejemplo.

. gen var8=sum(var1 )
. egen var9=sum(var1 )

var1   Var8    var9
45.6   45.6    205.9
23.6   69.2    205.9
12.5   81.7    205.9
78.9   160.6   205.9
45.3   205.9   205.9

A veces no desearemos tener todas las variables en el espacio de trabajo, muchas veces desearemos trabajar solo con algunas variables de nuestra base de datos (Modelaje estadístico utilizando el paquete STATA, 2005).

. clear *borra todos los datos de la memoria
. drop var1 *borra una sola variables
. drop n*    * borra todas las variables cuyo nombre inicie con n
. drop in n   *borra una determinada observación
. drop if exp *borra observación que cumplan tal condición
. drop if edad~=50 in -5 *combina los comandos anteriores
. keep if edad~=50 in -5 * indica al programa que solo mantenga estas 

2.2. Colocando etiquetas a las variables

Las etiquetas son muy útiles para entender las variables, son textos que acompañan al nombre de la variable o la base de datos que permiten identificar más fácilmente el contenido de las mismas. El nombre de la variable puede tener hasta 32 caracteres.     

. label data “Etiqueta”
. label variable “Etiqueta”  

En ocasiones las variables como el sexo vendrán especificadas de forma dicotómica (0/1) y nos será útil colocar etiquetas que nos permitan identificar cuáles son hombres y mujeres. Ahora colocar etiquetas de valores es un poco más complejo: 1. Se asignan etiquetas a los valores contenidos en una variable determinada. Anteriormente se observo que el comando recode permite simplificar la forma de colocar estas etiquetas.

label define nonvar_x   1  “Hombre”

label drop: elimina las etiquetas. Etiquetas-Labels
label dir: lista el nombre de las variables que tienen etiqueta
label list: lista los nombres de las variables el valor que tienen y el texto asociado                   Etiquetas-Labels

2.3. Operadores de series temporales

STATA permite usar operadores de series temporales: lags (L), leads (F), Diferencias (D)y estacionales (S). El comando clave para poder usar operadores de series temporales es .tsset

gen t = daily(dstr, "mdy")   //formato de fechas
. generate date = month + "/" + day + "/" + year
. generate edate = date(date, "MDY")
. format edate %td

. gen year=_n+1980  *genera una variable de tendencia, sumando uno
    /*_N indica el número de observaciones en STATA
      _n indicia el numero de una observación, la fila */

Una expresión usada con frecuencia en la edición de variables es [_n], este permite hacer referencia al orden de la observación en la matriz de datos, esto nos permite generar por ejemplo tasas de crecimiento:

. gen “non_new_var”  =(“non_var” - “non_var” [_n-1] ) / “non_var” [_n-1] *100

La generación de retardos y diferencias es muy simple. Ejemplos:

gen var_1=L1.var1  *genera la variable var1 retardada un período, y la almacena en una llamada var1_1.
gen var1_2=L2.var1 *genera la variable var1 retardada dos períodos y la almacena en una llamada var1_1.

gen d2var1=D2.var1 *genera la variable var1 en primeras diferencias, y la almacena en d1var1.
gen d2var1=D2.var1 *genera la variable en segundas diferencias

Si después de los operadores L y D no especificamos ningún número, Stata genera por defecto primeros retardos y primeras diferencias respectivamente. Además Stata permite, mediante los comandos L y D, utilizar retardos y diferencias de variables aunque éstas no hayan sido generadas previamente. Por ejemplo,

gen x=var1+L1.var2  *suma de la variable var1 y el primer retarlo de la variable var2

2.4. Operadores lógicos, variables categóricas e indicadores

También se pueden usar operadores lógicos para crear variables mas profundas.  (function lógica condicional “si” utilizada en Excel). if representa la operacion logica a cumplir, then el valor que devolverá en caso de ser cumplirse y else la operación a realizar en caso de no cumplirse.

gen val = cond(if, then, else)

gen votantes = cond(age>=18, 1, 0) *colocara 1 en caso de tener 18 o 

El comando generate permite además generar variables dicotómicas, cuya media significa la proporción las personas en la población. El próximo cuadro muestra un ejemplo del mismo, comúnmente utilizado para calcular incidencia de la pobreza monetaria. Además una forma de no tener que tomar en cuenta dos expresiones lógicas es creando un comando que tome valores 1 si es verdadero y 0 si es falso.

. gen pobre = 1 if  ingresos_pc <=3000 & IDlab_tot>0
.  mean  pobre

Además al colocalar la palabra [missing], los sujetos que no corresponden se catalogan como valores perdidos.

. gen pobre=1 if  IDlab_tot<3000 & IDlab_tot>0 , missing

Una variable indicador indica si para la muestra estudiada, cierta característica es cierta o falsa. Construcción de una variable indicador a partir de una variable continua

. gen d1=(var1 >25)

genera una variable indicador d1, que tomará el valor 1 para las observaciones para las que var1>25 y 0 para el resto. Por defecto, la variable d1 que genera Stata será float, pero dado que sólo va a tomar los valores 1 y 0, es mejor generarla como byte para ahorrar memoria. Por tanto, es mejor generarla como:

. gen byte d1=(var1 >25)
. generate str8 pais = “Nom_content”

Hay que tener en cuenta que si existen missing values (valores perdidos), éstos son considerados mayores que cualquier otro valor, por tanto, es mejor generar la variable de forma que sólo tome los valores 0 y 1 para las observaciones donde no hay missing value. Entonces, la forma de generar la variable es:

. gen byte d1=(var1 >25) if var1 != .

De esta forma, la variable d1 tendrá un missing value en aquellas observaciones en las que la variable var1 = . Otra forma de generar la variable d1 es en dos pasos, del siguiente modo:

. gen d1=1 if var1 >25 & var1 != .
. replace d1=0 if var1 <25

Supongamos que queremos crear, para nuestra variable categórica categ, que toma los valores 5, 10 y 20, variables indicador llamadas, por ejemplo, indi, que indiquen cuándo la variable categ toma cada uno de esos valroes. Podemos hacerlo con la siguiente instrucción:

tab “nom_var_categ”, gen(nom_new_var)

El resultado será una tabla de frecuencias de la variable categ, y la creación de tres
nuevas variables: indi1 (que vale 1 cuando categ=5 y 0 en el resto de los casos), indi2
(que vale 1 cuando categ=10 y 0 en el resto de los casos) e indi3 (que vale 1 cuando
categ=20 y 0 en el resto de los casos).

2.5. Variables de cadena (texto)

El comando gen permite trabajar variables en cadena, pero con la salvedad de que hay que colocar el texto entre comillas.

gen where = "D" if foreign==1

El comando split separa el contenido de una variable tipo string en dos o más partes, usando un carácter que indica separación, de modo que se generan nuevas variables tipo string. Es _útil para separar palabras, códigos u otras partes de una variable tipo string de información múltiple. (Orihuela, 2009). Queremos separar el tipo de documento del número, en dos variables.

Anexo capitulo 2

clonevar airtrain = mode if mode == 1 | mode == 2        [CLONAR VARIABLES]
sort var1                               [ordena variables de menor a mayor]
gsort var1                              [ordena variables de mayor a menor]
order           [cambiar el orden en que aparecen las variables en la base]
list                                [Mostrar los datos de una o varias variables]
list var1 var2
list var1 in 2/10
list var1 in 90/l
list year if iden>10 & year!=1990
list year var1 in 2/50 if var1 <=var2 | dum==0

transformacion de variables
Encode    : Crea una nueva variable transformando el formato texto en numérico.
Decode    : Crea una nueva variable transformando el formato numérico en texto.
Destring  : Convierte vbles de texto en numéricas
Totstring : Viceversa



Bibliografía
Abuín, J. M. (Febrero de 2008). Curso de introducción al paquete Stata. (C. S. Científicas, Ed.) Recuperado el 2013
Alonso Borrego, C., & Sánchez Mangas, R. (s.f.). Stata, Guia de utilizacion. (U. C. Madrid, Ed.) Recuperado el Enero de 2013
Babigumira, R., Cotta, J., de Souza, C., & Pablo, P. (2010). REFERENCIA RÁPIDA PARA INSTRUCCIÓN EN STATA, Comandos importantes en Stata. Recuperado el Enero de 2013, de dataninja.wordpress.com.
Escudero, W. S. (febrero de 2007). Guía Rápida Stata. Recuperado el 15 de Enero de 2013
Fuentes, J., & Palma, A. (s.f.). (G. d. Chile, Ed.) Recuperado el 13 de Enero de 2013, de Manual STATA
Garcia, J. R. (Noviembre de 2007). Introducción al Stata 9. (E. d. salud, Ed.) Madrid.
Gresia, L. D. (Marzo de 2012). Introducción a Stata. Recuperado el Enero de 2013, de Facultad de Ciencias Económicas Universidad Nacional de La Plata.
Jiménez-Martín, S. (2001). Recuperado el 6 de Enero de 2013, de Universidad Carlos III de Madrid.
Maldonado, L. (2010). Stata tips para e cuesta de panel. En U. A. Hurtado (Ed.). Chile.
(2005). Modelaje estadístico utilizando el paquete STATA.
Nicoletti, N. P. (2011). Introduction to Stata 11: Getting Started with Stata Programming. University at Buffalo (SUNY), Department of Political Science, Estaedos Unidos.
Orihuela, J. C. (2009). Stata Basico Intermedio Aplicado a la Investigacion Economica. capacitacion@iddeasac.com.
Rojo, J. M. (15 de febrero de 2008). (C. d. Sociales, Ed.) Recuperado el Enero de 2013
Simons, K. L. (2011). Useful Stata Commands.

Recesión plot en R usando ggplot (recession plot in r)

En el siguiente ejemplo se simular y replica -parcialmente- un ejemplo usado por el FMI para ilustrar la importancia del uso de series de ti...