中文 | 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())
Esta aplicación presenta varios modelos que exploran las dinámicas entre depredadores y presas. Hay diferentes versiones de modelos depredador-presa presentados abajo, sin embargo, todos comparten una estructura similar. La población de la presa está considerada como una sola población en la que, en ausencia del depredador, crece exponencialmente o de manera logística. El depredador depende solo en esa presa para obtener energía (es un depredador especialista), y si no hay presas disponibles en el sistema, la población del depredador disminuye a zero. Mientras más abundante es la presa, más puede crecer la población del depredador. Pero mientras más crece la población del depredador, más disminuye la población de la presa. Esto resulta en las dinámicas cíclicas que observamos en varios modelos de depredador-presa.
De manera histórica, versiones de modelos de depredador-presa también han sido utilizadas para estudiar las dinámicas entre parásitos y sus huéspedes. Por ello, seguimos su convención modelando la "presa" utilizando la variable $H$ y el "depredador" utilizando la variable $P$.
El modelo clásico Lotka-Volterra captura las dinámicas entra una presa que sigue crecimiento exponencial y un depredador que consume la presa sin llegar a un punto de saturación ("Respuesta funcional tipo I", ver abajo):
[ \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("Tamaño de la población de la Presa", "Tamaño de la población del Depredador", "Tasa de crecimiento per cápita de la Presa", "Tasa de ataque del Depredador", "Eficiencia de conversión del Depredador", "Tasa de mortalidad del Depredador") param_df <- data.frame(pars_vars, descriptions) kable(x = param_df, format = "html", col.names = c("Parámetro/Variable", "Descripción")) %>% kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"), position = "center")
Ecuaciones para las isoclinas de crecimiento cero: [ \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 = "Tasa de crecimiento per cápita de la Presa", min = .0001, max = 1.0, value = .5), sliderInput("a_lv_pred1", label = "Tasa de ataque del Depredador", min = .001, max = 1.0, value = .1), sliderInput("e_lv_pred1", label = "Eficiencia de conversión del Depredador", min = .001, max = 1.0, value = 0.2), sliderInput("d_lv_pred1", label = "Tasa de mortalidad per cápita del Depredador", min = .0001, max = 1.0, value = .3), ### Ask users for initial conditions ----- #N1, N2 numericInput("H_lv_pred1", label = "Tamaño inicial de la población de la Presa", min = 1, value = 10), numericInput("P_lv_pred1", label = "Tamaño inicial de la población del Depredador", min = 1, value = 10), ### Ask users for time to simulate ---- numericInput("t_lv_pred1", label = "Periodo", min = 10, value = 100), checkboxGroupInput("vectors_lv_pred1", label = "¿Mostrar campo vectorial?", choices = c("Sí" = "Yes"), selected = "Sí") ), 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 agrega una capa de realismo biológico al modelo Lotka-Volterra. Específicamente, en el modelo clásico, la presa es modelada con crecimiento exponencial. En este modelo, la presa experiencia crecimiento logístico hasta alcanzar la capacidad de carga $K$.
[ \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("Tamaño de la población de la Presa", "Tamaño de la población del Depredador", "Tasa de crecimiento per cápita de la Presa", "Capacidad de carga de la Presa", "Tasa de ataque del Depredador", "Eficiencia de conversión del Depredador", "Tasa de mortalidad del Depredador") param_df <- data.frame(pars_vars, descriptions) kable(x = param_df, format = "html", col.names = c("Parámetro/Variable", "Descripción")) %>% kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"), position = "center")
Ecuaciones para las isoclinas de crecimiento cero: [ \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 = "Tasa de crecimiento per cápita de la Presa", min = .0001, max = 1.0, value = .5), numericInput("K_logprey", label = "Capacidad de carga de la Presa", min = 1, value = 100), sliderInput("a_logprey", label = "Tasa de ataque del Depredador", min = .001, max = 1.0, value = .1), sliderInput("e_logprey", label = "Eficiencia de conversión del Depredador", min = .001, max = 1.0, value = 0.5), sliderInput("d_logprey", label = "Tasa de mortalidad per cápita del Depredador", min = .0001, max = 1.0, value = .3), ### Ask users for initial conditions ----- numericInput("H_logprey", label = "Tamaño inicial de la población de la Presa", min = 1, value = 10), numericInput("P_logprey", label = "Tamaño inicial de la población del Depredador", min = 1, value = 10), ### Ask users for time to simulate ---- numericInput("t_logprey", label = "Periodo", min = 1, value = 100), checkboxGroupInput("vectors_logprey", label = "¿Mostrar campo vectorial?", choices = c("Sí" = "Yes"), selected = "Sí") ), 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 regresa a una presa con crecimiento exponencial, pero agrega una capa de realismo al depredador. Específicamente, en el modelo clásico Lotka-Volterra, los depredadores no consumen tiempo procesando la presa, y no se sacian. En este modelo, el depredador tiene una respuesta funcional tipo II, lo que quiere decir que la eficiencia del depredador en comer la presa es limitada por el tiempo que tiene para invertir en procesar la presa.
[ \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("Tamaño de la población de la Presa", "Tamaño de la población del Depredador", "Tasa de crecimiento per cápita de la Presa", "Tasa de ataque del Depredador", "Tiempo de manipulación del Depredador", "Eficiencia de conversión del Depredador", "Tasa de mortalidad del Depredador") param_df <- data.frame(pars_vars, descriptions) kable(x = param_df, format = "html", col.names = c("Parámetro/Variable", "Descripción")) %>% kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"), position = "center")
Ecuaciones para las isoclinas de crecimiento cero: [ \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 = "Tasa de crecimiento per cápita de la Presa", min = .0001, max = 1.0, value = .5), sliderInput("a_lv_pred2", label = "Tasa de ataque del Depredador", min = .001, max = 1.0, value = .1), sliderInput("T_h_lv_pred2", label = "Tiempo de manipulación del Depredador", min = 0.001, max = 1.0, value = 0.2), sliderInput("e_lv_pred2", label = "Eficiencia de conversión del Depredador", min = .001, max = 1.0, value = 0.7), sliderInput("d_lv_pred2", label = "Tasa de mortalidad per cápita del Depredador", min = .0001, max = 1.0, value = .3), ### Ask users for initial conditions ----- numericInput("H_lv_pred2", label = "Tamaño inicial de la población de la Presa", min = 1, value = 10), numericInput("P_lv_pred2", label = "Tamaño inicial de la población del Depredador", min = 1, value = 10), ### Ask users for time to simulate ---- numericInput("t_lv_pred2", label = "Periodo", min = 1, value = 100), checkboxGroupInput("vectors_lv_pred2", label = "¿Mostrar campo vectorial?", choices = c("Sí" = "Yes"), selected = "Sí") ), 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, el modelo Rosenzweig-MacArthur combina el crecimiento logístico para la presa así como la respuesta funcional tipo II para el depredador.
[ \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("Tamaño de la población de la Presa", "Tamaño de la población del Depredador", "Tasa de crecimiento per cápita de la Presa", "Capacidad de carga de la Presa", "Tasa de ataque del Depredador", "Tiempo de manipulación del Depredador", "Eficiencia de conversión del Depredador", "Tasa de mortalidad del Depredador") param_df <- data.frame(pars_vars, descriptions) kable(x = param_df, format = "html", col.names = c("Parámetro/Variable", "Descripción")) %>% kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"), position = "center")
Ecuaciones para las isoclinas de crecimiento cero: [ \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 = "Tasa de crecimiento per cápita de la Presa", min = .0001, max = 1.0, value = .2), numericInput("K_rm", label = "Capacidad de carga de la Presa", min = 1, value = 150), sliderInput("a_rm", label = "Tasa de ataque del Depredador", min = .001, max = 1.0, value = .02), sliderInput("T_h_rm", label = "Tiempo de mnanipulación del Depredador", min = 0.001, max = 1.0, value = 0.3), sliderInput("e_rm", label = "Eficiencia de conversión del Depredador", min = .001, max = 1.0, value = 0.6), sliderInput("d_rm", label = "Tasa de mortalidad per cápita del Depredador", min = .0001, max = 1.0, value = .4), ### Ask users for initial conditions ----- #N1, N2 numericInput("H_rm", label = "Tamaño inicial de la población de la Presa", min = 1, value = 30), numericInput("P_rm", label = "Tamaño inicial de la población del Depredador", min = 1, value = 25), ### Ask users for time to simulate ---- numericInput("t_rm", label = "Periodo", min = 1, value = 100), checkboxGroupInput("vectors_rm", label = "¿Mostrar campo vectorial?", choices = c("Sí" = "Yes"), selected = "Sí") ), 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) } })
La respuesta funcional del consumidor captura la relación entre la tasa de consumo del consumidor en función a la densidad del recurso. En otras palabras, esta es la tasa a las que los consumidores pueden obtener energía de la presa, en función a la densidad de la presa.
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) }
Incremento lineal en la tasa de consumo a medida que aumenta de la densidad del recurso, como se muestra en la ecuación:
$$f(H) = aH$$
pars_vars <- c("$H$", "$a$") descriptions <- c("Tamaño de la población de la Presa", "Tasa de ataque del Depredador") param_df <- data.frame(pars_vars, descriptions) kable(x = param_df, format = "html", col.names = c("Parámetro/Variable", "Descripción")) %>% 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 = "Tasa de ataque del Depredador", min = .001, max = 1.0, value = .02), ### Ask users for initial and final conditions ----- #H_init, H_final numericInput("H_init_fr_type1", label = "Tamaño inicial de la población de la Presa", min = 1, value = 30), numericInput("H_final_fr_type1", label = "Tamaño final de la población de la Presa", 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("Cantidad de Presa") + ylab("Tasa de Alimentación") + ylim(0,50)})
Tasa de consumo que desacelera, donde la cima representa saciación del consumidor:
$$g(H) = \frac {aH}{1+aT_hH}$$
pars_vars <- c("$H$", "$a$", "$T_h$") descriptions <- c("Tamaño de la población de la Presa", "Tasa de ataque del Depredador", "Tiempo de manipulación del Depredador") param_df <- data.frame(pars_vars, descriptions) kable(x = param_df, format = "html", col.names = c("Parámetro/Variable", "Descripción")) %>% 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 = "Tasa de ataque del Depredador", min = .001, max = 1.0, value = .02), sliderInput("T_h_fr_type2", label = "Tiempo de manipulación del Depredador", 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 = "Tamaño inicial de la población de la Presa", min = 1, value = 30), numericInput("H_final_fr_type2", label = "Tamaño final de la población de la Presa", 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("Cantidad de Presa") + ylab("Tasa de Alimentación") + 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
Referencias adicionales para las dinámicas de Huésped-Parásito/Parasitoide:
- 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 = "es"))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.