Exploring urban tree planting sites in the Ottawa-Gatineau region for use in bird research

Exploring urban tree planting sites in the Ottawa-Gatineau region for use in bird research

An exploratory data analysis in R

Author
Affiliation

Joshua Cadieux

Carleton University

Published

April 16, 2026

A map of the Ottawa-Gatineau region showing various marked urban tree planting project sites.

Figure 1. Map of urban tree planting sites in Ottawa and Gatineau.

Background

As urbanization continues to accelerate, global biodiversity is increasingly threatened through habitat loss and homogenization (Aronson et al., 2017). Accordingly, understanding how to maximize the benefits of urban greening initiatives is critical. Urban tree planting is widely regarded as a valuable tool for conservation, promoted as a nature-based solution to climate, biodiversity, and social challenges (Seddon et al., 2020). In urban areas, large-scale planting initiatives aim to enhance communities through greening streets, parks, and public spaces. However, few programs clearly define biodiversity objectives and the direct ecological outcomes of urban planting are rarely evaluated, limiting guidance for biodiversity-focused planning (Andres et al., 2023). Birds are effective indicators of urban biodiversity and ecosystem health – this is demonstrated through their strong response to vegetation structure and canopy cover (Gregory & Strien, 2010). Studies show that green spaces with diverse, structurally complex vegetation support richer bird communities than simplified landscapes (Aronson et al., 2017; Blinkova et al., 2017). Using a diverse set of tree planting sites across the Ottawa-Gatineau region, my research aims to investigate how birds respond to urban tree planting initiatives, specifically looking at how these responses change over time using a space-for-time substitution.

Objectives

Before engaging in this research, I have a number of questions about the urban tree planting sites that I would like to study. This exploratory data analysis will explore the tree planting sites from the Tree Canada (TC) and Foret Capitale Forest (FCF) planting projects that will be studied in my Masters research. This analysis will help me better understand my research area and aid in designing and revising my research questions and field work plans.

Main Questions

  1. Distributions
    1. What is the distribution of site ages?
    2. What is the distribution of planting strategies?
    3. What is the distribution of total trees planted at the sites?
    4. What is the distribution in species diversity at the sites?
  2. Planting Trends…
    1. What are the most and least commonly planted species?
    2. Have the same types of trees been planted consistently over time?
    3. Has the number of trees planted at sites changed over time?
  3. Variation and Comparisons…
    1. Do older plantings have more or less diversity than recent plantings?
    2. How do Standard plantings vary in structure compared to Tiny Forests?
    3. Do plantings with high planted tree counts have higher diversity?

About the data

These data were obtained from the shared work between PhD student Sarah Green and Masters student Joshua Cadieux, with data pulled from Tree Canada and FCF’s project databases. Tree Canada’s data was privately shared, but FCF’s tree planting data is available publicly online at https://foretcapitaleforest.ca/tree-planting/.

The data is combined into a single wide format csv containing a few initial columns of metadata, followed by several columns indicating counts of individual tree species at each site.

The first 6 columns give information about each site:

  1. Site_Name –> unique name for the physical site where trees were planted
  2. Project_Name –> planting project name in the FCF or TC database (work orders, sapling purchases)
  3. Planted_Date –> original date of planting
  4. Planting_Method –> Method in which trees were planted (Standard planting or Tiny Forest)
  5. Actual_Tree_Planted –> expected number of planted trees, as reported by TC / FCF
  6. Counted_Tree_Planted –> counted number of planted trees; a sum of the counts of each tree species column in the row

The following columns (82 of them!) denote the different tree species that have been planted, and the number of trees planted of that species at each site. The final row simply denotes “other” for any non-specified species or non-trees.

Packages

A few packages are required for this EDA:

library(tidyverse)
library(gridExtra)
library(gapminder)
library(rmarkdown)
Warning: package 'rmarkdown' was built under R version 4.5.3
library(janitor)
Warning: package 'janitor' was built under R version 4.5.3

Exploring the data

After importing the data, there is an immediate issue with the data frame that we must remedy before we can begin our EDA:

Table 1. The freshly imported dataframe used for this EDA. The column headers are incorrectly set, as the first two rows of the dataframe contain metadata.

The first TWO rows indicate column titles / information. The first row contains only the common names of each tree, while the second row is where the true column titles are, with species columns containing the scientific tree names. Before we can continue, we will need to re-shape the dataframe by setting the second row as the column names and deleting the first row. The janitor package makes this very easy with its “rows_to_names” function. We can then also ensure the columns are all the right types (those containing letters are character class, those containing numbers are numeric class, etc.) with the tidyversetype_convert” function.

# Fix the column titles by setting them to row 2, and delete row 1
treedata <- treedata %>% 
  row_to_names(row_number = 1)

# Fix the column classes by type converting, auto detects by column contents
treedata <- type_convert(treedata)

── Column specification ────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  Site_Name = col_character(),
  Project_Name = col_character(),
  Planted_Date = col_character(),
  Planting_Method = col_character()
)
ℹ Use `spec()` for the full column specifications.

Now we can view the full dataframe.

Table 2. The corrected full dataframe used for this EDA.

This dataframe is very wide, with 88 columns- most of which denote different tree species at the sites and the number of each planted at each site.

How many rows are included?

nrow(treedata) 
[1] 74

This means we have 74 sites to work with.

Data Hygiene

Now we will perform a series of reality checks to make sure the data is usable and tidy.

CHECK 1: Checking for NAs in the metadata columns.

First, we will verify that all of the metadata columns (1 to 6) do not contain any NAs. This is important because each site should have this information included. Any sites with it missing will need to be double checked or removed, as we need this information to do our analysis.

sum(is.na(treedata$Site_Name))
[1] 0
sum(is.na(treedata$Project_Name))
[1] 0
sum(is.na(treedata$Planted_Date))
[1] 0
sum(is.na(treedata$Planting_Method))
[1] 0
sum(is.na(treedata$Actual_Tree_Planted))
[1] 0
sum(is.na(treedata$Counted_Tree_Planted))
[1] 0

Good, there are no NAs in these columns. We can move on to the next check.

CHECK 2: Does the Actual_Tree_Planted always match the Counted_Tree_Planted?

Next, we should check and make sure that the numbers in the “Actual_Tree_Planted” column match the corresponding “Counted_Tree_Planted” column. If they don’t, that means there is a difference in what TC / FCF reported as having been planted and what was actually counted from the planting database.

all(treedata$Actual_Tree_Planted == treedata$Counted_Tree_Planted)
[1] FALSE

It seems that these columns do not always match. Let’s investigate this further. We can make a new table to check for any mismatches and show the difference between Actual and Counted in these cases.

Code
mismatches <- treedata %>%
  # remove rows where counts match 
  filter(Actual_Tree_Planted != Counted_Tree_Planted) %>% 
  # add new column to show difference between counts
  mutate(Difference = Counted_Tree_Planted - Actual_Tree_Planted) %>% 
  # move the column to be in line with other metadata columns
  relocate(Difference, .after = Counted_Tree_Planted) 

Table 3. Table showing all cases in the original dataframe where Counted_Tree_Planted does not match Actual_Tree_Planted.

This table has 29 rows, meaning there were 29 cases where the Actual and Counted tree planted counts do not match. It seems about half of the cases are just relatively small differences in the counts, while the other half is where Counted_Tree_Planted = 0. Was this because of errors with Counted_Tree_Planted, or missing data? Let’s make sure Counted_Tree_Planted always equals the sum of all columns in a row.

Code
mismatches <- mismatches %>%
  # new column to sum all counts from species columns across each row
  mutate(total_species_sum = rowSums(across(8:ncol(.)), na.rm = TRUE)) %>% 
  # another new column to check if it matches the count (T or F)
  mutate(check = total_species_sum == Counted_Tree_Planted) %>% 
  # move columns again
  relocate(total_species_sum, .after = Difference) %>%
  relocate(check, .after = total_species_sum)
all(mismatches$check == TRUE)
[1] TRUE

It seems the sum of all tree counts in one row DOES always equal the value in Counted_Tree_Planted. Thus, the problem does not lie with some mistake in Counted_Tree_Planted.

Let’s assume that Counted_Tree_Planted is the true number of trees at each site and keep this column. We can discard Actual_Tree_Planted as this seems to be just a rough initial estimate reported by TC / FCF.

As for rows where Counted_Tree_Planted = 0, let’s assume the planting data was not available for these sites and remove these rows.

Let’s create a new data frame to work with that follows the re-works above:

treedata_trimmed <- treedata %>%
  # remove rows where no trees were counted
  filter(!is.na(Counted_Tree_Planted),
         Counted_Tree_Planted > 0) %>%
  # drop the "Actual" column
  select(-Actual_Tree_Planted)

Now we can continue to the next checks.

CHECK 3: Is each row really a unique planting site?

Next, as the dataframe seems to have some repeating Site Names and Project Names, we should make sure that each row does in fact correspond to a unique tree planting site.

After removing the sites without any tree planting data, how many sites are left?

nrow(treedata_trimmed)
[1] 57

There are 57 different sites listed. How many of these have unique site names?

n_distinct(treedata_trimmed$Site_Name)
[1] 42

There are 42 unique site names. These correspond to the physical tree planting site’s unique name in the original database.

How many project names?

n_distinct(treedata_trimmed$Project_Name)
[1] 56

There are 56 distinct project names. These correspond to the project file / work order in the database that each site belongs to.

So to summarize, some planting sites are under one site name, but are planted from multiple projects; and some planting sites are from a single project but with multiple named sites. This is a bit confusing. For the sake of this analysis, let’s treat each Site_Name as a unique planted site. This means we have to collapse the sites that have the same Site_Name but are under multiple project names, combining their tree counts into one row.

Code
# Let's first make an object to store the species columns
species_cols <- names(treedata_trimmed)[6:ncol(treedata_trimmed)]
# then collapse the sites with multiple project names but one site name
treedata_trimmed <- treedata_trimmed %>%
  group_by(Site_Name) %>%
  summarise(
    # we will use the first planting method listed (will always be the same anyways)
    Planting_Method = first(Planting_Method), 
    # and the earliest listed planting date
    Planted_Date = min(Planted_Date), 
    # and combine the tree counts.
    Counted_Tree_Planted = sum(Counted_Tree_Planted, na.rm = TRUE),
    across(all_of(species_cols), sum, na.rm = TRUE),
    .groups = "drop"
  )

How many rows does that leave us with?

n_distinct(treedata_trimmed$Site_Name)
[1] 42

Corresponding to 42 unique tree planting sites in the dataframe.

CHECK 4: How is planting method stored? Is it consistent and usable?

Next, we should verify that Planting_Method is stored in a consistent and usable way.

unique(treedata_trimmed$Planting_Method)
[1] "Standard"    "Tiny Forest"

Only “Standard” and “Tiny Forest” methods are listed; perfect. No work to do here.

Standard planting is the more traditional way of planting urban forests. It can vary a lot from site to site, but generally involves simply planting young trees on a lightly prepared plot of land. The Tiny Forest method is a bit more complicated, and involves heavy soil preparation and the planting of various types of trees, shrubs and understory plants at several life stages, in order to mimic the natural growth cycle of a real forest.

If you are curious, you can learn more about the Tiny Forest planting method (aka the Miyawaki method) with FCF’s factsheet:

https://foretcapitaleforest.ca/wp-content/uploads/2025/03/What-Is-a-Tiny-Forest-Factsheet.pdf.

CHECK 5: How is Planted_Date stored? Is it consistent and usable?

Dates are often a source of issues in data sets. We should verify that the planted date is stored in a consistent and usable way, and that the dates listed make sense.

First, let’s check how the date was stored.

class(treedata_trimmed$Planted_Date)
[1] "character"

It seems date was stored as plain text. But how was it formatted?

unique(treedata_trimmed$Planted_Date)
 [1] "20/05/2022" "31/03/2013" "17/10/2023" "03/10/2017" "17/05/2017"
 [6] "01/06/2017" "27/05/2023" "25/09/2019" "03/10/2015" "04/10/2025"
[11] "09/09/2023" "31/03/2011" "16/09/2023" "31/03/2012" "10/02/2024"
[16] "03/10/2024" "24/09/2021" "30/04/2024" "13/09/2022" "30/06/2019"
[21] "25/05/2015" "31/03/2007" "24/09/2022" "31/10/2017" "30/04/2012"
[26] "21/05/2014" "11/04/2021" "17/09/2011" "01/10/2025" "15/10/2021"
[31] "06/09/2025" "23/10/2024" "30/06/2018" "07/10/2025" "10/08/2024"
[36] "08/05/2013" "20/06/2025" "25/10/2024" "31/03/2014" "30/11/2016"

Whoever coded this data did a good job, as it appears to always follow DD MM YYYY format, separated by slashes. However, we should still standardize this to an analysis-ready format with lubridate package (part of tidyverse).

Code
treedata_trimmed <- treedata_trimmed %>%
  mutate(
    # standardize to POSIXct time format (YYYY-MM-DD UTC)
    Planted_Date = parse_date_time(
      Planted_Date,
      orders = c("ymd", "mdy", "dmy")
    )
  )
class(treedata_trimmed$Planted_Date)
[1] "POSIXct" "POSIXt" 

Looks good, now let’s just double check that the date ranges make sense. None of the planted sites should be further back than the 2000s, and none should be from after 2025.

range(treedata_trimmed$Planted_Date)
[1] "2007-03-31 UTC" "2025-10-07 UTC"

Looks good! Onto our final check.

CHECK 6: Verify the species columns

Last, we should run a few small checks on the species columns. We want to make sure that:

  1. All column names are unique (each column is for a unique species)
  2. They all follow a consistent format (Genus_species)
  3. They all correspond to real tree or shrub species.

First let’s make sure each column refers to a unique species of tree or shrub. In other words, there should not be any duplicate columns.

any(duplicated(names(treedata_trimmed)))
[1] FALSE

No duplicates, good. Now let’s make sure all of the column titles follow a consistent format.

species_cols
 [1] "Juglans_nigra"             "Morus_rubra"              
 [3] "Liriodendron_tulipifera"   "Asimina_triloba"          
 [5] "Fraxinus_pennsylvanica"    "Abies_balsamea"           
 [7] "Alnus_rugosa"              "Acer_freemanii"           
 [9] "Acer_rubrum"               "Acer_saccharinum"         
[11] "Acer_saccharum"            "Amelanchier_arborea"      
[13] "Amelanchier_canadensis"    "Celtis_occidentalis"      
[15] "Populus_balsamifera"       "Populus_tremuloides"      
[17] "Populus_deltoides"         "Picea_glauca"             
[19] "Tsuga_canadensis"          "Thuja_occidentalis"       
[21] "Juniperus_virginiana"      "Fagus_grandifolia"        
[23] "Betula_alleghaniensis"     "Betula_papyrifera"        
[25] "Castanea_dentata"          "Crataegus_crus-galli"     
[27] "Carya_cordiformis"         "Carya_ovata"              
[29] "Pinus_resinosa"            "Pinus_strobus"            
[31] "Tilia_americana"           "Quercus_bicolor"          
[33] "Quercus_palustrus"         "Quercus_alba"             
[35] "Quercus_macrocarpa"        "Quercus_rubra"            
[37] "Ulmus_americana"           "Platanus_occidentalis"    
[39] "Gymnocladus_dioicus"       "Cornus_amomum"            
[41] "Cornus_sericea"            "Cornus_racemosa"          
[43] "Cornus_florida"            "Cornus_alternifolia"      
[45] "Aronia_melanocarpa"        "Larix_laricina"           
[47] "Gleditsia_triacanthos"     "Sambucus_canadensis"      
[49] "Sambucus_nigra"            "Viburnum_lentago"         
[51] "Ostrya_virginiana"         "Viburnum_recognitum"      
[53] "Rhus_typhina"              "Rhus_aromatica"           
[55] "Ilex_verticillata"         "Prunus_pensylvanica"      
[57] "Prunus_virginiana"         "Sorbus_americana"         
[59] "Viburnum_trilobum"         "Corylus_americana"        
[61] "Hamamelis_virginiana"      "Salix_alba"               
[63] "Salix_amygdaloides"        "Salix_bebbiana"           
[65] "Salix_discolor"            "Salix_exigua"             
[67] "Salix_nigra"               "Rubus_occidentalis"       
[69] "Rubus_odoratus"            "Cercis_canadensis"        
[71] "Ceanothus_americanus"      "Lindera_benzoin"          
[73] "Cephalanthus_occidentalis" "Physocarpus_opulifolius"  
[75] "Prunus_avium"              "Prunus_cerasus"           
[77] "Pear"                      "Peach"                    
[79] "Plum"                      "Apple"                    
[81] "Ginkgo_biloba"             "Other"                    

From viewing the data, it seems they are mostly all scientific names, and follow a “Genus_species” format.

Let’s make a new object to store and view the column titles with odd formatting:

invalid_names <- species_cols[!grepl("^[A-Z][a-z]+_[a-z]+$", species_cols)]
invalid_names
[1] "Crataegus_crus-galli" "Pear"                 "Peach"               
[4] "Plum"                 "Apple"                "Other"               

“Crataegus_crus-galli” “Pear” “Peach” “Plum” “Apple” “Other” are listed.

Crataegus crus-galli was listed as it has a dash in the species name. This is a real tree (it is commonly known as Cockspur hawthorn), so we can leave it as is.

The fruit trees (pear, peach, plum, and apple) are not given scientific names, but this is also fine to leave as is for our analysis’ sake.

Lastly, there is the “Other” column, denoting any unspecified plants or non-trees in the database, which we can also leave as is.

All of the remaining species listed do correspond to real tree species. There are packages that can do this automatically (RGBIF, taxize…) but I had a lot of trouble getting these to work. It was simpler to verify them manually, and run a quick double-check using AI.

With our checks all done, we can now move on to transforming the data for visualization and analysis.

Transforming the data

Let’s add some new variables to the dataframe for ease of analysis.

First, let’s add a column for the year each site was planted (extract only the year from Planted_Date), and a column for site age, in years (subtract the current year from the year the site was planted).

# Planted year (only the year, for easy graphs)
treedata_trimmed <- treedata_trimmed %>%
  # add the new column
  mutate(planting_year = year(Planted_Date)) %>% 
  # move the column to be with the other metadata columns
  relocate(planting_year, .after = Planted_Date) 

# Site age (in years)
treedata_trimmed <- treedata_trimmed %>%
  # add the new column 
  mutate(site_age = 2026 - planting_year) %>% 
   # move the column to be with the other metadata columns
  relocate(site_age, .after = planting_year)

Now, let’s add a column for a simple species diversity score at each site. We will calculate diversity as the number of different species found at a given site.

treedata_trimmed <- treedata_trimmed %>%
  mutate(
    # add the column for diversity 
    species_richness = rowSums(across(all_of(species_cols)) > 0, na.rm = TRUE)
  ) %>% 
  # move the column to be with the other metadata columns
  relocate(species_richness, .after = Counted_Tree_Planted)

Let’s quickly check the summary statistics for species diversity at the sites.

summary(treedata_trimmed$species_richness)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   2.00    9.00   13.00   14.93   19.00   34.00 

So the site with lowest diversity only has 2 species, the site with the highest diversity has 34 different species, and the mean diversity is ~15 species. Seems about right!

Next, we will make a lookup table for species type by functional group. Functional groups will simply include conifer trees, deciduous trees, shrubs, and other. This can help us do further analysis of tree diversity at the sites.

Code
# first let's extract genus and create a new object for it
species_df <- data.frame(
  species = species_cols
) %>%
  mutate(
    genus = str_extract(species, "^[^_]+")
  )
# create genera classifications from the list of species
# This was just done with some Google searching of the genera + AI help to sort
conifer_genera <- c(
  "Pinus", "Picea", "Abies", "Larix", "Thuja", "Tsuga", "Juniperus"
)
shrub_genera <- c(
  "Cornus", "Viburnum", "Rhus", "Sambucus", "Rubus", "Amelanchier",
  "Aronia", "Shepherdia", "Physocarpus", "Ribes"
)
other_genera <- c("Other")

# anything else in the dataframe is a deciduous tree

# create the table
functional_lookup <- species_df %>%
  mutate(
    functional_group = case_when(
      genus %in% conifer_genera ~ "conifer_tree",
      genus %in% shrub_genera ~ "shrub",
      genus %in% other_genera ~ "other",
      TRUE ~ "deciduous_tree"
    )
  )

Table 4. Lookup table for species, genus and functional group of trees and shrubs found at all of the sites.

Last, we will also create a pivoted version of the dataframe. Having a version of the data in long format will help with certain analyses coming up.

# pivot the data
treedata_long <- treedata_trimmed %>%
  pivot_longer(
    cols = all_of(species_cols),
    names_to = "species",
    values_to = "count"
  )
# join functional groups from the table we made
treedata_long <- treedata_long %>%
  left_join(functional_lookup, by = "species")

Now we are ready to analyze and visualize the data!

Analysis and Visualization

With the data tidied and transformed, we are ready to go through the main questions outlined at the beginning of this report.

1. Distributions…

i) What is the distribution of site ages?

Let’s start with a brief overview of the summary statistics for site ages.

summary(treedata_trimmed$site_age)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   2.250   6.000   7.024  11.000  19.000 

So, the newest site is only about 1 year old, while the oldest site is 19. The mean age of sites is 7 years.

But how is this distributed?

Figure 2. Distribution of Site Ages

Overall, it seems there is a skew towards newer sites! It may be that tree planting is gaining more popularity in Ottawa, or our sample may just be skewed by a large number of new sites for some other reason. For my field work, I may have to consider trimming out some of the newer sites to have a more even distribution of site ages.

ii) What is the distribution of planting strategies?

Figure 3. Distribution of Planting Strategies

There are much more Standard plantings than Tiny Forest plantings in this data set. This makes sense, as Tiny Forests were only planted by FCF and are a relatively new approach to tree planting in Ottawa. I should keep this in mind when doing further analyses.

iii) What is the distribution of total trees planted at the sites?

Figure 4. Distribution of Total Tree Counts at all sites

It seems that the majority of the sites have relatively small numbers of trees planted. There are particular greater amounts of sites with ~100 trees, ~300 trees, and ~600 trees, and there are only a few outliers with > 600 trees. When selecting sites for field work, I should keep this distribution in mind, particularly if I want to have a sample with mostly similarly sized sites.

iv) What is the distribution in species diversity at the sites?

Figure 5. Distribution of Species Diversity scores at all sites

Here we see a somewhat normal distribution, with a bit of a left skew. The majority of sites have around 10 species of tree, but a few sites have much higher species diversity scores. This could be the Tiny Forest sites, which typically have higher diversity due to the principles of Miyawaki method / Tiny Forest planting. We will investigate this further in part 3.

How about variation in diversity within functional groups? Is there a large variety of trees from each group, or do some groups have more diversity than others?

Figure 6. Distribution of Functional Group Diversity at all sites

Interestingly, it seems that diversity is the most varied within the deciduous trees. In other words, most sites plant only a few different types of conifers or shrubs, but sites have a wide range of diversity in decidious trees. Some have only a few different species of deciduous, while others have many different species of deciduous. Note that there is only one lumped group for “Other”, so we can’t really tell what the variation in diversity is within those non-trees. Tree Canada and FCF only plant native species, so this most likely just reflects which types of trees are native to the Ottawa-Gatineau region and are available from tree suppliers.

3. Variation and Comparisons…

i) Do older plantings have more or less diversity than recent plantings?

Figure 13. Relationship Between Site Age and Species Richness

It seems like newer sites have greater species diversity than older ones. Again, this could be skewed by Tiny Forests in recent years. Let’s remove Tiny Forests from the data and re-plot.

Figure 14. Relationship Between Site Age and Species Richness at Standard plantings only

Aha! It was skewed by Tiny Forests. This is good to know; species diversity at standard sites has NOT changed over time.

ii) How do Standard plantings vary in structure compared to Tiny Forests?

Our analysis for the last question showed that Tiny Forests are more diverse than Standard plantings. Let’s plot that difference in another way.

Figure 15. Species Diversity by Planting Method

Clearly, Tiny Forests on average have much higher species diversity than Standard plantings. This is reflective of the Miyawaki method, which demands high density, high diversity plantings. We should also check if this is partially because Tiny Forests simply have more trees compared to Standard plantings.

Figure 16. Total Tree Count by Planting Method

Well, look at that. Despite being much more diverse, on average, Tiny Forests do not actually have that many more trees in total than Standard plantings. This makes sense again- they have roughly the same amount of trees on average, just packed into a much smaller area, and with many more types of trees and plants included.

How about functional group composition- do Tiny Forests and Standard plantings share similar proportions of tree types?

Figure 17. Functional Composition of Tiny Forests vs Standard plantings

As expected, there is a lot more “other” in Tiny Forests compared to Standard plantings, due to the planting of understory plants in Tiny Forests. Interestingly, there also appear to be proportionally few conifers at Tiny Forests. If we look at the variance within each group, we can also see that the proportions of each functional group vary a lot more in Standard plantings, while these proportions are more consistent in Tiny Forests. This is likely because the Standard plantings were done by several different contractors in different contexts, while Tiny Forests were always done by FCF following a stricter set of planting guidelines.

iii) Do plantings with high planted tree counts have higher diversity?

Figure 18. Relationship Between Number of Trees and Diversity

It would appear that generally, plantings with more trees are also more diverse. Makes sense.

Since we found that on average, Tiny Forests typically have roughly the same number of trees as Standard plantings, this trend should hold up even if we remove Tiny Forests from the data set:

Figure 19. Relationship Between Number of Trees and Diversity, Standard plantings only

As expected, the trend holds. This will be important to note when selecting a subset of sites for field work. That concludes our analysis!

Conclusions

Overall, these analyses will help greatly when planning for my field work season. They offer many considerations for selecting a subset of sites to best address my specific research question; how birds repond to urban tree planting sites over time. One important conclusion I have drawn is that it may be best to drop the sites which were planted used the Tiny Forest method- this is because these sites represent a minority of the full dataset, yet have relatively stark differences in diversity and size compared to the rest of the sites, while also only being planted in recent years. Otherwise, the remaining sites should offer a fairly good sample of sites similar in diversity and size, while representing a wide range of site ages.

References

Andres, S. E., Standish, R. J., Lieurance, P. E., Mills, C. H., Harper, R. J., Butler, D. W., Adams, V. M., Lehmann, C., Tetu, S. G., Cuneo, P., Offord, C. A., & Gallagher, R. V. (2023). Defining biodiverse reforestation: Why it matters for climate change mitigation and biodiversity. PLANTS, PEOPLE, PLANET, 5(1), 27–38. https://doi.org/10.1002/ppp3.10329

Aronson, M. F., Lepczyk, C. A., Evans, K. L., Goddard, M. A., Lerman, S. B., MacIvor, J. S., Nilon, C. H., & Vargo, T. (2017). Biodiversity in the city: Key challenges for urban green space management. Frontiers in Ecology and the Environment, 15(4), 189–196. https://doi.org/10.1002/fee.1480

Blinkova, O., Shupova, T., & Raichul, L. (2023). α-Diversity of plant communities, forest birds and wood-decaying fungi in urban parks of a metropolis. Baltic Forestry, 29(1), id690–id690. https://doi.org/10.46490/BF690

Gregory, R. D., & Strien, A. van. (2010). Wild Bird Indicators: Using Composite Population Trends of Birds as Measures of Environmental Health. Ornithological Science, 9(1), 3–22. https://doi.org/10.2326/osj.9.3

Seddon, N., Chausson, A., Berry, P., Girardin, C. A. J., Smith, A., & Turner, B. (2020). Understanding the value and limits of nature-based solutions to climate change and other global challenges. Philosophical Transactions of the Royal Society B: Biological Sciences, 375(1794), 20190120. https://doi.org/10.1098/rstb.2019.0120

Previous
Previous

BIOL 5404 - Mammal Road Ecology

Next
Next

BIOL 5404 - Arabidopsis Gene Regulation