Matrices Estocásticas y Cadenas de Markov

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.

Matrices Estocásticas

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

Vector de punto fijo

El vector de punto fijo t es aquel que genera \(t \cdot P = t\), siendo P la matriz estocásitca correspondiente.

Cadenas de Markov

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.

Ejemplo

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 *.

Ejercicio

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%

  1. Si actualmente se encuentra el Partido A en el gobierno, ¿qué chances tiene cada partido de ganar dentro de 2 elecciones?

  2. ¿Cuál será la posibilidad de ganar C dentro de 3 elecciones, si actualmente se encuentra B en el gobierno?

  3. ¿Cuál será la tendencia de largo plazo de elecciones ganadas?

  4. 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
  1. Para dicha situación se iguala el planteo del enunciado a) pero modificando situación inicial y períodos
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
  1. Por último, se calcula el vector de punto fijo:
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

Una aplicación de Cadenas de Markov para el análisis socioeconómico de Argentina

Transición de la variable ESTADO

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.

Trancisión entre estados de POBREZA

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.

Clasificación en estados de situación de Pobreza usando la librería 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

Configuración del panel de transición de estados y la cadena de Markov

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

Estados estacionarios

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.