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
- Distributions…
- What is the distribution of site ages?
- What is the distribution of planting strategies?
- What is the distribution of total trees planted at the sites?
- What is the distribution in species diversity at the sites?
- Planting Trends…
- What are the most and least commonly planted species?
- Have the same types of trees been planted consistently over time?
- Has the number of trees planted at sites changed over time?
- Variation and Comparisons…
- Do older plantings have more or less diversity than recent plantings?
- How do Standard plantings vary in structure compared to Tiny Forests?
- 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:
- Site_Name –> unique name for the physical site where trees were planted
- Project_Name –> planting project name in the FCF or TC database (work orders, sapling purchases)
- Planted_Date –> original date of planting
- Planting_Method –> Method in which trees were planted (Standard planting or Tiny Forest)
- Actual_Tree_Planted –> expected number of planted trees, as reported by TC / FCF
- 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 tidyverse “type_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:
- All column names are unique (each column is for a unique species)
- They all follow a consistent format (Genus_species)
- 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?
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?
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?
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?
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?
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.
2. Planting Trends…
i) What are the most and least commonly planted species?
Let’s start with a ranked list of all of the species at the sites.
Wow, that’s a lot of different species! It’s hard to get much out of this chart, but “Other” clears the rest as the most planted thing… This is likely because of the many non-tree understory plants that are planted at Tiny Forest sites.
Let’s exclude “Other” and look again at the top 10 most planted species.
So, the top ten most planted species includes 6 deciduous trees, 2 conifers and 2 shrubs. The most planted overall is Acer saccharinum (Silver maple), the most planted conifer is Larix laracina (Tamarack) and the most planted shrub is Viburnum lentago (Nannyberry). All very iconic Ottawa trees.
But what about the least planted species?
Interesting! The least planted species are mostly deciduous trees, as well as no conifers and two shrubs. There is a tie for 10th, as Liriodendron tulipfera (Tulip tree) and Castanea dentata (American chestnut) both have eleven occurrences, so 11 species are listed instead of a bottom 10. The least planted overall is Asimina triloba (Pawpaw) with only 2 trees in total across all of the sites.
Now, on average, what proportion of a site is shrubs vs trees vs conifers vs other?
It seems like on average, sites plant mostly deciduous trees, followed by shrubs, then conifers, then other plants. However, if we look at the individual data points, we can see there are a few sites that have a large proportion of conifers, as well as a few sites that only contain deciduous trees. “Other” also has a wide variation, with about half of the sites containing few to no other plants, and the other half having about 1/3 of its total planted count be other plants. This is likely showing the difference between Standard plantings and Tiny Forests.
ii) Have the same types of trees been planted consistently over time?
Next, I’m interested in knowing if the types of trees planted has remained consistent over time. For simplicity, let’s look again at our top 10 most planted species.
Most of these graphs seem to be all over the place from year to year, which makes it hard to extrapolate any real trends from these data. We can see that many of these trees are planted in burst years though- such as a large spike of Acer saccharinum (Silver maple) and Acer rubrum (Red maple) in ~2017. This could be a reflection of supply availability, or just years where more planting happened in general. It may have even been from a single site where a very large volume of maple trees were planted!
iii) Has the number of trees planted at sites changed over time?
It seems like there’s been a slight increase in the number of trees planted per site over time. This might be skewed by Tiny Forest plantings in recent years; the Tiny Forest method involves a lot of dense, high tree count plantings, and have only been planted in the last few years in this data set. Regardless, it would seem that the number of trees planted on average has not changed significantly over time. This is good to know, as it will make it easier to select a subset of sites for field work that come from a wide range of years while still having similar numbers of trees.
3. Variation and Comparisons…
i) Do older plantings have more or less diversity than recent plantings?
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.
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.
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.
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?
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?
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:
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