12 nov 2016

Ejemplos de tablas en Stata




Las tablas de frecuencia absoluta nos permiten contabilizar casos que cumplen con determinadas condiciones, Stata genera este tipo de tablas mediante diversas formas, una de ella es mediante el comando tabulate, en el mismo, tal como muestran los siguientes ejemplos, podemos además introducir filtros, condicionales, factores de expansión y las demás bondades de Stata (Alonso Borrego & Sánchez Mangas) .

* Tabla de frecuencia absoluta, relativa y relativa acumulada
. tabulate foreign

   Car type |      Freq.     Percent        Cum.
------------+-----------------------------------
   Domestic |         52       70.27       70.27
    Foreign |         22       29.73      100.00
------------+-----------------------------------
      Total |         74      100.00

Especificándole dos variables, también podemos obtener una tabla de contingencia cruzada:

. tabulate mpg  foreign

   Mileage |       Car type
     (mpg) |  Domestic    Foreign |     Total
-----------+----------------------+----------
        12 |         2          0 |         2
        14 |         5          1 |         6
        15 |         2          0 |         2
        16 |         4          0 |         4
        17 |         2          2 |         4
      ...
        41 |         0          1 |         1
-----------+----------------------+----------
     Total |        52         22 |        74

También podemos introducir filtros o condicionales a nuestras tablas, esto resulta interesante cuando deseamos restringir nuestro análisis a solo un grupo especial de la población. El próximo comando muestra la tabla de frecuencias de las variables sólo para las observaciones que cumplen la expresión especificada después del if.


Los estadísticos descriptivos constituyen una de las primeras miradas brindada a nuestra base de datos,  Utilizando las especificaciones de contenido, se obtiene la tabla, conteniendo la deviación y la media de los precios según el origen de producción de los coches.

. table foreign, contents (n price mean price sd  price )

-------------------------------------------------
 Car type |    N(price)  mean(price)    sd(price)
----------+--------------------------------------
 Domestic |          52      6,072.4     3097.104
  Foreign |          22      6,384.7     2621.915
-------------------------------------------------

“Añadiendo además la opción row (col), la tabla incluirá una fila (columna) adicional con los valores totales, para cada valor de las opciones que aparecen”.

table foreign, contents (n price mean price sd  price ) row

-------------------------------------------------
 Car type |    N(price)  mean(price)    sd(price)
----------+--------------------------------------
 Domestic |          52      6,072.4     3097.104
  Foreign |          22      6,384.7     2621.915
          |
    Total |          74      6,165.3     2949.496

Podemos también solicitar as estadísticas para diversas variables, pero también podemos obtener muchos otros estadísticos descriptivos (Gresia, 2012), como por ejemplo:

tabstat price length weight if foreign == 1, s(count min max mean sd cv sk p50 p50 p75 p90)

   stats |     price    length    weight
---------+------------------------------
       N |        22        22        22
     min |      3748       142      1760
     max |     12990       193      3420
    mean |  6384.682  168.5455  2315.909
      sd |  2621.915  13.68255  433.0035
      cv |  .4106571  .0811802  .1869691
skewness |  1.215236  .0809646  1.056582
     p50 |      5759       170      2180
     p50 |      5759       170      2180
     p75 |      7140       175      2650
     p90 |      9735       189      2830
----------------------------------------


tabulate foreign, summarize( price)

            |          Summary of Price
   Car type |        Mean   Std. Dev.       Freq.
------------+------------------------------------
   Domestic |   6,072.423   3,097.104          52
    Foreign |   6,384.682   2,621.915          22
------------+------------------------------------
      Total |   6,165.257   2,949.496          74


El comando table, también nos permite utilizar una cantidad importante de comandos. Los ejemplos de esta sección utilizan la Encuesta Nacional de Fuerza de Trabajo (ENFT) correspondientes al mes de Abril2010 para generar tabulados.

Ejemplo 1. Población por rango de edad:
En muchas ocasiones necesitaremos re-codificar variables cuantitativas, para obtener grupos de la mismas, por tanto antes de usar el comando table debemos re-codificar las variables de nuestro interés. Además, aprovechemos el presente ejemplo para explicar el uso del Script.

/*
Autor: Nerys
Versión: 12/11/2016
Descripción: explica como realizar tabulados
usando encuestas de hogares de la real real
*/

clear all
  cd "C:\Users\Nerys Ramierz\Dropbox\Materia, Seminario de la Investigación\Documentos compartidos Seminario\Nivelación STATA"
       capture log using "Results_table", t replace
       set more off

       *carga la base de datos
       use ENFTAbril2010
      
       *Ejemplo 1
       recode eft_edad (1/14=0 "Niños") (15/64=1 "PET") (else=3 "adultosM"), into(edadR)
       table edadR

----------------------
RECODE of |
eft_edad  |
(EFT_EDAD |
)         |      Freq.
----------+-----------
    Niños |      8,655
      PET |     19,034
 adultosM |      2,804
----------------------

Observe que en el ejemplo anterior obtuvimos el número de personas presente en la encuesta, por lo que nuestro objetivo es obtener el dato de la población en total, en tal sentido necesitaremos utilizar el factor de expansión presente en la encuesta. Si recordamos la sintaxis del programa solo debemos modificar levemente el comando anterior:

table edadR [fw=eft_factor_exp]

----------------------
|(EFT_EDAD |
)         |      Freq.
----------+-----------
    Niños |    2663955
      PET |    6259825
 adultosM |    829,277
----------------------

Pero observe que no siempre los datos son arrojados en el formato que deseamos, Stata permite especificarle al programa el tipo de datos en que deseamos se imprima nuestra tabla en la pantalla de resultados. Note que mediante la opción format podemos acceder a una cantidad importante de formatos en nuestras tablas.

table edadR [fw=eft_factor_exp], format(%10.0fc)

----------------------
RECODE of |
eft_edad  |
(EFT_EDAD |
)         |      Freq.
----------+-----------
    Niños |  2,663,955
      PET |  6,259,825
 adultosM |    829,277
----------------------

El comando table también nos permite cruzar nuestra información según otros tipos de variables categóricas como el sexo o el estado civil, solo especificando el nombre de las variables:

Ejemplo 2. Población por sexo, según rango de edad
Note en este ejemplo que es necesario muchas veces recodificar las variables originales de nuestra base de datos, de forma tal que en los resultados nos salgan las etiquetas de los valores y no los valores como tal.

table edadR sexo [fw=eft_factor_exp], format(%10.0gc)

----------------------------------
RECODE of |
eft_edad  |   RECODE of eft_sexo 
(EFT_EDAD |       (EFT_SEXO)     
)         |     hombre       mujer
----------+-----------------------
    Niños |    1339490     1324465
      PET |    3121364     3138461
 adultosM |    395,444     433,833
----------------------------------

También podemos adherir las marginales (totales) a las tablas anteriores:

table edadR sexo [fw=eft_factor_exp], row col format(%13.0gc)

-------------------------------------------------------
RECODE of |
eft_edad  |
(EFT_EDAD |        RECODE of eft_sexo (EFT_SEXO)      
)         |        hombre          mujer          Total
----------+--------------------------------------------
    Niños |     1,339,490      1,324,465      2,663,955
      PET |     3,121,364      3,138,461      6,259,825
 adultosM |       395,444        433,833        829,277
          |
    Total |     4,856,298      4,896,759      9,753,057
-------------------------------------------------------


En muchas ocasiones preferiremos obtener los resultados en términos relativos, es decir expresados en porcentajes. En el ejemplo anterior obtuvimos la población por sexo, según grandes grupos de edad, pero suponga que necesitamos saber cómo se distribuyen esos grupos de edad según sexo, esto se puede lograr utilizando el comando tabulate.

Ejemplo 3. Distribución de la población por sexo, según rango de edad
Note en la siguiente tabla que obtuvimos la distribución de la población por sexo, según rango de edad, en tal sentido se puede interpretar como que el 27.05% de la población femenina del país tienen menos de 15 años. (Según sean filas o columnas nos indica relativo a que variables esta expresado el porcentaje)

tab edadR sexo [fw=eft_factor_exp], nofreq col

 RECODE of |  RECODE of eft_sexo
  eft_edad |      (EFT_SEXO)
(EFT_EDAD) |    hombre      mujer |     Total
-----------+----------------------+----------
     Niños |     27.58      27.05 |     27.31
       PET |     64.27      64.09 |     64.18
  adultosM |      8.14       8.86 |      8.50
-----------+----------------------+----------
     Total |    100.00     100.00 |    100.00

También podemos estar interesados en conocer qué porcentaje de la población es varón o hembra en cada grupo de edad, en tal sentido necesitamos establecer el porcentaje en referencia a las filas, lo anterior se logra de manera fácil insertando la opción row en el comando anterior.

Ejemplo 4. Distribución de la población por sexo, según rango de edad
tab edadR sexo [fw=eft_factor_exp], nofreq row

 RECODE of |  RECODE of eft_sexo
  eft_edad |      (EFT_SEXO)
(EFT_EDAD) |    hombre      mujer |     Total
-----------+----------------------+----------
     Niños |     50.28      49.72 |    100.00
       PET |     49.86      50.14 |    100.00
  adultosM |     47.69      52.31 |    100.00
-----------+----------------------+----------
     Total |     49.79      50.21 |    100.00

También el comando tabulate permite realizar tablas en frecuencia relativa al total.

tab edadR sexo [fw=eft_factor_exp], nofreq cell

 RECODE of |  RECODE of eft_sexo
  eft_edad |      (EFT_SEXO)
(EFT_EDAD) |    hombre      mujer |     Total
-----------+----------------------+----------
     Niños |     13.73      13.58 |     27.31
       PET |     32.00      32.18 |     64.18
  adultosM |      4.05       4.45 |      8.50
-----------+----------------------+----------
     Total |     49.79      50.21 |    100.00

Por último, tenga pendiente que podemos incorporar todas o muchas de las opciones anteriores en una misma tabla modificando levemente el comando anterior. Evitaremos utilizar este tipo de tablas debido a que la lectura puede llevar a confusiones.

tab edadR sexo [fw=eft_factor_exp], row col

+-------------------+
| Key               |
|-------------------|
|     frequency     |
|  row percentage   |
| column percentage |
+-------------------+

 RECODE of |  RECODE of eft_sexo
  eft_edad |      (EFT_SEXO)
(EFT_EDAD) |    hombre      mujer |     Total
-----------+----------------------+----------
     Niños | 1,339,490  1,324,465 | 2,663,955
           |     50.28      49.72 |    100.00
           |     27.58      27.05 |     27.31
-----------+----------------------+----------
       PET | 3,121,364  3,138,461 | 6,259,825
           |     49.86      50.14 |    100.00
           |     64.27      64.09 |     64.18
-----------+----------------------+----------
  adultosM |   395,444    433,833 |   829,277
           |     47.69      52.31 |    100.00
           |      8.14       8.86 |      8.50
-----------+----------------------+----------
     Total | 4,856,298  4,896,759 | 9,753,057
           |     49.79      50.21 |    100.00
           |    100.00     100.00 |    100.00

 
Observe que en las tablas anteriores deseamos contabilizar el número de personas en cada caso, no obstante puede ser que estemos interesados en obtener estadísticos como la edad  promedio de cada grupo cruzado, el índice académico promedio de algún grupo de la población o así sucesivamente, la edad máxima, la edad mínimo, la mediana… etc. Con este tipo de tablas nos ayuda el comando table, veamos algunos ejemplos.

Ejemplo 5. Edad promedio de la población por sexo, según grupo de edad
En el ejemplo siguiente observe nos amparamos del comando contents para especificarle que deseamos obtener en el cuerpo del cuadro. Tenga presente que en muchas ocasiones necesitamos modificar el formato en como aparecen nuestros datos.

table edadR sexo [fw=eft_factor_exp], contents(mean eft_edad ) row col format(%2.1gc)

----------------------------------
RECODE of |
eft_edad  |   RECODE of eft_sexo 
(EFT_EDAD |       (EFT_SEXO)     
)         | hombre   mujer   Total
----------+-----------------------
    Niños |    7.9     7.8     7.9
      PET |     34      35      34
 adultosM |     60      62      61
          |
    Total |     29      30      29
----------------------------------

Respecto a los estadísticos que puede contener el comando table, debemos verificar la ayuda del probrama.

help table

freq                 frequency
      mean varname         mean of varname
      sd varname           standard deviation
      semean varname       standard error of the mean (sd/sqrt(n))
      sebinomial varname   standard error of the mean, binomial distribution (sqrt(p(1-p)/n))
      sepoisson varname    standard error of the mean, Poisson distribution (sqrt(mean))
      sum varname          sum
      rawsum varname       sums ignoring optionally specified weight
      count varname        count of nonmissing observations
      n varname            same as count
      max varname          maximum
      min varname          minimum
      median varname       median
      p1 varname           1st percentile
      p2 varname           2nd percentile
      ...                  3rd-49th percentile
      p50 varname          50th percentile (median)
      ...                  51st-97th percentile
      p98 varname          98th percentile
      p99 varname          99th percentile
      iqr varname          interquartile range


Esta sentencia permite realizar tablas cruzadas por más de 4 variables. Ya anteriormente utilizamos el siguiente comando para obtener los resultados mostrados en la siguiente tabla, ahora usaremos el comando by, para repetir la instrucción ya sea por provincia, por zona de residencia, por sexo… o así sucesivamente.

table edadR sexo [fw=eft_factor_exp], row col format(%13.0gc)

-------------------------------------------------------
RECODE of |
eft_edad  |
(EFT_EDAD |        RECODE of eft_sexo (EFT_SEXO)      
)         |        hombre          mujer          Total
----------+--------------------------------------------
    Niños |     1,339,490      1,324,465      2,663,955
      PET |     3,121,364      3,138,461      6,259,825
 adultosM |       395,444        433,833        829,277
          |
    Total |     4,856,298      4,896,759      9,753,057
-------------------------------------------------------

Para hacer lo anterior, por ejemplo por zona nos amparamos de la opción by() en el comando table:
  
Ejemplo 4. Distribución de la población por sexo, según rango de edad
table edadR sexo [fw=eft_factor_exp], by(zona) row col format(%13.0gc)

-------------------------------------------------------
zona and  |
RECODE of |
eft_edad  |
(EFT_EDAD |        RECODE of eft_sexo (EFT_SEXO)      
)         |        hombre          mujer          Total
----------+--------------------------------------------
Urbano    |
    Niños |       857,642        873,543      1,731,185
      PET |     2,099,006      2,214,729      4,313,735
 adultosM |       231,353        289,649        521,002
          |
    Total |     3,188,001      3,377,921      6,565,922
----------+--------------------------------------------
Rural     |
    Niños |       481,848        450,922        932,770
      PET |     1,022,358        923,732      1,946,090
 adultosM |       164,091        144,184        308,275
          |
    Total |     1,668,297      1,518,838      3,187,135
-------------------------------------------------------


En la parte interna del comando by(zona) podemos colocar otras variables:

table edadR sexo [fw=eft_factor_exp], by(zona eft_computadora) row col format(%13.0gc)

Los resultados anteriores son sumamente útil cuando nos ayudan a resumir la cantidad de veces que repetiremos un comando en nuestro scritp. Pero también se puede obtener dicho resultado en una sola tabla solo re-ordenando el comando table.

table edadR sexo zona [fweight = eft_factor_exp], row col format(%12.0fc)

------------------------------------------------------------------------------------------------
RECODE of |
eft_edad  |                        zona and RECODE of eft_sexo (EFT_SEXO)                      
(EFT_EDAD | ---------------- Urbano ----------------    ----------------- Rural ----------------
)         |       hombre         mujer         Total          hombre         mujer         Total
----------+-------------------------------------------------------------------------------------
    Niños |      857,642       873,543     1,731,185         481,848       450,922       932,770
      PET |    2,099,006     2,214,729     4,313,735       1,022,358       923,732     1,946,090
 adultosM |      231,353       289,649       521,002         164,091       144,184       308,275
          |
    Total |    3,188,001     3,377,921     6,565,922       1,668,297     1,518,838     3,187,135
------------------------------------------------------------------------------------------------

 En el caso anterior debemos agregar la obpcion scol al final, para obtener la suma total, equivalente a la población en general.





Creando variables por grupos en dplyr (group_by + mutate)

  Simulemos una base de hogares, donde se identifica el hogar, el sexo (1 mujer) y provincia y edad para cada miembro.   # Definir la lista ...