if (!require("pacman")) install.packages("pacman") # instala pacman si se requiere
## Loading required package: pacman
pacman::p_load(tidyverse,
readxl,writexl,googlesheets4, # importar hojas de cálculo
haven, foreign, # importación de dta y sav
sjlabelled, # etiquetas
janitor, skimr, #limpieza y verificación
imputeTS, # para imputar valores
srvyr, # Para el diseño muestral
esquisse, # para usar ggplot de manera más amigable
#DescTools, # Paquete para estimaciones y pruebas
#infer, # tidy way
#broom, # Una escobita para limpiar (pero es para arreglar)
#estimatr, car, stargazer, ggpubr, # Para la regresión práctica 7
#jtools, lm.beta, robustbase, sandwich, effects,
#officer,flextable,huxtable, ggstance, kableExtra, # Para la regresión práctica 8
#ResourceSelection, lmtest, mlogit, nnet # Práctica 9
apyramid, LexisPlotR, ipumsr, fmsb ) # Práctica 10 y 11
El paquete fue creado Philipp Ottolinger, este ejercicio es una versión en español (con algunos comentarios) de su ejemplo https://github.com/ottlngr/LexisPlotR
Este paquete nos puede ayudar a hacer nuestras cuadrículas. Ponemos los años de inicio y de final; así como las edades de inicio y de final. Recuerda que un diagrama de Lexis debe tener una misma escala en los ejes.
# Dibuje una cuadrícula de Lexis desde el año 2010 hasta el año 2015, que representa las edades de 0 a 5 años.
lexis_grid(year_start = 2010, year_end = 2015, age_start = 0, age_end = 5)
Aunque no necesariamente podemos dibujar sólo cuadrados
# Dibuje una cuadrícula de Lexis desde el año 2010 hasta el año 2015, que representa las edades de 0 a 7 años.
lexis_grid(year_start = 2010, year_end = 2015, age_start = 0, age_end = 7)
Si no ponemos nada especifico en un argumento “d=”, asume que los deltas son de un año. Pero lo podemos modificar
lexis_grid(year_start = 1950, year_end = 2000, age_start = 0, age_end = 50, delta = 5)
Previo: objetos. R es un lenguaje de programación por objetos. Un objeto tiene información de diferentes tipos. Normalmente “declaramos” los objetos usando una flechita <-
mi_diagrama <- lexis_grid(year_start = 1995, year_end = 2000, age_start = 0, age_end = 5)
Parece que no se hizo nada, pero si revisas en el ambiente hay un objeto. Para “imprimir” un objeto, escribimos el nombre del mismo en nuestro script o en nuestra consola
mi_diagrama
Para poder sombrear áreas con este paquete, debemos tener un diagrama ya guardado como objeto. Con distintas funciones vamos sombreando áreas.
# Destacar todos los puntos que pertenecen a la edad de 2 años
lexis_age(lg = mi_diagrama, age = 2)
¿Qué tipo de observación o estudio sería este?
Para cambiar el color:
lexis_age(lg = mi_diagrama, age = 2, fill = "red", alpha = 0.5)
También podemos sombrear períodos
lexis_year(lg = mi_diagrama, year=1998)
¿Qué tipo de observación o estudio sería este?
Para cambiar el color: [Más info del color http://sape.inf.usi.ch/quick-reference/ggplot2/colour]
lexis_year(lg = mi_diagrama, year=1998, fill = "grey70", alpha = 0.5)
lexis_cohort(lg = mi_diagrama, cohort=1994)
¿Qué tipo de observación o estudio sería este?
También podemos cambiar el color y la transparencia:
lexis_cohort(lg = mi_diagrama, cohort=1994, fill="plum1", alpha=0.8)
Alguien entra
lexis_lifeline(lg = mi_diagrama, birth = "1996-09-23")
Alguien entra y sale
lexis_lifeline(lg = mi_diagrama, birth = "1996-09-23", exit="1999-09-23")
No es tan sencillo, pero podemos dibujar un espacio “APC”, o varios
polygons <- data.frame(group = c(1,
1,
1), # es un triángulo
x = c("1996-01-01",
"1997-01-01",
"1997-01-01"), # van en fechas
y = c(1,
1,
2)) # van en edades
lexis_polygon(lg = mi_diagrama, x = polygons$x, y = polygons$y, group = polygons$group)
checa que básicamente se trata de colocar los puntos que dibujan el polígono. Son tres puntos:
Fecha: “1996-01-01”, edad=1
Fecha: “1997-01-01”, edad=1
Fecha: “1997-01-01”, edad=2
Si queremos más triángulos, podemos agregarlos en el mismo objeto:
polygons <- data.frame(group = c(1,
1,
1, # es un triángulo
2,
2,
2), # es otro triángulo
x = c("1996-01-01",
"1997-01-01",
"1997-01-01", # van en fechas 1
"1998-01-01",
"1998-01-01",
"1999-01-01"), # van en fechas 2
y = c(1,
1,
2, # van en edades 1
3,
4,
4))# van en edades 2
lexis_polygon(lg = mi_diagrama, x = polygons$x, y = polygons$y, group = polygons$group)
Podemos ir reescribiendo nuestro objeto
mi_diagrama2 <- lexis_grid(year_start = 1995, year_end = 2000, age_start = 0, age_end = 5)
mi_diagrama2<-lexis_age(lg = mi_diagrama2, age = 2, fill = "red", alpha = 0.5)
mi_diagrama2<-lexis_year(lg = mi_diagrama2, year = 1998)
mi_diagrama2<-lexis_cohort(lg = mi_diagrama2, cohort=1994)
mi_diagrama2<-lexis_lifeline(lg = mi_diagrama2, birth = "1996-09-23", exit="1999-09-23")
mi_diagrama2
Para hacer cuadrados
mi_diagrama +
annotate("rect",
xmin = as.Date("1996-01-01"),
xmax = as.Date("1997-01-01"),
ymin = 0, ymax = 1, alpha = .2)
¿Qué tipo de observación es esta?
mi_diagrama +
annotate("rect",
xmin = as.Date("1996-01-01"),
xmax = as.Date("1997-01-01"),
ymin = 0, ymax = 1, alpha = .2)
¿Qué tipo de observación es esta?
Si quisiéramos gráficar la fecha de un censo:
mi_diagrama +
geom_vline(xintercept = as.Date("1995-11-05"), colour = "red")
Si queremos poner una edad exacta:
mi_diagrama +
geom_hline(yintercept = 4, colour = "red")
https://international.ipums.org/international/
Vamos a utilizar los datos de la consulta que ya generé. Pedí datos de la última ronda de censos de Argentina, Canadá y Costa Rica.
Primer paso
Segundo paso
Cuando ya tenemos el correito que nos dice incluso hasta cómo citar nuestra fuente, revisamos de nuevo nuestro “Dashboard”
Descargar datos
#NOTE: To load data, you must download both the extract's data and the DDI
# and also set the working directory to the folder with these files (or change the path below).
if (!require("ipumsr")) stop("Reading IPUMS data into R requires the ipumsr package. It can be installed using the following command: install.packages('ipumsr')")
ddi <- read_ipums_ddi("ipumsi_00006.xml")
data <- read_ipums_micro(ddi)
## Use of data from IPUMS-International is subject to conditions including that
## users should cite the data appropriately. Use command `ipums_conditions()` for
## more details.
Revisemos la base
skimr::skim(data)
## Warning: Couldn't find skimmers for class: haven_labelled, vctrs_vctr, integer,
## numeric; No user-defined `sfl` provided. Falling back to `character`.
## Warning: Couldn't find skimmers for class: haven_labelled, vctrs_vctr, integer,
## numeric; No user-defined `sfl` provided. Falling back to `character`.
## Warning: Couldn't find skimmers for class: haven_labelled, vctrs_vctr, integer,
## numeric; No user-defined `sfl` provided. Falling back to `character`.
## Warning: Couldn't find skimmers for class: haven_labelled, vctrs_vctr, integer,
## numeric; No user-defined `sfl` provided. Falling back to `character`.
## Warning: Couldn't find skimmers for class: haven_labelled, vctrs_vctr, integer,
## numeric; No user-defined `sfl` provided. Falling back to `character`.
## Warning: Couldn't find skimmers for class: haven_labelled, vctrs_vctr, integer,
## numeric; No user-defined `sfl` provided. Falling back to `character`.
## Warning: Couldn't find skimmers for class: haven_labelled, vctrs_vctr, integer,
## numeric; No user-defined `sfl` provided. Falling back to `character`.
Name | data |
Number of rows | 5321891 |
Number of columns | 12 |
_______________________ | |
Column type frequency: | |
character | 7 |
numeric | 5 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
COUNTRY | 0 | 1 | 2 | 3 | 0 | 3 | 0 |
SAMPLE | 0 | 1 | 8 | 9 | 0 | 3 | 0 |
RELATE | 0 | 1 | 1 | 1 | 0 | 5 | 0 |
RELATED | 0 | 1 | 4 | 4 | 0 | 15 | 0 |
AGE | 0 | 1 | 1 | 3 | 0 | 101 | 0 |
AGE2 | 0 | 1 | 1 | 2 | 0 | 18 | 0 |
SEX | 0 | 1 | 1 | 1 | 0 | 2 | 0 |
Variable type: numeric
skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
---|---|---|---|---|---|---|---|---|---|---|
YEAR | 0 | 1 | 2010.25 | 0.44 | 2010 | 2010 | 2010 | 2011 | 2.011000e+03 | ▇▁▁▁▃ |
SERIAL | 0 | 1 | 507795686.18 | 370123806.07 | 1000 | 173498000 | 429397000 | 833431500 | 1.217166e+09 | ▇▅▃▃▃ |
HHWT | 0 | 1 | 14.43 | 11.21 | 0 | 10 | 10 | 10 | 2.937200e+02 | ▇▁▁▁▁ |
PERNUM | 0 | 1 | 2.57 | 1.68 | 1 | 1 | 2 | 3 | 4.000000e+01 | ▇▁▁▁▁ |
PERWT | 0 | 1 | 14.43 | 11.21 | 10 | 10 | 10 | 10 | 2.937200e+02 | ▇▁▁▁▁ |
data <- data %>%
mutate(COUNTRY_factor = as_label(COUNTRY),
sex0=as_label(SEX),
eda5=as_label(AGE2))
Vamos a hacer una pirámide para comparar estas poblaciones
data %>%
mutate(pop_pi=if_else(SEX==1,
-PERWT,
PERWT)) %>%
ggplot(aes(eda5, fill=sex0, weights=pop_pi))+
geom_bar() + coord_flip() +
labs(y="Poblacion", x="Grupos de edad") +
scale_fill_brewer(palette = "Set2") +
theme_light() + facet_wrap(~COUNTRY_factor, scales="free")
Revisemos el índice de Whipple para Costa Rica:
# sin expandir
data %>%
filter(COUNTRY_factor=="Costa Rica") %>%
mutate(eda=as.numeric(AGE)) %>%
mutate(eda_w=if_else(
eda>63,
63,
eda)) %>%
with(WhipplesIndex(eda_w))
## $WI
## [1] 88.56089
##
## $JUDGE
## [1] "highly accurate"
# con expandir
data %>%
filter(COUNTRY_factor=="Costa Rica") %>%
mutate(eda=as.numeric(AGE)) %>%
mutate(eda_w=if_else(
eda>63,
63,
eda)) %>%
count(eda_w, wt=PERWT) %>%
with(WhipplesIndex(n))
## $WI
## [1] 103.7215
##
## $JUDGE
## [1] "highly accurate"
Parte 1
Parte 2
Haga una consulta con ipums, impórtela y haga un gráfico de los que ya hemos revisado a lo largo del semestre. Mejor agarre un país chiquitito.