Skip to content

Instantly share code, notes, and snippets.

@marcionicolau
Created February 4, 2016 17:35
Show Gist options
  • Save marcionicolau/e8d017c5e90f06638faa to your computer and use it in GitHub Desktop.
Save marcionicolau/e8d017c5e90f06638faa to your computer and use it in GitHub Desktop.
Aedes Aegypti ABM
DATE SRAD TMAX TMIN RAIN
15305 20.629771 23.4 15.3 0
15306 5.823043 17.6 15 17.400000000000002
15307 10.213278999999998 23.4 15.7 1.7999999999999998
15308 7.467642000000001 20.9 17.1 5.4
15309 7.387924 17 13.45 3
15310 18.030457 19 12.25 0
15311 21.045128000000002 25.1 12.65 0
15312 22.245425999999995 24.700000000000003 15.25 5.4
15313 26.588191 29.4 15 0
15314 1.146897 23.2 18.799999999999997 46.2
15315 6.261204 22.55 18.049999999999997 0.8
15316 23.815058 30.25 17.4 0.2
15317 10.822688 25.549999999999997 17.3 30.000000000000004
15318 30.530918000000003 23.85 14.899999999999999 0
15319 30.877674 28.25 12.1 0.2
15320 12.028276000000002 27.15 17.85 6.800000000000001
15321 5.240876999999999 20.65 18.4 11.4
15322 14.971422999999998 25.1 17.2 0.2
15323 20.883273000000003 27.8 16.7 12.600000000000001
15324 17.976589 21 13.45 0.2
15325 32.301468 25.1 9.9 0.2
15326 27.307784 28.25 15.35 0
15327 19.287784 26.1 15.600000000000001 0
15328 25.011786 26.75 16.15 44.8
15329 23.819771000000003 27.4 17.1 0
15330 17.936180000000004 27.65 18.7 1.4
15331 6.595795 22.450000000000003 18.75 9.2
15332 5.867488000000001 20.549999999999997 18.200000000000003 10.2
15333 29.409123 24.25 15.45 0.2
15334 24.717307999999996 24.1 14.6 0
15335 12.825042 23.4 14.75 0.8
15336 1.7816589999999999 20.45 18 50.79999999999999
15337 24.461431 27.450000000000003 16 0
15338 10.945878999999998 23.5 17.7 22.4
15339 23.199831 27 17.15 0
15340 27.665117999999996 24.1 15.75 0
15341 32.942434999999996 25.700000000000003 12.350000000000001 0
15342 30.272779000000003 30.25 15.55 0
15343 5.597554000000001 24.85 17.950000000000003 51.6
15344 17.700208000000003 24.700000000000003 18.25 4.4
15345 29.935158 28.7 17.2 0
15346 24.337404999999997 28.45 20.55 0.2
15347 9.380098999999998 23.1 17 7.800000000000001
15348 0.854049 19.85 18 70
15349 17.536960999999998 24.8 18.35 9.2
15350 28.978695000000002 28.3 15.850000000000001 0
15351 25.37898 30.5 18.9 0
15352 12.432657 30.3 18.4 21.6
15353 9.152282 23.4 19.05 5
15354 19.928999 25.75 16.65 0
15355 8.451454 23.2 17.9 38.6
15356 23.718295000000005 29.75 18.8 7.4
15357 15.038620999999997 29.049999999999997 20.95 3.6
15358 5.149186999999999 23.35 20.6 9.8
15359 21.957880000000007 27 20.05 0.2
15360 26.759228999999998 29.2 19 0
15361 8.228648999999999 26.2 19.9 12.599999999999998
15362 22.903885000000002 28.35 19.6 0.4
15363 19.169083 27.75 19.9 1.2
15364 10.258309 25.549999999999997 20.799999999999997 44.199999999999996
15365 21.330189 28.4 21.05 0.6
16001 18.503366999999997 27.2 19.85 1
16002 17.141482999999997 26.5 19.85 0
16003 25.419499 26.049999999999997 18.4 0
16004 21.024919000000004 26.75 17.65 4
16005 12.380832999999999 24.65 19.049999999999997 4.8
16006 9.170843 25.3 20.15 8
16007 18.082305 27.75 21.15 0.2
16008 25.503529999999998 30.2 19.1 0
16009 19.981225000000006 29.85 20.5 31.6
16010 23.713348 24.9 20.2 0.2
16011 26.449035 28.95 20.049999999999997 0
16012 23.883274000000007 30.95 20.15 0
16013 26.588395999999996 30.299999999999997 21.45 0
16014 27.480096999999997 28.05 18.35 0
16015 29.286737999999996 30.05 19.35 0
16016 28.561139999999995 29.6 19 0
16017 29.557946 30.049999999999997 17.549999999999997 0
16018 30.165441 30.549999999999997 18.55 0
16019 29.969076000000005 30.9 17.1 0
16020 29.905825000000004 29.799999999999997 17.5 0
16021 27.517217999999996 29 17.65 0
16022 28.69168 29.55 17.75 0
16023 28.840638000000002 30.8 16.85 0
16024 29.661277999999996 32.3 18.95 0
16025 22.388451999999997 31.5 19.25 3
16026 -2.5104719999999996 23.5 18.450000000000003 43.2
16027 27.500794999999997 23.9 16.6 0
16028 25.180795999999994 27.4 17.299999999999997 0
16029 25.381767000000004 31.049999999999997 19.2 0
16030 17.13273 28.1 20 17
16031 4.400991000000001 22.3 19.700000000000003 86.60000000000002
16032 13.246908 23.85 18.2 0
16033 18.951787 24.200000000000003 17.45 0
16034 6.307362000000001 22.5 18.65 4.8
rm()
set.seed(1000)
setwd("~/Analysis/EmAnalise/Mauricio/Aedes")
# setwd("~/Documents/Aedes")
#dadosClima <- read.table("dados_clima_v2.txt", sep=",", head = T )
#dadosClima <- read.table("dados_clima_v3.txt", head = T )
dadosClima <- read.table("dados_climaPF2015_2016.csv", head = T, sep = "," )
dadosClima$Temp.Comp.Media <- (dadosClima$TMAX + dadosClima$TMIN) / 2
colnames(dadosClima) <- c('DATE','SRAD','TMAX','TMIN','Precipitacao', 'Temp.Comp.Media')
#===============================================
# (1) parametrosGlobais
#===============================================
# numero máximo de registros de clima do arquivo de dados
#dataFim <- 629 VEJAM MAIS ABAIXO
dataFim <- nrow(dadosClima)
timeStep <- 1 # d
steps <- 60
taxaMortalidadeOvo <- 0.15
taxaMortalidadeLarva <- 0.05
taxaMortalidadePupa <- 0.05
taxaMortalidadeAdulto <- 0.05
taxaCrescimentoOvo <- 1
taxaCrescimentoLarva <- 0.99
taxaCrescimentoPupa <- 0.6
taxaCrescimentoAdulto <- 0
#temperatura <- 27
#morte <- 0.02
#limite de idade para mudança de fase
idadeLimiteOvo <- 2
idadeLimiteLarva <- 4
idadeLimitePupa <- 6
idadeAdulto <- 8
idadeMorte <- 38
# quantidade de ovos por dia (newaedes)
ovosPorDia <- 10
# quantidade de ovos por dia (newaedes)
# quantidade de ovos para temperatura < 18 graus e > 34 (temperaturas extremas)
ovos_tempExt <- 10
# quantidade de ovos para temperatura > 18 graus e <= 21
ovos_temp18g <- 20
# quantidade de ovos para temperatura >= 22 graus e <= 25
ovos_temp22g <- 30
# quantidade de ovos para temperatura == 26
ovos_temp26g <- 40
# quantidade de ovos para temperatura > 26 e < 30
ovos_temp30g <- 50
# quantidade de ovos para temperatura > 30 graus e <= 34
ovos_temp34g <- 30
#
# template para cada individuo
## fase 1 = ovo 2 = larva 3 = pupa 4 = adulto
newaedes <- data.frame(idade = 0,
fase = 1,
procuraHumano = 0)
#===============================================
# (2) Trabalhadinha nos Dados do arquivo
#===============================================
library(plyr)
novosDadosClima <- dadosClima
#novosDadosClima <- ddply(dadosClima, .(Data), summarise, Precipitacao = sum(Precipitacao), Temp.Comp.Media = sum(Temp.Comp.Media))
#novosDadosClima$Data <- as.Date(novosDadosClima$Data, "%d/%m/%Y")
#novosDadosClima <- novosDadosClima[order(as.Date(novosDadosClima$Data, format="%d/%m/%Y")),]
#===============================================
# (3) Nova Soma Chuva
#===============================================
#retira 10% de agua do primeiro dia que passou, 20 do segundo, 30 do terceiro e assim por diante.. (10 dias)
somaChuva <- function(timestp){
fatorEvap <- seq(0,1,0.1)
i <- dataFim-steps
sumTotal <- sum( novosDadosClima$Precipitacao[((i+timestp)-10):((i+timestp))] * fatorEvap )
#sumTotal <- sum( dadosClima$Precipitacao[i:(i+(timestp))])
sumTotal
}
calcTemp <- function(timestp){
# considerando o num de steps estipulados ? verificado
# em que passo do arquivo de dados climáticos deve começar os cálculos
# obs: é realizado os steps x 2, pois no arquivo há 2 registros de dados por dia
dt_atual <- dataFim - steps + timestp
# a partir da data inicial de verificação é somado quantos dias já se passou
# nos timestemp
somaTM <- sum(novosDadosClima$Temp.Comp.Media[(dt_atual - (3)):dt_atual])
TMdia <- somaTM / 3
TMdia
}
#===============================================
# (3) m?todos do ciclo de vida dos individuos
#===============================================
#Soma Chuva
#somaChuva <- function(timestp){
# considerando o num de steps estipulados ? verificado
# em que passo do arquivo de dados climáticos deve começar os cálculos
# obs: ? realizado os steps x 2, pois no arquivo h? 2 registros de dados por dia
#i <- dataFim-(steps*2)
#dataFim <- dataFim+1
# a partir da data inicial de verifica??o ? somado quantos dias j? se passou
# nos timestemp
# A soma dos dias anteriores - 10%;
# se i esta no dia atual 549 entao soma a 10% da precipitacao do dia
#incrementa a porcentagem
# quando chegar no decimo dia a porcentagem volta ser 10%
#soma da chuva sera sempre incrementada
#sumTotal <- sumTotal - sumTotal*0.1
#sumTotal <- sum( dadosClima$Precipitacao[i:(i+(timestp*2))]*0.9 )
#sumTotal
#}
## funcao crescer envelhece em 1 o individuo e muda a fase conforme as idades limite
crescer <- function(inds, numdias){
ninds <- length(inds$idade)
inds$idade <- inds$idade + timeStep
newinds <- NULL
#VERIFICA FASE
print(paste(" Numero de Inds",ninds))
for (i in 1: ninds) {
# Evolu??o do Ovo
if (inds$fase[i] == 1) {
#Eclosao do ovo
if (inds$idade[i] >= idadeLimiteOvo && somaChuva(numdias) >= 30){
inds$fase[i] = inds$fase[i] + 1;
}
}
# Evolucao da Larva
if (inds$fase[i] == 2){
if (inds$idade[i] >= idadeLimiteLarva){
inds$fase[i] = inds$fase[i] + 1;
}
}
# Evolução da Pupa
if (inds$fase[i] == 3){
if (inds$idade[i] >= idadeLimitePupa){
inds$fase[i] = inds$fase[i] + 1;
}
}
# Adulto - Mosquito
if (inds$fase[i] == 4){
#ProcuraHumano vai verificar se o mosquito se alimentou, considerando
# que todos os dias há alimento disponível
#assim a cada 3 dias ele ir? colocar ovo
if (inds$procuraHumano[i] < 3){
inds$procuraHumano[i] = inds$procuraHumano[i] + 1
}
if (inds$procuraHumano[i] == 3){
tempMedia <- calcTemp(numdias)
#Analise da temperatura dos últimos dias, referente ao tempo da alimentação
if (tempMedia < 18 || tempMedia > 34){
for (j in 1:ovos_tempExt) {
## a lista de novos individuos recebe um novo aedes
newinds <- rbind(newinds,
newaedes)
}
}
if (tempMedia >= 18 && tempMedia <= 21){
for (j in 1:ovos_temp18g) {
## a lista de novos individuos recebe um novo aedes
newinds <- rbind(newinds,
newaedes)
}
}
if (tempMedia >= 22 && tempMedia <= 25){
for (j in 1:ovos_temp22g) {
## a lista de novos individuos recebe um novo aedes
newinds <- rbind(newinds,
newaedes)
}
}
if (tempMedia == 26){
for (j in 1:ovos_temp26g) {
## a lista de novos individuos recebe um novo aedes
newinds <- rbind(newinds,
newaedes)
}
}
if (tempMedia > 26 && tempMedia < 30){
for (j in 1:ovos_temp30g) {
## a lista de novos individuos recebe um novo aedes
newinds <- rbind(newinds,
newaedes)
}
}
if (tempMedia >= 30 && tempMedia <= 34){
for (j in 1:ovos_temp34g ) {
## a lista de novos individuos recebe um novo aedes
newinds <- rbind(newinds,
newaedes)
}
}
inds$procuraHumano[i] <- 0
}
}
}
rbind(inds, newinds)
}
##
## Os métodos de morrer mantem somente os individuos que passam nos teste
## Subset receber dois paramentros, o primeiro é a lista de elementos
## O segundo é o parametro para saber quais elementos serao mantidos
##
## os metodos morrer abaixo usam as taxas de mortalidade para saber quem ? mantido
## fase 1 = ovo 2 = larva 3 = pupa 4 = adulto
## o método abaixo recebe os individuos, a taxa de mortalidade e a fase que será aplicada a mortalidade
morrer <- function(inds,taxa,fase) {
# captura a taxa de mortalidade assim podemos alterar conforme precipitacao ou temperatura e não perder o valor original
taxaMortalidade <- taxa
# separa os individuos que não ser testados para morrer
indsOutros <- subset(inds, inds$fase != fase)
# separa os individuos que devem ser testados para morrer
indsTestados <- subset(inds, inds$fase == fase)
# aplica a taxa de mortalidade
if (fase == 1){
indsTemp <- subset(indsTestados, runif(indsTestados$fase) > taxaMortalidade)
} else {
indsTemp <- subset(indsTestados, runif(indsTestados$fase) > taxaMortalidade & indsTestados$idade <= idadeMorte)
}
# agrupa os que não morreram com os que não foram testados para morrer
rbind(indsOutros, indsTemp)
}
#===============================================
# (4) Inicializa 10 individuos
#===============================================
inds <- data.frame(idade = c(7, 14, 1, 11, 8,
27, 2, 20, 7, 20),
fase = c(1, 2, 3, 4,
3, 1, 2, 4,
2, 3),
procuraHumano = c(0, 0, 0, 3,
0, 0, 0, 1,
0, 0))
#===============================================
# (5) life loop
#===============================================
total.ovos <- NULL
total.larvas <- NULL
total.pupas <- NULL
total.adultos <- NULL
total.chuva <- NULL
for (k in 1:steps) {
print(paste("timestep",k))
# var K ? necessário na função crescer para que a função somaChuva
# verifique em que timestemp esta para acumular os dias que passaram
# Quanto de chuva acumulada o dia?
print(paste(" Chuva",somaChuva(k)))
#tche.. se nao entrar aqui.. acabou-se a vida.
if(dim(inds)[1] > 0){
inds <- crescer(inds, k)
## morrer ovos
inds <- morrer(inds,taxaMortalidadeOvo,1)
## morrer larva
inds <- morrer(inds,taxaMortalidadeLarva,2)
## morrer pupa
inds <- morrer(inds,taxaMortalidadePupa,3)
## morrer adulto
inds <- morrer(inds,taxaMortalidadeAdulto,4)
# guardando os totais da população
total.chuva <- c(total.chuva,somaChuva(k))
total.ovos <- c(total.ovos,length(subset(inds,inds$fase == 1)$fase))
total.larvas <- c(total.larvas,length(subset(inds,inds$fase == 2)$fase))
total.pupas <- c(total.pupas,length(subset(inds,inds$fase == 3)$fase))
total.adultos <- c(total.adultos,length(subset(inds,inds$fase == 4)$fase))
}
}
#===============================================
# (6) results and graphics
#===============================================
par(mfrow=c(1,1))
simulation <- data.frame(total.ovos,total.larvas,total.pupas,total.adultos,total.chuva)
# Trocado os steps pelo numero de rodadas até que morreram todos. Se sobreviverem ate o numero de steps.. BLZ!
#dt <- seq(1,steps,1)
dt <- seq(1, nrow(simulation) ,1)
colnames(simulation) <- c('Ovos','Larvas','Pupas','Adultos','Chuva')
cores <- c('pink','orange','green','red','blue')
matplot(dt, simulation, type = "l", xlab = "Tempo", ylab = "Quantidade",
main = "População", lwd = 1, lty = 1, bty = "l", col = cores)
legend("topleft", c("Ovos", "Larvas", "Pupas","Adultos","Chuva"), bty="n" , col = cores, fill=cores)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment