Loading libraries

library(SingleCellExperiment)
library(ggplot2)
library(Matrix)
library(pheatmap)
library(ComplexHeatmap)
library(circlize)
library(scConvexNMF)

Functions

#' Function to return object for ggplot2 plotting
#' @param size_text Size of the text to use for plotting
#' @param leg_pos Position of legend
#' @return ggplot theme object
theme_plot <- function(size_text=15,
                           leg_pos="right",
                           size_text_titles=NULL,
                           classic=FALSE,
                           line_size=0.85,
                           line_size_color="black",
                           axis_ticks_length=0.25,
                           axis_ticks_color="black",
                           rotate_x_axis=TRUE
                           ){
    require(ggplot2)
    if( is.null(size_text_titles) ){
        size_text_titles<- size_text + 2
    }
    if( classic ){
        gg.plots<- theme_classic()
    }else{
        gg.plots<- theme_bw()
    }
    gg.plots <- gg.plots +
        theme(axis.line=element_line(linewidth=line_size, colour=line_size_color),
              axis.ticks=element_line(colour=axis_ticks_color, linewidth=line_size),
              axis.ticks.length=unit(axis_ticks_length, "cm"),
              axis.title.x=element_text(size=size_text_titles),
              legend.position=leg_pos,
              plot.title=element_text(hjust=0.5, size=size_text),
              axis.text.y=element_text(size=size_text, color="black"),
              axis.title.y=element_text(size=size_text_titles) )
    if( rotate_x_axis) {
        gg.plots<- gg.plots +
            theme(axis.text.x=element_text(size=size_text, angle=45, hjust=1, color=line_size_color) )
    }else{
        gg.plots<- gg.plots +
            theme(axis.text.x = element_text(size=size_text, angle = 90, vjust = 0.5, hjust=1, color=line_size_color))
    }
}

Loading data

The gene expression data can be found at the GEO GSE328575.

# Reading SCE object
sce<- readRDS("sce.rds")
meta<- data.frame(colData(sce))

Read scConvexNMF model for malignant cells, with can be found at Zenodo.

# Reading SCE object
model<- readRDS("scConvexNMF_model_malignant.rds")

length(model$aux$cellIDs)
## [1] 44739
length(intersect(meta$Barcode_Sample, model$aux$cellIDs))
## [1] 44739
meta<- meta[model$aux$cellIDs,]

Read genesets

# all pathways
pathways<- readRDS("gene_sets.rds")

# hallmark
path_hall<- pathways[,1:50]
path_hall<- path_hall[rowSums(path_hall)>0,]

# hallmark + hypoxia + cancer states
path_hall_hyp<- pathways[,c(1:52, 55:70)]
path_hall_hyp<- path_hall_hyp[rowSums(path_hall_hyp) >0,]

scConvex activities

WGH <- getWGH_scCNMF(model)
W<- WGH$W
W<- W[, colnames(W) != "LV19"]

W_use<- t(scale(W))
W_use<- t(W)

## Get LVs clustered
ph<- pheatmap(
    cor(t(W_use)),
    color=colorRampPalette(c("darkblue","lightblue","white","orange","darkred"))(255),
    clustering_method="average",
    breaks=seq(-1,1,length.out=256) )
ro_1 <- row_order(ph)
## Warning: The heatmap has not been initialized. You might have different results
## if you repeatedly execute this function, e.g. when row_km/column_km was
## set. It is more suggested to do as `ht = draw(ht); row_order(ht)`.
vec_lvs<- rownames(W_use)[ro_1]
W_use<- t(scale(W[, vec_lvs]))

# For each cell identify the LV with the maximum activity
max_lv<- apply(W_use, 2, function(X) names(which(X == max(X) ) ))

lis_order_cells<- list()
for(lv in rownames(W_use) ){
    cells_lv<- names(max_lv[max_lv == lv])
    lis_order_cells[[lv]]<- sort( W_use[lv,cells_lv], decreasing=T)
}
names(lis_order_cells)<- NULL
order_cells<- do.call(c, lis_order_cells)
W_use<- W_use[,names(order_cells)]

ht<- Heatmap(W_use,
             cluster_columns=FALSE,
             cluster_rows=FALSE,
             show_column_names = FALSE,
             clustering_distance_rows = "pearson",
             clustering_distance_columns = "pearson",              
             clustering_method_row="average",
             clustering_method_col="average",              
             )
## The automatically generated colors map from the minus and plus 99^th of
## the absolute values in the matrix. There are outliers in the matrix
## whose patterns might be hidden by this color mapping. You can manually
## set the color to `col` argument.
## 
## Use `suppressMessages()` to turn off this message.
## `use_raster` is automatically set to TRUE for a matrix with more than
## 2000 columns You can control `use_raster` argument by explicitly
## setting TRUE/FALSE to it.
## 
## Set `ht_opt$message = FALSE` to turn off this message.
draw(ht)

## Overlap with hallmark pathways

set.seed(21)
wJ_G <- weightedJaccard_G(model,path_hall,nullSamples=1000)

wJ_G_plot <- visualize_jaccard(wJ_G, vec_lvs=rev(vec_lvs), filterGeneSets=F, cutoff_padj = 0.05, cluster_rows=T, cluster_columns=F, fontsize_row=7, fontsize_col=7, cells_highlight_lwd=1)
draw(wJ_G_plot$heatmap)

Hypoxia genesets

set.seed(71)
wJ_G <- weightedJaccard_G(model,path_hall_hyp,nullSamples=1000)

wJ_G_plot <- visualize_jaccard(wJ_G, vec_lvs=c("LV22","LV49", "LV60", "LV57"), filterGeneSets=T, cutoff_padj = 0.05, cluster_rows=T, cluster_columns=F, fontsize_row=7, fontsize_col=7)
draw(wJ_G_plot$heatmap)

set.seed(43)
wJ_G <- weightedJaccard_G(model,pathways,nullSamples=1000)

wJ_G_plot <- visualize_jaccard(wJ_G, vec_lvs=c("LV22","LV49", "LV60", "LV57"), filterGeneSets=F, cutoff_padj = 0.05, select_paths=c("HIF1a_A498", "HIF2a_A498"),cluster_rows=F, cluster_columns=F, fontsize_row=7, fontsize_col=7)
draw(wJ_G_plot$heatmap)

Visualize expression

ht<- visualize_Yp(model, vec_lvs=c("LV60","LV49", "LV22", "LV57"), n_genes=15)
draw(ht)

Read spatial data

lis_spatial_Soupir<- readRDS("lis_spatial_Soupir.rds")
names(lis_spatial_Soupir)
## [1] "meta"           "df_coords"      "res_malignant"  "res_macrophage"

Plot the results for GP60

meta<- lis_spatial_Soupir$meta
df_coords<- lis_spatial_Soupir$df_coords

res_malignant<- lis_spatial_Soupir$res_malignant

lis_all<- list()

vec_samples<- names(res_malignant)

# Summary of spatial analysis
for( sample_name in vec_samples ){
    res<- res_malignant[[sample_name]]
    res$stats <- res$stats[order(res$stats$p.value,res$stats$fdr),]
    res$stats$Sample<- sample_name    
    res$stats$Comparison<- paste0(res$stats$x, "__", res$stats$y)
    # Calculate confidence intervals
    z <- atanh(res$stats$cor)
    res$stats$SE_z <- 1 / sqrt(res$stats$effective_n - 3)
    # 95% confidence interval on z scale    
    z_lower <- z - 1.96 * res$stats$SE_z
    z_upper <- z + 1.96 * res$stats$SE_z    
    # Convert back to r scale
    res$stats$r_lower_95 <- tanh(z_lower)
    res$stats$r_upper_95 <- tanh(z_upper)    
    res$stats$signed_neg_log_fdr<- sign(res$stats$cor) * -log10(res$stats$fdr)    
    lis_all[[sample_name]]<- res$stats 
}
res_all<- do.call(rbind, lis_all)
Comparison<- "Malignant_density__Malignant___LV49"
ggdat<- res_all[res_all$Comparison == Comparison,]
ggdat<- ggdat[ggdat$k == 3,]
lim <- stats::quantile(abs(ggdat$signed_neg_log_fdr),0.99, na.rm=T)
# Correlation plot
ggplot( ggdat, aes(y=Sample, x=cor, color=signed_neg_log_fdr ) ) +
    geom_point(size=1) +
    geom_errorbar(aes(xmin = r_lower_95, xmax = r_upper_95), width = 0.2) + # CI error bars
    geom_vline(xintercept=0, linetype="dashed", color = "red") +
    scale_color_gradientn( limits=c(-lim,lim), colours=c("blue","grey","red"), oob=scales::squish ) +    
    facet_wrap(~k) +        
    labs(title=Comparison) +
    theme_plot(classic=T, size_text=10)

Comparison<- "Malignant_density__Malignant___LV60"
ggdat<- res_all[res_all$Comparison == Comparison,]
ggdat<- ggdat[ggdat$k == 3,]
lim <- stats::quantile(abs(ggdat$signed_neg_log_fdr),0.99, na.rm=T)
# Correlation plot
ggplot( ggdat, aes(y=Sample, x=cor, color=signed_neg_log_fdr ) ) +
    geom_point(size=1) +
    geom_errorbar(aes(xmin = r_lower_95, xmax = r_upper_95), width = 0.2) + # CI error bars
    geom_vline(xintercept=0, linetype="dashed", color = "red") +
    scale_color_gradientn( limits=c(-lim,lim), colours=c("blue","grey","red"), oob=scales::squish ) +    
    facet_wrap(~k) +        
    labs(title=Comparison) +
    theme_plot(classic=T, size_text=10)

Meta-analysis

library(psychmeta)
## -----------------------------------------------------  psychmeta version 2.7.0  --
## 
## Please report any bugs to github.com/psychmeta/psychmeta/issues
## or issues@psychmeta.com
## 
## We work hard to produce these open-source tools for the R community.
## Please cite psychmeta when you use it in your research:
##   Dahlke, J. A., & Wiernik, B. M. (2019). psychmeta: An R package for
##     psychometric meta-analysis. Applied Psychological Measurement, 43(5), 415-416.
##     https://doi.org/10.1177/0146621618795933
## 
## ---------------------------------------------------------------  Version check  --
## ✔ Yay! Your copy of psychmeta is up to date!
########################################
# Meta analysis
########################################

lis_meta_res<- list()
for( k in sort(unique( res_all$k )) ){
    res<- res_all[res_all$k == k,]
    ma_res <- ma_r(rxyi = cor, 
               n = effective_n, 
               construct_x = x,
               construct_y = y,
               sample_id = Sample, 
               data = res
               )
    meta_res<- data.frame( get_metatab(ma_res) )
    meta_res$k<- k
    lis_meta_res[[k]]<- meta_res
}
##  **** Running ma_r: Meta-analysis of correlations ****
## 
##  Computing meta-analyses [>----------------------]   5% est. time remaining: 14s Computing meta-analyses [=>---------------------]   8% est. time remaining: 10s Computing meta-analyses [=>---------------------]  10% est. time remaining:  7s Computing meta-analyses [==>--------------------]  12% est. time remaining:  6s Computing meta-analyses [==>--------------------]  15% est. time remaining:  5s Computing meta-analyses [===>-------------------]  18% est. time remaining:  4s Computing meta-analyses [====>------------------]  20% est. time remaining:  4s Computing meta-analyses [====>------------------]  22% est. time remaining:  3s Computing meta-analyses [=====>-----------------]  25% est. time remaining:  3s Computing meta-analyses [=====>-----------------]  28% est. time remaining:  3s Computing meta-analyses [======>----------------]  30% est. time remaining:  3s Computing meta-analyses [======>----------------]  32% est. time remaining:  2s Computing meta-analyses [=======>---------------]  35% est. time remaining:  2s Computing meta-analyses [========>--------------]  38% est. time remaining:  2s Computing meta-analyses [========>--------------]  40% est. time remaining:  2s Computing meta-analyses [=========>-------------]  42% est. time remaining:  2s Computing meta-analyses [=========>-------------]  45% est. time remaining:  2s Computing meta-analyses [==========>------------]  48% est. time remaining:  1s Computing meta-analyses [===========>-----------]  50% est. time remaining:  1s Computing meta-analyses [===========>-----------]  52% est. time remaining:  1s Computing meta-analyses [============>----------]  55% est. time remaining:  1s Computing meta-analyses [============>----------]  57% est. time remaining:  1s Computing meta-analyses [=============>---------]  60% est. time remaining:  1s Computing meta-analyses [=============>---------]  62% est. time remaining:  1s Computing meta-analyses [==============>--------]  65% est. time remaining:  1s Computing meta-analyses [===============>-------]  68% est. time remaining:  1s Computing meta-analyses [===============>-------]  70% est. time remaining:  1s Computing meta-analyses [================>------]  72% est. time remaining:  1s Computing meta-analyses [================>------]  75% est. time remaining:  1s Computing meta-analyses [=================>-----]  78% est. time remaining:  1s Computing meta-analyses [=================>-----]  80% est. time remaining:  0s Computing meta-analyses [==================>----]  82% est. time remaining:  0s Computing meta-analyses [===================>---]  85% est. time remaining:  0s Computing meta-analyses [===================>---]  88% est. time remaining:  0s Computing meta-analyses [====================>--]  90% est. time remaining:  0s Computing meta-analyses [====================>--]  92% est. time remaining:  0s Computing meta-analyses [=====================>-]  95% est. time remaining:  0s Computing meta-analyses [=====================>-]  98% est. time remaining:  0s Computing meta-analyses [=======================] 100% est. time remaining:  0s
##  **** Running ma_r: Meta-analysis of correlations ****
##  Computing meta-analyses [===>-------------------]  18% est. time remaining:  1s Computing meta-analyses [====>------------------]  20% est. time remaining:  1s Computing meta-analyses [====>------------------]  22% est. time remaining:  1s Computing meta-analyses [=====>-----------------]  25% est. time remaining:  1s Computing meta-analyses [=====>-----------------]  28% est. time remaining:  1s Computing meta-analyses [======>----------------]  30% est. time remaining:  1s Computing meta-analyses [======>----------------]  32% est. time remaining:  1s Computing meta-analyses [=======>---------------]  35% est. time remaining:  1s Computing meta-analyses [========>--------------]  38% est. time remaining:  1s Computing meta-analyses [========>--------------]  40% est. time remaining:  1s Computing meta-analyses [=========>-------------]  42% est. time remaining:  1s Computing meta-analyses [=========>-------------]  45% est. time remaining:  1s Computing meta-analyses [==========>------------]  48% est. time remaining:  1s Computing meta-analyses [===========>-----------]  50% est. time remaining:  1s Computing meta-analyses [===========>-----------]  52% est. time remaining:  1s Computing meta-analyses [============>----------]  55% est. time remaining:  1s Computing meta-analyses [============>----------]  57% est. time remaining:  1s Computing meta-analyses [=============>---------]  60% est. time remaining:  1s Computing meta-analyses [=============>---------]  62% est. time remaining:  1s Computing meta-analyses [==============>--------]  65% est. time remaining:  0s Computing meta-analyses [===============>-------]  68% est. time remaining:  0s Computing meta-analyses [===============>-------]  70% est. time remaining:  0s Computing meta-analyses [================>------]  72% est. time remaining:  0s Computing meta-analyses [================>------]  75% est. time remaining:  0s Computing meta-analyses [=================>-----]  78% est. time remaining:  0s Computing meta-analyses [=================>-----]  80% est. time remaining:  0s Computing meta-analyses [==================>----]  82% est. time remaining:  0s Computing meta-analyses [===================>---]  85% est. time remaining:  0s Computing meta-analyses [===================>---]  88% est. time remaining:  0s Computing meta-analyses [====================>--]  90% est. time remaining:  0s Computing meta-analyses [====================>--]  92% est. time remaining:  0s Computing meta-analyses [=====================>-]  95% est. time remaining:  0s Computing meta-analyses [=====================>-]  98% est. time remaining:  0s Computing meta-analyses [=======================] 100% est. time remaining:  0s
##  **** Running ma_r: Meta-analysis of correlations ****
##  Computing meta-analyses [===>-------------------]  18% est. time remaining:  1s Computing meta-analyses [====>------------------]  20% est. time remaining:  1s Computing meta-analyses [====>------------------]  22% est. time remaining:  1s Computing meta-analyses [=====>-----------------]  25% est. time remaining:  1s Computing meta-analyses [=====>-----------------]  28% est. time remaining:  1s Computing meta-analyses [======>----------------]  30% est. time remaining:  1s Computing meta-analyses [======>----------------]  32% est. time remaining:  1s Computing meta-analyses [=======>---------------]  35% est. time remaining:  1s Computing meta-analyses [========>--------------]  38% est. time remaining:  1s Computing meta-analyses [========>--------------]  40% est. time remaining:  1s Computing meta-analyses [=========>-------------]  42% est. time remaining:  1s Computing meta-analyses [=========>-------------]  45% est. time remaining:  1s Computing meta-analyses [==========>------------]  48% est. time remaining:  1s Computing meta-analyses [===========>-----------]  50% est. time remaining:  1s Computing meta-analyses [===========>-----------]  52% est. time remaining:  1s Computing meta-analyses [============>----------]  55% est. time remaining:  1s Computing meta-analyses [============>----------]  57% est. time remaining:  1s Computing meta-analyses [=============>---------]  60% est. time remaining:  1s Computing meta-analyses [=============>---------]  62% est. time remaining:  1s Computing meta-analyses [==============>--------]  65% est. time remaining:  0s Computing meta-analyses [===============>-------]  68% est. time remaining:  0s Computing meta-analyses [===============>-------]  70% est. time remaining:  0s Computing meta-analyses [================>------]  72% est. time remaining:  0s Computing meta-analyses [================>------]  75% est. time remaining:  0s Computing meta-analyses [=================>-----]  78% est. time remaining:  0s Computing meta-analyses [=================>-----]  80% est. time remaining:  0s Computing meta-analyses [==================>----]  82% est. time remaining:  0s Computing meta-analyses [===================>---]  85% est. time remaining:  0s Computing meta-analyses [===================>---]  88% est. time remaining:  0s Computing meta-analyses [====================>--]  90% est. time remaining:  0s Computing meta-analyses [====================>--]  92% est. time remaining:  0s Computing meta-analyses [=====================>-]  95% est. time remaining:  0s Computing meta-analyses [=====================>-]  98% est. time remaining:  0s Computing meta-analyses [=======================] 100% est. time remaining:  0s
##  **** Running ma_r: Meta-analysis of correlations ****
##  Computing meta-analyses [===>-------------------]  18% est. time remaining:  1s Computing meta-analyses [====>------------------]  20% est. time remaining:  1s Computing meta-analyses [====>------------------]  22% est. time remaining:  1s Computing meta-analyses [=====>-----------------]  25% est. time remaining:  1s Computing meta-analyses [=====>-----------------]  28% est. time remaining:  1s Computing meta-analyses [======>----------------]  30% est. time remaining:  1s Computing meta-analyses [======>----------------]  32% est. time remaining:  1s Computing meta-analyses [=======>---------------]  35% est. time remaining:  1s Computing meta-analyses [========>--------------]  38% est. time remaining:  1s Computing meta-analyses [========>--------------]  40% est. time remaining:  1s Computing meta-analyses [=========>-------------]  42% est. time remaining:  1s Computing meta-analyses [=========>-------------]  45% est. time remaining:  1s Computing meta-analyses [==========>------------]  48% est. time remaining:  1s Computing meta-analyses [===========>-----------]  50% est. time remaining:  1s Computing meta-analyses [===========>-----------]  52% est. time remaining:  1s Computing meta-analyses [============>----------]  55% est. time remaining:  1s Computing meta-analyses [============>----------]  57% est. time remaining:  1s Computing meta-analyses [=============>---------]  60% est. time remaining:  1s Computing meta-analyses [=============>---------]  62% est. time remaining:  1s Computing meta-analyses [==============>--------]  65% est. time remaining:  0s Computing meta-analyses [===============>-------]  68% est. time remaining:  0s Computing meta-analyses [===============>-------]  70% est. time remaining:  0s Computing meta-analyses [================>------]  72% est. time remaining:  0s Computing meta-analyses [================>------]  75% est. time remaining:  0s Computing meta-analyses [=================>-----]  78% est. time remaining:  0s Computing meta-analyses [=================>-----]  80% est. time remaining:  0s Computing meta-analyses [==================>----]  82% est. time remaining:  0s Computing meta-analyses [===================>---]  85% est. time remaining:  0s Computing meta-analyses [===================>---]  88% est. time remaining:  0s Computing meta-analyses [====================>--]  90% est. time remaining:  0s Computing meta-analyses [====================>--]  92% est. time remaining:  0s Computing meta-analyses [=====================>-]  95% est. time remaining:  0s Computing meta-analyses [=====================>-]  98% est. time remaining:  0s Computing meta-analyses [=======================] 100% est. time remaining:  0s
##  **** Running ma_r: Meta-analysis of correlations ****
##  Computing meta-analyses [===>-------------------]  18% est. time remaining:  1s Computing meta-analyses [====>------------------]  20% est. time remaining:  1s Computing meta-analyses [====>------------------]  22% est. time remaining:  1s Computing meta-analyses [=====>-----------------]  25% est. time remaining:  1s Computing meta-analyses [=====>-----------------]  28% est. time remaining:  1s Computing meta-analyses [======>----------------]  30% est. time remaining:  1s Computing meta-analyses [======>----------------]  32% est. time remaining:  1s Computing meta-analyses [=======>---------------]  35% est. time remaining:  1s Computing meta-analyses [========>--------------]  38% est. time remaining:  1s Computing meta-analyses [========>--------------]  40% est. time remaining:  1s Computing meta-analyses [=========>-------------]  42% est. time remaining:  1s Computing meta-analyses [=========>-------------]  45% est. time remaining:  1s Computing meta-analyses [==========>------------]  48% est. time remaining:  1s Computing meta-analyses [===========>-----------]  50% est. time remaining:  1s Computing meta-analyses [===========>-----------]  52% est. time remaining:  1s Computing meta-analyses [============>----------]  55% est. time remaining:  1s Computing meta-analyses [============>----------]  57% est. time remaining:  1s Computing meta-analyses [=============>---------]  60% est. time remaining:  1s Computing meta-analyses [=============>---------]  62% est. time remaining:  1s Computing meta-analyses [==============>--------]  65% est. time remaining:  0s Computing meta-analyses [===============>-------]  68% est. time remaining:  0s Computing meta-analyses [===============>-------]  70% est. time remaining:  0s Computing meta-analyses [================>------]  72% est. time remaining:  0s Computing meta-analyses [================>------]  75% est. time remaining:  0s Computing meta-analyses [=================>-----]  78% est. time remaining:  0s Computing meta-analyses [=================>-----]  80% est. time remaining:  0s Computing meta-analyses [==================>----]  82% est. time remaining:  0s Computing meta-analyses [===================>---]  85% est. time remaining:  0s Computing meta-analyses [===================>---]  88% est. time remaining:  0s Computing meta-analyses [====================>--]  90% est. time remaining:  0s Computing meta-analyses [====================>--]  92% est. time remaining:  0s Computing meta-analyses [=====================>-]  95% est. time remaining:  0s Computing meta-analyses [=====================>-]  98% est. time remaining:  0s Computing meta-analyses [=======================] 100% est. time remaining:  0s
meta_res<- do.call(rbind, lis_meta_res)

# Calculate p-value
meta_res$Z <- meta_res$mean_r / meta_res$se_r
meta_res$p <- 2 * pnorm(-abs(meta_res$Z))
meta_res$fdr <- p.adjust(meta_res$p,method="fdr")
meta_res$signed_neg_log_fdr<- sign(meta_res$mean_r) * -log10(meta_res$fdr)
meta_res <- meta_res[order(-meta_res$p),]

Figure meta analysis

order_lvs<- sub("Malignant___", "", unique(meta_res$construct_y))
df_dat<- meta_res[meta_res$k == 3,]
df_dat<- df_dat[df_dat$construct_y %in% c("Malignant___LV60", "Malignant___LV49"),]
df_dat$construct_y<- sub("Malignant___", "", df_dat$construct_y)
lim <- stats::quantile(abs(df_dat$signed_neg_log_fdr),0.99, na.rm=T)
df_dat$construct_y<- factor(df_dat$construct_y, levels=order_lvs)
# Main plot
ggplot(df_dat, aes( mean_r, construct_y, color=signed_neg_log_fdr) ) +
    geom_point(size=1) +
    geom_errorbar(aes(xmin = CI_LL_95, xmax = CI_UL_95), width = 0.2) + # CI error bars
    geom_vline(xintercept=0, linetype="dashed", color = "red") +        
    scale_color_gradientn( limits=c(-lim,lim), colours=c("blue","grey","red"), oob=scales::squish ) +        
    theme_plot(classic=T, size_text=9, rotate_x_axis=F, leg_pos="right")

## Plot for specific samples

## Program 49  -- RCC 4_5
sample_name<- "RCC4_5"
Comparison<- "Malignant_density__Malignant___LV49"
obj<- res_malignant[[sample_name]]
meta_sample<- cbind(meta[rownames(obj$Y),], df_coords[rownames(obj$Y),])
obj$stats <- obj$stats[order(obj$stats$p.value,obj$stats$fdr),]
obj$stats$Comparison<- paste0(obj$stats$x, "__", obj$stats$y)
idx_plot<- which( obj$stats$Comparison == Comparison & obj$stats$k == 3)[1]        
k<- obj$stats$k[idx_plot]
var1<- obj$stats$x[idx_plot]
var2<- obj$stats$y[idx_plot]
# Celltypes
ggplot(meta_sample,aes(x=x,y=y,color=lasso_final_curated)) +
    geom_point() +
    theme_plot(leg_pos="none")

# Activities
ggplot(data.frame(x=meta_sample$x,y=meta_sample$y,LV=obj$Y[,var2],weights=obj$weights[,k])) +
    geom_point(aes(x=x,y=y,color=LV,alpha=(!is.na(LV))*1)) +
    scale_color_gradient2(low="blue",mid="lightgrey",high="red") +
    ggtitle(var2) +
    theme_plot()

# Scatterplot
ggplot(data.frame(x=obj$smoothed_X[[k]][,var1],y=obj$smoothed_Y[[k]][,var2],weights=obj$weights[,k])) +
    geom_point(aes(x=x,y=y,alpha=weights)) +
    scale_alpha(range=c(0,1)) +
    theme_plot()
## Warning: Removed 904 rows containing missing values or values outside the scale
## range (`geom_point()`).

## Program 49  -- RCC 3_15
sample_name<- "RCC3_15"
Comparison<- "Malignant_density__Malignant___LV49"
obj<- res_malignant[[sample_name]]
meta_sample<- cbind(meta[rownames(obj$Y),], df_coords[rownames(obj$Y),])
obj$stats <- obj$stats[order(obj$stats$p.value,obj$stats$fdr),]
obj$stats$Comparison<- paste0(obj$stats$x, "__", obj$stats$y)
idx_plot<- which( obj$stats$Comparison == Comparison & obj$stats$k == 3)[1]        
k<- obj$stats$k[idx_plot]
var1<- obj$stats$x[idx_plot]
var2<- obj$stats$y[idx_plot]
# Celltypes
ggplot(meta_sample,aes(x=x,y=y,color=lasso_final_curated)) +
    geom_point() +
    theme_plot(leg_pos="none")

# Activities
ggplot(data.frame(x=meta_sample$x,y=meta_sample$y,LV=obj$Y[,var2],weights=obj$weights[,k])) +
    geom_point(aes(x=x,y=y,color=LV,alpha=(!is.na(LV))*1)) +
    scale_color_gradient2(low="blue",mid="lightgrey",high="red") +
    ggtitle(var2) +
    theme_plot()

# Scatterplot
ggplot(data.frame(x=obj$smoothed_X[[k]][,var1],y=obj$smoothed_Y[[k]][,var2],weights=obj$weights[,k])) +
    geom_point(aes(x=x,y=y,alpha=weights)) +
    scale_alpha(range=c(0,1)) +
    theme_plot()
## Warning: Removed 5 rows containing missing values or values outside the scale
## range (`geom_point()`).

sessionInfo()
## R version 4.3.1 (2023-06-16)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: AlmaLinux 9.6 (Sage Margay)
## 
## Matrix products: default
## BLAS/LAPACK: FlexiBLAS IMKL;  LAPACK version 3.11.0
## 
## locale:
##  [1] LC_CTYPE=en_CA.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_CA.UTF-8        LC_COLLATE=en_CA.UTF-8    
##  [5] LC_MONETARY=en_CA.UTF-8    LC_MESSAGES=en_CA.UTF-8   
##  [7] LC_PAPER=en_CA.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_CA.UTF-8 LC_IDENTIFICATION=C       
## 
## time zone: Canada/Eastern
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] grid      stats4    stats     graphics  grDevices utils     datasets 
## [8] methods   base     
## 
## other attached packages:
##  [1] psychmeta_2.7.0             scConvexNMF_0.0.0.9000     
##  [3] circlize_0.4.15             ComplexHeatmap_2.18.0      
##  [5] pheatmap_1.0.12             Matrix_1.6-4               
##  [7] ggplot2_3.5.2               SingleCellExperiment_1.24.0
##  [9] SummarizedExperiment_1.32.0 Biobase_2.62.0             
## [11] GenomicRanges_1.54.1        GenomeInfoDb_1.38.5        
## [13] IRanges_2.36.0              S4Vectors_0.40.2           
## [15] BiocGenerics_0.48.1         MatrixGenerics_1.14.0      
## [17] matrixStats_1.2.0          
## 
## loaded via a namespace (and not attached):
##  [1] tidyselect_1.2.0        dplyr_1.1.4             farver_2.1.1           
##  [4] bitops_1.0-7            fastmap_1.1.1           RCurl_1.98-1.14        
##  [7] digest_0.6.33           lifecycle_1.0.4         cluster_2.1.6          
## [10] Cairo_1.6-2             magrittr_2.0.3          compiler_4.3.1         
## [13] rlang_1.1.6             sass_0.4.8              progress_1.2.3         
## [16] tools_4.3.1             utf8_1.2.4              yaml_2.3.8             
## [19] knitr_1.45              prettyunits_1.2.0       S4Arrays_1.2.0         
## [22] labeling_0.4.3          curl_6.2.3              DelayedArray_0.28.0    
## [25] RColorBrewer_1.1-3      abind_1.4-5             withr_2.5.2            
## [28] purrr_1.0.2             fansi_1.0.6             colorspace_2.1-0       
## [31] scales_1.3.0            iterators_1.0.14        cli_3.6.2              
## [34] rmarkdown_2.29          crayon_1.5.2            generics_0.1.3         
## [37] rjson_0.2.21            cachem_1.0.8            zlibbioc_1.48.0        
## [40] parallel_4.3.1          XVector_0.42.0          vctrs_0.6.5            
## [43] boot_1.3-28.1           jsonlite_1.8.8          GetoptLong_1.0.5       
## [46] hms_1.1.3               clue_0.3-65             magick_2.9.0           
## [49] foreach_1.5.2           tidyr_1.3.0             jquerylib_0.1.4        
## [52] glue_1.7.0              codetools_0.2-19        gtable_0.3.4           
## [55] shape_1.4.6             munsell_0.5.0           tibble_3.2.1           
## [58] pillar_1.9.0            htmltools_0.5.7         GenomeInfoDbData_1.2.11
## [61] R6_2.5.1                doParallel_1.0.17       evaluate_0.23          
## [64] lattice_0.22-5          highr_0.10              png_0.1-8              
## [67] bslib_0.6.1             Rcpp_1.0.12             SparseArray_1.2.3      
## [70] xfun_0.41               pkgconfig_2.0.3         GlobalOptions_0.1.2