From b77fd015666bb9735066360dc6849d3670ac2b30 Mon Sep 17 00:00:00 2001 From: Yichen Wang Date: Wed, 8 Nov 2023 12:19:43 -0500 Subject: [PATCH] v1.0.1, fixes for R-devel with Matrix 1.6-2 --- DESCRIPTION | 3 +- NEWS.md | 1 + R/RcppExports.R | 226 ++++++++++++++++----------------- R/rliger.R | 177 ++++++++++---------------- man/ligerToSeurat.Rd | 26 ++-- man/plotByDatasetAndCluster.Rd | 4 +- man/plotFactors.Rd | 4 +- man/plotFeature.Rd | 4 +- man/plotGene.Rd | 4 +- man/plotGeneLoadings.Rd | 4 +- man/plotGenes.Rd | 4 +- man/plotWordClouds.Rd | 4 +- man/runUMAP.Rd | 4 +- man/seuratToLiger.Rd | 4 +- 14 files changed, 215 insertions(+), 254 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 09c3de78..7dc831eb 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: rliger Version: 1.0.1 -Date: 2023-11-02 +Date: 2023-11-08 Type: Package Title: Linked Inference of Genomic Experimental Relationships Description: Uses an extension of nonnegative matrix factorization to identify shared and dataset-specific factors. See Welch J, Kozareva V, et al (2019) , and Liu J, Gao C, Sodicoff J, et al (2020) for more details. @@ -65,6 +65,7 @@ RoxygenNote: 7.2.3 Encoding: UTF-8 Suggests: Seurat, + SeuratObject, knitr, reticulate, rmarkdown, diff --git a/NEWS.md b/NEWS.md index 1de58af0..4a9d67ee 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,5 +4,6 @@ - Fix efficiency issue when taking the log of norm.data (e.g. `runWilcoxon`) - Add runable examples to all exported functions when possible - Fix typo in online_iNMF matrix initialization +- Adapt to Seurat5 - Other minor fixes diff --git a/R/RcppExports.R b/R/RcppExports.R index b08396de..a3d24b85 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -1,113 +1,113 @@ -# Generated by using Rcpp::compileAttributes() -> do not edit by hand -# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 - -RunModularityClusteringCpp <- function(SNN, modularityFunction, resolution, algorithm, nRandomStarts, nIterations, randomSeed, printOutput, edgefilename) { - .Call('_rliger_RunModularityClusteringCpp', PACKAGE = 'rliger', SNN, modularityFunction, resolution, algorithm, nRandomStarts, nIterations, randomSeed, printOutput, edgefilename) -} - -scaleNotCenterFast <- function(x) { - .Call('_rliger_scaleNotCenterFast', PACKAGE = 'rliger', x) -} - -rowMeansFast <- function(x) { - .Call('_rliger_rowMeansFast', PACKAGE = 'rliger', x) -} - -rowVarsFast <- function(x, means) { - .Call('_rliger_rowVarsFast', PACKAGE = 'rliger', x, means) -} - -sumSquaredDeviations <- function(x, means) { - .Call('_rliger_sumSquaredDeviations', PACKAGE = 'rliger', x, means) -} - -cpp_sumGroups_dgc <- function(x, p, i, ncol, groups, ngroups) { - .Call('_rliger_cpp_sumGroups_dgc', PACKAGE = 'rliger', x, p, i, ncol, groups, ngroups) -} - -cpp_sumGroups_dgc_T <- function(x, p, i, ncol, nrow, groups, ngroups) { - .Call('_rliger_cpp_sumGroups_dgc_T', PACKAGE = 'rliger', x, p, i, ncol, nrow, groups, ngroups) -} - -cpp_sumGroups_dense <- function(X, groups, ngroups) { - .Call('_rliger_cpp_sumGroups_dense', PACKAGE = 'rliger', X, groups, ngroups) -} - -cpp_sumGroups_dense_T <- function(X, groups, ngroups) { - .Call('_rliger_cpp_sumGroups_dense_T', PACKAGE = 'rliger', X, groups, ngroups) -} - -cpp_nnzeroGroups_dense <- function(X, groups, ngroups) { - .Call('_rliger_cpp_nnzeroGroups_dense', PACKAGE = 'rliger', X, groups, ngroups) -} - -cpp_nnzeroGroups_dense_T <- function(X, groups, ngroups) { - .Call('_rliger_cpp_nnzeroGroups_dense_T', PACKAGE = 'rliger', X, groups, ngroups) -} - -cpp_nnzeroGroups_dgc <- function(p, i, ncol, groups, ngroups) { - .Call('_rliger_cpp_nnzeroGroups_dgc', PACKAGE = 'rliger', p, i, ncol, groups, ngroups) -} - -cpp_in_place_rank_mean <- function(v_temp, idx_begin, idx_end) { - .Call('_rliger_cpp_in_place_rank_mean', PACKAGE = 'rliger', v_temp, idx_begin, idx_end) -} - -cpp_rank_matrix_dgc <- function(x, p, nrow, ncol) { - .Call('_rliger_cpp_rank_matrix_dgc', PACKAGE = 'rliger', x, p, nrow, ncol) -} - -cpp_rank_matrix_dense <- function(X) { - .Call('_rliger_cpp_rank_matrix_dense', PACKAGE = 'rliger', X) -} - -cpp_nnzeroGroups_dgc_T <- function(p, i, ncol, nrow, groups, ngroups) { - .Call('_rliger_cpp_nnzeroGroups_dgc_T', PACKAGE = 'rliger', p, i, ncol, nrow, groups, ngroups) -} - -#' Fast calculation of feature count matrix -#' -#' @param bedmat A feature count list generated by bedmap -#' @param barcodes A list of barcodes -#' -#' @return A feature count matrix with features as rows and barcodes as -#' columns -#' @export -#' @examples -#' \dontrun{ -#' gene.counts <- makeFeatureMatrix(genes.bc, barcodes) -#' promoter.counts <- makeFeatureMatrix(promoters.bc, barcodes) -#' samnple <- gene.counts + promoter.counts -#' } -makeFeatureMatrix <- function(bedmat, barcodes) { - .Call('_rliger_makeFeatureMatrix', PACKAGE = 'rliger', bedmat, barcodes) -} - -cluster_vote <- function(nn_ranked, clusts) { - .Call('_rliger_cluster_vote', PACKAGE = 'rliger', nn_ranked, clusts) -} - -scale_columns_fast <- function(mat, scale = TRUE, center = TRUE) { - .Call('_rliger_scale_columns_fast', PACKAGE = 'rliger', mat, scale, center) -} - -max_factor <- function(H, dims_use, center_cols = FALSE) { - .Call('_rliger_max_factor', PACKAGE = 'rliger', H, dims_use, center_cols) -} - -solveNNLS <- function(C, B) { - .Call('_rliger_solveNNLS', PACKAGE = 'rliger', C, B) -} - -ComputeSNN <- function(nn_ranked, prune) { - .Call('_rliger_ComputeSNN', PACKAGE = 'rliger', nn_ranked, prune) -} - -WriteEdgeFile <- function(snn, filename, display_progress) { - invisible(.Call('_rliger_WriteEdgeFile', PACKAGE = 'rliger', snn, filename, display_progress)) -} - -DirectSNNToFile <- function(nn_ranked, prune, display_progress, filename) { - .Call('_rliger_DirectSNNToFile', PACKAGE = 'rliger', nn_ranked, prune, display_progress, filename) -} - +# Generated by using Rcpp::compileAttributes() -> do not edit by hand +# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 + +RunModularityClusteringCpp <- function(SNN, modularityFunction, resolution, algorithm, nRandomStarts, nIterations, randomSeed, printOutput, edgefilename) { + .Call('_rliger_RunModularityClusteringCpp', PACKAGE = 'rliger', SNN, modularityFunction, resolution, algorithm, nRandomStarts, nIterations, randomSeed, printOutput, edgefilename) +} + +scaleNotCenterFast <- function(x) { + .Call('_rliger_scaleNotCenterFast', PACKAGE = 'rliger', x) +} + +rowMeansFast <- function(x) { + .Call('_rliger_rowMeansFast', PACKAGE = 'rliger', x) +} + +rowVarsFast <- function(x, means) { + .Call('_rliger_rowVarsFast', PACKAGE = 'rliger', x, means) +} + +sumSquaredDeviations <- function(x, means) { + .Call('_rliger_sumSquaredDeviations', PACKAGE = 'rliger', x, means) +} + +cpp_sumGroups_dgc <- function(x, p, i, ncol, groups, ngroups) { + .Call('_rliger_cpp_sumGroups_dgc', PACKAGE = 'rliger', x, p, i, ncol, groups, ngroups) +} + +cpp_sumGroups_dgc_T <- function(x, p, i, ncol, nrow, groups, ngroups) { + .Call('_rliger_cpp_sumGroups_dgc_T', PACKAGE = 'rliger', x, p, i, ncol, nrow, groups, ngroups) +} + +cpp_sumGroups_dense <- function(X, groups, ngroups) { + .Call('_rliger_cpp_sumGroups_dense', PACKAGE = 'rliger', X, groups, ngroups) +} + +cpp_sumGroups_dense_T <- function(X, groups, ngroups) { + .Call('_rliger_cpp_sumGroups_dense_T', PACKAGE = 'rliger', X, groups, ngroups) +} + +cpp_nnzeroGroups_dense <- function(X, groups, ngroups) { + .Call('_rliger_cpp_nnzeroGroups_dense', PACKAGE = 'rliger', X, groups, ngroups) +} + +cpp_nnzeroGroups_dense_T <- function(X, groups, ngroups) { + .Call('_rliger_cpp_nnzeroGroups_dense_T', PACKAGE = 'rliger', X, groups, ngroups) +} + +cpp_nnzeroGroups_dgc <- function(p, i, ncol, groups, ngroups) { + .Call('_rliger_cpp_nnzeroGroups_dgc', PACKAGE = 'rliger', p, i, ncol, groups, ngroups) +} + +cpp_in_place_rank_mean <- function(v_temp, idx_begin, idx_end) { + .Call('_rliger_cpp_in_place_rank_mean', PACKAGE = 'rliger', v_temp, idx_begin, idx_end) +} + +cpp_rank_matrix_dgc <- function(x, p, nrow, ncol) { + .Call('_rliger_cpp_rank_matrix_dgc', PACKAGE = 'rliger', x, p, nrow, ncol) +} + +cpp_rank_matrix_dense <- function(X) { + .Call('_rliger_cpp_rank_matrix_dense', PACKAGE = 'rliger', X) +} + +cpp_nnzeroGroups_dgc_T <- function(p, i, ncol, nrow, groups, ngroups) { + .Call('_rliger_cpp_nnzeroGroups_dgc_T', PACKAGE = 'rliger', p, i, ncol, nrow, groups, ngroups) +} + +#' Fast calculation of feature count matrix +#' +#' @param bedmat A feature count list generated by bedmap +#' @param barcodes A list of barcodes +#' +#' @return A feature count matrix with features as rows and barcodes as +#' columns +#' @export +#' @examples +#' \dontrun{ +#' gene.counts <- makeFeatureMatrix(genes.bc, barcodes) +#' promoter.counts <- makeFeatureMatrix(promoters.bc, barcodes) +#' samnple <- gene.counts + promoter.counts +#' } +makeFeatureMatrix <- function(bedmat, barcodes) { + .Call('_rliger_makeFeatureMatrix', PACKAGE = 'rliger', bedmat, barcodes) +} + +cluster_vote <- function(nn_ranked, clusts) { + .Call('_rliger_cluster_vote', PACKAGE = 'rliger', nn_ranked, clusts) +} + +scale_columns_fast <- function(mat, scale = TRUE, center = TRUE) { + .Call('_rliger_scale_columns_fast', PACKAGE = 'rliger', mat, scale, center) +} + +max_factor <- function(H, dims_use, center_cols = FALSE) { + .Call('_rliger_max_factor', PACKAGE = 'rliger', H, dims_use, center_cols) +} + +solveNNLS <- function(C, B) { + .Call('_rliger_solveNNLS', PACKAGE = 'rliger', C, B) +} + +ComputeSNN <- function(nn_ranked, prune) { + .Call('_rliger_ComputeSNN', PACKAGE = 'rliger', nn_ranked, prune) +} + +WriteEdgeFile <- function(snn, filename, display_progress) { + invisible(.Call('_rliger_WriteEdgeFile', PACKAGE = 'rliger', snn, filename, display_progress)) +} + +DirectSNNToFile <- function(nn_ranked, prune, display_progress, filename) { + .Call('_rliger_DirectSNNToFile', PACKAGE = 'rliger', nn_ranked, prune, display_progress, filename) +} + diff --git a/R/rliger.R b/R/rliger.R index 04096c1e..22eb0996 100755 --- a/R/rliger.R +++ b/R/rliger.R @@ -1,6 +1,8 @@ #' @import Matrix #' @importFrom grDevices dev.off pdf #' @import hdf5r +#' @importFrom methods new +#' @importFrom utils packageVersion #' @importFrom Rcpp evalCpp NULL @@ -4066,7 +4068,9 @@ runTSNE <- function(object, use.raw = FALSE, dims.use = 1:ncol(object@H.norm), u #' # Specification for minimal example run time, not converging #' ligerex <- optimizeALS(ligerex, k = 5, max.iters = 1) #' ligerex <- quantile_norm(ligerex) -#' ligerex <- runUMAP(ligerex) +#' if (packageVersion("Matrix") <= package_version("1.6.1.1")) { +#' ligerex <- runUMAP(ligerex) +#' } #' } runUMAP <- function(object, use.raw = FALSE, dims.use = 1:ncol(object@H.norm), k = 2, distance = "euclidean", n_neighbors = 10, min_dist = 0.1, rand.seed = 42) { @@ -4595,9 +4599,9 @@ getProportionMito <- function(object, use.norm = FALSE, mito.pattern = "^mt-") { #' ligerex <- normalize(ligerex) #' ligerex <- selectGenes(ligerex) #' ligerex <- scaleNotCenter(ligerex) -#' ligerex <- optimizeALS(ligerex, k = 5, max.iter = 2) +#' ligerex <- optimizeALS(ligerex, k = 5, max.iter = 1) #' ligerex <- quantile_norm(ligerex) -#' ligerex <- runUMAP(ligerex, distance = "cosine", min_dist = .3) +#' ligerex <- runTSNE(ligerex) #' ligerex <- louvainCluster(ligerex) #' plotByDatasetAndCluster(ligerex, pt.size = 1) plotByDatasetAndCluster <- function(object, clusters = NULL, title = NULL, pt.size = 0.3, @@ -4737,9 +4741,9 @@ plotByDatasetAndCluster <- function(object, clusters = NULL, title = NULL, pt.si #' ligerex <- normalize(ligerex) #' ligerex <- selectGenes(ligerex) #' ligerex <- scaleNotCenter(ligerex) -#' ligerex <- optimizeALS(ligerex, k = 5, max.iter = 2) +#' ligerex <- optimizeALS(ligerex, k = 5, max.iter = 1) #' ligerex <- quantile_norm(ligerex) -#' ligerex <- runUMAP(ligerex, distance = "cosine", min_dist = .3) +#' ligerex <- runTSNE(ligerex) #' plotFeature(ligerex, "nUMI", pt.size = 1) plotFeature <- function(object, feature, by.dataset = TRUE, discrete = NULL, title = NULL, pt.size = 0.3, text.size = 3, do.shuffle = TRUE, rand.seed = 1, do.labels = FALSE, @@ -4861,10 +4865,10 @@ plotFeature <- function(object, feature, by.dataset = TRUE, discrete = NULL, tit #' ligerex <- normalize(ligerex) #' ligerex <- selectGenes(ligerex) #' ligerex <- scaleNotCenter(ligerex) -#' ligerex <- optimizeALS(ligerex, k = 5, max.iter = 2) +#' ligerex <- optimizeALS(ligerex, k = 5, max.iter = 1) #' ligerex <- quantile_norm(ligerex) #' plotFactors(ligerex) -#' ligerex <- runUMAP(ligerex, distance = "cosine", min_dist = .3) +#' ligerex <- runTSNE(ligerex) #' plotFactors(ligerex, plot.tsne = TRUE) #' } plotFactors <- function(object, num.genes = 10, cells.highlight = NULL, plot.tsne = FALSE, verbose = TRUE) { @@ -4957,9 +4961,9 @@ plotFactors <- function(object, num.genes = 10, cells.highlight = NULL, plot.tsn #' ligerex <- normalize(ligerex) #' ligerex <- selectGenes(ligerex) #' ligerex <- scaleNotCenter(ligerex) -#' ligerex <- optimizeALS(ligerex, k = 5, max.iter = 2) +#' ligerex <- optimizeALS(ligerex, k = 5, max.iter = 1) #' ligerex <- quantile_norm(ligerex) -#' ligerex <- runUMAP(ligerex, distance = "cosine", min_dist = .3) +#' ligerex <- runTSNE(ligerex) #' plotWordClouds(ligerex, do.spec.plot = FALSE) #' } plotWordClouds <- function(object, dataset1 = NULL, dataset2 = NULL, num.genes = 30, min.size = 1, @@ -5113,9 +5117,9 @@ plotWordClouds <- function(object, dataset1 = NULL, dataset2 = NULL, num.genes = #' ligerex <- normalize(ligerex) #' ligerex <- selectGenes(ligerex) #' ligerex <- scaleNotCenter(ligerex) -#' ligerex <- optimizeALS(ligerex, k = 5, max.iter = 2) +#' ligerex <- optimizeALS(ligerex, k = 5, max.iter = 1) #' ligerex <- quantile_norm(ligerex) -#' ligerex <- runUMAP(ligerex, distance = "cosine", min_dist = .3) +#' ligerex <- runTSNE(ligerex) #' plotGeneLoadings(ligerex, "stim", "ctrl", do.spec.plot = FALSE) #' } plotGeneLoadings <- function(object, dataset1 = NULL, dataset2 = NULL, num.genes.show = 12, @@ -5473,9 +5477,9 @@ plotGeneViolin <- function(object, gene, methylation.indices = NULL, #' ligerex <- normalize(ligerex) #' ligerex <- selectGenes(ligerex) #' ligerex <- scaleNotCenter(ligerex) -#' ligerex <- optimizeALS(ligerex, k = 5, max.iter = 2) +#' ligerex <- optimizeALS(ligerex, k = 5, max.iter = 1) #' ligerex <- quantile_norm(ligerex) -#' ligerex <- runUMAP(ligerex, distance = "cosine", min_dist = .3) +#' ligerex <- runTSNE(ligerex) #' plotGene(ligerex, "CD74", pt.size = 1) plotGene <- function(object, gene, use.raw = FALSE, use.scaled = FALSE, scale.by = 'dataset', log2scale = NULL, methylation.indices = NULL, plot.by = 'dataset', @@ -5730,9 +5734,9 @@ plotGene <- function(object, gene, use.raw = FALSE, use.scaled = FALSE, scale.by #' ligerex <- normalize(ligerex) #' ligerex <- selectGenes(ligerex) #' ligerex <- scaleNotCenter(ligerex) -#' ligerex <- optimizeALS(ligerex, k = 5, max.iter = 2) +#' ligerex <- optimizeALS(ligerex, k = 5, max.iter = 1) #' ligerex <- quantile_norm(ligerex) -#' ligerex <- runUMAP(ligerex, distance = "cosine", min_dist = .3) +#' ligerex <- runTSNE(ligerex) #' plotGenes(ligerex, c("CD74", "NKG7"), pt.size = 1) #' } plotGenes <- function(object, genes, ...) { @@ -6245,116 +6249,77 @@ getFactorMarkers <- function(object, dataset1 = NULL, dataset2 = NULL, factor.sh #' @param nms By default, labels cell names with dataset of origin (this is to account for cells in #' different datasets which may have same name). Other names can be passed here as vector, must #' have same length as the number of datasets. (default names(H)) -#' @param renormalize Whether to log-normalize raw data using Seurat defaults (default TRUE). +#' @param renormalize Whether to log-normalize raw data using Seurat defaults (default FALSE). #' @param use.liger.genes Whether to carry over variable genes (default TRUE). #' @param by.dataset Include dataset of origin in cluster identity in Seurat object (default FALSE). -#' +#' @param assay Assay name to set in the Seurat object (default "RNA"). #' @return Seurat object with raw.data, scale.data, dr$tsne, dr$inmf, and ident slots set. -#' -#' @import Matrix -#' @importFrom methods new -#' @importFrom utils packageVersion -#' #' @export #' @examples -#' \donttest{ -#' library(Seurat) -#' print(packageVersion("Seurat")) #' ligerex <- createLiger(list(ctrl = ctrl, stim = stim)) -#' ligerex <- normalize(ligerex) -#' ligerex <- selectGenes(ligerex) -#' ligerex <- scaleNotCenter(ligerex) -#' ligerex <- optimizeALS(ligerex, k = 5, max.iters = 1) -#' ligerex <- quantile_norm(ligerex) -#' ligerex <- runUMAP(ligerex, distance = "cosine", min_dist = .3) -#' print(packageVersion("Seurat")) -#' srt <- ligerToSeurat(ligerex, renormalize = FALSE) +#' if (packageVersion("Matrix") <= package_version("1.6.1.1")) { +#' # 1.6.2 is not compatible thus don't test +#' # but can use `setOldClass("mMatrix")` as a hack +#' srt <- ligerToSeurat(ligerex) #' } -ligerToSeurat <- function(object, nms = names(object@raw.data), renormalize = TRUE, use.liger.genes = TRUE, - by.dataset = FALSE) { +ligerToSeurat <- function(object, nms = NULL, renormalize = FALSE, use.liger.genes = TRUE, + by.dataset = FALSE, assay = "RNA") { if (!requireNamespace("Seurat", quietly = TRUE)) { stop("Package \"Seurat\" needed for this function to work. Please install it.", - call. = FALSE - ) + call. = FALSE) } - # get Seurat version - maj_version <- packageVersion('Seurat')$major - if (class(object@raw.data[[1]])[1] != 'dgCMatrix') { - # mat <- as(x, 'CsparseMatrix') - object@raw.data <- lapply(object@raw.data, function(x) { - as(x, 'CsparseMatrix') - }) + if (!inherits(object@raw.data[[1]], 'dgCMatrix')) { + object@raw.data <- lapply(object@raw.data, as, Class = "CsparseMatrix") } raw.data <- MergeSparseDataAll(object@raw.data, nms) - scale.data <- do.call(rbind, object@scale.data) - rownames(scale.data) <- colnames(raw.data) - if (maj_version < 3) { - var.genes <- object@var.genes - inmf.obj <- new( - Class = "dim.reduction", gene.loadings = t(object@W), - cell.embeddings = object@H.norm, key = "iNMF_" - ) - rownames(inmf.obj@gene.loadings) <- var.genes - tsne.obj <- new( - Class = "dim.reduction", cell.embeddings = object@tsne.coords, - key = "tSNE_" - ) + new.seurat <- Seurat::CreateSeuratObject(raw.data, assay = assay) + if (isTRUE(renormalize)) { + new.seurat <- Seurat::NormalizeData(new.seurat) } else { - var.genes <- object@var.genes - if (any(grepl('_', var.genes))) { - message("Warning: Seurat v3 genes cannot have underscores, replacing with dashes ('-')") - var.genes <- gsub("_", replacement = "-", var.genes) + if (length(object@norm.data) > 0) { + norm.data <- MergeSparseDataAll(object@norm.data, nms) + new.seurat <- SeuratObject::SetAssayData(new.seurat, layer = "data", slot = "data", new.data = norm.data) } + } + if (length(object@var.genes) > 0 && use.liger.genes) { + Seurat::VariableFeatures(new.seurat) <- object@var.genes + } + if (length(object@scale.data) > 0) { + scale.data <- t(Reduce(rbind, object@scale.data)) + colnames(scale.data) <- colnames(raw.data) + new.seurat <- SeuratObject::SetAssayData(object = new.seurat, layer = "scale.data", slot = "scale.data", new.data = scale.data) + } + if (all(dim(object@W) > 0) && all(dim(object@H.norm) > 0)) { inmf.loadings <- t(x = object@W) + dimnames(inmf.loadings) <- list(object@var.genes, + paste0("iNMF_", seq_len(ncol(inmf.loadings)))) inmf.embeddings <- object@H.norm - tsne.embeddings <- object@tsne.coords - rownames(x = inmf.loadings) <- var.genes - rownames(x = inmf.embeddings) <- - rownames(x = tsne.embeddings) <- - rownames(x = scale.data) + dimnames(inmf.embeddings) <- list(unlist(lapply(object@scale.data, rownames), use.names = FALSE), + paste0("iNMF_", seq_len(ncol(inmf.loadings)))) inmf.obj <- Seurat::CreateDimReducObject( embeddings = inmf.embeddings, - loadings = inmf.loadings, - key = "iNMF_", - global = TRUE + loadings = inmf.embeddings, + assay = assay, + key = "iNMF_" ) + new.seurat[["iNMF"]] <- inmf.obj + } + if (all(dim(object@tsne.coords) > 0)) { + tsne.embeddings <- object@tsne.coords + dimnames(tsne.embeddings) <- list(rownames(object@H.norm), + c("TSNE_1", "TSNE_2")) tsne.obj <- Seurat::CreateDimReducObject( embeddings = tsne.embeddings, - key = "tSNE_", - global = TRUE + assay = assay, + key = "TSNE_" ) + new.seurat[["TSNE"]] <- tsne.obj } - new.seurat <- Seurat::CreateSeuratObject(raw.data) - if (renormalize) { - new.seurat <- Seurat::NormalizeData(new.seurat) - } - if (by.dataset) { - ident.use <- as.character(unlist(lapply(1:length(object@raw.data), function(i) { - dataset.name <- names(object@raw.data)[i] - paste0(dataset.name, as.character(object@clusters[colnames(object@raw.data[[i]])])) - }))) - } else { - ident.use <- as.character(object@clusters) - } - - if (maj_version < 3) { - if (use.liger.genes) { - new.seurat@var.genes <- var.genes - } - new.seurat@scale.data <- t(scale.data) - new.seurat@dr$tsne <- tsne.obj - new.seurat@dr$inmf <- inmf.obj - new.seurat <- Seurat::SetIdent(new.seurat, ident.use = ident.use) - - } else { - if (use.liger.genes) { - Seurat::VariableFeatures(new.seurat) <- var.genes - } - Seurat::SetAssayData(new.seurat, slot = "scale.data", new.data = t(scale.data), assay = "RNA") - new.seurat[['tsne']] <- tsne.obj - new.seurat[['inmf']] <- inmf.obj - Seurat::Idents(new.seurat) <- ident.use - } + new.seurat$orig.ident <- object@cell.data$dataset + + idents <- object@clusters + if (length(idents) == 0 || isTRUE(by.dataset)) idents <- object@cell.data$dataset + Seurat::Idents(new.seurat) <- idents return(new.seurat) } @@ -6398,18 +6363,14 @@ ligerToSeurat <- function(object, nms = names(object@raw.data), renormalize = TR #' @param cca.to.H Carry over CCA (and aligned) loadings and insert them into H (and H.norm) slot in #' liger object (only meaningful for combined analysis Seurat object). Useful for plotting directly #' afterwards. (default FALSE) -#' #' @return \code{liger} object. -#' -#' @import Matrix -#' #' @export #' @examples -#' if (requireNamespace("Seurat")) { +#' if (packageVersion("Matrix") <= package_version("1.6.1.1")) { #' ctrl.srt <- Seurat::CreateSeuratObject(ctrl, project = "ctrl") #' stim.srt <- Seurat::CreateSeuratObject(stim, project = "stim") #' ligerex <- seuratToLiger(list(ctrl = ctrl.srt, stim = stim.srt), -#' use.seurat.genes = FALSE) # because no var.gene now +#' use.seurat.genes = FALSE) #' } seuratToLiger <- function(objects, combined.seurat = FALSE, names = "use-projects", meta.var = NULL, assays.use = NULL, raw.assay = "RNA", remove.missing = TRUE, renormalize = TRUE, diff --git a/man/ligerToSeurat.Rd b/man/ligerToSeurat.Rd index 2dce12fe..fae2ebc9 100644 --- a/man/ligerToSeurat.Rd +++ b/man/ligerToSeurat.Rd @@ -6,10 +6,11 @@ \usage{ ligerToSeurat( object, - nms = names(object@raw.data), - renormalize = TRUE, + nms = NULL, + renormalize = FALSE, use.liger.genes = TRUE, - by.dataset = FALSE + by.dataset = FALSE, + assay = "RNA" ) } \arguments{ @@ -19,11 +20,13 @@ ligerToSeurat( different datasets which may have same name). Other names can be passed here as vector, must have same length as the number of datasets. (default names(H))} -\item{renormalize}{Whether to log-normalize raw data using Seurat defaults (default TRUE).} +\item{renormalize}{Whether to log-normalize raw data using Seurat defaults (default FALSE).} \item{use.liger.genes}{Whether to carry over variable genes (default TRUE).} \item{by.dataset}{Include dataset of origin in cluster identity in Seurat object (default FALSE).} + +\item{assay}{Assay name to set in the Seurat object (default "RNA").} } \value{ Seurat object with raw.data, scale.data, dr$tsne, dr$inmf, and ident slots set. @@ -37,17 +40,10 @@ Stores original dataset identity by default in new object metadata if dataset na in nms. iNMF factorization is stored in dim.reduction object with key "iNMF". } \examples{ -\donttest{ -library(Seurat) -print(packageVersion("Seurat")) ligerex <- createLiger(list(ctrl = ctrl, stim = stim)) -ligerex <- normalize(ligerex) -ligerex <- selectGenes(ligerex) -ligerex <- scaleNotCenter(ligerex) -ligerex <- optimizeALS(ligerex, k = 5, max.iters = 1) -ligerex <- quantile_norm(ligerex) -ligerex <- runUMAP(ligerex, distance = "cosine", min_dist = .3) -print(packageVersion("Seurat")) -srt <- ligerToSeurat(ligerex, renormalize = FALSE) +if (packageVersion("Matrix") <= package_version("1.6.1.1")) { + # 1.6.2 is not compatible thus don't test + # but can use `setOldClass("mMatrix")` as a hack + srt <- ligerToSeurat(ligerex) } } diff --git a/man/plotByDatasetAndCluster.Rd b/man/plotByDatasetAndCluster.Rd index 1e815350..07ef9347 100644 --- a/man/plotByDatasetAndCluster.Rd +++ b/man/plotByDatasetAndCluster.Rd @@ -72,9 +72,9 @@ ligerex <- createLiger(list(ctrl = ctrl, stim = stim)) ligerex <- normalize(ligerex) ligerex <- selectGenes(ligerex) ligerex <- scaleNotCenter(ligerex) -ligerex <- optimizeALS(ligerex, k = 5, max.iter = 2) +ligerex <- optimizeALS(ligerex, k = 5, max.iter = 1) ligerex <- quantile_norm(ligerex) -ligerex <- runUMAP(ligerex, distance = "cosine", min_dist = .3) +ligerex <- runTSNE(ligerex) ligerex <- louvainCluster(ligerex) plotByDatasetAndCluster(ligerex, pt.size = 1) } diff --git a/man/plotFactors.Rd b/man/plotFactors.Rd index 6bdf8f8c..d62c8a50 100644 --- a/man/plotFactors.Rd +++ b/man/plotFactors.Rd @@ -41,10 +41,10 @@ ligerex <- createLiger(list(ctrl = ctrl, stim = stim)) ligerex <- normalize(ligerex) ligerex <- selectGenes(ligerex) ligerex <- scaleNotCenter(ligerex) -ligerex <- optimizeALS(ligerex, k = 5, max.iter = 2) +ligerex <- optimizeALS(ligerex, k = 5, max.iter = 1) ligerex <- quantile_norm(ligerex) plotFactors(ligerex) -ligerex <- runUMAP(ligerex, distance = "cosine", min_dist = .3) +ligerex <- runTSNE(ligerex) plotFactors(ligerex, plot.tsne = TRUE) } } diff --git a/man/plotFeature.Rd b/man/plotFeature.Rd index 9fcf5ed8..67529de0 100644 --- a/man/plotFeature.Rd +++ b/man/plotFeature.Rd @@ -76,8 +76,8 @@ ligerex <- createLiger(list(ctrl = ctrl, stim = stim)) ligerex <- normalize(ligerex) ligerex <- selectGenes(ligerex) ligerex <- scaleNotCenter(ligerex) -ligerex <- optimizeALS(ligerex, k = 5, max.iter = 2) +ligerex <- optimizeALS(ligerex, k = 5, max.iter = 1) ligerex <- quantile_norm(ligerex) -ligerex <- runUMAP(ligerex, distance = "cosine", min_dist = .3) +ligerex <- runTSNE(ligerex) plotFeature(ligerex, "nUMI", pt.size = 1) } diff --git a/man/plotGene.Rd b/man/plotGene.Rd index 3647138d..92fc86bd 100644 --- a/man/plotGene.Rd +++ b/man/plotGene.Rd @@ -104,8 +104,8 @@ ligerex <- createLiger(list(ctrl = ctrl, stim = stim)) ligerex <- normalize(ligerex) ligerex <- selectGenes(ligerex) ligerex <- scaleNotCenter(ligerex) -ligerex <- optimizeALS(ligerex, k = 5, max.iter = 2) +ligerex <- optimizeALS(ligerex, k = 5, max.iter = 1) ligerex <- quantile_norm(ligerex) -ligerex <- runUMAP(ligerex, distance = "cosine", min_dist = .3) +ligerex <- runTSNE(ligerex) plotGene(ligerex, "CD74", pt.size = 1) } diff --git a/man/plotGeneLoadings.Rd b/man/plotGeneLoadings.Rd index b3ba706f..c456a35d 100644 --- a/man/plotGeneLoadings.Rd +++ b/man/plotGeneLoadings.Rd @@ -96,9 +96,9 @@ ligerex <- createLiger(list(ctrl = ctrl, stim = stim)) ligerex <- normalize(ligerex) ligerex <- selectGenes(ligerex) ligerex <- scaleNotCenter(ligerex) -ligerex <- optimizeALS(ligerex, k = 5, max.iter = 2) +ligerex <- optimizeALS(ligerex, k = 5, max.iter = 1) ligerex <- quantile_norm(ligerex) -ligerex <- runUMAP(ligerex, distance = "cosine", min_dist = .3) +ligerex <- runTSNE(ligerex) plotGeneLoadings(ligerex, "stim", "ctrl", do.spec.plot = FALSE) } } diff --git a/man/plotGenes.Rd b/man/plotGenes.Rd index f831ca55..e4196139 100644 --- a/man/plotGenes.Rd +++ b/man/plotGenes.Rd @@ -27,9 +27,9 @@ ligerex <- createLiger(list(ctrl = ctrl, stim = stim)) ligerex <- normalize(ligerex) ligerex <- selectGenes(ligerex) ligerex <- scaleNotCenter(ligerex) -ligerex <- optimizeALS(ligerex, k = 5, max.iter = 2) +ligerex <- optimizeALS(ligerex, k = 5, max.iter = 1) ligerex <- quantile_norm(ligerex) -ligerex <- runUMAP(ligerex, distance = "cosine", min_dist = .3) +ligerex <- runTSNE(ligerex) plotGenes(ligerex, c("CD74", "NKG7"), pt.size = 1) } } diff --git a/man/plotWordClouds.Rd b/man/plotWordClouds.Rd index af0a9112..68992dd7 100644 --- a/man/plotWordClouds.Rd +++ b/man/plotWordClouds.Rd @@ -65,9 +65,9 @@ ligerex <- createLiger(list(ctrl = ctrl, stim = stim)) ligerex <- normalize(ligerex) ligerex <- selectGenes(ligerex) ligerex <- scaleNotCenter(ligerex) -ligerex <- optimizeALS(ligerex, k = 5, max.iter = 2) +ligerex <- optimizeALS(ligerex, k = 5, max.iter = 1) ligerex <- quantile_norm(ligerex) -ligerex <- runUMAP(ligerex, distance = "cosine", min_dist = .3) +ligerex <- runTSNE(ligerex) plotWordClouds(ligerex, do.spec.plot = FALSE) } } diff --git a/man/runUMAP.Rd b/man/runUMAP.Rd index c90a424d..e2ddaf30 100644 --- a/man/runUMAP.Rd +++ b/man/runUMAP.Rd @@ -61,6 +61,8 @@ ligerex <- scaleNotCenter(ligerex) # Specification for minimal example run time, not converging ligerex <- optimizeALS(ligerex, k = 5, max.iters = 1) ligerex <- quantile_norm(ligerex) -ligerex <- runUMAP(ligerex) +if (packageVersion("Matrix") <= package_version("1.6.1.1")) { + ligerex <- runUMAP(ligerex) +} } } diff --git a/man/seuratToLiger.Rd b/man/seuratToLiger.Rd index 5e85eb9c..250e6b17 100644 --- a/man/seuratToLiger.Rd +++ b/man/seuratToLiger.Rd @@ -76,10 +76,10 @@ identities from the original Seurat objects. Seurat V2 and V3 supported (though should share the same major version). } \examples{ -if (requireNamespace("Seurat")) { +if (packageVersion("Matrix") <= package_version("1.6.1.1")) { ctrl.srt <- Seurat::CreateSeuratObject(ctrl, project = "ctrl") stim.srt <- Seurat::CreateSeuratObject(stim, project = "stim") ligerex <- seuratToLiger(list(ctrl = ctrl.srt, stim = stim.srt), - use.seurat.genes = FALSE) # because no var.gene now + use.seurat.genes = FALSE) } }