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)
