中文 | 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.
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) } })
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) } })
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) } })
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) } })
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) }
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)})
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)})
Some characteristics of simple types of predation and parasitism, 1959, by C.S. Holling.
Impact of Food and Predation on the Snowshoe Hare Cycle, 1995, by C.J. Krebs et al.
Dynamics of Predation, 2010, by A.N.P. Stevens
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"))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.