librerias:

# librerias de grafica----
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(gganimate)
library(av)
library(gifski)

funciones:

#Funciones----
one_minus_one <- function() {
  if(rbinom(n = 1, size = 1, prob = 1/2)){
    return(1)
  }
  else{
    return(-1)
  }
}

random_move <- function(lateral,position, lenW) {
  X_Y = ifelse(test = lateral == 1, yes = 1, no = 2)
  
  new_p = position[X_Y] + one_minus_one()
  
  new_p = ifelse(test = new_p < 0, yes = lenW, no = new_p)
  
  new_p = ifelse(test = new_p > lenW, yes = 0, no = new_p)
  
  position[X_Y] = new_p
  
  return(position)
}

random_walk <- function(position, lenW) {
  lateral_move = rbinom(n = 1, size = 1, prob = 1/2)
  position = random_move(lateral = lateral_move, position = position, lenW)
  return(position)
}

random_position <- function(lenW){
  X = as.integer(runif(n = 1, min = 0, max = lenW))
  Y = as.integer(runif(n = 1, min = 0, max = lenW))
  return(c(X,Y))
}

# X3 es 1 si esta infectado.

random_vector <- function(n = 10, lenW){
  vector = c()
  for(i in 1:n){
    vector = c(vector, 
               random_position(lenW), 
               rbinom(n = 1, size = 1, prob = 0.1),
               0,
               0,
               i)
  }
  return(vector)
}

random_position_M <- function(matriz, n_row = 10, lenW){
  for (row in 1:n_row) {
    matriz[row, ] = c(random_walk(matriz[row,],lenW))
    matriz[row,5] = matriz[row,5] + 1
  }
  return(matriz)
}

last_ten <- function(df, ten = 10) {
  len = nrow(df)
  first = len - (ten - 1)
  return(df[first:len,])
}

df_infected <- function(df){
  return(df %>% filter(X3 == 1) %>% select(X1,X2))
}

df_not_infected <- function(df){
  return(df %>% filter(X3 == 0))
}

Simulación:

# prueba----
NUM_IND = 15
NUM_OF_DAYS = 10
LEN_W = 10
PROBA = 0.2

(matriz_position = matrix(data = random_vector(n = NUM_IND, LEN_W), 
                          ncol = 6,
                          byrow = T))
##       [,1] [,2] [,3] [,4] [,5] [,6]
##  [1,]    8    2    0    0    0    1
##  [2,]    9    3    0    0    0    2
##  [3,]    3    8    0    0    0    3
##  [4,]    8    9    0    0    0    4
##  [5,]    3    8    0    0    0    5
##  [6,]    0    5    0    0    0    6
##  [7,]    5    3    1    0    0    7
##  [8,]    6    6    0    0    0    8
##  [9,]    2    4    0    0    0    9
## [10,]    8    8    0    0    0   10
## [11,]    8    7    0    0    0   11
## [12,]    4    2    0    0    0   12
## [13,]    0    7    0    0    0   13
## [14,]    7    7    0    0    0   14
## [15,]    6    2    0    0    0   15
(df = data.frame(matriz_position))
##    X1 X2 X3 X4 X5 X6
## 1   8  2  0  0  0  1
## 2   9  3  0  0  0  2
## 3   3  8  0  0  0  3
## 4   8  9  0  0  0  4
## 5   3  8  0  0  0  5
## 6   0  5  0  0  0  6
## 7   5  3  1  0  0  7
## 8   6  6  0  0  0  8
## 9   2  4  0  0  0  9
## 10  8  8  0  0  0 10
## 11  8  7  0  0  0 11
## 12  4  2  0  0  0 12
## 13  0  7  0  0  0 13
## 14  7  7  0  0  0 14
## 15  6  2  0  0  0 15
# Infeccion 
for (day in 1:NUM_OF_DAYS) {
  new_df = random_position_M(last_ten(df, ten = NUM_IND),
                               lenW = LEN_W,
                               n_row = NUM_IND)
    
  df_inf_past = df_infected(new_df)
  
  num_inf = nrow(df_inf_past)
    
  df_not_inf_new = df_not_infected(new_df)
  
  for (row in 1:NUM_IND) {
    if(sum(new_df[row, 6] == df_not_inf_new$X6) > 0){
      for (row2 in 1:num_inf){
        if(sum(new_df[row, 1:2] == df_inf_past[row2,]) == 2){
          new_df[row,3] = rbinom(n = 1,size = 1,prob = PROBA)
          break
        }
      }
    }
  }
    
  df = rbind(df,new_df)
  if(sum(new_df$X3) == NUM_IND){
    break
  }
}

Graficas

#graficas

#simulacion de la infeccion ----
grafic = df %>% ggplot(aes(x = X1, 
                           y = X2,
                           col = factor(X3))) + 
  geom_point(show.legend = FALSE) +
  theme_void() + 
  labs(x = '',
       y = '',
       caption = 'Simulación elaborada por Baruch Fts') +
  xlim(0,LEN_W) +
  ylim(0,LEN_W) + 
  geom_text(aes(x = LEN_W, 
                y = 0, 
                label = as.factor(X5)) , 
            hjust= 1, 
            vjust = 0, 
            alpha = 0.2,  
            col = "gray", 
            size = 20) + 
  scale_color_manual(values = c('#06FF00', '#FF1700'))


  
 grafic + transition_states(X5, state_length = 0)




 
#Grafico de barras ----
 
grafic2 = df %>% ggplot(aes(x = factor(X3),
                            fill = factor(X3))) +
  geom_bar(show.legend = FALSE) +
  scale_fill_manual(values =c('#06FF00', '#FF1700')) +
  theme_bw() + 
  labs(caption = 'Elaborado por Baruch Fts',
       x = "0: sin enfermar, 1:enfermo",
       y = '') + 
   geom_text(aes(x = 0, 
                 y = 800, 
                 label = as.factor(X5)), 
             hjust= 1, 
             vjust = 0, 
             alpha = 0.2,  
             col = "gray", 
             size = 20)
   
  
grafic2 + transition_states(X5, state_length = 0)