mirror of
https://github.com/johrpan/ubigen.git
synced 2025-10-26 19:57:24 +01:00
136 lines
3.2 KiB
R
136 lines
3.2 KiB
R
library(data.table)
|
|
library(here)
|
|
|
|
i_am("scripts/cmap_drugs_analysis.R")
|
|
|
|
data <- fread(here("scripts/output/cmap_drugs.csv"))
|
|
|
|
data[, c("drug", "concentration", "cell_line") :=
|
|
tstrsplit(drug, "_", fixed = TRUE)]
|
|
|
|
data[, concentration := as.double(concentration)]
|
|
|
|
data <- data[,
|
|
.(abs_mean_change = mean(abs(mean_change))),
|
|
by = .(drug, group)
|
|
]
|
|
|
|
# Source: PubChem ID list upload based on identifiers converted from CMap
|
|
# drug names using the PubChem ID exchange.
|
|
pubchem_data <- fread(here("scripts/input/pubchem_data.csv"))
|
|
|
|
pubchem_data <- pubchem_data[, .(cid, cmpdname, annotation)]
|
|
pubchem_data <- unique(pubchem_data, by = "cid")
|
|
pubchem_data <- pubchem_data[,
|
|
.(
|
|
cmpdname,
|
|
annotation = strsplit(annotation, "|", fixed = TRUE) |> unlist()
|
|
),
|
|
by = cid
|
|
]
|
|
|
|
# Filter for WHO ATC annotations
|
|
pubchem_data <- pubchem_data[stringr::str_detect(annotation, "^[A-Z] - ")]
|
|
|
|
# Extract ATC levels
|
|
|
|
pubchem_data[, atc_1 := stringr::str_match(
|
|
annotation,
|
|
"^[A-Z] - ([^>]*)"
|
|
)[, 2] |> stringr::str_trim()]
|
|
|
|
pubchem_data[, atc_2 := stringr::str_match(
|
|
annotation,
|
|
"> [A-Z][0-9][0-9] - ([^>]*)"
|
|
)[, 2] |> stringr::str_trim()]
|
|
|
|
pubchem_data[, atc_3 := stringr::str_match(
|
|
annotation,
|
|
"> [A-Z][0-9][0-9][A-Z] - ([^>]*)"
|
|
)[, 2] |> stringr::str_trim()]
|
|
|
|
# Source: PubChem ID exchange
|
|
drugs_pubchem_mapping <- fread(here("scripts/input/drugs_pubchem.tsv")) |>
|
|
na.omit()
|
|
|
|
data <- merge(data, drugs_pubchem_mapping, by = "drug", allow.cartesian = TRUE)
|
|
data <- merge(data, pubchem_data, by = "cid", allow.cartesian = TRUE)
|
|
data[, drug_category := atc_1]
|
|
|
|
|
|
# Select top drug categories
|
|
|
|
results_drug_categories <- data[,
|
|
.(score = mean(abs_mean_change)),
|
|
by = .(group, drug_category)
|
|
]
|
|
|
|
results_drug_categories <- results_drug_categories[,
|
|
.(mean_score = mean(score)),
|
|
by = drug_category
|
|
]
|
|
|
|
setorder(results_drug_categories, -mean_score)
|
|
top_drug_categories <- results_drug_categories[1:7, drug_category]
|
|
drug_categories <- c(top_drug_categories, "Other")
|
|
|
|
# Merge other drug categories
|
|
|
|
data[!(drug_category %chin% top_drug_categories), drug_category := "Other"]
|
|
|
|
# Recompute results with new categories
|
|
|
|
results <- data[,
|
|
.(score = mean(abs_mean_change)),
|
|
by = .(group, drug_category)
|
|
]
|
|
|
|
group_plots <- list()
|
|
|
|
for (group_value in results[, unique(group)]) {
|
|
group_plot <- plotly::plot_ly() |>
|
|
plotly::add_bars(
|
|
data = results[group == group_value],
|
|
x = ~drug_category,
|
|
y = ~score,
|
|
color = ~drug_category
|
|
) |>
|
|
plotly::layout(
|
|
xaxis = list(
|
|
categoryarray = drug_categories,
|
|
title = "",
|
|
showticklabels = FALSE
|
|
),
|
|
yaxis = list(
|
|
range = c(0.0, 0.03),
|
|
nticks = 4,
|
|
title = ""
|
|
),
|
|
font = list(size = 8),
|
|
margin = list(
|
|
pad = 2,
|
|
l = 48,
|
|
r = 0,
|
|
t = 0,
|
|
b = 36
|
|
)
|
|
)
|
|
|
|
plotly::save_image(
|
|
group_plot |> plotly::hide_legend(),
|
|
file = here(glue::glue("scripts/output/drug_categories_{group_value}.svg")),
|
|
width = 3 * 72,
|
|
height = 4 * 72,
|
|
scale = 96 / 72
|
|
)
|
|
|
|
group_plots <- c(group_plots, list(group_plot))
|
|
}
|
|
|
|
plotly::save_image(
|
|
group_plot,
|
|
file = here(glue::glue("scripts/output/drug_categories_legend.svg")),
|
|
width = 6.27 * 72,
|
|
height = 6.27 * 72,
|
|
scale = 96 / 72
|
|
)
|