Analyse de la sensibilité de la sortie d'un automate cellulaire


Analyse de la sensibilité d'un automate cellulaire

# Fonction qui calcule le nombre de cases occupées (=1) en fonction d'une variable X
# qui est un data.frame qui contient les probabilités de mourir à chaque pas de temps (p) et 
# le nombre de cases (/9) pour obtenir un décès d'étouffement.
# La variable t donne les temps pour lesquels on retourne la taille de la population
# Si t est une valeur, on retourne juste la valeur pour ce temps, si t est un vecteur, 
# on retourne toutes les valeurs pour les temps t

ac <- function(X, t=t) {

  Nfinal <- NULL

  for (grandtotal in 1:nrow(X)) {

    penc <- X[grandtotal, 1]
    v <- X[grandtotal, 2]*9
 
  m <- matrix(data = 0, ncol=12, nrow=12)
  for (i in 1:10) {
    col <- sample(1:10, 1)+1
    row <- sample(1:10, 1)+1
    m[row, col] <- 1
  }

  N <- NULL

  for (tps in 1:max(t)) {
    m1 <- m
 
    for (col in 2:11) {
      for (row in 2:11) {
        voisins <- sum(m[(row-1):(row+1), (col-1):(col+1)])-m[row, col]
        if (m[row, col] == 1) {
          if (runif(1)>1-penc) m1[row, col] <- 0
          if ((voisins == 0) | (voisins > v)) m1[row, col] <- 0
        }
        if (m[row, col] == 0) {
          if (voisins >= 2) m1[row, col] <- 1
        }
      }
    }
    m <- m1
    N <- c(N, sum(m))
  }

  Nfinal <- c(Nfinal, N[t])

  }

  return(Nfinal)
}

# Je retourne les valeurs de la taille de la population pour t=1 à 10 avec une probalité de mourir de 0.3
ac(X=data.frame(p=0.3, v=6/9), t=1:10)
# Je retourne les valeurs de la taille de la population pour t=1000 avec une probabilité de 
# mourir de 0.3 et un nombre de case occupées pour mourir d'étouffement de 6 ou plus
ac(X=data.frame(p=0.3, v=6/9), t=1000)
# Je retourne les valeurs de la taille de la population pour t=1000 avec 
# une probabilité de mourir de 0.4 et de 0.3 et un nombre de case occupées 
# pour mourir d'étouffement de 6 ou 7 (ou plus)
ac(X=data.frame(p=c(0.4, 0.3), v=c(6, 7)/9), t=1000)

# Si j'ai une probabilité de mourir de 0, le système est périodique
# mais est différent selon l'état initial
plot(x = 1:100, ac(X=data.frame(p=0, v=6/9), t=1:100), type="l", bty="n", las=1)
# J'introduis de la stochasticité; c'est plus amusant !
plot(x = 1:100, ac(X=data.frame(p=0.3, v=6/9), t=1:100), type="l", bty="n", las=1)


library("sensitivity")
# Je génère deux tableaux identiques avec des nombres aléatoires
# p est la probabilité de mourir
# v est le nombre de voisins /9 (pour rester dans l'intervalle 0-1) maximum sinon on meurt
X1 <- data.frame(p=runif(100, 0.1, 0.6), v=runif(100, 0.5, 0.9))
X2 <- data.frame(p=runif(100, 0.1, 0.6), v=runif(100, 0.5, 0.9))


xjansen100 <- soboljansen(model = ac, X1 = X1, X2 = X2,
                                           nboot = 1000, t=100)
# La conclusion est que les variables agissent surtout en synergie l'une de l'autre
# ce qui est normal car les deux jouent sur la mortalité.
# v a un impact plus important que p qui ne joue presque pas seul mais beaucoup avec v.
plot(xjansen100)



Commentaires

Posts les plus consultés de ce blog

Standard error from Hessian Matrix... what can be done when problem occurs

stepAIC from package MASS with AICc

Install treemix in ubuntu 20.04