knitr::opts_chunk$set(echo = FALSE , results = 'asis' , warning = FALSE , message = FALSE)
The Michigan Department of Environment, Great Lakes, and Energy (EGLE) has developed this web application to efficiently calculate P51 scores based off of benthic macroinvertebrate samples collected from wadeable streams throughout Michigan.
Want to try running the calculator but don't have input files? Download the EGLE Test Files.
Procedure 51 improves the diagnostic ability of EGLE scientists to identify degradation in water quality. The procedure is intended to be applied to samples that meet the following criteria:
Expand for more details
Geographic area: Wadeable streams in Michigan.
Collection gear and method: Triangular dip net with 1mm mesh or hand pick.
Collection habitat: All available habitats (both high and low-velocity areas) with consideration given to proportional occurrence.
Index period: June - September.
Sampling effort: Approximately 15-30 minutes of sampling time by two trained biologists.
Taxonomic resolution: Macroinvertebrates identified to family or higher.
Subsampling: A composite sample is subsampled in the field to obtain 300 +/- 60 organisms for identification and enumeration.
Appropriate stream classification ensures that the index calibrated for a stream type gives the most reliable community assessment information. For each site, the stream class will be identified according to specifications in the table below.
North
[Ecoregions: 50 - Northern Lakes and Forests, 51 - North Central Hardwood Forests (Omernik and Bryce, 2010)]
# Packages library(readxl) library(knitr) library(dplyr) library(kableExtra) # Data fn_data <- "OutputFileSubtabs.xlsx" path_data <- file.path("files", fn_data) df_data <- read_excel(path_data, sheet = "North_Classes") # Display options(knitr.kable.NA = '') df_data %>% kable() %>% kable_styling(full_width = F, position = "center") %>% row_spec(0, extra_css = "border-top: 2px solid black; border-bottom: 1px solid black;") %>% row_spec(1:(nrow(df_data) - 1), extra_css = "border-bottom: 1px solid black;") %>% row_spec(nrow(df_data), extra_css = "border-bottom: 2px solid black;")
*Width based on average measured stream width during sampling event.
**% of catchment area classified as wetland or water land cover (National Land Cover Database, 2011, (United States Geological Survey [USGS], 2014))
South
[Ecoregions: 55 - Eastern Corn Belt Plains, 56 - Southern Michigan/Northern Indiana Drift Plains, 57 - Huron/Erie Lake Plains (Omernik and Bryce, 2010)]
# Packages library(readxl) library(knitr) library(dplyr) library(kableExtra) # Data fn_data <- "OutputFileSubtabs.xlsx" path_data <- file.path("files", fn_data) df_data <- read_excel(path_data, sheet = "South_Classes") # Display options(knitr.kable.NA = '') df_data %>% kable() %>% kable_styling(full_width = F, position = "center") %>% row_spec(0, extra_css = "border-top: 2px solid black; border-bottom: 1px solid black;") %>% row_spec(1:(nrow(df_data) - 1), extra_css = "border-bottom: 1px solid black;") %>% row_spec(nrow(df_data), extra_css = "border-bottom: 2px solid black;")
*% stream slope measured as the slope of flowline based on smoothed elevations (Source: National Hydrography Dataset Plus)
Metric calculation depends on the list of taxa collected, taxa traits, and calculation descriptions. Each stream class has a specific index that includes a unique set of metrics and scoring formulae (see tables below). Metric scores are first calculated from metric values. Any scores calculated as 100 are reset to 100 and scores calculated to 0 are reset to 0. The calculated and reset scores are averaged across all metrics to arrive at an index score for each site.
# Packages library(readxl) library(knitr) library(dplyr) library(kableExtra) # Data fn_data <- "OutputFileSubtabs.xlsx" path_data <- file.path("files", fn_data) df_data <- read_excel(path_data, sheet = "FileBuild_About") df_data_trim <- df_data %>% filter(`Stream Class` == "VeryNarrow") %>% select(-c(`Stream Class`)) # Display options(knitr.kable.NA = '') df_data_trim %>% kable() %>% kable_styling(full_width = F, position = "center") %>% row_spec(0, extra_css = "border-top: 2px solid black; border-bottom: 1px solid black;") %>% row_spec(1:(nrow(df_data_trim) - 1), extra_css = "border-bottom: 1px solid black;") %>% row_spec(nrow(df_data_trim), extra_css = "border-bottom: 2px solid black;")
# Packages library(readxl) library(knitr) library(dplyr) library(kableExtra) # Data fn_data <- "OutputFileSubtabs.xlsx" path_data <- file.path("files", fn_data) df_data <- read_excel(path_data, sheet = "FileBuild_About") df_data_trim <- df_data %>% filter(`Stream Class` == "Narrow") %>% select(-c(`Stream Class`)) # Display options(knitr.kable.NA = '') df_data_trim %>% kable() %>% kable_styling(full_width = F, position = "center") %>% row_spec(0, extra_css = "border-top: 2px solid black; border-bottom: 1px solid black;") %>% row_spec(1:(nrow(df_data_trim) - 1), extra_css = "border-bottom: 1px solid black;") %>% row_spec(nrow(df_data_trim), extra_css = "border-bottom: 2px solid black;")
# Packages library(readxl) library(knitr) library(dplyr) library(kableExtra) # Data fn_data <- "OutputFileSubtabs.xlsx" path_data <- file.path("files", fn_data) df_data <- read_excel(path_data, sheet = "FileBuild_About") df_data_trim <- df_data %>% filter(`Stream Class` == "MidSizeDry") %>% select(-c(`Stream Class`)) # Display options(knitr.kable.NA = '') df_data_trim %>% kable() %>% kable_styling(full_width = F, position = "center") %>% row_spec(0, extra_css = "border-top: 2px solid black; border-bottom: 1px solid black;") %>% row_spec(1:(nrow(df_data_trim) - 1), extra_css = "border-bottom: 1px solid black;") %>% row_spec(nrow(df_data_trim), extra_css = "border-bottom: 2px solid black;")
# Packages library(readxl) library(knitr) library(dplyr) library(kableExtra) # Data fn_data <- "OutputFileSubtabs.xlsx" path_data <- file.path("files", fn_data) df_data <- read_excel(path_data, sheet = "FileBuild_About") df_data_trim <- df_data %>% filter(`Stream Class` == "WideOrMidSizeWet") %>% select(-c(`Stream Class`)) # Display options(knitr.kable.NA = '') df_data_trim %>% kable() %>% kable_styling(full_width = F, position = "center") %>% row_spec(0, extra_css = "border-top: 2px solid black; border-bottom: 1px solid black;") %>% row_spec(1:(nrow(df_data_trim) - 1), extra_css = "border-bottom: 1px solid black;") %>% row_spec(nrow(df_data_trim), extra_css = "border-bottom: 2px solid black;")
# Packages library(readxl) library(knitr) library(dplyr) library(kableExtra) # Data fn_data <- "OutputFileSubtabs.xlsx" path_data <- file.path("files", fn_data) df_data <- read_excel(path_data, sheet = "FileBuild_About") df_data_trim <- df_data %>% filter(`Stream Class` == "WestFlat") %>% select(-c(`Stream Class`)) # Display options(knitr.kable.NA = '') df_data_trim %>% kable() %>% kable_styling(full_width = F, position = "center") %>% row_spec(0, extra_css = "border-top: 2px solid black; border-bottom: 1px solid black;") %>% row_spec(1:(nrow(df_data_trim) - 1), extra_css = "border-bottom: 1px solid black;") %>% row_spec(nrow(df_data_trim), extra_css = "border-bottom: 2px solid black;")
# Packages library(readxl) library(knitr) library(dplyr) library(kableExtra) # Data fn_data <- "OutputFileSubtabs.xlsx" path_data <- file.path("files", fn_data) df_data <- read_excel(path_data, sheet = "FileBuild_About") df_data_trim <- df_data %>% filter(`Stream Class` == "WestSteep") %>% select(-c(`Stream Class`)) # Display options(knitr.kable.NA = '') df_data_trim %>% kable() %>% kable_styling(full_width = F, position = "center") %>% row_spec(0, extra_css = "border-top: 2px solid black; border-bottom: 1px solid black;") %>% row_spec(1:(nrow(df_data_trim) - 1), extra_css = "border-bottom: 1px solid black;") %>% row_spec(nrow(df_data_trim), extra_css = "border-bottom: 2px solid black;")
# Packages library(readxl) library(knitr) library(dplyr) library(kableExtra) # Data fn_data <- "OutputFileSubtabs.xlsx" path_data <- file.path("files", fn_data) df_data <- read_excel(path_data, sheet = "FileBuild_About") df_data_trim <- df_data %>% filter(`Stream Class` == "East") %>% select(-c(`Stream Class`)) # Display options(knitr.kable.NA = '') df_data_trim %>% kable() %>% kable_styling(full_width = F, position = "center") %>% row_spec(0, extra_css = "border-top: 2px solid black; border-bottom: 1px solid black;") %>% row_spec(1:(nrow(df_data_trim) - 1), extra_css = "border-bottom: 1px solid black;") %>% row_spec(nrow(df_data_trim), extra_css = "border-bottom: 2px solid black;")
Procedure 51 uses a least-impacted reference site approach to set macroinvertebrate community expectations for each stream class. If a P51 score for a community deviates from what is expected based on the distribution of scores at least-impacted reference sites, that community is considered to be “Not Meeting Expectations”. “Not Meeting Expectations” is an indicator that water quality, stream habitat, or other conditions are impacting the community. If a P51 score for a community is within the distribution of scores that are expected based on least-impacted reference sites, that community is considered to be “Meeting Expectations”. For more details on how thresholds between “Meeting Expectations” and “Not Meeting Expectations” were chosen, as well as assumptions that went into the process see P51 Macroinvertebrate Scoring and Interpretation.
# Packages library(readxl) library(knitr) library(kableExtra) # Data fn_data <- "OutputFileSubtabs.xlsx" path_data <- file.path("files", fn_data) df_data <- read_excel(path_data, sheet = "FileBuild_About2") # Display options(knitr.kable.NA = '') df_data %>% kable() %>% kable_styling(full_width = F, position = "center") %>% row_spec(0, extra_css = "border-top: 2px solid black; border-bottom: 1px solid black;") %>% row_spec(1:(nrow(df_data) - 1), extra_css = "border-bottom: 1px solid black;") %>% row_spec(nrow(df_data), extra_css = "border-bottom: 2px solid black;")
Section 106 funding allocated to EGLE by the USEPA funded the development of this app.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.