Data In The Wild
  1. Module 5
  2. 5.1: Population Growth
  • Home
  • Contact Us
  • For Instructors

  • Module 1
    • Overview
    • 1.1: Introduction to R and RStudio
    • 1.2: Intro to Coding in R
    • 1.3: Introduction to the tidyverse
    • Assignment 2
    • Assignment 3
  • Module 2
    • Overview
    • 2.1: Good Food Gone Bad
    • 2.2: Plotting with ggplot2
    • 2.3: Data Visualization
    • 2.4: Exploring geom Functions
    • 2.5: Module 2 Wrap-Up
    • Assignment 1
    • Assignment 2
    • Assignment 3
  • Module 3
    • Overview
    • 3.1: Leopard Seals
    • 3.2: T-Tests
    • 3.3: Comparing (Multiple) Means
    • Assignment 1
    • Assignment 2
  • Module 4
    • Overview
    • 4.1: Combining Datasets (Joins & Binds)
    • 4.2: K-Nearest Neighbor
    • 4.3: Roads and Regressions
    • 4.4: Multiple Regression
    • 4.5: Writing Functions
    • Assignment 1
    • Assignment 2
    • Assignment 3
    • Assignment 4
  • Module 5
    • Overview
    • 5.1: Population Growth
    • 5.2: Sustainable Fishing
    • 5.3: Comparing Populations
    • Assignment 1
    • Assignment 2
    • Assignment 3
  • Final Project

  • Resources

On this page

  • Introduction to Population Growth
    • Learning Outcomes
      • Exponential Growth
      • Logistic Growth
      • Visualizing Growth Models
  • What Population Factors Matter?
    • Fish Data
      • Largest Population
      • Exponential Growth Populations
      • Logistic Growth Populations
      • Finding the Carrying Capacity
      • A Review of What We Have Learned
    • References
  1. Module 5
  2. 5.1: Population Growth

5.1: Population Growth

Author

Jessie Golding, Desiree Andersen, Ellen Bledsoe

Introduction to Population Growth

Learning Outcomes

  • Students will be able to distinguish between exponential and logistic population growth models.
  • Students will be able to interpret the intrinsic rate of increase (r) and carrying capacity (K) and explain their ecological significance.
  • Students will be able to use filter() and ggplot2 to explore and visualize population data.
  • Students will be able to evaluate which fish population characteristics make a population a sustainable fishing target.

Let’s use descriptive statistics and data visualization to better understand population dynamics.

Exponential Growth

A population that shows exponential growth has a growth rate that depends on the average number of births (b) and deaths (d) per individual.

We call rates that are averages per individual in a population (rather than a total) per capita growth rates; per capita translates from Latin to “by head,” meaning for individuals.

Combined, birth and death rates can be described as the intrinsic rate of increase (r). We calculate r by subtracting the number of individuals that are removed from the population (deaths) from the number of individuals that are joining the population (births): \(r = b - d\).

We can calculate by how many individuals the population will change in a given time period (N) by multiplying the starting population size (Ni) by the intrinsic rate of increase (r) using this equation:

Logistic Growth

Populations that show logistic growth start out in the same way as populations with exponential growth, driven by per capita birth and death rates.

After a while, though, limited resources also start to come into play. When calculating the change in the size of the population (N), we also need to take into account the maximum number of individuals the population can sustainably support, called the carrying capacity, K.

We use the following equation to calculate the population size:

Visualizing Growth Models

As a reminder, this is what each type of population growth model looks like:

What Population Factors Matter?

We still need to figure out what fish population we will target for Antarctica.

Briefly, let’s consider what we think might be important for sustainability.

  1. Large population
  2. Stable population (i.e., not declining)

Fish Data

Let’s look at fish data from around our station in Antarctica over the past 20 years to get a better feel for how different population factors impact fish populations. These fish moved into the bay by our station when we established it, so we know the populations started at around the same time and had the same starting populations.

These aren’t necessarily our targets for fishing, particularly since it would be difficult and potentially disruptive to fish in the bay. Right now our goal is just to learn so we know what to look for when we are making our decision to conduct sustainable fishing.

Adapted from Figure 2 from Zhang et al. (2022)

As always, first we load the tidyverse and read in the data: “fish_pops.csv” as fish_pops.

# Write your code here

Answer:

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.1     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.3     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
fish_pops <- read_csv("data/fish_pops.csv")
Rows: 80 Columns: 6
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (2): growth_type, population
dbl (4): N, year, r, carrying_capacity

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Largest Population

Which population grows the biggest? Let’s start by calculating some summary statistics of the data.

max_pop <- fish_pops %>%
  group_by(population)%>%
  summarise(max_N = max(N))
max_pop
# A tibble: 4 × 2
  population max_N
  <chr>      <dbl>
1 A              5
2 B          25834
3 C             20
4 D            100

It looks like Population B grows the largest by far. Let’s learn more about Population B and filter out the data so we can look at it separately.

popB <- fish_pops %>%
  filter(population == "B")
popB
# A tibble: 20 × 6
       N  year growth_type     r carrying_capacity population
   <dbl> <dbl> <chr>       <dbl>             <dbl> <chr>     
 1     5     1 exponential  0.45                NA B         
 2     8     2 exponential  0.45                NA B         
 3    12     3 exponential  0.45                NA B         
 4    19     4 exponential  0.45                NA B         
 5    30     5 exponential  0.45                NA B         
 6    47     6 exponential  0.45                NA B         
 7    74     7 exponential  0.45                NA B         
 8   117     8 exponential  0.45                NA B         
 9   183     9 exponential  0.45                NA B         
10   287    10 exponential  0.45                NA B         
11   450    11 exponential  0.45                NA B         
12   706    12 exponential  0.45                NA B         
13  1107    13 exponential  0.45                NA B         
14  1736    14 exponential  0.45                NA B         
15  2723    15 exponential  0.45                NA B         
16  4270    16 exponential  0.45                NA B         
17  6697    17 exponential  0.45                NA B         
18 10503    18 exponential  0.45                NA B         
19 16472    19 exponential  0.45                NA B         
20 25834    20 exponential  0.45                NA B         

What type of growth is the population exhibiting?

Why is there no carrying capacity in this population data set? What does this mean about the resources Population B needs?

Answers: - Growth type: exponential - No carrying capacity because exponential models assume unlimited resources. Population B is not yet limited by available resources.

Exponential Growth Populations

It looks like populations exhibiting exponential growth might be good targets for our fishing operations because they can become very large. Let’s look at the data we have on exponential growth populations a little closer.

Let’s filter out the exponential growth models to examine them.

exp_pops <-fish_pops %>%
  filter(growth_type == "exponential")
exp_pops
# A tibble: 40 × 6
       N  year growth_type     r carrying_capacity population
   <dbl> <dbl> <chr>       <dbl>             <dbl> <chr>     
 1     5     1 exponential -0.45                NA A         
 2     3     2 exponential -0.45                NA A         
 3     2     3 exponential -0.45                NA A         
 4     1     4 exponential -0.45                NA A         
 5     1     5 exponential -0.45                NA A         
 6     1     6 exponential -0.45                NA A         
 7     0     7 exponential -0.45                NA A         
 8     0     8 exponential -0.45                NA A         
 9     0     9 exponential -0.45                NA A         
10     0    10 exponential -0.45                NA A         
# ℹ 30 more rows

It’s hard to see what’s happening with only the data frame. Let’s look at the exponential growth populations on the same plot:

ggplot(exp_pops, aes(x = year, y = N, color = population)) +
  geom_point() +
  geom_line()+
  labs(x = "Time", y = "Abundance", color = "Population") +
  theme_light()

It looks like Population B is very large, but Population A stays small. It’s hard to see what is happening on this plot because the scales are so different, so let’s look at what is happening with Population A by filtering out the data just for that population.

popA <-fish_pops %>%
  filter(population == "A")
popA
# A tibble: 20 × 6
       N  year growth_type     r carrying_capacity population
   <dbl> <dbl> <chr>       <dbl>             <dbl> <chr>     
 1     5     1 exponential -0.45                NA A         
 2     3     2 exponential -0.45                NA A         
 3     2     3 exponential -0.45                NA A         
 4     1     4 exponential -0.45                NA A         
 5     1     5 exponential -0.45                NA A         
 6     1     6 exponential -0.45                NA A         
 7     0     7 exponential -0.45                NA A         
 8     0     8 exponential -0.45                NA A         
 9     0     9 exponential -0.45                NA A         
10     0    10 exponential -0.45                NA A         
11     0    11 exponential -0.45                NA A         
12     0    12 exponential -0.45                NA A         
13     0    13 exponential -0.45                NA A         
14     0    14 exponential -0.45                NA A         
15     0    15 exponential -0.45                NA A         
16     0    16 exponential -0.45                NA A         
17     0    17 exponential -0.45                NA A         
18     0    18 exponential -0.45                NA A         
19     0    19 exponential -0.45                NA A         
20     0    20 exponential -0.45                NA A         

What do you notice about Population A that is different than Population B?

Answer: The intrinsic growth rate (r) for Population A is negative.

The intrinsic rate of increase (r) for Population A is negative. Let’s see what that means for Population A and plot it by itself:

ggplot(popA, aes(x = year, y = N)) +
  geom_point() +
  geom_line()+
  labs(x = "Time", y = "Abundance") +
  theme_light()

What has happened to this population?

Answer: Population A crashes and reaches zero. A negative r means more individuals are dying than being born, so the population declines until it goes extinct.

Even with “exponential growth”, the population has crashed (gone to 0), because r is negative. It took approximately 7 years for this to happen.

Between Population A and Population B, which is a better target population for fishing? Why?

Answer: Population B: r > 0 and it grows quickly, meaning it can recover from harvesting pressure. Population A is already declining and would collapse under any additional pressure.

Logistic Growth Populations

Okay, so we can’t rely only on the type of growth as a way to make our fishing decisions. But, we’re still curious about our populations that are limited by resources (i.e., exhibiting logistic growth).

log_pops <- fish_pops %>%
  filter(growth_type == "logistic")
log_pops
# A tibble: 40 × 6
       N  year growth_type     r carrying_capacity population
   <dbl> <dbl> <chr>       <dbl>             <dbl> <chr>     
 1     5     1 logistic     0.45                20 C         
 2     7     2 logistic     0.45                20 C         
 3     9     3 logistic     0.45                20 C         
 4    11     4 logistic     0.45                20 C         
 5    13     5 logistic     0.45                20 C         
 6    15     6 logistic     0.45                20 C         
 7    17     7 logistic     0.45                20 C         
 8    18     8 logistic     0.45                20 C         
 9    18     9 logistic     0.45                20 C         
10    19    10 logistic     0.45                20 C         
# ℹ 30 more rows

Notice in this case we have carrying capacity data. Let’s use some data visualizations to help us understand what that means.

Let’s look at the two logistic growth populations on the same plot:

ggplot(log_pops, aes(x = year, y = N, color = population))+
  geom_point() +
  geom_line()+
  labs(x = "Time", y = "Abundance", color = "Population")+
  theme_light()

Which population gets the largest?

Answer: Population D.

Finding the Carrying Capacity

When we have a logistic growth model, we often will want to find the carrying capacity of the population.

What values does each population level off at?

  • Population C:
  • Population D:

Answers: Pop C: 20 Pop D: 100 (carrying capacity (K) values in the data)

Which population do you think might be the best candidate to fish between these two?

Answer: Population D. It is more abundant and has a higher carrying capacity, meaning it can support more individuals and better withstand fishing.

A Review of What We Have Learned

The following factors are important to know about a population before fishing:

  1. Exponential growth can result in bigger populations than logistic growth

  2. Intrinsic rate of increase (r) should not be negative

  3. A higher carrying capacity means the population can take advantage of more resources to grow larger, which may indicate that the population is a better candidate for fishing

References

Golding, J.; Andersen, D.; Bledsoe, E. (2024). Data-Driven Decision-Making: Antarctic Fisheries. Teaching Ecology for All Undergraduate Audiences, QUBES Educational Resources. doi:10.25334/YECE-7M02

Zhang, M., Liu, S., Bo, J., Zheng, R., Hong, F., Gao, F., Miao, X., Li, H., & Fang, C. (2022). First evidence of microplastic contamination in Antarctic fish (Actinopterygii, Perciformes), Water, 14(19).

2026, University of Arizona & Lewis & Clark College

 
  • Made with Quarto