getwd()[1] "C:/Users/liaca/OneDrive - El Colegio de México A.C/06_CLASES/FLACSO_Secuencias"
Una manera de facilitarnos el trabajo en R consiste en crear un proyecto, que nos permite tener todos los archivos que vamos a emplear en rutas relativas y acceder a ellos de manera más rápida.
Organización de archivos: En la carpeta de la computadora en la que vayamos a guardar nuestros archivos para esta materia, creamos una carpeta que se llame “BASES”, otra que se llame “CODES” y otra que se se llame “RESULTADOS”. Dentro de BASES guardaremos todas las bases que vayamos a usar y dentro de CODES todos los códigos de la materia.
Una vez hecho esto, creamos un proyecto en File > New Project… > Existing Directory y seleccionamos la carpeta de la materia, en la que están las nuevas sub-carpetas. El proyecto recibirá el mismo nombre que tenga la carpeta, por ejemplo “FLACSO_Secuencias.Rproj”.
Ahora en Files nos aparecerán todos los archivos y carpetas que están dentro de la carpeta de la materia. Así, cuando queramos indicar una ruta para cargar archivos, sólo tendremos que indicar la ruta relativa. Es decir, el directorio del proyecto es el de la carpeta madre. Ya no es necesario indicar setwd.
getwd()[1] "C:/Users/liaca/OneDrive - El Colegio de México A.C/06_CLASES/FLACSO_Secuencias"
Antes de empezar limpiamos el entorno de trabajo.
ls()character(0)
rm(list=ls())
ls()character(0)
Por lo general, usaremos las siguientes librerías, que deberemos tener previamente instaladas y activar al inicio de la sesión de trabajo.
La función p_load de la librería pacman nos permite activar todos los paquetes en un solo comando.
if (!require("pacman")) install.packages("pacman") # instala pacman si se requiereLoading required package: pacman
library(pacman)
pacman::p_load(tidyverse,
tidyr,
janitor,
dplyr,
car,
foreign,
haven,
prettyR,
TraMineR,
TraMineRextras,
memisc,
gmodels,
cluster,
factoextra,
graphics)Vamos a construir la trayectoria educativa de las personas entre los 6 y los 20 años a partir de información de una submuestra de la EDER 2017.
Para ello cargamos la base Eder17limpia.dta.
Comprobamos el directorio de trabajo.
getwd()[1] "C:/Users/liaca/OneDrive - El Colegio de México A.C/06_CLASES/FLACSO_Secuencias"
eder17 <- read_dta("BASES/Eder17limpia.dta")Vamos a comprobar la estructura de la base.
names(eder17) [1] "folio" "folioviv" "foliohog" "id_pobla" "id_pers"
[6] "anio_retro" "edad_retro" "mes_nac" "anio_nac" "edad_act"
[11] "sexo" "geo_eder" "otra_resid" "asiste_esc" "nivel_esc"
[16] "tipo_esc" "anio_aprob" "niv_aprob" "trabajo" "scian"
[21] "sinco" "pos_tra" "tam_tra" "tiempo_tra" "acceso_tra"
[26] "remun_trab" "domestico" "sosten_eco" "sosten_per" "est_socio"
[31] "tam_loc" "nivel_inst" "edo_conyug" "iosterciles"
La variable “folio” es el identificador de individuo. Veamos cuántos individuos tenemos en la base:
dim(eder17)[1] 172173 34
length(unique(eder17$folio))[1] 4624
Tenemos 4,624 individuos, 172,173 años-persona y 34 variables.
Vamos a crear una sub-base con las variables que usaremos, descartando por ahora las demás, y para los años-persona considerados (edades entre 6 y 20 años).
eder17_red <- eder17 %>%
dplyr::select(folio, edad_retro, anio_nac, sexo, nivel_esc, nivel_inst, est_socio, tam_loc, iosterciles) %>%
dplyr::filter(edad_retro>=6 & edad_retro<=20)
dim(eder17_red)[1] 69360 9
La variable a partir de la cual construiremos la trayectoria educativa es “nivel_esc”. Veamos cómo está conformada.
table(eder17_red$nivel_esc, useNA="ifany")
0 1 2 3 4 5 6 7 8 9 10 11 13
2621 219 27652 11368 6574 45 17 549 202 84 2379 3 48
901 902 903 904 905 906 907 908 909 910 913
95 8603 6228 2118 3 7 280 45 1 33 186
Vamos a reagrupar las categorías de esta variable para construir la trayectoria de estudio por niveles, simplificando a 5 categorías:
eder17_red <- eder17_red %>%
mutate(tray_ed = case_when(
nivel_esc==0 | (nivel_esc>=13 & nivel_esc<=913) ~ 0,
nivel_esc==1 | nivel_esc==2 ~ 1,
nivel_esc==3 | nivel_esc==6 ~ 2,
nivel_esc==4 | nivel_esc==5 | nivel_esc==7 | nivel_esc==8 ~ 3,
nivel_esc>=9 & nivel_esc<=12 ~ 4,
TRUE ~ NA
))
table(eder17_red$nivel_esc, eder17_red$tray_ed, useNA="ifany")
0 1 2 3 4
0 2621 0 0 0 0
1 0 219 0 0 0
2 0 27652 0 0 0
3 0 0 11368 0 0
4 0 0 0 6574 0
5 0 0 0 45 0
6 0 0 17 0 0
7 0 0 0 549 0
8 0 0 0 202 0
9 0 0 0 0 84
10 0 0 0 0 2379
11 0 0 0 0 3
13 48 0 0 0 0
901 95 0 0 0 0
902 8603 0 0 0 0
903 6228 0 0 0 0
904 2118 0 0 0 0
905 3 0 0 0 0
906 7 0 0 0 0
907 280 0 0 0 0
908 45 0 0 0 0
909 1 0 0 0 0
910 33 0 0 0 0
913 186 0 0 0 0
Primero creamos una base de individuos que contenga las posibles co-variables que usaremos después en el análisis descriptivo de las trayectorias.
base_ind <- eder17_red %>%
dplyr::filter(edad_retro==6) %>%
dplyr::select(folio, anio_nac, sexo, iosterciles)
dim(base_ind)[1] 4624 4
Tiene los 4,624 casos correspondientes a los individuos con trayectorias educativas completas que hay en la base. Vamos a crear una variable “cohorte” a partir del año de nacimiento de las personas. Dado que esta variable no está construida en la EDER 2017, tenemos que tomar criterios de distinción por año de nacimiento que nos permitan sostener la hipótesis de que esas personas enfrentaron condiciones distintas que se relacionan con el objeto de estudio (la trayectoria educativa).
Criterios empleados aquí:
Cohorte 1962-1968: son personas que experimentan su niñez y la etapa de escolaridad primaria en un México aún mayoritariamente rural (con una proporción importante de ellas con acceso limitado a centros de educación secundaria) y que tienen entre 14 y 20 años durante el inicio de las crisis económicas de la década de 1980, lo cual puede haber generado en algunos sectores sociales incentivos para el abandono de la escuela de los jóvenes y su orientación hacia el mercado laboral.
Cohorte 1969-1979: son personas que crecen en una década de creciente urbanización en el país (accediendo una mayor proporción de ellas a servicios educativos en áreas urbanas) y que tienen entre 15 y 25 años durante la crisis del peso de 1994-1995, lo cual puede haber generado en algunos sectores sociales incentivos para el abandono de la escuela de los jóvenes y la búsqueda de recursos económicos para la familia.
Cohorte 1980-1997: son personas que experimentan su etapa educativa cuando la educación secundaria ya es obligatoria (a partir de 1993). Las más jóvenes en esta cohorte tenían 13 años en 1993 y, por tanto, aún están en edad de estudiar ese nivel cuando ocurre el cambio normativo.
base_ind <- base_ind %>%
mutate(
cohorte = case_when(
anio_nac >= 1962 & anio_nac <= 1968 ~ 1,
anio_nac >= 1969 & anio_nac <= 1979 ~ 2,
anio_nac >= 1980 & anio_nac <= 1997 ~ 3,
TRUE ~ NA_real_
) %>%
factor(levels = c(1, 2, 3),
labels = c("1962-1968", "1969-1979", "1980-1997"))
)
table(base_ind$anio_nac, base_ind$cohorte, useNA="ifany")
1962-1968 1969-1979 1980-1997
1962 15 0 0
1963 102 0 0
1964 95 0 0
1965 102 0 0
1966 88 0 0
1967 117 0 0
1968 100 0 0
1969 0 130 0
1970 0 108 0
1971 0 117 0
1972 0 121 0
1973 0 129 0
1974 0 147 0
1975 0 148 0
1976 0 150 0
1977 0 121 0
1978 0 127 0
1979 0 157 0
1980 0 0 153
1981 0 0 152
1982 0 0 152
1983 0 0 136
1984 0 0 156
1985 0 0 147
1986 0 0 146
1987 0 0 146
1988 0 0 130
1989 0 0 148
1990 0 0 150
1991 0 0 148
1992 0 0 116
1993 0 0 125
1994 0 0 155
1995 0 0 158
1996 0 0 146
1997 0 0 86
Necesitamos transformar también el resto de variables en tipo factor, para usarlas después en el análisis de las secuencias.
base_ind$sexo <- factor(base_ind$sexo, levels=c("1","2"), labels=c("Hombre","Mujer"))
base_ind$iosterciles <- factor(base_ind$iosterciles, levels=c(1,2,3), labels=c("Bajo","Medio","Alto"))Veamos cómo queda la base de individuos:
base_ind <- base_ind %>%
dplyr::select(-anio_nac)
dplyr::glimpse(base_ind)Rows: 4,624
Columns: 4
$ folio <dbl> 7, 15, 23, 25, 26, 31, 41, 42, 45, 47, 49, 51, 57, 67, 70,…
$ sexo <fct> Mujer, Mujer, Mujer, Mujer, Hombre, Mujer, Mujer, Mujer, H…
$ iosterciles <fct> Alto, Alto, Alto, Alto, Medio, Alto, Medio, Alto, Alto, Me…
$ cohorte <fct> 1980-1997, 1969-1979, 1969-1979, 1980-1997, 1969-1979, 196…
En segundo lugar creamos una base en la que tengamos únicamente el identificador de individuo (folio), la edad (edad_retro) y la trayectoria educativa (tray_ed).
educ_long <- eder17_red %>%
dplyr::select(folio, edad_retro, tray_ed)
educ_long <- educ_long[order(educ_long$folio, educ_long$edad_retro),]
table(educ_long$edad_retro)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
4624 4624 4624 4624 4624 4624 4624 4624 4624 4624 4624 4624 4624 4624 4624
dim(educ_long)[1] 69360 3
head(educ_long)# A tibble: 6 × 3
folio edad_retro tray_ed
<dbl> <dbl> <dbl>
1 7 6 1
2 7 7 1
3 7 8 1
4 7 9 1
5 7 10 1
6 7 11 1
Ahora necesitamos trasponer la base con la trayectoria educativa (educ_long) del formato long en el que está (tray_ed como variable con un registro por año-persona) al formato wide (un registro por individuo y tantas variables como años de trayectoria educativa estemos observando). Para ello usamos la función pivot_wider del paquete tidyr.
Es importante que la base que vayamos a trasponer tenga sólo una variable de identificación (folio), la variable de tiempo (edad_retro) y la variable que recoge la trayectoria que queremos tener ahora por columnas (tray_ed). Si dejamos en blanco la opción de names_prefix (““), los nombres de las variables son directamente las edades (6:20). No hace falta que las renombremos después.
educ_wide <- educ_long %>%
pivot_wider(
id_cols = folio,
names_from = edad_retro,
values_from = tray_ed,
names_prefix = ""
)
dim(educ_wide)[1] 4624 16
head(educ_wide)# A tibble: 6 × 16
folio `6` `7` `8` `9` `10` `11` `12` `13` `14` `15` `16` `17`
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 7 1 1 1 1 1 1 2 2 2 3 3 3
2 15 1 1 1 1 1 1 2 2 2 3 3 3
3 23 1 1 1 1 1 1 2 2 2 2 0 0
4 25 1 1 1 1 1 1 2 2 2 2 0 0
5 26 1 1 1 1 1 1 0 0 0 0 0 0
6 31 1 1 1 1 1 1 2 2 2 3 3 3
# ℹ 3 more variables: `18` <dbl>, `19` <dbl>, `20` <dbl>
Ya tenemos la secuencia educativa en formato wide; es decir, los datos organizados para poder trabajar las secuencias. Ahora le pegamos las covariables que tenemos en la base de individuos y tendremos todo lo necesario para empezar a trabajar con análisis de secuencias.
educ_cov <- merge(educ_wide, base_ind, by="folio", all=TRUE)
dim(educ_cov)[1] 4624 19
names(educ_cov) [1] "folio" "6" "7" "8" "9"
[6] "10" "11" "12" "13" "14"
[11] "15" "16" "17" "18" "19"
[16] "20" "sexo" "iosterciles" "cohorte"
Tenemos ya una base de individuos que contiene entre las columnas 2 y la 16 la secuencia educativa entre los 6 y los 20 años de edad, además de cuatro co-variables: el sexo, la condición de hablante de lengua indígena, el estrato social de origen y la cohorte.
?seqstatl()Lo primero que vamos a hacer es comprobar cuál es el alfabeto de nuestra secuencia.
El alfabeto es el conjunto finito de estados posibles que puede asumir nuestra secuencia.
Para comprobar cuáles son los estados existentes usaremos la función seqstatl. Debemos indicarle cuáles son las variables que conforman la secuencia; es decir, las variables cuyos valores debe evaluar. seqstatl() arroja los N estados diferentes que encuentra en las variables indicadas.
seqstatl(educ_cov[,2:16])[1] 0 1 2 3 4
?seqdef()Principales argumentos de la función seqdef:
var: en este argumento debemos indicar cuáles son las variables que contienen la secuencia de estados. Es importante declarar esta opción, porque, si no indicamos nada, considerará todas las variables de la base, incluyendo la variable de identificador de persona o las co-variables.
alphabet ( ~ levels): es donde podemos indicar los estados posibles; es decir, los valores que puede llegar a tener la secuencia. Si no indicamos nada, tomará los valores existentes (los que arroja seqstatl); si queremos que incluya valores no existentes, para evidencia su ausencia, o cambiar el orden en que queremos que los presente, debemos indicar todos los valores en el orden deseado en esta opción.
states: con esta opción podemos declarar etiquetas (cortas) para los valores de la secuencia. Si no indicamos nada, los valores que aparecerán en la secuencia serán los que están en la base.
labels: con esta opción podemos declarar etiquetas (largas) para los valores de la secuencia. Si indicamos states y no labels, tomará para labels lo que hayamos declarado en states.
Suele tener sentido definir nombres cortos en states y una etiqueta más clara en labels, pero no hay por qué hacerlo; puede ser el mismo nombre en ambas.
Otros argumentos que discutiremos después:
left: se usa para indicar cómo tratar a los valores faltantes (missing) que se encuentran a la izquierda del primer estado válido de la secuencia. Por defecto, considera la opción “NA”, es decir, tiene en cuenta los missing como tales. Si indicamos la opción “DEL”, elimina esas posiciones con missing.
right: se usa para indicar cómo tratar a los valores faltantes (missing) que se encuentran a la derecha del último estado válido de la secuencia. Por defecto, considera la opción “DEL”, es decir, elimina las posiciones faltantes a la derecha (acorta la longitud de las secuencias incompletas o truncas por derecha). Si indicamos la opción “NA”, tiene en cuenta los missing como tales.
gaps: se usa para indicar cómo tratar a los valores faltantes (missing) que se encuentran dentro de la secuencia (los huecos de información sobre la secuencia). Por defecto, considera la opción “NA”, es decir, tiene en cuenta los missing como tales. Si indicamos la opción “DEL”, elimina esas posiciones con missing.
missing: se usa para indicar cuál es el código que define los valores faltantes (missing). Por defecto, considera NA como el código que define los valores faltantes.
missing.color: indica el color asignado a los valores faltantes para la representación gráfica. Por defecto, es “darkgrey”. Podemos indicar otra opción, por ejemplo “white”.
cpal: es el argumento mediante el cual se asigna una paleta de colores deseada para la representación gráfica de los estados de la secuencia. El vector de colores debe tener el mismo orden que los estados definidos.
weights: se usa para indicar los pesos que deben ser tenidos en cuenta en el análisis de las secuencias.
Veamos cómo cambia la declaración del objeto secuencia según los argumentos que usemos. Primero declaramos el objeto secuencia sin states ni labels y dejando que seqdef defina el alfabeto.
sec1 <- seqdef(educ_cov,var=2:16) [>] 5 distinct states appear in the data:
1 = 0
2 = 1
3 = 2
4 = 3
5 = 4
[>] state coding:
[alphabet] [label] [long label]
1 0 0 0
2 1 1 1
3 2 2 2
4 3 3 3
5 4 4 4
[>] 4624 sequences in the data set
[>] min/max sequence length: 15/15
Si no declaramos states ni labels usa los valores del alfabeto. Comprobamos que tenemos lo esperado: 5 estados distintos, 23,618 secuencias y todas tienen una misma duración de 15 años (entre 6 y 20 años).
Ahora probemos a declarar etiquetas. Guardamos etiquetas cortas y etiquetas largas en vectores para usarlos en seqdef().
states <- c("noEstu","Prim","Sec","Prepa","Univ")
labels <- c("No estudia", "Primaria o menos", "Secundaria o equivalente", "Preparatoria o equivalente", "Universidad")sec2 <- seqdef(educ_cov,var=2:16, states=states) [>] state coding:
[alphabet] [label] [long label]
1 0 noEstu noEstu
2 1 Prim Prim
3 2 Sec Sec
4 3 Prepa Prepa
5 4 Univ Univ
[>] 4624 sequences in the data set
[>] min/max sequence length: 15/15
Si declaramos states pero no labels, usa las etiquetas declaradas en states para ambos.
sec3 <- seqdef(educ_cov,var=2:16, states=states, labels=labels) [>] state coding:
[alphabet] [label] [long label]
1 0 noEstu No estudia
2 1 Prim Primaria o menos
3 2 Sec Secundaria o equivalente
4 3 Prepa Preparatoria o equivalente
5 4 Univ Universidad
[>] 4624 sequences in the data set
[>] min/max sequence length: 15/15
Al declarar tanto states como labels, usa las etiquetas cortas y largas, respectivamente.
Si queremos alterar el orden en el que los estados deben ser representados, lo tenemos que indicar en el alphabet. Por ejemplo, podemos quere que el estado “No estudia” aparezca al final.
sec4 <- seqdef(educ_cov,var=2:16, alphabet=c(1,2,3,4,0)) [>] 5 distinct states appear in the data:
1 = 0
2 = 1
3 = 2
4 = 3
5 = 4
[>] state coding:
[alphabet] [label] [long label]
1 1 11
2 2 22
3 3 33
4 4 44
5 0 00
[>] 4624 sequences in the data set
[>] min/max sequence length: 15/15
Al haber alterado el orden de los estados, debemos alterar también las etiquetas, si las queremos aplicar.
states2 <- c("Prim","Sec","Prepa","Univ","noEstu")
sec5 <- seqdef(educ_cov,var=2:16, alphabet=c(1,2,3,4,0), states=states2) [>] state coding:
[alphabet] [label] [long label]
1 1Prim Prim
2 2Sec Sec
3 3Prepa Prepa
4 4Univ Univ
5 0noEstu noEstu
[>] 4624 sequences in the data set
[>] min/max sequence length: 15/15
Resumen del objeto secuencia:
summary(sec2) [>] sequence object created with TraMineR version 2.2-9
[>] 4624 sequences in the data set, 367 unique
[>] min/max sequence length: 15/15
[>] alphabet (state labels):
1=noEstu (noEstu)
2=Prim (Prim)
3=Sec (Sec)
4=Prepa (Prepa)
5=Univ (Univ)
[>] dimensionality of the sequence space: 60
[>] colors: 1=#7FC97F 2=#BEAED4 3=#FDC086 4=#FFFF99 5=#386CB0
La función summary nos da información adicional muy importante. Tenemos 367 secuencias únicas de las 4,624 existentes. Por lo tanto, hay muchos individuos que tienen trayectorias educativas idénticas entre los 6 y los 20 años.
summary(sec5) [>] sequence object created with TraMineR version 2.2-9
[>] 4624 sequences in the data set, 367 unique
[>] min/max sequence length: 15/15
[>] alphabet (state labels):
1=Prim (Prim)
2=Sec (Sec)
3=Prepa (Prepa)
4=Univ (Univ)
5=noEstu (noEstu)
[>] dimensionality of the sequence space: 60
[>] colors: 1=#7FC97F 2=#BEAED4 3=#FDC086 4=#FFFF99 5=#386CB0
La diferencia entre sec2 y sec5 está únicamente en el orden en que presenta los estados.
La función seqlength() nos muestra la longitud de las secuencias individuales que pidamos. En este caso, todas tienen la misma longitud (15 años).
seqlength(sec3[1:5,]) Length
1 15
2 15
3 15
4 15
5 15
?seqtabCon seqtab() podemos ver las secuencias más frecuentes. Por defecto, nos da la información sobre las 10 secuencias más frecuentes en formato SPS; es decir, presenta la información resumida según la duración en cada estado sucesivo.
seqtab(sec3) Freq Percent
Prim/6-Sec/4-noEstu/5 685 14.8
Prim/6-Sec/3-Prepa/3-Univ/3 532 11.5
Prim/6-Sec/3-Prepa/4-noEstu/2 487 10.5
Prim/7-noEstu/8 425 9.2
noEstu/15 135 2.9
Prim/6-Sec/3-Prepa/3-noEstu/3 124 2.7
Prim/7-Sec/4-noEstu/4 123 2.7
Prim/6-Sec/3-noEstu/6 115 2.5
Prim/8-noEstu/7 108 2.3
Prim/6-Sec/3-Prepa/4-Univ/2 100 2.2
En este caso la secuencia más frecuente consta de 6 años estudiando primaria, 4 años estudiando secundaria y 5 años sin estudiar. Esta secuencia la tienen 685 individuos, el 14.8% de los casos estudiados. Por ejemplo, esta información resumen nos muestra que la secuencia de no estudio (15 años en el estado “no estudia”) es relativamente frecuente. Un 2.9% de los casos la tienen.
Las 10 secuencias más frecuentes engloban al 61.3% de las secuencias individuales.
Le podemos pedir más o menos trayectorias diferentes. En este caso sabemos que tenemos 367 distintas. Por ejemplo, le podemos pedir las 20 más frecuentes.
seqtab(sec3, idxs=1:20, format="SPS") Freq Percent
Prim/6-Sec/4-noEstu/5 685 14.81
Prim/6-Sec/3-Prepa/3-Univ/3 532 11.51
Prim/6-Sec/3-Prepa/4-noEstu/2 487 10.53
Prim/7-noEstu/8 425 9.19
noEstu/15 135 2.92
Prim/6-Sec/3-Prepa/3-noEstu/3 124 2.68
Prim/7-Sec/4-noEstu/4 123 2.66
Prim/6-Sec/3-noEstu/6 115 2.49
Prim/8-noEstu/7 108 2.34
Prim/6-Sec/3-Prepa/4-Univ/2 100 2.16
Prim/6-Sec/3-Prepa/2-noEstu/4 88 1.90
Prim/6-noEstu/9 67 1.45
Prim/4-noEstu/11 58 1.25
Prim/9-noEstu/6 51 1.10
Prim/7-Sec/3-Prepa/4-noEstu/1 50 1.08
Prim/5-noEstu/10 47 1.02
Prim/6-Sec/2-noEstu/7 45 0.97
Prim/3-noEstu/12 44 0.95
Prim/5-Sec/3-Prepa/3-Univ/4 44 0.95
Prim/6-Sec/4-Prepa/4-noEstu/1 44 0.95
Las 20 secuencias más frecuentes engloban al 72.8% del total de secuencias individuales.
En lugar de ver las secuencias con este formato resumido (SPS), podemos pedirle que las muestre en formato STS, que muestra uno a uno los estados sucesivos durante los 15 años estudiados. Lo vemos con el objeto de secuencia sec1 (sin etiquetas), porque es más fácil de leer así en este formato.
seqtab(sec1, idxs=1:6, format="STS") Freq Percent
1-1-1-1-1-1-2-2-2-2-0-0-0-0-0 685 14.8
1-1-1-1-1-1-2-2-2-3-3-3-4-4-4 532 11.5
1-1-1-1-1-1-2-2-2-3-3-3-3-0-0 487 10.5
1-1-1-1-1-1-1-0-0-0-0-0-0-0-0 425 9.2
0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 135 2.9
1-1-1-1-1-1-2-2-2-3-3-3-0-0-0 124 2.7
Podemos guardar las 367 secuencias diferentes como una tabla. Para pedirle todas podemos indicar idxs=0 o idxs=1:367. Ambas instrucciones son equivalentes.
stab <- seqtab(sec1, idxs=0, format="STS")
dim(stab)[1] 367 15
Este objeto contiene las 367 secuencias de estados de escolaridad diferentes que tienen los individuos estudiados entre los 6 y los 20 años.
Si quisiéramos obtener la lista de secuencias más frecuentes por separado para distintos grupos de casos (lo que luego graficaremos con seqfplot), podemos indicar las condiciones para definir cada grupo en corchetes. Por ejemplo, queremos que nos dé la lista de las 10 secuencias más frecuentes para cada cohorte por separado y sólo para el estrato social de origen alto.
seqtab(sec2[educ_cov$iosterciles=="Alto" & educ_cov$cohorte=="1962-1968",]) Freq Percent
Prim/6-Sec/3-Prepa/3-Univ/3 29 16.4
Prim/6-Sec/3-Prepa/4-noEstu/2 21 11.9
Prim/6-Sec/4-noEstu/5 15 8.5
Prim/7-noEstu/8 8 4.5
Prim/6-Sec/3-noEstu/6 6 3.4
Prim/6-Sec/3-Prepa/2-noEstu/4 6 3.4
Prim/6-Sec/3-Prepa/3-noEstu/3 6 3.4
Prim/6-Sec/3-Prepa/4-Univ/2 4 2.3
Prim/6-Sec/3-Prepa/6 4 2.3
Prim/6-Sec/4-Prepa/3-noEstu/2 4 2.3
seqtab(sec2[educ_cov$iosterciles=="Alto" & educ_cov$cohorte=="1969-1979",]) Freq Percent
Prim/6-Sec/3-Prepa/3-Univ/3 86 19.3
Prim/6-Sec/3-Prepa/4-noEstu/2 77 17.3
Prim/6-Sec/4-noEstu/5 57 12.8
Prim/6-Sec/3-Prepa/3-noEstu/3 15 3.4
Prim/7-noEstu/8 13 2.9
Prim/6-Sec/3-noEstu/6 11 2.5
Prim/6-Sec/3-Prepa/4-Univ/2 10 2.2
Prim/7-Sec/4-noEstu/4 9 2.0
Prim/6-Sec/3-Prepa/2-Univ/4 8 1.8
Prim/6-Sec/3-Prepa/6 7 1.6
seqtab(sec2[educ_cov$iosterciles=="Alto" & educ_cov$cohorte=="1980-1997",]) Freq Percent
Prim/6-Sec/3-Prepa/3-Univ/3 254 31.8
Prim/6-Sec/3-Prepa/4-noEstu/2 109 13.6
Prim/6-Sec/4-noEstu/5 66 8.2
Prim/6-Sec/3-Prepa/4-Univ/2 55 6.9
Prim/6-Sec/3-Prepa/3-noEstu/3 32 4.0
Prim/5-Sec/3-Prepa/3-Univ/4 25 3.1
Prim/6-Sec/3-Prepa/2-noEstu/4 20 2.5
Prim/6-Sec/3-Prepa/4-noEstu/1-Univ/1 15 1.9
Prim/6-Sec/3-Prepa/6 13 1.6
Prim/7-Sec/3-Prepa/3-Univ/2 13 1.6
?seqplotseqplot() son en realidad un conjunto amplio de funciones de representación gráfica de secuencias. En función de lo que queramos analizar, usaremos una u otra de estas funciones. El tipo de gráfico solicitado lo indicamos en el nombre de la función.
Algunos argumentos de este conjunto de funciones de representación gráfica de secuencias:
group: usamos este argumento cuando queremos que represente por separado las secuencias de distintos grupos de casos, definidos por las categorías de alguna de las co-variables.
border: por defecto, seqplot() separa los estados consecutivos mediante bordes. Si queremos que la trayectoria se vea continua, podemos indicar NA en este argumento.
missing.color: cuando no hemos definido el color que debe aplicar para los valores faltantes mediante la función seqdef() (y tenemos en alguna de nuestras secuencias), lo podemos indicar aquí.
with.legend: usamos este argumento para indicar si debe o no mostrar la leyenda (TRUE o FALSE) y, en su caso, dónde (“right”, “left”, etc.). Por defecto, la muestra y la coloca debajo del gráfico.
cex.legend: usamos este argumento para indicar el factor de escala que debe aplicar a la leyenda.
main: sirve para indicar el título del gráfico.
ltext: podemos usar este argumento si queremos que la descripción de los estados que aparece en la leyenda sea distinto que las etiquetas definidas. Por defecto, seqplot usa las etiquetas largas que hayamos definido en labels. Si queremos que use otras etiquetas, las podemos indicar en este argumento mediante otro vector de caracteres, en el orden en que estén definidos los estados en el alfabeto.
yaxis: nos permite definir qué queremos que muestre en el eje y según el gráfico. Si indicamos FALSE, no muestra el eje y. Si tenemos varios gráficos (con group) y queremos que sólo muestre el eje y en el primero podemos indicar “left”.
cpal: si no habíamos indicado paleta de colores en el momento de definir la secuencia con seqdef, podemos también hacerlo en el gráfico directamente.
Primero definimos la paleta de colores que queremos que use para representar los estados de la secuencia.
cpal(sec2) <- c("gray","darkolivegreen3","darkgreen","gold1","darkorange4")Lo podemos así, sobre la secuencia ya definida, o guardar la paleta en un vector y usar la opción cpal al definir el objeto secuencia. Por ejemplo, para la sec5, donde habíamos alterado el orden de los estados en el alfabeto, tenemos que alterar también el orden de los colores.
cpal2 <- c("darkolivegreen3","darkgreen","gold1","darkorange4","gray")
sec5 <- seqdef(educ_cov,var=2:16, alphabet=c(1,2,3,4,0), states=states2, cpal=cpal2) [>] state coding:
[alphabet] [label] [long label]
1 1Prim Prim
2 2Sec Sec
3 3Prepa Prepa
4 4Univ Univ
5 0noEstu noEstu
[>] 4624 sequences in the data set
[>] min/max sequence length: 15/15
summary(sec5) [>] sequence object created with TraMineR version 2.2-9
[>] 4624 sequences in the data set, 367 unique
[>] min/max sequence length: 15/15
[>] alphabet (state labels):
1=Prim (Prim)
2=Sec (Sec)
3=Prepa (Prepa)
4=Univ (Univ)
5=noEstu (noEstu)
[>] dimensionality of the sequence space: 60
[>] colors: 1=darkolivegreen3 2=darkgreen 3=gold1 4=darkorange4 5=gray
Ya aparecen los colores indicados por nosotros en la descripción del objeto secuencia.
seqfplot() grafica la información que arroja seqtab(), es decir, muestra las 10 secuencias más frecuentes, indicando la frecuencia de cada una de ellas mediante el grosor de la barra.
seqfplot(sec2, cex.legend=0.65) En el eje y indica la frecuencia total acumulada de las 10 secuencias más frecuentes (61.3% del total).
Si queremos que muestre más de 10 secuencias, se lo indicamos mediante el argumento idxs. Por ejemplo, le podemos pedir las 15 secuencias más frecuentes.
labels2 <- c("No estudia","Primaria","Secundaria","Media superior","Universidad")
seqfplot(sec2, idxs=1:15, border=NA, ltext=labels2, cex.legend=0.65)Las 15 secuencias más frecuentes abarcan al 68.1% de los casos. La opción border=NA hace que muestre las secuencias continuas, sin bordes entre cada estado. La opción ltext nos permite cambiar el texto de las etiquetas que debe ser incluido en la leyenda. La opción cex.legend nos permite hacer más grande o más pequeña la leyenda.
Si queremos ver diferencias entre las secuencias más frecuentes en distintos grupos de individuos, usamos el argumento group(). Por ejemplo, podemos ver las 5 secuencias más frecuentes para cada sexo por separado.
cpal <- c("gray","darkolivegreen3","darkgreen","gold1","darkorange4")
seqfplot(sec3, idxs=1:5, group=educ_cov$sexo, yaxis="pct", cpal=cpal, cex.legend=0.7)Al indicar yaxis=“pct”, le pedimos que muestre la proporción que representa cada secuencia en cada subgrupo. Para los hombres las 5 secuencias más frecuentes abarcan al 48.2% de los casos y para las mujeres al 50.3% (sumas respectivas). Vemos, por ejemplo, que tanto para hombres como para mujeres, la secuencia más frecuente es la misma (6 años de primaria + 4 años de secundaria + 5 años sin estudiar), aunque tiene un mayor peso para las mujeres. En el caso de los hombres la segunda secuencia más frecuente (12.8%) es la de educación continua y en etapas sucesivas (6 años de primaria + 3 años de secundaria + 3 años de preparatoria + 3 años de universidad), que para las mujeres aparece como la cuarta más frecuente (10.4%). La secuencia con educación sólo de primaria (7 años de primaria + 8 años sin estudiar) es más frecuente entre las mujeres (10.6%) que entre los hombres (7.5%).
También podemos comparar grupos de casos que se diferencian en más de una variable. Para ello, debemos graficar cada grupo por separado y colocar las gráficas juntas. Primero definimos el área del gráfico, dividiéndola en los espacios necesarios para albergar las gráficas, y después creamos las gráficas.
Por ejemplo, vamos a graficar las 10 secuencias más frecuentes del estrato alto para cada una de las tres cohortes.
par(mfrow = c(1,3))
seqfplot(sec2[which(educ_cov$iosterciles=="Alto" & educ_cov$cohorte=="1962-1968"),], border=NA, with.legend=FALSE, main="Estrato alto, 1962-1968")
seqfplot(sec2[which(educ_cov$iosterciles=="Alto" & educ_cov$cohorte=="1969-1979"),], border=NA, with.legend=FALSE, main="Estrato alto, 1969-1979")
seqfplot(sec2[which(educ_cov$iosterciles=="Alto" & educ_cov$cohorte=="1980-1997"),], border=NA, with.legend=FALSE, main="Estrato alto, 1980-1997")Con el comando par estamos indicando cómo tiene que ordenar los gráficos en el espacio. Le indicamos que tendrá 1 fila y 3 columnas, por lo que colocará cada gráfico uno al lado del otro.
Estas gráficas nos permiten observar que, a pesar de que la secuencia más frecuente es la misma en las tres cohortes para el estrato alto (6 años de primaria + 3 años de secundaria + 3 años de preparatoria + 3 años de universidad), su peso ha ido aumentando en cada cohorte sucesiva. Para la cohorte 1962-1968 representaba el 16.4% de los casos, en la de 1969-1979 abarca al 19.3% y en la cohorte más reciente este porcentaje aumenta al 31.8% (véanse resultados del seqtab segmentado). Por el contrario, el peso de las secuencias con menores niveles de escolaridad ha ido disminuyendo. Por ejemplo, la secuencia con secundaria como máximo nivel alcanzado (6 años de primaria + 4 años de secundaria + 5 años sin estudio) pasa de abarcar al 12.8% para la segunda cohorte al 8.2% para la tercera.
Al mismo tiempo, estos resultados evidencian cómo las secuencias educativas entre los 6 y los 20 años para el estrato social de origen alto han tendido a hacerse más homogéneas con el paso del tiempo histórico. Mientras que en la cohorte más antigua las 10 secuencias más frecuentes abarcaba al 58.2% de los casos, en la cohorte intermedia este porcentaje se eleva al 65.7% y en la más joven alcanza a casi tres cuartas partes de los casos (75.2%).
Para guardar la gráfica, podemos hacerlo en formato png o en formato pdf.
Por ejemplo, para guardar la última gráfica que estamos visualizando en formato png usamos el comando png, indicando el nombre que recibirá el archivo (y, en su caso, la ruta donde queremos guardarla). Si ya tenemos creada la carpeta “Resultados” en nuestra carpeta de proyecto, podemos guardar la gráfica directamente ahí.
Debemos indicar dev.off() al final para que complete la operación y guarde la gráfica.
png("Resultados/Freq_alto_cohorte.png")
dev.off()El comando seqiplot() grafica las secuencias individuales. Por defecto, arroja las primeras 10 secuencias, del caso 1 al caso 10.
par(mfrow = c(1,1))
seqiplot(sec2, border = NA, cex.legend=0.65)Podemos pedirle que grafique las que nos interesen, por ejemplo, 100 de ellas.
seqiplot(sec3, idxs=100:200, border = NA, cpal=cpal, cex.legend=0.6)Si queremos pedir todas las secuencias (las 4,624), podemos usar la opción idxs=0. Las grafica en el orden en que están en la base.
seqiplot(sec2, idxs=0, border = NA, with.legend=FALSE)Se hace muy complejo analizar esta gráfica, ya que apenas se distinguen las diferencias entre unas y otras secuencias, al estar ordenadas sin un criterio analítico.
Podemos pedirlas separadas por grupos, por ejemplo por estrato de origen:
par(mfrow = c(1,3))
seqiplot(sec2[which(educ_cov$iosterciles=="Bajo"),], idxs=0, border=NA, with.legend=FALSE, main="Estrato bajo")
seqiplot(sec2[which(educ_cov$iosterciles=="Medio"),], idxs=0, border=NA, with.legend=FALSE, main="Estrato medio")
seqiplot(sec2[which(educ_cov$iosterciles=="Alto"),], idxs=0, border=NA, with.legend=FALSE, main="Estrato alto")Aun así es difícil observar patrones mediante esta representación.
La utilidad del seqiplot() es mayor cuando nuestra base está ordenada de acuerdo con algún criterio que queramos mantener en la visualización. Eso suele ser más común cuando tenemos pocos casos y queremos poder visualizar y ordenar las secuencias de acuerdo con algún criterio propio.
La función seqIplot() nos permite graficar todas las secuencias individuales, especificando diferentes criterios para que las ordene.
Una opción es que ordene las secuencias individuales según su similitud al inicio. Es decir, coloca juntas todas las secuencias que comienzan igual, lo cual permite visualizar mejor las diferencias entre ellas.
seqIplot(sec2, border = NA, sortv = "from.start", cex.legend=0.65)Esta forma de representar las secuencias individuales permite intuir diferentes patrones de trayectorias educativas, que difieren tanto por el nivel de escolaridad alcanzado como por el calendario en que inicia y termina cada uno.
Podemos pedir este mismo gráfico por separado para cada estrato de origen.
seqIplot(sec2, border = NA, group=educ_cov$iosterciles, sortv = "from.start")De esta manera podemos apreciar cómo algunos tipos de secuencias están más presentes en algunos estratos y menos en otros. Por ejemplo, las secuencias sin estudios o con estudios únicamente de primaria son más frecuentes en el estrato bajo, mientras que en el estrato alto aparecen con mayor frecuencia las secuencias que llegan a la preparatoria y a la universidad.
Otra opción es ordenar las secuencias individuales según su similitud al final del periodo analizado. O sea, coloca juntas las secuencias que terminan igual.
seqIplot(sec2, border = NA, sortv = "from.end", cex.legend=0.65)Este tipo de gráfico permite observar con mayor claridad cuáles son los estados finales a los que “llegan” los individuos al final del intervalo observado y cuáles son las diferentes secuencias por las que llegan a ese estado.
Por ejemplo, en este caso permite distinguir mejor las secuencias de individuos que dejan de estudiar a diferentes edades y con distintos niveles, observando patrones con duraciones más amplias o entradas más tardías que la normativa en algunos niveles.
Igualmente, podemos segmentar estos gráficos por estrato socioeconómico de origen.
seqIplot(sec2, border = NA, group=educ_cov$iosterciles, sortv = "from.end")Por ejemplo, mediante esta representación se vuelve aún más evidente la salida temprana de la educación formal en el estrato bajo.
Podríamos también agrupar por varios factores a la vez. Por ejemplo, podemos mostrar las secuencias, ordenadas por final, para cada sexo y cada cohorte por separado. Esta doble agrupación no la podemos hacer directamente en el argumento group, sino que debemos crear primero un objeto que guarde la segmentación y después asignárselo en el argumento de seqIplot.
grupo_s_c <- interaction(educ_cov$sexo, educ_cov$cohorte, drop = TRUE)
seqIplot(sec2, border = NA, group=grupo_s_c, sortv = "from.end", with.legend=F)Esta representación nos permite ver cómo en las cohortes más antiguas las mujeres tendían a alcanzar menores niveles de escolaridad que sus pares masculinos, mientras que en la más reciente parecen haberse equiparado los niveles de escolaridad que alcanzan distintos grupos de mujeres y de hombres. Esto lo podremos observar después con mayor claridad mediante el gráfico de tiempos promedio en cada estado (seqmtplot).
Otra manera de representar las secuencias individuales es según su distancia a la secuencia más frecuente. Para ello necesitamos usar primero la función seqdist, para definir la matriz de distancias (que guardamos en el objeto dist) y usarla en el argumento sortv de seqIplot. Mediante esta opción colocará juntas las secuencias más parecidas entre sí.
dist <- seqdist(sec2, method = "LCS", refseq = 0, with.missing = TRUE)
seqIplot(sec2, border = NA, sortv = dist, cex.legend=0.65)Si queremos comparar las secuencias de varios grupos de casos podemos graficarlas por separado y colocarlas una al lado de la otra. Para ello definimos primero el marco con par, indicando cuántas gráficas debe alojar, y después definimos las gráficas con las condiciones que definen a cada grupo.
Por ejemplo, vamos a comparar las secuencias de las personas de estrato social de origen bajo de las tres cohortes, ordenadas cada una de ellas por la distancia a la respectiva secuencia más frecuente (dist1, dist2 y dist3).
dist1 <- seqdist(sec2[which(educ_cov$iosterciles=="Bajo" & educ_cov$cohorte=="1962-1968"),], method = "LCS", refseq = 0, with.missing = TRUE)
dist2 <- seqdist(sec2[which(educ_cov$iosterciles=="Bajo" & educ_cov$cohorte=="1969-1979"),], method = "LCS", refseq = 0, with.missing = TRUE)
dist3 <- seqdist(sec2[which(educ_cov$iosterciles=="Bajo" & educ_cov$cohorte=="1980-1997"),], method = "LCS", refseq = 0, with.missing = TRUE)
par(mfrow = c(1,3))
seqIplot(sec2[which(educ_cov$iosterciles=="Bajo" & educ_cov$cohorte=="1962-1968"),],
border = NA, with.legend=FALSE, main = "Estrato bajo, 1962-1968", sortv = dist1)
seqIplot(sec2[which(educ_cov$iosterciles=="Bajo" & educ_cov$cohorte=="1969-1979"),],
border = NA, with.legend=FALSE, main = "Estrato bajo, 1969-1979", sortv = dist2)
seqIplot(sec2[which(educ_cov$iosterciles=="Bajo" & educ_cov$cohorte=="1980-1997"),],
border = NA, with.legend=FALSE, main = "Estrato bajo, 1980-1997", sortv = dist3)Mediante estos gráficos podemos observar cómo la secuencia más frecuente (recogida en la parte baja de cada gráfico) en el estrato bajo ha cambiado entre una cohorte y otra. Para la cohorte de personas nacidas entre 1962 y 1968 era de no estudio (los 15 años sin estudiar). Frente a esta secuencia se observan otras con mayor o menor duración de estudio en primaria y/o con calendarios distintos (inicio más temprano o más tardío en la primaria), y también algunas secuencias que alcanzan niveles más altos, principalmente secundaria, y sólo unas pocas media superior.
En la cohorte de personas nacidas entre 1980 y 1997 la secuencia más frecuente consta de 6 años de estudio en primaria, iniciando con 6 años de edad, y 4 años de estudio en secundaria. Frente a esta secuencia, se observan, por un lado, algunas que únicamente tienen estudios de primaria o no tienen experiencia de educación formal. Por otro lado, hay personas con calendarios diferentes en la entrada y salida de secundaria y con una duración de 3 años en este nivel, y hay un grupo ya no residual con estudios de preparatoria o equivalente. Una pequeña proporción de los casos de la cohorte joven inicia estudios universitarios.
En resumen, se observa cómo ha ocurrido un proceso generalizado de expansión educativa durante el último tercio del siglo XX en México, pero que para el estrato bajo es aún limitado.
Para guardar esta gráfica en pdf:
pdf("Resultados/Freq_bajo_cohorte.pdf")
dev.off()?seqmeant()La función seqmtplot() arroja la duración promedio en cada estado de la secuencia. Aunque se puede graficar el tiempo promedio del conjunto de secuencias, tiene sentido ver estos tiempos promedio por grupos, para poder observar diferencias entre ellos.
Por ejemplo, podemos obtener los tiempos promedio que pasan en cada estado las personas según su cohorte.
par(mfrow = c(1,1))
seqmtplot(sec2, group = educ_cov$cohorte)El comando equivalente para obtener los datos con los que se construye esta gráfica es seqmeant().
seqmeant(sec2[educ_cov$cohorte=="1962-1968",]) Mean
noEstu 6.0
Prim 5.7
Sec 1.9
Prepa 1.1
Univ 0.3
seqmeant(sec2[educ_cov$cohorte=="1969-1979",]) Mean
noEstu 5.02
Prim 6.03
Sec 2.26
Prepa 1.34
Univ 0.35
seqmeant(sec2[educ_cov$cohorte=="1980-1997",]) Mean
noEstu 3.63
Prim 6.10
Sec 2.72
Prepa 1.86
Univ 0.69
Mediante estas gráficas se observa también el avance de la expansión educativa que experimentó el país en este periodo. Las personas de la cohorte de 1962-1968 pasaron un promedio de 6 años sin estudiar entre sus 6 y sus 20 años, superior al promedio de tiempo que pasaron estudiando primaria (5.7 años). El promedio de tiempo que pasaron las personas de la cohorte antigua en educación secundaria es bajo (1.9 años) y aún más en preparatoria (1.1 años). Para la cohorte más joven, nacida entre 1980 y 1997, estos tiempos promedio son ya muy distintos: pasaron 2.7 años estudiando secundaria y 1.9 años estudiando preparatoria, lo cual indica que muchas más personas están cursando estos niveles de escolaridad. El tiempo promedio fuera de la escuela entre los 6 y los 20 años se reduce a 3.6 años.
Podemos ver estas mismas gráficas por cohorte y sexo, usando la agrupación que definimos previamente (group_s_c).
seqmtplot(sec2, group = grupo_s_c, with.legend=F)Y los tiempos promedio en formato numérico:
res1 <- round(seqmeant(sec2[educ_cov$cohorte=="1962-1968" & educ_cov$sexo=="Hombre",]),2)
res2 <- round(seqmeant(sec2[educ_cov$cohorte=="1962-1968" & educ_cov$sexo=="Mujer",]),2)
res3 <- round(seqmeant(sec2[educ_cov$cohorte=="1969-1979" & educ_cov$sexo=="Hombre",]),2)
res4 <- round(seqmeant(sec2[educ_cov$cohorte=="1969-1979" & educ_cov$sexo=="Mujer",]),2)
res5 <- round(seqmeant(sec2[educ_cov$cohorte=="1980-1997" & educ_cov$sexo=="Hombre",]),2)
res6 <- round(seqmeant(sec2[educ_cov$cohorte=="1980-1997" & educ_cov$sexo=="Mujer",]),2)
res_tot <- rbind(
"1962-1968 Hombre" = as.data.frame(t(res1)),
"1962-1968 Mujer" = as.data.frame(t(res2)),
"1969-1979 Hombre" = as.data.frame(t(res3)),
"1969-1979 Mujer" = as.data.frame(t(res4)),
"1980-1997 Hombre" = as.data.frame(t(res5)),
"1980-1997 Mujer" = as.data.frame(t(res6))
)
res_tot noEstu Prim Sec Prepa Univ
1962-1968 Hombre 5.38 5.97 2.10 1.18 0.38
1962-1968 Mujer 6.44 5.55 1.71 1.06 0.24
1969-1979 Hombre 4.61 6.15 2.43 1.39 0.42
1969-1979 Mujer 5.35 5.94 2.11 1.29 0.30
1980-1997 Hombre 3.59 6.13 2.75 1.84 0.69
1980-1997 Mujer 3.67 6.07 2.69 1.87 0.70
Tal y como veíamos con seqIplot, en la cohorte antigua las mujeres pasaban menos tiempo que los hombres estudiando, con un promedio mayor de años de no estudio (6.4 frente a 5.4) y un promedio menor en cada nivel educativo. En la cohorte intermedia las diferencias entre hombres y mujeres ya se han reducido considerablemente, aunque todavía tienen las mujeres un promedio menor de años promedio en la escuela: ellas pasaron, en promedio 5.4 años sin estudiar y ellos 4.6 años. En la cohorte joven ya no se aprecian diferencias entre hombres y mujeres en el promedio de años dedicados a la escuela entre los 6 y los 20 años.
La función seqpcplot() nos resume la información de la secuencia de otra manera, mostrando las distintas sucesiones de transiciones entre estados diferentes que se dan en el conjunto de las secuencias. Aquellas sucesiones de transiciones entre estados que se dan con mayor frecuencia aparecen con líneas más gruesas.
Por ejemplo, le podemos pedir el gráfico de transiciones entre estados para cada estrato de origen por separado, lo cual nos permitirá ver que las personas de distintos estratos de origen tienden a experimentar distintas sucesiones de transiciones entre estados.
seqpcplot(sec2[educ_cov$iosterciles=="Alto",])Para el estrato alto la sucesión de estados más frecuente aparece en verde e implica la sucesión de transiciones primaria-secundaria-preparatoria-universidad. La segunda más frecuente, que aparece en naranja, es la sucesión primaria-secundaria-preparatoria-no estudia. La sucesión primaria-secundaria-no estudia es mucho menos frecuente (en morado).
seqpcplot(sec2[educ_cov$iosterciles=="Bajo",])El estrato bajo, por el contrario, la sucesión más frecuente de estados (en verde) es primaria-no estudia, seguida de la sucesión de transiciones (en naranja) primaria-secundaria-no estudia. Sólo en tercer lugar se da la sucesión primaria-secundaria-preparatoria-no estudia (en morado).
seqpcplot(sec2[educ_cov$iosterciles=="Medio",])El análisis descriptivo realizado hasta este punto se basa en información longitudinal de las secuencias, es decir, información que tiene en cuenta las secuencias individuales completas. Otra forma de analizar las secuencias es mediante estadísticos o gráficos transversales, que permiten comparar las trayectorias entre sí en distintos momentos (a distintas edades). Ofrecen una mirada complementaria para el análisis.
?seqstatdLa función seqstatd() arroja una tabla con la frecuencia transversal de cada estado en cada momento evaluado. Es decir, en este ejemplo muestra para cada edad entre los 6 y los 20 años cuál es la proporción de personas que se encuentra en cada estado de los posibles.
seqstatd(sec2) [State frequencies]
6 7 8 9 10 11 12 13 14 15 16
noEstu 0.1 0.06 0.046 0.055 0.06553 0.081 0.099 0.20718 0.253 0.305 0.4846
Prim 0.9 0.94 0.954 0.945 0.93404 0.881 0.304 0.09797 0.043 0.016 0.0065
Sec 0.0 0.00 0.000 0.000 0.00043 0.038 0.597 0.69420 0.675 0.313 0.0804
Prepa 0.0 0.00 0.000 0.000 0.00000 0.000 0.000 0.00065 0.028 0.365 0.4284
Univ 0.0 0.00 0.000 0.000 0.00000 0.000 0.000 0.00000 0.000 0.000 0.0000
17 18 19 20
noEstu 0.5370 0.5930 0.7321 0.7610
Prim 0.0035 0.0026 0.0017 0.0015
Sec 0.0324 0.0173 0.0071 0.0061
Prepa 0.4094 0.2437 0.0787 0.0396
Univ 0.0177 0.1434 0.1804 0.1918
[Valid states]
6 7 8 9 10 11 12 13 14 15 16 17 18 19
N 4624 4624 4624 4624 4624 4624 4624 4624 4624 4624 4624 4624 4624 4624
20
N 4624
[Entropy index]
6 7 8 9 10 11 12 13 14 15 16 17 18 19
H 0.21 0.14 0.12 0.13 0.15 0.27 0.56 0.5 0.53 0.72 0.59 0.56 0.63 0.49
20
H 0.43
Por ejemplo, a los 6 años el 90% de los individuos de la muestra estaba estudiando primaria y un 10% no estaba estudiando. A los 12 años un 60% estaba estudiando secundaria, un 30% primaria y un 10% no estaba estudiando. A los 15 años un 36.5% estaba estudiando preparatoria o equivalente, un 31.3% estaba estudiando secundaria, un 1.6% primaria y un 30.5% no estaba estudiando. A los 20 años un 76% de los individuos no estaba estudiando, un 19.2% estaba estudiando universidad y un 4% preparatoria.
Además, la función seqstatd() arroja el índice de entropía para cada momento evaluado. El índice de entropía permite conocer el grado de diversidad de estados que hay en cada momento. Cuando el valor de la entropía es 0, significa que todos los casos están en el mismo estado en ese punto en el tiempo. Alcanza un valor máximo cuando la misma proporción de casos están en cada estado en un momento dado.
En este ejemplo la diversidad es mínima a los 8 años (índice de entropía de 0.12), ya que un 95% de los individuos estaba estudiando primaria y el 5% restante no estaba estudiando. La diversidad es máxima a los 15 años (índice de entropía de 0.72), cuando una proporción similar de casos estaba fuera de la escuela, en secundaria y en preparatoria. Es decir, la edad normativa de entrada a la preparatoria representa un momento de incremento en la heterogeneidad en las trayectorias educativas, ya que se separan distintos patrones de secuencias. Lo mismo se observa a la edad normativa de entrada a la secundaria (a los 12 años) y a la universidad (18 años).
Podemos solicitar la frecuencia de estados sólo para un intervalo de edades, en lugar de para todas. Por ejemplo, si queremos ver sólo el intervalo entre los 12 y los 17 años, solicitamos las columnas correspondientes.
seqstatd(sec2[,7:12]) [State frequencies]
12 13 14 15 16 17
noEstu 0.099 0.20718 0.253 0.305 0.4846 0.5370
Prim 0.304 0.09797 0.043 0.016 0.0065 0.0035
Sec 0.597 0.69420 0.675 0.313 0.0804 0.0324
Prepa 0.000 0.00065 0.028 0.365 0.4284 0.4094
Univ 0.000 0.00000 0.000 0.000 0.0000 0.0177
[Valid states]
12 13 14 15 16 17
N 4624 4624 4624 4624 4624 4624
[Entropy index]
12 13 14 15 16 17
H 0.56 0.5 0.53 0.72 0.59 0.56
También podemos ver la distribución transversal de estados para grupos de casos por separado. Por ejemplo, podemos querer ver cómo ha cambiado esa distribución por cohortes.
seqstatd(sec2[educ_cov$cohorte=="1962-1968",]) [State frequencies]
6 7 8 9 10 11 12 13 14 15 16 17
noEstu 0.25 0.13 0.11 0.12 0.14 0.179 0.21 0.35 0.4184 0.473 0.5913 0.6446
Prim 0.75 0.87 0.89 0.88 0.86 0.800 0.41 0.16 0.0743 0.027 0.0097 0.0016
Sec 0.00 0.00 0.00 0.00 0.00 0.021 0.38 0.49 0.4976 0.278 0.1066 0.0582
Prepa 0.00 0.00 0.00 0.00 0.00 0.000 0.00 0.00 0.0097 0.221 0.2924 0.2843
Univ 0.00 0.00 0.00 0.00 0.00 0.000 0.00 0.00 0.0000 0.000 0.0000 0.0113
18 19 20
noEstu 0.7044 0.809 0.8401
Prim 0.0016 0.000 0.0016
Sec 0.0275 0.011 0.0065
Prepa 0.1858 0.078 0.0420
Univ 0.0808 0.102 0.1099
[Valid states]
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
N 619 619 619 619 619 619 619 619 619 619 619 619 619 619 619
[Entropy index]
6 7 8 9 10 11 12 13 14 15 16 17 18 19
H 0.35 0.24 0.21 0.23 0.26 0.35 0.66 0.63 0.59 0.71 0.59 0.54 0.54 0.41
20
H 0.35
seqstatd(sec2[educ_cov$cohorte=="1969-1979",]) [State frequencies]
6 7 8 9 10 11 12 13 14 15 16
noEstu 0.12 0.071 0.055 0.066 0.079 0.097 0.12 0.25979 0.318 0.382 0.5691
Prim 0.88 0.929 0.945 0.934 0.921 0.866 0.35 0.11890 0.053 0.018 0.0062
Sec 0.00 0.000 0.000 0.000 0.000 0.037 0.53 0.62062 0.603 0.309 0.0852
Prepa 0.00 0.000 0.000 0.000 0.000 0.000 0.00 0.00069 0.027 0.291 0.3395
Univ 0.00 0.000 0.000 0.000 0.000 0.000 0.00 0.00000 0.000 0.000 0.0000
17 18 19 20
noEstu 0.6144 0.6598 0.7890 0.8186
Prim 0.0027 0.0048 0.0041 0.0034
Sec 0.0309 0.0192 0.0103 0.0089
Prepa 0.3402 0.2172 0.0804 0.0433
Univ 0.0117 0.0990 0.1162 0.1258
[Valid states]
6 7 8 9 10 11 12 13 14 15 16 17 18 19
N 1455 1455 1455 1455 1455 1455 1455 1455 1455 1455 1455 1455 1455 1455
20
N 1455
[Entropy index]
6 7 8 9 10 11 12 13 14 15 16 17 18 19
H 0.23 0.16 0.13 0.15 0.17 0.29 0.6 0.56 0.57 0.72 0.58 0.52 0.58 0.44
20
H 0.39
seqstatd(sec2[educ_cov$cohorte=="1980-1997",]) [State frequencies]
6 7 8 9 10 11 12 13 14 15 16
noEstu 0.058 0.036 0.027 0.032 0.03882 0.047 0.058 0.14314 0.177 0.221 0.4106
Prim 0.942 0.964 0.973 0.968 0.96039 0.909 0.255 0.07059 0.030 0.012 0.0059
Sec 0.000 0.000 0.000 0.000 0.00078 0.043 0.687 0.78549 0.760 0.324 0.0714
Prepa 0.000 0.000 0.000 0.000 0.00000 0.000 0.000 0.00078 0.033 0.443 0.5122
Univ 0.000 0.000 0.000 0.000 0.00000 0.000 0.000 0.00000 0.000 0.000 0.0000
17 18 19 20
noEstu 0.4667 0.5278 0.68078 0.70902
Prim 0.0043 0.0016 0.00078 0.00039
Sec 0.0271 0.0137 0.00431 0.00431
Prepa 0.4792 0.2729 0.07804 0.03686
Univ 0.0227 0.1839 0.23608 0.24941
[Valid states]
6 7 8 9 10 11 12 13 14 15 16 17 18 19
N 2550 2550 2550 2550 2550 2550 2550 2550 2550 2550 2550 2550 2550 2550
20
N 2550
[Entropy index]
6 7 8 9 10 11 12 13 14 15 16 17 18 19
H 0.14 0.096 0.078 0.088 0.11 0.23 0.48 0.41 0.46 0.69 0.58 0.57 0.67 0.52
20
H 0.46
Esta información se puede representar también gráficamente, lo cual ayuda a analizarla.
La función seqHtplot() muestra gráficamente los valores de la entropía transversal que obtenemos con seqstatd(). Facilita la comparación de los valores de la entropía por grupos de casos. Siguiendo el ejemplo anterior, podemos pedir el gráfico de entropía transversal para cada cohorte.
seqHtplot(sec2, group=educ_cov$cohorte)Para ver las líneas del índice de entropía de cada cohorte en una misma gráfica y, así, poder compararlas mejor, podemos usar la función seqplot.tentrop().
seqplot.tentrop(sec2, group = educ_cov$cohorte, cex.legend=0.65)Este gráfico muestra con claridad que la asistencia escolar durante el intervalo de edades normativas de educación primaria se ha vuelto más homogénea a lo largo del tiempo histórico. La entropía entre los 6 y los 11 años ha disminuido considerablemente para cada cohorte y es mínima para la cohorte más joven. Para los nacidos entre 1980 y 1997 estar estudiando primaria se había convertido en una experiencia casi generalizada, con más del 94% en este estado entre los 6 y los 10 años y el 91% a los 11 años.
Los picos de entropía se encuentran para todas las cohortes en los mismos momentos, que se corresponden con la edad normativa de entrada a cada nivel educativo (entrada a primaria a los 6 años, entrada a secundaria a los 12 años, entrada a preparatoria a los 15 años y entrada a universidad a los 18 años). En parte, esto guarda relación, por un lado, con que algunos individuos no han cumplido aún la edad normativa en el momento de la entrada o con que entran con rezago en el nivel siguiente, y por otro lado, con que las transiciones de nivel educativo constituyen puntos de quiebre en las trayectorias educativas, con parte de la población abandonando el sistema educativo en esos puntos.
En ese sentido, se observa que la entrada a la secundaria, aunque todavía constituía un punto de quiebre en las trayectorias educativas para la cohorte más joven, lo era en menor medida que en las cohortes anteriores. Eso se aprecia en la caída del índice de entropía en la cohorte 1980-1997 a los 12 años y, en general, en el intervalo entre los 12 y los 14 años (véanse también las frecuencias de no estudio en este intervalo para cada cohorte). Es decir, la entrada en vigor de la obligatoriedad de la educación secundaria (en 1993) parece haber tenido el efecto de reducir hasta cierto punto la diversidad en las secuencias educativas entre los 12 y los 14 años de los miembros de la cohorte más joven.
Por otra parte, el incremento de la entropía transversal a los 18 años en la cohorte más joven refleja el aumento de la proporción de personas que a esa edad estaban estudiando preparatoria y que estaban estudiando universidad y, con ello, la disminución de la proporción de personas que no estaban estudiando.
La función seqdplot() grafica la otra parte de información que arroja seqstatd(): las frecuencias transversales de estados, es decir la proporción de casos que están en cada estado en cada momento en el tiempo. Siguiendo el ejemplo anterior, podemos pedir esta gráfica para cada cohorte por separado.
seqdplot(sec2, group = educ_cov$cohorte)Esta gráfica muestra con claridad la creciente presencia con cada cohorte sucesiva de las personas en educación primaria entre los 6 y los 11 años, así como la expansión de la educación secundaria entre los 12 y los 14 años para la cohorte más joven, con una proporción mucho menor de personas que no estaban estudiando a esas edades. Evidencia igualmente cómo se ha expandido, aunque en menor medida, la educación media superior (preparatoria o equivalente) y sólo ligeramente la universitaria.
Por ejemplo, mientras que en las cohortes 1962-1968 y 1969-1979 el estado más frecuente a los 16 años era no estudiar (59.1% y 56.9%, respectivamente), en la cohorte más joven (1980-1997) ya era más frecuente estar estudiando preparatoria o equivalente (51.2%) y la proporción de quienes no estaban estudiando había descendido al 41.1%.
TraMineR ofrece también la opción de graficar conjuntamente los dos tipos de información que arroja seqstatd(): la distribución de frecuencias y el índice de entropía en cada momento. Para ello usamos la función seqdHplot(), en la que se superponen los dos tipos de gráficos anteriores.
Si lo aplicamos al mismo ejemplo de segmentación por cohortes:
seqdHplot(sec2, group = educ_cov$cohorte)La función seqmsplot() grafica el estado modal o estado más frecuente en cada momento en el tiempo y la frecuencia de ese estado. Muestra una parte de la información que ya estaba presente en seqdplot(), pero facilita observar diferencias en la moda entre grupos.
seqmsplot(sec2, group = educ_cov$cohorte)Para el ejemplo de las secuencias por cohorte permite ver con claridad la expansión de la educación secundaria, que pasa a ser modal para el periodo entre 12 y 14 años en la cohorte 1969-1979 y aumenta mucho su frecuencia en la cohorte 1980-1997. También evidencia la expansión de la educación preparatoria, que se vuelve modal para las edades entre 15 y 17 años sólo en la cohorte 1980-1997.