中文 | Español | English | português | Turkish

knitr::opts_chunk$set(echo = TRUE)

library(ecoevoapps)
library(kableExtra)
library(tidyr)
library(ggplot2)
ggplot2::theme_set(ecoevoapps::theme_apps())

Este aplicativo apresenta vários modelos que exploram a dinâmica entre predadores e presas. Há várias versões de modelos presa-predador (algumas estão apresentadas nas abas abaixo), mas todas elas têm uma estrutura parecida. A presa é modelada como uma população com crescimento exponencial ou logístico. Já o predador depende inteiramente da presa para crescer, ou seja, trata-se de um predador especializado naquela única presa. Portanto, quando a população da presa se extingue do sistema, a população do predador também cai para zero. Da mesma forma, conforme a população da presa aumenta, a população do predador também cresce. Quando a população do predador cresce, no entanto, a população da presa diminui e assim por diante, gerando uma dinâmica cíclica entre predadores e presas.

Historicamente, modelos de presa-predador também têm sido usados para modelar a dinâmica entre parasitas e hospedeiros. Por isso adotamos a sigla $H$ para presas e $P$ para predadores.

{.tabset}

Modelo de presa-predador de Lotka-Volterra

O modelo clássico de presa-predador de Lotka-Volterra ilustra a dinâmica entre uma espécie de presa que tem crescimento populacional exponencial e uma espécie de predador que consome a presa sem um ponto de saturação (resposta funcional do tipo I; veja abaixo).

[ \begin{align} \frac{dH}{dt} &= rH - aHP\ \ \frac{dP}{dt} &= eaHP - dP \end{align} ]

pars_vars <- c("$H$", 
               "$P$", 
               "$r$", 
               "$a$", 
               "$e$", 
               "$d$")
descriptions <- c("Tamanho populacional da presa",
                 "Tamanho populacional do predador",
                 "Taxa de crescimento populacional per capita da presa",
                 "Taxa de ataque do predador",
                 "Eficiência de conversão do predador",
                 "Taxa de mortalidade do predador")
param_df <- data.frame(pars_vars, descriptions)
kable(x = param_df, format = "html", 
      col.names = c("Parâmetro/variável", "Descrição")) %>%
  kable_styling(full_width = FALSE, 
                bootstrap_options = c("striped", "hover", "condensed"),
                position = "center")

Equações das isóclinas de crescimento líquido zero: [ \begin{align} P^ &= \frac{r}{a}\ \ H^ &= \frac{d}{ea} \end{align} ]

sidebarLayout(
  sidebarPanel(
    ### Ask users for parameter values ----
    ## r, a, T_h, e, d

    sliderInput("r_lv_pred1", label = "Taxa de crescimento populacional per capita da presa", 
                min = .0001, max = 1.0, value = .5),
    sliderInput("a_lv_pred1", label = "Taxa de ataque do predador", min = .001, 
                max = 1.0, value = .1),
    sliderInput("e_lv_pred1", label = "Eficiência de conversão do predador",
                min = .001, max = 1.0, value = 0.2),
    sliderInput("d_lv_pred1", label = "Taxa de mortalidade per capita do predador",
                min = .0001, max = 1.0, value = .3),

    ### Ask users for initial conditions -----
    #N1, N2

    numericInput("H_lv_pred1", label = "Tamanho populacional inicial da presa", 
                 min = 1, value = 10),
    numericInput("P_lv_pred1", label = "Tamanho populacional inicial do predador", 
                 min = 1, value = 10),

    ### Ask users for time to simulate ----
    numericInput("t_lv_pred1", label = "Tempo a ser projetado", min = 10, value = 100),

    checkboxGroupInput("vectors_lv_pred1", label = "Mostrar campo de vetores?", 
                       choices = c("Yes" = "Yes"), selected = "Yes")

  ),  


  mainPanel(renderPlot(plot_lvpred1()),
            renderPlot(np_lvpred1())
            )

)

# Set the initial population sizes
init_lv_pred1 <- reactive({c(H = input$H_lv_pred1, P = input$P_lv_pred1)})

# Set the parameter values
pars_lv_pred1 <- reactive({
  c(r = input$r_lv_pred1, a = input$a_lv_pred1, 
    e = input$e_lv_pred1, d = input$d_lv_pred1)
})

# Time over which to simulate model dynamics
time_lv_pred1 <- reactive({seq(0, input$t_lv_pred1, by = .1)})

# simulate model dynamics
out_lv_pred1 <- reactive({
  data.frame(run_predprey_model(
    time = time_lv_pred1(),
    init = init_lv_pred1(),
    params = pars_lv_pred1()
  ))
})

# Plots ------
## make abundance thru time plot
plot_lvpred1 <- reactive({
  plot_predprey_time(out_lv_pred1())
})

# plot trajectory of population
np_lvpred1 <- reactive({
  if("Yes" %in% input$vectors_lv_pred1) {
    plot_predprey_portrait(out_lv_pred1(), pars_lv_pred1(), 
                                         vectors_field = TRUE)
  } else {
    plot_predprey_portrait(out_lv_pred1(), pars_lv_pred1(), 
                             vectors_field = F)
  }

})

Modelo de presa com crescimento logístico

Este modelo adiciona um elemento a mais de realismo biológico ao modelo de Lotka-Volterra. Especificamente, no modelo clássico se assume que a presa tem crescimento populacional exponencial. Nesta aba, faremos com que o crescimento da presa seja logístico, ou seja, limitado pela capacidade de suporte $K$ da espécie.

[ \begin{align} \frac{dH}{dt} &= rH \biggl(1-\frac{H}{K}\biggr) - aHP \ \ \frac{dP}{dt} &= eaHP - dP \end{align} ]

pars_vars <- c("$H$", 
               "$P$", 
               "$r$", 
               "$K$", 
               "$a$", 
               "$e$", 
               "$d$")
descriptions <- c("Tamanho populacional da presa",
                 "Tamanho populacional do predador",
                 "Taxa de crescimento populacional per capita da presa",
                 "Capacidade de suporte da presa",
                 "Taxa de ataque do predador",
                 "Eficiência de conversão do predador",
                 "Taxa de mortalidade do predador")
param_df <- data.frame(pars_vars, descriptions)
kable(x = param_df, format = "html", 
      col.names = c("Parâmetro/variável", "Descrição")) %>%
  kable_styling(full_width = FALSE, 
                bootstrap_options = c("striped", "hover", "condensed"),
                position = "center")

Equações das isóclinas de crescimento líquido zero: [ \begin{align} P^ &= \frac{r}{a}\bigg(1 - \frac{H}{K}\bigg)\ \ H^ &= \frac{d}{ea} \ \end{align} ]

sidebarLayout(
  sidebarPanel(
    ### Ask users for parameter values ----
    ## r, a, e, d, K

    sliderInput("r_logprey", label = "Taxa de crescimento populacional per capita da presa",
                min = .0001, max = 1.0, value = .5),
    numericInput("K_logprey", label = "Capacidade de suporte da presa", 
                 min = 1, value = 100),
    sliderInput("a_logprey", label = "Taxa de ataque do predador",
                min = .001, max = 1.0, value = .1),
    sliderInput("e_logprey", label = "Eficiência de conversão do predador", 
                min = .001, max = 1.0, value = 0.5),
    sliderInput("d_logprey", label = "Taxa de mortalidade per capita do predador",
                min = .0001, max = 1.0, value = .3),



    ### Ask users for initial conditions -----
    numericInput("H_logprey", label = "Tamanho populacional inicial da presa",
                 min = 1, value = 10),
    numericInput("P_logprey", label = "Tamanho populacional inicial do predador", 
                 min = 1, value = 10),

    ### Ask users for time to simulate ----
    numericInput("t_logprey", label = "Tempo a ser projetado", min = 1, value = 100),

    checkboxGroupInput("vectors_logprey", label = "Mostrar campo de vetores?", 
                       choices = c("Yes" = "Yes"), selected = "Yes")

  ),  


  mainPanel(renderPlot(plot_logprey()), 
            renderPlot(np_logprey())
            )
)

# Set the initial population sizes
init_logprey <- reactive({
  c(H = input$H_logprey, P = input$P_logprey)
})

# Set the parameter values
pars_logprey <- reactive({
  c(r = input$r_logprey, K = input$K_logprey, 
    a = input$a_logprey, e = input$e_logprey, d = input$d_logprey)
  })

# Time over which to simulate model dynamics
time_logprey <- reactive({seq(0, input$t_logprey, by = .1)})

# Simulate the dynamics
out_logprey <- reactive({
    data.frame(run_predprey_model(
    time = time_logprey(),
    init = init_logprey(),
    params = pars_logprey()
  ))
})

# Plots ------

## make abundance thru time plot
plot_logprey <- reactive({
  plot_predprey_time(out_logprey())
})


np_logprey <- reactive({
  if("Yes" %in% input$vectors_logprey) {
    plot_predprey_portrait(out_logprey(), pars_logprey(), 
                                         vectors_field = TRUE)
  } else {
    plot_predprey_portrait(out_logprey(), pars_logprey(), 
                             vectors_field = FALSE)
  }
})

Modelo de predador com resposta funcional do tipo II

Este modelo ainda assume um crescimento populacional exponencial da presa, mas inclui um novo elemento de realismo biológico ao modelar o predador. Especificamente, no modelo clássico de Lotka-Volterra, cada predador processa suas presas instantaneamente e nunca se saciam, o que é obviamente irreal. No modelo abaixo, o predador tem uma resposta funcional do tipo II, ou seja, a eficiência de consumo do predador é limitada pelo tempo que o predador perde processando sua presa (tempo de manipulação).

[ \begin{align} \frac{dH}{dt} &= rH - \frac{aH}{1+aT_hH} P\ \ \frac{dP}{dt} &= eP \frac{aH}{1+aT_hH} - dP \end{align} ]

pars_vars <- c("$H$", 
               "$P$", 
               "$r$", 
               "$a$", 
               "$T_{h}$", 
               "$e$", 
               "$d$")
descriptions <- c("Tamanho populacional da presa",
                 "Tamanho populacional do predador",
                 "Taxa de crescimento populacional per capita da presa",
                 "Taxa de ataque do predador",
                 "Tempo de manipulação do predador",
                 "Eficiência de conversão do predador",
                 "Taxa de mortalidade do predador")
param_df <- data.frame(pars_vars, descriptions)
kable(x = param_df, format = "html", 
      col.names = c("Parâmetro/variável", "Descrição")) %>%
  kable_styling(full_width = FALSE, 
                bootstrap_options = c("striped", "hover", "condensed"),
                position = "center")

Equações das isóclinas de crescimento líquido zero: [ \begin{align} P^ &= \frac{r}{a} +rT_hH\ \ H^ &= \frac{d}{ea - adT_h} \ \end{align} ]

sidebarLayout(
  sidebarPanel(
    ### Ask users for parameter values ----
    ## r, a, T_h, e, d
    sliderInput("r_lv_pred2", label = "Taxa de crescimento populacional per capita da presa",
                min = .0001, max = 1.0, value = .5),
    sliderInput("a_lv_pred2", label = "Taxa de ataque do predador",
                min = .001, max = 1.0, value = .1),
    sliderInput("T_h_lv_pred2", label = "Tempo de manipulação do predador",
                min = 0.001, max = 1.0, value = 0.2),
    sliderInput("e_lv_pred2", label = "Eficiência de conversão do predador", 
                min = .001, max = 1.0, value = 0.7),
    sliderInput("d_lv_pred2", label = "Taxa de mortalidade per capita do predador",
                min = .0001, max = 1.0, value = .3),

    ### Ask users for initial conditions -----
    numericInput("H_lv_pred2", label = "Tamanho populacional inicial da presa",
                 min = 1, value = 10),
    numericInput("P_lv_pred2", label = "Tamanho populacional inicial do predador",
                 min = 1, value = 10),

    ### Ask users for time to simulate ----    
    numericInput("t_lv_pred2", label = "Tempo a ser projetado", min = 1, value = 100),

    checkboxGroupInput("vectors_lv_pred2", label = "Mostrar campo de vetores?", 
                       choices = c("Yes" = "Yes"), selected = "Yes")

  ),  


  mainPanel(renderPlot(plot_lvpred2()),
            renderPlot(np_lvpred2())
  )
)

# Set the initial population sizes
init_lv_pred2 <- reactive({
  c(H = input$H_lv_pred2 , P = input$P_lv_pred2)
})

# Set the parameter values
pars_lv_pred2 <- reactive({
  c(r = input$r_lv_pred2, a = input$a_lv_pred2, 
    T_h = input$T_h_lv_pred2 , e = input$e_lv_pred2, 
    d = input$d_lv_pred2 )})

# Time over which to simulate model dynamics
time_lv_pred2 <- reactive({seq(0,input$t_lv_pred2,by = .1)})

# Simulate the dynamics
out_lv_pred2 <- reactive({
  data.frame(run_predprey_model(
    time = time_lv_pred2(),
    init = init_lv_pred2(),
    params = pars_lv_pred2()
  ))
})


# Plots ------

## make abundance thru time plot
plot_lvpred2 <- reactive({
  plot_predprey_time(out_lv_pred2())
})

np_lvpred2 <- reactive({
  if("Yes" %in% input$vectors_lv_pred2) {
    plot_predprey_portrait(out_lv_pred2(), pars_lv_pred2(), 
                                         vectors_field = TRUE)
  } else {
    plot_predprey_portrait(out_lv_pred2(), pars_lv_pred2(), 
                             vectors_field = FALSE)
  }
})

Modelo de de predador-presa de Rosenzweig-MacArthur

Finalmente, este último e mais realista modelo incorpora tanto o crescimento logístico da presa como a resposta funcional do tipo II do predador.

[ \begin{align} \frac{dH}{dt} &= rH \biggl(1-\frac{H}{K}\biggr) - \frac{aHP}{1+aT_hH} \ \ \frac{dP}{dt} &= e \frac{aHP}{1+aT_hH} - dP \end{align} ]

pars_vars <- c("$H$", 
               "$P$", 
               "$r$", 
               "$K$", 
               "$a$", 
               "$T_{h}$", 
               "$e$", 
               "$d$")
descriptions <- c("Tamanho populacional da presa",
                 "Tamanho populacional do predador",
                 "Taxa de crescimento populacional per capita da presa",
                 "Capacidade de suporte da presa",
                 "Taxa de ataque do predador",
                 "Tempo de manipulação do predador",
                 "Eficiência de conversão do predador",
                 "Taxa de mortalidade do predador")
param_df <- data.frame(pars_vars, descriptions)
kable(x = param_df, format = "html", 
      col.names = c("Parâmetro/variável", "Descrição")) %>%
  kable_styling(full_width = FALSE, 
                bootstrap_options = c("striped", "hover", "condensed"),
                position = "center")

Equações das isóclinas de crescimento líquido zero: [ \begin{align} P^ &= \frac{r}{a}\bigg(1 - \frac{H}{K}\bigg)(1 + aT_hH)\ \ H^ &= \frac{d}{ea - adT_h} \ \end{align} ]

sidebarLayout(
  sidebarPanel(
    ### Ask users for parameter values ----
    ## r, a, T_h, e, d

    sliderInput("r_rm", label = "Taxa de crescimento populacional per capita da presa
", 
                min = .0001, max = 1.0, value = .2),
    numericInput("K_rm", label = "Capacidade de suporte da presa",
                 min = 1, value = 150),
    sliderInput("a_rm", label = "Taxa de ataque do predador",
                min = .001, max = 1.0, value = .02),
    sliderInput("T_h_rm", label = "Tempo de manipulação do predador",
                min = 0.001, max = 1.0, value = 0.3),
    sliderInput("e_rm", label = "Eficiência de conversão do predador", 
                min = .001, max = 1.0, value = 0.6),
    sliderInput("d_rm", label = "Taxa de mortalidade per capita do predador",
                min = .0001, max = 1.0, value = .4),



    ### Ask users for initial conditions -----
    #N1, N2
    numericInput("H_rm", label = "Tamanho populacional inicial da presa",
                 min = 1, value = 30),
    numericInput("P_rm", label = "Tamanho populacional inicial do predador", 
                 min = 1, value = 25),

    ### Ask users for time to simulate ----
    numericInput("t_rm", label = "Tempo a ser projetado", min = 1, value = 100),

    checkboxGroupInput("vectors_rm", label = "Mostrar campo de vetores?",
                       choices = c("Yes" = "Yes"), selected = "Yes")

  ),

  mainPanel(renderPlot(plot_rm()),
            renderPlot(np_rm())
            )

)

# Set the initial population sizes
init_rm <- reactive({c(H = input$H_rm , P = input$P_rm)})

# Set the parameter values
pars_rm <- reactive({
  c(r = input$r_rm, K = input$K_rm, 
    a = input$a_rm, T_h = input$T_h_rm, 
    e = input$e_rm, d = input$d_rm )})

# Time over which to simulate model dynamics
time_rm <- reactive({seq(0,input$t_rm,by = .1)})

out_rm <- reactive({
    data.frame(run_predprey_model(
    time = time_rm(),
    init = init_rm(),
    params = pars_rm()
  ))
  })

# Plots ------
## make abundance thru time plot
plot_rm <- reactive({
    plot_predprey_time(out_rm())
})

np_rm <- reactive({
  if("Yes" %in% input$vectors_rm) {
    plot_predprey_portrait(out_rm(), pars_rm(), 
                                         vectors_field = TRUE)
  } else {
    plot_predprey_portrait(out_rm(), pars_rm(), 
                             vectors_field = FALSE)
  }
})

Resposta funcional do predador {.tabset}

A resposta funcional do predador captura a relação entre a taxa de consumo do predador como uma função da densidade da presa. Em outras palavras, essa é a taxa com que predadores conseguem adquirir a energia contida em suas presas.

type1_fr <- function (H_init, H_final, a){
  to_return <- c(a*(H_init:H_final))
  return(to_return)
}

type2_fr <- function (H_init, H_final, a, Th){
  to_return <- c((a*(H_init:H_final)/(1+a*Th*(H_init:H_final))))
  return(to_return)
}

Tipo I

A taxa de consumo do predador aumenta linearmente com a densidade da presa, como na equação abaixo:

$$f(H) = aH$$

pars_vars <- c("$H$", 
               "$a$")
descriptions <- c("Tamanho populacional da presa",
                 "Taxa de ataque do predador")
param_df <- data.frame(pars_vars, descriptions)
kable(x = param_df, format = "html", 
      col.names = c("Parâmetro/variável", "Descrição")) %>%
  kable_styling(full_width = FALSE, 
                bootstrap_options = c("striped", "hover", "condensed"),
                position = "center")
sidebarLayout(
  sidebarPanel(
    ### Ask users for parameter values ----
    # a
    sliderInput("a_fr_type1", label = "Taxa de ataque do predador", min = .001, 
                max = 1.0, value = .02),

    ### Ask users for initial and final conditions -----
    #H_init, H_final

    numericInput("H_init_fr_type1", label = "Tamanho populacional da presa (minima)", 
                 min = 1, value = 30),
    numericInput("H_final_fr_type1", label = "Tamanho populacional da presa (maxima)", 
                 min = 1, value = 100), #Add warning: H_final>H_init 

  ),  

 mainPanel(renderPlot(plot_fr_type1())),

)


# Generate function output and data frame

out_fr_type1 <- reactive({type1_fr(H_init = input$H_init_fr_type1, 
                                   H_final = input$H_final_fr_type1,
                                   a = input$a_fr_type1)})

type1_fr_df <- reactive({data.frame(H = input$H_init_fr_type1:input$H_final_fr_type1,
                                    f_rate = out_fr_type1())})

#Plot

plot_fr_type1 <- reactive ({ggplot(type1_fr_df()) +
                            geom_line(aes(x = H, y=f_rate), size = 2) +
                            scale_color_brewer(palette = "Set1") +
                            xlab("Number of Prey") + 
                            ylab("Foraging Rate") +
                            ylim(0,50)})

Tipo II

A taxa de consumo aumenta com a densidade da presa, mas há um limite (saturação):

$$g(H) = \frac {aH}{1+aT_hH}$$

pars_vars <- c("$H$", 
               "$a$", 
               "$T_h$")
descriptions <- c("Tamanho populacional da presa",
                 "Taxa de ataque do predador",
                 "Tempo de manipulação do predador")
param_df <- data.frame(pars_vars, descriptions)
kable(x = param_df, format = "html", 
      col.names = c("Parâmetro/variável", "Descrição")) %>%
  kable_styling(full_width = FALSE, 
                bootstrap_options = c("striped", "hover", "condensed"),
                position = "center")
sidebarLayout(
  sidebarPanel(
    ### Ask users for parameter values ----
    # a, Th

    sliderInput("a_fr_type2", label = "Predator attack rate", min = .001, 
                max = 1.0, value = .02),
    sliderInput("T_h_fr_type2", label = "Predator handling time", min = 0.001, 
                max = 1.0, value = 0.3),

    ### Ask users for initial and final conditions -----
    #H_init, H_final

    numericInput("H_init_fr_type2", label = "Initial population size of Prey", 
                 min = 1, value = 30),
    numericInput("H_final_fr_type2", label = "Final population size of Prey", 
                 min = 1, value = 100), #Add warning: H_final>H_init 

  ),  

 mainPanel(renderPlot(plot_fr_type2())),

)


# Generate function output and data frame

out_fr_type2 <- reactive({type2_fr(H_init = input$H_init_fr_type2, 
                                   H_final = input$H_final_fr_type2,
                                   a = input$a_fr_type2,
                                   Th = input$T_h_fr_type2)})

type2_fr_df <- reactive({data.frame(H = input$H_init_fr_type2:input$H_final_fr_type2,
                                    f_rate = out_fr_type2())})

#Plot

plot_fr_type2 <- reactive ({ggplot(type2_fr_df()) +
                            geom_line(aes(x = H, y=f_rate), size = 2) +
                            scale_color_brewer(palette = "Set1") +
                            xlab("Number of Prey") + 
                            ylab("Foraging Rate") +
                            ylim(0,4)})

References

Additional references for Host-Parasite/Parasitoid dynamics:
- Overivew of the Nicholson-Bailey model (Links to Wikipedia page)
- Modelling the biological control of insect pests: a review of host-parasitoid models, 1996, by N.J. Mills and W.M. Getz


suppressWarnings(ecoevoapps::print_app_footer(language = "pt"))


gauravsk/ecoevoapps documentation built on July 9, 2024, 9:37 p.m.