You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#' Estimate Zero Truncated Binomial Parameters#'#' @family Parameter Estimation#' @family Binomial#' @family Zero Truncated Distribution#'#' @author Steven P. Sanderson II, MPH#'#' @details This function will attempt to estimate the zero truncated #' binomial size and prob parameters given some vector of values.#'#' @description The function will return a list output by default, and if the parameter#' `.auto_gen_empirical` is set to `TRUE` then the empirical data given to the#' parameter `.x` will be run through the `tidy_empirical()` function and combined#' with the estimated binomial data.#'#' One method of estimating the parameters is done via:#' - MLE via \code{\link[stats]{optim}} function.#'#' @param .x The vector of data to be passed to the function.#' @param .auto_gen_empirical This is a boolean value of TRUE/FALSE with default#' set to TRUE. This will automatically create the `tidy_empirical()` output#' for the `.x` parameter and use the `tidy_combine_distributions()`. The user#' can then plot out the data using `$combined_data_tbl` from the function output.#'#' @examples#' library(dplyr)#' library(ggplot2)#' library(actuar)#' #' x <- as.integer(mtcars$mpg)#' output <- util_zero_truncated_binomial_param_estimate(x)#'#' output$parameter_tbl#'#' output$combined_data_tbl |>#' tidy_combined_autoplot()#'#' set.seed(123)#' t <- rztbinom(100, 10, .1)#' util_zero_truncated_binomial_param_estimate(t)$parameter_tbl#'#' @return#' A tibble/list#' #' @name util_zero_truncated_binomial_param_estimateNULL#' @export#' @rdname util_zero_truncated_binomial_param_estimateutil_zero_truncated_binomial_param_estimate<-function(.x, .auto_gen_empirical=TRUE) {
# Check if actuar library is installedif (!requireNamespace("actuar", quietly=TRUE)) {
stop("The 'actuar' package is needed for this function. Please install it with: install.packages('actuar')")
}
# Tidyeval ----x_term<- as.numeric(.x)
sum_x<- sum(x_term, na.rm=TRUE)
minx<- min(x_term)
maxx<- max(x_term)
m<- mean(x_term, na.rm=TRUE)
n<- length(x_term)
# Negative log-likelihood function for zero-truncated binomial distributionnll_func<-function(par) {
n<-par[1]
p<-par[2]
if (n<=0||p<=0||p>=1) {
return(-Inf)
}
-sum(actuar::dztbinom(x_term, size=n, prob=p, log=TRUE))
}
# Initial parameter guesses initial_params<- c(size= max(x_term), prob=0.5) # Adjust based on your data# Optimization using optim()optim_result<- optim(
par=initial_params,
fn=nll_func
) |>
suppressWarnings()
# Extract estimated parametersmle_size<-optim_result$par[1]
mle_prob<-optim_result$par[2]
mle_msg<-optim_result$message# Create output tibbleret<-tibble::tibble(
dist_type="Zero-Truncated Binomial",
samp_size=n,
min=minx,
max=maxx,
mean=m,
method="MLE_Optim",
size=mle_size,
prob=mle_prob,
message=mle_msg
)
# Attach attributes
attr(ret, "tibble_type") <-"parameter_estimation"
attr(ret, "family") <-"zero_truncated_binomial"
attr(ret, "x_term") <-.x
attr(ret, "n") <-nif (.auto_gen_empirical) {
# Generate empirical data# Assuming tidy_empirical and tidy_combine_distributions functions existte<- tidy_empirical(.x=.x)
td<- tidy_zero_truncated_binomial(
.n=n,
.size= round(mle_size, 3),
.prob= round(mle_prob, 3)
)
combined_tbl<- tidy_combine_distributions(te, td)
output<-list(
combined_data_tbl=combined_tbl,
parameter_tbl=ret
)
} else {
output<-list(
parameter_tbl=ret
)
}
return(output)
}
#' Calculate Akaike Information Criterion (AIC) for Zero-Truncated Binomial Distribution#'#' This function calculates the Akaike Information Criterion (AIC) for a #' zero-truncated binomial (ZTB) distribution fitted to the provided data.#'#' @family Utility#' @author Steven P. Sanderson II, MPH#'#' @description#' This function estimates the parameters (`size` and `prob`) of a ZTB#' distribution from the provided data using maximum likelihood estimation #' (via the `optim()` function), and then calculates the AIC value based on the #' fitted distribution. #'#' @param .x A numeric vector containing the data (non-zero counts) to be #' fitted to a ZTB distribution.#'#' @details#' **Initial parameter estimates:** The choice of initial values for `size` #' and `prob` can impact the convergence of the optimization. Consider using #' prior knowledge or method of moments estimates to obtain reasonable starting #' values. #'#' **Optimization method:** The default optimization method used is #' "L-BFGS-B," which allows for box constraints to keep the parameters within #' valid bounds. You might explore other optimization methods available in #' `optim()` for potentially better performance or different constraint #' requirements.#'#' **Data requirements:** The input data `.x` should consist of non-zero counts, #' as the ZTB distribution does not include zero values. Additionally, the #' values in `.x` should be less than or equal to the estimated `size` parameter.#'#' **Goodness-of-fit:** While AIC is a useful metric for model comparison, it's #' recommended to also assess the goodness-of-fit of the chosen ZTB model using#' visualization (e.g., probability plots, histograms) and other statistical #' tests (e.g., chi-square goodness-of-fit test) to ensure it adequately #' describes the data.#'#' @examples#' library(actuar)#' #' # Example data#' set.seed(123)#' x <- rztbinom(30, size = 10, prob = 0.4)#' #' # Calculate AIC#' util_zero_truncated_binomial_aic(x)#'#' @return The AIC value calculated based on the fitted ZTB distribution to #' the provided data.#'#' @name util_zero_truncated_binomial_aicNULL#' @export#' @rdname util_zero_truncated_binomial_aicutil_zero_truncated_binomial_aic<-function(.x) {
# Check if actuar library is installedif (!requireNamespace("actuar", quietly=TRUE)) {
stop("The 'actuar' package is needed for this function. Please install it with: install.packages('actuar')")
}
# Tidyevalx<- as.numeric(.x)
# Negative log-likelihood function for zero-truncated binomial distributionneg_log_lik_rztbinom<-function(params, data) {
size<-params[1]
prob<-params[2]
n<- length(data)
-sum(actuar::dztbinom(data, size=size, prob=prob, log=TRUE))
}
# Initial parameter guesses (adjust if needed)pe<- util_zero_truncated_binomial_param_estimate(x)$parameter_tbl# Fit zero-truncated binomial distribution to datafit_rztbinom<- optim(
par= c(size= round(pe$size, 3), prob= round(pe$prob, 3)),
fn=neg_log_lik_rztbinom,
data=x
) |>
suppressWarnings()
# Extract log-likelihood and number of parameterslogLik_rztbinom<- round(-fit_rztbinom$value, 4)
k_rztnbinom<-2# Number of parameters (size and prob)# Calculate AICAIC_rztbinom<-2*k_rztnbinom-2*logLik_rztbinom# Return AIC valuereturn(AIC_rztbinom)
}
Parameter Estimate Function
Function:
Example:
AIC
Function:
Example:
Stats Tibble
Function:
Example:
The text was updated successfully, but these errors were encountered: