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

knitr::opts_chunk$set(echo = TRUE)
library(tidyr)
library(ggplot2)
library(deSolve)
library(ecoevoapps)
library(patchwork)
library(latex2exp)
theme_set(ecoevoapps::theme_apps())

离散型指数增长

$N_{t+1} = \lambda N_t$

sidebarLayout(
  sidebarPanel(
    # User defined lambda -------
    sliderInput("lambda", label = "种群增长率 (lambda):",
                min = 0.01, max = 2, value = 1.2, step = .01),
    # User defined N0 -------
    numericInput("N0", label = "种群起始规模 (N0)",
                min = 1, max = 100, value = 1),
    # User defined time ---------
    numericInput("time", label = "模拟时长",
                min = 1, max = 1000, value = 30)
    ),

  # Panel of plots -----
  mainPanel(
    renderPlot({plots_to_print()}, width = 450, height = 450)
  )
)

# Generate trajectories for sp 1 --------
exponential_pop_df <- reactive({
  run_discrete_exponential_model(N0 = input$N0, lambda = input$lambda, time = input$time)
})


# Make plot -----------
trajaectory_plot <- reactive({
  plot_discrete_population_growth(exponential_pop_df()) +
    ylab(latex2exp::TeX("Population size at time $t$ ($N_t$)")) +
    labs(caption = latex2exp::TeX(paste0("Parameter values: $\\lambda = $", input$lambda)),
         title = "Population growth with the discrete exponential model")
})

# Make a list of plots  ----
plots_to_print <- reactive({trajaectory_plot()})

离散型逻辑斯蒂增长 {.tabset}

标准离散型逻辑斯蒂增长模型

逻辑斯蒂映射是用来描述离散型逻辑斯蒂增长的种群的一种方式。它和连续型逻辑斯蒂增长的公式相似,只是基于离散时间:

$$N_{t+1} = r_dN_t\left(1-\frac{N_t}{K}\right)$$

Robert May发表于1976年的经典论文"Simple mathematical models with very complicated dynamics"是基于这个公式的一个著名研究。论文中May证明此类模型可以产生混沌现象。

sidebarLayout(
  sidebarPanel(
    # User defined lambda -------
    sliderInput("rd_dl", label = "种群增长率 (rd):",
                min = 0.01, max = 4.5, value = 1.05, step = .01),
    # User defined N0 -------
    numericInput("N0_dl", label = "起始种群规模 (N0)",
                min = 1, max = 100, value = 1),
    # User defined carrying capacity (K) ----------    
    numericInput("K_dl", label = "环境承载力 (K)",
                 min = 1, max = 1000, value = 100),
    # User defined time ---------
    numericInput("time_dl", label = "模拟时长",
                min = 1, max = 1000, value = 30)

    ),

  # Panel of plots -----
  mainPanel(
    renderPlot({plots_to_print_dl()}, width = 450, height = 800)
  )
)

# Get user defined parameters for discrete logistic  ------

params_dl <- reactive({c(rd = input$rd_dl, K = input$K_dl)})

dl_df <- reactive({
  run_discrete_logistic_model(N0 = input$N0_dl,
                                       params = params_dl(),
                                       time = input$time_dl)

})



# Generate trajectories for discrete logistic --------
trajaectory_plot_dl <- reactive({
  plot_discrete_population_growth(dl_df()) +
    labs(title = "Population growth with the discrete logistic model")
})

# cobweb for standard discrete logistic model -----
cobweb_dl <- reactive({
  plot_discrete_population_cobweb(dl_df(),
                                  params_vec = params_dl(),
                                  model_type = "discrete_logistic") +
    labs(title = "迭代图/蛛网图")
})

# Make plot caption ----
plot_caption_dl <- reactive({
    latex2exp::TeX(paste0("Parameter values: $r_d = $", input$rd_dl, "; K = ", input$K_dl))
})
# Make a list of plots  ----
plots_to_print_dl <- reactive({{trajaectory_plot_dl()/cobweb_dl()} + 
    labs(caption = plot_caption_dl())})

Ricker模型

Ricker模型是另一种描述有环境承载力的种群的方式。该模型最初发表于1954年, 用于描述渔业中亲体和补充量的关系。

$$N_{t+1} = N_t e^{(r (1 - N_t/K))}$$

sidebarLayout(
  sidebarPanel(
    # User defined lambda -------
    sliderInput("r_ricker", label = "种群增长率 (r):",
                min = 0.01, max = 3, value = 1.01, step = .01),
    # User defined N0 -------
    numericInput("N0_ricker", label = "起始种群规模 (N0)",
                min = 1, max = 100, value = 1),
    # User defined carrying capacity (K) ----------    
    numericInput("K_ricker", label = "环境承载力 (K)",
                 min = 1, max = 1000, value = 100),
    # User defined time ---------
    numericInput("time_ricker", label = "模拟时长",
                min = 1, max = 1000, value = 30, step = 5)

    ),

  # Panel of plots -----
  mainPanel(
    renderPlot({plots_to_print_ricker()}, width = 450, height = 800)
  )
)

# Get user defined parameters for discrete logistic  ------
params_ricker <- reactive({c(rd = input$r_ricker, K = input$K_ricker)})

ricker_df <- reactive({
  run_ricker_model(N0 = input$N0_ricker,
                                 params = params_ricker(),
                                 time = input$time_ricker)
})

# Generate trajectories for discrete logistic --------
trajaectory_plot_ricker <- reactive({
  plot_discrete_population_growth(ricker_df()) +
    labs(title = "Population growth with the Ricker model")
})

# cobweb plot for ricker model -----
cobweb_ricker <- reactive({
    plot_discrete_population_cobweb(ricker_df(),
                                  params_vec = params_ricker(),
                                  model_type = "ricker") +
    labs(title = "迭代图/蛛网图")
})

# Make plot caption ----
plot_caption_ricker <- reactive({
    latex2exp::TeX(paste0("Parameter values: $r = $", input$r_ricker, "; K = ", input$K_ricker))
})

# Make a list of plots  ----

plots_to_print_ricker <- reactive({{trajaectory_plot_ricker()/cobweb_ricker()} + 
    labs(caption = plot_caption_ricker())})

Beverton-Holt模型

Beverton-Holt模型是第三种用于描述离散时间下种群增长的经典模型。该模型同样最初被用于渔业管理。

$$N_{t+1} = \frac{RN_t}{1+\left(\frac{R-1}{K}\right)N_t}$$

sidebarLayout(
  sidebarPanel(
    # User defined lambda -------
    sliderInput("r_bh", label = "种群增长率 (R):",
                min = 0.01, max = 3, value = 1.25, step = .01),
    # User defined N0 -------
    numericInput("N0_bh", label = "种群起始规模 (N0)",
                min = 1, max = 100, value = 1),
    # User defined carrying capacity (K) ----------    
    numericInput("K_bh", label = "环境承载力 (K)",
                 min = 1, max = 1000, value = 100),
    # User defined time ---------
    numericInput("time_bh", label = "模拟时长",
                min = 1, max = 1000, value = 30, step = 5)

    ),

  # Panel of plots -----
  mainPanel(
    renderPlot({plots_to_print_bh()}, width = 450, height = 800)
  )
)

# Get user defined parameters for discrete logistic  ------
params_bh <- reactive({c(rd = input$r_bh, K = input$K_bh)})
bh_df <- reactive({
  run_beverton_holt_model(N0 = input$N0_bh, 
                          params = params_bh(),
                          time = input$time_bh)
})


# Generate trajectories for beverton-holt model --------
trajaectory_plot_bh <- reactive({
  plot_discrete_population_growth(bh_df()) +
    labs(title = "Population growth with the Beverton-Holt model")
})


# Generate cobweb for beverton-holt model --------
cobweb_bh <- reactive({
  plot_discrete_population_cobweb(bh_df(),
                                  params_vec = c(rd = input$r_bh, K = input$K_bh),
                                  model_type = "beverton_holt")  +
    labs(title = "迭代图/蛛网图")

})


# Make plot caption ----
plot_caption_bh <- reactive({
    latex2exp::TeX(paste0("Parameter values: $r = $", input$r_bh, "; K = ", input$K_bh))
})

# Make a list of plots  ----

plots_to_print_bh <- reactive({{trajaectory_plot_bh()/cobweb_bh()} + 
    labs(caption = plot_caption_bh())})

参考文献

"Simple mathematical models with very complicated dynamics", Robert May, 1976.

"Stock and Recruitment", Bill Ricker, 1954.

Course notes on the Ricker model from UGA course on population ecology

Dr. Sebastian Bonhoeffer's lecture notes on Ecology and Evolution (see Ch. 1)

Dr. Jan Engelstädter's e-book on analysis of biological data.


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


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