Loading libraries

library(SingleCellExperiment)
library(DESeq2)
library(ggplot2)
library(ComplexHeatmap)
library(circlize)
library(EnhancedVolcano)
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))
    }
}

norm_rpm<- function( E ){
    return( scale( E, center=F, scale=apply(E,2,sum) ) * 1e6 )
}

run_pca<- function(inp_mat=NULL,
                   transpose=TRUE
                   ) {
    ## Transposing
    if( transpose ){
        inp_mat<- t(inp_mat)
    }
    ## Calculating PCA
    dat_pca<- prcomp( inp_mat, center=TRUE, scale.=FALSE)
    pca_obj<- data.frame(dat_pca$x)
    ## Output results
    return(pca_obj)
}


plot_dimred <- function(dim_obj,                        
                        var_plot=NULL,
                        meta=NULL,
                        center=FALSE,
                        size_text=20,
                        size_dot=0.5,
                        leg_pos="right",
                        cols_use=NULL,
                        title_use="",                         
                        size_guide_legend=7,
                        use_ggrastr=FALSE,
                        ggrastr_dpi=100,
                        ggrastr_layers="Point"
                        ){
    require(ggplot2)
    require(RColorBrewer)
    require(ggrastr)
    require(viridis)
    
    col1<- colnames(dim_obj)[1]
    col2<- colnames(dim_obj)[2]
    if( is.null(meta) ){
        meta<- dim_obj[,-c(1:2), drop=FALSE]
    }
    if( !is.null(var_plot) ){
        colour<- meta[,var_plot]
        if(is.numeric(colour)){
            if( center ){
                dim_obj[,var_plot] <- colour - mean(colour)
                lim <- quantile(abs(dim_obj[,var_plot]),0.9999)
            }else{
                dim_obj[,var_plot] <- colour            
            }        
            ggp<- ggplot(dim_obj, aes_string( col1, col2, colour=var_plot))
            if( use_ggrastr ){
                ggp<- ggp + rasterise(geom_point(size=size_dot), dpi = ggrastr_dpi, layers=ggrastr_layers)
            }else{
                ggp<- ggp + geom_point(size=size_dot)
            }
            if( center) {
                ggp<- ggp +
                    scale_color_gradientn( limits=c(-lim,lim), colours=c("blue","#d8d8d8","red") )
            }else{
                ggp<- ggp +
                    scale_color_viridis()           
            }
            ggp<- ggp +
                theme_plot(size_text=size_text, leg_pos=leg_pos)+            
                labs(color=var_plot)
            
        } else {
            dim_obj[,var_plot] <- colour
            ggp<- ggplot(dim_obj, aes_string(col1,col2, color=var_plot))
            if( use_ggrastr ){
                ggp<- ggp + rasterise(geom_point(size=size_dot), dpi = ggrastr_dpi, layers=ggrastr_layers)
            }else{
                ggp<- ggp + geom_point(size=size_dot)
            }
            ggp<- ggp +
                theme_plot(size_text=size_text, leg_pos=leg_pos)+        
                guides(colour = guide_legend(override.aes = list(size=size_guide_legend)))+
                labs(color=var_plot)
            if( !is.null(cols_use) ){
                ggp<- ggp +
                    scale_color_manual(values=c(cols_use))
            }
        }
    }else{
        ggp<- ggplot(dim_obj, aes_string( col1, col2)) 
        if( use_ggrastr ){
            ggp<- ggp + rasterise(geom_point(size=size_dot), dpi = ggrastr_dpi, layers=ggrastr_layers)
        }else{
            ggp<- ggp + geom_point(size=size_dot)
        }
        ggp<- ggp +
            theme_plot(size_text=size_text, leg_pos=leg_pos)                        
    }
    return(ggp)    
}

Loading data

The DESeq2 object can be found at Zenodo.

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

GSEA data

lis_gsea<- readRDS("lis_gsea.rds")

PCA plot

vsd <- vst(dds, blind=FALSE)
topVarGenes <- order(rowVars(assay(vsd)),decreasing=TRUE)[1:1000]
pca_obj<- cbind( run_pca( assay(vsd)[topVarGenes,]), meta)
plot_dimred(pca_obj, var_plot="tumor_site", size_dot=3, cols_use=c("red", "blue"))
## Loading required package: RColorBrewer
## Loading required package: ggrastr
## Loading required package: viridis
## Loading required package: viridisLite
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.

Volcano plot

res<- data.frame( results(dds, name= "tumor_sitemetastasis") )
res$gene<- rownames(res)

EnhancedVolcano(res,
                title="Metastasis vs primary",
                lab = res$gene,                      
                x = 'log2FoldChange',
                y = 'padj',
                cutoffLineType = 'blank',                
                pCutoff = 0.1,
                FCcutoff = 0,
                drawConnectors = TRUE,
                ylim= c(0,6),
                xlim= c(-10, 10),
                raster=TRUE,
                col=c('grey','grey', 'red', 'red'),
                colAlpha = 0.5,
                gridlines.major = FALSE,
                gridlines.minor = FALSE
                )
## Warning: ggrepel: 92 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

Heatmap

names(lis_gsea$malignant)
## [1] "gsea_stats" "programs"   "ranks"
gene_ranks<- lis_gsea$malignant$ranks

norm_counts<- norm_rpm(counts(dds))

identical(rownames(meta), colnames(norm_counts))
## [1] TRUE
length(intersect(rownames(gene_ranks), rownames(norm_counts) ) )
## [1] 13661
sig_res<- res[which(res$padj < 0.05),]

# Establish order of genes
met_sig_res<- sig_res[which(sig_res$log2FoldChange > 0),]
pri_sig_res<- sig_res[which(sig_res$log2FoldChange < 0),]

met_gene_ranks <- gene_ranks[rownames(met_sig_res),]
met_gene_ranks<- met_gene_ranks[order(met_gene_ranks$SCORE),]
pri_gene_ranks <- gene_ranks[rownames(pri_sig_res),]
pri_gene_ranks<- pri_gene_ranks[order(pri_gene_ranks$SCORE),]

order_genes<- c(rownames(pri_gene_ranks), rownames(met_gene_ranks))
sig_res<- sig_res[order_genes,]

summary(abs(sig_res$log2FoldChange))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.7407  1.2945  2.0313  2.9550  4.0905  9.4294
expr_mat<- norm_counts[order_genes,]
expr_mat<- scale(t(expr_mat) )

summary(c(expr_mat))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -1.9065 -0.5823 -0.3327  0.0000  0.2923  3.4548
# Ordering samples
primary_samples<- rownames(meta[meta$tumor_site == "primary",])
met_samples<- rownames(meta[meta$tumor_site == "metastasis",])
order_samples<- names(c(sort(rowMeans(expr_mat[primary_samples,]), decreasing=T), sort(rowMeans(expr_mat[met_samples,]), decreasing=F) ))

#
expr_mat<- expr_mat[order_samples,]

# Annotation
row_ha<- rowAnnotation(df=meta[order_samples,c("tumor_site", "class")],
                       col=list(
                           tumor_site= c("primary" = "red", "metastasis" = "blue" ),
                           class = c("patient" = "#41cfe3", "PDX" = "#e341cf")                                 
                       )
                       )

gene_annot<- data.frame(row.names=rownames(sig_res),
                        group= ifelse(sig_res$log2FoldChange>0, "up", "down") )
top_ha<- HeatmapAnnotation(df=gene_annot,
                           col=list(group=c("up" = "orange", "down" = "cyan") ) )

# Color
range_val<- quantile(c(abs(expr_mat)), 0.96)
col_fun <- colorRamp2(
    seq(-range_val, range_val, length.out = 7),  # automatically gets min and max
    c("#2b00ad", "#4019b5", "#6b58ef", "white", "#ff5a5a", "#d60c00", "darkred")
)

ht1<- Heatmap(expr_mat,
              col=col_fun,
              cluster_columns=F,
              cluster_rows=F,              
              clustering_distance_rows = "pearson",
              clustering_distance_columns = "pearson",
              clustering_method_row="average",
              clustering_method_col="average",
              left_annotation=row_ha,
              top_annotation=top_ha,
              row_names_gp=gpar(fontsize=9),
              column_names_gp=gpar(fontsize=7),
              rect_gp = gpar(col = "black", lwd = 1),
              border=T,                  
              use_raster=T,
              heatmap_legend_param = list(
                  title = "Expression"
              )
              )
draw(ht1)

Read spatial data (Soupir et al 2024)

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___LV12"
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___LV48"
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 [===>-------------------]  18% est. time remaining:  1s Computing meta-analyses [====>------------------]  20% est. time remaining:  3s 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:  2s 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:  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:  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:  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:  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:  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___LV12", "Malignant___LV48"),]
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 12  -- RCC 5_1
sample_name<- "RCC5_1"
Comparison<- "Malignant_density__Malignant___LV12"
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 645 rows containing missing values or values outside the scale
## range (`geom_point()`).

## Program 48  -- RCC 3_12
sample_name<- "RCC3_12"
Comparison<- "Malignant_density__Malignant___LV48"
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 4295 rows containing missing values or values outside the
## scale range (`geom_point()`).

Read spatial data (MTSRCC)

lis_spatial_PID037<- readRDS("lis_spatial_PID037.rds")
names(lis_spatial_PID037)
## [1] "res_malignant"  "res_macrophage"
# PID037 object
PID037_object<- readRDS("PID037_object.rds")

Plot the results for GP12

meta<- PID037_object$meta
df_coords<- meta[,c("CenterX_global_px", "CenterY_global_px")]
colnames(df_coords)<- c("x", "y")

res_malignant<- lis_spatial_PID037$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)

Meta-analysis

library(psychmeta)
########################################
# 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 [===>-------------------]  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:  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:  1s Computing meta-analyses [===============>-------]  68% est. time remaining:  1s 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:  1s Computing meta-analyses [===============>-------]  68% est. time remaining:  1s 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 [==>--------------------]  15% est. time remaining:  1s 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:  1s Computing meta-analyses [===============>-------]  68% est. time remaining:  1s 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___LV12", "Malignant___LV48"),]
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 12  -- FOV17
sample_name<- "17"
Comparison<- "Malignant_density__Malignant___LV12"
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=cell_type)) +
    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 788 rows containing missing values or values outside the scale
## range (`geom_point()`).

## Program 48  -- 4
sample_name<- "4"
Comparison<- "Malignant_density__Malignant___LV48"
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=cell_type)) +
    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 847 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             viridis_0.6.4              
##  [3] viridisLite_0.4.2           ggrastr_1.0.2              
##  [5] RColorBrewer_1.1-3          scConvexNMF_0.0.0.9000     
##  [7] EnhancedVolcano_1.20.0      ggrepel_0.9.4              
##  [9] circlize_0.4.15             ComplexHeatmap_2.18.0      
## [11] ggplot2_3.5.2               DESeq2_1.42.0              
## [13] SingleCellExperiment_1.24.0 SummarizedExperiment_1.32.0
## [15] Biobase_2.62.0              GenomicRanges_1.54.1       
## [17] GenomeInfoDb_1.38.5         IRanges_2.36.0             
## [19] S4Vectors_0.40.2            BiocGenerics_0.48.1        
## [21] MatrixGenerics_1.14.0       matrixStats_1.2.0          
## 
## loaded via a namespace (and not attached):
##  [1] tidyselect_1.2.0        farver_2.1.1            dplyr_1.1.4            
##  [4] vipor_0.4.7             bitops_1.0-7            fastmap_1.1.1          
##  [7] RCurl_1.98-1.14         digest_0.6.33           lifecycle_1.0.4        
## [10] cluster_2.1.6           Cairo_1.6-2             magrittr_2.0.3         
## [13] compiler_4.3.1          progress_1.2.3          rlang_1.1.6            
## [16] sass_0.4.8              tools_4.3.1             utf8_1.2.4             
## [19] yaml_2.3.8              knitr_1.45              prettyunits_1.2.0      
## [22] labeling_0.4.3          S4Arrays_1.2.0          curl_6.2.3             
## [25] DelayedArray_0.28.0     abind_1.4-5             BiocParallel_1.36.0    
## [28] purrr_1.0.2             withr_2.5.2             fansi_1.0.6            
## [31] colorspace_2.1-0        scales_1.3.0            iterators_1.0.14       
## [34] cli_3.6.2               rmarkdown_2.29          crayon_1.5.2           
## [37] generics_0.1.3          rjson_0.2.21            ggbeeswarm_0.7.2       
## [40] cachem_1.0.8            zlibbioc_1.48.0         parallel_4.3.1         
## [43] XVector_0.42.0          vctrs_0.6.5             boot_1.3-28.1          
## [46] Matrix_1.6-4            jsonlite_1.8.8          hms_1.1.3              
## [49] GetoptLong_1.0.5        clue_0.3-65             beeswarm_0.4.0         
## [52] magick_2.9.0            locfit_1.5-9.8          foreach_1.5.2          
## [55] tidyr_1.3.0             jquerylib_0.1.4         glue_1.7.0             
## [58] codetools_0.2-19        gtable_0.3.4            shape_1.4.6            
## [61] munsell_0.5.0           tibble_3.2.1            pillar_1.9.0           
## [64] htmltools_0.5.7         GenomeInfoDbData_1.2.11 R6_2.5.1               
## [67] doParallel_1.0.17       evaluate_0.23           lattice_0.22-5         
## [70] highr_0.10              png_0.1-8               bslib_0.6.1            
## [73] Rcpp_1.0.12             gridExtra_2.3           SparseArray_1.2.3      
## [76] xfun_0.41               pkgconfig_2.0.3         GlobalOptions_0.1.2