En
esta nueva entrada de nuestro blog daremos un recorrido por las opciones que
tiene Stata para que podamos fusionar bases de datos a través del comando merge, ampliamente utilizado por aquellos que
trabajan con microdatos.
El
comando merge une las observaciones contenidos en la base de datos en la que se
trabaja en el momento, a esta base la llamaremos base maestra, con otra base de datos, a esta la llamaremos base de uso; estas bases deben de coincidir
en al menos una variable en común, que llamaremos llave. Entonces, podremos utilizar este comando para agregar nuevas
variables provenientes de un segundo conjunto de datos a nuestras observaciones
existentes en la base de datos que estemos trabajando, asimismo, podemos
agregar simultáneamente nuevas observaciones y variables, siempre y cuando
exista una llave que pueda relacionarse a las nuevas observaciones.
Para
estos efectos, merge realiza cuatro tipos de uniones respecto a la o las variables llave
contenidas en las bases que deseemos unir; estas son: uno a uno, uno a muchos,
muchos a uno, y muchos a muchos. La sintaxis para este comando requiere que se
especifique el nombre de las variables llave (varlist) y el nombre o ubicación de la base de uso (filename); según el tipo de unión que se
realizará, la sintaxis será la siguiente:
- Unión
uno a unomerge 1:1 varlist using filename
- Unión muchos a uno merge m:1 varlist using filename
- Unión uno a muchos merge 1:m varlist using filename
- Unión muchos a muchos merge m:m varlist using filename
Todos
estos comandos crean una nueva variable que contiene códigos numéricos
relacionados con la fuente y el contenido de cada observación de la base de
datos que resulta de la unión, por la cual la llamaremos base resultado.
Ahora
bien, pensemos en un caso práctico: la Encuesta Nacional de Ingresos y Gastos
de los Hogares en México. La fuente de información, el Instituto Nacional de
Estadistica y Geografía, ofrece 12 bases de datos donde se recolecta la
información; en el diseño muestral de la encuesta toman en cuenta las
viviendas, los hogares y a las personas como nivel de desagregación de la
información, por lo cual cada base de datos cuenta con al menos un nivel de
desagregación; estas variables, identificadas con un folio, serán nuestras
variables llave (folioviv, foliohog, numren).
A
continuación, ejemplificaremos la unión uno a uno. Abriremos la base “hogares”,
contiene características de los hogares que habitan los integrantes de los
mismos.
. use hogares.dta
. describe, short
Con la opción short, Stata nos arrojará una descripción
corta de la base de datos, pues para fines de esta entrada sólo nos interesa
saber el número de observaciones (70,311).
Contains data from C:\Blog\hogares.dta
obs: 70,311
vars: 137
size: 37,475,763
Sorted by:
Las variables llave con las que
cuenta esta base son folioviv y foliohog. La única base que, sin hacer
modificaciones a ninguna de ellas, podemos unir uno a uno es “concentradohogar”,
ya que su nivel de desagregación es a nivel hogar. Como paréntesis, cerraremos
nuestra base hogares para poder echar un vistazo a la base concentradohogar
para después volver a abrirla.
. use concentradohogar.dta, clear
. des, short
Contains data from C:\Blog\concentradohogar.dta
obs: 70,311
vars: 127
size: 68,131,359
Sorted by:
. use hogares
En la base concentradohogar se
encuentran las variables construidas a partir de las otras bases de datos de la
ENIGH. Tenemos el mismo número de observaciones debido a que en ambas bases los
hogares son la unidad de observación, por lo cual podemos realizar la unión uno
a uno de la siguiente manera:
. merge 1:1 folioviv foliohog using concentradohogar
Stata despliega un breve informe del
proceso de unión, en donde detalla cuántas observaciones se unieron. En nuestro
caso, las 70,311 observaciones se unieron; los caracteres que aparecen entre
paréntesis son los códigos que tiene la variable creada durante la unión para
identificar la fuente de las observaciones en la base resultado, siendo (_merge==3)
el código que informa que la observación aparece originalmente tanto en la base
maestra como en la base de uso. Por lo cual podemos estar seguros de que en
ambas bases las variables llaves son identificadores únicos de los hogares.
Ahora contamos con:
. d, short
Contains data from hogares.dta
obs: 70,311
vars: 263
size: 104,904,012
Sorted by: folioviv foliohog
Note: Dataset has changed since last saved.
Las mismas 70,311 observaciones
(hogares), 263 variables (137 de la base maestra más 127 de la base de uso) y,
podemos percatarnos de una nota que nos dice que la base ahora ha ordenado las
observaciones de menor a mayor según las variables llave folioviv y foliohog;
esto siempre ocurre para este tipo de unión ya que sólo hay observaciones que
coinciden en ambas bases.
Las observaciones se han unido a la
base maestra (en memoria) sin afectar la base de uso (guardada en disco).
Ahora supongamos que queremos añadir
a nuestra base la información de los habitantes de los hogares, por lo tanto,
nuestra siguiente base de uso será la base de “población”. Veamos qué contiene:
. preserve
. use poblacion, clear
. d, s
Contains data from poblacion.dta
obs: 257,805
vars: 178
size: 110,340,540
Sorted by:
. restore
Contamos con 257,805 observaciones
pues ahora la unidad de observación son las personas, además nuestra base “poblacion”
cuenta con una llave adicional (numren), la cual identifica a las personas
dentro del hogar y reporta en primer lugar al jefe del hogar con el valor “01”.
Por esta razón, debemos crear en nuestra base maestra la variable numren que
identifica al jefe de hogar como la persona cuyas características tienen el
valor de cada variable en la base maestra.
. generate numren=”01”
Una vez creada nuestra variable
procedemos a realizar la unión de bases uno a muchos, debido a que en la base
de uso se repiten los valores de nuestras variables llave folioviv y foliohog
para los demás integrantes del hogar y no sólo para el jefe de hogar, sin
embargo tenemos en la base maestra información especifica del jefe de hogar que
sólo debe unirse a esta observación y no duplicarse para los demás integrantes,
por esto adicionamos la variable llave numren como identificador en ambas
bases.
. merge 1:m folioviv foliohog numren using poblacion, generate(_merge2)
Como lo mencionamos anteriormente, merge crea una variable para identificar
la fuente de las observaciones, pero nosotros ya tenemos una variable llamada _merge, que es el nombre que por defecto se
le da; por esta razón especificamos el nombre de la segunda variable _merge a través de la opción generate(_merge2), en donde _merge2 es el nombre que hemos decidido
brindarle a la variable. Ahora nos percatamos que hay observaciones que no han coincidido
por completo, siendo estas 187,494 provenientes de la base de uso (_merge2==2), 0 de la base maestra (_merge2==1), pero 70,311 han coincidido en
ambas bases (_merge2==3)
siendo estos los jefes de hogar. Veamos una descripción corta de la base actual:
. d,s
Contains data from hogares.dta
obs: 257,805
vars: 440
size: 492,407,550
Sorted by:
Note: Dataset has changed since last saved.
Es importante mencionar que ordenar
las observaciones de las bases o no hacerlo, no altera el producto de la unión
de bases ya que el comando merge realiza un ordenamiento de forma interna para ser más eficiente; si la
base de uso no está ordenada, Stata crea una copia temporal para ordenarla y
así asegurar que la forma en que esté ordenada la base guardada en disco no sea
afectada. Sin embargo, la base resultado que observamos no se encuentra
ordenada, ya que primero observamos el ordenamiento que teníamos previamente
con la unión 1:1, por folioviv y foliohog, y después tendremos las
observaciones de las demás personas que no son jefes de hogar.
Guardaremos esta base resultado de
dos procesos de unión con un nuevo nombre para que no se vean afectadas las
bases en originales guardadas en disco.
. save “C:\Blog\concen_hog_per.dta”
Ahora abriremos la base “ingresos”,
la cual permite identificar los ingresos y percepciones financieras y de
capital de cada uno de los integrantes del hogar, por diversos conceptos. Dada
su construcción, tenemos que el nivel de desagregación de esta base es por
concepto de ingreso, por lo cual encontraremos que cada individuo puede tener
más de una observación que identifique la fuente de sus ingresos; también
observaremos que no tendremos a todas las personas en esta base ya que no todas
perciben ingresos. Veamos la información breve de esta base:
. use ingresos, clear
. d,s
Contains data from C:\Blog\ingresos.dta
obs: 334,337
vars: 17
size: 28,418,645
Sorted by:
Como podemos observar, ahora contamos
con un mayor número de observaciones y sólo 17 variables. Procederemos a hacer
la unión de bases tipo muchos a uno, ya que la base maestra cuenta con muchas
observaciones para una sola combinación de llaves única (folioviv, foliohog y
numren), mientras que la base de uso sí cuenta con una sola observación para
una combinación única de variables llave.
. merge m:1 folio* numren using “C:\Blog\concen_hog_per.dta”,
generate(_merge3)
Tenemos 82,686 personas en la base de
uso que no cuentan con ninguna fuente de ingreso; de la base maestra claramente
todas encontraron una combinación de llaves iguales a las propias. En este
ejemplo, decidimos especificar la ruta donde se puede encontrar la base de uso
en vez de sólo especificar su nombre. También, podrán notar el asterisco
seguido de la palabra folio, esto se puede hacer para que Stata reconozca que
toda variable que inicie con la palabra folio debe ser considerada para
ejecutar el comando respectivo, en nuestro caso, podemos hacerlo con seguridad
ya que sólo tenemos dos variables que inician con tal palabra: folioviv y
foliohog.
Como paso final, se puede dar orden a
las observaciones para que esté visiblemente ordenada cada vivienda con cada
uno de sus hogares, por las personas que habitan determinado hogar, así como
los ingresos de las personas que los perciben.
. sort folio* numren parentesco sexo edad clave
Esta es nuestra base resultado final,
en la cual pudimos realizar tres tipos de unión de bases de datos, sólo
procedemos a guardarla.
. save “C:\Blog\BaseResultado.dta"
Es importante mencionar que realizar
una unión del tipo muchos a muchos es probablemente una mala idea, ya que es
probable que se haya perdido de vista una o más variables llave que puedan ser
usadas como identificadoras de las observaciones dentro de grupos.
El comando merge cuenta con una serie de opciones que
son de gran utilidad al depurar nuestras bases, ya que en este ejercicio unimos
las bases con todas sus variables, dejando una base con las siguientes
características:
Contains data from BaseResultado.dta
obs: 417,023
vars: 455 13 Sep
2018 10:13
size: 826,956,609
Sorted by: folioviv foliohog numren
Gracias por leernos, nos vemos en la
próxima entrada.
Esta entrada fue escrita y desarrollada por nuestro Esp. Ángel Cruz. Si tienes alguna duda, su correo es acruz@multion.com
Este blog es administrado por MultiON Consulting S.A. de C.V.
Gracias por compartirnos esta información, nos ayuda a entender más el manejo de una base de datos compleja, como es la ENIGH. Saludos, y más ayudas como éstas!
ResponderBorrarGracias por el ejemplo y ¿Qué año es la base que utilizas?
ResponderBorrarMuy util y practico para mi trabajo específicamente con datos de ENIGH
ResponderBorrarClaro y preciso. Gracias por la explicación.
ResponderBorrarhola buen dia como le hago para unir tres bases de la ENIGH 2018 concentrados, población y hogares?
ResponderBorrarHola, Sergio. Lo acabo de intentar con el mismo método que nos facilitó Ángel Cruz y funcionó, es repetir los mismos pasos. Obviamente el número de observaciones y variables será un poco distintos, porque él utilizó una versión anterior de la ENIGH, probablemente de 2016.
BorrarHola! tengo problemas para fusionar las bases de la enigh2018. Los primeros merge han sido correctos pero cuando quiero pegar la base pobreza_18, el porcentaje de pobreza del estado que me interesa baja del 76.4% al 72%, al igual que el num de observaciones.
ResponderBorrarAlguien que se apiade de esta pobre alma en desgracia ? xD mi correo es amlimones@gmial.com
Hola! tengo problemas para fusionar bases de datos de la ENSANUT MC-2016
ResponderBorrarWhat is an Edge in Roulette?
ResponderBorrarHow do you make งานออนไลน์ money 바카라 on Roulette? The basic principle is simple: if 메리트 카지노 쿠폰 you can win every hand, you win the pot. However, you win with
Quise recrear el gasto en salud que dan en concentrado pero por alguna razón hay folios de vivienda que aunque estén en ambas bases me aparece que no pueden pegarse. Alguna recomendación? De antemano gracias
ResponderBorrarHola Martha Cecilia, buenas tardes, disculpa la tardanza, me gustaría saber ¿Qué es lo que te aparece en la ventana de resultados una vez que intentas realizar el merge?. Recuerda que debes seguir esta sintaxis:
BorrarUnión uno a uno: merge. 1:1 varlist using filename
Unión muchos a uno: merge m:1 varlist using filename
Unión uno a muchos: merge 1:m varlist using filename
Unión muchos a muchos: merge m:m varlist using filename
Puedes ver más detalles si utilizas el comando, help merge, y ver las opciones que te aparecen.
Hola, tengo una duda respecto a la unión de la BD gastotarjeta.dta de ENIGH 2022 a la BD master Hogares. Mi pregunta es en referencia a si debo generar la variable "clave", y de ser así cómo debería agregar la variable clave. Saludos
ResponderBorrar