library(glmnet)
library(jsonlite)
script_dir <- dirname(sys.frame(1)$ofile)
setwd(script_dir)
datasets_dir <- file.path("..", "..", "..", "datasets", "csv")
results_dir <- file.path("..", "..", "..", "results", "r")
dir.create(results_dir, showWarnings = FALSE, recursive = TRUE)
test_datasets <- c(
"mtcars",
"bodyfat",
"prostate",
"longley",
"synthetic_collinear",
"synthetic_high_vif"
)
test_alphas <- c(0.0, 0.25, 0.5, 0.75, 0.9, 1.0)
nlambda <- 100
lambda_min_ratio <- ifelse(nrow(x) < ncol(x), 0.01, 0.0001)
load_dataset <- function(dataset_name) {
csv_path <- file.path(datasets_dir, paste0(dataset_name, ".csv"))
if (!file.exists(csv_path)) {
stop(paste("Dataset file not found:", csv_path))
}
data <- read.csv(csv_path, stringsAsFactors = FALSE)
y <- data[, 1]
X <- as.matrix(data[, -1])
if (ncol(X) < 2) {
cat(sprintf(" INFO: Adding dummy predictor (zeros) for %s\n", dataset_name))
X <- cbind(X, rep(0, length(y)))
}
list(y = y, X = X, n = length(y), p = ncol(X))
}
generate_elastic_net_result <- function(dataset_name, alpha) {
cat(sprintf("\n=== Processing: %s (alpha = %.2f) ===\n", dataset_name, alpha))
data <- load_dataset(dataset_name)
X <- data$X
y <- data$y
t_start <- Sys.time()
fit <- glmnet(
X, y,
alpha = alpha,
nlambda = nlambda,
standardize = TRUE,
intercept = TRUE
)
t_elapsed <- as.numeric(difftime(Sys.time(), t_start, units = "secs"))
lambda_sequence <- fit$lambda
coef_matrix <- as.matrix(coef(fit))
coefficients <- lapply(1:nlambda, function(i) {
as.numeric(coef_matrix[, i])
})
nonzero_counts <- sapply(coefficients, function(coef) {
sum(abs(coef[-1]) > 1e-10) })
y_pred_final <- as.numeric(predict(fit, X, s = lambda_sequence[nlambda]))
residuals_final <- y - y_pred_final
test_indices <- c(1, floor(nlambda / 2), nlambda)
test_predictions <- lapply(test_indices, function(idx) {
as.numeric(predict(fit, X, s = lambda_sequence[idx]))
})
result <- list(
test = "elastic_net",
method = "glmnet",
alpha = alpha,
n = data$n,
p = data$p,
nlambda = nlambda,
lambda_sequence = as.numeric(lambda_sequence),
coefficients = coefficients,
nonzero_counts = as.integer(nonzero_counts),
fitted_values = as.numeric(y_pred_final),
residuals = as.numeric(residuals_final),
test_predictions = test_predictions,
glmnet_version = as.character(packageVersion("glmnet")),
fit_time_seconds = t_elapsed
)
result
}
save_result <- function(result, dataset_name, alpha) {
alpha_str <- gsub("\\.", "_", as.character(alpha))
filename <- sprintf("%s_elastic_net_alpha_%s.json", dataset_name, alpha_str)
output_path <- file.path(results_dir, filename)
write toJSON(result, auto_unbox = TRUE, pretty = TRUE), output_path
cat(sprintf(" Saved: %s\n", filename))
}
cat("\n")
cat("╔══════════════════════════════════════════════════════════════════════╗\n")
cat("║ Elastic Net Reference Generation (glmnet) ║\n")
cat("╚══════════════════════════════════════════════════════════════════════╝\n")
cat("\n")
total_tests <- length(test_datasets) * length(test_alphas)
current_test <- 0
for (dataset_name in test_datasets) {
for (alpha in test_alphas) {
current_test <- current_test + 1
cat(sprintf("\n[Test %d/%d] ", current_test, total_tests))
tryCatch({
result <- generate_elastic_net_result(dataset_name, alpha)
save_result(result, dataset_name, alpha)
}, error = function(e) {
cat(sprintf("\n ERROR processing %s (alpha=%.2f): %s\n", dataset_name, alpha, e$message))
})
}
}
cat("\n")
cat("╔══════════════════════════════════════════════════════════════════════╗\n")
cat("║ Summary ║\n")
cat("╚══════════════════════════════════════════════════════════════════════╝\n")
cat("\n")
cat(sprintf(" Datasets processed: %d\n", length(test_datasets)))
cat(sprintf(" Alpha values tested: %s\n", paste(test_alphas, collapse = ", ")))
cat(sprintf(" Total reference files: %d\n", total_tests))
cat("\n")
cat(" Results saved to:", results_dir, "\n")
cat("\n")