# \donttest{
# Generate sample data from a known BKw distribution
set.seed(2203)
true_par_bkw <- c(alpha = 2.0, beta = 1.5, gamma = 1.5, delta = 0.5)
sample_data_bkw <- rbkw(1000, alpha = true_par_bkw[1], beta = true_par_bkw[2],
gamma = true_par_bkw[3], delta = true_par_bkw[4])
hist(sample_data_bkw, breaks = 20, main = "BKw(2, 1.5, 1.5, 0.5) Sample")
# --- Maximum Likelihood Estimation using optim ---
# Initial parameter guess
start_par_bkw <- c(1.8, 1.2, 1.1, 0.3)
# Perform optimization (minimizing negative log-likelihood)
mle_result_bkw <- stats::optim(par = start_par_bkw,
fn = llbkw, # Use the BKw neg-log-likelihood
method = "BFGS", # Needs parameters > 0, consider L-BFGS-B
hessian = TRUE,
data = sample_data_bkw)
# Check convergence and results
if (mle_result_bkw$convergence == 0) {
print("Optimization converged successfully.")
mle_par_bkw <- mle_result_bkw$par
print("Estimated BKw parameters:")
print(mle_par_bkw)
print("True BKw parameters:")
print(true_par_bkw)
} else {
warning("Optimization did not converge!")
print(mle_result_bkw$message)
}
# --- Compare numerical and analytical derivatives (if available) ---
# Requires 'numDeriv' package and analytical functions 'grbkw', 'hsbkw'
if (mle_result_bkw$convergence == 0 &&
requireNamespace("numDeriv", quietly = TRUE) &&
exists("grbkw") && exists("hsbkw")) {
cat("\nComparing Derivatives at BKw MLE estimates:\n")
# Numerical derivatives of llbkw
num_grad_bkw <- numDeriv::grad(func = llbkw, x = mle_par_bkw, data = sample_data_bkw)
num_hess_bkw <- numDeriv::hessian(func = llbkw, x = mle_par_bkw, data = sample_data_bkw)
# Analytical derivatives (assuming they return derivatives of negative LL)
ana_grad_bkw <- grbkw(par = mle_par_bkw, data = sample_data_bkw)
ana_hess_bkw <- hsbkw(par = mle_par_bkw, data = sample_data_bkw)
# Check differences
cat("Max absolute difference between gradients:\n")
print(max(abs(num_grad_bkw - ana_grad_bkw)))
cat("Max absolute difference between Hessians:\n")
print(max(abs(num_hess_bkw - ana_hess_bkw)))
} else {
cat("\nSkipping derivative comparison for BKw.\n")
cat("Requires convergence, 'numDeriv' package and functions 'grbkw', 'hsbkw'.\n")
}
# }
Run the code above in your browser using DataLab