El objetivo del presente documento es presentar los principales elementos que definen las matrices estocásticas, a fin de analizar procesos de Markov, en el marco del estudio de Matemática para Economista de la carrera de Licenciatura en Economía de la Facultad de Ciencias Económicas Universidad Nacional de Entre Ríos.
Para definir una matriz estocástica, primero es necesario establecer que es un vector de probabilidad.
Vector de probabilidad: es un vector cuyos componentes son todos no negativos y la suma de los mismos es igual a 1.
\[ \begin{cases} p_j \geq 0, \\ \sum_{j=1}^n p_j = 1 \end{cases} \]
Podemos establecer un vector con las probabilidades 20% y 80% para dos eventos de la siguiente forma:
vector_1 <- c(0.2, 0.8)
vector_1
## [1] 0.2 0.8
Matriz estocástica: es una matriz cuadrada donde cada una de sus filas (o columnas) representa un vector de probabilidad. Por ejemplo, si agregamos otro vector de probabilidad de 40% y 60%, podemos construir la matriz estocástica de la siguiente forma.
vector_2 <- c(0.4, 0.6)
matriz <- as.matrix(rbind(vector_1, vector_2))
matriz
## [,1] [,2]
## vector_1 0.2 0.8
## vector_2 0.4 0.6
El vector de punto fijo t es aquel que genera \(t \cdot P = t\), siendo P la matriz estocásitca correspondiente.
Las cadenas de Markov son un proceso estocásitco en la que se presentan una conjunto de hechos sucesivos, con n resultados posibles, los cuales no son independientes entre sí, ya que dependen de lo sucedido solamente en el período anterior.
De esta forma, una matriz estocásitca P puede representar una matriz de transición entre estados en un momento determinado, en un proceso de Markov.
Retomando nuestra matriz planteada anteriormente matriz
representaría dos posibles estados, A y B, donde el
vector_1
indicadría que, de observarse A, se tendría 20% de
probabilidad de volver a observarse A (y 80% de observarse B) y el
vector_2
manifiesta que al observarse B hay 60% de
probabilidad de volver a observarse, y 40% de observarse A.
Para trabajarla en R, debemos definir a matriz
como una
cadena de Markov, lo cual podemos hacerlo con la librería
markovchain
, la cual puede verse en mayor detalle en su
documentación CRAN
o documento
library(markovchain) #convocamos la librería
## Package: markovchain
## Version: 0.9.5
## Date: 2023-09-24 09:20:02 UTC
## BugReport: https://github.com/spedygiorgio/markovchain/issues
p <- new(Class = "markovchain", transitionMatrix = matriz) #definimos a "p" como una matriz de transición de una cadena de Markov
p
## Unnamed Markov chain
## A 2 - dimensional discrete Markov Chain defined by the following states:
## vector_1, vector_2
## The transition matrix (by rows) is defined as follows:
## vector_1 vector_2
## vector_1 0.2 0.8
## vector_2 0.4 0.6
Para observar su vector de punto fijo, podemos identificar el estado estacionario del proceso de Markov de la siguiente forma:
vector_punto_fijo <- steadyStates(p) #pedimos a markovchain que calcule el Estado Estacionario
vector_punto_fijo
## vector_1 vector_2
## [1,] 0.3333333 0.6666667
Para corroborar dicho vector de punto fijo, podemos ejemplificar el funcionamiento de la matriz de transición P en un vector inicial cualquiera y en nuestro vector de punto fijo
vector_prueba <- c(150, 150) #vector con relación 50% y 50% entre sus elementos
vector_prueba * p
## vector_1 vector_2
## [1,] 90 210
vector_fijo <- c(100, 200) # vector con relación 33% y 66% entre sus elementos, según el vector de punto fijo
vector_fijo * p
## vector_1 vector_2
## [1,] 100 200
Aquí, como se observa en el ejemplo anterior, el primer vector
muestra cambios en su distribución entre ambos estados, pasando del
vector (150 150)
al vector (90 210)
. En
segundo lugar, si la distribución inicial sigue la relación 1/3 y 2/3
(estado estacionario), la transición según la matriz p
no
incide en la misma: partiendo de la distribución (100 200)
,
al multiplicarla por p
se obtiene el mismo valor.
Aquí es necesario resaltar que la multiplicación matricial en R se
escribe habitualmente como %*%
, mientras que bajo la
librearía markovchain
la multiplicación de un vector
inicial por la matriz de transición se explicita como una multiplicación
habitual, con *
.
En un país existen tres partidos políticos, A B y C. El hecho de que un partido gane una elección previa no solo influye en sus propias posibilidades de ganar, sino que también afecta el desempeño electoral entre los partidos opositores, de la siguiente forma: - Cuando gana el partido A, tiene el 60% de probabilidades de ser reelecto, mientras que el partido B el 30% y C el 10% de ganar cuando A está en el poder - Si B se encuentra gobernando, el 40% de las elecciones las ganará, mientras que A ganará el 30% y C el 30% - Por último, si C gobierna, tendrá el 45% de probabilidades de ser reelecto, mientras que B el 35% y A el 20%
Si actualmente se encuentra el Partido A en el gobierno, ¿qué chances tiene cada partido de ganar dentro de 2 elecciones?
¿Cuál será la posibilidad de ganar C dentro de 3 elecciones, si actualmente se encuentra B en el gobierno?
¿Cuál será la tendencia de largo plazo de elecciones ganadas?
En primer lugar es necesario establecer la matriz de transición y definirla como una cadena de Markov
p1 <- matrix(c(0.6, 0.3, 0.1, 0.3, 0.4, 0.3, 0.2, 0.35, 0.45), #vector de probabilidades condicionadas
byrow = TRUE, #que la matriz se configure primero por filas
nrow=3) # que sea una matriz de 3 columnas, y por lo tanto 3 columnas
p1 <- new("markovchain",
states = c("Partido A", "Partido B", "Partido C"),
byrow = TRUE,
transitionMatrix = p1,
name = "Ejercicio")
p1
## Ejercicio
## A 3 - dimensional discrete Markov Chain defined by the following states:
## Partido A, Partido B, Partido C
## The transition matrix (by rows) is defined as follows:
## Partido A Partido B Partido C
## Partido A 0.6 0.30 0.10
## Partido B 0.3 0.40 0.30
## Partido C 0.2 0.35 0.45
Para estimar la situación dentro de dos períodos, partiendo de la situación inicial donde el Partido A está en el gobierno:
sit_inicial <- c(1, 0, 0) #vector de situación inicial, donde da la certeza que el partido A está en el gobierno acualmente
periodos <- 2 #cantidad de períodos hacia adelante a estimar
sit_inicial * (p1^periodos) #multiplicación del vector de situación inicial por la matriz de transición elevada a la cantidad de períodos
## Partido A Partido B Partido C
## [1,] 0.47 0.335 0.195
sit_inicial <- c(0, 1, 0)
periodos <- 3
sit_inicial * (p1^periodos)
## Partido A Partido B Partido C
## [1,] 0.3795 0.34975 0.27075
estado_estacionario <- steadyStates(p1)
round(estado_estacionario, digits = 3) #redondea el resultado en 3 dígitos
## Partido A Partido B Partido C
## [1,] 0.391 0.348 0.261
Las cadenas de Markov pueden utilizarse para el análisis socioeconómico del país, a través de la configuración de matrices de transición entre diversas categorías sociales, laborales o económicas de la población. A modo de ejemplo, a partir de la Encuesta Permanente de Hogares se pueden estudiar los paneles de la misma, con apertura trimestral o anual. A partir de la misma se puede analizar la cantidad de individuos que ha transitado entre un estado y otro entre dichos períodos.
En primer lugar, es necesario contar con las dos bases de datos que se irán a utilizar. En este caso, las EPH del tercer y cuatro trimestre de 2023, para, a partir de la misma, identificar cuantos individuos se mantienen en sus estados o cambian a otros. Un ejemplo práctico se presenta a continuación, analizando la variable ESTADO.
library(eph) #librería para gestionar la EPH, con funciones útiles para descargar datos, calcular pobreza, ordenar paneles y etiquetar datos
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.0 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ lubridate::period() masks markovchain::period()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Luego, a partir de ambas bases, genero el panel e identifico la cantidad de individuos que se mantienen o transitan entre un estado u otro.
#Descargo las dos bases de la EPH
eph4_23 <- get_microdata(year = 2023, period = 4, type = "individual")
eph3_23 <- get_microdata(year = 2023, period = 3, type = "individual")
#Las configuro como Paneles, seleccionando solo las variables "ESTADO" y "PONDERA"
panel3t4_23 <- organize_panels(bases = list(eph3_23, eph4_23),
variables = c("ESTADO", "PONDERA"),
window = "trimestral")
#Calculo la variación entre ambos estados
tab1 <- xtabs(panel3t4_23$PONDERA ~ panel3t4_23$ESTADO + panel3t4_23$ESTADO_t1)
tab1
## panel3t4_23$ESTADO_t1
## panel3t4_23$ESTADO 1 2 3 4
## 1 4934954 89315 372696 5645
## 2 141158 85370 109373 0
## 3 392013 123163 4047835 12767
## 4 5396 441 78448 1544932
#Estimo las probabilidades condicionadas por fila
tab2 <-round(prop.table(tab1, margin = 1), 2)
tab2 <- matrix(tab2, nrow=4, ncol=4, byrow=F)
#Defni a tab2 como una cadena de Markov
p_estado <- new("markovchain",
states = c("Ocupado", "Desocupado", "Inactivo", "Menor de 14 años"),
byrow = TRUE,
transitionMatrix = as.matrix(tab2),
name = "Estado 3t4 2023")
p_estado
## Estado 3t4 2023
## A 4 - dimensional discrete Markov Chain defined by the following states:
## Ocupado, Desocupado, Inactivo, Menor de 14 años
## The transition matrix (by rows) is defined as follows:
## Ocupado Desocupado Inactivo Menor de 14 años
## Ocupado 0.91 0.02 0.07 0.00
## Desocupado 0.42 0.25 0.33 0.00
## Inactivo 0.09 0.03 0.88 0.00
## Menor de 14 años 0.00 0.00 0.05 0.95
Para encontrar el estado estacionario de largo plazo en la estructura socio-ocupacional de Argentina, se plantearía:
ee3t4_23 <- steadyStates(p_estado)
round(ee3t4_23, 2)
## Ocupado Desocupado Inactivo Menor de 14 años
## [1,] 0.56 0.03 0.41 0
En este último resultado se pone en evidencia una clara limitación:
se plantea un esquema cerrado, donde no ingresan nuevos invididuos a la
dinámica analizada. Este se observa al identificarque, de mantenerse los
cambios establecidos por las probabilidades condicionadas de la matriz
de transición, habría 0% de personas menores de 14 años, lo cual es
erroneo, pero las mismas se incorporar al esquema desde afuera, y no
desde las categorías propias de la variable ESTADO
.
La situación socioeconómica de un país puede ser estudiada desde diversos aspectos, siendo uno de ellos el análisis de la cantidad de personas que se encuentran en situación de pobreza. La pobreza es entendida como una situación donde no se pueden satisfacer necesidades básicas de las personas.
Estas necesidades son de diferente índole, tales como alimentarias, vivienda, educación, salud, sanidad, entre otras. La medición de la incidencia de la pobreza puede realizarse desde distintas perspectivas teóricas o metodológicas, dando cuenta a (de) mediciones que no son compatibles entre sí, rescatando distintos tipos de necesidades o forma de acercarse a su satisfacción. La más difundida es la conocida como pobreza monetaria.
La pobreza monetaria es aquella que se estima a partir de la comparación de los ingresos de los hogares con el costo del nivel de vida establecido según una canasta de bienes y servicios definidos para tal fin.
Habitualmente se divide los bienes incluidos en dichas canastas entre bienes alimentarios y bienes no alimentarios. La primera opción, dando lugar a la Canasta Básica Alimentaria, se define como la línea de indigencia. Es decir, establece el umbral de ingresos a superar por un hogar para no ser definido como indigente.
La segunda opción, entendida como la Canasta Básica Total, incluye a la primera y le suma el conjunto de bienes y servicios no alimentarios, estableciendo la conocida línea de pobreza, umbral que diferencia los hogares pobres de los no pobres. La pertenencia a un estado en particular (pobreza; no pobreza) no permanece fija en el tiempo, y se establece, siguiendo esta metodología, según el nivel de ingresos del hogar y el valor de la Canasta Básica Total.
Cambios en alguna, o ambas, de estas variables pueden implicar, según sus magnitudes, cambios en el estado de pobreza o no pobreza. A través del estudio de paneles es posible el seguimiento de hogares a lo largo de un período de tiempo determinado. De seguir a un hogar en particular durante este período se determinará la permanencia o cambio en su estado de situación. Y al realizarlo con el conjunto de la población de un país, es posible establecer las matrices de transición que relacionen la probabilidad de encontrarse en un estado en particular en función de su estado previo.
eph
La librería eph
cuenta con la función
calculate_poverty()
que permite clasificar a cada individuo
en tres estados: indigente, pobre no indigente y
no pobre. Para tal fin, debemos incorporar dos argumentos a la
función: en primer lugar la base de EPH con la cual se trabajará, y en
segundo lugar una tabla (con formato data frame) que contenga en una
forma específica los valores de la Canasta Básica Alimentaria y Canasta
Básica Total. Las bases de datos ya las descargamos con anterioridad,
ahora debemos ver como construir la tabbla con los valores de la canasta
básica alimentaria. La librería eph
cuenta con un ejemplo
de dicha tabla, el cual se puede consultar en
canastas_reg_example
canastas_reg_example
## # A tibble: 12 × 5
## region periodo CBA CBT codigo
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 Cuyo 2016.3 1509. 3872. 42
## 2 Cuyo 2016.4 1570. 4030. 42
## 3 GBA 2016.3 1684. 4053. 1
## 4 GBA 2016.4 1756. 4232. 1
## 5 Noreste 2016.3 1513. 3414. 41
## 6 Noreste 2016.4 1568. 3539. 41
## 7 Noroeste 2016.3 1472. 3292. 40
## 8 Noroeste 2016.4 1525. 3412. 40
## 9 Pampeana 2016.3 1676. 4034. 43
## 10 Pampeana 2016.4 1746. 4209. 43
## 11 Patagonia 2016.3 1735. 4742. 44
## 12 Patagonia 2016.4 1813. 4963. 44
Por lo tanto, debemos crear una tabla con los mismos datos pero actualizando solamente los valores de las columnas CBA y CBT según los necesarios. La misma compila datos de los dos trimestres que componen cada semestre, por lo que para realizar un análisis intertrimestral entre el tercer y cuarto trimestre alcanza con una sola canasta. La misma es posible construirla de diversas formas. Una posible es construir la tabla por fuera de R e importarla, como se presenta a continuación importándola desde google spreedsheat.
canasta_II_23 <- tribble(
~region, ~periodo, ~CBA, ~CBT, ~codigo,
"Cuyo", "2023.3", 37817.45, 88100.18, 42,
"Cuyo", "2023.4", 56707.15, 126876.39, 42,
"GBA", "2023.3", 42083.40, 92024.92, 1,
"GBA", "2023.4", 63250.46, 132853.30, 1,
"Noreste", "2023.3", 37898.58, 77564.40, 41,
"Noreste", "2023.4", 57053.06, 112238.09, 41,
"Noroeste", "2023.3", 36662.88, 74303.67, 40,
"Noroeste", "2023.4", 54953.50, 107236.55, 40,
"Pampeana", "2023.3", 41554.90, 90869.84, 43,
"Pampeana", "2023.4", 62527.62, 131138.86, 43,
"Patagonia","2023.3", 43556.57, 108270.80, 44,
"Patagonia","2023.4", 65121.74, 155201.96, 44
)
canasta_II_23
## # A tibble: 12 × 5
## region periodo CBA CBT codigo
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 Cuyo 2023.3 37817. 88100. 42
## 2 Cuyo 2023.4 56707. 126876. 42
## 3 GBA 2023.3 42083. 92025. 1
## 4 GBA 2023.4 63250. 132853. 1
## 5 Noreste 2023.3 37899. 77564. 41
## 6 Noreste 2023.4 57053. 112238. 41
## 7 Noroeste 2023.3 36663. 74304. 40
## 8 Noroeste 2023.4 54954. 107237. 40
## 9 Pampeana 2023.3 41555. 90870. 43
## 10 Pampeana 2023.4 62528. 131139. 43
## 11 Patagonia 2023.3 43557. 108271. 44
## 12 Patagonia 2023.4 65122. 155202. 44
Ya con la canasta configurada, podemos usar la función
calculate_poverty()
para cada base. Esta función creará una
variable clave llamada situacion
donde categorizará a cada
individuo como pobre
no_pobre
e
indigente
.
eph3_23 <- calculate_poverty(base = eph3_23, basket = canasta_II_23)
## # A tibble: 1 × 4
## # Groups: ANO4 [1]
## ANO4 TRIMESTRE Tasa_pobreza Tasa_indigencia
## <int> <int> <dbl> <dbl>
## 1 2023 3 0.386 0.100
eph4_23 <- calculate_poverty(base = eph4_23, basket = canasta_II_23)
## # A tibble: 1 × 4
## # Groups: ANO4 [1]
## ANO4 TRIMESTRE Tasa_pobreza Tasa_indigencia
## <int> <int> <dbl> <dbl>
## 1 2023 4 0.452 0.146
A modo de resumen la función nos otorga las tasas de indigencia y de
pobreza, las cuales también podrían ser calculadas en forma conjunta
para todo el semestre, como lo publia el INDEC. A nuestro fin,nos
interesa establecer la transición entre los estados de pobreza,
indigencia y no pobreza. Para esto, podemos realizar el mismo proceso
planteado para el caso de la variable ESTADO
anteriormente,
pero ahora con la variable situacion
.
xtabs(eph3_23$PONDERA ~ eph3_23$situacion)
## eph3_23$situacion
## indigente no_pobre pobre
## 2216930 11656716 5769767
xtabs(eph4_23$PONDERA ~ eph4_23$situacion)
## eph4_23$situacion
## indigente no_pobre pobre
## 3054779 10783758 6202795
Para el panel, entonces, seleccionamos las variables necesarias para configurar el mismo y realizar el estudio pertinente.
panel3t4_23_pobreza <- organize_panels(bases = list(eph3_23, eph4_23),
variables = c("ESTADO", "PONDERA", "situacion"),
window = "trimestral")
#Calculo la variación entre ambos estados
tab1_p <- xtabs(panel3t4_23_pobreza$PONDERA ~ panel3t4_23_pobreza$situacion + panel3t4_23_pobreza$situacion_t1)
tab1_p
## panel3t4_23_pobreza$situacion_t1
## panel3t4_23_pobreza$situacion indigente no_pobre pobre
## indigente 472177 55724 169692
## no_pobre 59371 3008394 764541
## pobre 428618 350236 1062575
#Estimo las probabilidades condicionadas por fila
tab2_p <-prop.table(tab1_p, margin = 1)
tab2_p <- matrix(tab2_p, nrow=3, ncol=3, byrow=F)
tab2_p
## [,1] [,2] [,3]
## [1,] 0.67686602 0.07988039 0.2432536
## [2,] 0.01549224 0.78500882 0.1994989
## [3,] 0.23276379 0.19019794 0.5770383
#Defni a tab2_p como una cadena de Markov
p_pobreza <- new("markovchain",
states = c("indigente", "no pobre", "pobre"),
byrow = TRUE,
transitionMatrix = as.matrix(tab2_p),
name = "Pobreza 3t4 2023")
p_pobreza
## Pobreza 3t4 2023
## A 3 - dimensional discrete Markov Chain defined by the following states:
## indigente, no pobre, pobre
## The transition matrix (by rows) is defined as follows:
## indigente no pobre pobre
## indigente 0.67686602 0.07988039 0.2432536
## no pobre 0.01549224 0.78500882 0.1994989
## pobre 0.23276379 0.19019794 0.5770383
La dinámica del sistema puede representarte a través del siguiente esquema.
markovchain::plot(p_pobreza)
Ahora, nuestra matriz de transición p_pobreza
refleja
las probabilidades condicionadas de cambiar la condición de un individuo
de transitar entre un estado a otro, o mantenerse en el mismo. Partiendo
de la distribución del último trimestre de 2023, podemos proyectar
cuantos individuos se encontrarían en cada estado en el próximo
trimestre, o en n cantidad, suponiendo que la dinámica se
mantiene constante.
sit_inicial_4t23 <- as.numeric(xtabs(eph4_23$PONDERA ~ eph4_23$situacion)) #cálculo del vector de distribución de situaciones en el 4to trimestre 2023
sit_inicial_4t23
## [1] 3054779 10783758 6202795
sit_1t24 <- sit_inicial_4t23 * p_pobreza # proyección luego de un período, alcanzando el primer trimestre 2024
sit_1t24 #distribución en el primer trimestre 2024
## indigente no pobre pobre
## [1,] 3678527 9889121 6473684
prop.table(sit_1t24) #participación porcentual de cada estado en primer trimestre 2024
## indigente no pobre pobre
## [1,] 0.183547 0.4934363 0.3230167
sit_4t24 <- sit_inicial_4t23 * (p_pobreza^4) #proyección a 4 trimestres
sit_4t24
## indigente no pobre pobre
## [1,] 4729746 8597671 6713915
prop.table(sit_4t24)
## indigente no pobre pobre
## [1,] 0.2359996 0.428997 0.3350034
Por otro lado, también se puede estimar la tendencia a largo plazo, buscando el vector de punto fijo.
steadyStates(p_pobreza)
## indigente no pobre pobre
## [1,] 0.2632656 0.3977281 0.3390062
De este modo, podemos concluir que al analizar la dinámica de la pobreza en Argentina por medio de la transición de estados entre el 3° y 4° trimestre del 2023, la tendencia de largo plazo se estabilizará en torno a una tasa de pobreza del 34% de pobres no indigentes, más 26% de indigentes, mientras el 39% se mantendría por fuera de la situación de pobreza.