CLIFF¶
CLIFF (CeLl-type-specific drug sensItivity From deconvoluted expression proFiles) takes CLIMB’s output and integrates it with drug sensitivity data (AUC values) to identify cell-type-specific drug responses, via an Expectation-Maximization algorithm. See Methods for the underlying model.
This page covers both cliff(), the main deconvolution function, and cliff_gene_selection(), a helper used to pre-select drug-predictive genes before running it.
cliff()¶
Usage¶
cliff(climb_output, drug_data, mutation_data = NULL,
min.mutation = 0, max.em.steps = 100,
mode = "highres", regularization = "none",
cancer_pattern = "like")
Parameters¶
Required
Parameter |
Description |
|---|---|
|
Output of |
|
Data frame with an |
Note
drug_data$auc is internally recentered so its mean is exactly 0.5 before fitting. Predicted sensitivities (pi_hat / PI_hat_nk) should therefore be interpreted relative to that recentering, not on the raw input AUC scale.
Optional
Parameter |
Description |
Default |
|---|---|---|
|
Matrix (samples × mutations) of binary mutation status (1/0) |
|
|
Minimum number of samples with a mutation for it to be included in the model |
|
|
Maximum number of EM iterations |
|
|
|
|
|
|
|
|
String pattern identifying cancer cell types, for mutation attribution |
|
Output¶
cliff() returns an unnamed list of three elements, accessed by position:
Index |
Description |
|---|---|
|
Cell-type-specific drug sensitivity predictions (samples × cell-types) |
|
The mutation data matrix used in the analysis |
|
Cell-type proportions from CLIMB |
Note
With thousands of genes and only a handful of bulk samples, cliff() is heavily over-parameterized if run on CLIMB’s full gene set — cell-type estimates collapse to nearly identical values. Always pre-select a small set of drug-predictive genes with cliff_gene_selection() first, as shown below.
Example¶
Using the bundled in-vitro dataset (drug sensitivity of the same 6 mixtures, Fig. 4A):
data(sc.es); data(bulk.es); data(bulk_auc_data)
climb_result <- climb(sc = sc.es, bulk = bulk.es, mode = "expression")
# Subset to one drug/timepoint combination — cliff() takes one 'auc' column at a time
drug_data <- bulk_auc_data[bulk_auc_data$drug == "Cytarabine_48h", ]
# Pre-select genes predictive of this drug, then subset CLIMB's expression output to them
bulk_mat <- t(exprs(bulk.es))[drug_data$sample, ]
sel.genes <- cliff_gene_selection(bulk_mat, drug_data$auc, min.genes = 10)
climb_result$expr.highres <- climb_result$expr.highres[, sel.genes, ]
climb_result$expr.overall <- climb_result$expr.overall[sel.genes, ]
cliff_result <- cliff(climb_output = climb_result,
drug_data = drug_data,
mode = "overall")
# Averaged across samples, this correlates well (Pearson R > 0.9 for this
# drug/timepoint) with the measured pure cell-line AUC
head(cliff_result[[1]]) # PI_hat_nk matrix
colMeans(cliff_result[[1]])
cliff_gene_selection()¶
A standalone helper that selects a small set of genes predictive of a drug-response phenotype, by fitting a lasso path across a decreasing grid of penalties and returning the first gene set that clears a minimum size. It is independent of climb()/cliff() and can be used to pre-filter genes before building a bulk expression matrix for deconvolution.
Usage¶
cliff_gene_selection(bulk_mat, drug_d, min.genes = 10)
Parameters¶
Required
Parameter |
Description |
|---|---|
|
Matrix of bulk gene expression (samples × genes) |
|
Numeric vector of drug sensitivity values (e.g. AUC), one per sample, in the same sample order as |
Optional
Parameter |
Description |
Default |
|---|---|---|
|
Minimum number of genes to select before stopping the lasso path search |
|
Output¶
A character vector of selected gene names (column names of bulk_mat with a non-zero lasso coefficient), or NULL if no penalty in the search grid selects at least min.genes genes.
Example¶
library(Biobase)
data(bulk.es); data(bulk_auc_data)
drug_data <- bulk_auc_data[bulk_auc_data$drug == "Cytarabine_48h", ]
bulk_mat <- t(exprs(bulk.es))[drug_data$sample, ]
sel.genes <- cliff_gene_selection(bulk_mat, drug_data$auc, min.genes = 10)
length(sel.genes)