From d37da96092f776c8cdc5bdacba932d47ceb7221f Mon Sep 17 00:00:00 2001
From: Michael Dumelle
Date: Fri, 20 Jan 2023 15:02:28 -0800
Subject: [PATCH 01/12] Fix issue #31
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 540b095..13d7350 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
[![R-CMD-check](https://github.com/USEPA/spsurvey/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/USEPA/spsurvey/actions/workflows/R-CMD-check.yaml)
[![CRAN](http://www.r-pkg.org/badges/version/spsurvey)](https://cran.r-project.org/package=spsurvey)
-[![cran checks](https://cranchecks.info/badges/worst/spsurvey)](https://cran.r-project.org/web/checks/check_results_spsurvey.html)
+[![cran checks](https://badges.cranchecks.info/worst/spsurvey.svg)](https://cran.r-project.org/web/checks/check_results_spsurvey.html)
[![Downloads](https://cranlogs.r-pkg.org/badges/grand-total/spsurvey)](https://cran.r-project.org/package=spsurvey)
From eb27746d9ff6a125dc1ef743cc56ef2318859c8c Mon Sep 17 00:00:00 2001
From: Michael Dumelle
Date: Fri, 20 Jan 2023 15:33:45 -0800
Subject: [PATCH 02/12] Fix issue #32
---
R/grts.R | 30 +++++++++++++++---------------
R/irs.R | 30 +++++++++++++++---------------
2 files changed, 30 insertions(+), 30 deletions(-)
diff --git a/R/grts.R b/R/grts.R
index 3c3d715..cea09d6 100644
--- a/R/grts.R
+++ b/R/grts.R
@@ -798,11 +798,11 @@ grts <- function(sframe, n_base, stratum_var = NULL, seltype = NULL, caty_var =
} else {
legacy_sites_names_bad <- legacy_sites_names[legacy_sites_names %in% dsgn_names_extra]
legacy_sites_temp <- legacy_sites[, legacy_sites_names_bad, drop = FALSE]
- temp_geometry_col <- which(names(legacy_sites_temp) == attr(sites_legacy, "sf_column"))
- legacy_sites_geometry_col <- which(names(legacy_sites) == attr(sites_legacy, "sf_column"))
+ temp_geometry_col <- which(names(legacy_sites_temp) == attr(legacy_sites_temp, "sf_column"))
+ legacy_sites_geometry_col <- which(names(legacy_sites) == attr(legacy_sites, "sf_column"))
names(legacy_sites_temp)[-temp_geometry_col] <- paste("legacy_sites", names(legacy_sites_temp)[-temp_geometry_col], sep = "_")
sites_legacy <- st_join(sites_legacy, legacy_sites_temp, join = st_nearest_feature)
- sites_legacy <- subset(sites_legacy, select = c(add_names, legacy_sites_names_good[-legacy_sites_geometry_col], names(legacy_sites_temp)))
+ sites_legacy <- subset(sites_legacy, select = c(add_names, legacy_sites_names_good[-legacy_sites_geometry_col], names(legacy_sites_temp)[-temp_geometry_col]))
for (i in names(sites_legacy)) {
if (i %in% c("legacy_sites_xcoord", "legacy_sites_ycoord", "legacy_sites_idpts")) {
names(sites_legacy)[which(names(sites_legacy) == i)] <- substring(i, first = 14)
@@ -818,12 +818,12 @@ grts <- function(sframe, n_base, stratum_var = NULL, seltype = NULL, caty_var =
} else {
sframe_names_bad <- sframe_names[sframe_names %in% dsgn_names_extra]
sframe_temp <- sframe[, sframe_names_bad, drop = FALSE]
- temp_geometry_col <- which(names(sframe_temp) == attr(sites_legacy, "sf_column"))
- sframe_geometry_col <- which(names(sframe) == attr(sites_legacy, "sf_column"))
+ temp_geometry_col <- which(names(sframe_temp) == attr(sframe_temp, "sf_column"))
+ sframe_geometry_col <- which(names(sframe) == attr(sframe, "sf_column"))
names(sframe_temp)[-temp_geometry_col] <- paste("sframe", names(sframe_temp)[-temp_geometry_col], sep = "_")
sites_legacy <- st_join(sites_legacy, sframe_temp, join = st_nearest_feature)
sites_legacy <- subset(sites_legacy,
- select = c(add_names, sframe_names_good[-sframe_geometry_col], names(sframe_temp))
+ select = c(add_names, sframe_names_good[-sframe_geometry_col], names(sframe_temp)[-temp_geometry_col])
)
for (i in names(sites_legacy)) {
if (i %in% c("sframe_xcoord", "sframe_ycoord", "sframe_idpts")) {
@@ -844,11 +844,11 @@ grts <- function(sframe, n_base, stratum_var = NULL, seltype = NULL, caty_var =
} else {
sframe_names_bad <- sframe_names[sframe_names %in% dsgn_names_extra]
sframe_temp <- sframe[, sframe_names_bad, drop = FALSE]
- temp_geometry_col <- which(names(sframe_temp) == attr(sites_base, "sf_column"))
- sframe_geometry_col <- which(names(sframe) == attr(sites_base, "sf_column"))
+ temp_geometry_col <- which(names(sframe_temp) == attr(sframe_temp, "sf_column"))
+ sframe_geometry_col <- which(names(sframe) == attr(sframe, "sf_column"))
names(sframe_temp)[-temp_geometry_col] <- paste("sframe", names(sframe_temp)[-temp_geometry_col], sep = "_")
sites_base <- st_join(sites_base, sframe_temp, join = st_nearest_feature)
- sites_base <- subset(sites_base, select = c(add_names, sframe_names_good[-sframe_geometry_col], names(sframe_temp)))
+ sites_base <- subset(sites_base, select = c(add_names, sframe_names_good[-sframe_geometry_col], names(sframe_temp)[-temp_geometry_col]))
for (i in names(sites_base)) {
if (i %in% c("sframe_xcoord", "sframe_ycoord", "sframe_idpts")) {
names(sites_base)[which(names(sites_base) == i)] <- substring(i, first = 8)
@@ -866,11 +866,11 @@ grts <- function(sframe, n_base, stratum_var = NULL, seltype = NULL, caty_var =
} else {
sframe_names_bad <- sframe_names[sframe_names %in% dsgn_names_extra]
sframe_temp <- sframe[, sframe_names_bad, drop = FALSE]
- temp_geometry_col <- which(names(sframe_temp) == attr(sites_over, "sf_column"))
- sframe_geometry_col <- which(names(sframe) == attr(sites_over, "sf_column"))
+ temp_geometry_col <- which(names(sframe_temp) == attr(sframe_temp, "sf_column"))
+ sframe_geometry_col <- which(names(sframe) == attr(sframe, "sf_column"))
names(sframe_temp)[-temp_geometry_col] <- paste("sframe", names(sframe_temp)[-temp_geometry_col], sep = "_")
sites_over <- st_join(sites_over, sframe_temp, join = st_nearest_feature)
- sites_over <- subset(sites_over, select = c(add_names, sframe_names_good[-sframe_geometry_col], names(sframe_temp)))
+ sites_over <- subset(sites_over, select = c(add_names, sframe_names_good[-sframe_geometry_col], names(sframe_temp)[-temp_geometry_col]))
for (i in names(sites_over)) {
if (i %in% c("sframe_xcoord", "sframe_ycoord", "sframe_idpts")) {
names(sites_over)[which(names(sites_over) == i)] <- substring(i, first = 8)
@@ -888,11 +888,11 @@ grts <- function(sframe, n_base, stratum_var = NULL, seltype = NULL, caty_var =
} else {
sframe_names_bad <- sframe_names[sframe_names %in% dsgn_names_extra]
sframe_temp <- sframe[, sframe_names_bad, drop = FALSE]
- temp_geometry_col <- which(names(sframe_temp) == attr(sites_near, "sf_column"))
- sframe_geometry_col <- which(names(sframe) == attr(sites_near, "sf_column"))
+ temp_geometry_col <- which(names(sframe_temp) == attr(sframe_temp, "sf_column"))
+ sframe_geometry_col <- which(names(sframe) == attr(sframe, "sf_column"))
names(sframe_temp)[-temp_geometry_col] <- paste("sframe", names(sframe_temp)[-temp_geometry_col], sep = "_")
sites_near <- st_join(sites_near, sframe_temp, join = st_nearest_feature)
- sites_near <- subset(sites_near, select = c(add_names, sframe_names_good[-sframe_geometry_col], names(sframe_temp)))
+ sites_near <- subset(sites_near, select = c(add_names, sframe_names_good[-sframe_geometry_col], names(sframe_temp)[-temp_geometry_col]))
for (i in names(sites_near)) {
if (i %in% c("sframe_xcoord", "sframe_ycoord", "sframe_idpts")) {
names(sites_near)[which(names(sites_near) == i)] <- substring(i, first = 8)
diff --git a/R/irs.R b/R/irs.R
index 6904443..8bf442d 100644
--- a/R/irs.R
+++ b/R/irs.R
@@ -498,11 +498,11 @@ irs <- function(sframe, n_base, stratum_var = NULL, seltype = NULL, caty_var = N
} else {
legacy_sites_names_bad <- legacy_sites_names[legacy_sites_names %in% dsgn_names_extra]
legacy_sites_temp <- legacy_sites[, legacy_sites_names_bad, drop = FALSE]
- temp_geometry_col <- which(names(legacy_sites_temp) == attr(sites_legacy, "sf_column"))
- legacy_sites_geometry_col <- which(names(legacy_sites) == attr(sites_legacy, "sf_column"))
+ temp_geometry_col <- which(names(legacy_sites_temp) == attr(legacy_sites_temp, "sf_column"))
+ legacy_sites_geometry_col <- which(names(legacy_sites) == attr(legacy_sites, "sf_column"))
names(legacy_sites_temp)[-temp_geometry_col] <- paste("legacy_sites", names(legacy_sites_temp)[-temp_geometry_col], sep = "_")
sites_legacy <- st_join(sites_legacy, legacy_sites_temp, join = st_nearest_feature)
- sites_legacy <- subset(sites_legacy, select = c(add_names, legacy_sites_names_good[-legacy_sites_geometry_col], names(legacy_sites_temp)))
+ sites_legacy <- subset(sites_legacy, select = c(add_names, legacy_sites_names_good[-legacy_sites_geometry_col], names(legacy_sites_temp)[-temp_geometry_col]))
for (i in names(sites_legacy)) {
if (i %in% c("legacy_sites_xcoord", "legacy_sites_ycoord", "legacy_sites_idpts")) {
names(sites_legacy)[which(names(sites_legacy) == i)] <- substring(i, first = 14)
@@ -518,12 +518,12 @@ irs <- function(sframe, n_base, stratum_var = NULL, seltype = NULL, caty_var = N
} else {
sframe_names_bad <- sframe_names[sframe_names %in% dsgn_names_extra]
sframe_temp <- sframe[, sframe_names_bad, drop = FALSE]
- temp_geometry_col <- which(names(sframe_temp) == attr(sites_legacy, "sf_column"))
- sframe_geometry_col <- which(names(sframe) == attr(sites_legacy, "sf_column"))
+ temp_geometry_col <- which(names(sframe_temp) == attr(sframe_temp, "sf_column"))
+ sframe_geometry_col <- which(names(sframe) == attr(sframe, "sf_column"))
names(sframe_temp)[-temp_geometry_col] <- paste("sframe", names(sframe_temp)[-temp_geometry_col], sep = "_")
sites_legacy <- st_join(sites_legacy, sframe_temp, join = st_nearest_feature)
sites_legacy <- subset(sites_legacy,
- select = c(add_names, sframe_names_good[-sframe_geometry_col], names(sframe_temp))
+ select = c(add_names, sframe_names_good[-sframe_geometry_col], names(sframe_temp)[-temp_geometry_col])
)
for (i in names(sites_legacy)) {
if (i %in% c("sframe_xcoord", "sframe_ycoord", "sframe_idpts")) {
@@ -544,11 +544,11 @@ irs <- function(sframe, n_base, stratum_var = NULL, seltype = NULL, caty_var = N
} else {
sframe_names_bad <- sframe_names[sframe_names %in% dsgn_names_extra]
sframe_temp <- sframe[, sframe_names_bad, drop = FALSE]
- temp_geometry_col <- which(names(sframe_temp) == attr(sites_base, "sf_column"))
- sframe_geometry_col <- which(names(sframe) == attr(sites_base, "sf_column"))
+ temp_geometry_col <- which(names(sframe_temp) == attr(sframe_temp, "sf_column"))
+ sframe_geometry_col <- which(names(sframe) == attr(sframe, "sf_column"))
names(sframe_temp)[-temp_geometry_col] <- paste("sframe", names(sframe_temp)[-temp_geometry_col], sep = "_")
sites_base <- st_join(sites_base, sframe_temp, join = st_nearest_feature)
- sites_base <- subset(sites_base, select = c(add_names, sframe_names_good[-sframe_geometry_col], names(sframe_temp)))
+ sites_base <- subset(sites_base, select = c(add_names, sframe_names_good[-sframe_geometry_col], names(sframe_temp)[-temp_geometry_col]))
for (i in names(sites_base)) {
if (i %in% c("sframe_xcoord", "sframe_ycoord", "sframe_idpts")) {
names(sites_base)[which(names(sites_base) == i)] <- substring(i, first = 8)
@@ -566,11 +566,11 @@ irs <- function(sframe, n_base, stratum_var = NULL, seltype = NULL, caty_var = N
} else {
sframe_names_bad <- sframe_names[sframe_names %in% dsgn_names_extra]
sframe_temp <- sframe[, sframe_names_bad, drop = FALSE]
- temp_geometry_col <- which(names(sframe_temp) == attr(sites_over, "sf_column"))
- sframe_geometry_col <- which(names(sframe) == attr(sites_over, "sf_column"))
+ temp_geometry_col <- which(names(sframe_temp) == attr(sframe_temp, "sf_column"))
+ sframe_geometry_col <- which(names(sframe) == attr(sframe, "sf_column"))
names(sframe_temp)[-temp_geometry_col] <- paste("sframe", names(sframe_temp)[-temp_geometry_col], sep = "_")
sites_over <- st_join(sites_over, sframe_temp, join = st_nearest_feature)
- sites_over <- subset(sites_over, select = c(add_names, sframe_names_good[-sframe_geometry_col], names(sframe_temp)))
+ sites_over <- subset(sites_over, select = c(add_names, sframe_names_good[-sframe_geometry_col], names(sframe_temp)[-temp_geometry_col]))
for (i in names(sites_over)) {
if (i %in% c("sframe_xcoord", "sframe_ycoord", "sframe_idpts")) {
names(sites_over)[which(names(sites_over) == i)] <- substring(i, first = 8)
@@ -588,11 +588,11 @@ irs <- function(sframe, n_base, stratum_var = NULL, seltype = NULL, caty_var = N
} else {
sframe_names_bad <- sframe_names[sframe_names %in% dsgn_names_extra]
sframe_temp <- sframe[, sframe_names_bad, drop = FALSE]
- temp_geometry_col <- which(names(sframe_temp) == attr(sites_near, "sf_column"))
- sframe_geometry_col <- which(names(sframe) == attr(sites_near, "sf_column"))
+ temp_geometry_col <- which(names(sframe_temp) == attr(sframe_temp, "sf_column"))
+ sframe_geometry_col <- which(names(sframe) == attr(sframe, "sf_column"))
names(sframe_temp)[-temp_geometry_col] <- paste("sframe", names(sframe_temp)[-temp_geometry_col], sep = "_")
sites_near <- st_join(sites_near, sframe_temp, join = st_nearest_feature)
- sites_near <- subset(sites_near, select = c(add_names, sframe_names_good[-sframe_geometry_col], names(sframe_temp)))
+ sites_near <- subset(sites_near, select = c(add_names, sframe_names_good[-sframe_geometry_col], names(sframe_temp)[-temp_geometry_col]))
for (i in names(sites_near)) {
if (i %in% c("sframe_xcoord", "sframe_ycoord", "sframe_idpts")) {
names(sites_near)[which(names(sites_near) == i)] <- substring(i, first = 8)
From bb1eca27c751aceeb5c499815d06692ca966e2e4 Mon Sep 17 00:00:00 2001
From: Michael Dumelle
Date: Fri, 20 Jan 2023 16:08:03 -0800
Subject: [PATCH 03/12] Fix issue #33
---
R/attrisk_analysis.R | 14 ++++++++++--
R/diffrisk_analysis.R | 6 +++++
R/relrisk_analysis.R | 6 +++++
man/attrisk_analysis.Rd | 8 +++++--
man/diffrisk_analysis.Rd | 8 +++++--
man/relrisk_analysis.Rd | 8 +++++--
tests/testthat/test-attrisk_analysis.R | 30 +++++++++++++++++++++++++
tests/testthat/test-diffrisk_analysis.R | 30 +++++++++++++++++++++++++
tests/testthat/test-relrisk_analysis.R | 30 +++++++++++++++++++++++++
9 files changed, 132 insertions(+), 8 deletions(-)
diff --git a/R/attrisk_analysis.R b/R/attrisk_analysis.R
index 648f8c6..45a4689 100644
--- a/R/attrisk_analysis.R
+++ b/R/attrisk_analysis.R
@@ -62,7 +62,9 @@
#' contains the values \code{"Poor"} and \code{"Good"} for the first and
#' second levels, respectively, of each element in the \code{vars_response}
#' argument and that uses values in the \code{vars_response} argument as names
-#' for the list. The default value is NULL.
+#' for the list. If \code{response_levels} is provided without names,
+#' then the names of \code{response_levels} are set to \code{vars_response}.
+#' The default value is NULL.
#'
#' @param stressor_levels List providing the category values (levels) for each
#' element in the \code{vars_stressor} argument. Each element in the list
@@ -74,7 +76,9 @@
#' contains the values \code{"Poor"} and \code{"Good"} for the first and
#' second levels, respectively, of each element in the \code{vars_stressor}
#' argument and that uses values in the \code{vars_stressor} argument as names
-#' for the list. The default value is NULL.
+#' for the list. If \code{stressor_levels} is provided without names,
+#' then the names of \code{stressor_levels} are set to \code{vars_stressor}.
+#' The default value is NULL.
#'
#' @param subpops Vector composed of character values that identify the
#' names of subpopulation (domain) variables in \code{dframe}.
@@ -572,6 +576,9 @@ attrisk_analysis <- function(dframe, vars_response, vars_stressor, response_leve
msg <- "Argument response_levels must be the same length as argument vars_response.\n"
error_vec <- c(error_vec, msg)
}
+ if (is.null(names(response_levels))) { # set default names if none provided
+ names(response_levels) <- vars_response
+ }
if (any(sapply(response_levels, function(x) length(x) != 2))) {
error_ind <- TRUE
msg <- "Each element of argument response_levels must contain only two values.\n"
@@ -622,6 +629,9 @@ attrisk_analysis <- function(dframe, vars_response, vars_stressor, response_leve
msg <- "Argument stressor_levels must be the same length as argument vars_stressor.\n"
error_vec <- c(error_vec, msg)
}
+ if (is.null(names(stressor_levels))) { # set default names if none provided
+ names(stressor_levels) <- vars_stressor
+ }
if (any(sapply(stressor_levels, function(x) length(x) != 2))) {
error_ind <- TRUE
msg <- "Each element of argument stressor_levels must contain only two values.\n"
diff --git a/R/diffrisk_analysis.R b/R/diffrisk_analysis.R
index c23ef6f..a058261 100644
--- a/R/diffrisk_analysis.R
+++ b/R/diffrisk_analysis.R
@@ -308,6 +308,9 @@ diffrisk_analysis <- function(dframe, vars_response, vars_stressor, response_lev
msg <- "Argument response_levels must be the same length as argument vars_response.\n"
error_vec <- c(error_vec, msg)
}
+ if (is.null(names(response_levels))) { # set default names if none provided
+ names(response_levels) <- vars_response
+ }
if (any(sapply(response_levels, function(x) length(x) != 2))) {
error_ind <- TRUE
msg <- "Each element of argument response_levels must contain only two values.\n"
@@ -358,6 +361,9 @@ diffrisk_analysis <- function(dframe, vars_response, vars_stressor, response_lev
msg <- "Argument stressor_levels must be the same length as argument vars_stressor.\n"
error_vec <- c(error_vec, msg)
}
+ if (is.null(names(stressor_levels))) { # set default names if none provided
+ names(stressor_levels) <- vars_stressor
+ }
if (any(sapply(stressor_levels, function(x) length(x) != 2))) {
error_ind <- TRUE
msg <- "Each element of argument stressor_levels must contain only two values.\n"
diff --git a/R/relrisk_analysis.R b/R/relrisk_analysis.R
index adf18c3..b365c7a 100644
--- a/R/relrisk_analysis.R
+++ b/R/relrisk_analysis.R
@@ -326,6 +326,9 @@ relrisk_analysis <- function(dframe, vars_response, vars_stressor, response_leve
msg <- "Argument response_levels must be the same length as argument vars_response.\n"
error_vec <- c(error_vec, msg)
}
+ if (is.null(names(response_levels))) { # set default names if none provided
+ names(response_levels) <- vars_response
+ }
if (any(sapply(response_levels, function(x) length(x) != 2))) {
error_ind <- TRUE
msg <- "Each element of argument response_levels must contain only two values.\n"
@@ -376,6 +379,9 @@ relrisk_analysis <- function(dframe, vars_response, vars_stressor, response_leve
msg <- "Argument stressor_levels must be the same length as argument vars_stressor.\n"
error_vec <- c(error_vec, msg)
}
+ if (is.null(names(stressor_levels))) { # set default names if none provided
+ names(stressor_levels) <- vars_stressor
+ }
if (any(sapply(stressor_levels, function(x) length(x) != 2))) {
error_ind <- TRUE
msg <- "Each element of argument stressor_levels must contain only two values.\n"
diff --git a/man/attrisk_analysis.Rd b/man/attrisk_analysis.Rd
index 7cd6bf1..a1055a1 100644
--- a/man/attrisk_analysis.Rd
+++ b/man/attrisk_analysis.Rd
@@ -58,7 +58,9 @@ argument. If this argument equals NULL, then a named list is created that
contains the values \code{"Poor"} and \code{"Good"} for the first and
second levels, respectively, of each element in the \code{vars_response}
argument and that uses values in the \code{vars_response} argument as names
-for the list. The default value is NULL.}
+for the list. If \code{response_levels} is provided without names,
+then the names of \code{response_levels} are set to \code{vars_response}.
+The default value is NULL.}
\item{stressor_levels}{List providing the category values (levels) for each
element in the \code{vars_stressor} argument. Each element in the list
@@ -70,7 +72,9 @@ argument. If this argument equals NULL, then a named list is created that
contains the values \code{"Poor"} and \code{"Good"} for the first and
second levels, respectively, of each element in the \code{vars_stressor}
argument and that uses values in the \code{vars_stressor} argument as names
-for the list. The default value is NULL.}
+for the list. If \code{stressor_levels} is provided without names,
+then the names of \code{stressor_levels} are set to \code{vars_stressor}.
+The default value is NULL.}
\item{subpops}{Vector composed of character values that identify the
names of subpopulation (domain) variables in \code{dframe}.
diff --git a/man/diffrisk_analysis.Rd b/man/diffrisk_analysis.Rd
index 0bb0219..a48d5b9 100644
--- a/man/diffrisk_analysis.Rd
+++ b/man/diffrisk_analysis.Rd
@@ -58,7 +58,9 @@ argument. If this argument equals NULL, then a named list is created that
contains the values \code{"Poor"} and \code{"Good"} for the first and
second levels, respectively, of each element in the \code{vars_response}
argument and that uses values in the \code{vars_response} argument as names
-for the list. The default value is NULL.}
+for the list. If \code{response_levels} is provided without names,
+then the names of \code{response_levels} are set to \code{vars_response}.
+The default value is NULL.}
\item{stressor_levels}{List providing the category values (levels) for each
element in the \code{vars_stressor} argument. Each element in the list
@@ -70,7 +72,9 @@ argument. If this argument equals NULL, then a named list is created that
contains the values \code{"Poor"} and \code{"Good"} for the first and
second levels, respectively, of each element in the \code{vars_stressor}
argument and that uses values in the \code{vars_stressor} argument as names
-for the list. The default value is NULL.}
+for the list. If \code{stressor_levels} is provided without names,
+then the names of \code{stressor_levels} are set to \code{vars_stressor}.
+The default value is NULL.}
\item{subpops}{Vector composed of character values that identify the
names of subpopulation (domain) variables in \code{dframe}.
diff --git a/man/relrisk_analysis.Rd b/man/relrisk_analysis.Rd
index ae04f82..c841917 100644
--- a/man/relrisk_analysis.Rd
+++ b/man/relrisk_analysis.Rd
@@ -58,7 +58,9 @@ argument. If this argument equals NULL, then a named list is created that
contains the values \code{"Poor"} and \code{"Good"} for the first and
second levels, respectively, of each element in the \code{vars_response}
argument and that uses values in the \code{vars_response} argument as names
-for the list. The default value is NULL.}
+for the list. If \code{response_levels} is provided without names,
+then the names of \code{response_levels} are set to \code{vars_response}.
+The default value is NULL.}
\item{stressor_levels}{List providing the category values (levels) for each
element in the \code{vars_stressor} argument. Each element in the list
@@ -70,7 +72,9 @@ argument. If this argument equals NULL, then a named list is created that
contains the values \code{"Poor"} and \code{"Good"} for the first and
second levels, respectively, of each element in the \code{vars_stressor}
argument and that uses values in the \code{vars_stressor} argument as names
-for the list. The default value is NULL.}
+for the list. If \code{stressor_levels} is provided without names,
+then the names of \code{stressor_levels} are set to \code{vars_stressor}.
+The default value is NULL.}
\item{subpops}{Vector composed of character values that identify the
names of subpopulation (domain) variables in \code{dframe}.
diff --git a/tests/testthat/test-attrisk_analysis.R b/tests/testthat/test-attrisk_analysis.R
index 0876c0a..a94335d 100644
--- a/tests/testthat/test-attrisk_analysis.R
+++ b/tests/testthat/test-attrisk_analysis.R
@@ -89,6 +89,36 @@ test_that("Attributable Risk: Unstratified single-stage analysis", {
expect_equal(nrow(AttRisk_Estimates), 6)
})
+AttRisk_Estimates <- attrisk_analysis(
+ dframe = NLA_IN,
+ vars_response = vars_response, vars_stressor = vars_stressor,
+ subpops = subpops, siteID = "SITE_ID", weight = "WGT_TP", xcoord = "XCOORD",
+ ycoord = "YCOORD",
+ response_levels = list("BENT_MMI_COND_2017" = c("Poor", "Good")),
+ stressor_levels = list("PTL_COND" = c("Poor", "Good"), "NTL_COND" = c("Poor", "Good"))
+)
+
+test_that("Attributable Risk: Unstratified single-stage analysis (specify response/stressor levels)", {
+ expect_true(exists("AttRisk_Estimates"))
+ expect_equal(attributes(AttRisk_Estimates)$class, "data.frame")
+ expect_equal(nrow(AttRisk_Estimates), 6)
+})
+
+AttRisk_Estimates <- attrisk_analysis(
+ dframe = NLA_IN,
+ vars_response = vars_response, vars_stressor = vars_stressor,
+ subpops = subpops, siteID = "SITE_ID", weight = "WGT_TP", xcoord = "XCOORD",
+ ycoord = "YCOORD",
+ response_levels = list(c("Poor", "Good")),
+ stressor_levels = list(c("Poor", "Good"), c("Poor", "Good"))
+)
+
+test_that("Attributable Risk: Unstratified single-stage analysis (unnamed response/stressor levels)", {
+ expect_true(exists("AttRisk_Estimates"))
+ expect_equal(attributes(AttRisk_Estimates)$class, "data.frame")
+ expect_equal(nrow(AttRisk_Estimates), 6)
+})
+
AttRisk_Estimates <- attrisk_analysis(
dframe = NLA_IN,
vars_response = vars_response, vars_stressor = vars_stressor,
diff --git a/tests/testthat/test-diffrisk_analysis.R b/tests/testthat/test-diffrisk_analysis.R
index a29d9d2..44a1c0f 100644
--- a/tests/testthat/test-diffrisk_analysis.R
+++ b/tests/testthat/test-diffrisk_analysis.R
@@ -89,6 +89,36 @@ test_that("Risk Difference: Unstratified single-stage analysis", {
expect_equal(nrow(DiffRisk_Estimates), 6)
})
+DiffRisk_Estimates <- diffrisk_analysis(
+ dframe = NLA_IN,
+ vars_response = vars_response, vars_stressor = vars_stressor,
+ subpops = subpops, siteID = "SITE_ID", weight = "WGT_TP", xcoord = "XCOORD",
+ ycoord = "YCOORD",
+ response_levels = list("BENT_MMI_COND_2017" = c("Poor", "Good")),
+ stressor_levels = list("PTL_COND" = c("Poor", "Good"), "NTL_COND" = c("Poor", "Good"))
+)
+
+test_that("Risk Difference: Unstratified single-stage analysis (specify response/stressor levels)", {
+ expect_true(exists("DiffRisk_Estimates"))
+ expect_equal(attributes(DiffRisk_Estimates)$class, "data.frame")
+ expect_equal(nrow(DiffRisk_Estimates), 6)
+})
+
+DiffRisk_Estimates <- diffrisk_analysis(
+ dframe = NLA_IN,
+ vars_response = vars_response, vars_stressor = vars_stressor,
+ subpops = subpops, siteID = "SITE_ID", weight = "WGT_TP", xcoord = "XCOORD",
+ ycoord = "YCOORD",
+ response_levels = list(c("Poor", "Good")),
+ stressor_levels = list(c("Poor", "Good"), c("Poor", "Good"))
+)
+
+test_that("Risk Difference: Unstratified single-stage analysis (unnamed response/stressor levels)", {
+ expect_true(exists("DiffRisk_Estimates"))
+ expect_equal(attributes(DiffRisk_Estimates)$class, "data.frame")
+ expect_equal(nrow(DiffRisk_Estimates), 6)
+})
+
DiffRisk_Estimates <- diffrisk_analysis(
dframe = NLA_IN,
vars_response = vars_response, vars_stressor = vars_stressor,
diff --git a/tests/testthat/test-relrisk_analysis.R b/tests/testthat/test-relrisk_analysis.R
index 696dccc..b0afc70 100644
--- a/tests/testthat/test-relrisk_analysis.R
+++ b/tests/testthat/test-relrisk_analysis.R
@@ -89,6 +89,36 @@ test_that("Relative Risk: Unstratified single-stage analysis", {
expect_equal(nrow(RelRisk_Estimates), 6)
})
+RelRisk_Estimates <- relrisk_analysis(
+ dframe = NLA_IN,
+ vars_response = vars_response, vars_stressor = vars_stressor,
+ subpops = subpops, siteID = "SITE_ID", weight = "WGT_TP", xcoord = "XCOORD",
+ ycoord = "YCOORD",
+ response_levels = list("BENT_MMI_COND_2017" = c("Poor", "Good")),
+ stressor_levels = list("PTL_COND" = c("Poor", "Good"), "NTL_COND" = c("Poor", "Good"))
+)
+
+test_that("Relative Risk: Unstratified single-stage analysis (specify response/stressor levels)", {
+ expect_true(exists("RelRisk_Estimates"))
+ expect_equal(attributes(RelRisk_Estimates)$class, "data.frame")
+ expect_equal(nrow(RelRisk_Estimates), 6)
+})
+
+RelRisk_Estimates <- relrisk_analysis(
+ dframe = NLA_IN,
+ vars_response = vars_response, vars_stressor = vars_stressor,
+ subpops = subpops, siteID = "SITE_ID", weight = "WGT_TP", xcoord = "XCOORD",
+ ycoord = "YCOORD",
+ response_levels = list(c("Poor", "Good")),
+ stressor_levels = list(c("Poor", "Good"), c("Poor", "Good"))
+)
+
+test_that("Relative Risk: Unstratified single-stage analysis (unnamed response/stressor levels)", {
+ expect_true(exists("RelRisk_Estimates"))
+ expect_equal(attributes(RelRisk_Estimates)$class, "data.frame")
+ expect_equal(nrow(RelRisk_Estimates), 6)
+})
+
RelRisk_Estimates <- relrisk_analysis(
dframe = NLA_IN,
vars_response = vars_response, vars_stressor = vars_stressor,
From 94eebccf5ee558b9c71baa838f159beda2cb2ee3 Mon Sep 17 00:00:00 2001
From: Michael Dumelle
Date: Fri, 20 Jan 2023 16:08:32 -0800
Subject: [PATCH 04/12] update version number in DESCRIPTION and NEWS
---
DESCRIPTION | 2 +-
NEWS.md | 19 +++++++++++++++++++
2 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/DESCRIPTION b/DESCRIPTION
index 9ee25ba..461c195 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,6 +1,6 @@
Package: spsurvey
Title: Spatial Sampling Design and Analysis
-Version: 5.4.1
+Version: 5.4.2
Authors@R: c(
person("Michael", "Dumelle", role=c("aut","cre"),
email = "Dumelle.Michael@epa.gov", comment = c(ORCID = "0000-0002-3393-5529")),
diff --git a/NEWS.md b/NEWS.md
index 65a614b..dd9c4e9 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,3 +1,22 @@
+# spsurvey 5.4.2
+
+## Minor Updates
+
+* Changed default behavior in `attrisk_analysis()`, `diffrisk_analysis()`, and
+ `relrisk_analysis()` regarding the handling of `response_levels` and `stressor_levels`.
+ Previously, if `response_levels` and `stressor_levels` were specified,
+ their elements required names.
+ Now, if `response_levels` is specified and its names are `NULL`, then its names are set to `vars_response`,
+ and if `stressor_levels` is specified and its names are `NULL`, then its names are set to `vars_stressor` (#33).
+
+## Bug Fixes
+
+* Fixed a bug that caused an erorr in `grts()` and `irs()` occurred when at least
+ one variable name in `sframe` was named `"siteID"`, `"siteuse"`, `"replsite"`,
+ `"lon_WGS84"`, `"lat_WGS84"`, `"stratum"`, `"wgt"`, `"ip"`, `"caty"`, `"aux"`,
+ `xcoord`, `ycoord`, or `idpts` and the name of the geometry column in `sframe`
+ was not named `"geometry"` (#32).
+
# spsurvey 5.4.1
## Minor Updates
From 1410a1f73c6257ba17df01b980ca06d6d2181266 Mon Sep 17 00:00:00 2001
From: Michael Dumelle
Date: Tue, 7 Feb 2023 14:15:33 -0800
Subject: [PATCH 05/12] Fix issue #36
---
NEWS.md | 2 ++
R/attrisk_analysis.R | 12 ++++++------
R/cat_analysis.R | 12 ++++++------
R/change_analysis.R | 12 ++++++------
R/cont_analysis.R | 12 ++++++------
R/cont_cdftest.R | 12 ++++++------
R/diffrisk_analysis.R | 12 ++++++------
R/dsgn_check.R | 6 +++---
R/errorprnt.R | 4 ++--
R/grts.R | 4 ++--
R/grts_stratum.R | 4 ++--
R/irs.R | 4 ++--
R/irs_stratum.R | 4 ++--
R/relrisk_analysis.R | 12 ++++++------
R/stopprnt.R | 4 ++--
R/trend_analysis.R | 12 ++++++------
R/warnprnt.R | 22 +++++++++++-----------
tests/testthat/test-attrisk_analysis.R | 11 +++++++++++
tests/testthat/test-cat_analysis.R | 8 ++++++++
tests/testthat/test-change_analysis.R | 11 +++++++++++
tests/testthat/test-cont_analysis.R | 9 +++++++++
tests/testthat/test-diffrisk_analysis.R | 11 +++++++++++
tests/testthat/test-grts.R | 5 +++++
tests/testthat/test-irs.R | 6 ++++++
tests/testthat/test-relrisk_analysis.R | 11 +++++++++++
tests/testthat/test-trend_analysis.R | 10 ++++++++++
26 files changed, 158 insertions(+), 74 deletions(-)
diff --git a/NEWS.md b/NEWS.md
index dd9c4e9..0a82a49 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -9,6 +9,8 @@
Now, if `response_levels` is specified and its names are `NULL`, then its names are set to `vars_response`,
and if `stressor_levels` is specified and its names are `NULL`, then its names are set to `vars_stressor` (#33).
+* Warning and error messages from `grts()`, `irs()`, and `*_analysis()` functions now print using `message()` instead of `cat()`. This change makes the resulting output more consistent with standard practices and easier to suppress if desired (#36).
+
## Bug Fixes
* Fixed a bug that caused an erorr in `grts()` and `irs()` occurred when at least
diff --git a/R/attrisk_analysis.R b/R/attrisk_analysis.R
index 45a4689..a1cae70 100644
--- a/R/attrisk_analysis.R
+++ b/R/attrisk_analysis.R
@@ -674,17 +674,17 @@ attrisk_analysis <- function(dframe, vars_response, vars_stressor, response_leve
if (error_ind) {
error_vec <<- error_vec
if (length(error_vec) == 1) {
- cat("During execution of the program, an error message was generated. The error \nmessage is stored in a vector named 'error_vec'. Enter the following command \nto view the error message: errorprnt()\n")
+ message("During execution of the program, an error message was generated. The error \nmessage is stored in a vector named 'error_vec'. Enter the following command \nto view the error message: errorprnt()\n")
} else {
- cat(paste("During execution of the program,", length(error_vec), "error messages were generated. The error \nmessages are stored in a vector named 'error_vec'. Enter the following \ncommand to view the error messages: errorprnt()\n"))
+ message(paste("During execution of the program,", length(error_vec), "error messages were generated. The error \nmessages are stored in a vector named 'error_vec'. Enter the following \ncommand to view the error messages: errorprnt()\n"))
}
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
stop("See the preceding message(s).")
@@ -1228,9 +1228,9 @@ attrisk_analysis <- function(dframe, vars_response, vars_stressor, response_leve
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
diff --git a/R/cat_analysis.R b/R/cat_analysis.R
index 60c0b6d..1360733 100644
--- a/R/cat_analysis.R
+++ b/R/cat_analysis.R
@@ -493,17 +493,17 @@ cat_analysis <- function(dframe, vars, subpops = NULL, siteID = NULL, weight = "
if (error_ind) {
error_vec <<- error_vec
if (length(error_vec) == 1) {
- cat("During execution of the program, an error message was generated. The error \nmessage is stored in a vector named 'error_vec'. Enter the following command \nto view the error message: errorprnt()\n")
+ message("During execution of the program, an error message was generated. The error \nmessage is stored in a vector named 'error_vec'. Enter the following command \nto view the error message: errorprnt()\n")
} else {
- cat(paste("During execution of the program,", length(error_vec), "error messages were generated. The error \nmessages are stored in a vector named 'error_vec'. Enter the following \ncommand to view the error messages: errorprnt()\n"))
+ message(paste("During execution of the program,", length(error_vec), "error messages were generated. The error \nmessages are stored in a vector named 'error_vec'. Enter the following \ncommand to view the error messages: errorprnt()\n"))
}
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
stop("See the preceding message(s).")
@@ -635,9 +635,9 @@ cat_analysis <- function(dframe, vars, subpops = NULL, siteID = NULL, weight = "
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
diff --git a/R/change_analysis.R b/R/change_analysis.R
index 1ac3169..712d304 100644
--- a/R/change_analysis.R
+++ b/R/change_analysis.R
@@ -836,17 +836,17 @@ change_analysis <- function(dframe, vars_cat = NULL, vars_cont = NULL, test = "m
if (error_ind) {
error_vec <<- error_vec
if (length(error_vec) == 1) {
- cat("During execution of the program, an error message was generated. The error \nmessage is stored in a vector named 'error_vec'. Enter the following command \nto view the error message: errorprnt()\n")
+ message("During execution of the program, an error message was generated. The error \nmessage is stored in a vector named 'error_vec'. Enter the following command \nto view the error message: errorprnt()\n")
} else {
- cat(paste("During execution of the program,", length(error_vec), "error messages were generated. The error \nmessages are stored in a vector named 'error_vec'. Enter the following \ncommand to view the error messages: errorprnt()\n"))
+ message(paste("During execution of the program,", length(error_vec), "error messages were generated. The error \nmessages are stored in a vector named 'error_vec'. Enter the following \ncommand to view the error messages: errorprnt()\n"))
}
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
stop("See the preceding message(s).")
@@ -1061,9 +1061,9 @@ change_analysis <- function(dframe, vars_cat = NULL, vars_cont = NULL, test = "m
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
diff --git a/R/cont_analysis.R b/R/cont_analysis.R
index 029bdcb..09c82ae 100644
--- a/R/cont_analysis.R
+++ b/R/cont_analysis.R
@@ -374,17 +374,17 @@ cont_analysis <- function(dframe, vars, subpops = NULL, siteID = NULL,
if (error_ind) {
error_vec <<- error_vec
if (length(error_vec) == 1) {
- cat("During execution of the program, an error message was generated. The error \nmessage is stored in a vector named 'error_vec'. Enter the following command \nto view the error message: errorprnt()\n")
+ message("During execution of the program, an error message was generated. The error \nmessage is stored in a vector named 'error_vec'. Enter the following command \nto view the error message: errorprnt()\n")
} else {
- cat(paste("During execution of the program,", length(error_vec), "error messages were generated. The error \nmessages are stored in a vector named 'error_vec'. Enter the following \ncommand to view the error messages: errorprnt()\n"))
+ message(paste("During execution of the program,", length(error_vec), "error messages were generated. The error \nmessages are stored in a vector named 'error_vec'. Enter the following \ncommand to view the error messages: errorprnt()\n"))
}
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
stop("See the preceding message(s).")
@@ -563,9 +563,9 @@ cont_analysis <- function(dframe, vars, subpops = NULL, siteID = NULL,
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
diff --git a/R/cont_cdftest.R b/R/cont_cdftest.R
index 4282003..813fab9 100644
--- a/R/cont_cdftest.R
+++ b/R/cont_cdftest.R
@@ -565,17 +565,17 @@ cont_cdftest <- function(dframe, vars, subpops = NULL, surveyID = NULL, siteID =
if (error_ind) {
error_vec <<- error_vec
if (length(error_vec) == 1) {
- cat("During execution of the program, an error message was generated. The error \nmessage is stored in a vector named 'error_vec'. Enter the following command \nto view the error message: errorprnt()\n")
+ message("During execution of the program, an error message was generated. The error \nmessage is stored in a vector named 'error_vec'. Enter the following command \nto view the error message: errorprnt()\n")
} else {
- cat(paste("During execution of the program,", length(error_vec), "error messages were generated. The error \nmessages are stored in a vector named 'error_vec'. Enter the following \ncommand to view the error messages: errorprnt()\n"))
+ message(paste("During execution of the program,", length(error_vec), "error messages were generated. The error \nmessages are stored in a vector named 'error_vec'. Enter the following \ncommand to view the error messages: errorprnt()\n"))
}
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
stop("See the preceding message(s).")
@@ -865,9 +865,9 @@ cont_cdftest <- function(dframe, vars, subpops = NULL, surveyID = NULL, siteID =
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
diff --git a/R/diffrisk_analysis.R b/R/diffrisk_analysis.R
index a058261..365c77e 100644
--- a/R/diffrisk_analysis.R
+++ b/R/diffrisk_analysis.R
@@ -406,17 +406,17 @@ diffrisk_analysis <- function(dframe, vars_response, vars_stressor, response_lev
if (error_ind) {
error_vec <<- error_vec
if (length(error_vec) == 1) {
- cat("During execution of the program, an error message was generated. The error \nmessage is stored in a vector named 'error_vec'. Enter the following command \nto view the error message: errorprnt()\n")
+ message("During execution of the program, an error message was generated. The error \nmessage is stored in a vector named 'error_vec'. Enter the following command \nto view the error message: errorprnt()\n")
} else {
- cat(paste("During execution of the program,", length(error_vec), "error messages were generated. The error \nmessages are stored in a vector named 'error_vec'. Enter the following \ncommand to view the error messages: errorprnt()\n"))
+ message(paste("During execution of the program,", length(error_vec), "error messages were generated. The error \nmessages are stored in a vector named 'error_vec'. Enter the following \ncommand to view the error messages: errorprnt()\n"))
}
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
stop("See the preceding message(s).")
@@ -684,9 +684,9 @@ diffrisk_analysis <- function(dframe, vars_response, vars_stressor, response_lev
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
diff --git a/R/dsgn_check.R b/R/dsgn_check.R
index c09561a..813da71 100644
--- a/R/dsgn_check.R
+++ b/R/dsgn_check.R
@@ -424,9 +424,9 @@ dsgn_check <- function(sframe, sf_type, legacy_sites, legacy_option, stratum, se
if (stop_ind) {
names(stop_df) <- c("Design Input", "Error Message")
stop_df <<- stop_df
- cat("During the check of the input to grtspts, one or more errors were identified.\n")
- cat("Enter the following command to view all input error messages: stopprnt()\n")
- cat("To view a subset of the errors (e.g., errors 1 and 5) enter stopprnt(m=c(1,5))\n\n")
+ message("During the check of the input to grtspts, one or more errors were identified.\n")
+ message("Enter the following command to view all input error messages: stopprnt()\n")
+ message("To view a subset of the errors (e.g., errors 1 and 5) enter stopprnt(m=c(1,5))\n\n")
opt <- options(show.error.messages = FALSE)
on.exit(options(opt))
stop()
diff --git a/R/errorprnt.R b/R/errorprnt.R
index 6ea3d91..af8aacd 100644
--- a/R/errorprnt.R
+++ b/R/errorprnt.R
@@ -21,8 +21,8 @@
errorprnt <- function(error_vec = get("error_vec", envir = .GlobalEnv)) {
m <- 1:length(error_vec)
for (i in m) {
- cat(paste0("Error Message ", i, ":\n"))
- cat(paste(error_vec[i], "\n"))
+ message(paste0("Error Message ", i, ":\n"))
+ message(paste(error_vec[i], "\n"))
}
invisible(NULL)
diff --git a/R/grts.R b/R/grts.R
index cea09d6..2ab7ff4 100644
--- a/R/grts.R
+++ b/R/grts.R
@@ -930,9 +930,9 @@ grts <- function(sframe, n_base, stratum_var = NULL, seltype = NULL, caty_var =
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
diff --git a/R/grts_stratum.R b/R/grts_stratum.R
index 27e97cf..c873346 100644
--- a/R/grts_stratum.R
+++ b/R/grts_stratum.R
@@ -185,8 +185,8 @@ grts_stratum <- function(stratum, dsgn, sframe, sf_type, wgt_units = NULL, pt_de
# check that number of legacy sites is less than or equal number of base sites
# stop if not
if (n_legacy > n_base) {
- cat("Number of legacy sites is greater than number of base sites in at least one\n")
- cat("stratum. Please check that all strata have fewer legacy sites than base sites.\n")
+ message("Number of legacy sites is greater than number of base sites in at least one\n")
+ message("stratum. Please check that all strata have fewer legacy sites than base sites.\n")
opt <- options(show.error.messages = FALSE)
on.exit(options(opt))
stop()
diff --git a/R/irs.R b/R/irs.R
index 8bf442d..e4d7474 100644
--- a/R/irs.R
+++ b/R/irs.R
@@ -630,9 +630,9 @@ irs <- function(sframe, n_base, stratum_var = NULL, seltype = NULL, caty_var = N
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
diff --git a/R/irs_stratum.R b/R/irs_stratum.R
index 756c7a7..a48c920 100644
--- a/R/irs_stratum.R
+++ b/R/irs_stratum.R
@@ -156,8 +156,8 @@ irs_stratum <- function(stratum, dsgn, sframe, sf_type, wgt_units = NULL, pt_den
# check that number of legacy sites is less than or equal number of base sites
# stop if not
if (n_legacy > n_base) {
- cat("Number of legacy sites is greater than number of base sites in at least one\n")
- cat("stratum. Please check that all strata have fewer legacy sites than base sites.\n")
+ message("Number of legacy sites is greater than number of base sites in at least one\n")
+ message("stratum. Please check that all strata have fewer legacy sites than base sites.\n")
opt <- options(show.error.messages = FALSE)
on.exit(options(opt))
stop()
diff --git a/R/relrisk_analysis.R b/R/relrisk_analysis.R
index b365c7a..1c21b1a 100644
--- a/R/relrisk_analysis.R
+++ b/R/relrisk_analysis.R
@@ -424,17 +424,17 @@ relrisk_analysis <- function(dframe, vars_response, vars_stressor, response_leve
if (error_ind) {
error_vec <<- error_vec
if (length(error_vec) == 1) {
- cat("During execution of the program, an error message was generated. The error \nmessage is stored in a vector named 'error_vec'. Enter the following command \nto view the error message: errorprnt()\n")
+ message("During execution of the program, an error message was generated. The error \nmessage is stored in a vector named 'error_vec'. Enter the following command \nto view the error message: errorprnt()\n")
} else {
- cat(paste("During execution of the program,", length(error_vec), "error messages were generated. The error \nmessages are stored in a vector named 'error_vec'. Enter the following \ncommand to view the error messages: errorprnt()\n"))
+ message(paste("During execution of the program,", length(error_vec), "error messages were generated. The error \nmessages are stored in a vector named 'error_vec'. Enter the following \ncommand to view the error messages: errorprnt()\n"))
}
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
stop("See the preceding message(s).")
@@ -980,9 +980,9 @@ relrisk_analysis <- function(dframe, vars_response, vars_stressor, response_leve
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
diff --git a/R/stopprnt.R b/R/stopprnt.R
index 8ce04f9..d28a072 100644
--- a/R/stopprnt.R
+++ b/R/stopprnt.R
@@ -25,10 +25,10 @@
stopprnt <- function(stop_df = get("stop_df", envir = .GlobalEnv),
m = 1:nrow(stop_df)) {
- cat(paste("Input ", "Error Message\n"))
+ message(paste("Input ", "Error Message\n"))
for (i in m) {
- cat(paste(stop_df[i, 1], ": ", stop_df[i, 2], "\n"))
+ message(paste(stop_df[i, 1], ": ", stop_df[i, 2], "\n"))
}
invisible(NULL)
diff --git a/R/trend_analysis.R b/R/trend_analysis.R
index 4c9c981..09d0475 100644
--- a/R/trend_analysis.R
+++ b/R/trend_analysis.R
@@ -711,17 +711,17 @@ trend_analysis <- function(dframe, vars_cat = NULL, vars_cont = NULL, subpops =
if (error_ind) {
error_vec <<- error_vec
if (length(error_vec) == 1) {
- cat("During execution of the program, an error message was generated. The error \nmessage is stored in a vector named 'error_vec'. Enter the following command \nto view the error message: errorprnt()\n")
+ message("During execution of the program, an error message was generated. The error \nmessage is stored in a vector named 'error_vec'. Enter the following command \nto view the error message: errorprnt()\n")
} else {
- cat(paste("During execution of the program,", length(error_vec), "error messages were generated. The error \nmessages are stored in a vector named 'error_vec'. Enter the following \ncommand to view the error messages: errorprnt()\n"))
+ message(paste("During execution of the program,", length(error_vec), "error messages were generated. The error \nmessages are stored in a vector named 'error_vec'. Enter the following \ncommand to view the error messages: errorprnt()\n"))
}
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
stop("See the preceding message(s).")
@@ -1727,9 +1727,9 @@ trend_analysis <- function(dframe, vars_cat = NULL, vars_cont = NULL, subpops =
if (warn_ind) {
warn_df <<- warn_df
if (nrow(warn_df) == 1) {
- cat("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
+ message("During execution of the program, a warning message was generated. The warning \nmessage is stored in a data frame named 'warn_df'. Enter the following command \nto view the warning message: warnprnt()\n")
} else {
- cat(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
+ message(paste("During execution of the program,", nrow(warn_df), "warning messages were generated. The warning \nmessages are stored in a data frame named 'warn_df'. Enter the following \ncommand to view the warning messages: warnprnt() \nTo view a subset of the warning messages (say, messages number 1, 3, and 5), \nenter the following command: warnprnt(m=c(1,3,5))\n"))
}
}
diff --git a/R/warnprnt.R b/R/warnprnt.R
index e8d01a2..574cdb6 100644
--- a/R/warnprnt.R
+++ b/R/warnprnt.R
@@ -37,27 +37,27 @@ warnprnt <- function(warn_df = get("warn_df", envir = .GlobalEnv),
for (i in m) {
if ("Warning" %in% names(warn_df)) {
- cat(paste0("Warning Message ", i, ":\n"))
- cat(paste("Stratum:", warn_df$stratum[i], "\n"))
- cat(paste("Warning:", warn_df$Warning[i], "\n"))
+ message(paste0("Warning Message ", i, ":\n"))
+ message(paste("Stratum:", warn_df$stratum[i], "\n"))
+ message(paste("Warning:", warn_df$Warning[i], "\n"))
} else {
- cat(paste0("Warning Message ", i, ":\n"))
- # cat(paste("Function:", warn_df$func[i], "\n")) # removed function name output
+ message(paste0("Warning Message ", i, ":\n"))
+ # message(paste("Function:", warn_df$func[i], "\n")) # removed function name output
if (sum(!is.null(warn_df$subpoptype[i]), is.na(warn_df$subpoptype[i]))) {
- cat(paste("Population Type:", warn_df$subpoptype[i], "\n"))
+ message(paste("Population Type:", warn_df$subpoptype[i], "\n"))
}
if (sum(!is.null(warn_df$subpop[i]), is.na(warn_df$subpop[i]))) {
- cat(paste("Subpopulation:", warn_df$subpop[i], "\n"))
+ message(paste("Subpopulation:", warn_df$subpop[i], "\n"))
}
if (sum(!is.null(warn_df$indicator[i]), is.na(warn_df$indicator[i]))) {
- cat(paste("Indicator:", warn_df$indicator[i], "\n"))
+ message(paste("Indicator:", warn_df$indicator[i], "\n"))
}
if (sum(!is.null(warn_df$stratum[i]), is.na(warn_df$stratum[i]))) {
- cat(paste("Stratum:", warn_df$stratum[i], "\n"))
+ message(paste("Stratum:", warn_df$stratum[i], "\n"))
}
- cat(paste("Warning:", warn_df$warning[i]))
+ message(paste("Warning:", warn_df$warning[i]))
if (sum(!is.null(warn_df$action[i]), is.na(warn_df$action[i]))) {
- cat(paste("Action:", warn_df$action[i], "\n"))
+ message(paste("Action:", warn_df$action[i], "\n"))
}
}
}
diff --git a/tests/testthat/test-attrisk_analysis.R b/tests/testthat/test-attrisk_analysis.R
index a94335d..718256c 100644
--- a/tests/testthat/test-attrisk_analysis.R
+++ b/tests/testthat/test-attrisk_analysis.R
@@ -270,3 +270,14 @@ test_that("Attributable Risk: with finite population correction factor", {
expect_equal(attributes(AttRisk_Estimates)$class, "data.frame")
expect_equal(nrow(AttRisk_Estimates), 6)
})
+
+test_that("A warning (in message form) is produced", {
+ expect_message(expect_error(attrisk_analysis(
+ dframe = NLA_IN,
+ vars_response = vars_response, vars_stressor = vars_stressor,
+ subpops = subpops, siteID = "SITE_ID", weight = "XYZ", xcoord = "XCOORD",
+ ycoord = "YCOORD", stratumID = "URBN_NLA17", clusterID = "clusterID",
+ weight1 = "weight1", xcoord1 = "xcoord1", ycoord1 = "ycoord1",
+ fpc = fpc4a, vartype = "SRS"
+ )))
+})
diff --git a/tests/testthat/test-cat_analysis.R b/tests/testthat/test-cat_analysis.R
index 8893509..e2242f4 100644
--- a/tests/testthat/test-cat_analysis.R
+++ b/tests/testthat/test-cat_analysis.R
@@ -324,3 +324,11 @@ test_that("Categorical: Unstratified single-stage analysis, YG-HR variance", {
expect_equal(attributes(Condition_Estimates)$class, "data.frame")
expect_equal(nrow(Condition_Estimates), 9)
})
+
+test_that("A warning (in message form) is produced", {
+ expect_message(expect_error(cat_analysis(
+ dframe = NLA_IN, vars = vars,
+ subpops = subpops, siteID = "SITE_ID", weight = "XYZ", vartype = "YG",
+ jointprob = "hr"
+ )))
+})
diff --git a/tests/testthat/test-change_analysis.R b/tests/testthat/test-change_analysis.R
index 5d4a4e9..e2d86ee 100644
--- a/tests/testthat/test-change_analysis.R
+++ b/tests/testthat/test-change_analysis.R
@@ -302,6 +302,17 @@ test_that("Change: with finite population correction factor", {
expect_equal(nrow(Change_Estimates$contsum_median), 2)
})
+test_that("A warning (in message form) is produced", {
+ expect_message(expect_error(change_analysis(
+ dframe = dframe, vars_cat = vars_cat,
+ vars_cont = vars_cont, test = c("mean", "total", "median"), subpops = subpops,
+ surveyID = "YEAR", siteID = "UNIQUE_ID", weight = "XYZ", xcoord = "XCOORD",
+ ycoord = "YCOORD", stratumID = "LAKE_ORGN", clusterID = "clusterID",
+ weight1 = "weight1", xcoord1 = "xcoord1", ycoord1 = "ycoord1",
+ fpc = fpc4b, vartype = "SRS"
+ )))
+})
+
test_that("Change for totals matches cont_analysis()", {
set.seed(1)
dframe <- data.frame(
diff --git a/tests/testthat/test-cont_analysis.R b/tests/testthat/test-cont_analysis.R
index a2976d0..10e375f 100644
--- a/tests/testthat/test-cont_analysis.R
+++ b/tests/testthat/test-cont_analysis.R
@@ -298,3 +298,12 @@ test_that("Continuous: with finite population correction factor", {
expect_equal(nrow(CDF_Estimates$Mean), 3)
expect_equal(nrow(CDF_Estimates$Total), 3)
})
+
+test_that("A warning (in message form) is produced", {
+ expect_message(expect_error(cont_analysis(
+ dframe = dframe, vars = vars, subpops = subpops,
+ siteID = "SITE_ID", weight = "XYZ", xcoord = "XCOORD", ycoord = "YCOORD",
+ stratumID = "URBN_NLA17", clusterID = "clusterID", weight1 = "weight1",
+ xcoord1 = "xcoord1", ycoord1 = "ycoord1", fpc = fpc4a, vartype = "SRS"
+ )))
+})
diff --git a/tests/testthat/test-diffrisk_analysis.R b/tests/testthat/test-diffrisk_analysis.R
index 44a1c0f..98a50f8 100644
--- a/tests/testthat/test-diffrisk_analysis.R
+++ b/tests/testthat/test-diffrisk_analysis.R
@@ -270,3 +270,14 @@ test_that("Risk Difference: with finite population correction factor", {
expect_equal(attributes(DiffRisk_Estimates)$class, "data.frame")
expect_equal(nrow(DiffRisk_Estimates), 6)
})
+
+test_that("A warning (in message form) is produced", {
+ expect_message(expect_error(diffrisk_analysis(
+ dframe = NLA_IN,
+ vars_response = vars_response, vars_stressor = vars_stressor,
+ subpops = subpops, siteID = "SITE_ID", weight = "XYZ", xcoord = "XCOORD",
+ ycoord = "YCOORD", stratumID = "URBN_NLA17", clusterID = "clusterID",
+ weight1 = "weight1", xcoord1 = "xcoord1", ycoord1 = "ycoord1",
+ fpc = fpc4a, vartype = "SRS"
+ )))
+})
\ No newline at end of file
diff --git a/tests/testthat/test-grts.R b/tests/testthat/test-grts.R
index 2c56984..97d5ae4 100644
--- a/tests/testthat/test-grts.R
+++ b/tests/testthat/test-grts.R
@@ -238,6 +238,11 @@ if (on_solaris) {
expect_equal(NCOL(grts_output$sites_near), 1)
})
+ test_that("A warning (in message form) is produced", {
+ n_base <- c(low = 20, high = 30)
+ expect_message(grts(NE_Lakes, n_base = n_base, stratum_var = "XYZ"))
+
+ })
#--------------------------------------
#-------- Legacy
#--------------------------------------
diff --git a/tests/testthat/test-irs.R b/tests/testthat/test-irs.R
index 31a2c04..1df551c 100644
--- a/tests/testthat/test-irs.R
+++ b/tests/testthat/test-irs.R
@@ -238,6 +238,12 @@ if (on_solaris) {
expect_equal(NCOL(irs_output$sites_near), 1)
})
+ test_that("A warning (in message form) is produced", {
+ n_base <- c(low = 20, high = 30)
+ expect_message(irs(NE_Lakes, n_base = n_base, stratum_var = "XYZ"))
+
+ })
+
#--------------------------------------
#-------- Legacy
#--------------------------------------
diff --git a/tests/testthat/test-relrisk_analysis.R b/tests/testthat/test-relrisk_analysis.R
index b0afc70..b75f361 100644
--- a/tests/testthat/test-relrisk_analysis.R
+++ b/tests/testthat/test-relrisk_analysis.R
@@ -270,3 +270,14 @@ test_that("Relative Risk: with finite population correction factor", {
expect_equal(attributes(RelRisk_Estimates)$class, "data.frame")
expect_equal(nrow(RelRisk_Estimates), 6)
})
+
+test_that("A warning (in message form) is produced", {
+ expect_message(expect_error(relrisk_analysis(
+ dframe = NLA_IN,
+ vars_response = vars_response, vars_stressor = vars_stressor,
+ subpops = subpops, siteID = "SITE_ID", weight = "XYZ", xcoord = "XCOORD",
+ ycoord = "YCOORD", stratumID = "URBN_NLA17", clusterID = "clusterID",
+ weight1 = "weight1", xcoord1 = "xcoord1", ycoord1 = "ycoord1",
+ fpc = fpc4a, vartype = "SRS"
+ )))
+})
\ No newline at end of file
diff --git a/tests/testthat/test-trend_analysis.R b/tests/testthat/test-trend_analysis.R
index e73820b..5a53261 100644
--- a/tests/testthat/test-trend_analysis.R
+++ b/tests/testthat/test-trend_analysis.R
@@ -247,3 +247,13 @@ test_that("Trend: with finite population correction factor", {
expect_equal(nrow(Trend_Estimates$catsum), 6)
expect_equal(nrow(Trend_Estimates$contsum), 3)
})
+
+test_that("A warning (in message form) is produced", {
+ expect_message(expect_error(trend_analysis(
+ dframe = NLA_IN, vars_cat = vars_cat,
+ vars_cont = vars_cont, model_cont = "SLR", subpops = subpops,
+ siteID = "UNIQUE_ID", weight = "XYZ", xcoord = "XCOORD", ycoord = "YCOORD",
+ stratumID = "LAKE_ORGN", clusterID = "clusterID", weight1 = "weight1",
+ xcoord1 = "xcoord1", ycoord1 = "ycoord1", fpc = fpc4b, vartype = "SRS"
+ )))
+})
From ccde031def36f981ba82fbe26b99cd85c0441d12 Mon Sep 17 00:00:00 2001
From: Michael Dumelle
Date: Thu, 9 Feb 2023 13:10:14 -0800
Subject: [PATCH 06/12] Fixed error in optional tests for new message printing
(instead of cat printing) for grts and irs functions
---
tests/testthat/test-grts.R | 4 ++--
tests/testthat/test-irs.R | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/tests/testthat/test-grts.R b/tests/testthat/test-grts.R
index 97d5ae4..c5c5927 100644
--- a/tests/testthat/test-grts.R
+++ b/tests/testthat/test-grts.R
@@ -240,9 +240,9 @@ if (on_solaris) {
test_that("A warning (in message form) is produced", {
n_base <- c(low = 20, high = 30)
- expect_message(grts(NE_Lakes, n_base = n_base, stratum_var = "XYZ"))
-
+ expect_message(expect_error(grts(NE_Lakes, n_base = n_base, stratum_var = "XYZ")))
})
+
#--------------------------------------
#-------- Legacy
#--------------------------------------
diff --git a/tests/testthat/test-irs.R b/tests/testthat/test-irs.R
index 1df551c..742c576 100644
--- a/tests/testthat/test-irs.R
+++ b/tests/testthat/test-irs.R
@@ -240,7 +240,7 @@ if (on_solaris) {
test_that("A warning (in message form) is produced", {
n_base <- c(low = 20, high = 30)
- expect_message(irs(NE_Lakes, n_base = n_base, stratum_var = "XYZ"))
+ expect_message(expect_error(irs(NE_Lakes, n_base = n_base, stratum_var = "XYZ")))
})
From 010aa5123af0a02baeffa83f4da9ac9b753b55f3 Mon Sep 17 00:00:00 2001
From: Michael Dumelle
Date: Thu, 9 Feb 2023 13:10:56 -0800
Subject: [PATCH 07/12] Updated version number to 5.5.0
---
DESCRIPTION | 2 +-
NAMESPACE | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/DESCRIPTION b/DESCRIPTION
index 461c195..1637952 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,6 +1,6 @@
Package: spsurvey
Title: Spatial Sampling Design and Analysis
-Version: 5.4.2
+Version: 5.5.0
Authors@R: c(
person("Michael", "Dumelle", role=c("aut","cre"),
email = "Dumelle.Michael@epa.gov", comment = c(ORCID = "0000-0002-3393-5529")),
diff --git a/NAMESPACE b/NAMESPACE
index 14b1985..c67f89d 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -15,6 +15,7 @@ S3method(sp_summary,sp_design)
S3method(summary,sp_design)
S3method(summary,sp_frame)
export(adjwgt)
+export(adjwgtNR)
export(ash1_wgt)
export(attrisk_analysis)
export(cat_analysis)
From 96da44cd8eced4c2f669c0aa4e91022b4dcd71a4 Mon Sep 17 00:00:00 2001
From: Michael Dumelle
Date: Thu, 9 Feb 2023 13:11:22 -0800
Subject: [PATCH 08/12] added adjwgtNR function for non-response weight
adjustments
---
NEWS.md | 3 +-
R/adjwgtNR.R | 75 ++++++++++++++++++++++++++++++++++
man/adjwgtNR.Rd | 61 +++++++++++++++++++++++++++
tests/testthat/test-adjwgtNR.R | 41 +++++++++++++++++++
4 files changed, 179 insertions(+), 1 deletion(-)
create mode 100644 R/adjwgtNR.R
create mode 100644 man/adjwgtNR.Rd
create mode 100644 tests/testthat/test-adjwgtNR.R
diff --git a/NEWS.md b/NEWS.md
index 0a82a49..794b551 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,7 +1,8 @@
-# spsurvey 5.4.2
+# spsurvey 5.5.0
## Minor Updates
+* Added an `adjwgtNR()` function to perform non-response weight adjustments.
* Changed default behavior in `attrisk_analysis()`, `diffrisk_analysis()`, and
`relrisk_analysis()` regarding the handling of `response_levels` and `stressor_levels`.
Previously, if `response_levels` and `stressor_levels` were specified,
diff --git a/R/adjwgtNR.R b/R/adjwgtNR.R
new file mode 100644
index 0000000..bb82673
--- /dev/null
+++ b/R/adjwgtNR.R
@@ -0,0 +1,75 @@
+############################################################################
+# Function: adjwgtNR (exported)
+# Programmer: Tony Olsen
+# Date: April 5, 2022
+#
+#' Adjust survey design weights for non-response by categories
+#'
+#' @description Adjust weights for target sample units that do not respond
+#' and are missing at random within categories. The missing at random
+#' assumption implies that their sample weight may be assigned to
+#' specific categories of units that have responded (i.e., have been
+#' sampled). This is a class-based method for non-response adjustment.
+#'
+#' @param wgt vector of weights for each sample unit that will be adjusted
+#' for non-response. Weights must be weights for the design as implemented.
+#' All weights must be greater than zero.
+#'
+#' @param MARClass vector that identifies for each sample unit the category
+#' that will be used in non-response weight adjustment for sample units
+#' that are known to be target. Within each missing at random (MAR)
+#' category, the missing sample units that are not sampled are assumed to
+#' be missing at random.
+#'
+#' @param EvalStatus vector of the evaluation status for each sample unit.
+#' Values must include the values given in TNRclass and TRClass. May
+#' include other values not required for the non-response adjustment.
+#'
+#' @param TNRClass subset of values in EvalStatus that identify sample units
+#' whose target status is known and that do not respond (i.e., are not
+#' sampled).
+#'
+#' @param TRClass Subset of values in EvalStatus that identify sample units
+#' whose target status is known and that respond (i.e., are target and
+#' sampled).
+#'
+#' @return Vector of sample unit weights that are adjusted for non-response
+#' and that is the same length of input weights. Weights for sample
+#' units that did not response but were known to be eligible are set
+#' to zero. Weights for all other sample units are also set to zero.
+#'
+#' @export
+#'
+#' @author Tony Olsen \email{olsen.tony@epa.gov}
+#'
+#' @keywords survey non-response weight adjustment
+#'
+#' @examples
+#' set.seed(5)
+#' wgt <- runif(40)
+#' MARClass <- rep(c("A", "B"), rep(20, 2))
+#' EvalStatus <- sample(c("Not_Target", "Target_Sampled", "Target_Not_Sampled"), 40, replace = TRUE)
+#' TNRClass <- "Target_Not_Sampled"
+#' TRClass <- "Target_Sampled"
+#' adjwgtNR(wgt, MARClass, EvalStatus, TNRClass, TRClass)
+#' # function that has an error check
+adjwgtNR <- function(wgt, MARClass, EvalStatus, TNRClass, TRClass){
+ tstTNRClass <- EvalStatus %in% c(TNRClass)
+ tstTRClass <- EvalStatus %in% c(TRClass)
+ num <- tapply(wgt[tstTNRClass | tstTRClass],
+ MARClass[tstTNRClass | tstTRClass], sum)
+ den <- tapply(wgt[tstTRClass], MARClass[tstTRClass], sum)
+ # error check
+ # could use any(! unique(MARClass[tstTNRClass]) %in% unique(MARClass[tstTRClass]))
+ if (length(num) > length(den)) {
+ stop("At least one level of MARClass does not have any EvalStatus values in
+ TRClass, so no non-response weight adjustment can be performed.
+ Consider aggregating categories so that all levels of MARClass are
+ instead in TRClass.", call. = FALSE)
+ }
+ ar <- num/den[match(names(num), names(den))]
+ wgt[tstTRClass] <- wgt[tstTRClass] *
+ ar[match(MARClass, names(ar))][tstTRClass]
+ wgt[!tstTRClass] <- 0
+ as.vector(wgt)
+}
\ No newline at end of file
diff --git a/man/adjwgtNR.Rd b/man/adjwgtNR.Rd
new file mode 100644
index 0000000..dc2be0b
--- /dev/null
+++ b/man/adjwgtNR.Rd
@@ -0,0 +1,61 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/adjwgtNR.R
+\name{adjwgtNR}
+\alias{adjwgtNR}
+\title{Adjust survey design weights for non-response by categories}
+\usage{
+adjwgtNR(wgt, MARClass, EvalStatus, TNRClass, TRClass)
+}
+\arguments{
+\item{wgt}{vector of weights for each sample unit that will be adjusted
+for non-response. Weights must be weights for the design as implemented.
+All weights must be greater than zero.}
+
+\item{MARClass}{vector that identifies for each sample unit the category
+that will be used in non-response weight adjustment for sample units
+that are known to be target. Within each missing at random (MAR)
+category, the missing sample units that are not sampled are assumed to
+be missing at random.}
+
+\item{EvalStatus}{vector of the evaluation status for each sample unit.
+Values must include the values given in TNRclass and TRClass. May
+include other values not required for the non-response adjustment.}
+
+\item{TNRClass}{subset of values in EvalStatus that identify sample units
+whose target status is known and that do not respond (i.e., are not
+sampled).}
+
+\item{TRClass}{Subset of values in EvalStatus that identify sample units
+whose target status is known and that respond (i.e., are target and
+sampled).}
+}
+\value{
+Vector of sample unit weights that are adjusted for non-response
+ and that is the same length of input weights. Weights for sample
+ units that did not response but were known to be eligible are set
+ to zero. Weights for all other sample units are also set to zero.
+}
+\description{
+Adjust weights for target sample units that do not respond
+and are missing at random within categories. The missing at random
+assumption implies that their sample weight may be assigned to
+specific categories of units that have responded (i.e., have been
+sampled). This is a class-based method for non-response adjustment.
+}
+\examples{
+set.seed(5)
+wgt <- runif(40)
+MARClass <- rep(c("A", "B"), rep(20, 2))
+EvalStatus <- sample(c("Not_Target", "Target_Sampled", "Target_Not_Sampled"), 40, replace = TRUE)
+TNRClass <- "Target_Not_Sampled"
+TRClass <- "Target_Sampled"
+adjwgtNR(wgt, MARClass, EvalStatus, TNRClass, TRClass)
+# function that has an error check
+}
+\author{
+Tony Olsen \email{olsen.tony@epa.gov}
+}
+\keyword{adjustment}
+\keyword{non-response}
+\keyword{survey}
+\keyword{weight}
diff --git a/tests/testthat/test-adjwgtNR.R b/tests/testthat/test-adjwgtNR.R
new file mode 100644
index 0000000..3274ce8
--- /dev/null
+++ b/tests/testthat/test-adjwgtNR.R
@@ -0,0 +1,41 @@
+context("weight adjustment non-response")
+
+set.seed(5)
+
+test_that("adjust weight non-response works no extra Eval", {
+ wgt <- runif(30)
+ MARClass <- rep(c("A", "B"), rep(15, 2))
+ EvalStatus <- rep(c("Target_Sampled", "Target_Not_Sampled"), 15)
+ TNRClass <- "Target_Not_Sampled"
+ TRClass <- "Target_Sampled"
+ wgt_new <- adjwgtNR(wgt, MARClass, EvalStatus, TNRClass, TRClass)
+ wgtsums <- sum(wgt_new[EvalStatus == "Target_Sampled"])
+ wgtzeros <- sum(wgt_new[EvalStatus == "Target_Not_Sampled"])
+ expect_equal(sum(wgt), wgtsums)
+ expect_equal(0, wgtzeros)
+
+ # error returned
+ EvalStatus[EvalStatus == "Target_Sampled"] <- "Target_Not_Sampled"
+ expect_error(adjwgtNR(wgt, MARClass, EvalStatus, TNRClass, TRClass))
+})
+
+test_that("adjust weight non-response works extra Eval", {
+
+ wgt <- runif(30)
+ MARClass <- rep(c("A", "B"), rep(15, 2))
+ EvalStatus <- rep(c("Not_Target", "Target_Sampled", "Target_Not_Sampled"), 10)
+ TNRClass <- "Target_Not_Sampled"
+ TRClass <- "Target_Sampled"
+ wgt_new <- adjwgtNR(wgt, MARClass, EvalStatus, TNRClass, TRClass)
+ wgtsums <- sum(wgt_new[EvalStatus == "Target_Sampled"])
+ wgtzeros <- sum(wgt_new[EvalStatus == "Target_Not_Sampled"])
+ expect_equal(sum(wgt[EvalStatus %in% c("Target_Not_Sampled", "Target_Sampled")]), wgtsums)
+ expect_equal(0, wgtzeros)
+ wgtzeros_extra <- sum(wgt_new[!EvalStatus %in% c("Target_Not_Sampled", "Target_Sampled")])
+ expect_equal(0, wgtzeros)
+
+ # error returned
+ EvalStatus[EvalStatus == "Target_Sampled"] <- "Not_Target"
+ expect_error(adjwgtNR(wgt, MARClass, EvalStatus, TNRClass, TRClass))
+})
+
From a44eda0be46dc3d4b7de73856563b9ac41721c51 Mon Sep 17 00:00:00 2001
From: Michael Dumelle
Date: Tue, 14 Mar 2023 11:24:43 -0700
Subject: [PATCH 09/12] recycling length one vector in n_over for stratified
design with grts() or irs()
---
NEWS.md | 1 +
R/dsgn_check.R | 11 ++++++++++-
R/grts.R | 7 +++++--
man/grts.Rd | 4 +++-
man/irs.Rd | 4 +++-
5 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/NEWS.md b/NEWS.md
index 794b551..a0c7004 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -2,6 +2,7 @@
## Minor Updates
+* `n_over` is now recycled if the design is stratified and `n_over` is a length-one numeric vector
* Added an `adjwgtNR()` function to perform non-response weight adjustments.
* Changed default behavior in `attrisk_analysis()`, `diffrisk_analysis()`, and
`relrisk_analysis()` regarding the handling of `response_levels` and `stressor_levels`.
diff --git a/R/dsgn_check.R b/R/dsgn_check.R
index 813da71..74445e6 100644
--- a/R/dsgn_check.R
+++ b/R/dsgn_check.R
@@ -362,6 +362,15 @@ dsgn_check <- function(sframe, sf_type, legacy_sites, legacy_option, stratum, se
stop_mess <- paste0("n_over values must be zero or positive.")
stop_df <- rbind(stop_df, data.frame(func = I("n_over"), I(stop_mess)))
}
+
+ # fixes a bug downstream in checking sizes of n_base + n_over
+ if (length(n_over) == 1) {
+ n_over <- rep(n_over, length(stratum))
+ }
+ if (is.null(names(n_over)) || all(names(n_over) %in% stratum)) {
+ names(n_over) <- stratum
+ }
+ n_over <- as.list(n_over)
}
if (is.list(n_over)) {
if (any(names(n_over) %in% stratum == FALSE)) {
@@ -387,7 +396,7 @@ dsgn_check <- function(sframe, sf_type, legacy_sites, legacy_option, stratum, se
stop_df <- rbind(stop_df, data.frame(func = I("n_base + n_over"), I(stop_mess)))
}
} else {
- if (any(sapply(stratum, function(x) (n_base[[x]] + sum(n_over[[x]])) > NROW(sframe[sframe[[stratum_var]] == x, , drop = FALSE])))) {
+ if (any(sapply(stratum, function(x) (n_base[[x]] + sum(n_over[[x]])) > NROW(sframe[sframe[[stratum_var]] == x, , drop = FALSE])))) {
stop_ind <- TRUE
stop_mess <- paste0("For each stratum, the sum of the base sites and 'Over' replacement sites must be no larger than the number of rows in 'sframe' representing that stratum.")
stop_df <- rbind(stop_df, data.frame(func = I("n_base + n_over"), I(stop_mess)))
diff --git a/R/grts.R b/R/grts.R
index 2ab7ff4..6c4eb8c 100644
--- a/R/grts.R
+++ b/R/grts.R
@@ -149,9 +149,12 @@
#' If replacement sites are not desired for a particular stratum, then the corresponding
#' value in \code{n_over} should be \code{0} or \code{NULL} (which is equivalent to \code{0}).
#' If the sampling design is stratified but the number of \code{n_over} sites is the same in each
-#' stratum, \code{n_over} can be a vector which is used for each stratum. Note that if the
+#' stratum, \code{n_over} can be a vector which is used for each stratum.
+#' If \code{n_over} is an unnamed, length-one vector, it's value is recycled
+#' and used for each stratum. Note that if the
#' sampling design has unequal selection probabilities (\code{seltype = "unequal"}), then \code{n_over} sites
-#' are given the same proportion of \code{caty_n} values as \code{n_base}.
+#' are given the same proportion of \code{caty_n} values as \code{n_base}.
+#'
#'
#' @param n_near The number of nearest neighbor (nn) replacement sites.
#' If the sampling design is unstratified, \code{n_near} is integer from \code{1}
diff --git a/man/grts.Rd b/man/grts.Rd
index bcb4fd8..c4367e6 100644
--- a/man/grts.Rd
+++ b/man/grts.Rd
@@ -164,7 +164,9 @@ If the sampling design is stratified,
If replacement sites are not desired for a particular stratum, then the corresponding
value in \code{n_over} should be \code{0} or \code{NULL} (which is equivalent to \code{0}).
If the sampling design is stratified but the number of \code{n_over} sites is the same in each
- stratum, \code{n_over} can be a vector which is used for each stratum. Note that if the
+ stratum, \code{n_over} can be a vector which is used for each stratum.
+ If \code{n_over} is an unnamed, length-one vector, it's value is recycled
+ and used for each stratum. Note that if the
sampling design has unequal selection probabilities (\code{seltype = "unequal"}), then \code{n_over} sites
are given the same proportion of \code{caty_n} values as \code{n_base}.}
diff --git a/man/irs.Rd b/man/irs.Rd
index 0ebd480..86a32f3 100644
--- a/man/irs.Rd
+++ b/man/irs.Rd
@@ -164,7 +164,9 @@ If the sampling design is stratified,
If replacement sites are not desired for a particular stratum, then the corresponding
value in \code{n_over} should be \code{0} or \code{NULL} (which is equivalent to \code{0}).
If the sampling design is stratified but the number of \code{n_over} sites is the same in each
- stratum, \code{n_over} can be a vector which is used for each stratum. Note that if the
+ stratum, \code{n_over} can be a vector which is used for each stratum.
+ If \code{n_over} is an unnamed, length-one vector, it's value is recycled
+ and used for each stratum. Note that if the
sampling design has unequal selection probabilities (\code{seltype = "unequal"}), then \code{n_over} sites
are given the same proportion of \code{caty_n} values as \code{n_base}.}
From a504476051303de46be5ef2dac94f79e27c2ded2 Mon Sep 17 00:00:00 2001
From: Michael Dumelle
Date: Tue, 16 May 2023 12:14:45 -0700
Subject: [PATCH 10/12] minor pre release updates
---
NEWS.md | 9 ++++-----
cran-comments.md | 4 +---
2 files changed, 5 insertions(+), 8 deletions(-)
diff --git a/NEWS.md b/NEWS.md
index a0c7004..106db2e 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -2,8 +2,9 @@
## Minor Updates
-* `n_over` is now recycled if the design is stratified and `n_over` is a length-one numeric vector
+* `n_over` is now recycled if the design is stratified and `n_over` is a length-one numeric vector.
* Added an `adjwgtNR()` function to perform non-response weight adjustments.
+* Warning and error messages from `grts()`, `irs()`, and `*_analysis()` functions now print using `message()` instead of `cat()`. This change makes the resulting output more consistent with standard practice and easier to suppress when desired (#36).
* Changed default behavior in `attrisk_analysis()`, `diffrisk_analysis()`, and
`relrisk_analysis()` regarding the handling of `response_levels` and `stressor_levels`.
Previously, if `response_levels` and `stressor_levels` were specified,
@@ -11,8 +12,6 @@
Now, if `response_levels` is specified and its names are `NULL`, then its names are set to `vars_response`,
and if `stressor_levels` is specified and its names are `NULL`, then its names are set to `vars_stressor` (#33).
-* Warning and error messages from `grts()`, `irs()`, and `*_analysis()` functions now print using `message()` instead of `cat()`. This change makes the resulting output more consistent with standard practices and easier to suppress if desired (#36).
-
## Bug Fixes
* Fixed a bug that caused an erorr in `grts()` and `irs()` occurred when at least
@@ -55,13 +54,13 @@
## Bug fixes
* Fixed a bug that prevented proper printing of the `Indicator` column when using `change_analysis()` with `test = median`.
-* Fixed a bug that made `change_analysis` sensititve to the ordering of the levels of variables in `var_cat` if those variables were factors.
+* Fixed a bug that made `change_analysis` sensitive to the ordering of the levels of variables in `var_cat` if those variables were factors.
* Fixed a bug in `sp_summary()` that incorrectly ordered the `siteuse` variable.
* Fixed a bug in `sp_summary()` that failed to summarize data frames that did not have an `sf_column` attribute.
* Fixed a bug in `*_analysis()` functions when `popsize` is a list intended for use with `survey::calibrate()`.
* Fixed a bug in `*analysis()` functions that returned an error while performing percentile estimation when there was no variability in at least one variable in `vars` for at least one level of one variable in `subpops`.
* Fixed a bug in `grts()` that caused an error for some combinations of `n_base` and `n_over`.
-* Fixed a bug in `change_analysis()` that returned an error when at least one varible in `vars_cat` has only one unique value.
+* Fixed a bug in `change_analysis()` that returned an error when at least one variable in `vars_cat` has only one unique value.
# spsurvey 5.3.0
diff --git a/cran-comments.md b/cran-comments.md
index 9c19fa5..8366eac 100644
--- a/cran-comments.md
+++ b/cran-comments.md
@@ -1,6 +1,4 @@
-This is a minor update that adds citation information for a publication in
-*The Journal of Statistical Software* (JSS). The DOI in the CITATION for the
-new JSS publication will be registered after publication on CRAN.
+This is a minor update that adds few new features and bug fixes.
-------
From 3309bf1a8e3c0552bde415ee3a44fdbd8854caea Mon Sep 17 00:00:00 2001
From: Michael Dumelle
Date: Tue, 16 May 2023 16:18:01 -0700
Subject: [PATCH 11/12] add cran comments to rbuildignore
---
.Rbuildignore | 1 +
1 file changed, 1 insertion(+)
diff --git a/.Rbuildignore b/.Rbuildignore
index f9eac1f..4c74c56 100644
--- a/.Rbuildignore
+++ b/.Rbuildignore
@@ -9,3 +9,4 @@
^_pkgdown\.yml$
^docs$
^pkgdown$
+^CRAN-SUBMISSION$
From 7e361c0deee158f34c5cd7654d223e5782d5117c Mon Sep 17 00:00:00 2001
From: Michael Dumelle
Date: Tue, 16 May 2023 16:18:13 -0700
Subject: [PATCH 12/12] website updates
---
docs/404.html | 2 +-
docs/LICENSE.html | 40 +-
docs/articles/EDA.html | 240 +++---
.../figure-html/unnamed-chunk-10-1.png | Bin 122488 -> 122490 bytes
.../figure-html/unnamed-chunk-13-1.png | Bin 122488 -> 122490 bytes
.../figure-html/unnamed-chunk-13-2.png | Bin 124008 -> 124010 bytes
.../figure-html/unnamed-chunk-16-1.png | Bin 131689 -> 131695 bytes
.../figure-html/unnamed-chunk-19-1.png | Bin 82757 -> 82755 bytes
.../figure-html/unnamed-chunk-19-2.png | Bin 49924 -> 49928 bytes
.../figure-html/unnamed-chunk-22-1.png | Bin 82757 -> 82755 bytes
.../figure-html/unnamed-chunk-25-1.png | Bin 91897 -> 91901 bytes
.../figure-html/unnamed-chunk-25-2.png | Bin 51644 -> 51644 bytes
.../figure-html/unnamed-chunk-27-1.png | Bin 63665 -> 63673 bytes
.../figure-html/unnamed-chunk-27-2.png | Bin 74474 -> 74479 bytes
.../figure-html/unnamed-chunk-29-1.png | Bin 54956 -> 54948 bytes
.../figure-html/unnamed-chunk-29-2.png | Bin 44470 -> 44487 bytes
.../figure-html/unnamed-chunk-34-1.png | Bin 49009 -> 49025 bytes
.../figure-html/unnamed-chunk-36-1.png | Bin 135334 -> 135336 bytes
.../figure-html/unnamed-chunk-39-1.png | Bin 41444 -> 41458 bytes
.../figure-html/unnamed-chunk-39-2.png | Bin 26850 -> 26850 bytes
.../figure-html/unnamed-chunk-42-1.png | Bin 43339 -> 43340 bytes
.../figure-html/unnamed-chunk-42-2.png | Bin 21451 -> 21455 bytes
.../figure-html/unnamed-chunk-46-1.png | Bin 64928 -> 64925 bytes
.../figure-html/unnamed-chunk-49-1.png | Bin 27371 -> 27367 bytes
.../figure-html/unnamed-chunk-49-2.png | Bin 38796 -> 38800 bytes
.../figure-html/unnamed-chunk-49-3.png | Bin 34666 -> 34667 bytes
.../figure-html/unnamed-chunk-7-1.png | Bin 107675 -> 107676 bytes
docs/articles/analysis.html | 740 +++++++++---------
.../figure-html/unnamed-chunk-12-1.png | Bin 40516 -> 40514 bytes
docs/articles/index.html | 2 +-
docs/articles/sampling.html | 404 +++++-----
.../figure-html/unnamed-chunk-12-1.png | Bin 85384 -> 85395 bytes
.../figure-html/unnamed-chunk-12-2.png | Bin 67385 -> 67387 bytes
.../figure-html/unnamed-chunk-17-1.png | Bin 43705 -> 43707 bytes
.../figure-html/unnamed-chunk-22-1.png | Bin 58396 -> 58413 bytes
.../figure-html/unnamed-chunk-28-1.png | Bin 132417 -> 132419 bytes
.../figure-html/unnamed-chunk-34-1.png | Bin 188967 -> 188982 bytes
.../figure-html/unnamed-chunk-38-1.png | Bin 94747 -> 94747 bytes
.../figure-html/unnamed-chunk-7-1.png | Bin 132692 -> 132695 bytes
docs/articles/start-here.html | 124 +--
docs/authors.html | 2 +-
docs/index.html | 76 +-
docs/news/index.html | 22 +-
docs/pkgdown.yml | 4 +-
docs/reference/Illinois_River.html | 4 +-
docs/reference/Illinois_River_Legacy.html | 4 +-
docs/reference/Lake_Ontario.html | 4 +-
docs/reference/NE_Lakes.html | 4 +-
docs/reference/NE_Lakes_Legacy.html | 4 +-
docs/reference/NE_Lakes_df.html | 4 +-
docs/reference/NLA_PNW.html | 4 +-
docs/reference/NRSA_EPA7.html | 4 +-
docs/reference/adjwgt.html | 32 +-
docs/reference/adjwgtNR.html | 175 +++++
docs/reference/ash1_wgt-1.png | Bin 36691 -> 36024 bytes
docs/reference/ash1_wgt.html | 26 +-
docs/reference/attrisk_analysis.html | 162 ++--
docs/reference/cat_analysis.html | 162 ++--
docs/reference/cdf_plot.html | 112 +--
docs/reference/change_analysis.html | 212 ++---
docs/reference/cont_analysis.html | 108 +--
docs/reference/cont_cdfplot.html | 88 +--
docs/reference/cont_cdftest.html | 118 +--
docs/reference/cov_panel_dsgn.html | 22 +-
docs/reference/diffrisk_analysis.html | 162 ++--
docs/reference/errorprnt.html | 4 +-
docs/reference/grts.html | 72 +-
docs/reference/index.html | 6 +-
docs/reference/irs.html | 72 +-
docs/reference/localmean_cov.html | 4 +-
docs/reference/localmean_var.html | 4 +-
docs/reference/localmean_weight.html | 4 +-
docs/reference/pd_summary.html | 26 +-
docs/reference/plot.html | 78 +-
docs/reference/plot.sp_CDF.html | 114 +--
docs/reference/power_dsgn.html | 60 +-
docs/reference/ppd_plot.html | 90 +--
docs/reference/relrisk_analysis.html | 164 ++--
docs/reference/revisit_bibd.html | 68 +-
docs/reference/revisit_dsgn.html | 72 +-
docs/reference/revisit_rand.html | 108 +--
docs/reference/sp_balance.html | 32 +-
docs/reference/sp_frame.html | 16 +-
docs/reference/sp_plot.html | 84 +-
docs/reference/sp_rbind.html | 14 +-
docs/reference/sp_summary.html | 30 +-
docs/reference/spsurvey-package.html | 2 +-
docs/reference/stopprnt.html | 4 +-
docs/reference/summary.html | 26 +-
docs/reference/trend_analysis.html | 220 +++---
docs/reference/warnprnt.html | 4 +-
docs/sitemap.xml | 3 +
92 files changed, 2330 insertions(+), 2118 deletions(-)
create mode 100644 docs/reference/adjwgtNR.html
diff --git a/docs/404.html b/docs/404.html
index f0ae731..4ed49bb 100644
--- a/docs/404.html
+++ b/docs/404.html
@@ -32,7 +32,7 @@
spsurvey
- 5.4.1
+ 5.5.0
diff --git a/docs/LICENSE.html b/docs/LICENSE.html
index f2b6b9b..f5cf6e7 100644
--- a/docs/LICENSE.html
+++ b/docs/LICENSE.html
@@ -17,7 +17,7 @@
spsurvey
- 5.4.1
+ 5.5.0
@@ -234,27 +234,27 @@ 17. Interpretation of Sections
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.
-<one line to give the program's name and a brief idea of what it does.>
-Copyright (C) <year> <name of author>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
+<one line to give the program's name and a brief idea of what it does.>
+Copyright (C) <year> <name of author>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:
-<program> Copyright (C) <year> <name of author>
-This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'.
-This is free software, and you are welcome to redistribute it
-under certain conditions; type 'show c' for details.
+<program> Copyright (C) <year> <name of author>
+This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'.
+This is free software, and you are welcome to redistribute it
+under certain conditions; type 'show c' for details.
The hypothetical commands show w
and show c
should show the appropriate parts of the General Public License. Of course, your program’s commands might be different; for a GUI interface, you would use an “about box”.
You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/docs/articles/EDA.html b/docs/articles/EDA.html
index 4859d2e..1830d95 100644
--- a/docs/articles/EDA.html
+++ b/docs/articles/EDA.html
@@ -33,7 +33,7 @@
spsurvey
- 5.4.1
+ 5.5.0
@@ -84,7 +84,7 @@
-
+
Introduction
Before proceeding, we load spsurvey by running
+
library(spsurvey)
The summary()
and plot()
functions in spsurvey are used to summarize and visualize sampling frames, design sites, and analysis data. Both functions use a formula argument that specifies the variables to summarize or visualize. These functions behave differently for one-sided and two-sided formulas. To learn more about formulas in R, run ?formula
. Only the core functionality of summary()
and plot()
will be covered in this vignette, so to learn more about these functions, run ?summary
and ?plot
. The sp_summary()
and sp_plot()
functions can equivalently be used in place of plot()
and summary()
, respectively (sp_summary()
and sp_plot()
are currently maintained for backwards compatibility with previous spsurvey versions).
The plot()
function in spsurvey is built on the plot()
function in sf. spsurvey’s plot()
function accommodates all the arguments in sf’s plot()
function and adds a few additional features. To learn more about the plot()
function in sf, run ?plot.sf()
.
@@ -125,56 +125,56 @@
One-sided formulas are used to summarize and visualize the distributions of variables. The variables of interest should be placed on the right-hand side of the formula. To summarize the distribution of ELEV
, run
-summary(NE_Lakes, formula = ~ ELEV)
-#> total ELEV
-#> total:195 Min. : 0.00
-#> 1st Qu.: 21.93
-#> Median : 69.09
-#> Mean :127.39
-#> 3rd Qu.:203.25
-#> Max. :561.41
+
summary(NE_Lakes, formula = ~ ELEV)
+#> total ELEV
+#> total:195 Min. : 0.00
+#> 1st Qu.: 21.93
+#> Median : 69.09
+#> Mean :127.39
+#> 3rd Qu.:203.25
+#> Max. :561.41
The output contains two columns: total
and ELEV
. The total
column returns the total number of lakes, functioning as an “intercept” to the formula (it can by removed by supplying - 1
to the formula). The ELEV
column returns a numerical summary of lake elevation. To visualize ELEV
, run
-plot(NE_Lakes, formula = ~ ELEV)
+
plot(NE_Lakes, formula = ~ ELEV)
To summarize the distribution of ELEV_CAT
, run
-summary(NE_Lakes, formula = ~ ELEV_CAT)
-#> total ELEV_CAT
-#> total:195 low :112
-#> high: 83
+summary(NE_Lakes, formula = ~ ELEV_CAT)
+#> total ELEV_CAT
+#> total:195 low :112
+#> high: 83
The ELEV_CAT
column returns the number of lakes in each elevation category. To visualize ELEV_CAT
, run
-plot(NE_Lakes, formula = ~ ELEV_CAT, key.width = lcm(3))
+plot(NE_Lakes, formula = ~ ELEV_CAT, key.width = lcm(3))
The key.width
argument extends the plot’s margin to fit the legend text nicely within the plot. The plot’s default title is the formula
argument, though this is changed using the main
argument to plot()
.
The formula used by summary()
and plot()
is quite flexible. Additional variables are included using +
:
-summary(NE_Lakes, formula = ~ ELEV_CAT + AREA_CAT)
-#> total ELEV_CAT AREA_CAT
-#> total:195 low :112 small:135
-#> high: 83 large: 60
+summary(NE_Lakes, formula = ~ ELEV_CAT + AREA_CAT)
+#> total ELEV_CAT AREA_CAT
+#> total:195 low :112 small:135
+#> high: 83 large: 60
The plot()
function returns two plots – one for ELEV_CAT
and another for AREA_CAT
:
-plot(NE_Lakes, formula = ~ ELEV_CAT + AREA_CAT, key.width = lcm(3))
+plot(NE_Lakes, formula = ~ ELEV_CAT + AREA_CAT, key.width = lcm(3))
Interactions are included using the interaction operator, :
. The interaction operator returns the interaction between variables and is most useful when used with categorical variables. To summarize the interaction between ELEV_CAT
and AREA_CAT
, run
-summary(NE_Lakes, formula = ~ ELEV_CAT:AREA_CAT)
-#> total ELEV_CAT:AREA_CAT
-#> total:195 low:small :82
-#> high:small:53
-#> low:large :30
-#> high:large:30
+summary(NE_Lakes, formula = ~ ELEV_CAT:AREA_CAT)
+#> total ELEV_CAT:AREA_CAT
+#> total:195 low:small :82
+#> high:small:53
+#> low:large :30
+#> high:large:30
Levels of each variable are separated by :
. For example, there are 86 lakes that are in the low elevation category and the small area category. To visualize this interaction, run
-plot(NE_Lakes, formula = ~ ELEV_CAT:AREA_CAT, key.width = lcm(3))
+plot(NE_Lakes, formula = ~ ELEV_CAT:AREA_CAT, key.width = lcm(3))
The formula accommodates the *
operator, which combines the +
and :
operators. For example, ELEV_CAT*AREA_CAT
is shorthand for ELEV_CAT + AREA_CAT + ELEV_CAT:AREA_CAT
. The formula also accommodates the .
operator, which is shorthand for all variables separated by +
.
@@ -183,42 +183,42 @@
+set.seed(51)
First we will obtain some design sites: To select an equal probability GRTS sample of size 50 with 10 reverse hierarchically ordered replacement sites, run
-eqprob_rho <- grts(NE_Lakes, n_base = 50, n_over = 10)
+eqprob_rho <- grts(NE_Lakes, n_base = 50, n_over = 10)
Similar to summary()
and plot()
for sampling frames, summary()
and plot()
for design sites uses a formula. The formula should include siteuse
, which is the name of the variable in the design sites object that indicates the type of each site. The default formula for summary()
and plot()
is ~siteuse
, which summarizes or visualizes the sites
objects in the design sites object. By default, the formula is applied to all non-NULL
sites
objects (in eqprob_rho
, the nonNULL
sites objects are sites_base
(for the base sites) and sites_over
(for the reverse hierarchically ordered replacement sites)).
-summary(eqprob_rho)
-#> total siteuse
-#> total:60 Base:50
-#> Over:10
+summary(eqprob_rho)
+#> total siteuse
+#> total:60 Base:50
+#> Over:10
-plot(eqprob_rho, key.width = lcm(3))
+plot(eqprob_rho, key.width = lcm(3))
The sampling frame may be included as an argument to the plot()
function:
-plot(eqprob_rho, NE_Lakes, key.width = lcm(3))
+plot(eqprob_rho, NE_Lakes, key.width = lcm(3))
When you include siteuse
as a left-hand side variable (siteuse
is treated as a categorical variable), you can summarize and visualize the sites
object for each level of each right-hand side variable:
-summary(eqprob_rho, formula = siteuse ~ AREA_CAT)
-#> siteuse by total:
-#> Base Over
-#> total 50 10
-#>
-#> siteuse by AREA_CAT:
-#> Base Over
-#> small 35 7
-#> large 15 3
+summary(eqprob_rho, formula = siteuse ~ AREA_CAT)
+#> siteuse by total:
+#> Base Over
+#> total 50 10
+#>
+#> siteuse by AREA_CAT:
+#> Base Over
+#> small 35 7
+#> large 15 3
-plot(eqprob_rho, formula = siteuse ~ AREA_CAT, key.width = lcm(3))
+plot(eqprob_rho, formula = siteuse ~ AREA_CAT, key.width = lcm(3))
You can also summarize and visualize a left-hand side variable for each level of siteuse
:
-summary(eqprob_rho, formula = ELEV ~ siteuse)
-#> ELEV by total:
-#> Min. 1st Qu. Median Mean 3rd Qu. Max.
-#> total 0.03 26.385 65.535 135.364 214.2075 537.84
-#>
-#> ELEV by siteuse:
-#> Min. 1st Qu. Median Mean 3rd Qu. Max.
-#> Base 0.68 29.4850 81.76 148.0362 263.640 537.84
-#> Over 0.03 15.1275 54.49 72.0030 119.365 209.25
+summary(eqprob_rho, formula = ELEV ~ siteuse)
+#> ELEV by total:
+#> Min. 1st Qu. Median Mean 3rd Qu. Max.
+#> total 0.03 26.385 65.535 135.364 214.2075 537.84
+#>
+#> ELEV by siteuse:
+#> Min. 1st Qu. Median Mean 3rd Qu. Max.
+#> Base 0.68 29.4850 81.76 148.0362 263.640 537.84
+#> Over 0.03 15.1275 54.49 72.0030 119.365 209.25
-plot(eqprob_rho, formula = ELEV ~ siteuse)
+plot(eqprob_rho, formula = ELEV ~ siteuse)
To summarize and visualize NITR_COND
across all states, run
-summary(NLA_PNW, formula = ~ NITR_COND)
-#> total NITR_COND
-#> total:96 Fair:24
-#> Good:38
-#> Poor:34
+summary(NLA_PNW, formula = ~ NITR_COND)
+#> total NITR_COND
+#> total:96 Fair:24
+#> Good:38
+#> Poor:34
-plot(NLA_PNW, formula = ~ NITR_COND, key.width = lcm(3))
+plot(NLA_PNW, formula = ~ NITR_COND, key.width = lcm(3))
Suppose the sampling design was stratified by STATE
. To summarize and visualize NITR_COND
by STATE
, run
-summary(NLA_PNW, formula = NITR_COND ~ STATE)
-#> NITR_COND by total:
-#> Fair Good Poor
-#> total 24 38 34
-#>
-#> NITR_COND by STATE:
-#> Fair Good Poor
-#> California 6 8 5
-#> Oregon 8 26 13
-#> Washington 10 4 16
+summary(NLA_PNW, formula = NITR_COND ~ STATE)
+#> NITR_COND by total:
+#> Fair Good Poor
+#> total 24 38 34
+#>
+#> NITR_COND by STATE:
+#> Fair Good Poor
+#> California 6 8 5
+#> Oregon 8 26 13
+#> Washington 10 4 16
-plot(NLA_PNW, formula = NITR_COND ~ STATE, key.width = lcm(3))
+plot(NLA_PNW, formula = NITR_COND ~ STATE, key.width = lcm(3))
diff --git a/docs/articles/EDA_files/figure-html/unnamed-chunk-10-1.png b/docs/articles/EDA_files/figure-html/unnamed-chunk-10-1.png
index ae7f72086d6dee58d2162831ab6f68e02851c6ac..44735e5ec986a35f43ba2ef222c24a6fd819206d 100644
GIT binary patch
delta 14355
zcma)Dc_38(*PbC%_OG&UDO7f1$d)3NP|23vWZ#W7%pEC|EwZnrkbPgqSjN6nmXJM+
zWQ?(7XWpy){(tZPGxy%lIp;agd7g83>!|kYs8AJ9<_MsF{!<=-6xFD-qxF*a%WQ+u
zj?2{V;;PEzGr692P9x9m^Fz-EK5VTmwKc+MvUtDL6H11XQT%t~i>^`Scm5dEcY7lz
z2P3y!%Qh2X`6Tqt=E3ErClr#GFm)MGRP==2)B(jc4xZT{ZLNOBzt^(y8v-3KpHcrx
zaPYVPfc{oq$Cl}6H%>Dq1J^1x8#KaA9iNn%rtm`8dWNcul7&iW8$JFc*C*(bHq=uy
z&T90`7*`~z@yoTxOP+VMtA6f1_FH0!CP+8d$dVD9_bM4%FxMY&L!6VUE+lf#QL7!4xJSzwXVx%Co@9<%mReP>I3++aTKh915_
zYv3g@=A3x68lQ@;$9Onc$k_Zz;w7B^t8XK+XL
z(*)F&5VBW$NgeJYB~PzYD?l0eoA1c;28Es-p=gP>L~@}F{SRthBk0B_cQ+^yTHZ_U
zkg%hP#7aMH_kV|9^qI2wo|yH;Wt#qa$hdgz)zMmUVwe#ix;8#+ibiidz5c=1kJ876
zM5-uE+(`kVs$H}x8KY@MIATec&7mcJ7pSzaa5#u^u4C~|FiwPNz?AdF25IFoVWG-5TT(3FjC3SY}MGEi{bKtt8U2YYL{KDvX8jZg_p?(F|?K1HZ8qR
zyhX{xm#Bu`K4_TeD^*iHxvK7EV#q`99V}=UAO&>f_OG`zIP4aKcYHthDoL70$)isv
zm-mNrmu+eaMCwpo#_h+?$om%BF9Er3z*-xcz4&BqG~&mlw?_uNTCH!CJs;9Vr(fH9
zs@v%E2Sv`rO#2q@SADHtLD`}6SLIaN%Dm(6cR%B5GEBZ1_`T?{i0mNC=s@8bxksTp
zew|T69SKUbSyPF6e;@66Pi~XYhQzxuzeV~?esZrCR$3Xs^e0|!H^x^K&K?H>7&b41
z-WZoz&Jp9e#8n@Uj0TCL-OKTN&fXsU@jE?=vQlHM9KT3ZG&(
znpQd^qI9kFhc+G2$&wz+tK4g5GX2QU%>3Ix-g$L}p(#1#s@}Tu1WJOE_cy#r8JqkS
zniej;u$lgW1(MUr3rul6R#gSSr~F($JbQ6D>u|pmV_k-S-DYTtFTZlw-v`gUW)(%Q
zjM%+lozb4cvc3Kw6%D=fkg1A|LrhYXMTsa;$-qR~5%l?&Qt)0~ktFCsjelXsJ
zJLZDWKkT5WrLB`^b;^?aXQjQH-rk&N4Ma%8{N#pQ=X3y)j+UQ(8n*fE>XWZZE1
zr1#3wHXZ^i_BC^}CqHYdl_+#}Y#$`Q1RYhqPJ1g|Lcya4du*Y2J=qSCMOH*C_
zC*Jg5{S=W$u6FY(K`824k@CN(9=i4H`xI353QY5T2l8ggFRhY*XVcFti2wOCmy!o6
ziL5EJSqGKlCx%EX@t^s;{@#X&s}DRNmpf-Za?*Ij
zs!De&)PnBOFX<=HhK8F#1DYIy4xM`NKr_dvlWen%EfBU~qOg)w)PH4Aw`w^>_M$&akh0!I
z8qCE9&k7B<@0z}tbxvBxs#Lw0;G3P(qQCwZX!&?JPEg#{Ej_BkNqaWe6=>`J7N0y`
zkz49@jQ2hY{$``fcEI6d@l*~+ljx?;(thL;AC}X2uJ^c;Y96B$c2EDD!tu+LIp=D4
z{18kM$HJn%NNrEJF+ahO8VaJ`-)oTaN2bbWDn!R*Aq^Hzs>;H-l%X-{CbFAOK|(2J
zZB}V1k5pwA#-<_MKX}{
zFG5u{Un@aw(e9VV{N!^2JI0kzs^WNAB6t=L+(#h(SoQLRmMOv8-!Y0+92IR#%0_aX
zn@mTH*9~sV{X^O34%uM;R!rL4&nCndG&>z{Iz8@>u!t^fs%cLST%@hs3>xF6
zYM3ca*eP<
zM|0`jN&{C%Tbk~7)nRjHXAbxoWFMA|907`3AyxIPTzP3--GFNv9Sp6i=caJI<vkavM|>84)lb!2!1iT(d)T}g!;>iEGX{tHQ*_Rz
z>VK16`eM9vpCxW`v3&sbH5`2s5Adnvoo!7_&c4el){cb@(-ql%*{g)Z$Y+uFb-xiq
zCN};5@ejT-&y$l6p*C2jE@9!47k-vh-{*3(n3UbV9~L8t2M~C+
zT&-E4v&U1pcizs}I_-+6WdY*w>*f+o6i!L@&s4hTr|?GDXDtIVVJx(hBIVb|#drQ>
z%?*wOEC24JUC_1mms0fcS&UZz^A`Aw4;-R{PZRY~gCSKt}46F6~!8H%O
zI4KkGul3XRWbz`J^BQb?`p34L#HX;p`Sw`>$QrhvrvRnEuPy=kOEOpjN<__HplPrJa(Mty$)(
z_vO&CtpUGJi&BYS3mMgZ2=AFsZAaU%H_?&D2b!GwHhI!fq5b*AD?I#VW}Z720N2pA
zW1qduIs`s&I-$v@oP79ZnFiv*Uw4=5eRU%E_+*D#?mbE50YjLrHfqm=v)Qt#yqU2*^;;ndAx
zPleeVMP0mn}}q=X^T1f`$f`#vXwlBEIO`sMq5jRFda
zisfg>U3YxZ{ro2(1^+4zJT}H?XQtUjNU)hVfUsEBD2&LEe!lf%%;`x_&xSF3<;v?f
z_yODLJ3GA_?a6D7MKT~4oz8R2W|w94ncgoQHn&qn@Wa7HMqqV_@zIikJAq*kSwnv%_D5?c_6%3HiNWb$14d1Ay^w
zXE{PjF+YdH-ML{lFEuszs>R$(-tuq1^DwrxMzUAl~jJPTKAr`=k@x~Wh;dv=nZ3hN^!ql|db
zM4YK!JpTK-Mqym^lit2fuO5?oDIU%eB4f&x2O7evSsD+=dT6z|XQm8QZ@$$dzU`z^
zh&x|K9&b#AwCFJsll96mJk++lO)on++3zLWER5vMOu#F!>
zB)Suqc>&TyHz(OGy|()=wwahA=Ll;TK7h(AuUlHVQo3s
zyX?zkZORGYocvHK=dtVgWpVKCT3F@Qg=^XrEQd&f7n%^3qLghZP2_&3TxHRZl+zye
zC*6SxryT7tt6H5j>(5~iLac%+DJE(TrLw$!)E@ef%}7h#Z+(C~S28
zbCb)~O3cp0?$(M)lKzX}&EG3tJ;6!TD5-cE_p1y791f%7FO!w!kq60@>mmp(HnhD|
zwGS&R`@3CAS6xwro^Yaf0TrI&xZPQ>Zfj?Ip;(l)oXp4kXyy5Q-9U5%3mXkU7H?sC
zv7;&IW19;rP56h-lJk@FJ1F%Ymf^@mnVQcJ@mUl3g6d!qj|#{
z7Mp0GNQ-y=U?$W5@Ymt1!J(%&dKF%n@fM~h=5C^OjeuiTDmt)zK40z
zOXWK^5H(_G5ne7%{Z9jc06x0IA2@dFtb%#E1Nog&Gs3y`DJ*Z$%&T_ja`W6wno`X|
zbYA8h(3oYrn`x)kQj9NmpS=`0b9NzR55J+lgv|aV`422YE8@UL_HxEmg(tii@+wdt
zXS}4uhAk<-DU`DHuq!yZhYQ2@Yss~mLr_{xGhj$9YhoMd+F9k2pO~YU#aMa)VDXhi
zOy%U6kC9{VV0jg4Y&`Bv^{1q6f&?n7X+@W^gWToym^9bk!^Z+{6#Ye%Q9g}vHdDq1
zwT|$4=fjPJQB5IsxzhH7Rz_agTqa!UFS<%610V`qu~S1OUm@d
z&@%+3@=Uk>$2{nyBr1!i=j+1V9;VxnjHhL*@pb#P$15Qq$zuZRTHD%_q?VWfT_N*-
zPdg?O?U-1OVY`fSG>^@R%I&PsEB694Z=5@%4Tr~2+iU;&B7FM1P9G_YL*LQ*ci@D8
zd=XDQ1?6TRD%7D*2OYhDV*d$sObjUL_Vd?$+%>5gp=o$sizVKFCW7r2&yM*)C*xlsg6`mdlgcovO
zRpsfXAHbV|3kZm!tfESXEm6I>x;DE^(E`j^&~K?|(NVZ=c1-B8DpSt7-V3q$Hyki_
zsr(f?c6!XxeI?i#3ZQgb`5go+P|I2~{w+Dtu#p5=p=x+VZLjBQAxIVH%#xC3Pv@f`
zI7;4c&8dHAT2_i1mE{lY$bp2xWSjw{o7b4
z(Oy%$J?q~LP0g8j`sSO@h$deISocu$I#1cy7l*dU&MeG8-k9o1X=lS_wJ6~>d0haottSiI^*^F
zHFI?-zk&6}#Dn6z^BO!&jw=rKDT{M-&V}5!w=Ze-EpCky`yT(1s$TA>l7CJm><3E-
z>bt2;JkvVc1SGgN3XhVioR9fAX^y{+pZhoKsLI^+BfdQg*?XT&`j+Mp_^QdJEbdbX
z2F}C1l>3w~PZ-0xgNERYEtzZ@ek=ycKQ3$7{`ws56f_rQX?*qqGz9H;slS@j?@Q*#
z?NY>w4bSwHAto6kMnS~VJ8GoKQB@8%%2XikhMS_-G&leg|U4%hl?U>4r{35S(mlRSEmQZkpq^DKX2*4
z+cmOs6w(~=vs(gqE0ACkpQf-~;JBFhF{ulVOyw$BFbr8ieT@)$`DUc?*EBH9m0$PK
zOZ=lU^a5m!-7BljtIY858ceJC$bD7>78%h(Tn9Uc_HSILNjFg)N`_xSf4`EE*NrGI
zmKmMsSFs(KS7MZ9=p#A=_o@=Yr5SRoH=(&%N
z980!ug+KeyNQL~XjV|MUnY1_WYMEEITw9Xqm%Eg}ZU&5y6wF;pc2MhB8EaFPS&E+N
z&ItjNr?om6apVU{;|b!w0|T8WA5V){*KMXReDWF~AcHvQ$>f>TPUO(wpU2Um3=Pi~us$R+&kZstCE9w?J$*95i|DW08
z1O-0&D(i0kk~5cXrOF0jZu*&KS%a70ZQvX$16*BG?E0R@lHe*bcYnXt;Z4>~65_uS
zvfamg-6=Aj_tv}r0Pud38-5A0=LG^aKkwzJ>5(0|DJv`b>}nSFJ^p5ZsF!Dv6HeAM
zcrq48^@A3izo}NgKP8OOqZDN%pHtjjOdk2RAeR$vJfe&K%M)JwRsVxky{Q-&m(P*?
zEWY8*aMW*{jDaj);$OSMVed@dPT8&>Soo<){`ozbJ>cm`QUSq?)}K5vhE_^nfW!WH
zp`_P*NA~B{XH`&lyjROWJKn|bf)aobMJz1s(T_@xpADLSPb(dgGgq9pdyfP^LC{Ib
ziX!J9SjDo8jw6yBp3}Ss)mYq9AUczfHO@|Z+^PdgyxPk
zQ6`jm4PJDvinh4wtw(l>BG}R|=67Uondi-uNedoU)EOgpk!DgN=q$M)Bn&f+_{*57NIzSfti;KVLQeNV6WcA)S~>eW{ggp+2w
zH(7do&AW?y>j{h{UX?^Jx2g-0N*bH%kakVql``ep
z<**rl?-q$JwQBBLvGo-AFjjfY-dYT;G$1|C=sis~!M4LBu0(;_d@55Rg-exm*Bw=U
zJP=z@tT^24lL!wAR1`M~*?fW`$+WLg$cwlF%wWkEh5qLY>ys_o4RWE3D9pg--{of#ru+)xAvM5DQP%5a)u&u(NGd;8Gj1l5O>GUPyZ?b_4&g()9__OO6ZsO=e0iD0j
zms4LfC?g7M)~(y^>@o#LM;$m=#FAQvFSQ9(@6NqIJr7vb0vSw+oI07|q_rOdse8UP
zEIxGqOexnY;S-84l`I@X{J_&{28oJuy-UkI%kR_p;%}pJV!xfoxGxplS
z3qhU}LxPCqC-LcFQk@2kB_o}|NuGbdn-N_$Ekn(cJwFLPX2+M75MS(7UaW&U@*b{rri
zPH|34jq$%Xw=uUX@}!g}uW4JWlF@sv;Y4!Yeq`=9`#OdCu0n#tl*}G-rdFV376A_S
z*EHIUBmq$F(q^4F_|um)_pXWQiflgzt`B3WaP_kE#*K
zR7G*R0Hd%Y%_@^W16vXoleVY5zY@ly2{e?zWsX;O@~HdAcW0p1rWA-C4*OA7q`d21
zo}-VE=Uj<$6)fnq_k0%yU7*1Owr!eQzr1c2NvA)cU=4x-miXed3!1OQt@R;6{7$);
zll~HDb?awbySDSU>zi)WOPrRBQDg_R3X9yF8KS~+KF=O^ef6-gv#b5GRet6hl2RHR
zHgWN=;nZ?|gww-r9hJ71=$U&my+;AuN!1F(j$U7e^2U-{k`YL9?BL8J_=$A6$$x{_~igDi}U)eD_fg;$?Zb7vHgT-m8qtu
zJDso{ry6^83jfj3+En+Edj!0iJYcGYr^>T|Hcj7bRJr##x6IO&S+2?cteI{uP(a8?
z(|am;#pLOWTlhJ_zzLKR;jpaE!r9kosVkXh(0%WzQI+3W#dV*}IG&dW)}#i8QzYvH
zJJgT9C%M7^&gvFr4R5mKi(0d|NhBODrE~YtzAbp2yHGJV^CK?&MAM1L%Rp-)xcDJ8CUTzl+*X88eF}`K
zGcM^dAMa!o_Si`uwm%QT4@f9c)ZJnTxT#nJe7=4ngwu9B!{d%$#PnTR7Wk(ZmLeVCPi5ZMk!K-Ibgdp
z>+ngS99eCl5P0w)C}2vKc8OYqKdkv-hNVVU*%Z5R6`ggQtY_qrM{j2GfepZEw%?5l
zP5{l3_5fjq_q0VM;?fCOU3rsbMK|w8_va5r)aM~Gu`$nIrH>0o(+&wEbV=j-C@!aK
z$P6n`ah4tVC0$0z@Z8dCDA^Xb17VHYkFlTTy&3aE@F-{?A
zT>u4hsg5a!ag$mJH-I3(%}||l>%@ryuQKVO^QOzY)P3Qh0I=)xxD?`E9uQW_Bdrpup7$P^%ba%5@v9)jwTMGpm2t8ZH1OlNM+ngYUg9hl%r7YsO*6C>mA3jU#k
zr9zKuE>b(NXbN5Rt*W%qP|}U-u#Y4QRY2xynk6#hsswSZ(1Ge)I%aagHfKL@`^irRj@x5KPlp>tVB=WY7cxXwa@yj&-7X7CPk#2
zxqu#|d5MOG6tfhTwxkA3@kwzpzj2X{fX&K?DfnN@XA#aad6U1yR#yDX7AClc
z^*UU_ea|rbSGBsflc+#L<1*AR22|5=UY~;v*V5(|0M4w#~1&hiV1U8
zM15IiG0!1$;N^~ImsIt0J(aI3-h*nv;QU`uUN?lXJ&Sy6U2^+P
zQqt-!<=I~4FpUL8#xx5t*@g(XI+NOK^Gif-37Z^k*7cmK{=bGESmHccpiHx63sM0M
zj&f;{K45C6_geAw>w6ci8|G?G8cj$4jS#UjrBi05A8_TmK^hYknkqt+FS>;s(MbXsQSlR2%?atP96D*Pv*g^{BR9{{qzr~2VjKa8I`(p42@vf!x
zmX4_m>6^@eEzWLt9UXySZgtiV44`BEy#nYP!bsd~z2_Bo=Z2Yr>wn47xfV%5^swOSli+17*pR5=eOR=TD9>
ztyv@ap$Az?;K3|C?B#@oHcH9iQ)){4wD%%^0fFRcE*6q6#BQ%-$4nXo&ZZlpZ`%JJ
z9iVGn6^@z@3tUC%XLb&xHZ*;7a=Lh>tTDX&4bN<Yu*H8ZT&5I9
z!2AD_PY;3-xbbwJQ$8EnAE?s&w%19!r1I`zF&019S7?4p*`h_@Q(U)HZ${2Msx_G$
zUh)sO%-Jg`0+?N(jgi82MFX$w3c0sObZ!(+EB@j)H}ekG<}iLX^h|T3sdjbwy)WaK
zgqOVA{%nl;O+F1!Nft4;3Edf+v~cF}a)xVa;$zKQWt#-3ZtmC!ucb(ZDZOwtGKzx@
zAAcqCkoTO$Z+WP6HAh4^C=C~qo|+4n2uB`vF5d|z0hs#Dzd7Cc-J*kh$HY|JVi;vY
zuUv!qw16KdU;DY*CZ@dY-txY~+nYH$vTWHpD0J(3(lskV^&};+8aH1J1dLjkLXQjs
zf!~fgjschLD#1AqBkdSzYUDbb6BrQ4@5ijDES8YGb-#_|HgAo>9^xare-g#O4J{of
zAUCY^GE~9(%5EjrEbt=s<}CkY9(h>EXQ~7w`Z72o`Z0?hC!vqdv);r10SR30Vwk1d_xjp6&=rRZ;
z!hL=d$nTa10t0gKe7VlKt!lG$szF3Y=3J};`07)&xjnC1mj_}a@|!On
zTo4fGuN@GrbK^p>O)tf;0U8hUj^k4@&I(hJ?oN{8?oXxEc}A{Ix+iVMpXG>zjiD<8
z<)|~4Z!r-g-Ug!ut7QCtm3!`)!^mVGrT_+RIw4kFD)yc49CaTr^K*|y%i2wvl5Yg6
z+*&9(Tl3)>V1M&QA+G3j_$da_;hq?ap)3DamM{0iiyIsf`RB(5fJ6z;OqBCn>gqL4NYtS_2$wl=Q8$8khmzlb9^7d){VLH@aoFz9J
zulcE|FWTnYQSc9BQzhtuvBj%3#!XOKRIC7Hu#J6?e~a8>i95FZt5$(x{=cgtqso?H
zx$Q9dF-FamvP3le=Y4A*2kAF&q=5H@!UrO*_Nf-Eu6J^%rf%bo3*d={Dn`F8cW(EJ
z@A|3ZeAgllGiZKD`@Kp5`Xbc930-O)Yjb9zU?09e)a6*_MsW7=xtR|f$zze&^HE2=
zDGj@Q-tv+i@eg=(O4$vjKxh9{PMNo*08fRPqUjAPP|-1=|Hb8<2gOj=^7r!Bo`v|h
zbR6ED4Va|YR(d9NB_a7_=`1mV+;yH1*(=ppBl}{lul134k+ZLZBg4de0bwTAvA~47
z=}E84M>P7t5x~zaWv7WBc18B`{^ejG3%hi(eI+3^Lyui=1RJb?4>LA3U_z?#1UZIc
z%ixmW8s9LuAZD8(S>fVG*s<887jl-&`45HKI#KKkW6kpq%%GeQ;pxkmj^dk=^fzF>
zIkcijTCA-ha>&a>K8B&X##Q&!gDF-t0J=h-vgwtUc(@cBPtUzG_+(Yi#rjoWisY`q
z&eRlZln9@z<=N`zKYAA=)U1()v2(4E{|v&R(ewsjBrsxhKQk7iGX8AEPaa%0tTvH*
zJwo13seIj?ITrMvwkw(u%z)42ZpZKaqDV>oS_I=ePvInX$tx3#Y=8_7_mXh{%0k9M
zccQKm8Vj_0n9rUb1)s@Xa534mcTN`~MP~=PK)aV9!6c04W>zpxeS)@zap!rDQ7IeX
zwqz1AMRQEQ`+|YW#_D_GhLNvX3Y7q-s#kd`OE=|rh{Rx-H7*|(>V(s
zcz*IKSudX+C>#tSV{K|d_b=u?WpLW*R!A*JRazsh-tkO5Um7@`g-B#bx(^fx3a}a5
z5JIi;+uwtQ3dAUH98pFS1v
zKYI>L&0q(WJ%8SV{HEYhG5^1g*l7y?#E`qv!cB8vhot8zM
zLl~B?g8P&HG^#r7scQt7Ok>#uA2l*r8Tn(T?^&dIilp@;&JOq#{s0RxR{@8WuK47c
z*q)>E_Z{I_f0+{T)JG;2#|GpuJ}`3jk`{;Ht4e^MJ!l#4lsyIr0;8CK6Gde`
zF$}>#$mkosZs(jLJ!ABDFo!lIqEA*YetDg}%f4g+nm%w^rE`F6{~hPl|FjY%dan=W
zPk12U+K}pBdsVR%yOxlSZTlhr|CK__`x8?kIuicgx{mCr&(zmVAI}i-viR{4MT7K&
zMg9Y?Kj$F=j$ILNT(Qk1nx4+*Xj})Jn+pE-`@!=dtSALPqq|`=xsiV~X-e6lp!6TG
z>q)TUgqmB6dEcY^-wEvT*b^TV&*~?vG79b{&vyi_o-c6smvHlOu^cg_1;1yQN?V8b
z{iJf`V1e_4B640l<%ad1=F*?2??p%Kw=SsCdm!(f{#kTk6sU%O@&yejFRSg1vkepr
zfdRxM3x?MBKcO1Oz}Qo{?Zd-2LjXy+Qs*v#t>aBO=Xr52a=oC&S?0-K{lkFqwHBHJooH)Imd0OkP$K_3&Y`oC|z@vec(L@lB)|wJP_cL|DWAdXc8k=>eB{
zg4XeiE84VuQIs@3XJonYZL*5j~ZwpTZw8>#kKZuw)G)csALb$cp4!Mg?#V3~0-%4q$t)1~Hvc9q@Y
zIcu+Tu6!uA`K><}PfvMS0gPDG1>MMoucaB}#jjO^Qu6Gza?PetwHx-Hz
zi^qaKo;b?uE%2jY>iy^C`AERF-wG9!k)9~K2}|3$$|FQD@SjR_K_66NWkg(T0(U^B
z@O5MQpe8|3ps%i8-u;wfg*u9W@)&pOa|U4ugvWKG(x-&1BtJg--tBzO}=7z(#y#D?|sBo!cDs=wy5o0Sdy|Lza+fSz3;EQSdsa|4M}7f%^Zw96X@<;ZaZ-o6rOa8M(K$BypMX3V
zp%=9ncVGKqnJqY#Uh#{8Cz~m?LLvWahTpG#0~hR-go(dgdm-%Zb_BBL*|A(~H(VG|
z^70E$;JHsz(
zR+4d_qQWfG&uCHT%|2`k_|nnD5biQNNmkH|&wng)@brWk)XJ5eK6a?br9v=19qZm$
z@trC6LJ4@tAB_N7AcuCSestpiD>LkIuF-iI2|RwjV@}gt0}E&R@S11d=+-Cy8|6FznKHAhG{~b8Rr)@lurE=O@RXUSfm
z{w$vP$PY7z9)8tI+Fi^4m2SNBHbSh*7&m=^K!%(eBa!!?(F;+@?0vhWp2Fb*eqE7x
zFPtnHWpVPsl84H}|H0R?^+_=d`IjV<&Omln0ye(f0lgjY6Pyj=ApP&4Lq+$b4zQG>
z;PXbNz*K2lpu7s_!7`*~pn83I6p>pRHmKoBAPX(bI^8r?RaN?alI+)vO9zZ+^|5r(
z6k%mLcQfW91AJ1=5+)VFRzgRdGhcxyL>AfSaU!;Ggf);9Sm|j|Y$JC4YIeFOwOTLop2|t}%3yL-aTh))GGq*AGkX+~{>naIY*L|$r@Hbw
z^dU!9r$p7-QJ_hyyjaYQ2~qFlQc(pDg}4;IXPGEi}EjH#glLwP)2tYfKYPZGDIGI~3FI{9ED~Un?KBc@_2Dp&
zgHyg-r@44m*k84A52rL&p0+SZ6O{?sjRErRyuF5h666WEUGa0_f{mUc;pc(B`crkP
zTZ*r6j-n1)u(*I7&QY10)*HkauZ#g@e)^d8-zV(sjKt1m5MsqZvw&3#i7SwOy#}`A
zzu%Xl8K(CI+Ur|R9@56RVernOP1{|jy7eYeGpgx)+|E)fO?=xxH6V~LE*kmFJ3TKT>
zY3t{`XSE1v=DxWJJKp_DMvs!KdN_c*9EEw&>c6MR+{eaFNd2yj(5$&__bavZr;Naj!oRI
zHRnCa8*In{nU4;kc`pqxf*}uRSf;MtQd0W*kg0`Y*MR^zKaJo|59m%t=<#F(q)Vp|
z>93>Pi#q~7M*kNUPfk%^0USWwBqInv>cAnFg+$
z)D0dwe?C+O1l%kCy9H!l!Hw?fL?ng4rv1{sRdCjb${C7cdle+9-@VoI@jM$Nb?fEA
zC<48Bd((;yN{qFOr$|I(Hz_$4x7~9kKT|{<(FD!1&FOK3%Y8-%)~9^M&Ek{#`>(~2
zJRZycKs;LHo9p(ZWtj|>E}qv#_xzdlK+U3*k11cd1qMq
zK5H2Zb=gA+0rMe@L`^Mh0a;ZQ5oa(yQZI+hr{pzwcWjWP?p09Dg7xLuGN7wm$_`H=)%LY+gvx=alq%!L@SE5B^9@@>G}eKFx|w
zzg_XEXG~Cv=-E36nhy`5*y%VCy&3DZPfB7`4$n}&l)&_9&%IRk;9R{m*xS&PE(qElD*rJWl
zu)sfUvZ5(F_YvF_LbYV38VT2qq&F(m1?i_4CpG`d2+MsFD(=UnQ<2vkB&^ljYKB9T
zZoz{G{hliMM`%BKWMNRZzRJK+J~xoPt&ve1G7}O;Dc>u50KBqVXky(o*h4|J#wt$B
zt$Lm1f`2iF)P(&_IVkhRp`|W+P8F%Ayxev0`@wrCW%1JK13*@d_ngR8E4B9Q-v`s1
zH!=o@j^A`rx5h-YQih$QY!c~;H`a}G)A~g;ZppUu*b;NcUrWZ#>sa9=T^QHbS6uPrOeH5hPUpo2vZu75bIk7NKu@1yN{l$>zBr
zlGJ9Z*7~HeQP?^^M*1g@31t0>NSN$zmUBr!U`#TQVqF!^0-+keuZt76Q{@g)KFV2a
zZ+M1uA=T}2JL$Z|8RIyGn&`=I&_bQ^v7u1|r7S}8V>neVcJLV%lxD3vf8QRJOYSXy
zg2{^eSjCA&{e-ES1TJIjVjGCQ7%
zW?$j#lah%MmbMhT?R)D$`xCwV>Nv;#IxfR6(ME&7cvj
zmfo*szocKa$Mr*=-qh3IOZaQ;LB>feee#1{<2)JC{u#$Seb^=%sbZSGad+doUVeU8a~lqrRZV~s_Q3vvDThK+01vL#3Y#lz%v=&4#so=q1U
zoV_yfA7n|p3RkSLKDNMo=7athEp~R++ZRad?v|wicXGi1+pbIB1e4Q8o9ZjPXESO~
zj|2-;ZXGlFYHEw(JyZQ`#1W@1$XGDUT{@*i9HI<|Ih2EnJRl)?fJWtM}bF8Uv3^f*5QxD6oX?ow=DE2wh
z5m^xg5XeMk+v%BOR9~$IW%EVe|NH-}78i@O9uHiwgrC7-QKQH584d>2_g+!i3rPVhwO9QpalH%dYH6#l#domr7G2SZ{0XG=pJs!M(
zP!Pr;Hm1!PPI466A39V<*Ffzc{2M
zmJgO#{^TpUc_k_5%YQoD&k|hD4cz6;*vdafTb~!GwnyzLF0d3&%en`<92mfFZ#k4>
zCI%TY?zo6|$V2huY_6$}4y0%H6C-~P>u1q5hNo;>gsy`{QF{E{c^vY{)*BP#>xHrr
zJbsQvENV)?Ux+ri*e>x#TfAzp(_s~s=|*$Y=}&lb{in_}N4vFjG&+6G_?G6EG6r2!
zR?@??>5#C{R#HvZslG=Mtp_dUPy(n9Pe!&_^rokT-=K6_A>6MXnIM-hl;~ItBR*60
zX>G7D-&h-o_%!P590($w2U82Qjz;5|0e~~C_?sS)As4Z=xAujM5KuHu6(tf)ecS#f
zc--K2H3Zi8do_kVsPo?$m81r%yR;i?IvoBwnty`L^;dFQtA`Jk%>Z+lr2#<-3ZtSEbu*QE$7I0|hW)c)Po(
z@8Ge2cjUJczk9%cFi%4RqP)K(tj^5ob=wNO5uTFkwU*Vb8+&U`FNxlfVPQN5#rut`
z^})`ML>$u!qRPB={fg57TaXU;S#JGzTPFfg?UJm_GXf5cakKoB5=
zsrVp{koxSY(yM)e{+cV_*%D+2&AE7wcko2hMBM;UvRSYd^<&l|J}%fuX~18q6zTZm
zf=(c5tLn1I1qRq5j;YGl(ss(Y=41d
z=C%v`MDxotXbCyJ*u9dt*>
z0x~THRgs=_%#|F&Dig}01HN86v_s$4Z83~+H+V}4t2j|>#|hSTzPPd4UGFG;TfI6g
zCx5Em8IMk?M65~l!A+b2CUPd}-y6txH=|cu#G1?ZR=m}zJBb8{s_>$=eHnk8Dq#-*aiH~9U04MsxCLN{Q6zGrvrfCC#oFLBoWSiO(x)wyn~
zl#Mx+g}8Fpxsy#bMxm3X*sjbf*R!FPF#zjJQ!a(*Pj^$Z$~T5`{5=B0>h30o_t>Z7
z97iY2F?wzJ&@Vy<4(n}Sntlqi{Kneu+!2~fI65n;N)uJ!FxH-e3J+A*fDm*iVqh-V
z9mD_tU1Kx5*zT8?+DBYNgv#i$(0}8XW#CGTiy$&k4ug*P|qTcCa7mS^X-u0UQc3OHSJAO-rG1|62k69yC(Ai_ow?tYre<44;7F+iLr4@GYi~b;
z-qIAWF~_mC3mgb;iHgUGO3+cD2y_XBWvE!hqMs$k?tX)N6Pyv9^kGVUOnQ(1y!rU?
zYqQ5Cf_RE;v~jacgBO5S{P*&@ro)iMREyk0n#UQae
zr}jSBq}e%C_>pX-IW`cpXQj?`?d{L}hCems_^VwmhK+nJez>2xx-N5cP=XG^>!xI-
zNUQ#ycf0X_LW1C?(+h9u&t?-&MBiEJ5$?PAW;&*y->TfU0K(ef?#QAA317DF2clt$
zG&dM^qmJiTwp=^g8xp{RIp%XO>@pKoY)Q%@A=K$WN^-Vlt6)VM7KgZ=XrCW8LqgGw
zNQ*Mge&G-6LHI4d?m+Is^Wf$RSBeRa>fLy(wT_@yvNiZJ_TTl*bRg|t@tw@SUO>rC
zrwaq4gC8P^TJ!V5Cm*ggb)5D4Ez$=(3Zxg9z>I%(Q)saL;bTql@YL9AJF*pRBxA9?
zH%}wKQENYVCk_o+gdJwQk5~@+RwZ;v`js#vV+{gvn
zd;SwK)yv#?l>y_L!pJGA(sw%2X$4I0_wF+@OZUz}B^oWgO|7(Mw$x_|8e9)f;bCwy
znYsWq%hOU==I-`tlT};MC}|gw%iD?3%tJLz4mXm19BJz=K~aBG;aA7Qe8kLF9)C%;
ziOf7<1S~YzT8wwx>EVC;MoCEu1}==SuZRjlO2|L)c9I|aDtW?XDHniCVJw4n{1oZ)
z5>4_g%#E+|7I{~N$7Yxqc_a36D#>i1%vDsFa7&fqR1+ir<5}f_V7fZOE2tpd3&J7i
zDl80b|4QLYvydt?Ag4JbQg#BKkx<6)FSl=B|M_mW1)d%nEyzzcMs{G$SZ;XtqBILX
zCY*$SeZs1hW>*AQ&rI2ZkipP(kA5t3(7@nwy;F}UO=#{g9`y6-ojnd%Eq<-|cAE}z
zxZR)0qUN7@K^=tyT$1+RuFenp!5Cqc+8KOYr&)}`p~1MePwKIahXp53m8S
zX{2MSANQpGaqVl%jqH?ny|eA>!LO(!14OA#fVZ${6&@UNSqR!f%+Mbselw~0gK8ft
zQKiJY))Yd$mDG>C`!{1ga)Tu0ZEBOxt5U}l{4YPQn-~gGHe}PtO52z56?$yYtqHQK
z)(xG#_3vWjNExbKJ`gOj%WNB#FzS?G@elMmbnsJlwoA9V2Z69bo+>G7#|Qz-`wDWr
z$44xb>sMqP`uAxyXWN9YshqTou>5Y$V7i9E#@Cby1QWyOK0F_|ce#)-B@Hs_gshZS
z_T4~j>S7YAy&}YhB|3e3(`Z#_x^=G*!U$>kwCkYfu1HUo#6l0tw4m~p5g#Y&w`S4X
zc@AngdJ=h|U7SR!Vt}Z#;?t+ZND^$E%Qxm5w43xQ$*lL=_3W=j@UJx$9I%P=!zn#<
zzZdXP=+j6K4!@=QTX$Bx!6J4gIlY-r+6x&}mzk!nL{CV+{E|M^m>4sWY3-X5{>kKy
ztK2H2KXHT06S!6^f{_2%yES&|CG8YHBUWGSsByhqqY>zlL6I>Dn{0kGy2K@?7h!rz
zkjRCt_wadP%Ekv;I>9brry0&0JMf%2Kn!O?v_^Ztv9G%^f-1?e3$Ccoj@rIzW+NQX
zwcVO}%wH7U6C5#FGyY4gw}TlqCG&PYDBZAUrFI*Z%V_N+9{uM<%Y0KX7&m}qnIGt(jDZChEDj^*Pz%T3nhLTz@C
zj9%IIgJ6vu6Rn$38=;LaDnH`}UuzlX&Ot4WAUB92>H}!{#hC-jD=Tmb9=EYfvm*wL
zutt8OEjZLsBU6&BdaPBb)Et=)p(T*YtAF&pqgvrN;%3{I^lV_?akXCuYz*EGvJzbjt))CJ
z?8K8)9nd;wyggomGdeRdM$F|VLB}(HbtE(<%|VHXC&t}Np30eIE?b-071kPu4Q6!)
zU3X>sKr%~efqBvaFh~yQ@fFKf?T)z2R(B;8i&pg#AWJyv50Z&$M1nm#iZhY9(;>vp
zRU=*5r$AsW@y)+S%8wPyuSHqiO15j9W1kjG2%2!%Y}W;Mo)+e&StP%(1j7M6OCYa{
zMW2tnTEHfFUQbi!T8X_O&Ne}_1f!jKDZ1G&jugCxx(o8@lVnptjU)i9jiC%)a0Tc|
z&2}`FWw>LgG4|ayGyHZ$;(%Rxz(0I|Xp29l9^PWM384+yKsL$2$x~XBYmFP~98-de
zNGS!X_$@>rVW_(195)l?aoL|>C7s#z7iWQZ-+#}dDmF^haY|G)(IqQW`#>HEP)HE^
z=1ZE$7fO4)|639q*NM(uZ_*HKtuBVxS_NLC1E?nGBbiM^=E>TVidcc~zusW8`X?qo
z##Xly_X`~S$x&tRV0k^J7K!&ym2`mpu`g01kmM@7*p
zCqW*T+_2T>Zu^a)O=Go{Sh*aKQyGdIV4RbpSNYtQpRq-gyj#hci}yNu}>lWtDk+?;1}j5&1Wllo!#HJ%qV}596
zZrgJK*SONZ2+|x2R=Va#IR!+Kk$a>B+bM=pk-;i_pf0sHI9v;cxt4H&aDf|MGlXH5
z5&=MFeMB)vQB2T6rPddomd(NFaK2uSG8>SXfAFf7z*csRL$eZBX8$$%+GS$Sze8p{@_W0~iFO{QV?n01v5~dzf
z;Ye}kb{fW*Vpk%R_j-TWIF2+seh5K
zn`VUQm-{rX7F)&ZLVa_|E&kjRXO&;2oLC=cBX*s4JjU6VEEu1cU3Ni}6sNfcQlr3;
z1A>Jm-88y0+vfmnd4lYZ->KxzEwn77s)3eO_ITz;SiBDmxdnKVZ6$^}xR-_{GGD{*2#x90P;)fXT|ki$MkrN#CO@Z<-e-a^a^N6OJX)oN;M
z$@Uvaoc~Te(Ee8viJh6DtT^V#C14=QAUTmq`FJ616<3T9SiC`dnM++pOirEBWaUPm
zR#))tegA)1Cz=N9208izmxDS=k=n7cLtB1znbb=*%K^Y?d71vtH(xo0dTUlPK(-vm
z+rX}hy&>S*MZr#y!N3;j)K*XVCp%s2`(kz94CmyFT2;qw-jGoB>EQ_{WB1sV)Hdc=4q^`+%%4&u!UAZxC;j`~?tL7KtH<45~HNz+=j
z<&1oWIW~7)H(vY$D)0gmS`OpZt>e7VL6sS8?HZ=yrGG`|{T9;gsOMP#DeZ
z^t4p}`$Y*&{QtXOf=Qx^Hkk$H)H>v;ni#+V8sdQK!*J
zPi^IqCie_G2!lAbWZ(>g7yuSFVnMoyc86%SAMOqcQ0EUDAoty6lkc
ztB{PYs?V8n7m`Ked6a*_>qj%6=@1>vjD+j&CjB$$2~WfYgP{{ZVQAHZN&NujPu-1f
zShxF|LBh619Zf-R;Cu*4RsrOrG;Kc}4iB291?EILgID~0Mc6l=B}b$6ec6U-pR
zQz6(h{=ul2i|vMiWOjtXg(zU2sp0drIv!(*6V4Y?8v~bYU^oSwz%gSHnxsmK8M}&4
z!1?XuH$iAv5^29?$nBS8|PPYk%8%bCb#i4w_EGMPJ%pypH9
zCT`8w%3{jW)bh>ogMw>Qu)AQpq@V1&k%-$?A-c=Duh;(Iyy8M?ar)Eohwx{3gE810
z-tmYduB_|ZW;@I4idyES`9p3YJvF03)G6_f!Dqe=5-Cr{R6lfdS{*mD0BkMX>dXT|
zD_Q*6FLS2_r2Z=cVVMLw>0#niTFVoRq^V@mK2HT`%q~RTrp&|J3hY~~*q4c*z^XN*
zAMmd2Wa8xOO6T2{$png@WUD@3OtBxWc%;c}$}7yxixMb>*SK#l&(Np@Pa;3x&0g!4
zku}#33VM=SPbmRh*S{X%i-@^nbG{JNk@X|U+iK)QsHW-6F^*fkZo
zM28vg!{E&$>kf=CSkWJk^mR}l+LHGYx$K|2Yj}RIK!*2k;cqDX_Wq|-H0v1&1Mmo9v0i3;
zL;bCQwGSjLZ=
zzS5c2yB>ANuOWBq>VSM#Ulw;sjusxfD=W$)
zpYqW*BF|=Sov10J)i`O%TU`!IhqmGVZ|
z0ybymQMmk@G#42@V+ngZFU^%F!Y!0$FA|MJY+BW4zXQw&xtH<>Ny=oWh(2e6V~TRB
zgIr4}5kEwlV4*$Ih6`q|;?&0k&Nt*q1DSls$%>mqm;YJjfbbmbj3K!%lkGf@w9He#
z&H_D+@*_P7`TDQfd+D0IZ8@v;GYN4BgLi#i4Ne8E>`ucW#E7q!Wk2-&6JoTMEXuqE
zTxEkE?2oOJH;&-as_Z6H@Oes~9!$@FcCFAx3MkD^yOs$2WX&%?N
z=$w}Y%tre``A0*8pN~16k58HnzqJ4_QIPiu)*O;3%W2+y-3PU64s4R0mVKM$`+cbg
z+7=WIm|g-|cQQy5n5_!|ZMt1|Hlhqxb!Op?GBsRXVMSVDZZ!LDC)`;AO3J;TIay+E
z1@qY5&Ygt-6chbpj@if0bgEwWZUzq|hsPR9EdSRXXoDE)Uukz{^H>}?Rhk#~5`qer
zaOx12?LsoR4t
zt!ylfCa#a?$2t^CR~pkQEB1b~wNwu1@s^(3bO>RX;5#h%j(=BcHEYaO!_EoDD2R
z8zdUnFN#%vcQ^Z~*q9sKdmeb!^-+{m|H$NMuy-Pi{l6T~q$%;tSPhnhS*g=(<
zI^1k)yKaEg+2gCd6RyPhV2)fISn0R;x(Xp
zd!u8M@E@Pjr%>M0Wkhxge|qb9(kSD=PW2w2IXDXZo$
zIVWfP0Xi{^i@H?^!~Oa$@bGTR$C#xcsI9kz*M$aE|Ge5b_=Na_paeFf)5E*Bny()l
zRI${<+FSkjl6HxybNl9LEor2levy78G@c9yc|P}&xZ=o$EnDEBI=0%Z*u^%@j7VBB
zT4EKoHnzI`t^g8K7Jv{)H>T%m-flZ43()xDpKvm);0g#Nyr&z>I9nRGoi0*T0%?7_
zjS7;Setf^>bX8i+C<8@|D)O|&bGutlT+c^Kb8-iC
z#yng_%QsOyAVb`WiDrt4Os*neHsiHU*)*O8f$yw>lt95Z+2Qkp~6z)?L8WwUtKqa8hVc>uA%8nu^
z+&sw^C~lEs0w;68iGMPHHme=8=CKZ8G;;%MkDs{-ei#;ijNpbfbX{~-q+AHzCM$ch
zp(|z&%Ap@b59kptGYgU{IZ(0p+^nU?#W3KezB)suTv7QtQQyq@64+t2(bDbGVv3yP
z7Nn)H>|SBJ=ZHpc3i>fH%$5Q{6)r47CsFSaerVD4YaMIcjLWC5
z`=$<7$IAYI&LtPgkgtc!AP;r8!;*DdN;|;yfBO0du+1A@%bb28FTf~}x9h_ou;|<~)KH~d_`M#LDhGqGA2n2Ps!E=#PX(0fo_*$Ot}a|DB)SuDqRc&+tjS94AuH(gm*xxq>xlkJh@MjS%s
zxD9DgPczZ>wsO}rmV4e)(R;KHs{^JyX@{
zij3iq9|S&&LcadyD!yWhl1E@vLJbYX~{A)!~tj<%^jqB|fGQ0FdIvmClEyq=zoew(?6W3ih0zsv31qBq9EieALzCeC7!s5{VRS@(#HXM_;q*pG06p(v
z6v)jOl-4Oh-NEi=w1a$TBSFUbv7fZI$XHh2)EoJcVU)4UfqyrIMizvN|}Wc~yI7YqD!5S_n{}gR;^MciwU8YPQtaxX7#Ts{fSN^{I{3
zR0cS;1vRFhMRS$eQfkBq!ygBr94j1KT{I>xJOM!wn6$qs)1#*ZiiwERO)!
zK;K(`L5$puDoF(lB5AJY^!@cjYqSHnP8K-Drq4FA^*+aV;7Feav2F+;%W^Qhn58}|
z*5&QgjPz4|8{5UWJ~alAD_zmyP-Whz?)kqj?S<4zhk#SNmG;saoW|
z%hCVpiU}#k8oj^P=i$HqnKxf
ztyg3e{?b}x-c02@t!CHcPf;pff|GAmWn_xVN~D5S?ilz-TNQbaC2rh7M4Gj+}x$&cw;rBTcef
zTY$*eL2YO}gj*Ib?0j+}K8rFGV!@V1${#xnI~OW2wn#2E$i=alnG(<@v_b$xqp91x{Nct-a}{2
zaN*4ai&Y;S`&w&8>PoVCurO~QFjHU&l@~sJO9QMUDK6rWYYtHnbxCY<8c{y0n?!@55>nP=8=SYfFEPz3$it
z=MEtPi?7xGk(CWLG?`;_?~WCkD(pa@%LS4}X7LJNYaHs44KU^=wu4EhxzZhICRCN@tRz?E(`Pm>o-S~JZUjL6(_x`BJ)uF@$HLE#
zs({P{b1i2srb7x>0@t<++A!FayzekWsCZcfzD!>@c_Sp7D9jLdHVVm!1JV~qf-g7Z?d}F=NkpSeb?}PFB|IEE6>G2*M<^4$D_M(dTl%L0}v;wjq
zZc2JB>L)2Z!wH*Vxu=TRKgU_CVZ-lolQ~$wo>Lr70)?sZ-VcOxiWS}|rX2;*-`B8Xt1!8EK
z5+*NpUUHxR6W)^wG(B86V#Z~x_6i8eSxEj7Mnup$IM1T=vxTq=36o*)ESyoIcs=%`
z5q66^QTnmpBz$dn^PPOw!gEbmQtuCs#1>X!<5cC0rE}UC0
zxa}o*x<@_W-7}GpIzT}8j@IG5ILb#=Ch3_HiE1{9+&mpXzpS1y^Sye2^MAPqqr14A
zuu=yql-ZUhRK;ZH{=bLNIfYC7Rz(Pz^g=E`${pzFD#l`WYuF+Xe8U`W!1g?(R-hKbSEXk+;ElWns538z>Hx89fN%4_lb4Z(+
z3A^cMU{dZfT1;#v+?Ccj~&BaGw|0q=5FKLzP-%xf%
zF5C?@1(r+@G!SdNMZw}F*wG}MgVzl9t_JHInz+3wlL}^|3OYGLn4yM+I2mo7?h|M*8;gd10oM{iek8jFlIW6=db4Cz7?8tRHgR
zEZuoeAM&>UfTNYtbW|yieVe{xj48Cen8}5AlpR^!`m||fc
z7CuQ&XzWy+4Wc@Sx|TP#ZMyB}J+5np0f?;xc$NZblZ>F`zdJ7zD-wY6fgPT
zOKTKC)i6m0l!>?=95B1eOzgT*rz~ou{#k~`I2gd3N%c3mLHL>0Ht6r5uyR0(uE!s;8s$b7=*mFX<5-z(}=SI+)EIeY8bN$@0A
zhck7u6CMSzju{`nEZRz6)-HnlQd<;D*cD9Lbe%LxWAg1@k>Ty^3o6ykI2C8h>lbX`?C*rYg{$`wk%+uh9L3n}lJZ
z|Nd$AaVvYGmgQxrvH1Vns(bOqxbbF&@o@-*+4aIq042{&AvejlT6+iPHJH{_9RH=+
zIpsQTEBmb#v?|KOWb&mtxXQ-3Q)1uy-;>BDe*h#7(#u!nP6AiIHdnEjyq#RZGJT&5
z3Tq{-CF?sat=&X@Zz8*UIm?W6r2U0SGAXFHM^zAP=fb1sex%2z%{h(MSxy!%x!j^a
z_=*TtVC%#jUKX-}$E&Vm2&)~Q=rEkQ12O*M*HfpFeyG>Ca95C#qG@C66WKQNAwX*_
zKdDtOBkC_rT2AYr+iD5kc92ba^uHFw@Dr$6vTxG+dP-PBV(UeG2!ynH<0)R%T!Ck1
zx))YxbM-%G_8@W=WpO1P5zNdEofFyel-z=GUfK#-*51^#yWYMx
zjO({4oLmbTZwN5CfQSElWrv%=Y3$A6Bw|(
z&2a&XuPhPI8IzB0pXo~H2Ne9-SKRozLKnR8J6u-X`2p6gQZZip$N
zv@#vf#hy1v7;=_<~HYAik#Oz
zl1)B)zV_LTPNb%wKjty!yw+#g+&lTt3;=K4_ps)0R3xUk!bNxU1xmc;9>cf!H#s#*
z-EWk--*!@dEvugLwy(yI5|%1l_pZeJ7+X^QWzU!z!l>_Ncih7DOw&L~@s7gBG!NW<
zJOwX;hgMDK=i+XC=}$?&EcB)vnsfZ8e5+sS@l&T&-NQi%2>6KcLJcg7w2zLYYQO#<
cXt{Mmg_kLK=;y50#UGz4KUXUK$L!7j0kdv}tN;K2
diff --git a/docs/articles/EDA_files/figure-html/unnamed-chunk-13-1.png b/docs/articles/EDA_files/figure-html/unnamed-chunk-13-1.png
index ae7f72086d6dee58d2162831ab6f68e02851c6ac..44735e5ec986a35f43ba2ef222c24a6fd819206d 100644
GIT binary patch
delta 14355
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