library(scLASER)
library(tidyverse)


# Helper: pick the NAM PC with the smallest LRT p-value and plot it on UMAP
plot_top_nam_pc_umap <- function(object,
                                 p_col_candidates   = c("lrt_pval", "lrt_p", "p.value", "pval"),
                                 nam_col_candidates = c("NAMscore", "nam_pc", "pc", "NAM_PC", "score"),
                                 umap_col_candidates = list(
                                   x = c("UMAP1", "umap_1", "UMAP_1", "Dim1"),
                                   y = c("UMAP2", "umap_2", "UMAP_2", "Dim2")
                                 ),
                                 zscore = TRUE,
                                 facet_by = "disease",
                                 label_cell_types = TRUE,
                                 cell_type_col = "cell_type",
                                 label_size = 3) {

  stopifnot(inherits(object, "scLASER"))

  if (is.null(object@pipeline_output) || nrow(object@pipeline_output) == 0) {
    stop("object@pipeline_output is empty. Run longAnalyses_plusModelSelection() first.")
  }
  if (is.null(object@umap) || nrow(object@umap) == 0) {
    stop("object@umap is empty. Run compute_umap() first.")
  }
  if (is.null(object@nam_pcs) || nrow(object@nam_pcs) == 0) {
    stop("object@nam_pcs is empty. Run association_nam_scLASER() first.")
  }

  # Require row alignment across slots
  n_md  <- nrow(object@metadata)
  n_um  <- nrow(object@umap)
  n_nam <- nrow(object@nam_pcs)
  if (!(n_md == n_um && n_md == n_nam)) {
    stop(
      "Row mismatch across slots:\n",
      "  nrow(metadata) = ", n_md, "\n",
      "  nrow(umap)     = ", n_um, "\n",
      "  nrow(nam_pcs)  = ", n_nam, "\n",
      "These must match if you want to cbind() them."
    )
  }

  po <- object@pipeline_output

  # Find p-value column
  p_col <- p_col_candidates[p_col_candidates %in% colnames(po)][1]
  if (is.na(p_col)) {
    stop("Could not find an LRT p-value column in pipeline_output. Tried: ",
         paste(p_col_candidates, collapse = ", "))
  }

  # Find NAM PC identifier column
  nam_col <- nam_col_candidates[nam_col_candidates %in% colnames(po)][1]
  if (is.na(nam_col)) {
    stop("Could not find a NAM PC identifier column in pipeline_output. Tried: ",
         paste(nam_col_candidates, collapse = ", "))
  }

  po[[p_col]] <- as.numeric(po[[p_col]])
  po <- po[is.finite(po[[p_col]]), , drop = FALSE]
  if (nrow(po) == 0) stop("No finite p-values in pipeline_output.")

  top_row <- po[which.min(po[[p_col]]), , drop = FALSE]
  top_pc  <- as.character(top_row[[nam_col]])

  if (!top_pc %in% colnames(object@nam_pcs)) {
    stop("Top NAM PC '", top_pc, "' not found in colnames(object@nam_pcs).")
  }

  # UMAP coordinate columns
  um <- object@umap
  um1 <- umap_col_candidates$x[umap_col_candidates$x %in% colnames(um)][1]
  um2 <- umap_col_candidates$y[umap_col_candidates$y %in% colnames(um)][1]
  if (is.na(um1) || is.na(um2)) {
    stop("Could not find UMAP coordinate columns in object@umap.")
  }

  # Build plotting DF by row alignment
  plot_df <- cbind(object@metadata, object@umap)
  plot_df$nam_score <- as.numeric(object@nam_pcs[, top_pc])

  if (zscore) {
    plot_df$nam_score <- as.numeric(scale(plot_df$nam_score))
  }

  p <- ggplot2::ggplot(
    plot_df,
    ggplot2::aes(x = .data[[um1]], y = .data[[um2]], color = nam_score)
  ) +
    ggplot2::geom_point(size = 0.6, alpha = 0.85) +
    ggplot2::scale_color_gradient2(
      low = "#2C7BB6",   # blue
      mid = "white",
      high = "#D7191C",  # red
      midpoint = 0
    ) +
    ggplot2::labs(
      title = "Association Score (significant latent embedding, PC1)",
      subtitle = paste0("min LRT p = ", signif(top_row[[p_col]], 3)),
      x = "UMAP1",
      y = "UMAP2",
      color = if (zscore) paste0(top_pc, " (z)") else top_pc
    ) +
    ggplot2::theme_classic()

  # Facet (optional)
  if (!is.null(facet_by) && facet_by %in% colnames(plot_df)) {
    p <- p + ggplot2::facet_wrap(stats::as.formula(paste("~", facet_by)), nrow = 1)
  }

  # Add one label per cell type at median UMAP position
  if (isTRUE(label_cell_types)) {
    if (!cell_type_col %in% colnames(plot_df)) {
      stop("cell_type_col '", cell_type_col, "' not found in metadata/plot_df.")
    }

    label_df <- plot_df %>%
      dplyr::group_by(.data[[cell_type_col]]) %>%
      dplyr::summarise(
        .x = stats::median(.data[[um1]], na.rm = TRUE),
        .y = stats::median(.data[[um2]], na.rm = TRUE),
        .groups = "drop"
      ) %>%
      dplyr::rename(label = !!cell_type_col)

    p <- p +
      ggplot2::geom_text(
        data = label_df,
        ggplot2::aes(x = .x, y = .y, label = label),
        inherit.aes = FALSE,
        size = label_size
      )
  }

  p
}

A. Create an object for the single-cell data. The simulated cell abundances are visualized accordingly based on clinical outcome status

obj <- scLASER(metadata = readRDS("/Users/juanvargas/Documents/GitHub/scLASER/vignettes/metadata.rds"), pcs = readRDS("/Users/juanvargas/Documents/GitHub/scLASER/vignettes/pcs.rds"))

obj
#> scLASER object
#> ---------------
#> Slots: 
#>   metadata:  110431 11 
#>   pcs:  110431 20 
#>   umap:  
#>   harmony:  
#>   nam_pcs:  
#>   NAM_matrix:  
#>   plsda_LV:  
#>   pipeline_output:
plot_celltype_proportions(
  obj,
  disease_var = "disease",
  disease_labels = c("0" = "Non-responder", "1" = "Responder"),
  disease_colors = c("Non-responder" = "#4DAF4A", "Responder" = "#984EA3"),
  highlight_cell_types = NULL
)

What lives in a scLASER object (slots)

A scLASER object is an S4 container that stores each intermediate output of the pipeline in a dedicated slot, so later steps can reuse results without recomputing them. In this tutorial we populate the slots in the following order:

B. Visualizing data in UMAP, with data harmonized across samples

obj <- compute_umap(obj, n_neighbors = 30, metric = "cosine", min_dist = 0.01)

obj <- run_harmony(
  obj,
  batch_col = "sample_id",
  theta = 2,
  epsilon.cluster = -Inf,
  epsilon.harmony = -Inf,
  max.iter.cluster = 30,
  max.iter.harmony = 10,
  plot_convergence = FALSE
)

saveRDS(obj, "obj_scLASER.rds")

C. Running main functions for longitudinal association modeling

The following 2 functions association_nam_scLASER and longAnalyses_plusModelSelection are the main protagonist of our pipeline. In the previous steps, the goal was to harmonize the pcs to remove any batch effect. In these steps we create the Neighborhood Abundance Matrix from those harmonized pcs. Further we determine which of those NAM PCs or Association score vectors are associated with the interaction of response status and visit.


obj = readRDS("obj_scLASER.rds")

obj@metadata$disease = as.numeric(obj@metadata$disease)
obj <- association_nam_scLASER(
  obj = obj,
  test_var = "disease",
  samplem_key = "sample_id",
  graph_use = "RNA_nn",
  batches = "batch",
  covs = c("age", "sex"),
  Nnull = 1000,
  local_test = TRUE,n_pcs = 20,
  seed = 1234, return_nam = T, key = "NAM_"
)

# Align names for longitudinal analysis + plotting
rownames(obj@nam_pcs) <- obj@metadata$sample_id

obj <- scLASER_modeling(obj,
  disease_var = "disease",
  time_var    = "visit",
  covariates  = c("age", "sex"),
  subject_var = "subject_id",
  sample_var  = "sample_id"
)


obj@pipeline_output
#>     NAMscore          best_model              coefficient         Value
#> 1        PC1 time as categorical              (Intercept) -2.534984e-04
#> 2        PC1 time as categorical                 disease1  3.596413e-05
#> 3        PC1 time as categorical          visit_fac__tmp1  6.963603e-05
#> 4        PC1 time as categorical          visit_fac__tmp2  2.649740e-05
#> 5        PC1 time as categorical                      age -1.763533e-06
#> 6        PC1 time as categorical                      sex  5.570523e-05
#> 7        PC1 time as categorical disease1:visit_fac__tmp1  1.511205e-03
#> 8        PC1 time as categorical disease1:visit_fac__tmp2  7.388751e-04
#> 9        PC2  time as continuous              (Intercept) -2.101264e-04
#> 10       PC2  time as continuous                 disease1  3.655688e-04
#> 11       PC2  time as continuous                    visit  1.973819e-04
#> 12       PC2  time as continuous                      age  2.712114e-07
#> 13       PC2  time as continuous                      sex -1.699309e-05
#> 14       PC2  time as continuous           disease1:visit -3.139720e-04
#> 15       PC3  time as continuous              (Intercept)  3.994589e-04
#> 16       PC3  time as continuous                 disease1 -3.680073e-04
#> 17       PC3  time as continuous                    visit -2.165900e-04
#> 18       PC3  time as continuous                      age -1.959783e-08
#> 19       PC3  time as continuous                      sex -4.909294e-05
#> 20       PC3  time as continuous           disease1:visit  2.488249e-04
#> 21       PC4  time as continuous              (Intercept)  4.581861e-05
#> 22       PC4  time as continuous                 disease1  3.240621e-04
#> 23       PC4  time as continuous                    visit  7.408875e-05
#> 24       PC4  time as continuous                      age -5.875629e-07
#> 25       PC4  time as continuous                      sex  4.960529e-05
#> 26       PC4  time as continuous           disease1:visit -2.244589e-04
#> 27       PC5  time as continuous              (Intercept) -1.658504e-04
#> 28       PC5  time as continuous                 disease1 -5.443877e-05
#> 29       PC5  time as continuous                    visit  9.249382e-05
#> 30       PC5  time as continuous                      age -2.818307e-07
#> 31       PC5  time as continuous                      sex -2.249556e-05
#> 32       PC5  time as continuous           disease1:visit  1.796596e-05
#> 33       PC6  time as continuous              (Intercept) -6.950496e-05
#> 34       PC6  time as continuous                 disease1  1.740319e-04
#> 35       PC6  time as continuous                    visit -2.274678e-05
#> 36       PC6  time as continuous                      age -1.084537e-06
#> 37       PC6  time as continuous                      sex  2.161173e-05
#> 38       PC6  time as continuous           disease1:visit -4.531346e-05
#> 39       PC7  time as continuous              (Intercept)  7.762888e-06
#> 40       PC7  time as continuous                 disease1 -1.212577e-04
#> 41       PC7  time as continuous                    visit  1.788678e-06
#> 42       PC7  time as continuous                      age  6.550804e-08
#> 43       PC7  time as continuous                      sex  1.573229e-05
#> 44       PC7  time as continuous           disease1:visit  2.182535e-04
#> 45       PC8  time as continuous              (Intercept) -1.702020e-04
#> 46       PC8  time as continuous                 disease1  8.393644e-04
#> 47       PC8  time as continuous                    visit  2.705926e-04
#> 48       PC8  time as continuous                      age -4.849020e-07
#> 49       PC8  time as continuous                      sex  2.113245e-05
#> 50       PC8  time as continuous           disease1:visit -6.787756e-04
#> 51       PC9  time as continuous              (Intercept) -2.387438e-04
#> 52       PC9  time as continuous                 disease1  2.236261e-04
#> 53       PC9  time as continuous                    visit  1.128786e-04
#> 54       PC9  time as continuous                      age -8.191805e-07
#> 55       PC9  time as continuous                      sex  7.276104e-06
#> 56       PC9  time as continuous           disease1:visit -1.261960e-04
#> 57      PC10  time as continuous              (Intercept)  3.065227e-04
#> 58      PC10  time as continuous                 disease1  7.076614e-05
#> 59      PC10  time as continuous                    visit -1.652570e-04
#> 60      PC10  time as continuous                      age  3.582823e-07
#> 61      PC10  time as continuous                      sex  3.172823e-06
#> 62      PC10  time as continuous           disease1:visit -3.639516e-05
#> 63      PC11  time as continuous              (Intercept) -1.392867e-06
#> 64      PC11  time as continuous                 disease1  2.970147e-04
#> 65      PC11  time as continuous                    visit -2.374223e-05
#> 66      PC11  time as continuous                      age -2.793834e-07
#> 67      PC11  time as continuous                      sex  2.624115e-06
#> 68      PC11  time as continuous           disease1:visit -3.102876e-04
#> 69      PC12  time as continuous              (Intercept) -9.497552e-05
#> 70      PC12  time as continuous                 disease1  1.038499e-04
#> 71      PC12  time as continuous                    visit  9.729062e-05
#> 72      PC12  time as continuous                      age -1.815332e-07
#> 73      PC12  time as continuous                      sex  1.425610e-06
#> 74      PC12  time as continuous           disease1:visit -5.771183e-05
#> 75      PC13  time as continuous              (Intercept)  1.322772e-04
#> 76      PC13  time as continuous                 disease1 -4.604564e-05
#> 77      PC13  time as continuous                    visit  8.534059e-05
#> 78      PC13  time as continuous                      age  9.377048e-07
#> 79      PC13  time as continuous                      sex -1.956941e-05
#> 80      PC13  time as continuous           disease1:visit -6.937589e-05
#> 81      PC14  time as continuous              (Intercept)  3.841321e-05
#> 82      PC14  time as continuous                 disease1  7.616848e-05
#> 83      PC14  time as continuous                    visit -1.241501e-04
#> 84      PC14  time as continuous                      age  5.048552e-07
#> 85      PC14  time as continuous                      sex -1.160019e-05
#> 86      PC14  time as continuous           disease1:visit  1.090295e-05
#> 87      PC15  time as continuous              (Intercept) -1.315771e-04
#> 88      PC15  time as continuous                 disease1  3.479137e-04
#> 89      PC15  time as continuous                    visit  1.256489e-04
#> 90      PC15  time as continuous                      age -8.291946e-07
#> 91      PC15  time as continuous                      sex  1.008615e-05
#> 92      PC15  time as continuous           disease1:visit -2.840735e-04
#> 93      PC16  time as continuous              (Intercept)  1.679719e-06
#> 94      PC16  time as continuous                 disease1 -1.747562e-04
#> 95      PC16  time as continuous                    visit -2.898785e-05
#> 96      PC16  time as continuous                      age -6.953198e-08
#> 97      PC16  time as continuous                      sex -1.048454e-05
#> 98      PC16  time as continuous           disease1:visit  1.123800e-04
#> 99      PC17  time as continuous              (Intercept)  3.337832e-04
#> 100     PC17  time as continuous                 disease1 -7.005901e-04
#> 101     PC17  time as continuous                    visit -1.607460e-04
#> 102     PC17  time as continuous                      age  2.313437e-06
#> 103     PC17  time as continuous                      sex -1.011242e-04
#> 104     PC17  time as continuous           disease1:visit  4.235897e-04
#> 105     PC18  time as continuous              (Intercept)  2.545641e-04
#> 106     PC18  time as continuous                 disease1 -1.486479e-04
#> 107     PC18  time as continuous                    visit -2.711549e-05
#> 108     PC18  time as continuous                      age  9.179007e-07
#> 109     PC18  time as continuous                      sex -1.875965e-05
#> 110     PC18  time as continuous           disease1:visit  5.226419e-05
#> 111     PC19  time as continuous              (Intercept)  3.540963e-05
#> 112     PC19  time as continuous                 disease1  6.693938e-05
#> 113     PC19  time as continuous                    visit  1.932203e-05
#> 114     PC19  time as continuous                      age  4.744317e-08
#> 115     PC19  time as continuous                      sex  1.295340e-05
#> 116     PC19  time as continuous           disease1:visit -1.021341e-04
#> 117     PC20  time as continuous              (Intercept)  1.112908e-04
#> 118     PC20  time as continuous                 disease1  2.233681e-04
#> 119     PC20  time as continuous                    visit -2.119824e-04
#> 120     PC20  time as continuous                      age -1.845109e-06
#> 121     PC20  time as continuous                      sex  6.293556e-05
#> 122     PC20  time as continuous           disease1:visit  3.345189e-05
#>        Std.Error     DF      t.value      p.value     lrt_pval       AIC
#> 1   4.231703e-05 110341 -5.990458275 2.098956e-09 1.945007e-46 -973631.1
#> 2   3.726268e-05     26  0.965151227 3.433611e-01 1.945007e-46 -973631.1
#> 3   3.573570e-05     56  1.948640495 5.635534e-02 1.945007e-46 -973631.1
#> 4   3.577758e-05     56  0.740614713 4.620212e-01 1.945007e-46 -973631.1
#> 5   8.626640e-07     26 -2.044287133 5.117560e-02 1.945007e-46 -973631.1
#> 6   2.355601e-05     26  2.364798733 2.578555e-02 1.945007e-46 -973631.1
#> 7   5.054925e-05     56 29.895702897 4.119089e-36 1.945007e-46 -973631.1
#> 8   5.059264e-05     56 14.604398648 9.500697e-21 1.945007e-46 -973631.1
#> 9   2.558825e-04 110341 -0.821182983 4.115438e-01 4.412870e-02 -973520.3
#> 10  2.115429e-04     26  1.728106582 9.583022e-02 4.412870e-02 -973520.3
#> 11  1.084433e-04     58  1.820138510 7.389901e-02 4.412870e-02 -973520.3
#> 12  5.409786e-06     26  0.050133481 9.603992e-01 4.412870e-02 -973520.3
#> 13  1.478494e-04     26 -0.114935123 9.093796e-01 4.412870e-02 -973520.3
#> 14  1.533617e-04     58 -2.047265235 4.517094e-02 4.412870e-02 -973520.3
#> 15  2.487114e-04 110341  1.606113970 1.082517e-01 1.327831e-01 -973890.0
#> 16  2.148137e-04     26 -1.713145853 9.858745e-02 1.327831e-01 -973890.0
#> 17  1.162771e-04     58 -1.862706332 6.757059e-02 1.327831e-01 -973890.0
#> 18  5.131792e-06     26 -0.003818904 9.969821e-01 1.327831e-01 -973890.0
#> 19  1.402515e-04     26 -0.350035145 7.291321e-01 1.327831e-01 -973890.0
#> 20  1.644403e-04     58  1.513162848 1.356687e-01 1.327831e-01 -973890.0
#> 21  2.724017e-04 110341  0.168202389 8.664244e-01 1.696784e-01 -974454.6
#> 22  2.245683e-04     26  1.443044925 1.609486e-01 1.696784e-01 -974454.6
#> 23  1.146738e-04     58  0.646082381 5.207743e-01 1.696784e-01 -974454.6
#> 24  5.767400e-06     26 -0.101876563 9.196363e-01 1.696784e-01 -974454.6
#> 25  1.576234e-04     26  0.314707596 7.554954e-01 1.696784e-01 -974454.6
#> 26  1.621730e-04     58 -1.384070968 1.716396e-01 1.696784e-01 -974454.6
#> 27  2.589828e-04 110341 -0.640391380 5.219195e-01 9.164478e-01 -974228.8
#> 28  2.236800e-04     26 -0.243377910 8.096227e-01 9.164478e-01 -974228.8
#> 29  1.210724e-04     58  0.763954855 4.479909e-01 9.164478e-01 -974228.8
#> 30  5.343806e-06     26 -0.052739686 9.583425e-01 9.164478e-01 -974228.8
#> 31  1.460461e-04     26 -0.154030545 8.787750e-01 9.164478e-01 -974228.8
#> 32  1.712219e-04     58  0.104927937 9.167950e-01 9.164478e-01 -974228.8
#> 33  2.639502e-04 110341 -0.263326026 7.922998e-01 7.964250e-01 -974302.8
#> 34  2.280325e-04     26  0.763189221 4.522203e-01 7.964250e-01 -974302.8
#> 35  1.234658e-04     58 -0.184235457 8.544714e-01 7.964250e-01 -974302.8
#> 36  5.445420e-06     26 -0.199165050 8.436830e-01 7.964250e-01 -974302.8
#> 37  1.488233e-04     26  0.145217351 8.856592e-01 7.964250e-01 -974302.8
#> 38  1.746067e-04     58 -0.259517260 7.961551e-01 7.964250e-01 -974302.8
#> 39  2.692844e-04 110341  0.028827845 9.770019e-01 2.222588e-01 -974706.8
#> 40  2.325786e-04     26 -0.521362124 6.065274e-01 2.222588e-01 -974706.8
#> 41  1.258890e-04     58  0.014208368 9.887125e-01 2.222588e-01 -974706.8
#> 42  5.556352e-06     26  0.011789755 9.906834e-01 2.222588e-01 -974706.8
#> 43  1.518553e-04     26  0.103600564 9.182813e-01 2.222588e-01 -974706.8
#> 44  1.780337e-04     58  1.225911509 2.251863e-01 2.222588e-01 -974706.8
#> 45  2.539249e-04 110341 -0.670284777 5.026777e-01 1.046753e-04 -975207.5
#> 46  2.190784e-04     26  3.831341977 7.246942e-04 1.046753e-04 -975207.5
#> 47  1.184395e-04     58  2.284647507 2.600986e-02 1.046753e-04 -975207.5
#> 48  5.242751e-06     26 -0.092489991 9.270177e-01 1.046753e-04 -975207.5
#> 49  1.432841e-04     26  0.147486338 8.838859e-01 1.046753e-04 -975207.5
#> 50  1.674985e-04     58 -4.052428682 1.527088e-04 1.046753e-04 -975207.5
#> 51  2.931764e-04 110341 -0.814335111 4.154548e-01 4.806252e-01 -975123.4
#> 52  2.440377e-04     26  0.916358632 3.679007e-01 4.806252e-01 -975123.4
#> 53  1.262582e-04     58  0.894029394 3.750011e-01 4.806252e-01 -975123.4
#> 54  6.176061e-06     26 -0.132638007 8.955009e-01 4.806252e-01 -975123.4
#> 55  1.687926e-04     26  0.043106769 9.659458e-01 4.806252e-01 -975123.4
#> 56  1.785558e-04     58 -0.706759656 4.825457e-01 4.806252e-01 -975123.4
#> 57  2.776253e-04 110341  1.104088000 2.695574e-01 8.406794e-01 -975369.3
#> 58  2.380016e-04     26  0.297334797 7.685736e-01 8.406794e-01 -975369.3
#> 59  1.277286e-04     58 -1.293814219 2.008582e-01 8.406794e-01 -975369.3
#> 60  5.753621e-06     26  0.062270753 9.508235e-01 8.406794e-01 -975369.3
#> 61  1.572469e-04     26  0.020177339 9.840560e-01 8.406794e-01 -975369.3
#> 62  1.806352e-04     58 -0.201484374 8.410248e-01 8.406794e-01 -975369.3
#> 63  2.714253e-04 110341 -0.005131676 9.959055e-01 8.637133e-02 -975042.9
#> 64  2.344154e-04     26  1.267044220 2.163718e-01 8.637133e-02 -975042.9
#> 65  1.268755e-04     58 -0.187130118 8.522117e-01 8.637133e-02 -975042.9
#> 66  5.600704e-06     26 -0.049883619 9.605964e-01 8.637133e-02 -975042.9
#> 67  1.530674e-04     26  0.017143522 9.864530e-01 8.637133e-02 -975042.9
#> 68  1.794288e-04     58 -1.729307746 8.907352e-02 8.637133e-02 -975042.9
#> 69  2.885282e-04 110341 -0.329172351 7.420260e-01 7.623351e-01 -975378.5
#> 70  2.491983e-04     26  0.416735978 6.802921e-01 7.623351e-01 -975378.5
#> 71  1.348829e-04     58  0.721296656 4.736247e-01 7.623351e-01 -975378.5
#> 72  5.953449e-06     26 -0.030492109 9.759075e-01 7.623351e-01 -975378.5
#> 73  1.627084e-04     26  0.008761750 9.930761e-01 7.623351e-01 -975378.5
#> 74  1.907530e-04     58 -0.302547437 7.633172e-01 7.623351e-01 -975378.5
#> 75  2.956061e-04 110341  0.447478044 6.545308e-01 7.147203e-01 -975913.1
#> 76  2.517351e-04     26 -0.182913078 8.562851e-01 7.147203e-01 -975913.1
#> 77  1.340404e-04     58  0.636677936 5.268396e-01 7.147203e-01 -975913.1
#> 78  6.149755e-06     26  0.152478403 8.799867e-01 7.147203e-01 -975913.1
#> 79  1.680736e-04     26 -0.116433529 9.082037e-01 7.147203e-01 -975913.1
#> 80  1.895615e-04     58 -0.365980902 7.157109e-01 7.147203e-01 -975913.1
#> 81  2.918280e-04 110341  0.131629633 8.952775e-01 9.549497e-01 -975638.3
#> 82  2.520524e-04     26  0.302193009 7.649092e-01 9.549497e-01 -975638.3
#> 83  1.364301e-04     58 -0.909990237 3.665939e-01 9.549497e-01 -975638.3
#> 84  6.021478e-06     26  0.083842406 9.338240e-01 9.549497e-01 -975638.3
#> 85  1.645677e-04     26 -0.070488875 9.443439e-01 9.549497e-01 -975638.3
#> 86  1.929411e-04     58  0.056509245 9.551304e-01 9.549497e-01 -975638.3
#> 87  2.892470e-04 110341 -0.454895396 6.491854e-01 1.394966e-01 -975526.5
#> 88  2.496355e-04     26  1.393686614 1.752117e-01 1.394966e-01 -975526.5
#> 89  1.350075e-04     58  0.930680920 3.558764e-01 1.394966e-01 -975526.5
#> 90  5.970886e-06     26 -0.138872962 8.906206e-01 1.394966e-01 -975526.5
#> 91  1.631850e-04     26  0.061808072 9.511884e-01 1.394966e-01 -975526.5
#> 92  1.909291e-04     58 -1.487847944 1.422080e-01 1.394966e-01 -975526.5
#> 93  2.976471e-04 110341  0.005643324 9.954973e-01 5.563899e-01 -975597.4
#> 94  2.533474e-04     26 -0.689788648 4.964383e-01 5.563899e-01 -975597.4
#> 95  1.348186e-04     58 -0.215013772 8.305108e-01 5.563899e-01 -975597.4
#> 96  6.193964e-06     26 -0.011225764 9.911290e-01 5.563899e-01 -975597.4
#> 97  1.692819e-04     26 -0.061935363 9.510880e-01 5.563899e-01 -975597.4
#> 98  1.906620e-04     58  0.589419916 5.578687e-01 5.563899e-01 -975597.4
#> 99  2.873651e-04 110341  1.161529837 2.454290e-01 2.237472e-02 -975634.2
#> 100 2.430453e-04     26 -2.882549152 7.812069e-03 2.237472e-02 -975634.2
#> 101 1.283393e-04     58 -1.252507850 2.154117e-01 2.237472e-02 -975634.2
#> 102 6.001419e-06     26  0.385481642 7.030165e-01 2.237472e-02 -975634.2
#> 103 1.640194e-04     26 -0.616537906 5.429008e-01 2.237472e-02 -975634.2
#> 104 1.814989e-04     58  2.333841247 2.309065e-02 2.237472e-02 -975634.2
#> 105 2.926137e-04 110341  0.869966379 3.843207e-01 7.853323e-01 -976002.3
#> 106 2.514431e-04     26 -0.591178885 5.595056e-01 7.853323e-01 -976002.3
#> 107 1.353104e-04     58 -0.200394824 8.418728e-01 7.853323e-01 -976002.3
#> 108 6.055918e-06     26  0.151570851 8.806954e-01 7.853323e-01 -976002.3
#> 109 1.655090e-04     26 -0.113345194 9.106276e-01 7.853323e-01 -976002.3
#> 110 1.913575e-04     58  0.273123372 7.857286e-01 7.853323e-01 -976002.3
#> 111 2.944118e-04 110341  0.120272480 9.042675e-01 6.003074e-01 -975685.2
#> 112 2.543155e-04     26  0.263213888 7.944605e-01 6.003074e-01 -975685.2
#> 113 1.376742e-04     58  0.140346077 8.888728e-01 6.003074e-01 -975685.2
#> 114 6.074343e-06     26  0.007810420 9.938279e-01 6.003074e-01 -975685.2
#> 115 1.660126e-04     26  0.078026630 9.384043e-01 6.003074e-01 -975685.2
#> 116 1.947004e-04     58 -0.524570356 6.018812e-01 6.003074e-01 -975685.2
#> 117 2.802551e-04 110341  0.397105449 6.912905e-01 8.567643e-01 -975434.6
#> 118 2.420377e-04     26  0.922864901 3.645631e-01 8.567643e-01 -975434.6
#> 119 1.309984e-04     58 -1.618206438 1.110441e-01 8.567643e-01 -975434.6
#> 120 5.782956e-06     26 -0.319059857 7.522304e-01 8.567643e-01 -975434.6
#> 121 1.580486e-04     26  0.398203825 6.937310e-01 8.567643e-01 -975434.6
#> 122 1.852594e-04     58  0.180567911 8.573362e-01 8.567643e-01 -975434.6

plot_top_nam_pc_umap(obj, facet_by = NULL,zscore = F )



saveRDS(obj, "obj_scLASER.rds")