Mercurial > repos > ufz > dose_response_analysis_tool
diff dose_response.R @ 0:082e9d22c38d draft
planemo upload for repository https://github.com/bernt-matthias/mb-galaxy-tools/tools/tox_tools/baseline_calculator commit 3aebdcc7c5b266a30262402934ffaad2a58adbcb
author | ufz |
---|---|
date | Mon, 10 Jun 2024 11:57:52 +0000 |
parents | |
children | 8a1b524ed9d8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dose_response.R Mon Jun 10 11:57:52 2024 +0000 @@ -0,0 +1,76 @@ +library(drc) +library(ggplot2) + +fit_models <- function(data, concentration_col, response_col) { + models <- list( + LL.2 = drm(data[[response_col]] ~ data[[concentration_col]], data = data, fct = LL.2(), type = "binomial"), + LL.3 = drm(data[[response_col]] ~ data[[concentration_col]], data = data, fct = LL.3(), type = "binomial"), + LL.4 = drm(data[[response_col]] ~ data[[concentration_col]], data = data, fct = LL.4(), type = "binomial"), + LL.5 = drm(data[[response_col]] ~ data[[concentration_col]], data = data, fct = LL.5(), type = "binomial"), + W1.4 = drm(data[[response_col]] ~ data[[concentration_col]], data = data, fct = W1.4(), type = "binomial"), + W2.4 = drm(data[[response_col]] ~ data[[concentration_col]], data = data, fct = W2.4(), type = "binomial") + ) + return(models) +} + +select_best_model <- function(models) { + aic_values <- sapply(models, AIC) + best_model_name <- names(which.min(aic_values)) + best_model <- models[[best_model_name]] + return(list(name = best_model_name, model = best_model)) +} + +calculate_ec_values <- function(model) { + ec50 <- ED(model, 50, type = "relative") + ec25 <- ED(model, 25, type = "relative") + ec10 <- ED(model, 10, type = "relative") + return(list(EC50 = ec50, EC25 = ec25, EC10 = ec10)) +} + +plot_dose_response <- function(model, data, ec_values, concentration_col, response_col, plot_file) { + concentration_grid <- seq(min(data[[concentration_col]]), max(data[[concentration_col]]), length.out = 100) + prediction_data <- data.frame(concentration_grid) + colnames(prediction_data) <- concentration_col + predicted_values <- predict(model, newdata = prediction_data, type = "response") + prediction_data$response <- predicted_values + p <- ggplot(data, aes_string(x = concentration_col, y = response_col)) + + geom_point(color = "red") + + geom_line(data = prediction_data, aes_string(x = concentration_col, y = "response"), color = "blue") + + geom_vline(xintercept = ec_values$EC10[1], color = "green", linetype = "dashed") + + geom_vline(xintercept = ec_values$EC50[1], color = "purple", linetype = "dashed") + + labs(title = "Dose-Response Curve", x = "Concentration", y = "Effect") + + theme_minimal() + + theme( + panel.background = element_rect(fill = "white", color = NA), + plot.background = element_rect(fill = "white", color = NA) + ) + + ggsave(filename = plot_file, plot = p, device = "jpg") +} + +dose_response_analysis <- function(data, concentration_col, response_col, plot_file, ec_file) { + models <- fit_models(data, concentration_col, response_col) + best_model_info <- select_best_model(models) + ec_values <- calculate_ec_values(best_model_info$model) + plot_dose_response(best_model_info$model, data, ec_values, concentration_col, response_col, plot_file) + + ec_data <- data.frame( + EC10 = ec_values$EC10[1], + EC25 = ec_values$EC25[1], + EC50 = ec_values$EC50[1] + ) + write.csv(ec_data, ec_file, row.names = FALSE) + + return(list(best_model = best_model_info$name, ec_values = ec_values)) +} + +args <- commandArgs(trailingOnly = TRUE) + +data_file <- args[1] +concentration_col <- args[2] +response_col <- args[3] +plot_file <- args[4] +ec_file <- args[5] + +data <- read.csv(data_file, header = TRUE) +dose_response_analysis(data, concentration_col, response_col, plot_file, ec_file)