#' Function to estimate Biomass or CPUE from stratified-random survey design
#'
#' This function estimates a design-based survey estimator for a stratified-random survey
#' design. Either a population biomass or CPUE can be output. At the moment the function is
#' set up to incorporate the Gulf of Alaska or the Aleutian Islands bottom trawl survey.
#' It requires CPUE data, Strata designations and total area (in km^2). It can also be used
#' to calculate an estimate for only the trawlable portion of the strata.
#'
#' @param Catch Catch-per-unit-of-effort for each bottom trawl haul
#' @param Year Survey year
#' @param Strata Strata designation for each haul
#' @param Strata_area Area of the strata in km2 where each haul occurs
#' @param Region Either "GOA" (the default) or "AI"
#' @param Proportion_trawlable The proportion of the strata that can be sampled by the survey
#' trawl (default is 1)
#' @param method Either "Biomass" or "CPUE"
#' @keywords stratified random survey, survey abundance index
#' @export
#' @examples
#' design.index<-Stratified_CPUE(Design.data$juvenile_POP_CPUE,Design.data$year,Design.data$STRATUM,Design.data$AREA_KM2,"GOA",1, "CPUE")
#' design.index<-Stratified_CPUE(Design.data$juvenile_POP_CPUE,Design.data$year,Design.data$STRATUM,Design.data$AREA_KM2,"AI",Design.data$Trawlable, "Biomass")
####FUNCTION FOR STRATIFIED BIOMASS ESTIMATE#######################
Stratified_CPUE<-function(Catch,Year,Strata,Strata_area,Region="GOA",Proportion_trawlable=1, method="Biomass"){
#Strata<-Design.data$STRATUM
#Catch<-Design.data$juvenile_POP_CPUE
#Year<-Design.data$year
#Strata_area<-Design.data$AREA_KM2
if(length(Proportion_trawlable)==1){Proportion_trawlable<-rep(Proportion_trawlable,length(Strata_area))}
stratas<-unique(Strata)
years<-unique(Year)
Strat_index1<-array(dim=c(length(years),6))
if(Region=="GOA"){Strat_index2<-array(dim=c(59,8))}
if(Region=="AI"){Strat_index2<-array(dim=c(45,8))}
if(method=="Biomass"){
for(i in 1:length(years)){
for(j in 1:length(stratas)){
CPUE<-subset(Catch,Strata==stratas[j]&Year==years[i])
if(length(CPUE)>1){
CPUEh<-mean(CPUE)
varCPUEh<-var(CPUE)
area<-mean(subset(Strata_area,Strata==stratas[j]&Year==years[i]),na.rm=TRUE)
prop<-mean(subset(Proportion_trawlable,Strata==stratas[j]&Year==years[i]),na.rm=TRUE)
area<-area*prop
Biomassh<-CPUEh*area
varBiomassh<-area^2*varCPUEh/length(CPUE)
tval<-qt(1-.05/2,df=(length(CPUE)-1))
Strat_index2[j,1]<-stratas[j]
Strat_index2[j,2]<-area
Strat_index2[j,3]<-CPUEh
Strat_index2[j,4]<-varCPUEh
Strat_index2[j,5]<-Biomassh
Strat_index2[j,6]<-varBiomassh
Strat_index2[j,7]<-Biomassh-tval*sqrt(varBiomassh)
Strat_index2[j,8]<-Biomassh+tval*sqrt(varBiomassh)
}
if(length(CPUE)<1){Strat_index2[j,1]<-stratas[j]}
}
Biomassy<-sum(Strat_index2[,5],na.rm=TRUE)
varBiomassy<-sum(Strat_index2[,6],na.rm=TRUE)
tval<-qt(1-.05/2,df=(length(stratas)-1))
#tval<-1.96
Strat_index1[i,1]<-years[i]
Strat_index1[i,2]<-Biomassy
Strat_index1[i,3]<-varBiomassy
Strat_index1[i,4]<-sqrt(varBiomassy)
Strat_index1[i,5]<-Biomassy-tval*sqrt(varBiomassy)
Strat_index1[i,6]<-Biomassy+tval*sqrt(varBiomassy)
}
colnames(Strat_index1)<-c("Year","Biomass","Var","SE","Lower_CI","Upper_CI")
Strat_index1<-Strat_index1[order(Strat_index1[,1]),]
return(data.frame(Strat_index1))}
#############################################################################
if(method=="CPUE"){
for(i in 1:length(years)){
for(j in 1:length(stratas)){
CPUE<-subset(Catch,Strata==stratas[j]&Year==years[i])
if(length(CPUE)>1){
CPUEh<-mean(CPUE)
varCPUEh<-var(CPUE)
area<-mean(subset(Strata_area,Strata==stratas[j]&Year==years[i]),na.rm=TRUE)
prop<-mean(subset(Proportion_trawlable,Strata==stratas[j]&Year==years[i]),na.rm=TRUE)
area<-area*prop
Biomassh<-CPUEh*area
varBiomassh<-area^2*varCPUEh/length(CPUE)
tval<-qt(1-.05/2,df=(length(CPUE)-1))
Strat_index2[j,1]<-stratas[j]
Strat_index2[j,2]<-area
Strat_index2[j,3]<-CPUEh
Strat_index2[j,4]<-varCPUEh
Strat_index2[j,5]<-length(CPUE)
Strat_index2[j,6]<-varBiomassh
Strat_index2[j,7]<-Biomassh-tval*sqrt(varBiomassh)
Strat_index2[j,8]<-Biomassh+tval*sqrt(varBiomassh)
}
if(length(CPUE)<1){Strat_index2[j,1]<-stratas[j]}
}
CPUEy<-sum(Strat_index2[,3]*Strat_index2[,2],na.rm=TRUE)/sum(Strat_index2[,2],na.rm=TRUE)
varCPUEy<-sum((Strat_index2[,2]/sum(Strat_index2[,2],na.rm=TRUE))^2*(Strat_index2[,4]/Strat_index2[,5]),na.rm=TRUE)
tval<-qt(1-.05/2,df=(length(stratas)-1))
#tval<-1.96
Strat_index1[i,1]<-years[i]
Strat_index1[i,2]<-CPUEy
Strat_index1[i,3]<-varCPUEy
Strat_index1[i,4]<-sqrt(varCPUEy)
Strat_index1[i,5]<-CPUEy-tval*sqrt(varCPUEy)
Strat_index1[i,6]<-CPUEy+tval*sqrt(varCPUEy)
}
colnames(Strat_index1)<-c("Year","CPUE","Var","SE","Lower_CI","Upper_CI")
Strat_index1<-Strat_index1[order(Strat_index1[,1]),]
return(data.frame(Strat_index1))}
}
#' Function to get the strata area for a stratum
#'
#' This function reads in the GOA and AI stratum tables so that a stratum area can be designated
#' for each bottom trawl haul where the stratum is known.
#'
#' @param data data set where the stratum area is needed
#' @param strata_column Strata designation for each haul
#' @param region Either "GOA" or "AI"
#' @keywords stratified random survey
#' @export
#' @examples
#' Design.data<-get_strata_area(Juvenile_POP_Data,"STRATUM","GOA")
get_strata_area<-function(data,strata_column, region){
if(region=="GOA"){
data(goa.strata.area)
strata_area<-merge(data,goa.strata.area,by.x=strata_column,by.y="STRATUM",all.x=TRUE)
return(strata_area)
}
if(region=="AI"){
data(goa.strata.area)
strata_area<-merge(data,ai.strata.area,by.x=strata_column,by.y="STRATUM",all.x=TRUE)
return(strata_area)
}
}
#' Function to calculate root-mean-squared-error for a model
#'
#' This function calculates the rmse for a model given the observed and predicted
#' observations. It was stolen from Brian Stock.
#'
#' @param obs CPUE observations
#' @param pred Predicted CPUE from a model
#' @keywords model evaluation
#' @export
#' @examples
#' calc_RMSE(glm.cpue$fitted.values,Juvenile_POP_Data$juvenile_POP_CPUE)
calc_RMSE <- function(pred, obs){
RMSE <- round(sqrt(mean((pred-obs)^2)),3)
return(RMSE)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.