Mercurial > repos > bgruening > music_deconvolution
diff scripts/estimateprops.R @ 3:fd7a16d073c5 draft
"planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/music/ commit 20f8561478535013e111d982b99639f48f1bea79"
author | bgruening |
---|---|
date | Sat, 29 Jan 2022 12:51:49 +0000 |
parents | 3ca0132c182a |
children | 56371b5a2da9 |
line wrap: on
line diff
--- a/scripts/estimateprops.R Tue Nov 30 13:07:36 2021 +0000 +++ b/scripts/estimateprops.R Sat Jan 29 12:51:49 2022 +0000 @@ -17,13 +17,21 @@ estimated_music_props <- est_prop$Est.prop.weighted estimated_nnls_props <- est_prop$Est.prop.allgene +scale_yaxes <- function(gplot, value) { + if (is.na(value)) { + gplot + } else { + gplot + scale_y_continuous(lim = c(0, value)) + } +} + ## Show different in estimation methods ## Jitter plot of estimated cell type proportions -jitter_fig <- Jitter_Est( +jitter_fig <- scale_yaxes(Jitter_Est( list(data.matrix(estimated_music_props), data.matrix(estimated_nnls_props)), method.name = methods, title = "Jitter plot of Est Proportions", - size = 2, alpha = 0.7) + theme_minimal() + size = 2, alpha = 0.7) + theme_minimal(), maxyscale) ## Make a Plot @@ -42,11 +50,6 @@ message(celltypes) } -if (phenotype_target_threshold == -99) { - phenotype_target_threshold <- -Inf - message("phenotype target threshold set to -Inf") -} - if (is.null(phenotype_factors)) { phenotype_factors <- colnames(pData(bulk_eset)) } @@ -54,67 +57,94 @@ phenotype_factors <- phenotype_factors[ !(phenotype_factors %in% phenotype_factors_always_exclude)] message("Phenotype Factors to use:") -message(phenotype_factors) - +message(paste0(phenotype_factors, collapse = ", ")) m_prop$CellType <- factor(m_prop$CellType, levels = celltypes) # nolint m_prop$Method <- factor(rep(methods, each = nrow(estimated_music_props_flat)), # nolint levels = methods) -m_prop$Disease_factor <- rep(bulk_eset[[phenotype_target]], 2 * length(celltypes)) # nolint -m_prop <- m_prop[!is.na(m_prop$Disease_factor), ] -## Generate a TRUE/FALSE table of Normal == 1 and Disease == 2 -sample_groups <- c("Normal", sample_disease_group) -m_prop$Disease <- factor(sample_groups[(m_prop$Disease_factor > phenotype_target_threshold) + 1], # nolint - levels = sample_groups) + +if (use_disease_factor) { + + if (phenotype_target_threshold == -99) { + phenotype_target_threshold <- -Inf + message("phenotype target threshold set to -Inf") + } + + m_prop$Disease_factor <- rep(bulk_eset[[phenotype_target]], 2 * length(celltypes)) # nolint + m_prop <- m_prop[!is.na(m_prop$Disease_factor), ] + ## Generate a TRUE/FALSE table of Normal == 1 and Disease == 2 + sample_groups <- c("Normal", sample_disease_group) + m_prop$Disease <- factor(sample_groups[(m_prop$Disease_factor > phenotype_target_threshold) + 1], # nolint + levels = sample_groups) -## Binary to scale: e.g. TRUE / 5 = 0.2 -m_prop$D <- (m_prop$Disease == # nolint - sample_disease_group) / sample_disease_group_scale -## NA's are not included in the comparison below -m_prop <- rbind(subset(m_prop, Disease != sample_disease_group), - subset(m_prop, Disease == sample_disease_group)) + ## Binary to scale: e.g. TRUE / 5 = 0.2 + m_prop$D <- (m_prop$Disease == # nolint + sample_disease_group) / sample_disease_group_scale + ## NA's are not included in the comparison below + m_prop <- rbind(subset(m_prop, Disease != sample_disease_group), + subset(m_prop, Disease == sample_disease_group)) -jitter_new <- ggplot(m_prop, aes(Method, Prop)) + - geom_point(aes(fill = Method, color = Disease, stroke = D, shape = Disease), - size = 2, alpha = 0.7, - position = position_jitter(width = 0.25, height = 0)) + - facet_wrap(~ CellType, scales = "free") + - scale_colour_manual(values = c("white", "gray20")) + - scale_shape_manual(values = c(21, 24)) + theme_minimal() + jitter_new <- scale_yaxes(ggplot(m_prop, aes(Method, Prop)) + + geom_point(aes(fill = Method, color = Disease, stroke = D, shape = Disease), + size = 2, alpha = 0.7, + position = position_jitter(width = 0.25, height = 0)) + + facet_wrap(~ CellType, scales = "free") + + scale_colour_manual(values = c("white", "gray20")) + + scale_shape_manual(values = c(21, 24)) + theme_minimal(), maxyscale) + +} + +if (use_disease_factor) { -## Plot to compare method effectiveness -## Create dataframe for beta cell proportions and Disease_factor levels -m_prop_ana <- data.frame(pData(bulk_eset)[rep(1:nrow(estimated_music_props), 2), #nolint - phenotype_factors], - ct.prop = c(estimated_music_props[, 2], - estimated_nnls_props[, 2]), - Method = factor(rep(methods, - each = nrow(estimated_music_props)), - levels = methods)) -colnames(m_prop_ana)[1:length(phenotype_factors)] <- phenotype_factors #nolint -m_prop_ana <- subset(m_prop_ana, !is.na(m_prop_ana[phenotype_target])) -m_prop_ana$Disease <- factor(sample_groups[( # nolint - m_prop_ana[phenotype_target] > phenotype_target_threshold) + 1], - sample_groups) -m_prop_ana$D <- (m_prop_ana$Disease == # nolint - sample_disease_group) / sample_disease_group_scale + ## Plot to compare method effectiveness + ## Create dataframe for beta cell proportions and Disease_factor levels + ## - Ugly code. Essentially, doubles the cell type proportions for each + ## set of MuSiC and NNLS methods + m_prop_ana <- data.frame(pData(bulk_eset)[rep(1:nrow(estimated_music_props), 2), #nolint + phenotype_factors], + ## get proportions of target cell type + ct.prop = c(estimated_music_props[, phenotype_scrna_target], + estimated_nnls_props[, phenotype_scrna_target]), + ## + Method = factor(rep(methods, + each = nrow(estimated_music_props)), + levels = methods)) + ## - fix headers + colnames(m_prop_ana)[1:length(phenotype_factors)] <- phenotype_factors #nolint + ## - drop NA for target phenotype (e.g. hba1c) + m_prop_ana <- subset(m_prop_ana, !is.na(m_prop_ana[phenotype_target])) + m_prop_ana$Disease <- factor( # nolint + ## - Here we set Normal/Disease assignments across the two MuSiC and NNLS methods + sample_groups[( + m_prop_ana[phenotype_target] > phenotype_target_threshold) + 1 + ], + sample_groups) + ## - Then we scale this binary assignment to a plotable factor + m_prop_ana$D <- (m_prop_ana$Disease == # nolint + sample_disease_group) / sample_disease_group_scale -jitt_compare <- ggplot(m_prop_ana, aes_string(phenotype_target, "ct.prop")) + - geom_smooth(method = "lm", se = FALSE, col = "black", lwd = 0.25) + - geom_point(aes(fill = Method, color = Disease, stroke = D, shape = Disease), - size = 2, alpha = 0.7) + facet_wrap(~ Method) + - ggtitle(compare_title) + theme_minimal() + - scale_colour_manual(values = c("white", "gray20")) + - scale_shape_manual(values = c(21, 24)) + jitt_compare <- scale_yaxes(ggplot(m_prop_ana, aes_string(phenotype_target, "ct.prop")) + + geom_smooth(method = "lm", se = FALSE, col = "black", lwd = 0.25) + + geom_point(aes(fill = Method, color = Disease, stroke = D, shape = Disease), + size = 2, alpha = 0.7) + facet_wrap(~ Method) + + ggtitle(paste0(toupper(phenotype_target), " vs. ", + toupper(phenotype_scrna_target), " Cell Type Proportion")) + + theme_minimal() + + ylab(paste0("Proportion of ", + phenotype_scrna_target, " cells")) + + xlab(paste0("Level of bulk factor (", phenotype_target, ")")) + + scale_colour_manual(values = c("white", "gray20")) + + scale_shape_manual(values = c(21, 24)), maxyscale) +} ## BoxPlot -plot_box <- Boxplot_Est(list( +plot_box <- scale_yaxes(Boxplot_Est(list( data.matrix(estimated_music_props), data.matrix(estimated_nnls_props)), method.name = c("MuSiC", "NNLS")) + theme(axis.text.x = element_text(angle = -90), axis.text.y = element_text(size = 8)) + - ggtitle(element_blank()) + theme_minimal() + ggtitle(element_blank()) + theme_minimal(), maxyscale) ## Heatmap plot_hmap <- Prop_heat_Est(list( @@ -125,8 +155,15 @@ axis.text.y = element_text(size = 6)) pdf(file = outfile_pdf, width = 8, height = 8) -plot_grid(jitter_fig, plot_box, labels = "auto", ncol = 1, nrow = 2) -plot_grid(jitter_new, jitt_compare, labels = "auto", ncol = 1, nrow = 2) +if (length(celltypes) <= 8) { + plot_grid(jitter_fig, plot_box, labels = "auto", ncol = 1, nrow = 2) +} else { + print(jitter_fig) + plot_box +} +if (use_disease_factor) { + plot_grid(jitter_new, jitt_compare, labels = "auto", ncol = 1, nrow = 2) +} plot_hmap message(dev.off()) @@ -159,29 +196,32 @@ quote = F, sep = "\t", col.names = NA) -## Summary table -for (meth in methods) { - ##lm_beta_meth = lm(ct.prop ~ age + bmi + hba1c + gender, data = - sub_data <- subset(m_prop_ana, Method == meth) - ## We can only do regression where there are more than 1 factors - ## so we must find and exclude the ones which are not - gt1_facts <- sapply(phenotype_factors, function(facname) { - return(length(unique(sort(sub_data[[facname]]))) == 1) - }) - form_factors <- phenotype_factors - exclude_facts <- names(gt1_facts)[gt1_facts] - if (length(exclude_facts) > 0) { - message("Factors with only one level will be excluded:") - message(exclude_facts) - form_factors <- phenotype_factors[ - !(phenotype_factors %in% exclude_facts)] +if (use_disease_factor) { + ## Summary table of linear regressions of disease factors + for (meth in methods) { + ##lm_beta_meth = lm(ct.prop ~ age + bmi + hba1c + gender, data = + sub_data <- subset(m_prop_ana, Method == meth) + + ## We can only do regression where there are more than 1 factors + ## so we must find and exclude the ones which are not + gt1_facts <- sapply(phenotype_factors, function(facname) { + return(length(unique(sort(sub_data[[facname]]))) == 1) + }) + form_factors <- phenotype_factors + exclude_facts <- names(gt1_facts)[gt1_facts] + if (length(exclude_facts) > 0) { + message("Factors with only one level will be excluded:") + message(exclude_facts) + form_factors <- phenotype_factors[ + !(phenotype_factors %in% exclude_facts)] + } + lm_beta_meth <- lm(as.formula( + paste("ct.prop", paste(form_factors, collapse = " + "), + sep = " ~ ")), data = sub_data) + message(paste0("Summary: ", meth)) + capture.output(summary(lm_beta_meth), + file = paste0("report_data/summ_Log of ", + meth, + " fitting.txt")) } - lm_beta_meth <- lm(as.formula( - paste("ct.prop", paste(form_factors, collapse = " + "), - sep = " ~ ")), data = sub_data) - message(paste0("Summary: ", meth)) - capture.output(summary(lm_beta_meth), - file = paste0("report_data/summ_Log of ", - meth, - " fitting.txt")) }