################################################################################
# Function: catvar.size
# Programmer: Tom Kincaid
# Date: September 27, 2002
# Last Revised: March 27, 2020
#
#' Variance Estimates of the Estimated Size for Categorical Data
#'
#' This function calculates variance estimates of the estimated size in each of
#' a set of categories. Either the simple random sampling (SRS) variance
#' estimator or the local mean variance estimator is calculated, which is
#' subject to user control. The SRS variance estimator uses the independent
#' random sample approximation to calculate joint inclusion probabilities. The
#' function can accomodate single-stage and two-stage samples.
#'
#' @param z Vector of the values of the categorical response variable or the
#' site status for each site.
#'
#' @param wgt Vector of the final adjusted weight (inverse of the sample
#' inclusion probability) for each site, which is either the weight for a
#' single-stage sample or the stage two weight for a two-stage sample.
#'
#' @param x Vecteor of the x-coordinates for location for each site, which is
#' either the x-coordinate for a single-stage sample or the stage two
#' x-coordinate for a two-stage sample.
#'
#' @param y Vector of the y-coordinates for location for each site, which is
#' either the y-coordinate for a single-stage sample or the stage two
#' y-coordinate for a two-stage sample.
#'
#' @param size Vector of the size values for each site.
#'
#' @param stratum.ind Logical value that indicates whether the sample is
#' stratified, where TRUE = a stratified sample and FALSE = not a stratified
#' sample.
#'
#' @param stratum.level Vector of the stratum for each site.
#'
#' @param cluster.ind Logical value that indicates whether the sample is a
#' two-stage sample, where TRUE = a two-stage sample and FALSE = not a
#' two-stage sample.
#'
#' @param cluster Vector of the stage one sampling units (primary sampling
#' unit or cluster) code for each site.
#'
#' @param wgt1 Vector of the final adjusted stage one weight for each site.
#'
#' @param x1 Vector of the stage one x-coordinates for location for each site.
#'
#' @param y1 Vector of the stage one y-coordinates for location for each site.
#'
#' @param pcfactor.ind Logical value that indicates whether the population
#' correction factor is used during variance estimation, where TRUE = use the
#' population correction factor and FALSE = do not use the factor. To employ
#' the correction factor for a single-stage sample, values must be supplied
#' for arguments pcfsize and support. To employ the correction factor for a
#' two-stage sample, values must be supplied for arguments N.cluster,
#' stage1size, and support.
#'
#' @param pcfsize Size of the resource, which is required for calculation of
#' finite and continuous population correction factors for a single-stage
#' sample. For a stratified sample this argument must be a vector containing a
#' value for each stratum and must have the names attribute set to identify
#' the stratum codes.
#'
#' @param N.cluster The number of stage one sampling units in the resource,
#' which is required for calculation of finite and continuous population
#' correction factors for a two-stage sample. For a stratified sample this
#' variable must be a vector containing a value for each stratum and must have
#' the names attribute set to identify the stratum codes.
#'
#' @param stage1size Size of the stage one sampling units of a two-stage
#' sample, which is required for calculation of finite and continuous
#' population correction factors for a two-stage sample and must have the
#' names attribute set to identify the stage one sampling unit codes. For a
#' stratified sample, the names attribute must be set to identify both stratum
#' codes and stage one sampling unit codes using a convention where the two
#' codes are separated by the & symbol, e.g., "Stratum 1&Cluster 1".
#'
#' @param support Vector of the support value for each site - the value one
#' (1) for a site from a finite resource or the measure of the sampling unit
#' associated with a site from a continuous resource, which is required for
#' calculation of finite and continuous population correction factors.
#'
#' @param vartype The choice of variance estimator, where "Local" = local mean
#' estimator and "SRS" = SRS estimator.
#'
#' @param warn.ind Logical value that indicates whether warning messages were
#' generated, where TRUE = warning messages were generated and FALSE = warning
#' messages were not generated.
#'
#' @param warn.df A data frame for storing warning messages.
#'
#' @param warn.vec A vector that contains names of the population type, the
#' subpopulation, and an indicator.
#'
#' @return An object in list format composed of a vector named varest, which
#' contains variance estimates, a logical variable named warn,ind, which is
#' the indicator for warning messges, and a data frame named warn.df, which
#' contains warning messages.
#'
#' @section Other Functions Required:
#' \describe{
#' \item{\code{\link{localmean.weight}}}{calculate the weighting matrix for
#' the local mean variance estimator}
#' \item{\code{\link{localmean.var}}}{calculate the local mean variance
#' estimator}
#' }
#'
#' @author Tom Kincaid \email{kincaid.tom@epa.gov}
#'
#' @keywords survey
#'
#' @export
################################################################################
catvar.size <- function(z, wgt, x, y, size, stratum.ind, stratum.level,
cluster.ind, cluster, wgt1, x1, y1, pcfactor.ind, pcfsize, N.cluster,
stage1size, support, vartype, warn.ind, warn.df, warn.vec) {
# Assign the function name
fname <- "catvar.size"
# Branch to handle two-stage and single-stage samples
if(cluster.ind) {
# Begin the section for a two-stage sample
# Calculate additional required values
m <- length(size)
cluster <- factor(cluster)
cluster.levels <- levels(cluster)
ncluster <- length(cluster.levels)
z.lst <- split(z, cluster)
if(vartype == "Local") {
x2.lst <- split(x, cluster)
y2.lst <- split(y, cluster)
x1.u <- as.vector(tapply(x1, cluster, unique))
y1.u <- as.vector(tapply(y1, cluster, unique))
}
wgt2.lst <- split(wgt, cluster)
wgt1.u <- as.vector(tapply(wgt1, cluster, unique))
if(pcfactor.ind) {
support.lst <- split(support, cluster)
} else {
support.lst <- NULL
}
var.ind <- sapply(split(cluster, cluster), length) > 1
# Calculate estimates of the total of the stage two sampling unit response
# variable and the variance of those totals for each stage one sampling unit
total2est <- matrix(0, ncluster, m)
var2est <- matrix(0, ncluster, m)
for(i in 1:ncluster) {
# Calculate the weighted indicator matrix
n <- length(z.lst[[i]])
im <- cbind(tapply(wgt2.lst[[i]], z.lst[[i]]) == matrix(rep(1:(m-1), n), nrow = n, byrow = TRUE), rep(1,n)) * matrix(rep(wgt2.lst[[i]], m), nrow = n)
# Calculate total estimates for the stage one sampling unit
total2est[i,] <- apply(im, 2, sum)
# Adjust the variance estimator for small sample size
SRSind <- FALSE
if(vartype == "Local" && n < 4) {
warn.ind <- TRUE
act <- "The simple random sampling variance estimator was used.\n"
if(stratum.ind) {
warn <- paste("There are less than four response values for stage one sampling unit ", cluster.levels[i], "\nin stratum ", stratum.level, ", the simple random sampling variance estimator \nwas used to calculate variance of the category size estimates.\n", sep="")
warn.df <- rbind(warn.df, data.frame(func=I(fname),
subpoptype=warn.vec[1], subpop=warn.vec[2],
indicator=warn.vec[3], stratum=I(stratum.level),
warning=I(warn), action=I(act)))
} else {
warn <- paste("There are less than four response values for stage one sampling unit ", cluster.levels[i], ", \nthe simple random sampling variance estimator was used to calculate variance of \nthe category size estimates.\n", sep="")
warn.df <- rbind(warn.df, data.frame(func=I(fname),
subpoptype=warn.vec[1], subpop=warn.vec[2],
indicator=warn.vec[3], stratum=NA, warning=I(warn),
action=I(act)))
}
vartype <- "SRS"
SRSind <- TRUE
}
# Calculate the population correction factor for the stage two sample
pcfactor <- ifelse(pcfactor.ind, (stage1size[i] - sum(support.lst[[i]]))/stage1size[i], 1)
# Calculate variance estimates for the stage one sampling unit
if(var.ind[i]) {
if(vartype == "Local") {
weight.lst <- localmean.weight(x2.lst[[i]], y2.lst[[i]], 1/wgt2.lst[[i]])
var2est[i,] <- pcfactor*apply(im, 2, localmean.var, weight.lst)
} else {
var2est[i,] <- pcfactor*n*apply(im, 2, var)
if(SRSind)
vartype <- "Local"
}
}
}
# Adjust the variance estimator for small sample size
if(vartype == "Local" && ncluster < 4) {
warn.ind <- TRUE
act <- "The simple random sampling variance estimator was used.\n"
if(stratum.ind) {
warn <- paste("There are less than four stage one sampling units in stratum ", stratum.level, ", \nthe simple random sampling variance estimator was used to calculate variance of \nthe category size estimates.\n", sep="")
warn.df <- rbind(warn.df, data.frame(func=I(fname),
subpoptype=warn.vec[1], subpop=warn.vec[2],
indicator=warn.vec[3], stratum=I(stratum.level), warning=I(warn),
action=I(act)))
} else {
warn <- paste("There are less than four stage one sampling units, the simple random sampling \nvariance estimator was used to calculate variance of the category size \nestimates.\n", sep="")
warn.df <- rbind(warn.df, data.frame(func=I(fname),
subpoptype=warn.vec[1], subpop=warn.vec[2],
indicator=warn.vec[3], stratum=NA, warning=I(warn),
action=I(act)))
}
vartype <- "SRS"
}
# Calculate the population correction factor for the stage one sample
pcfactor <- ifelse(pcfactor.ind, (N.cluster - ncluster)/N.cluster, 1)
# Calculate the variance estimate
if(vartype == "Local") {
weight.lst <- localmean.weight(x1.u, y1.u, 1/wgt1.u)
varest <- pcfactor*apply(total2est * matrix(rep(wgt1.u, m), nrow = ncluster), 2, localmean.var, weight.lst) + apply(var2est * matrix(rep(wgt1.u, m), nrow = ncluster), 2, sum)
} else {
varest <- pcfactor*ncluster*apply(total2est * matrix(rep(wgt1.u, m), nrow = ncluster), 2, var) + apply(var2est * matrix(rep(wgt1.u, m), nrow = ncluster), 2, sum)
}
# End of section for a two-stage sample
} else {
# Begin the section for a single-stage sample
# Calculate additional required values
n <- length(z)
m <- length(size)
# Calculate the weighted indicator matrix
im <- cbind(tapply(wgt, z) == matrix(rep(1:(m-1), n), nrow = n, byrow = TRUE), rep(1,n)) * matrix(rep(wgt, m), nrow = n)
# Adjust the variance estimator for small sample size
if(vartype == "Local" && n < 4) {
warn.ind <- TRUE
act <- "The simple random sampling variance estimator was used.\n"
if(stratum.ind) {
warn <- paste("There are less than four response values in stratum ", stratum.level, ", \nthe simple random sampling variance estimator was used to calculate variance of \nthe category size estimates.\n", sep="")
warn.df <- rbind(warn.df, data.frame(func=I(fname),
subpoptype=warn.vec[1], subpop=warn.vec[2],
indicator=warn.vec[3], stratum=I(stratum.level), warning=I(warn),
action=I(act)))
} else {
warn <- "\nThere are less than four response values, the simple random sampling variance \nestimator was used to calculate variance of the category size estimates.\n"
warn.df <- rbind(warn.df, data.frame(func=I(fname),
subpoptype=warn.vec[1], subpop=warn.vec[2],
indicator=warn.vec[3], stratum=NA, warning=I(warn),
action=I(act)))
}
vartype <- "SRS"
}
# Calculate the population correction factor
pcfactor <- ifelse(pcfactor.ind, (pcfsize - sum(support))/pcfsize, 1)
# Calculate the variance estimate
if(vartype == "Local") {
weight.lst <- localmean.weight(x, y, 1/wgt)
varest <- pcfactor*apply(im, 2, localmean.var, weight.lst)
} else {
varest <- pcfactor*n*apply(im, 2, var)
}
# End section for a single-stage sample
}
# Return the variance estimate, the warning message indicator, and the warn.df
# data frame
list(varest=varest, warn.ind=warn.ind, warn.df=warn.df)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.