2.4 Caracterización de una CMTD

En esta sección estudiamos las principales características de una \(CMTD\) a través de la comunicación entre los diferentes estados de proceso, el número de visitas y los tiempos de ocupación de cada estado, los tiempos a la primera visita, partiendo de un estado, e introducimos la utilización de costes para la evaluación de los sistemas.

En todas las definiciones que presentamos a continuación asumimos que tenemos una \(CMTD\) \(\{X_n, n \in \mathbb{N}\}\) con espacio de estados \(S\) y matriz de transición de un paso \(P\).

2.4.1 Comunicación entre estados

Comenzamos caracterizando los estados de una cadena en función de sus probabilidades de transición.

Definición 2.5 Dados dos estados \(i, j\) de \(S\), se dice que el estado \(j\) es accesible desde el estado \(i\) si existe una transición \(n\) tal que \(p_{ij}(n) > 0\).

Que el estado \(j\) sea accesible desde \(i\) se denota habitualmente como \(i \rightarrow j\).

Definición 2.6 Dados dos estados \(i, j\) de \(S\), se dice que son comunicantes si \(i\) es accesible desde \(j\), y \(j\) es accesible desde \(i\), es decir, existen \(n_1\) y \(n_2\) tal que \(p_{ij}(n_1) > 0\) y \(p_{ji}(n_2) > 0.\)

Que los estados \(i, j\) sean comunicantes se denota habitualmente como \(i \leftrightarrow j\).

Definición 2.7 Un subconjunto de estados \(S_j \subset S\) se denomina clase comunicante del estado \(j\) si todos los estados de ese subconjunto son comunicantes con \(j\).

\[S_j \subset S \text{ es clase comunicante de } j \text{ si } \quad i \leftrightarrow j, \qquad \forall i \in S_j.\]

Definición 2.8 Un estado \(i \in S\) se denomina estado sin retorno cuando no es viable volver a dicho estado tras partir de él, esto es, para \(n \geq 1\), \(p_{ii}(n) = 0.\)

Definición 2.9 Un conjunto de estados \(C \subset S\) se denomina cerrado cuando no es posible pasar de un estado de \(C\) a otro que no esté en \(C\), esto es,

\[\forall i \in C, \quad \forall j \notin C \quad \Rightarrow \quad p_{ij}(n) = 0, \quad n\geq 1\] o lo que es lo mismo, \[ \sum_{j \in C} p_{ij}=1, \quad \forall i \in C.\]

Esto implica que cuando accedamos a un conjunto cerrado, será imposible salir de él y sólo será factible moverse dentro de él.

Si el conjunto cerrado está compuesto por un único estado \(i\) diremos que ese estado \(i\) es absorbente. Eso implica que si se llega a dicho estado, el proceso se queda estancado en él y ya no es posible moverse a otro estado.

Definición 2.10 Una \(CMTD\) es irreducible cuando todos sus estados están comunicados entre sí. Un conjunto de estados en S se dice irreducible cuando no contiene ningún subconjunto cerrado. Si la \(CMTD\) no es irreducible, se llama reducible.

Todos los estados dentro de un conjunto irreducible son del mismo tipo.

Para caracterizar una CMTD mediante la librería markovchain es útil usar la función summary(object) donde ‘object’ identifica el proceso a estudiar.

Ejemplo 2.2 Queremos caracterizar el proceso presentado en el Ejemplo 2.1. Cargamos los datos y ejecutamos la sintaxis a continuación.

# Caracterización
summary(proceso)
## Unnamed Markov chain  Markov chain that is composed by: 
## Closed classes: 
## a b c 
## Recurrent classes: 
## {a,b,c}
## Transient classes: 
## NONE 
## The Markov chain is irreducible 
## The absorbing states are: NONE

A la vista del resultado, concluimos que este proceso es cerrado (todo su espacio de estados es cerrado). Todos sus estados son recurrentes y no tiene estados transitorios (estos conceptos los veremos más adelante). No tiene estados absorbentes y la cadena de Markov es irreducible (todos sus estados están comunicados).

Ejemplo 2.3 Veamos ahora cómo utilizar la simulación para responder a diferentes preguntas de interés. En concreto, para el ejemplo en la sección Inventario con desabastecimiento (recordemos que se trataba de un almacén que se reabastecía cuando el inventario quedaba por debajo o igual a un nivel mínimo de almacenaje, \(A=0\), y con una política de reabastecimiento que dependía del nivel de almacenaje máximo \(B=2\)), planteamos estas preguntas:

  1. Durante las próximas 20 semanas, ¿en cuántas de ellas será preciso reabastecerse?

  2. Durante las próximas 20 semanas, ¿cuál es la proporción de semanas en que la demanda no ha sido satisfecha (por rebasar el stock)?

Para responder estas preguntas hay que considerar el proceso \(\{X_n, n \geq 0\}\) y la variable \(Y_n\) que identifica la demanda en la semana \(n\). Planteamos el siguiente algoritmo de simulación.

Algoritmo para simulación de inventario

  • Paso 1. Fijar el número de transiciones del proceso, \(n\), e inicializar \(X_0 = 2\) (máximo almacenaje).

Repetir pasos 2 y 3 hasta alcanzar el número de transiciones deseadas.

  • Paso 2. Generar \(Y_i\) con el método de la transformada inversa.

  • Paso 3. Actualizar el valor \(X_i\) y reabastecer si fuera necesario.

  • Paso 4. Devolver la secuencia \(\{X_i, Y_i; i=1,\ldots,n\}\) para estudiar la evolución del sistema y la demanda.

Desarrollemos pues, el algoritmo.

# Inicialización
set.seed(12)
tiempo <- 21 # valor inicial y 20 transiciones
invent <- c()  # vector con los valores de inventario
demanda <- c() # vector con los valores de demanda
A <- 0
B <- 2
##### Configuración metodo transformada inversa ######
# datos uniformes
unif <- runif(tiempo-1)
# Valores posibles para la demanda
valores <- c(0, 1, 2)
# Probabilidades para la demanda
prob <- c(0.5, 0.4, 0.1)
probacum <- cumsum(prob)  # probabilidades acumuladas
# valor inicial del proceso
invent[1] <- 2
demanda[1] <- 0
i<-2
while (i <= tiempo)
{
  # simulamos demanda
  demanda[i] <- valores[min(which(unif[i-1] <= probacum))] 
  # Actualizamos inventario
  ifelse(invent[i-1] <= A, 
         invent[i] <- B - demanda[i], 
         invent[i] <- invent[i-1]-demanda[i])
  # iteración siguiente
  i<-i+1
}
# Devolvemos la secuencia de estados 
inventario2.sim=data.frame(invent,demanda)
head(inventario2.sim)
##   invent demanda
## 1      2       0
## 2      2       0
## 3      1       1
## 4     -1       2
## 5      2       0
## 6      2       0

La estimación del número de semanas que hay que reabastecerse viene dada por el número de simulaciones en las que el nivel de inventario es menor o igual al nivel mínimo de almacenamiento, \(invent=X\leq 0\), es decir

sum(inventario2.sim$invent <= A)
## [1] 3

La proporción de semanas en que la demanda no ha sido satisfecha (por rebasar el stock) corresponde a aquellas en las que la demanda ha superado al inventario,

mean(inventario2.sim$invent <inventario2.sim$demanda)
## [1] 0.1428571

2.4.2 Tiempos de ocupación

Definición 2.11 Sea \(\{X_n, n \in \mathbb{N}\}\) una \(CMTD\) homogénea con espacio de estados \(S = \{1, 2,...,N\}\), matriz de probabilidades de transición de una paso \(P\), y distribución inicial \(p(0)\). Consideramos la variable aleatoria \(N_j(n)\) como el número de visitas al estado \(j\) en el periodo \(\{1, 2,...,n\}\) y definimos

\[m_{ij}(n) = E[N_j(n)|X_0 = i]\] como el número esperado de visitas o tiempo de ocupación del estado \(j\) hasta el instante \(n\), partiendo del estado \(i\).

A partir de las cantidades \(m_{ij}(n)\) se puede definir la matriz de tiempos de ocupación hasta un instante \(n\), \(M(n)\), que se puede calcular a partir de la matriz de transición \(P\) como:

\[\begin{equation} M(n) = \sum_{r=0}^n P^r \tag{2.7} \end{equation}\]

Definición 2.12 Sea \(\{X_n, n \in \mathbb{N}\}\) una \(CMTD\). Se define el número de visitas al estado \(j\) a lo largo de la vida de la cadena como \[N_j=\sum_{n=0}^{\infty} I(X_n,j),\] donde \(I(X_n,j)=1\) si \(X_n=j\) y 0 en otro caso.

Así, el número esperado de visitas al estado \(j\) a lo largo de la vida de la cadena, partiendo del estado \(i\), se define como \[m_{ij} = E[N_j|X_0 = i].\]

Definición 2.13 Un estado \(i\) se dice que es recurrente si es continuamente revisitado a lo largo de la vida de la cadena, esto es, el número esperado de visitas al estado \(i\) a lo largo de la vida del proceso es infinito, \(m_{ii}=E(N_i|X_0=i)=\infty\). En otro caso, cuando sólo se accede un número finito de veces, se dice que es transitorio. Un estado transitorio sólo será accesible durante un cierto periodo de tiempo, tras el cual dicho estado ya no será revisitado nunca más.

Ejemplo 2.4 Volvemos sobre el Ejemplo 2.1 para calcular los tiempos de ocupación durante un periodo continuado de 10 transiciones. Para ello utilizamos la Ecuación (2.7) con \(n=10\).

## Simulación de los tiempos de ocupación (número de visitas a un estado)
# Número de estados del proceso
nestat <- dim(proceso)
# Estados
nombres<- names(proceso)
# Generamos la matriz de ocupaciones
mocupa <- matrix(rep(0,nestat*nestat),
                 nrow = nestat, dimnames = list(nombres, nombres))
# Bucle de cálculo de los tiempos de ocupación
P=proceso[1:nestat,1:nestat] # matriz de transición
for (i in 0:10)
{
   mocupa <- mocupa + P^i
}
mocupa
##          a        b        c
## a 1.250000 1.428569 1.999023
## b 1.111111 1.000000 6.861894
## c 2.219126 1.000000 1.817903

Podemos ver cómo el número esperado de visitas al estado \(c\) partiendo del estado \(b\) en las próximas 10 transiciones es casi de 7 (6.86). Sin embargo, si partimos del estado \(b\), en 10 transiciones sólo esperamos volver a dicho estado 1 vez.

Definamos una función para obtener la matriz de tiempos de ocupación (o número esperado de visitas) durante un periodo de duración de \(n\) unidades de tiempo.

mocupa.proceso <- function(sistema, n)
{
  # Número de estados del proceso
  nestat <- dim(sistema)
  # Estados
  nombres<- names(sistema)
  # Generamos la matriz de ocupaciones
  mocupa <- matrix(rep(0, nestat*nestat),
                 nrow = nestat, dimnames = list(nombres, nombres))
  # Bucle de calculo de los tiempos de ocupación
  P=sistema[1:nestat,1:nestat]
  for (i in 0:n)
   mocupa <- mocupa + P^i
  
  return(mocupa)
}

PRACTICA Obtener y caracterizar la matriz del número esperado de visitas en 20 transiciones para los procesos: Fiabilidad de máquinas,Metereología, Problema de inventario, Planificación de mano de obra y Mercado de valores.

2.4.3 Análisis de costes

Una aplicación muy habitual de los tiempos de ocupación es directa en los denominados modelos de costes, que describimos brevemente, y que pueden estar vinculados en situaciones específicas a costes, beneficios, pérdidas, etc..

Sea \(X_n\) el estado del sistema en el tiempo \(n\). Asumimos que \(\{X_n, n \in \mathbb{N}\}\) es una \(CMTD\) con espacio de estados \(S =\{1, 2,...,N\}\), matriz de transición \(P\), y matriz de tiempos de ocupación \(M(n)\).

En esta situación, hablamos de que cada visita a cierto estado \(i\) tiene un coste asociado \(C(i)\), y el coste esperado por visitar el estado \(i\) a lo largo de la vida del proceso viene dado por \(c(i) = E[C(i)]\). Definimos la matriz de costes esperados asociados a los estados, como \(c\), de dimensión \(N\times 1\), como: \[c' = (c(1),c(2),\ldots,c(N))\]

Así mismo, hablamos del coste \(C(X_r)\) en el que incurre el sistema en un instante concreto \(r\), y \(\sum_{r=0}^n C(X_r)\) el coste acumulado desde el inicio del proceso hasta llegar al instante \(n\). Entonces el coste esperado total (CET) asociado al funcionamiento del sistema hasta llegar al instante \(n\) se calculará como \(E\left[\sum_{r=0}^n C(X_r)\right]\).

Definimos el coste esperado total (CET) hasta el instante \(n\) partiendo del estado \(i\), \(g(i,n)\), como: \[g(i,n) = E\left[\sum_{r=0}^n C(X_r)| X_0 = i \right]\]

y construimos la matriz de costes totales sobre un horizonte finito (CTHF) hasta el instante \(n\), \(g(n)\), de dimensión \(N \times 1\), a través de estos costes esperados partiendo de cualesquier estado \(i \in S\), como \[g(n)' = (g(1,n),g(2,n),\ldots,g(N,n))\]

Definición 2.14 Si queremos calcular el coste esperado total sobre un horizonte finito hasta un instante \(n\), (CTHF), basta multiplicar la matriz de tiempos de ocupación hasta el instante \(n\), \(M(n)\), por la matriz de costes esperados asociados a los estados del sistema, \(c\): \[\begin{equation} g(n) = M(n) \cdot c \tag{2.8} \end{equation}\]

Ejemplo 2.5 Volvamos al proceso de inventario presentado en el Problema de inventario con espacio de estados \(\{2,3,4,5\}\). Supongamos que la empresa compra PCs por 1500 euros y los vende por 1750 euros. Además el coste de almacenamiento semanal es de 50 euros por cada unidad que está en la tienda al inicio de una semana. Queremos calcular los ingresos netos que la tienda espera obtener durante las próximas 10 semanas, suponiendo que comienza con cinco PCs en stock al inicio del periodo.

En esta situación, si hay \(i\) PCs al principio de la semana \(n\), el coste esperado de almacenamiento esa semana es \(50i\). Si \(D_n\) es la demanda durante la semana \(n\), el número esperado de PCs vendidos durante la semana \(n\) será \(E[min(i, D_n)]\), por lo que los ingresos netos previstos para la semana \(n\) provendrán de los ingresos por ventas menos los gastos de almacenaje, esto es,

\[c(i) = (1750-1500)E[min(i, D_n)] -50i, \quad 2 \leq i \leq 5\]

Necesitamos pues, obtener el valor de \(E[min(i, D_n)]\), para cada valor de \(i\). Veamos cómo hacerlo, tanto de forma teórica como mediante simulación. Denotemos por \(Z_{i,n} = min(i, D_n),\) para \(i=2, 3, 4, 5\) de forma que:

\[\begin{equation*} Z_{i,n} = \begin{cases} i & \text{ si } i \leq D_n \text{, con } Pr[i \leq D_n]\\ D_n & \text{ si } i > D_n \text{, con } Pr[i > D_n] \end{cases} \end{equation*}\]

de esta forma tenemos que su valor esperado vendrá dado por:

\[E[Z_{i,n}] = i*Pr[i \leq D_n] + \sum_{d=0}^{i-1} d \cdot Pr(D_n=d).\]

Recordando que \(D_n\sim Pois(3)\) en el ejemplo original, para \(i=2\) la expresión anterior da lugar a:

\[\begin{eqnarray*} E[Z_{2,n}] &= 2*Pr[D_n \geq 2] + 0*Pr[D_n = 0] + 1*Pr[D_n =1] \\ &= 2*0.8008+0.1494 = 1.751 \end{eqnarray*}\]

y por tanto:

\[c(2) = 250*1.751 -50*2 = 337.75\]

De forma análoga podemos obtener el resto de costes esperados por el hecho de tener \(i\) PCs en la tienda,

\[c = \begin{pmatrix} 337.75 \\ 431.95 \\ 470.15 \\ 466.23 \end{pmatrix}\]

de donde podemos calcular los ingresos netos totales esperados durante las próximas \(n=10\) semanas, sea cual sea el estado inicial del sistema, a través de la matriz \[g(10)=M(10) \cdot c\] que calculamos a continuación:

c=matrix(c(337.75,431.95,470.15,466.23), ncol=1)
M10=mocupa.proceso(inventario,10)
g=M10 %*% c
g
##           [,1]
## 2 PCs 5282.121
## 3 PCs 3459.052
## 4 PCs 2536.941
## 5 PCs 2325.006

y que nos permite extraer los ingresos netos totales esperados asumiendo que el periodo inicia con \(i=5\) PCs en tienda, esto es, como \(g(5,10)=2325.006\) euros.

Los valores de \(c\) se pueden aproximar mediante simulación sin necesidad de calcularlos de forma teórica. A continuación se presenta el código necesario para realizar la simulación. Concretamente definimos una función que depende del valor del estado inicial \(i\).

c.sim <- function(estado, nsim)
{
  # estado: estado inicial del sistema
  # nsim: nº simulaciones para la aproximación
  
  # Fijamos semilla
  set.seed(12)
  # Simulamos valores del mínimo entre i y D_n
  datos <- data.frame(rsim = rpois(nsim, 3), rdos <- rep(estado, nsim))
  minimo <-apply(datos, 1 ,min) # Mínimo por filas
  # Valor esperado min(i,D_n)
  esperanza <- mean(minimo)
  # coste
  coste <- round(-50*estado+250*esperanza, 2)
  return(coste)
}

Aproximamos pues por simulación, los valores de la matriz \(c\) con \(nsim=1.000.000\) simulaciones

nsim <- 1000000
c.s=matrix(c(c.sim(2, nsim),c.sim(3, nsim),
      c.sim(4, nsim),c.sim(5, nsim)),ncol=1)
c.s
##        [,1]
## [1,] 337.66
## [2,] 431.81
## [3,] 470.04
## [4,] 466.20

Como se puede ver, la simulación funciona bastante bien para aproximar el vector \(c\); resolvamos pues los cálculos de \(g(5,10)\) con estos valores, que de nuevo aproximarán las cantidades que buscamos.

# matriz M
Mmat <- mocupa.proceso(inventario, 10)
# vector g
beneficio <- Mmat%*%c.s
beneficio
##           [,1]
## 2 PCs 5281.517
## 3 PCs 3458.551
## 4 PCs 2536.474
## 5 PCs 2324.530

Mientras que teóricamente obteníamos unos ingresos esperados de 2325€, con la simulación obtenemos una aproximación de 2324.53€.

2.4.4 Tiempos de primer paso

Definición 2.15 Sea \(\{X_n, n \in \mathbb{N}\}\) una \(CMTD\) homogénea con espacio de estados \(S = \{1, 2,...,N\}\). Se define el tiempo de primer paso o tiempo de primera visita al estado \(j\) partiendo del estado \(i\), \(T_{ij}\), como el mínimo número de transiciones necesarias para alcanzar el estado \(j\) partiendo del estado inicial \(i\), es decir:

\[T_{ij} = \underset{n}{min}\{n > 0, X_n = j | X_0 = i\}\]

En ocasiones interesará sin embargo el tiempo de primer paso de un estado a un conjunto de estados \(A\):

\[T_{iA} = \underset{n}{min}\{n > 0, X_n \in A | X_0 = i\}.\]

Para obtener los tiempos esperados de recurrencia \(f=(f_{11},...,f_{NN})\) para el espacio de estados \(S=\{1,...,N\}\), utilizamos la función meanRecurrenceTime(proceso) de la librería markovchain.

Podemos obtener la distribución de probabilidad asociada al tiempo de primer paso del estado \(j\) desde el estado \(i\) en \(n\) transiciones, \(f_{ij}(n)\), con la función firstPassageMultiple(proceso,state=i,set=j,n=n).

Para obtener los tiempos esperados de primer paso por un estado \(j\) desde cualquier estado de \(S\), podemos utilizar la función meanFirstPassageTime(proceso,destination=j) de la librería markovchain. Si queremos calcular la matriz de tiempos esperados para llegar a cualquier estado desde cualquier estado, basta utilizar meanFirstPassageTime(proceso).

En caso de que no podamos utilizar la función meanFirstPassageTime para el cálculo del tiempo de primer paso, podemos utilizar la propiedad que pasamos a describir.

Definición 2.16 Sea \(\{X_n, n \in \mathbb{N}\}\) una \(CMTD\) con espacio de estados \(S = \{1, 2,...,N\}\). Si estamos interesados en obtener el tiempo esperado de primer paso para el estado \(j\) desde cualquier estado \(i\), dado por:

\[v_{ij} = E(T_{ij}), \quad \text{ con } T_{ij} = \underset{n}{min}\{n > 0, X_n = j | X_0 = i\}\]$ y construimos la matriz de dimensión \((N-1) \times 1\) \(\mathbf{v_j'}=(v_{1j},...,v_{j-1,j},v_{j+1,j},...,v_{Nj})\)
basta con resolver el sistema:

\[[\mathbf{I} - P_{-j}]\mathbf{v_j} = \mathbf{1}\]

donde

  • \(P_{-j}\) es la matriz de transición eliminando la fila y columna del estado \(j\),
  • \(\mathbf{1}\) es un vector de unos, de dimensión \(N-1\),
  • \(\mathbf{I}\) es una matriz diagonal de las mismas dimensiones que \(P_{-N}\).

Esta ecuación se puede generalizar para obtener los tiempos esperados de primer paso desde un estado \(i\) hasta cualquier subconjunto de estados \(S_c \subset S\).

Función para obtener los tiempos esperados de primer paso

Como alternativa a la función definida en markovchain, programamos a continuación una función genérica para poder obtener los tiempos esperados de primer paso, dependiente de dos parámetros:

  • proceso: \(CMTD\) que describe el sistema a estudio
  • estado: estado o conjunto de estados que se desean alcanzar, partiendo desde cualquier estado inicial que no está en este conjunto.
# Función para obtener el tiempo esperado de primer paso por "estado"
# (equivalente a meanFirstPassageTime de markovchain)
tiempo.pp <- function(proceso, estado)
{
  # estados del proceso
  estados <- states(proceso)
  numestados <- length(estados)
  # posición de los estados deseados
  lestat <- length(estado)
  pos <- which(estados %in% estado)
  # matriz P_N
  P_N <- proceso[-pos,-pos]
  # vector de unos
  vector.1 <- matrix(rep(1, numestados-lestat), ncol=1)
  # sistema de ecuaciones
  sistema <- diag(numestados-lestat) - P_N
  # solución del sistema
  solucion <- solve(sistema, vector.1)
  return(solucion)
}

Definición 2.17 Sea \(\{X_n, n \in \mathbb{N}\}\) una \(CMTD\) homogénea con espacio de estados \(S = \{1, 2,...,N\}\). Se definen las probabilidades de primera visita o primer paso del estado \(i\) al \(j\) en \(n\) transiciones, con \(f_{ij}(n)\),

\[\begin{eqnarray*} f_{ij}(n) &=& Pr[X_n = j, X_{n-1} \neq j,\ldots, X_1 \neq j | \quad X_0 = i] \\ &=& Pr(T_{ij}=n), \quad n \geq 0 \end{eqnarray*}\]

donde por convenio \(f_{ij}(0) = 0.\)

Definición 2.18 Sea \(\{X_n, n \in \mathbb{N}\}\) una \(CMTD\) homogénea con espacio de estados \(S = \{1, 2,...,N\}\). Sea \(m_{ij}\) el número esperado de visitas al estado \(j\) cuando se parte del estado \(i\), y \(f_{ij}=Pr(T_{ij}<\infty)\) la probabilidad de alcanzar el estado \(j\) partiendo del estado \(i\). Entonces se cumple la relación: \[ m_{ij}=\begin{cases} \frac{1}{1-f_{jj}}, \quad \text{ si } i=j \\ \frac{f_{ij}}{1-f_{jj}}, \quad \text{ si } i\neq j \end{cases}\]

Definición 2.19 Si \(T_{ii}\) denota el tiempo del primer retorno, o tiempo de recurrencia al estado \(i\), entonces se dice que el estado \(i\) es recurrente si \(f_{ii}=Pr(T_{ii}<\infty)=1\), es decir, si el sistema se inicia en él, pueda volver a él. Es transitorio si \(f_{ii}<1\).

Ejemplo 2.6 Analizamos los tiempos de primer paso, tiempos de recurrencia y probabilidades de primer paso sobre el proceso presentado en el Ejemplo 2.1. Estamos interesados en saber cuándo alcanzaremos el estado “b” partiendo desde cualquier estado en el momento inicial.

Comenzamos calculando los tiempos de primer paso utilizando las dos funciones consideradas, la propia y la de markovchain.

# Tiempo de primer paso partiendo del estado "b"
# libreria
meanFirstPassageTime(proceso, "b")
##        a        c 
## 6.363636 8.181818
# definida por nosotros
tiempo.pp(proceso, "b")
##       [,1]
## a 6.363636
## c 8.181818

Podemos ver que ambas funciones proporcionan el mismo resultado. Si comenzamos en el estado “a” tardaremos en promedio seis transiciones para alcanzar por primera vez el estado “b,” mientras que si empezamos en el estado “c” tardaremos 8 transiciones en alcanzar el estado “b.”

Si deseamos la matriz del valor esperado del primer paso en cualquier estado basta con ejecutar

meanFirstPassageTime(proceso)
##          a        b        c
## a 0.000000 6.363636 1.688312
## b 2.636364 0.000000 1.168831
## c 1.818182 8.181818 0.000000

Obtenemos ahora el tiempo de primer paso (utilizando la función programada) y la probabilidad de primer paso de pasar del estado \(b\) a cualquiera de los estados \(a\) o \(c\) en 10 transiciones (\(A = \{a, c\}\))

# Tiempo esperado e primer paso de "b" a "A"
tiempo.pp(proceso,c("a","c"))
##      [,1]
## [1,]    1
# Probabilidad de primer paso de "b" a "A"
firstPassageMultiple(proceso, "b", c("a","c"), 10)
##             set
## 1  1.0000000000
## 2  0.5450000000
## 3  0.2597500000
## 4  0.1091375000
## 5  0.0479968750
## 6  0.0211430938
## 7  0.0093898422
## 8  0.0041868540
## 9  0.0018726328
## 10 0.0008392372

Se espera poder pasar de \(b\) a \(A\) en una transición (lógico puesto que A es el conjunto complementario a \(b\) en el conjunto de estados), mientras que la probabilidad de pasar del estado \(b\) al conjunto \(A\) en dos transiciones es de \(0.55\) y tan solo de \(0.0008\) en 10 transiciones.

En cuanto a los tiempos de recurrencia, tenemos:

# Tiempo de recurrencia
meanRecurrenceTime(proceso)
##        a        b        c 
## 2.700000 9.000000 1.928571

Podemos ver que una vez hemos pasado por el estado “b” tardamos 9 transiciones en volver a él. Calculamos ahora la probabilidad de recurrencia en 10 transiciones.

# Probabilidad de recurrencia en 10 pasos
firstPassageMultiple(proceso, "b", "b", 10)
##           set
## 1  0.00000000
## 2  0.03000000
## 3  0.15450000
## 4  0.10597500
## 5  0.09746625
## 6  0.08295844
## 7  0.07195424
## 8  0.06211757
## 9  0.05368795
## 10 0.04638892

Si iniciamos el proceso en el estado “b” la probabilidad de volver a dicho estado es muy baja en cualquiera de las 10 primeras transiciones. La probabilidad de volver en 3 transiciones es de 0.15, pero de volver en 10 transiciones es de 0.046.

¿Qué implicaciones prácticas tienen los análisis realizados en el proceso estudiado?

Ejemplo 2.7 Consideramos el proceso que ya vimos sobre Fiabilidad de máquinas. Supongamos que en el instante inicial (dia 0) las dos máquinas están “On,” y que deseamos calcular el tiempo esperado hasta que las dos máquinas estén “Off” por primera vez.

Si \(Y_n\) es el proceso que representa el número de máquinas que están “On,” con espacio de estados \(S = \{0, 1, 2\}\), estamos interesados en calcular el tiempo esperado para llegar a \(Y_n = 0\) (dos máquinas “Off”) partiendo de \(Y_0 = 2\) (dos máquinas “On”). Utilizamos la función propia estableciendo el estado objetivo.

# Tiempo de primer paso para acabar en el estado "0"
tiempo.pp(fiabilidad, "0")
##       [,1]
## 1 2450.990
## 2 2451.485

El tiempo esperado para que las dos máquinas estén en estado “Off” comenzando con ambas en el estado “On” es 2451.5, que expresado en años será \(2451.5/365 = 6.71\) años.

Ejemplo 2.8 Consideramos el proceso ya presentado sobre Planificación de mano de obra. Deseamos el tiempo medio de permanencia en la empresa para un empleado recién reclutado. Recordemos que un nuevo empleado siempre empieza en el nivel “1.” Definamos un proceso \(Y_n\) que representa el nivel de un empleado novel en la semana n-ésima, proceso que puede tomar los valores \(S = \{0, 1, 2, 3, 4\}\), donde \(Y_n=0\) significa que deja la empresa en n semanas después de empezar. En esta situación el proceso \(\{Y_n, n \in \mathbb{N}\}\) es una \(CMTD\) con espacio de estados \(S = \{0, 1, 2, 3, 4\}\) y matriz de probabilidades de transición calculadas a partir de las probabilidades que se daban en el desarrollo de Planificación de mano de obra y teniendo en cuenta que si está fuera de la empresa, a la semana siguiente también lo estará:

\[P = \begin{pmatrix} 1 & 0 & 0 & 0 & 0 \\ 0.02 & 0.98 & 0.03 & 0 & 0\\ 0.008 & 0 & 0.982 & 0.01 & 0\\ 0.02 & 0 & 0 & 0.975 & 0.005\\ 0.01 & 0 & 0 & 0 & 0.99 \end{pmatrix}\]

Creamos la estructura del sistema:

# Definimos estados
estados <- c("0", "1", "2", "3", "4")
# Matriz de transición 
pmat <- matrix(data = c(1, 0, 0, 0, 0,  
                        0.02, 0.95, 0.03, 0, 0, 
                        0.008, 0, 0.982, 0.01, 0,   
                        0.02, 0, 0, 0.975, 0.005,
                        0.01, 0, 0, 0, 0.99), 
               byrow = TRUE, nrow = 5, 
               dimnames = list(estados, estados))
# CMTD
planificacion2 <- new("markovchain", states = estados, 
                 byrow = TRUE, transitionMatrix = pmat, name = "planificacion")
# Verificamos los datos introducidos
planificacion2
## planificacion 
##  A  5 - dimensional discrete Markov Chain defined by the following states: 
##  0, 1, 2, 3, 4 
##  The transition matrix  (by rows)  is defined as follows: 
##       0    1     2     3     4
## 0 1.000 0.00 0.000 0.000 0.000
## 1 0.020 0.95 0.030 0.000 0.000
## 2 0.008 0.00 0.982 0.010 0.000
## 3 0.020 0.00 0.000 0.975 0.005
## 4 0.010 0.00 0.000 0.000 0.990
# y describimos el sistema
summary(planificacion2)
## planificacion  Markov chain that is composed by: 
## Closed classes: 
## 0 
## Recurrent classes: 
## {0}
## Transient classes: 
## {1},{2},{3},{4}
## The Markov chain is not irreducible 
## The absorbing states are: 0

En este caso el estado “0” es absorbente (cuando es despedido, ya no vuelve), y el resto de estados son transitorios. Al tener un estado absorbente, no es irreducible y no se puede aplicar la función meanFirstPassageTime() para calcular los tiempos de primer paso esperados. Usamos pues, la función que hemos programado:

# Tiempo esperado para llegar a estado 0
tiempo.pp(planificacion2, "0")
##        [,1]
## 1  73.33333
## 2  88.88889
## 3  60.00000
## 4 100.00000

Puesto que el nuevo empleado comienza siempre en el nivel “1,” el tiempo esperado para que abandone la empresa es de 73.33 semanas (el proceso se mide en semanas), lo que equivale a 1.4 años (\(73.33/52\)).