From 15f99ad41b90250d6e4e2060ca5770bef7a6a4eb Mon Sep 17 00:00:00 2001 From: Bryan Roessler Date: Mon, 7 Oct 2024 13:37:53 -0400 Subject: [PATCH] Fix y~x predictor column names --- .../apps/r/calculate_interaction_zscores.R | 125 ++++++++++-------- 1 file changed, 72 insertions(+), 53 deletions(-) diff --git a/qhtcp-workflow/apps/r/calculate_interaction_zscores.R b/qhtcp-workflow/apps/r/calculate_interaction_zscores.R index 143d69e8..dd2a5863 100644 --- a/qhtcp-workflow/apps/r/calculate_interaction_zscores.R +++ b/qhtcp-workflow/apps/r/calculate_interaction_zscores.R @@ -217,7 +217,7 @@ calculate_interaction_scores <- function(df, df_bg, type, overlap_threshold = 2) group_vars <- c("OrfRep", "Gene", "Drug") } - perform_lm_simple <- function(x, y, max_conc) { + perform_lm <- function(x, y, max_conc) { if (all(is.na(x)) || all(is.na(y)) || length(x[!is.na(x)]) == 0 || length(y[!is.na(y)]) == 0) { return(list(intercept = NA, slope = NA, r_squared = NA, score = NA)) } else { @@ -316,10 +316,10 @@ calculate_interaction_scores <- function(df, df_bg, type, overlap_threshold = 2) group_by(across(all_of(group_vars))) %>% mutate( # Apply the simple LM function for each variable - lm_L = list(perform_lm_simple(Delta_L, conc_num_factor, max_conc)), - lm_K = list(perform_lm_simple(Delta_K, conc_num_factor, max_conc)), - lm_r = list(perform_lm_simple(Delta_r, conc_num_factor, max_conc)), - lm_AUC = list(perform_lm_simple(Delta_AUC, conc_num_factor, max_conc)), + lm_L = list(perform_lm(Delta_L, conc_num_factor, max_conc)), + lm_K = list(perform_lm(Delta_K, conc_num_factor, max_conc)), + lm_r = list(perform_lm(Delta_r, conc_num_factor, max_conc)), + lm_AUC = list(perform_lm(Delta_AUC, conc_num_factor, max_conc)), # Extract coefficients and statistics for each model lm_intercept_L = lm_L[[1]]$intercept, @@ -480,19 +480,19 @@ calculate_interaction_scores <- function(df, df_bg, type, overlap_threshold = 2) Z_lm_L <= -overlap_threshold & Avg_Zscore_L >= overlap_threshold ~ "Deletion Suppressor lm, Deletion Enhancer Avg Zscore", TRUE ~ "No Effect" ), - # Apply the perform_lm_simple function for each variable pair - lm_L = list(perform_lm_simple(Z_lm_L, Avg_Zscore_L, max_conc)), - lm_K = list(perform_lm_simple(Z_lm_K, Avg_Zscore_K, max_conc)), - lm_r = list(perform_lm_simple(Z_lm_r, Avg_Zscore_r, max_conc)), - lm_AUC = list(perform_lm_simple(Z_lm_AUC, Avg_Zscore_AUC, max_conc)), + # Apply the perform_lm function for each variable pair + lm_L = list(perform_lm(Z_lm_L, Avg_Zscore_L, max_conc)), + lm_K = list(perform_lm(Z_lm_K, Avg_Zscore_K, max_conc)), + lm_r = list(perform_lm(Z_lm_r, Avg_Zscore_r, max_conc)), + lm_AUC = list(perform_lm(Z_lm_AUC, Avg_Zscore_AUC, max_conc)), # Correlation models for various pairs - Z_lm_K_L = list(perform_lm_simple(Z_lm_K, Z_lm_L, max_conc)), - Z_lm_r_L = list(perform_lm_simple(Z_lm_r, Z_lm_L, max_conc)), - Z_lm_R_AUC_L = list(perform_lm_simple(Z_lm_AUC, Z_lm_L, max_conc)), - Z_lm_R_r_K = list(perform_lm_simple(Z_lm_r, Z_lm_K, max_conc)), - Z_lm_R_AUC_K = list(perform_lm_simple(Z_lm_AUC, Z_lm_K, max_conc)), - Z_lm_R_AUC_r = list(perform_lm_simple(Z_lm_AUC, Z_lm_r, max_conc)), + Z_lm_K_L = list(perform_lm(Z_lm_K, Z_lm_L, max_conc)), + Z_lm_r_L = list(perform_lm(Z_lm_r, Z_lm_L, max_conc)), + Z_lm_AUC_L = list(perform_lm(Z_lm_AUC, Z_lm_L, max_conc)), + Z_lm_r_K = list(perform_lm(Z_lm_r, Z_lm_K, max_conc)), + Z_lm_AUC_K = list(perform_lm(Z_lm_AUC, Z_lm_K, max_conc)), + Z_lm_AUC_r = list(perform_lm(Z_lm_AUC, Z_lm_r, max_conc)), # Extract coefficients and statistics for each model lm_rank_intercept_L = lm_L[[1]]$intercept, @@ -525,29 +525,29 @@ calculate_interaction_scores <- function(df, df_bg, type, overlap_threshold = 2) Z_lm_R_squared_r_L = Z_lm_r_L[[1]]$r_squared, Z_lm_Score_r_L = Z_lm_r_L[[1]]$score, - Z_lm_intercept_R_AUC_L = Z_lm_R_AUC_L[[1]]$intercept, - Z_lm_slope_R_AUC_L = Z_lm_R_AUC_L[[1]]$slope, - Z_lm_R_squared_R_AUC_L = Z_lm_R_AUC_L[[1]]$r_squared, - Z_lm_Score_R_AUC_L = Z_lm_R_AUC_L[[1]]$score, + Z_lm_intercept_AUC_L = Z_lm_AUC_L[[1]]$intercept, + Z_lm_slope_AUC_L = Z_lm_AUC_L[[1]]$slope, + Z_lm_R_squared_AUC_L = Z_lm_AUC_L[[1]]$r_squared, + Z_lm_Score_AUC_L = Z_lm_AUC_L[[1]]$score, - Z_lm_intercept_R_r_K = Z_lm_R_r_K[[1]]$intercept, - Z_lm_slope_R_r_K = Z_lm_R_r_K[[1]]$slope, - Z_lm_R_squared_R_r_K = Z_lm_R_r_K[[1]]$r_squared, - Z_lm_Score_R_r_K = Z_lm_R_r_K[[1]]$score, + Z_lm_intercept_r_K = Z_lm_r_K[[1]]$intercept, + Z_lm_slope_r_K = Z_lm_r_K[[1]]$slope, + Z_lm_R_squared_r_K = Z_lm_r_K[[1]]$r_squared, + Z_lm_Score_r_K = Z_lm_r_K[[1]]$score, - Z_lm_intercept_R_AUC_K = Z_lm_R_AUC_K[[1]]$intercept, - Z_lm_slope_R_AUC_K = Z_lm_R_AUC_K[[1]]$slope, - Z_lm_R_squared_R_AUC_K = Z_lm_R_AUC_K[[1]]$r_squared, - Z_lm_Score_R_AUC_K = Z_lm_R_AUC_K[[1]]$score, + Z_lm_intercept_AUC_K = Z_lm_AUC_K[[1]]$intercept, + Z_lm_slope_AUC_K = Z_lm_AUC_K[[1]]$slope, + Z_lm_R_squared_AUC_K = Z_lm_AUC_K[[1]]$r_squared, + Z_lm_Score_AUC_K = Z_lm_AUC_K[[1]]$score, - Z_lm_intercept_R_AUC_r = Z_lm_R_AUC_r[[1]]$intercept, - Z_lm_slope_R_AUC_r = Z_lm_R_AUC_r[[1]]$slope, - Z_lm_R_squared_R_AUC_r = Z_lm_R_AUC_r[[1]]$r_squared, - Z_lm_Score_R_AUC_r = Z_lm_R_AUC_r[[1]]$score + Z_lm_intercept_AUC_r = Z_lm_AUC_r[[1]]$intercept, + Z_lm_slope_AUC_r = Z_lm_AUC_r[[1]]$slope, + Z_lm_R_squared_AUC_r = Z_lm_AUC_r[[1]]$r_squared, + Z_lm_Score_AUC_r = Z_lm_AUC_r[[1]]$score ) %>% select( - -lm_L, -lm_K, -lm_r, -lm_AUC, -Z_lm_K_L, -Z_lm_r_L, -Z_lm_R_AUC_L, - -Z_lm_R_r_K, -Z_lm_R_AUC_K, -Z_lm_R_AUC_r) + -lm_L, -lm_K, -lm_r, -lm_AUC, + -Z_lm_K_L, -Z_lm_r_L, -Z_lm_AUC_L, -Z_lm_r_K, -Z_lm_AUC_K, -Z_lm_AUC_r) } # end deletion-specific block # Create the final calculations and interactions dataframes with only required columns for csv output @@ -573,15 +573,27 @@ calculate_interaction_scores <- function(df, df_bg, type, overlap_threshold = 2) df_interactions <- interactions %>% select( - all_of(group_vars), - Avg_Zscore_L, Avg_Zscore_K, Avg_Zscore_r, Avg_Zscore_AUC, - Sum_Z_Score_L, Sum_Z_Score_K, Sum_Z_Score_r, Sum_Z_Score_AUC, - Z_lm_L, Z_lm_K, Z_lm_r, Z_lm_AUC, - Raw_Shift_L, Raw_Shift_K, Raw_Shift_r, Raw_Shift_AUC, - Z_Shift_L, Z_Shift_K, Z_Shift_r, Z_Shift_AUC, - lm_Score_L, lm_Score_K, lm_Score_r, lm_Score_AUC, - R_Squared_L, R_Squared_K, R_Squared_r, R_Squared_AUC, - NG_sum_int, DB_sum_int, SM_sum_int + any_of(c( + group_vars, + "Avg_Zscore_L", "Avg_Zscore_K", "Avg_Zscore_r", "Avg_Zscore_AUC", + "Sum_Z_Score_L", "Sum_Z_Score_K", "Sum_Z_Score_r", "Sum_Z_Score_AUC", + "Z_lm_L", "Z_lm_K", "Z_lm_r", "Z_lm_AUC", + "Raw_Shift_L", "Raw_Shift_K", "Raw_Shift_r", "Raw_Shift_AUC", + "Z_Shift_L", "Z_Shift_K", "Z_Shift_r", "Z_Shift_AUC", + "lm_Score_L", "lm_Score_K", "lm_Score_r", "lm_Score_AUC", + "R_Squared_L", "R_Squared_K", "R_Squared_r", "R_Squared_AUC", + "NG_sum_int", "DB_sum_int", "SM_sum_int", + "Z_lm_intercept_L", "Z_lm_slope_L", "Z_lm_R_squared_L", "Z_lm_Score_L", + "Z_lm_intercept_K", "Z_lm_slope_K", "Z_lm_R_squared_K", "Z_lm_Score_K", + "Z_lm_intercept_r", "Z_lm_slope_r", "Z_lm_R_squared_r", "Z_lm_Score_r", + "Z_lm_intercept_AUC", "Z_lm_slope_AUC", "Z_lm_R_squared_AUC", "Z_lm_Score_AUC", + "Z_lm_intercept_K_L", "Z_lm_slope_K_L", "Z_lm_R_squared_K_L", "Z_lm_Score_K_L", + "Z_lm_intercept_r_L", "Z_lm_slope_r_L", "Z_lm_R_squared_r_L", "Z_lm_Score_r_L", + "Z_lm_intercept_AUC_L", "Z_lm_slope_AUC_L", "Z_lm_R_squared_AUC_L", "Z_lm_Score_AUC_L", + "Z_lm_intercept_r_K", "Z_lm_slope_r_K", "Z_lm_R_squared_r_K", "Z_lm_Score_r_K", + "Z_lm_intercept_AUC_K", "Z_lm_slope_AUC_K", "Z_lm_R_squared_AUC_K", "Z_lm_Score_AUC_K", + "Z_lm_intercept_AUC_r", "Z_lm_slope_AUC_r", "Z_lm_R_squared_AUC_r", "Z_lm_Score_AUC_r" + )) ) %>% rename(NG = NG_sum_int, DB = DB_sum_int, SM = SM_sum_int) @@ -1296,21 +1308,28 @@ generate_correlation_plot_configs <- function(df, df_reference) { x_var <- paste0("Z_lm_", rel$x) # predictor y_var <- paste0("Z_lm_", rel$y) # response - # Skip this plot if there's no valid data - # if (all(is.na(df[[x_var]])) || all(is.na(df_reference[[x_var]])) || - # all(is.na(df[[y_var]])) || all(is.na(df_reference[[y_var]]))) { - # next - # } - - # Find the max and min of both dataframes for printing linear regression line - xmin <- min(c(min(df[[x_var]], na.rm = TRUE), min(df_reference[[x_var]], na.rm = TRUE)), na.rm = TRUE) - xmax <- max(c(max(df[[x_var]], na.rm = TRUE), max(df_reference[[x_var]], na.rm = TRUE)), na.rm = TRUE) + print(paste("rel$x:", rel$x)) + print(paste("rel$y:", rel$y)) + print(paste("Generating correlation plot for response(y):", y_var, "and predictor(x):", x_var)) + print(paste("Relationship suffix:", rel$y, "_", rel$x)) # Extract the R-squared, intercept, and slope from the df (first value) intercept <- df[[paste0("Z_lm_intercept_", rel$y, "_", rel$x)]][1] slope <- df[[paste0("Z_lm_slope_", rel$y, "_", rel$x)]][1] r_squared <- df[[paste0("Z_lm_R_squared_", rel$y, "_", rel$x)]][1] + print(paste("intercept:", intercept)) + print(paste("slope:", slope)) + print(paste("r_squared:", r_squared)) + + r_squared_rounded <- round(r_squared, 4) + r_squared_label <- paste("R-squared =", r_squared_rounded) + print(paste("r_squared_label:", r_squared_label)) + + # Find the max and min of both dataframes for printing linear regression line + xmin <- min(c(min(df[[x_var]]), min(df_reference[[x_var]]))) + xmax <- max(c(max(df[[x_var]]), max(df_reference[[x_var]]))) + # Generate the label for the plot plot_label <- paste("Interaction", rel$x, "vs.", rel$y) @@ -1326,7 +1345,7 @@ generate_correlation_plot_configs <- function(df, df_reference) { list( x = mean(df[[x_var]], na.rm = TRUE), y = mean(df[[y_var]], na.rm = TRUE), - label = paste("R-squared =", round(r_squared, 3)) + label = r_squared_label ) ), lm_line = list(