# \donttest{
# Assuming existence of rbkw, llbkw, grbkw, hsbkw functions for BKw
# Generate sample data
set.seed(123)
true_par_bkw <- c(alpha = 2, beta = 3, gamma = 1, delta = 0.5)
if (exists("rbkw")) {
sample_data_bkw <- rbkw(100, alpha = true_par_bkw[1], beta = true_par_bkw[2],
gamma = true_par_bkw[3], delta = true_par_bkw[4])
} else {
sample_data_bkw <- rgkw(100, alpha = true_par_bkw[1], beta = true_par_bkw[2],
gamma = true_par_bkw[3], delta = true_par_bkw[4], lambda = 1)
}
hist(sample_data_bkw, breaks = 20, main = "BKw(2, 3, 1, 0.5) Sample")
# --- Find MLE estimates ---
start_par_bkw <- c(1.5, 2.5, 0.8, 0.3)
mle_result_bkw <- stats::optim(par = start_par_bkw,
fn = llbkw,
gr = if (exists("grbkw")) grbkw else NULL,
method = "BFGS",
hessian = TRUE, # Ask optim for numerical Hessian
data = sample_data_bkw)
# --- Compare analytical Hessian to numerical Hessian ---
if (mle_result_bkw$convergence == 0 &&
requireNamespace("numDeriv", quietly = TRUE) &&
exists("hsbkw")) {
mle_par_bkw <- mle_result_bkw$par
cat("\nComparing Hessians for BKw at MLE estimates:\n")
# Numerical Hessian of llbkw
num_hess_bkw <- numDeriv::hessian(func = llbkw, x = mle_par_bkw, data = sample_data_bkw)
# Analytical Hessian from hsbkw
ana_hess_bkw <- hsbkw(par = mle_par_bkw, data = sample_data_bkw)
cat("Numerical Hessian (BKw):\n")
print(round(num_hess_bkw, 4))
cat("Analytical Hessian (BKw):\n")
print(round(ana_hess_bkw, 4))
# Check differences
cat("Max absolute difference between BKw Hessians:\n")
print(max(abs(num_hess_bkw - ana_hess_bkw)))
# Optional: Use analytical Hessian for Standard Errors
# tryCatch({
# cov_matrix_bkw <- solve(ana_hess_bkw)
# std_errors_bkw <- sqrt(diag(cov_matrix_bkw))
# cat("Std. Errors from Analytical BKw Hessian:\n")
# print(std_errors_bkw)
# }, error = function(e) {
# warning("Could not invert analytical BKw Hessian: ", e$message)
# })
} else {
cat("\nSkipping BKw Hessian comparison.\n")
cat("Requires convergence, 'numDeriv' package, and function 'hsbkw'.\n")
}
# }
Run the code above in your browser using DataLab