From f31ef26620fafe4a5b4c996a6da49a98f4f4746e Mon Sep 17 00:00:00 2001 From: Scott Gigante Date: Mon, 21 May 2018 23:23:09 -0400 Subject: [PATCH 1/7] update to reticulated pyphate --- R/cos_dissim.R | 6 - R/kernel.R | 77 -------- R/mds.R | 43 ----- R/phate.R | 481 +++++++++++++++++++++++++--------------------- R/preprocessing.R | 14 +- R/svdpca.R | 33 ---- R/utils.R | 46 ++++- R/vne.R | 121 ------------ 8 files changed, 312 insertions(+), 509 deletions(-) delete mode 100644 R/cos_dissim.R delete mode 100644 R/kernel.R delete mode 100644 R/mds.R delete mode 100644 R/svdpca.R delete mode 100644 R/vne.R diff --git a/R/cos_dissim.R b/R/cos_dissim.R deleted file mode 100644 index d747d2a..0000000 --- a/R/cos_dissim.R +++ /dev/null @@ -1,6 +0,0 @@ -cos.dissim <- function(i, j, x=NA) { - if (is.na(x)) stop('Must pass a matrix'); - a <- x[, i]; b <- x[, j]; - if (length(a) != length(b)) stop('Length of both vectors must be the same'); - return(1 - (a %*% b) / (sqrt(sum(a^2)) * sqrt(sum(b^2)))) -} diff --git a/R/kernel.R b/R/kernel.R deleted file mode 100644 index 52bfb27..0000000 --- a/R/kernel.R +++ /dev/null @@ -1,77 +0,0 @@ -#' Calculate a Gaussian or kNN kernel -#' -#' @param data The data (n.samples x n.samples) -#' @param k number of neighbors -#' @param alpha decay constant -#' @param npca number of dimensions of PCA reduction to do before KNN -#' @param pca.method The desired method for implementing pca for preprocessing the -#' data. Options include 'svd', 'random', and 'none' (no pca). -#' Default is 'random'. -#' -#' @return g.kernel Kernel matrix (n.samples x n.samples) -calculate.kernel <- function(data, k=15, alpha=10, - npca=100, pca.method='random', - knn.dist.method = 'euclidean') { - # kernel includes self as connection but not in k - # actually search for k+1 neighbors including self - k <- k + 1 - if (ncol(data) > npca) { - data <- svdpca(data, npca, pca.method) - } - if (!is.na(alpha)) { - pdx <- as.matrix(dist(data, knn.dist.method, diag = TRUE, upper = TRUE)) - knn.eps <- apply(pdx, 1, sort, partial=k)[k,] - g.kernel <- exp(-(pdx / knn.eps) ^ alpha) - rm(pdx, knn.eps) - } else { - knn.index <- cbind(1:nrow(data), # add ones on diagonal - FNN::knn.index(data, k=k-1, algorithm="kd_tree")) - g.kernel <- Matrix::sparseMatrix(i=rep(1:nrow(data), k), j=as.vector(knn.index), x=1) - } - g.kernel <- g.kernel + Matrix::t(g.kernel) - g.kernel -} - -#' Calculate the landmark operator -#' -#' @param g.kernel Kernel matrix (n.samples x n.samples) -#' @param n.landmark Number of landmarks to compute, or NA. Default is 2000. If NA, then exact PHATE is computed. -#' @param seed Integer or NA, integer value for random number generator. -#' @param n.svd Number of singular vectors to calculate for landmark selection. Default is 100. -#' -#' @return List containing: -#' -#' * **diff.op** The diffusion operator (n.landmark x n.landmark) -#' * **landmark.transitions** Transition matrix between cells and landmark (n.cells x n.landmark) -calculate.landmark.operator <- function(g.kernel, n.landmark=2000, n.svd=100) { - diff.op <- g.kernel / Matrix::rowSums(g.kernel) - if (!is.na(n.landmark) && n.landmark < nrow(g.kernel)) { - # Compute landmark operator - svd <- irlba::irlba(diff.op, nu=n.svd, nv=0, work=500) - weighted.svd <- svd$u %*% diag(svd$d) - init_fraction <- min(1, 3*n.landmark/nrow(g.kernel)) - clusters <- kmeans(weighted.svd, n.landmark)$cluster - landmarks <- unique(clusters) - p.nm <- sapply(landmarks, function(i) Matrix::Matrix(tryCatch(Matrix::rowSums(g.kernel[,clusters==i]), - error=function(e) { - # throws error if only one sample per cluster - g.kernel[,clusters==i] - }))) - # convert sparse vectors to sparse matrix - p.nm <- Matrix::sparseMatrix(i=unlist(sapply(p.nm, function(i) i@i))+1, # i is input 1-based but converted to 0-based - p=c(0,cumsum(sapply(p.nm, function(i) i@p[2]))), - x=unlist(sapply(p.nm, function(i) i@x)), - dims=c(nrow(g.kernel), length(landmarks))) - p.mn <- Matrix::t(p.nm) - # row normalize - p.nm <- p.nm / Matrix::rowSums(p.nm) - p.mn <- p.mn / Matrix::rowSums(p.mn) - diff.op <- Matrix::as.matrix(p.mn %*% p.nm) - } else { - # Compute diffusion operator - diff.op <- Matrix::as.matrix(diff.op) - p.nm <- NULL - } - return(list(diff.op=diff.op, - landmark.transitions=p.nm)) -} diff --git a/R/mds.R b/R/mds.R deleted file mode 100644 index 5af9247..0000000 --- a/R/mds.R +++ /dev/null @@ -1,43 +0,0 @@ -#' Performs specified method of PCA -#' -#' Implements different methods of PCA -#' -#' @param X Data matrix. -#' @param k Number of PCA dimensions returned. -#' @param method The desired method for implementing pca for preprocessing the -#' data. Options include 'svd', 'random', and 'none' (no pca). -#' @param dist.method The desired distance function for MDS. Choices are 'euclidean' -#' and 'cosine'. Default is 'euclidean'. -#' -#' @return A matrix containing the embedded data is returned. -#' -mds <- function(data, ndim=2, method='metric', - dist.method='euclidean') { - if (!(method %in% c("classic", "metric", "nonmetric"))) { - message(paste0("method ", method, " not recognized. Choose from c('classic', 'metric', 'nonmetric'). Using 'metric'...")) - method <- 'metric' - } - if (!(dist.method %in% c('euclidean', 'cosine', 'maximum', 'manhattan', - 'canberra', 'binary', 'minkowski'))) { - message(paste0("dist.method ", dist.method, " not recognized. Choose from ", - "c('euclidean', 'cosine', 'maximum', 'manhattan', ", - "'canberra', 'binary', 'minkowski'). Using 'euclidean'...")) - method <- 'euclidean' - } - if (dist.method == "cosine") { - n <- dim(data)[1] - X.pairs <- expand.grid(i=1:n, j=1:n) - X.dist <- matrix(apply(X.pairs, 1, cos.dissim, x = data), n, n) - rm(X.pairs) - } else { - X.dist <- as.matrix(dist(data, dist.method, diag = TRUE, upper = TRUE)) - } - embedding <- cmdscale(X.dist, k = ndim) - if (method != "classic") { - embedding <- smacof::mds(X.dist, ndim = ndim, init = embedding, type="ratio", itmax = 3000)$conf - } - if (method == "nonmetric") { - smacof::mds(X.dist, ndim = ndim, init = embedding, type = "ordinal", itmax = 3000)$conf - } - embedding -} diff --git a/R/phate.R b/R/phate.R index db099f8..814e1b5 100644 --- a/R/phate.R +++ b/R/phate.R @@ -1,11 +1,13 @@ #' Run PHATE on an input data matrix #' -#' PHATE is a data reduction method specifically designed for visualizing **high** -#' dimensional data in **low** dimensional spaces. +#' PHATE is a data reduction method specifically designed for visualizing +#' **high** dimensional data in **low** dimensional spaces. #' #' @param data matrix (n_samples, n_dimensions) #' 2 dimensional input data array with -#' n_samples samples and n_dimensions dimensions +#' n_samples samples and n_dimensions dimensions. +#' If `knn.dist.method` is 'precomputed', `data` is treated as a +#' (n_samples, n_samples) distance or affinity matrix #' @param ndim int, optional, default: 2 #' number of dimensions in which the data will be embedded #' @param k int, optional, default: 15 @@ -19,324 +21,359 @@ #' (n_samples < n_landmark) and not used otherwise #' @param n.landmark int, optional, default: 2000 #' number of landmarks to use in fast PHATE -#' @param t int, optional, default: 'auto' -#' power to which the diffusion operator is powered -#' sets the level of diffusion #' @param potential.method string, optional, default: 'log' #' choose from 'log' and 'sqrt' #' which transformation of the diffusional operator is used #' to compute the diffusion potential +#' @param t int, optional, default: 'auto' +#' power to which the diffusion operator is powered +#' sets the level of diffusion +#' @param knn.dist.method string, optional, default: 'euclidean'. +#' The desired distance function for calculating pairwise distances on the data. +#' If 'precomputed', `data` is treated as a +#' (n_samples, n_samples) distance or affinity matrix #' @param init phate object, optional -#' object to use for initialization. Avoids recomputing +#' object to use for initialization. Avoids recomputing #' intermediate steps if parameters are the same. -#' @param verbose boolean, optional, default : TRUE -#' If TRUE, print verbose updates. +#' @param mds.method string, optional, default: 'metric' +#' choose from 'classic', 'metric', and 'nonmetric' +#' which MDS algorithm is used for dimensionality reduction +#' @param mds.dist.method string, optional, default: 'euclidean' +#' recommended values: 'euclidean' and 'cosine' #' @param t.max int, optional, default: 100. #' Maximum value of t to test for automatic t selection. -#' @param plot.optimal.t boolean, optional, default: FALSE -#' If TRUE, produce a plot showing the Von Neumann Entropy -#' curve for automatic t selection. -#' @param pca.method string, optional, default: 'random' -#' The desired method for implementing pca for preprocessing the -#' data. Options include 'svd', 'random', and 'none' (no pca). #' @param npca int, optional, default: 100 #' Number of principal components to use for calculating #' neighborhoods. For extremely large datasets, using #' n_pca < 20 allows neighborhoods to be calculated in #' log(n_samples) time. -#' @param n.svd int, optional, default: 100 -#' The number of SVD components to use for landmark selection -#' @param mds.method string, optional, default: 'metric' -#' choose from 'classic', 'metric', and 'nonmetric' -#' which MDS algorithm is used for dimensionality reduction -#' @param knn.dist.method string, optional, default: 'euclidean'. -#' The desired distance function for calculating pairwise distances on the data. -#' @param mds.dist.method string, optional, default: 'euclidean' -#' recommended values: 'euclidean' and 'cosine' -#' @param g.kernel Precomputed kernel matrix -#' @param diff.op Precomputed diffusion operator -#' @param landmark.transitions Precomputed landmark transitions -#' @param diff.op.t Precomputed powered diffusion operator +#' @param plot.optimal.t boolean, optional, default: FALSE +#' If TRUE, produce a plot showing the Von Neumann Entropy +#' curve for automatic t selection. +#' @param verbose boolean, optional, default : TRUE +#' If TRUE, print verbose updates. +#' @param n.jobs `int`, optional (default: 1) +#' The number of jobs to use for the computation. +#' If -1 all CPUs are used. If 1 is given, no parallel computing code is +#' used at all, which is useful for debugging. +#' For n_jobs below -1, (n.cpus + 1 + n.jobs) are used. Thus for +#' n_jobs = -2, all CPUs but one are used +#' @param seed int or `NA`, random state (default: `NA`) +#' @param n.svd Deprecated. +#' @param pca.method Deprecated. +#' @param g.kernel Deprecated. +#' @param diff.op Deprecated. +#' @param diff.op.t Deprecated. +#' @param landmark.transitions Deprecated. +#' @param dist.method Deprecated. #' #' @return "phate" object containing: #' * **embedding**: the PHATE embedding -#' * **diff.op**: The diffusion operator which can be used as optional input with another run. -#' * **diff.op.t**: diff.op^t -#' * **g.kernel**: The kernel used to construct the diffusion operator +#' * **operator**: The PHATE operator (python phate.PHATE object) #' * **params**: Parameters passed to phate #' +#' @examples +#' if (reticulate::py_module_available("phate")) { +#' +#' # Load data +#' data(tree.data) +#' +#' # Run PHATE +#' phate.tree <- phate(tree.data$data) +#' ## PHATE embedding +#' ## k = 5, alpha = NA, t = 58 +#' ## Data: (3000, 100) +#' ## Embedding: (3000, 2) +#' +#' library(graphics) +#' # Plot the result with base graphics +#' plot(phate.tree, col=tree.data$branches) +#' # Plot the result with ggplot2 +#' if (require(ggplot2)) { +#' ggplot(phate.tree) + +#' geom_point(aes(x=PHATE1, y=PHATE2, color=tree.data$branches)) +#' } +#' +#' # Run PHATE again with different parameters +#' # We use the last run as initialization +#' phate.tree2 <- phate(tree.data$data, t=150, init=phate.tree) +#' # Extract the embedding matrix to use in downstream analysis +#' embedding <- as.matrix(phate.tree2) +#' } #' @export - -phate <- function(data, ndim = 2, t = 'auto', k = 15, alpha = 10, use.alpha=NA, - n.landmark=2000, potential.method = 'log', t.max=100, - pca.method = 'random', npca = 100, n.svd = 100, mds.method = 'metric', - knn.dist.method = 'euclidean', mds.dist.method = 'euclidean', - init=NULL, verbose=TRUE, plot.optimal.t=FALSE, +phate <- function(data, ndim = 2, k = 15, + alpha = 10, use.alpha=NA, + n.landmark=2000, potential.method = "log", + t = "auto", knn.dist.method = "euclidean", + init=NULL, + mds.method = "metric", mds.dist.method = "euclidean", + t.max=100, npca = 100, plot.optimal.t=FALSE, + verbose=TRUE, n.jobs=1, seed=NA, + # deprecated args, remove in v3 + n.svd = NA, + pca.method = NA, g.kernel=NULL, diff.op = NULL, landmark.transitions=NULL, diff.op.t = NULL, dist.method=NA) { - start_time <- Sys.time() - tmp_start_time <- Sys.time() + # check installation + if (!reticulate::py_module_available(module = "phate")) { + install.phate() + } + tryCatch(pyphate, error = function(e) load_pyphate()) # check for deprecated arguments if (!is.na(dist.method)) { message("Argument dist.method is deprecated. Use knn.dist.method instead.") knn.dist.method <- dist.method } + if (!is.na(n.svd)) { + message("Setting n.svd is currently not supported. Using n.svd=100") + } + if (!is.na(pca.method)) { + message("Setting pca.method is deprecated. Using pca.method='random'") + } + if (!is.null(g.kernel)) { + message(paste0("Setting g.kernel is deprecated. Using instead ", + "`knn.dist.method='precomputed'` and `data=g.kernel`")) + data <- g.kernel + knn.dist.method <- "precomputed" + } + if (!is.null(diff.op)) { + stop(paste0("Setting diff.op is deprecated. Use `init` with a `phate` ", + "object instead")) + } + if (!is.null(diff.op.t)) { + stop(paste0("Setting diff.op.t is deprecated. Use `init` with a `phate` ", + "object instead")) + } + if (!is.null(landmark.transitions)) { + stop(paste0("Setting landmark.transitions is deprecated. Use `init` with a", + " `phate` object instead")) + } if (mds.method == "mmds") { - message("Argument mds.method = 'mmds' is deprecated. Use mds.method = 'metric' instead.") - mds.method <- 'metric' + message(paste0("Argument mds.method = 'mmds' is deprecated. ", + "Use mds.method = 'metric' instead.")) + mds.method <- "metric" } else if (mds.method == "cmds") { - message("Argument mds.method = 'cmds' is deprecated. Use mds.method = 'classic' instead.") - mds.method <- 'classic' + message(paste0("Argument mds.method = 'cmds' is deprecated. ", + "Use mds.method = 'classic' instead.")) + mds.method <- "classic" } else if (mds.method == "nmmds") { - message("Argument mds.method = 'nmmds' is deprecated. Use mds.method = 'nonmetric' instead.") - mds.method <- 'nonmetric' + message(paste0("Argument mds.method = 'nmmds' is deprecated. ", + "Use mds.method = 'nonmetric' instead.")) + mds.method <- "nonmetric" } else if (!(mds.method %in% c("classic", "metric", "nonmetric"))) { - message(paste0("mds.method ", mds.method, " not recognized. Choose from c('classic', 'metric, 'nonmetric'). Using 'metric'...")) - mds.method <- 'metric' + message(paste0("mds.method ", mds.method, " not recognized. ", + "Choose from c('classic', 'metric, 'nonmetric'). ", + "Using 'metric'...")) + mds.method <- "metric" } - # decide whether or not to use the alpha decay kernel if (is.na(use.alpha)) { if (is.na(alpha) || (!is.na(n.landmark) && n.landmark < nrow(data))) { - use.alpha=FALSE - alpha=NA + use.alpha <- FALSE + alpha <- NA } else { - use.alpha=TRUE + use.alpha <- TRUE } } - # check validity of use.alpha and alpha combination if (use.alpha && is.na(alpha)) { message("use.alpha is set to TRUE but alpha is NA. Setting use.alpha=FALSE") - use.alpha=FALSE + use.alpha <- FALSE } else if (!use.alpha && !is.na(alpha)) { message("use.alpha is set to FALSE but alpha is not NA. Setting alpha=NA") - alpha=NA + alpha <- NA + } + ndim <- as.integer(ndim) + k <- as.integer(k) + n.landmark <- as.integer(n.landmark) + npca <- as.integer(npca) + t.max <- as.integer(t.max) + n.jobs <- as.integer(n.jobs) + if (is.numeric(alpha)) { + alpha <- as.double(alpha) + } + if (is.numeric(t)) { + t <- as.integer(t) + } + if (is.numeric(seed)) { + seed <- as.integer(seed) } - # store parameters - params <- list("data"=data, "k"=k, "alpha"=alpha, "t"=t, "n.landmark"=n.landmark, - "potential.method"=potential.method, "pca.method"=pca.method, - "npca"=npca, "n.svd"=n.svd, "mds.method"=mds.method, - "knn.dist.method"=knn.dist.method, - "mds.dist.method"=mds.dist.method) - + params <- list("data" = data, "k" = k, "alpha" = alpha, "t" = t, + "n.landmark" = n.landmark, "ndim" = ndim, + "potential.method" = potential.method, + "npca" = npca, "mds.method" = mds.method, + "knn.dist.method" = knn.dist.method, + "mds.dist.method" = mds.dist.method) # use pre-initialized values if given + operator <- NULL if (!is.null(init)) { if (!methods::is(init, "phate")) { warning("object passed to init is not a phate object") } - if (all(data==init$data) && pca.method==init$params$pca.method && - npca==init$params$npca && k==init$params$k && + if (all(data == init$data) && + npca == init$params$npca && k == init$params$k && na_equal(alpha, init$params$alpha) && - knn.dist.method==init$params$knn.dist.method) { - g.kernel=init$g.kernel - if (na_equal(n.landmark, init$params$n.landmark) && n.svd==init$params$n.svd) { - diff.op <- init$diff.op - landmark.transitions <- init$landmark.transitions - if (((is.numeric(t) && t == init$t) || (is.character(t) && t == init$params$t)) && - potential.method==init$params$potential.method) { - diff.op.t <- init$diff.op.t - t <- init$t + knn.dist.method == init$params$knn.dist.method) { + # currently doesn't store the kernel + if (na_equal(n.landmark, init$params$n.landmark)) { + # TODO: should we allow n_svd to be set? + operator <- init$operator + if (t == init$params$t && + potential.method == init$params$potential.method) { + # great! precomputed diffusion operator + if (mds.method == init$params$mds.method && + mds.dist.method == init$params$mds.dist.method && + ndim == init$params$ndim) { + # great! precomputed embedding + } else { + operator$reset_mds(mds = mds.method, + mds_dist = mds.dist.method) + } + } else { + operator$reset_potential(t = t, + potential_method = potential.method) } + } else { + # have to recompute the kernel + operator <- NULL } } } - - - if (is.null(g.kernel) && is.null(diff.op) && is.null(diff.op.t)) { - if (verbose) message("Calculating kernel...") - g.kernel <- calculate.kernel(data, k=k, alpha=alpha, - npca=npca, pca.method=pca.method, - knn.dist.method=knn.dist.method) - if (verbose) { - end_time <- Sys.time() - message(paste0("Calculated kernel in ", - format(round(end_time-tmp_start_time, 1), format="%S"), - ".")) - tmp_start_time <- end_time - } - } else { - if (verbose) message("Using precomputed kernel...") - } - - if (is.null(diff.op) & is.null(diff.op.t)) { - if (verbose) message("Calculating diffusion operator...") - result <- calculate.landmark.operator(g.kernel, n.landmark, n.svd) - diff.op <- result$diff.op - landmark.transitions <- result$landmark.transitions - rm(result) - if (verbose) { - end_time <- Sys.time() - message(paste0("Calculated diffusion operator in ", - format(round(end_time-tmp_start_time, 1), format="%S"), - ".")) - tmp_start_time <- end_time - } - } else { - if (verbose) message("Using precomputed diffusion operator...") - } - - if (is.null(diff.op.t)) { - if (verbose) message("Calculating diffusion potential...") - if (t == 'auto') { - t <- optimal.t(diff.op, t.max=t.max, plot=plot.optimal.t, - double.step=!is.null(landmark.transitions)) - if (verbose) message(paste0("Automatically selected t = ", t)) - } - diff.op.t <- expm::`%^%`(diff.op, if (is.null(landmark.transitions)) t else t %/% 2) - if (potential.method == 'log') { - eps <- 1e-3 - #diff.op.t[diff.op.t <= eps] <- eps - diff.op.t <- diff.op.t + 1e-3 - diff.op.t <- -log(diff.op.t) - } else if (potential.method == 'sqrt') { - diff.op.t <- sqrt(diff.op.t) - } else { - message(paste0('Potential method ', potential.method, - ' not recognised. Choose from "log" and "sqrt". Using "log"...')) - diff.op.t <- -log(diff.op.t) - } - if (verbose) { - end_time <- Sys.time() - message(paste0("Calculated diffusion potential in ", - format(round(end_time-tmp_start_time, 1), format="%S"), - ".")) - tmp_start_time <- end_time - } - } else { - if (verbose) message("Using precomputed diffusion potential...") - } - - if (verbose) message(paste0('Embedding ', mds.method, " MDS...")) - embedding <- mds(diff.op.t, ndim=ndim, method=mds.method, - dist.method=mds.dist.method) - if (!is.null(landmark.transitions)) { - embedding <- Matrix::as.matrix(landmark.transitions %*% embedding) + if (is.null(operator)) { + operator <- pyphate$PHATE(n_components = ndim, + k = k, + a = alpha, + t = k, + alpha_decay = use.alpha, + n_landmark = n.landmark, + potential_method = potential.method, + n_pca = npca, + mds = mds.method, + mds_dist = mds.dist.method, + knn_dist = knn.dist.method, + n_jobs = n.jobs, + random_state = seed, + verbose = verbose) } - colnames(embedding) <- paste0("PHATE", 1:ncol(embedding)) + embedding <- operator$fit_transform(data, + t_max = t.max) + colnames(embedding) <- c("PHATE1", "PHATE2") rownames(embedding) <- rownames(data) - if (verbose) { - end_time <- Sys.time() - message(paste0("Calculated MDS in ", - format(round(end_time-tmp_start_time, 1), format="%S"), - ".")) + if (plot.optimal.t) { + out <- operator$von_neumann_entropy(t_max = t.max) + t <- out[[1]] + h <- out[[2]] + t.opt <- pyphate$vne$optimal_t(h, t) + graphics::plot(t, h, + type = "l", + xlab = "t", ylab = "Von Neumann Entropy", + main = paste0("Optimal t = ", t.opt)) + graphics::points(t.opt, h[which(t == t.opt)], pch = "*", cex = 3) } - result <- list("embedding" = embedding, "diff.op" = diff.op, "t"=t, - "diff.op.t" = diff.op.t, "g.kernel" = g.kernel, - "landmark.transitions" = landmark.transitions, - "params"=params) + result <- list("embedding" = embedding, "operator" = operator, + "params" = params) class(result) <- c("phate", "list") - if (verbose) { - message(paste0("Embedded PHATE in ", - format(round(Sys.time()-start_time, 1), format="%S"), - ".")) - } return(result) } #' Plot a PHATE object in base R -#' -#' @param phate A fitted PHATE object +#' +#' @param x A fitted PHATE object #' @param ... Arguments for plot() -#' @examples +#' @examples +#' if (reticulate::py_module_available("phate")) { +#' +#' library(graphics) #' data(tree.data) #' phate.tree <- phate(tree.data$data) -#' plot(phate.tree, col=tree.data$branches)) +#' plot(phate.tree, col=tree.data$branches) +#' +#' } #' @export -plot.phate <- function(phate, ...) { - plot(phate$embedding[,1], phate$embedding[,2], type='p', - xlab="PHATE1", ylab="PHATE2", ...) +plot.phate <- function(x, ...) { + graphics::plot(x$embedding[, 1], x$embedding[, 2], type = "p", + xlab = "PHATE1", ylab = "PHATE2", ...) } #' Print a PHATE object -#' +#' #' This avoids spamming the user's console with a list of many large matrices -#' -#' @param phate A fitted PHATE object +#' +#' @param x A fitted PHATE object #' @param ... Arguments for print() -#' @examples +#' @examples +#' if (reticulate::py_module_available("phate")) { +#' #' data(tree.data) #' phate.tree <- phate(tree.data$data) #' print(phate.tree) #' ## PHATE embedding with elements -#' ## $embedding : (3000, 2) -#' ## $g.kernel : (3000, 3000) -#' ## $diff.op : (2000, 2000) -#' ## $diff.op.t : (2000, 2000) -#' ## $params : list with elements (data, k, alpha, t, n.landmark, -#' ## potential.method, pca.method, -#' ## npca, n.svd, mds.method, -#' ## knn.dist.method, mds.dist.method) +#' ## $embedding : (3000, 2) +#' ## $operator : Python PHATE operator +#' ## $params : list with elements (data, k, alpha, t, n.landmark, ndim, +#' ## potential.method, npca, mds.method, +#' ## knn.dist.method, mds.dist.method) +#' +#' } #' @export -print.phate <- function(phate, ...) { +print.phate <- function(x, ...) { result <- paste0("PHATE embedding with elements\n", - " $embedding : (", nrow(phate$embedding), ", ", ncol(phate$embedding), ")\n", - " $g.kernel : (", nrow(phate$g.kernel), ", ", ncol(phate$g.kernel), ")\n", - " $diff.op : (", nrow(phate$diff.op), ", ", ncol(phate$diff.op), ")\n", - " $diff.op.t : (", nrow(phate$diff.op.t), ", ", ncol(phate$diff.op.t), ")\n", - " $params : list with elements (", paste(names(phate$params), collapse=", "), ")") + " $embedding : (", nrow(x$embedding), ", ", + ncol(x$embedding), ")\n", + " $operator : Python PHATE operator\n", + " $params : list with elements (", + paste(names(x$params), collapse = ", "), ")") cat(result) } #' Summarize a PHATE object -#' -#' @param phate A fitted PHATE object +#' +#' @param object A fitted PHATE object #' @param ... Arguments for summary() -#' @examples +#' @examples +#' if (reticulate::py_module_available("phate")) { +#' #' data(tree.data) #' phate.tree <- phate(tree.data$data) -#' print(phate.tree) +#' summary(phate.tree) #' ## PHATE embedding #' ## k = 5, alpha = NA, t = 58 #' ## Data: (3000, 100) #' ## Embedding: (3000, 2) +#' +#' } #' @export -summary.phate <- function(phate, ...) { +summary.phate <- function(object, ...) { result <- paste0("PHATE embedding\n", - "k = ", phate$params$k, ", alpha = ", phate$params$alpha, ", t = ", phate$t, "\n", - "Data: (", nrow(phate$params$data), ", ", ncol(phate$params$data), ")\n", - "Embedding: (", nrow(phate$embedding), ", ", ncol(phate$embedding), ")") + "k = ", object$params$k, + ", alpha = ", object$params$alpha, + ", t = ", object$params$t, "\n", + "Data: (", nrow(object$params$data), + ", ", ncol(object$params$data), ")\n", + "Embedding: (", nrow(object$embedding), + ", ", ncol(object$embedding), ")") cat(result) } - #' Convert a PHATE object to a matrix -#' -#' Returns the embedding matrix. All components can be accessed +#' +#' Returns the embedding matrix. All components can be accessed #' using phate$embedding, phate$diff.op, etc -#' -#' @param phate A fitted PHATE object +#' +#' @param x A fitted PHATE object #' @param ... Arguments for as.matrix() #' @export -as.matrix.phate <- function(phate, ...) { - phate$embedding +as.matrix.phate <- function(x, ...) { + x$embedding } - #' Convert a PHATE object to a data.frame -#' +#' #' Returns the embedding matrix with column names PHATE1 and PHATE2 -#' -#' @param phate A fitted PHATE object +#' +#' @param x A fitted PHATE object #' @param ... Arguments for as.data.frame() #' @export -as.data.frame.phate <- function(phate, ...) { - as.data.frame(as.matrix(phate)) -} - -#' Convert a PHATE object to a data.frame for ggplot -#' -#' Passes the embedding matrix to ggplot with column names PHATE1 and PHATE2 -#' -#' @param phate A fitted PHATE object -#' @param ... Arguments for ggplot() -#' @examples -#' data(tree.data) -#' phate.tree <- phate(tree.data$data) -#' ggplot2::ggplot(phate.tree, aes(x=PHATE1, y=PHATE2, color=tree.data$branches)) + -#' geom_point() -#' @export -ggplot.phate <- function(phate, ...) { - ggplot2::ggplot(as.data.frame(phate), ...) -} - +as.data.frame.phate <- function(x, ...) { + as.data.frame(as.matrix(x), ...) +} \ No newline at end of file diff --git a/R/preprocessing.R b/R/preprocessing.R index a86f17d..68142e7 100644 --- a/R/preprocessing.R +++ b/R/preprocessing.R @@ -1,6 +1,7 @@ -#' Performs L1 normalization on input data such that the sum of expression values for each cell sums to 1 -#' then returns normalized matrix to the metric space using median UMI count per -#' cell effectively scaling all cells as if they were sampled evenly. +#' Performs L1 normalization on input data such that the sum of expression +#' values for each cell sums to 1, then returns normalized matrix to the metric +#' space using median UMI count per cell effectively scaling all cells as if +#' they were sampled evenly. #' @param data matrix (n_samples, n_dimensions) #' 2 dimensional input data array with n cells and p dimensions @@ -11,9 +12,10 @@ #' #' @export library.size.normalize <- function(data, verbose=FALSE) { - if (verbose) message(paste0("Normalizing library sizes for ", nrow(data), " cells")) + if (verbose) message(paste0("Normalizing library sizes for ", + nrow(data), " cells")) library_size <- Matrix::rowSums(data) - median_transcript_count <- median(library_size) + median_transcript_count <- stats::median(library_size) data_norm <- median_transcript_count * data / library_size data_norm -} \ No newline at end of file +} diff --git a/R/svdpca.R b/R/svdpca.R deleted file mode 100644 index 46acb24..0000000 --- a/R/svdpca.R +++ /dev/null @@ -1,33 +0,0 @@ -#' Performs specified method of PCA -#' -#' Implements different methods of PCA -#' -#' @param X Data matrix. -#' @param k Number of PCA dimensions returned. -#' @param method The desired method for implementing pca for preprocessing the -#' data. Options include 'svd', 'random', and 'none' (no pca). -#' -#' @return A matrix containing the rotated data is returned. -#' -svdpca <- function(X, k, method, verbose=FALSE) { - if (ncol(X) <= k) { - method <- 'none' - } else if (!(method %in% c("svd", "random", "none"))) { - message(paste0('PCA method ', method, - ' not recognized. Choose from "random", "svd" and "none". Using "random"...')) - method <- "random" - } - if (method == 'svd') { - if (verbose) message('PCA using svd') - out_matrix <- prcomp(X)$x[,1:k] - } else if (method == 'random') { - if (verbose) message('PCA using random SVD') - out_matrix <- irlba::prcomp_irlba(X, k)$x - } else if (method == 'none') { - if (verbose) message('No PCA performed') - out_matrix <- X - } else { - stop("PCA method not recognized") - } - return(out_matrix) -} diff --git a/R/utils.R b/R/utils.R index b0b3319..76eacc9 100644 --- a/R/utils.R +++ b/R/utils.R @@ -7,4 +7,48 @@ na_equal <- function(x, y) { } else { return(x == y) } -} \ No newline at end of file +} + +load_pyphate <- function() { + pyphate <<- reticulate::import("phate", delay_load = TRUE) +} + +#' Install PHATE Python Package +#' +#' Install PHATE Python package into a virtualenv or conda env. +#' +#' On Linux and OS X the "virtualenv" method will be used by default +#' ("conda" will be used if virtualenv isn't available). On Windows, +#' the "conda" method is always used. +#' As of reticulate v1.7, this functionality is only available in the +#' development version of reticulate, which can be installed using +#' `devtools::install_github('rstudio/reticulate')` +#' +#' @param envname Name of environment to install packages into +#' @param method Installation method. By default, "auto" automatically finds +#' a method that will work in the local environment. Change the default to +#' force a specific installation method. Note that the "virtualenv" method +#' is not available on Windows. +#' @param conda Path to conda executable (or "auto" to find conda using the PATH +#' and other conventional install locations). +#' @param ... Additional arguments passed to conda_install() or +#' virtualenv_install(). +#' +#' @export +install.phate <- function(envname = "r-reticulate", method = "auto", + conda = "auto", ...) { + tryCatch({ + reticulate::py_install("phate", envname = envname, method = method, + conda = conda, ...) + }, + error = function(e) { + stop(paste0("Cannot install PHATE, please install through pip ", + "(e.g. pip install phate).")) + }) +} + +pyphate <- NULL + +.onLoad <- function(libname, pkgname) { + load_pyphate() +} diff --git a/R/vne.R b/R/vne.R deleted file mode 100644 index 5b102a8..0000000 --- a/R/vne.R +++ /dev/null @@ -1,121 +0,0 @@ -#' Determines the Von Neumann entropy of data -#' at varying matrix powers. The user should select a value of t -#' around the "knee" of the entropy curve. - -#' @param t.max : int, default=100. Maximum value of t to test -#' @return entropy : array, shape=(t_max). -#' The entropy of the diffusion affinities for each value of t -#' @examples -#' X=diag(nrow=10) -#' X[1,1] <- 5 -#' X[3,4] <- 4 -#' stopifnot(find.knee.point(vne(X, t.max=100)) == 24) -vne <- function(diff.op, t.max=100) { - svd <- svd(diff.op) - eigs <- svd$d - eigs.t <- eigs - entropy <- c() - for (i in 1:t.max) { - prob <- eigs.t / sum(eigs.t) - prob <- prob + .Machine$double.eps - entropy <- c(entropy, -sum(prob * log(prob))) - eigs.t <- eigs.t * eigs - } - return(entropy) -} - -#' Returns the x-location of a (single) knee of curve y=f(x) -#' -#' @param y array, shape=[n]. Data for which to find the knee point -#' @param x array, optional, shape=[n], default=np.arange(len(y)). Indices of the data points of y, if these are not in order and evenly spaced -#' -#' @return knee_point int The index (or x value) of the knee point on y -#' @examples -#' x <- 0:19 -#' y <- exp(-x/10) -#' knee <- find.knee.point(y, x) -#' stopifnot(knee == 8) -find.knee.point <- function(y, x=NULL) { - - if (length(y) < 3) { - message("Cannot find knee point on vector of length 3") - return(NA) - } else if (!is.vector(y)) { - message("y must be a vector") - return(NA) - } - - if (is.null(x)) { - x <- 1:length(y) - } else if (!is.vector(x)) { - message("x must be a vector or NULL") - return(NA) - } else if (length(x) != length(y)) { - message("x and y must be the same length") - return(NA) - } else { - # ensure x is sorted - idx <- order(x) - x <- x[idx] - y <- y[idx] - } - - n <- 2:length(y) - # figure out the m and b (in the y=mx+b sense) for the "left-of-knee" - sigma_xy <- cumsum(x * y)[2:length(y)] - sigma_x <- cumsum(x)[2:length(y)] - sigma_y <- cumsum(y)[2:length(y)] - sigma_xx <- cumsum(x * x)[2:length(y)] - det <- (n * sigma_xx - sigma_x * sigma_x) - mfwd <- (n * sigma_xy - sigma_x * sigma_y) / det - bfwd <- -(sigma_x * sigma_xy - sigma_xx * sigma_y) / det - - # figure out the m and b (in the y=mx+b sense) for the "right-of-knee" - sigma_xy <- cumsum(rev(x) * rev(y))[2:length(y)] - sigma_x <- cumsum(rev(x))[2:length(y)] - sigma_y <- cumsum(rev(y))[2:length(y)] - sigma_xx <- cumsum(rev(x) * rev(x))[2:length(y)] - det <- (n * sigma_xx - sigma_x * sigma_x) - mbck <- rev((n * sigma_xy - sigma_x * sigma_y) / det) - bbck <- rev(-(sigma_x * sigma_xy - sigma_xx * sigma_y) / det) - - # figure out the sum of per-point errors for left- and right- of-knee fits - error.curve <- sapply(2:(length(y)-1), function(breakpt) { - delsfwd <- (mfwd[breakpt - 1] * x[1:breakpt] + bfwd[breakpt - 1]) - y[1:breakpt] - delsbck <- (mbck[breakpt - 1] * x[breakpt:length(x)] + bbck[breakpt - 1]) - y[breakpt:length(y)] - sum(abs(delsfwd)) + sum(abs(delsbck)) - }) - - # find location of the min of the error curve - loc <- which.min(error.curve) + 1 - knee.point <- x[loc] - return(knee.point) -} - -#' Selects the optimal value of t based on the knee point of the -#' Von Neumann Entropy of the diffusion operator. -#' @param t.max : int, default: 100 Maximum value of t to test -#' @param plot : boolean, default: False -#' If true, plots the Von Neumann Entropy and knee point -#' @param double.step : boolean, if true, double the steps in t -#' @return t_opt : int. The optimal value of t -optimal.t <- function(diff.op, t.max=100, plot=FALSE, - double.step=FALSE) { - if (double.step) { - t.max <- t.max %/% 2 - t <- 2* (0:(t.max-1)) +1 - } else { - t <- 0:(t.max-1) - } - h <- vne(diff.op, t=t.max) - t.opt <- find.knee.point(y=h, x=t) - - if (plot) { - plot(t, h, - type='l', - xlab='t', ylab='Von Neumann Entropy', - main=paste0('Optimal t = ', t.opt)) - points(t.opt, h[which(t==t.opt)], pch="*", cex=3) - } - return(t.opt) -} \ No newline at end of file From 68983fa83b68d9da2f4ddf033fcc23a178453ca2 Mon Sep 17 00:00:00 2001 From: Scott Gigante Date: Mon, 21 May 2018 23:23:33 -0400 Subject: [PATCH 2/7] rebuild docs --- README.Rmd | 2 +- README.md | 89 +++++---------- man/as.data.frame.phate.Rd | 4 +- man/as.matrix.phate.Rd | 4 +- man/calculate.kernel.Rd | 28 ----- man/calculate.landmark.operator.Rd | 27 ----- man/figures/README-adjust-parameters-1.png | Bin 7167 -> 7533 bytes man/figures/README-example data-1.png | Bin 15245 -> 0 bytes man/figures/README-example-1.png | Bin 5601 -> 0 bytes man/figures/README-ggplot-1.png | Bin 8679 -> 9358 bytes man/figures/README-plot-results-1.png | Bin 10857 -> 10732 bytes man/figures/README-run phate-1.png | Bin 9896 -> 0 bytes man/figures/README-unnamed-chunk-1-1.png | Bin 6900 -> 0 bytes man/figures/README-unnamed-chunk-2-1.png | Bin 8894 -> 0 bytes man/find.knee.point.Rd | 25 ----- man/ggplot.phate.Rd | 22 ---- man/install.phate.Rd | 34 ++++++ man/library.size.normalize.Rd | 14 ++- man/mds.Rd | 25 ----- man/optimal.t.Rd | 24 ---- man/phate.Rd | 123 ++++++++++++++------- man/plot.phate.Rd | 11 +- man/print.phate.Rd | 21 ++-- man/summary.phate.Rd | 10 +- man/svdpca.Rd | 22 ---- man/vne.Rd | 28 ----- 26 files changed, 179 insertions(+), 334 deletions(-) delete mode 100644 man/calculate.kernel.Rd delete mode 100644 man/calculate.landmark.operator.Rd delete mode 100644 man/figures/README-example data-1.png delete mode 100644 man/figures/README-example-1.png delete mode 100644 man/figures/README-run phate-1.png delete mode 100644 man/figures/README-unnamed-chunk-1-1.png delete mode 100644 man/figures/README-unnamed-chunk-2-1.png delete mode 100644 man/find.knee.point.Rd delete mode 100644 man/ggplot.phate.Rd create mode 100644 man/install.phate.Rd delete mode 100644 man/mds.Rd delete mode 100644 man/optimal.t.Rd delete mode 100644 man/svdpca.Rd delete mode 100644 man/vne.Rd diff --git a/README.Rmd b/README.Rmd index 112c79f..aee76cc 100644 --- a/README.Rmd +++ b/README.Rmd @@ -101,4 +101,4 @@ ggplot(tree.phate, aes(x=PHATE1, y=PHATE2, color=tree.data$branches)) + ## Issues -Please let us know of any issues at the [GitHub repo](https://github.com/KrishnaswamyLab/PHATE/issues) +Please let us know of any issues at the [GitHub repo](https://github.com/KrishnaswamyLab/phater/issues) diff --git a/README.md b/README.md index f98ebd0..63029d5 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,16 @@ +phater +====== -# phater +This R package provides an implementation of the [PHATE dimensionality reduction and visualization method](https://www.biorxiv.org/content/early/2017/12/01/120378). -This R package provides an implementation of the [PHATE dimensionality -reduction and visualization -method](https://www.biorxiv.org/content/early/2017/12/01/120378). +For a thorough overview of the PHATE visualization method, please see the [bioRxiv preprint](https://www.biorxiv.org/content/early/2017/12/01/120378) -For a thorough overview of the PHATE visualization method, please see -the [bioRxiv -preprint](https://www.biorxiv.org/content/early/2017/12/01/120378) +For our Python and Matlab implementations, please see [KrishnaswamyLab/PHATE](https://github.com/KrishnaswamyLab/PHATE). -For our Python and Matlab implementations, please see -[KrishnaswamyLab/PHATE](https://github.com/KrishnaswamyLab/PHATE). - -## Installation +Installation +------------ #### Installation with `devtools` @@ -27,10 +23,7 @@ devtools::install_github("KrishnaswamyLab/phater") #### Installation from source -1. The R version of PHATE can be accessed - [here](https://github.com/KrishnaswamyLab/phater), or by using: - - +1. The R version of PHATE can be accessed [here](https://github.com/KrishnaswamyLab/phater), or by running the following in a terminal: ``` bash git clone --recursive git://github.com/SmitaKrishnaswamy/PHATE.git @@ -38,59 +31,43 @@ cd PHATE/phater R CMD INSTALL ``` -2. If the `phater` folder is empty, you have may forgotten to use the - `--recursive` option for `git clone`. You can rectify this by using: - - +1. If the `phater` folder is empty, you have may forgotten to use the `--recursive` option for `git clone`. You can rectify this by running the following in a terminal: ``` bash -$ cd PHATE -$ git submodule init -$ git submodule update -$ cd phater -$ R CMD INSTALL +cd PHATE +git submodule init +git submodule update +cd phater +R CMD INSTALL ``` -## Tutorial +Tutorial +-------- -This is a basic example running `phate` on a highly branched example -dataset that is included with the package. First, let’s examine it with -PCA. +This is a basic example running `phate` on a highly branched example dataset that is included with the package. First, let's examine it with PCA. ``` r library(phater) #> Loading required package: ggplot2 -#> Warning: package 'ggplot2' was built under R version 3.4.4 data(tree.data) plot(prcomp(tree.data$data)$x, col=tree.data$branches) ``` -Now we run PHATE on the data. We’ll just go ahead and try with the -default parameters. +Now we run PHATE on the data. We'll just go ahead and try with the default parameters. ``` r # runs phate tree.phate <- phate(tree.data$data) -#> Calculating kernel... -#> Calculated kernel in 2.9 secs. -#> Calculating diffusion operator... -#> Calculated diffusion operator in 9 secs. -#> Calculating diffusion potential... -#> Automatically selected t = 15 -#> Calculated diffusion potential in 58.9 secs. -#> Embedding metric MDS... -#> Calculated MDS in 5.4 mins. -#> Embedded PHATE in 6.6 mins. summary(tree.phate) #> PHATE embedding -#> k = 5, alpha = NA, t = 15 +#> k = 15, alpha = NA, t = auto #> Data: (3000, 100) #> Embedding: (3000, 2) ``` -Let’s plot the results. +Let's plot the results. ``` r # plot embedding @@ -100,26 +77,11 @@ plot(tree.phate, col = tree.data$branches) -Good news\! Our branches look nice. However, all of the interesting -activity seems to be concentrated into one region of the plot - in this -case we should try the square root potential instead. We can also try -increasing `t` to make the structure a little clearer - in this case, -because synthetic data in unusually structured, we can use a very large -value, like 120, but in biological data the automatic `t` selection is -generally very close to ideal. Note here that if we pass our previous -result in with the argument `init`, we won’t have to recompute the -diffusion operator. +Good news! Our branches look nice. However, all of the interesting activity seems to be concentrated into one region of the plot - in this case we should try the square root potential instead. We can also try increasing `t` to make the structure a little clearer - in this case, because synthetic data in unusually structured, we can use a very large value, like 120, but in biological data the automatic `t` selection is generally very close to ideal. Note here that if we pass our previous result in with the argument `init`, we won't have to recompute the diffusion operator. ``` r # runs phate with different parameters tree.phate <- phate(tree.data$data, potential.method='sqrt', t=90, init=tree.phate) -#> Using precomputed kernel... -#> Using precomputed diffusion operator... -#> Calculating diffusion potential... -#> Calculated diffusion potential in 60 secs. -#> Embedding metric MDS... -#> Calculated MDS in 4.3 mins. -#> Embedded PHATE in 5.3 mins. # plot embedding palette(rainbow(10)) plot(tree.phate, col = tree.data$branches) @@ -127,8 +89,7 @@ plot(tree.phate, col = tree.data$branches) -We can also pass the PHATE object directly to `ggplot`, if it is -installed. +We can also pass the PHATE object directly to `ggplot`, if it is installed. ``` r library(ggplot2) @@ -138,7 +99,7 @@ ggplot(tree.phate, aes(x=PHATE1, y=PHATE2, color=tree.data$branches)) + -## Issues +Issues +------ -Please let us know of any issues at the [GitHub -repo](https://github.com/KrishnaswamyLab/PHATE/issues) +Please let us know of any issues at the [GitHub repo](https://github.com/KrishnaswamyLab/phater/issues) diff --git a/man/as.data.frame.phate.Rd b/man/as.data.frame.phate.Rd index 8800910..40c590f 100644 --- a/man/as.data.frame.phate.Rd +++ b/man/as.data.frame.phate.Rd @@ -4,10 +4,10 @@ \alias{as.data.frame.phate} \title{Convert a PHATE object to a data.frame} \usage{ -\method{as.data.frame}{phate}(phate, ...) +\method{as.data.frame}{phate}(x, ...) } \arguments{ -\item{phate}{A fitted PHATE object} +\item{x}{A fitted PHATE object} \item{...}{Arguments for as.data.frame()} } diff --git a/man/as.matrix.phate.Rd b/man/as.matrix.phate.Rd index 101c65a..32d14eb 100644 --- a/man/as.matrix.phate.Rd +++ b/man/as.matrix.phate.Rd @@ -4,10 +4,10 @@ \alias{as.matrix.phate} \title{Convert a PHATE object to a matrix} \usage{ -\method{as.matrix}{phate}(phate, ...) +\method{as.matrix}{phate}(x, ...) } \arguments{ -\item{phate}{A fitted PHATE object} +\item{x}{A fitted PHATE object} \item{...}{Arguments for as.matrix()} } diff --git a/man/calculate.kernel.Rd b/man/calculate.kernel.Rd deleted file mode 100644 index f7b37d7..0000000 --- a/man/calculate.kernel.Rd +++ /dev/null @@ -1,28 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/kernel.R -\name{calculate.kernel} -\alias{calculate.kernel} -\title{Calculate a Gaussian or kNN kernel} -\usage{ -calculate.kernel(data, k = 15, alpha = 10, npca = 100, - pca.method = "random", knn.dist.method = "euclidean") -} -\arguments{ -\item{data}{The data (n.samples x n.samples)} - -\item{k}{number of neighbors} - -\item{alpha}{decay constant} - -\item{npca}{number of dimensions of PCA reduction to do before KNN} - -\item{pca.method}{The desired method for implementing pca for preprocessing the -data. Options include 'svd', 'random', and 'none' (no pca). -Default is 'random'.} -} -\value{ -g.kernel Kernel matrix (n.samples x n.samples) -} -\description{ -Calculate a Gaussian or kNN kernel -} diff --git a/man/calculate.landmark.operator.Rd b/man/calculate.landmark.operator.Rd deleted file mode 100644 index 13f94e7..0000000 --- a/man/calculate.landmark.operator.Rd +++ /dev/null @@ -1,27 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/kernel.R -\name{calculate.landmark.operator} -\alias{calculate.landmark.operator} -\title{Calculate the landmark operator} -\usage{ -calculate.landmark.operator(g.kernel, n.landmark = 2000, n.svd = 100) -} -\arguments{ -\item{g.kernel}{Kernel matrix (n.samples x n.samples)} - -\item{n.landmark}{Number of landmarks to compute, or NA. Default is 2000. If NA, then exact PHATE is computed.} - -\item{n.svd}{Number of singular vectors to calculate for landmark selection. Default is 100.} - -\item{seed}{Integer or NA, integer value for random number generator.} -} -\value{ -List containing: -\itemize{ -\item \strong{diff.op} The diffusion operator (n.landmark x n.landmark) -\item \strong{landmark.transitions} Transition matrix between cells and landmark (n.cells x n.landmark) -} -} -\description{ -Calculate the landmark operator -} diff --git a/man/figures/README-adjust-parameters-1.png b/man/figures/README-adjust-parameters-1.png index 1eb1c7cd985d32f9299076a20caad0694ec5d8a4..4088b2ac94360b39ac2c8b4e8527b65cdfc4bd38 100644 GIT binary patch literal 7533 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 literal 7167 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 KSKS=4mAAW?byQO z>Dsv2qqfr-aoY!0KZn9_Q~^c*J!Cd27uAIrs(Lk zYIVkMuif9;$0P-q)!Y^TsJ`bzitnkSvme76yt*S~f}e{O!MfcZtpa0<&a$Y+Vdd4q zd0stQcUMr*ei(u`{w;u|0RvUw{qnfD<8GoSfjOxM3haFcHhseF_ZAoHclJ1HyknG8 zmf@;M;L@9m0lWemX+DAo`aT42Cj_m&E&Jh&CLU!6B!HCX{`WL)fmag1q;ojjTB!wl zheMkkmIUAKSd~nmSW&9J&!wGGVjTJ(E9T$O-d+BbXn%7ST|An-rv|eyu`#YOJO};< D>#P@d diff --git a/man/figures/README-example data-1.png b/man/figures/README-example data-1.png deleted file mode 100644 index 539b22b9db8826ccd2790e8742200c9e06ba70ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15245 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 diff --git a/man/figures/README-example-1.png b/man/figures/README-example-1.png deleted file mode 100644 index ae8f22685562df9e590be069a775d7d914bf5a38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5601 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

VJK%mxq1jkKgNviJYyTx;Z)me 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 CfAIAH literal 8679 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 O8#Y$<2MaAv#r_`v%mvs0 diff --git a/man/figures/README-plot-results-1.png b/man/figures/README-plot-results-1.png index dea547fcf25117135311a40777d2f27de293682c..3be1dc75f82dd0cd6ed4977f005afccdf1ee0335 100644 GIT binary patch literal 10732 zcmd_QWmFqq_%%vP@ZwgyNO38}O3>g^Lh#}(8fbw6!3(s(3KS^CJ$UdIC@wYJ0>QNq z9D+;Hy!_t#zn|{?azDJE?yNQIS+k!#XP-HeV)TLIN>!oIW^3EZouIN@o;c}RFxqwnTbiCt(ju}7Qho|x&|B1t!BtPHr zrZP4*Bq+v-<_dgo$f^%@0DJ3nU~T(n0XdBS!`F*5V>yK zy1O~*T#}9e4cSvl`20~TW|f)eCYY$H!ZrU}^)`Ht%IlPY^WvYP&+k3au5njsYe29) zr6k?{6`IlGelu)FL=6LSXpc?vA+p>Dy8NoEXx~ojr7<9mz^v|u&?{XY)gnN|M(x=<(cL1N&{y%-|rn|MS?DSh2?p|LvV5NsqL+qQpx>qbBZEbm%3h0Lg!-i)=3E3 z%X_DBJ;4xuJ-}M0sDGdjoj$F4V|*ot+cv+2$wcb+%s)mX%;VASzTsd-k0Q6r_lR1a zP}^$f*mGvBo67Cb>RElBU|x{Dziy^K+bxWLcNk>9lS{ho?=o?8Tx0KMi4N8)U-wEV z;JEr&IKqV-*X!<96j5KrM18So8w9ETHG$ihqaIbn7T0LefEJ<>@=ffw`h7Bf8WERw zd5@!`DUVTuz46uV*i%T#C3P=rs@cHfQ`R@-?H@yI|T-+wSkojWA~BtIj%@sXsJH3Y`pq+B?(RxJ;nz$plq1SzkP`knlMzJW5-)Ns2S2Q`R<)CBMxlFmZGDu)n0H)D$x# z6HjHf__sQRVPGkbd(&m~WlU^GOFbU3On>Vsm&yJDlJDek0OQ2Lc31;Staj;PHm2oa zrG-v%qYW{-=qmpa#z!`?xEv=;6FiNbJfxu;QLD(NS*Np zSy_deSn(S9!@w7y8j>o4XNM=}I#Z=A<_gRUrC11U*{m%8!rSpc%7>a<-rW2A>+URC zl!8zi1I9OZeN%F*eUza$$m+$*x8I`y04+5JA`72RBNW#ufBE%H5d z^(l*w4=7w#cC8qQ;T`ih>#)$%g*1yE1kY0P#Dr`C!v2Ic z;I_!*ug0~_DX+h@v~>odXH_`L%UMS$($toougo zPo7Y9Qj(Ts*nBX&JY-ZO-{@kL=0qJfX`c6be&LVI0r-t{d&kEJS+kF!YA@LsjIDaO zSj}R)v0=rpLmV6d3vYpY_mu2^cckRScadC%YdV&$7h@u>bF1s;NcKsp`qSDugDX

`|;yFMOxjS*fT{Tt@FIVi^ShtEa*!Fm4uLFY8U=!)C z17*m;M9ftTM!$<(BqhvUip_6s zI8cXj8(W?tq_}5{WbB-Q&09d&Us$ZM`tp{YSC8iQW)?uUlA6_J2*L%(6;j+b5~Lv<9ilVdV)eZAvOb|ua87$+QC@i;lg8%iUQ`;}vv|BUVAVF!nCM2h#o~UJ(jjv! zHV_Mb5rF9U2b(u@fhIOshd-}!dUM+lajehWtA8^%9}t6mN1~d*3@Xb?&hf>`&t`2o6p!ZAlj}WIC;PuBiaJpep>Td;MgmS$HzS&kBagzo19zEmzME zWeLmO^x29xy1aqv2$k&VT;}d=+gf%DGbk%;Vyh{sPRQ{r3A4Uu@61=V8BqMdgm~LR zVEdGLfiCh=UUFmczbU*0?a2psQgO^$Cj{y~0u(WHXhIev1Up2Nsr9wLXph>-#a^e@ zHQB6?(0P+xa{b<*oi0NZB{k|4YrjulDM~p*o97%ov=Ah+eg$+_RIrXdMzt~0u)bQ%^ev^-pm=kH%{V*u?d}O&7O)8 z)1B(D1YxK%)f=EOISHWqQ3fqL#(qmIfo@=x+IdtvsgA^Tvr1g6oNJ8&+0!)#sSBi0 z4y&*vtQ6jj4yQYia6$ycDhi6rtSuO{XD-(w4;Dx*R$n}e$)RZ8ptGYCa8EC9%PtR9 zin1oP*aq~?*DK9^HKcga^~^YM=;bCm0eMt&>md0%Rs(pBH^NDA=7((`#RTk(mp^a% znA`9ERKDT-K=T+eG*q}Vj86J{MO;;5pa7}p85|`()X+tn%!PJap zbBKVKF5Su&zRw}e{4NSz8UVRUXAaLi>C^|+nG%GghMx@{i(JE0{RE(snLkEqkv7*S zIq80nq0twOhz;ODr4KFnLNP+Ufn!aG76yv?@LZA({%a&fi}yZDpCZAK6aTeUB9(lC zFw|Xjd81`8-O|Mw?j%hYQmrc$+_KtEk~skZpuWon^7T0`%#$chMIEEQW$uAdpCVOI zRml0xIGrn6$t6X-18?qMpEr??u{l{~f7NW7A4DKnMzfim9f(D^q07;2ii%#(NR=Al z(n0a&4IdF*rTKk!{D1}0MNuWY87}yl{;E_(lV~ansgg`#jJ%a^9(BEw3ta>v%itn( zB7G?LuCAx&JtB1)HlYh~*HoWNX7@`WJzX)&=-sh5pt=)N$&%-gIg(=~qF0mUV~Jr1 zvA-_cZHz&*7q8}G)8Tx81-9{CN+Tqrt#fW(G2u2n7j@1Fkhn!Eg$11`#s@`*GU9`e zV}t%w^4uwaP2#3o%l@nHP1a-c(Asds9PPR>vt)fbLMhY(AR-0Hdk?;5FVlE)EUyO0 z!3Rj;>FLOP)#3#0gj{;Wx9F0^3gKT%zUL^nwT4VRyF3lTMe^Xof&X0IKbah_+3X!{e9~@c?(Bj4&ZT4Ds?c;fTzA(9g*SdsdWpVU_*_JHXi4 zdTqI%t78;{uTSZgxGxPWM|jwFwsziD%FuuypCgv>H+f07DWk4VvHQ44#3M>`Zhq|2 z1?GQWkP&cg=5Tc0@xolEQGK#d)KQJn73D@cgw;Q=yh)&J0L9eqztoGnBm`Nu1^&?s z46m_36$!zIHLrN6#0lk1c3R0T#Ep%l zX8qDkvx!jut&^)d{T80MhyFCU+tqqo7*|5qs0qy4q9Q1Ke+(#2yF9Y8>fbVRzhQES zjKA*v93~CFtiDE*%sTQ0rC6h;{vDaMOeH>QQr*<);c$*YjPN0Azqw5dX|^Fye^`@q znW*YrPHiz^RWZABCbe~Lo1%brD^W7j@1Mb z4q;s6X8M>b{Av_rku=7_%I5dg&EiXW9gB};b`4PDgC@dmy1h#`riDriowQ&=AOXE$ zlzM%=uN8JFy^=RDP{DLzx=> zki8eme4&(lYZNiOG~WEF41*|q-~$@FC}-~*4(B)fEJk4&vEd>>9~_YJFB(aev!Pl* zE8dVd6M-Nvyf2WkJ$A({Tb^T0jLGf=*)!Ub2&U{Zp`HOsV0O`Zdx%ov^bv-8$tT~_&j7+maLRZgc<^ybTD18qqQ+qD#OJ0ns6R4j zWTgH#G4p5%fu;Zvd7~&#scmv4)?eYFN|9p0!akFu&(oC_eisWaEWpTiLl!!miV#tO zeTq|1H(|8Ah;1BCtbF;DE48~xr~8ap(3X**sH%QwVX&u5tmOI@At>&{2Dh27zop$= zH@OfDvH*HdD4?D+tf@V{0#F<0*Nvx#9r-{S_Pf?z`%6Ak_Qj(9stNwJdrp2>*POWa z)qZ^{lpOXYBsd6_XyK9&xMu#`Kvk)~SrJs0=R++eZ=#ozs3 zUEgV80}F)o+drmpBEZWjjU`@R%7M>o^0SgPAxd*Gy0r!O726pvlw-K-m{Qd8e_#}j$-9cKQ15c{Tet#Z+j)= z*3>W&ZF3O!^SynV9u^FQtcblkh(u-*%lYh=%9En|eRTRdQQ^Y~(jneMIQvCM~maFcow;Owa z{K2b>5XPn0k;lk{1l9I`(Op<_h3io5*?_?8YW4dpMiWh#i6o1_W=ZOkvFRBr+gf#0 zN5q_WGh@jNy8qJ#BScmys-9`_hAWJ5lZ? zTC>aX1xiu1IeaoC;;N6zzm(0@QS{doFkHIoy12Y&OKxeHf+BNHC@{>VDInTaktX@d zPO{)He-c80cK0Xwl^B)O=; zXsooP-W$2L&mUw+VFm;rsrX1~$-`kCS47LJ_}d^x4+yuRb6y&6`1&V=tglNTFUV-T zahtvV00VHuI)v|ilh`A#&NH-BGspn zoazIlg6#PgJY-#2HT&<#L6rKIe-uGc-VhOfzjP=byqj)Js+(p!@DDdw!A6XOp#5q_ zf<*=pe1A6H(CWnRkIL>#u7I(iZNao4qd?BiqS%>wEnQd8KK9*${`O2f00bh#T3KTD z(&UBf+W!{&qT8p~{E0~)czK@Nyi))KmU)rHdkB zN3yM%o~oB98Q7jMAC3qL=XU;75JZ<;yn9F!vX|_~ce+ZPDMVzgiQ?p3-l#6Sft7!# zsYBf=egT1^@Oj7QrC#kCt>^8l9-1dUrmLor^X9Z6`SO1Evb+5ls< zypMqz^6gfNpt?~b)_Hj@FXP1vs(y*LX6??U=hHNFuI!0^rGeO2R?&qU@qmbI&0j&& zfT3}S#h($;Mix-jmVlDZ6Z#o$ufFMbFT(9NmBk|gQYEFjA=sDlf-g#_B`>wnZz<^= zH6iwa{RY%ea*I@x-DSO6KI~`k*t~?G+JrLWSn2O!v;tM=MCbaP!#M7-oz*2HB-XW` zuJd`EC_iLVy_Skyl4?8@mE763Uo}91`iX(gxje7oC0CMftl0{A^1hfRpPM}8-K;cM zth~sOegTn;P^4pix6dWIOQWQ^ag&&@4#4K|xgeee!F}JYT2A%SaH<_qjfHW*uF!L$ zL<(8}p9OFXE%jE^-71{ z#QmXMIUaEXYJ1;xRB*F!ejA~+G~UX4wMc8QHB;Ttmef5Q70eTcK?F=C5wLMmv_)(8 zrSt1x+=cl)IKK2i;~yh0Q2NBcFTbNkCxdq0DHHc^5N6<$KXKzh<_R2n&nmaej5E>K zmv+`$>e>H^omwD|2&oY#Vp~Y{`ynUpCU93+>g$KgNU}9zsVvY;YUi}i9gB0k#S5Qj zdQY`X?)!hpxX1i5aMxKD6qZR_f@u(g?l(G`j!jZ(k6XIKcd21Vy`x&csBVar21uBP z6C^?qA&im0?;EPUeJAJ8!oYdYXv=^v3$~X869uXMnu<79OldK3zd6!J-J~YvY-a0Y zmCzKQpn&g>qC*4`JoQ1ETlcP$CLPU*u0&PaPTq?SGe~3DBMVi|dP{u@%i<0L=h^X>N!BK15L*JmRcXU&;H4MWjcD$t+y1C z0)8m>i2pUxtadqyo>H3q0{#Ua6Re@Z*oa6}TFAI9mw!OY>;|KoI5B;*aA^1wyxJ6^ z5aQE*r|?10534n!N>8E6Jon3z4(6n^1)Cj1{WNXYhxC+`7@148Ok>3r3_`OS-}1aM66dyk2}Yq(@>=@pJiUWJ^lnN%6wK`VI(EgC zl|d&)=PQlx5@0vx%$NI!Aq@Mr03-aWsV9&mYVmT(X`n;Vh zfB0m`8B6A?E9%*Q1qbpZJ@m=9KA-LJ=-{d0gsJ=lIX1s2019Xyo!onY4=pIxHnRV@ z*rL8B1g9Y~q#rG)D7hGLB4}mJr{tBeWZSf;YWx&0x4&w{A{t$M)EPjtJDg4Cdml&?gf)^qp%#wcQdh~}HW&J174K-LhWh9f4wS1QCJ-FN+S(ubEX zmwalS{!b!6TiGaj;Q1LB{~XhUp%$`Da=8Wi_rKQR2V25=tEV4P9ei-GXbG9*;YBq5 zvF=H|Wa5;nic()}3yikyzBbfXkonb9fz3)6C_6W0$w1I&BEZmteTB|(eO20kIAzw) z+2>DqJoo@Zgm)l6u5!i*P?eu+=ni62fr15RW9lEu-SN0jl7~GXN=6lEsdyWSVB2YZ zd5@S$$Uo)|kB&7vsy~8?9z76M_m!Z~$?h8F-gsj`$0wOM<4=_ ze|*@_Bp@RP!+LxvF`{1M=PR6>R!y%Mrvj!&mD`I7YwDjHsG%Oe{oO$eBBPKXxL)TG z*(`9=rGnkNwRcvH z=e*BH3fk~;m4@aX5rUmO@J|IcN^)w%_6FgR71{(KRPfpVNSN%T_fjTjmCbFL%IwO~!oIJ(K(%Bry4E7?K{S`2jhcEfZhO9_ z-}6fc%lPX2Ky2709%m?W>6@DME&xz+7XO6%V(XNyQbnA1#&1sb%_jUFP z`&(aE8V}%8+4US1NN8s>Pb3%Im&)jIj(@+6;Y>p1^e|WFn(*GepToC(DNUe#I>~or zn~z<9JrZeK0H>2yF&4y z(_@lN!sh^Ez=Q%0${(6=6<_|1gv28;a(P9gsrCJQa*$F*pjJo7%dU>qR|Ijt&-e24 ze@dr>)grw9*vfyW)Rf&{mtW%{{2x=7+1b0?JvZM8s;6q4#x1xfn+c?}b@ z*?+4-37puA6$|k;<`QT)kI^Y#|4V1jMPU1MF3Ia9ONr!4MFJ7(MfS@PYZAL4btr zKQF*@I`_z8WMd8beI2{@sf?p?61DNW)A_Z}2{BV$w_2<`2LoGheQ^QU3daUR0>PT{ zaK33K6Sk<&&T0@SV5ea+5b`RR)db@Hea@W}#Fns$wrhm)Clrkt>j`_Su1p~iTuT`C zTGA4}_Vh7Xk^%*|R~mQ?!5Z8C<#ai%j{!j?uG-&s1^bq1$>I9;1qi?0^^AD-VIZyh zSk<%GFy=?l4u9NKm!j7j^DLbc;!NIeWl0Ng-T~PLIdgfcH=o!|w^2T!3=Ry&_1lf< z5iz-#ZB}cDhUAjqzIYjFmmEk4+z4YSDsw!eRO?AG*e0^=@qZ-+O+c<>aA&Ig+i(8S<`4Z zqDLIPhBFD(OWm8leqt4L%@9Dkii|9mk9`?CNw;GU)5$C+aNF}|6jG#b`S7Dpz8N9# z3eguT@g}Qqx|iv7C&G^91M6EibbhWY`l?K~vb;6P=J`I7Ml$=6B7L%b`hR;#ek;F>t4Ji{(e_#!jw_%96qmiU za}q3N>o|OjoSCoZaV7`oJ+y~zGi+qNJ7JG7eavr*rscAx$8XFZbVv{eLn9E$A52rA z81;UpphIg9H15z8Xk=h?A4HpaMpz(Z{ z8d&%E141Bx$lSPA`}e&qr0Xtt>!;~sSs=*A8_*dc zq+Bcx$e1oc_14?2VolFyDX#9fxnhjB5E2@;dG(RiIKp_;kEXp$R;W-Tr|VPIHT(3I zFo&c0Z^$i6kQxwY#qgAAo1o0V|4KxzZq9q0aV-_%?=v=a;Fq6f<?#r-x5z2|;ECb{(n}S%ATT)uwjYG<3?mftR1M zGN_@V`7eqP1p;9FA|v-0jf~STQ(VA?Fv$(Xyd&@#0pHQ(kb$4eE6+)-6CnZQ#}RF@ zTXTM?L73mk&iPqn(cNBjrdx`?6mR>O#z#4J}~7(cD)kHAs&NmgYE9^zb)@(8+M&?}axK0jw&1O!g#|;*DEijoI?WLICv{n7T+;Z;;{{IJ4mANJ= z4`+~v7RXh(KGqE`SXYneddfhbS_W22RjHj6+$c>sea+e@2){jb_8$9|ha=u!uTzZs zH{ZxWiur#M2bkd@k#$mI^HR6SRu0NxRcWh-Y2T1vpZjpt(tY`EDyvjgX^VlHQk@(R zaNH`iN1U&0SOf;a1bcq|YWnmz!m*q-srYmD_x=kP#~bFJIxxld(o6!bZ9_B^!ZIqu zINfwdi@2jD@#%7AyiPer_g_lIJE-4zpz3mOc6vBCJu-6IB_lkU21o}?N+ETu5f0TR z!}>xyQ_sFgaq}-o@<6MB5ni<+jsdQB8|>LBEI+s5ixP~wdhbg9!=(f7@XqLw7tPdk z^e01nLYFx=n5(v33&sX{?8XtpxB#a|Bd30qm#={LyEr3rarmVStTV&jfgkO?VeuLCkwNf(3yEm*qe^i_s z{z&+uONnj$1N8M0>0{#co2ULyhT`~+KW+whHD*e2=_Z}gOV69i| zY1kx~puF>}DN!quFz238s-U9o8oz$I;{dq12=b=!6XWFClz#-JDDX8zHByOWxzhl0 z?iMznQpB>;!hswykdZhu>`wjugC#vU;`pxJO}b?ElQRDQidhuhZmu1G^RP+08^#^T$|eJV6|$Mm+=1uaWs$O literal 10857 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 IP<{>jUuhBeoB#j- diff --git a/man/figures/README-unnamed-chunk-1-1.png b/man/figures/README-unnamed-chunk-1-1.png deleted file mode 100644 index b2c5a2c38eaa8aac61f6f2908d99e501244ff74e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6900 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 diff --git a/man/figures/README-unnamed-chunk-2-1.png b/man/figures/README-unnamed-chunk-2-1.png deleted file mode 100644 index 32ee0ad6b12b8b37ccd67e00633a8d88e0d026c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8894 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 diff --git a/man/find.knee.point.Rd b/man/find.knee.point.Rd deleted file mode 100644 index d8267be..0000000 --- a/man/find.knee.point.Rd +++ /dev/null @@ -1,25 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/vne.R -\name{find.knee.point} -\alias{find.knee.point} -\title{Returns the x-location of a (single) knee of curve y=f(x)} -\usage{ -find.knee.point(y, x = NULL) -} -\arguments{ -\item{y}{array, shape=\link{n}. Data for which to find the knee point} - -\item{x}{array, optional, shape=\link{n}, default=np.arange(len(y)). Indices of the data points of y, if these are not in order and evenly spaced} -} -\value{ -knee_point int The index (or x value) of the knee point on y -} -\description{ -Returns the x-location of a (single) knee of curve y=f(x) -} -\examples{ -x <- 0:19 -y <- exp(-x/10) -knee <- find.knee.point(y, x) -stopifnot(knee == 8) -} diff --git a/man/ggplot.phate.Rd b/man/ggplot.phate.Rd deleted file mode 100644 index 7ce9585..0000000 --- a/man/ggplot.phate.Rd +++ /dev/null @@ -1,22 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/phate.R -\name{ggplot.phate} -\alias{ggplot.phate} -\title{Convert a PHATE object to a data.frame for ggplot} -\usage{ -\method{ggplot}{phate}(phate, ...) -} -\arguments{ -\item{phate}{A fitted PHATE object} - -\item{...}{Arguments for ggplot()} -} -\description{ -Passes the embedding matrix to ggplot with column names PHATE1 and PHATE2 -} -\examples{ -data(tree.data) -phate.tree <- phate(tree.data$data) -ggplot2::ggplot(phate.tree, aes(x=PHATE1, y=PHATE2, color=tree.data$branches)) + - geom_point() -} diff --git a/man/install.phate.Rd b/man/install.phate.Rd new file mode 100644 index 0000000..97ca809 --- /dev/null +++ b/man/install.phate.Rd @@ -0,0 +1,34 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{install.phate} +\alias{install.phate} +\title{Install PHATE Python Package} +\usage{ +install.phate(envname = "r-reticulate", method = "auto", conda = "auto", + ...) +} +\arguments{ +\item{envname}{Name of environment to install packages into} + +\item{method}{Installation method. By default, "auto" automatically finds +a method that will work in the local environment. Change the default to +force a specific installation method. Note that the "virtualenv" method +is not available on Windows.} + +\item{conda}{Path to conda executable (or "auto" to find conda using the PATH +and other conventional install locations).} + +\item{...}{Additional arguments passed to conda_install() or +virtualenv_install().} +} +\description{ +Install PHATE Python package into a virtualenv or conda env. +} +\details{ +On Linux and OS X the "virtualenv" method will be used by default +("conda" will be used if virtualenv isn't available). On Windows, +the "conda" method is always used. +As of reticulate v1.7, this functionality is only available in the +development version of reticulate, which can be installed using +\code{devtools::install_github('rstudio/reticulate')} +} diff --git a/man/library.size.normalize.Rd b/man/library.size.normalize.Rd index 6f8cbd7..f14e115 100644 --- a/man/library.size.normalize.Rd +++ b/man/library.size.normalize.Rd @@ -2,9 +2,10 @@ % Please edit documentation in R/preprocessing.R \name{library.size.normalize} \alias{library.size.normalize} -\title{Performs L1 normalization on input data such that the sum of expression values for each cell sums to 1 -then returns normalized matrix to the metric space using median UMI count per -cell effectively scaling all cells as if they were sampled evenly.} +\title{Performs L1 normalization on input data such that the sum of expression +values for each cell sums to 1, then returns normalized matrix to the metric +space using median UMI count per cell effectively scaling all cells as if +they were sampled evenly.} \usage{ library.size.normalize(data, verbose = FALSE) } @@ -19,7 +20,8 @@ data_norm matrix (n_samples, n_dimensions) 2 dimensional array with normalized gene expression values } \description{ -Performs L1 normalization on input data such that the sum of expression values for each cell sums to 1 -then returns normalized matrix to the metric space using median UMI count per -cell effectively scaling all cells as if they were sampled evenly. +Performs L1 normalization on input data such that the sum of expression +values for each cell sums to 1, then returns normalized matrix to the metric +space using median UMI count per cell effectively scaling all cells as if +they were sampled evenly. } diff --git a/man/mds.Rd b/man/mds.Rd deleted file mode 100644 index f76ed55..0000000 --- a/man/mds.Rd +++ /dev/null @@ -1,25 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/mds.R -\name{mds} -\alias{mds} -\title{Performs specified method of PCA} -\usage{ -mds(data, ndim = 2, method = "metric", dist.method = "euclidean") -} -\arguments{ -\item{method}{The desired method for implementing pca for preprocessing the -data. Options include 'svd', 'random', and 'none' (no pca).} - -\item{dist.method}{The desired distance function for MDS. Choices are 'euclidean' -and 'cosine'. Default is 'euclidean'.} - -\item{X}{Data matrix.} - -\item{k}{Number of PCA dimensions returned.} -} -\value{ -A matrix containing the embedded data is returned. -} -\description{ -Implements different methods of PCA -} diff --git a/man/optimal.t.Rd b/man/optimal.t.Rd deleted file mode 100644 index 139f8cd..0000000 --- a/man/optimal.t.Rd +++ /dev/null @@ -1,24 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/vne.R -\name{optimal.t} -\alias{optimal.t} -\title{Selects the optimal value of t based on the knee point of the -Von Neumann Entropy of the diffusion operator.} -\usage{ -optimal.t(diff.op, t.max = 100, plot = FALSE, double.step = FALSE) -} -\arguments{ -\item{t.max}{: int, default: 100 Maximum value of t to test} - -\item{plot}{: boolean, default: False -If true, plots the Von Neumann Entropy and knee point} - -\item{double.step}{: boolean, if true, double the steps in t} -} -\value{ -t_opt : int. The optimal value of t -} -\description{ -Selects the optimal value of t based on the knee point of the -Von Neumann Entropy of the diffusion operator. -} diff --git a/man/phate.Rd b/man/phate.Rd index 07471d6..0512e97 100644 --- a/man/phate.Rd +++ b/man/phate.Rd @@ -4,26 +4,24 @@ \alias{phate} \title{Run PHATE on an input data matrix} \usage{ -phate(data, ndim = 2, t = "auto", k = 15, alpha = 10, use.alpha = NA, - n.landmark = 2000, potential.method = "log", t.max = 100, - pca.method = "random", npca = 100, n.svd = 100, mds.method = "metric", - knn.dist.method = "euclidean", mds.dist.method = "euclidean", - init = NULL, verbose = TRUE, plot.optimal.t = FALSE, g.kernel = NULL, - diff.op = NULL, landmark.transitions = NULL, diff.op.t = NULL, - dist.method = NA) +phate(data, ndim = 2, k = 15, alpha = 10, use.alpha = NA, + n.landmark = 2000, potential.method = "log", t = "auto", + knn.dist.method = "euclidean", init = NULL, mds.method = "metric", + mds.dist.method = "euclidean", t.max = 100, npca = 100, + plot.optimal.t = FALSE, verbose = TRUE, n.jobs = 1, seed = NA, + n.svd = NA, pca.method = NA, g.kernel = NULL, diff.op = NULL, + landmark.transitions = NULL, diff.op.t = NULL, dist.method = NA) } \arguments{ \item{data}{matrix (n_samples, n_dimensions) 2 dimensional input data array with -n_samples samples and n_dimensions dimensions} +n_samples samples and n_dimensions dimensions. +If \code{knn.dist.method} is 'precomputed', \code{data} is treated as a +(n_samples, n_samples) distance or affinity matrix} \item{ndim}{int, optional, default: 2 number of dimensions in which the data will be embedded} -\item{t}{int, optional, default: 'auto' -power to which the diffusion operator is powered -sets the level of diffusion} - \item{k}{int, optional, default: 15 number of nearest neighbors on which to build kernel} @@ -44,62 +42,103 @@ choose from 'log' and 'sqrt' which transformation of the diffusional operator is used to compute the diffusion potential} -\item{t.max}{int, optional, default: 100. -Maximum value of t to test for automatic t selection.} - -\item{pca.method}{string, optional, default: 'random' -The desired method for implementing pca for preprocessing the -data. Options include 'svd', 'random', and 'none' (no pca).} +\item{t}{int, optional, default: 'auto' +power to which the diffusion operator is powered +sets the level of diffusion} -\item{npca}{int, optional, default: 100 -Number of principal components to use for calculating -neighborhoods. For extremely large datasets, using -n_pca < 20 allows neighborhoods to be calculated in -log(n_samples) time.} +\item{knn.dist.method}{string, optional, default: 'euclidean'. +The desired distance function for calculating pairwise distances on the data. +If 'precomputed', \code{data} is treated as a +(n_samples, n_samples) distance or affinity matrix} -\item{n.svd}{int, optional, default: 100 -The number of SVD components to use for landmark selection} +\item{init}{phate object, optional +object to use for initialization. Avoids recomputing +intermediate steps if parameters are the same.} \item{mds.method}{string, optional, default: 'metric' choose from 'classic', 'metric', and 'nonmetric' which MDS algorithm is used for dimensionality reduction} -\item{knn.dist.method}{string, optional, default: 'euclidean'. -The desired distance function for calculating pairwise distances on the data.} - \item{mds.dist.method}{string, optional, default: 'euclidean' recommended values: 'euclidean' and 'cosine'} -\item{init}{phate object, optional -object to use for initialization. Avoids recomputing -intermediate steps if parameters are the same.} +\item{t.max}{int, optional, default: 100. +Maximum value of t to test for automatic t selection.} -\item{verbose}{boolean, optional, default : TRUE -If TRUE, print verbose updates.} +\item{npca}{int, optional, default: 100 +Number of principal components to use for calculating +neighborhoods. For extremely large datasets, using +n_pca < 20 allows neighborhoods to be calculated in +log(n_samples) time.} \item{plot.optimal.t}{boolean, optional, default: FALSE If TRUE, produce a plot showing the Von Neumann Entropy curve for automatic t selection.} -\item{g.kernel}{Precomputed kernel matrix} +\item{verbose}{boolean, optional, default : TRUE +If TRUE, print verbose updates.} + +\item{n.jobs}{\code{int}, optional (default: 1) +The number of jobs to use for the computation. +If -1 all CPUs are used. If 1 is given, no parallel computing code is +used at all, which is useful for debugging. +For n_jobs below -1, (n.cpus + 1 + n.jobs) are used. Thus for +n_jobs = -2, all CPUs but one are used} + +\item{seed}{int or \code{NA}, random state (default: \code{NA})} + +\item{n.svd}{Deprecated.} + +\item{pca.method}{Deprecated.} + +\item{g.kernel}{Deprecated.} -\item{diff.op}{Precomputed diffusion operator} +\item{diff.op}{Deprecated.} -\item{landmark.transitions}{Precomputed landmark transitions} +\item{landmark.transitions}{Deprecated.} -\item{diff.op.t}{Precomputed powered diffusion operator} +\item{diff.op.t}{Deprecated.} + +\item{dist.method}{Deprecated.} } \value{ "phate" object containing: \itemize{ \item \strong{embedding}: the PHATE embedding -\item \strong{diff.op}: The diffusion operator which can be used as optional input with another run. -\item \strong{diff.op.t}: diff.op^t -\item \strong{g.kernel}: The kernel used to construct the diffusion operator +\item \strong{operator}: The PHATE operator (python phate.PHATE object) \item \strong{params}: Parameters passed to phate } } \description{ -PHATE is a data reduction method specifically designed for visualizing \strong{high} -dimensional data in \strong{low} dimensional spaces. +PHATE is a data reduction method specifically designed for visualizing +\strong{high} dimensional data in \strong{low} dimensional spaces. +} +\examples{ +if (reticulate::py_module_available("phate")) { + +# Load data +data(tree.data) + +# Run PHATE +phate.tree <- phate(tree.data$data) +## PHATE embedding +## k = 5, alpha = NA, t = 58 +## Data: (3000, 100) +## Embedding: (3000, 2) + +library(graphics) +# Plot the result with base graphics +plot(phate.tree, col=tree.data$branches) +# Plot the result with ggplot2 +if (require(ggplot2)) { + ggplot(phate.tree) + + geom_point(aes(x=PHATE1, y=PHATE2, color=tree.data$branches)) +} + +# Run PHATE again with different parameters +# We use the last run as initialization +phate.tree2 <- phate(tree.data$data, t=150, init=phate.tree) +# Extract the embedding matrix to use in downstream analysis +embedding <- as.matrix(phate.tree2) +} } diff --git a/man/plot.phate.Rd b/man/plot.phate.Rd index fb1cb21..97568d8 100644 --- a/man/plot.phate.Rd +++ b/man/plot.phate.Rd @@ -4,10 +4,10 @@ \alias{plot.phate} \title{Plot a PHATE object in base R} \usage{ -\method{plot}{phate}(phate, ...) +\method{plot}{phate}(x, ...) } \arguments{ -\item{phate}{A fitted PHATE object} +\item{x}{A fitted PHATE object} \item{...}{Arguments for plot()} } @@ -15,7 +15,12 @@ Plot a PHATE object in base R } \examples{ +if (reticulate::py_module_available("phate")) { + +library(graphics) data(tree.data) phate.tree <- phate(tree.data$data) -plot(phate.tree, col=tree.data$branches)) +plot(phate.tree, col=tree.data$branches) + +} } diff --git a/man/print.phate.Rd b/man/print.phate.Rd index 6215ae6..c0afdbe 100644 --- a/man/print.phate.Rd +++ b/man/print.phate.Rd @@ -4,10 +4,10 @@ \alias{print.phate} \title{Print a PHATE object} \usage{ -\method{print}{phate}(phate, ...) +\method{print}{phate}(x, ...) } \arguments{ -\item{phate}{A fitted PHATE object} +\item{x}{A fitted PHATE object} \item{...}{Arguments for print()} } @@ -15,16 +15,17 @@ This avoids spamming the user's console with a list of many large matrices } \examples{ +if (reticulate::py_module_available("phate")) { + data(tree.data) phate.tree <- phate(tree.data$data) print(phate.tree) ## PHATE embedding with elements -## $embedding : (3000, 2) -## $g.kernel : (3000, 3000) -## $diff.op : (2000, 2000) -## $diff.op.t : (2000, 2000) -## $params : list with elements (data, k, alpha, t, n.landmark, -## potential.method, pca.method, -## npca, n.svd, mds.method, -## knn.dist.method, mds.dist.method) +## $embedding : (3000, 2) +## $operator : Python PHATE operator +## $params : list with elements (data, k, alpha, t, n.landmark, ndim, +## potential.method, npca, mds.method, +## knn.dist.method, mds.dist.method) + +} } diff --git a/man/summary.phate.Rd b/man/summary.phate.Rd index b2ba36a..8c6b435 100644 --- a/man/summary.phate.Rd +++ b/man/summary.phate.Rd @@ -4,10 +4,10 @@ \alias{summary.phate} \title{Summarize a PHATE object} \usage{ -\method{summary}{phate}(phate, ...) +\method{summary}{phate}(object, ...) } \arguments{ -\item{phate}{A fitted PHATE object} +\item{object}{A fitted PHATE object} \item{...}{Arguments for summary()} } @@ -15,11 +15,15 @@ Summarize a PHATE object } \examples{ +if (reticulate::py_module_available("phate")) { + data(tree.data) phate.tree <- phate(tree.data$data) -print(phate.tree) +summary(phate.tree) ## PHATE embedding ## k = 5, alpha = NA, t = 58 ## Data: (3000, 100) ## Embedding: (3000, 2) + +} } diff --git a/man/svdpca.Rd b/man/svdpca.Rd deleted file mode 100644 index 4763801..0000000 --- a/man/svdpca.Rd +++ /dev/null @@ -1,22 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/svdpca.R -\name{svdpca} -\alias{svdpca} -\title{Performs specified method of PCA} -\usage{ -svdpca(X, k, method, verbose = FALSE) -} -\arguments{ -\item{X}{Data matrix.} - -\item{k}{Number of PCA dimensions returned.} - -\item{method}{The desired method for implementing pca for preprocessing the -data. Options include 'svd', 'random', and 'none' (no pca).} -} -\value{ -A matrix containing the rotated data is returned. -} -\description{ -Implements different methods of PCA -} diff --git a/man/vne.Rd b/man/vne.Rd deleted file mode 100644 index 5d17a95..0000000 --- a/man/vne.Rd +++ /dev/null @@ -1,28 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/vne.R -\name{vne} -\alias{vne} -\title{Determines the Von Neumann entropy of data -at varying matrix powers. The user should select a value of t -around the "knee" of the entropy curve.} -\usage{ -vne(diff.op, t.max = 100) -} -\arguments{ -\item{t.max}{: int, default=100. Maximum value of t to test} -} -\value{ -entropy : array, shape=(t_max). -The entropy of the diffusion affinities for each value of t -} -\description{ -Determines the Von Neumann entropy of data -at varying matrix powers. The user should select a value of t -around the "knee" of the entropy curve. -} -\examples{ -X=diag(nrow=10) -X[1,1] <- 5 -X[3,4] <- 4 -stopifnot(find.knee.point(vne(X, t.max=100)) == 24) -} From bebfac9618d0c8761260d72e71bc8a0ff4072ce6 Mon Sep 17 00:00:00 2001 From: Scott Gigante Date: Mon, 21 May 2018 23:23:53 -0400 Subject: [PATCH 3/7] add desktop.ini to rbuildignore --- .Rbuildignore | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/.Rbuildignore b/.Rbuildignore index 650c518..beba061 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -1,4 +1,11 @@ -^.*\.Rproj$ -^\.Rproj\.user$ -^data-raw$ -^README\.Rmd$ +^.*\.Rproj$ # Automatically added by RStudio, +^\.Rproj\.user$ # used for temporary files. +^data-raw$ # raw data generation code +^README\.Rmd$ # An Rmarkdown file used to generate README.md +^cran-comments\.md$ # Comments for CRAN submission +^NEWS\.md$ # A news file written in Markdown +^\.travis\.yml$ # Used for continuous integration testing with travis +^desktop\.ini$ # Windows detritus +^R/desktop\.ini$ # Windows detritus +^man/desktop\.ini$ # Windows detritus +^data/desktop\.ini$ # Windows detritus From d9f9c7c8fac891e4d6a68ec1e4cc918477cf4c61 Mon Sep 17 00:00:00 2001 From: Scott Gigante Date: Mon, 21 May 2018 23:24:18 -0400 Subject: [PATCH 4/7] rename data-raw to extdata --- {data-raw => extdata}/generate_treedata.R | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {data-raw => extdata}/generate_treedata.R (100%) diff --git a/data-raw/generate_treedata.R b/extdata/generate_treedata.R similarity index 100% rename from data-raw/generate_treedata.R rename to extdata/generate_treedata.R From cb402dcec3db495d7f797e9f7a7e6684c45a7b65 Mon Sep 17 00:00:00 2001 From: Scott Gigante Date: Mon, 21 May 2018 23:24:30 -0400 Subject: [PATCH 5/7] add citation --- inst/CITATION | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 inst/CITATION diff --git a/inst/CITATION b/inst/CITATION new file mode 100644 index 0000000..c47a1b2 --- /dev/null +++ b/inst/CITATION @@ -0,0 +1,22 @@ +bibentry( + bibtype="Article", + title="Visualizing Transitions and Structure for High Dimensional Data Exploration", + author = c(person("Kevin R", "Moon"), + person("David", "van Dijk"), + person("Zheng", "Wang"), + person("Daniel", "Burkhardt"), + person("William", "Chen"), + person("Antonia", "van den Elzen"), + person("Matthew J", "Hirn"), + person("Ronald R", "Coifman"), + person("Natalia B", "Ivanova"), + person("Guy", "Wolf"), + person("Smita", "Krishnaswamy") + ), + year=2017, + url="https://www.biorxiv.org/content/early/2017/12/01/120378", + doi="10.1101/120378", + journal="bioRxiv", + publisher="Cold Spring Harbor Laboratory", + pages=120378 +) \ No newline at end of file From 7d55a6373de3007fc05d943a5f5df6bfaa26514d Mon Sep 17 00:00:00 2001 From: Scott Gigante Date: Mon, 21 May 2018 23:27:36 -0400 Subject: [PATCH 6/7] add dependencies and update namespace --- DESCRIPTION | 28 ++++++++++++++-------------- NAMESPACE | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index bdfc0d1..dde7dbf 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,30 +1,30 @@ Package: phater -Title: PHATE - Potential of Heat-diffusion for Affinity-based Transition Embedding +Title: PHATE - Potential of Heat-Diffusion for Affinity-Based Transition Embedding Version: 0.2 -Authors@R: person("Krishnan", "Srinivasan", email = "krishnan.srinivasan@yale.edu", role = c("aut", "cre")) +Authors@R: c(person("Krishnan", "Srinivasan", email = "krishnan.srinivasan@yale.edu", role = c("aut")), + person(given = 'Scott', family = 'Gigante', email = 'scott.gigante@yale.edu', role = 'cre', comment = c(ORCID = '0000-0002-4544-2764'))) Description: PHATE is a tool for visualizing high dimensional single-cell data with natural progressions or trajectories. PHATE uses a novel conceptual framework for learning and visualizing the manifold inherent to biological systems in which smooth transitions mark the progressions of cells from one state to another. To see how PHATE can be applied to single-cell RNA-seq datasets from hematopoietic - stem cells, human embryonic stem cells, and bone marrow samples, check out our preprint on BioRxiv. - http://biorxiv.org/content/early/2017/03/24/120378 -License: GPL-2 + stem cells, human embryonic stem cells, and bone marrow samples, check out our preprint on BioRxiv + at . +License: GPL-2 | file LICENSE Encoding: UTF-8 LazyData: true Depends: - R (>= 3.3.2), - ggplot2 + R (>= 3.3) Imports: - expm (>= 0.999), - smacof (>= 1.10-5), - Matrix (>= 1.2-12), - FNN (>= 1.1), - irlba (>= 2.3.1), - ggplot2 + methods, + stats, + graphics, + reticulate (>= 1.7), + Matrix (>= 1.2-12) Suggests: gridGraphics, cowplot, - tidyverse + tidyverse, + ggplot2 Roxygen: list(markdown = TRUE) RoxygenNote: 6.0.1 diff --git a/NAMESPACE b/NAMESPACE index fde663e..c668f3b 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -2,9 +2,9 @@ S3method(as.data.frame,phate) S3method(as.matrix,phate) -S3method(ggplot,phate) S3method(plot,phate) S3method(print,phate) S3method(summary,phate) +export(install.phate) export(library.size.normalize) export(phate) From 34542a2d1d455b1351b984f187b8329a6b25ad19 Mon Sep 17 00:00:00 2001 From: Scott Gigante Date: Tue, 22 May 2018 18:28:35 -0400 Subject: [PATCH 7/7] make CRAN checks pass --- .Rbuildignore | 9 +- DESCRIPTION | 10 +- NAMESPACE | 2 + R/phate.R | 49 ++++++--- README.Rmd | 47 +++++++-- README.md | 93 +++++++++++++----- {extdata => inst/extdata}/generate_treedata.R | 0 man/figures/README-adjust-parameters-1.png | Bin 7533 -> 6268 bytes man/figures/README-ggplot-1.png | Bin 9358 -> 8453 bytes man/figures/README-plot-results-1.png | Bin 10732 -> 10557 bytes man/ggplot.phate.Rd | 26 +++++ man/phate.Rd | 7 +- 12 files changed, 189 insertions(+), 54 deletions(-) rename {extdata => inst/extdata}/generate_treedata.R (100%) create mode 100644 man/ggplot.phate.Rd diff --git a/.Rbuildignore b/.Rbuildignore index beba061..19b4d9c 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -1,5 +1,5 @@ ^.*\.Rproj$ # Automatically added by RStudio, -^\.Rproj\.user$ # used for temporary files. +^\.Rproj\.user$ # used for temporary files. ^data-raw$ # raw data generation code ^README\.Rmd$ # An Rmarkdown file used to generate README.md ^cran-comments\.md$ # Comments for CRAN submission @@ -9,3 +9,10 @@ ^R/desktop\.ini$ # Windows detritus ^man/desktop\.ini$ # Windows detritus ^data/desktop\.ini$ # Windows detritus +^\.git$ # git repository +^desktop\.ini$ +^phater\.Rproj$ +^README\.Rmd$ +^data/desktop\.ini$ +^\.git$ +^\.git/*$ diff --git a/DESCRIPTION b/DESCRIPTION index dde7dbf..8849e40 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: phater Title: PHATE - Potential of Heat-Diffusion for Affinity-Based Transition Embedding -Version: 0.2 +Version: 0.2.5 Authors@R: c(person("Krishnan", "Srinivasan", email = "krishnan.srinivasan@yale.edu", role = c("aut")), person(given = 'Scott', family = 'Gigante', email = 'scott.gigante@yale.edu', role = 'cre', comment = c(ORCID = '0000-0002-4544-2764'))) Description: PHATE is a tool for visualizing high dimensional single-cell data @@ -8,7 +8,7 @@ Description: PHATE is a tool for visualizing high dimensional single-cell data for learning and visualizing the manifold inherent to biological systems in which smooth transitions mark the progressions of cells from one state to another. To see how PHATE can be applied to single-cell RNA-seq datasets from hematopoietic - stem cells, human embryonic stem cells, and bone marrow samples, check out our preprint on BioRxiv + stem cells, human embryonic stem cells, and bone marrow samples, check out our preprint on BioRxiv at . License: GPL-2 | file LICENSE Encoding: UTF-8 @@ -20,11 +20,11 @@ Imports: stats, graphics, reticulate (>= 1.7), - Matrix (>= 1.2-12) + Matrix (>= 1.2-12), + ggplot2 Suggests: gridGraphics, cowplot, - tidyverse, - ggplot2 + tidyverse Roxygen: list(markdown = TRUE) RoxygenNote: 6.0.1 diff --git a/NAMESPACE b/NAMESPACE index c668f3b..b91ad29 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -2,9 +2,11 @@ S3method(as.data.frame,phate) S3method(as.matrix,phate) +S3method(ggplot,phate) S3method(plot,phate) S3method(print,phate) S3method(summary,phate) export(install.phate) export(library.size.normalize) export(phate) +importFrom(ggplot2,ggplot) diff --git a/R/phate.R b/R/phate.R index 814e1b5..9d9dc04 100644 --- a/R/phate.R +++ b/R/phate.R @@ -50,8 +50,8 @@ #' @param plot.optimal.t boolean, optional, default: FALSE #' If TRUE, produce a plot showing the Von Neumann Entropy #' curve for automatic t selection. -#' @param verbose boolean, optional, default : TRUE -#' If TRUE, print verbose updates. +#' @param verbose `int` or `boolean`, optional (default : 1) +#' If `TRUE` or `> 0`, print verbose updates. #' @param n.jobs `int`, optional (default: 1) #' The number of jobs to use for the computation. #' If -1 all CPUs are used. If 1 is given, no parallel computing code is @@ -74,7 +74,7 @@ #' #' @examples #' if (reticulate::py_module_available("phate")) { -#' +#' #' # Load data #' data(tree.data) #' @@ -99,6 +99,7 @@ #' phate.tree2 <- phate(tree.data$data, t=150, init=phate.tree) #' # Extract the embedding matrix to use in downstream analysis #' embedding <- as.matrix(phate.tree2) +#' #' } #' @export phate <- function(data, ndim = 2, k = 15, @@ -108,7 +109,7 @@ phate <- function(data, ndim = 2, k = 15, init=NULL, mds.method = "metric", mds.dist.method = "euclidean", t.max=100, npca = 100, plot.optimal.t=FALSE, - verbose=TRUE, n.jobs=1, seed=NA, + verbose=1, n.jobs=1, seed=NA, # deprecated args, remove in v3 n.svd = NA, pca.method = NA, @@ -198,6 +199,10 @@ phate <- function(data, ndim = 2, k = 15, if (is.numeric(seed)) { seed <- as.integer(seed) } + if (is.numeric(verbose)) { + verbose <- as.integer(verbose) + } + data <- as.matrix(data) # store parameters params <- list("data" = data, "k" = k, "alpha" = alpha, "t" = t, "n.landmark" = n.landmark, "ndim" = ndim, @@ -244,7 +249,7 @@ phate <- function(data, ndim = 2, k = 15, operator <- pyphate$PHATE(n_components = ndim, k = k, a = alpha, - t = k, + t = t, alpha_decay = use.alpha, n_landmark = n.landmark, potential_method = potential.method, @@ -283,12 +288,12 @@ phate <- function(data, ndim = 2, k = 15, #' @param ... Arguments for plot() #' @examples #' if (reticulate::py_module_available("phate")) { -#' +#' #' library(graphics) #' data(tree.data) #' phate.tree <- phate(tree.data$data) #' plot(phate.tree, col=tree.data$branches) -#' +#' #' } #' @export plot.phate <- function(x, ...) { @@ -304,7 +309,7 @@ plot.phate <- function(x, ...) { #' @param ... Arguments for print() #' @examples #' if (reticulate::py_module_available("phate")) { -#' +#' #' data(tree.data) #' phate.tree <- phate(tree.data$data) #' print(phate.tree) @@ -314,7 +319,7 @@ plot.phate <- function(x, ...) { #' ## $params : list with elements (data, k, alpha, t, n.landmark, ndim, #' ## potential.method, npca, mds.method, #' ## knn.dist.method, mds.dist.method) -#' +#' #' } #' @export print.phate <- function(x, ...) { @@ -333,7 +338,7 @@ print.phate <- function(x, ...) { #' @param ... Arguments for summary() #' @examples #' if (reticulate::py_module_available("phate")) { -#' +#' #' data(tree.data) #' phate.tree <- phate(tree.data$data) #' summary(phate.tree) @@ -341,7 +346,7 @@ print.phate <- function(x, ...) { #' ## k = 5, alpha = NA, t = 58 #' ## Data: (3000, 100) #' ## Embedding: (3000, 2) -#' +#' #' } #' @export summary.phate <- function(object, ...) { @@ -376,4 +381,24 @@ as.matrix.phate <- function(x, ...) { #' @export as.data.frame.phate <- function(x, ...) { as.data.frame(as.matrix(x), ...) -} \ No newline at end of file +} + +#' Convert a PHATE object to a data.frame for ggplot +#' +#' Passes the embedding matrix to ggplot with column names PHATE1 and PHATE2 +#' @importFrom ggplot2 ggplot +#' @param data A fitted PHATE object +#' @param ... Arguments for ggplot() +#' @examples +#' if (reticulate::py_module_available("phate") && require(ggplot2)) { +#' +#' data(tree.data) +#' phate.tree <- phate(tree.data$data) +#' ggplot(phate.tree, aes(x=PHATE1, y=PHATE2, color=tree.data$branches)) + +#' geom_point() +#' +#' } +#' @export +ggplot.phate <- function(data, ...) { + ggplot2::ggplot(as.data.frame(data), ...) +} diff --git a/README.Rmd b/README.Rmd index aee76cc..3f26503 100644 --- a/README.Rmd +++ b/README.Rmd @@ -1,4 +1,5 @@ --- +title : phater v0.2.5 output: github_document --- @@ -13,8 +14,6 @@ knitr::opts_chunk$set( ) ``` -# phater - This R package provides an implementation of the [PHATE dimensionality reduction and visualization method](https://www.biorxiv.org/content/early/2017/12/01/120378). @@ -24,33 +23,61 @@ For our Python and Matlab implementations, please see [KrishnaswamyLab/PHATE](ht ## Installation -#### Installation with `devtools` +In order to use PHATE in R, you must also install the Python package. + +#### Installation from CRAN and PyPi -The R version of PHATE can be installed directly from R with `devtools`: +Install `phater` from CRAN by running the following code in R: + +```{r cran-install, eval = FALSE} +install.packages("phater") +``` + +Install `phate` in Python by running the following code from a terminal: + +```{bash pypi-install, eval = FALSE} +pip install --user phate +``` + +#### Installation with `devtools` and `reticulate` + +The development version of PHATE can be installed directly from R with `devtools`: ```{r github-install, eval = FALSE} if (!suppressWarnings(require(devtools))) install.packages("devtools") devtools::install_github("KrishnaswamyLab/phater") ``` +If you have the development version of `reticulate`, you can also install `phate` in Python by running the following code in R: + +```{r reticulate-install, eval = FALSE} +devtools::install_github("rstudio/reticulate") +reticulate::py_install("phate") +``` + + #### Installation from source -1. The R version of PHATE can be accessed [here](https://github.com/KrishnaswamyLab/phater), or by running the following in a terminal: +The latest source version of PHATE can be accessed by running the following in a terminal: -```{bash, eval=FALSE} +```{bash install-source, eval=FALSE} git clone --recursive git://github.com/SmitaKrishnaswamy/PHATE.git cd PHATE/phater R CMD INSTALL +cd ../Python +python setup.py install --user ``` -2. If the `phater` folder is empty, you have may forgotten to use the `--recursive` option for `git clone`. You can rectify this by running the following in a terminal: +If the `phater` folder is empty, you have may forgotten to use the `--recursive` option for `git clone`. You can rectify this by running the following in a terminal: -```{bash, eval=FALSE} +```{bash fix-submodule, eval=FALSE} cd PHATE git submodule init git submodule update cd phater R CMD INSTALL +cd ../Python +python setup.py install --user ``` ## Tutorial @@ -80,11 +107,11 @@ palette(rainbow(10)) plot(tree.phate, col = tree.data$branches) ``` -Good news! Our branches look nice. However, all of the interesting activity seems to be concentrated into one region of the plot - in this case we should try the square root potential instead. We can also try increasing `t` to make the structure a little clearer - in this case, because synthetic data in unusually structured, we can use a very large value, like 120, but in biological data the automatic `t` selection is generally very close to ideal. Note here that if we pass our previous result in with the argument `init`, we won't have to recompute the diffusion operator. +Good news! Our branches separate nicely. However, most of the interesting activity seems to be concentrated into one region of the plot - in this case we should try the square root potential instead. We can also try increasing `t` to make the structure a little clearer - in this case, because synthetic data in unusually structured, we can use a very large value, like 200, but in biological data the automatic `t` selection is generally very close to ideal. Note here that if we pass our previous result in with the argument `init`, we won't have to recompute the diffusion operator. ```{r adjust-parameters} # runs phate with different parameters -tree.phate <- phate(tree.data$data, potential.method='sqrt', t=90, init=tree.phate) +tree.phate <- phate(tree.data$data, potential.method='sqrt', t=200, init=tree.phate) # plot embedding palette(rainbow(10)) plot(tree.phate, col = tree.data$branches) diff --git a/README.md b/README.md index 63029d5..e913187 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,71 @@ +phater v0.2.5 +================ -phater -====== -This R package provides an implementation of the [PHATE dimensionality reduction and visualization method](https://www.biorxiv.org/content/early/2017/12/01/120378). +This R package provides an implementation of the [PHATE dimensionality +reduction and visualization +method](https://www.biorxiv.org/content/early/2017/12/01/120378). -For a thorough overview of the PHATE visualization method, please see the [bioRxiv preprint](https://www.biorxiv.org/content/early/2017/12/01/120378) +For a thorough overview of the PHATE visualization method, please see +the [bioRxiv +preprint](https://www.biorxiv.org/content/early/2017/12/01/120378) -For our Python and Matlab implementations, please see [KrishnaswamyLab/PHATE](https://github.com/KrishnaswamyLab/PHATE). +For our Python and Matlab implementations, please see +[KrishnaswamyLab/PHATE](https://github.com/KrishnaswamyLab/PHATE). -Installation ------------- +## Installation -#### Installation with `devtools` +In order to use PHATE in R, you must also install the Python package. -The R version of PHATE can be installed directly from R with `devtools`: +#### Installation from CRAN and PyPi + +Install `phater` from CRAN by running the following code in R: + +``` r +install.packages("phater") +``` + +Install `phate` in Python by running the following code from a terminal: + +``` bash +pip install --user phate +``` + +#### Installation with `devtools` and `reticulate` + +The development version of PHATE can be installed directly from R with +`devtools`: ``` r if (!suppressWarnings(require(devtools))) install.packages("devtools") devtools::install_github("KrishnaswamyLab/phater") ``` +If you have the development version of `reticulate`, you can also +install `phate` in Python by running the following code in R: + +``` r +devtools::install_github("rstudio/reticulate") +reticulate::py_install("phate") +``` + #### Installation from source -1. The R version of PHATE can be accessed [here](https://github.com/KrishnaswamyLab/phater), or by running the following in a terminal: +The latest source version of PHATE can be accessed by running the +following in a terminal: ``` bash git clone --recursive git://github.com/SmitaKrishnaswamy/PHATE.git cd PHATE/phater R CMD INSTALL +cd ../Python +python setup.py install --user ``` -1. If the `phater` folder is empty, you have may forgotten to use the `--recursive` option for `git clone`. You can rectify this by running the following in a terminal: +If the `phater` folder is empty, you have may forgotten to use the +`--recursive` option for `git clone`. You can rectify this by +running the following in a terminal: ``` bash cd PHATE @@ -39,23 +73,26 @@ git submodule init git submodule update cd phater R CMD INSTALL +cd ../Python +python setup.py install --user ``` -Tutorial --------- +## Tutorial -This is a basic example running `phate` on a highly branched example dataset that is included with the package. First, let's examine it with PCA. +This is a basic example running `phate` on a highly branched example +dataset that is included with the package. First, let’s examine it with +PCA. ``` r library(phater) -#> Loading required package: ggplot2 data(tree.data) plot(prcomp(tree.data$data)$x, col=tree.data$branches) ``` -Now we run PHATE on the data. We'll just go ahead and try with the default parameters. +Now we run PHATE on the data. We’ll just go ahead and try with the +default parameters. ``` r # runs phate @@ -67,7 +104,7 @@ summary(tree.phate) #> Embedding: (3000, 2) ``` -Let's plot the results. +Let’s plot the results. ``` r # plot embedding @@ -77,11 +114,19 @@ plot(tree.phate, col = tree.data$branches) -Good news! Our branches look nice. However, all of the interesting activity seems to be concentrated into one region of the plot - in this case we should try the square root potential instead. We can also try increasing `t` to make the structure a little clearer - in this case, because synthetic data in unusually structured, we can use a very large value, like 120, but in biological data the automatic `t` selection is generally very close to ideal. Note here that if we pass our previous result in with the argument `init`, we won't have to recompute the diffusion operator. +Good news\! Our branches separate nicely. However, most of the +interesting activity seems to be concentrated into one region of the +plot - in this case we should try the square root potential instead. We +can also try increasing `t` to make the structure a little clearer - in +this case, because synthetic data in unusually structured, we can use a +very large value, like 200, but in biological data the automatic `t` +selection is generally very close to ideal. Note here that if we pass +our previous result in with the argument `init`, we won’t have to +recompute the diffusion operator. ``` r # runs phate with different parameters -tree.phate <- phate(tree.data$data, potential.method='sqrt', t=90, init=tree.phate) +tree.phate <- phate(tree.data$data, potential.method='sqrt', t=200, init=tree.phate) # plot embedding palette(rainbow(10)) plot(tree.phate, col = tree.data$branches) @@ -89,17 +134,19 @@ plot(tree.phate, col = tree.data$branches) -We can also pass the PHATE object directly to `ggplot`, if it is installed. +We can also pass the PHATE object directly to `ggplot`, if it is +installed. ``` r library(ggplot2) +#> Warning: package 'ggplot2' was built under R version 3.4.4 ggplot(tree.phate, aes(x=PHATE1, y=PHATE2, color=tree.data$branches)) + geom_point() ``` -Issues ------- +## Issues -Please let us know of any issues at the [GitHub repo](https://github.com/KrishnaswamyLab/phater/issues) +Please let us know of any issues at the [GitHub +repo](https://github.com/KrishnaswamyLab/phater/issues) diff --git a/extdata/generate_treedata.R b/inst/extdata/generate_treedata.R similarity index 100% rename from extdata/generate_treedata.R rename to inst/extdata/generate_treedata.R diff --git a/man/figures/README-adjust-parameters-1.png b/man/figures/README-adjust-parameters-1.png index 4088b2ac94360b39ac2c8b4e8527b65cdfc4bd38..5c3c12e82f2b73b25e805fc9c1d002a967162a9f 100644 GIT binary patch literal 6268 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 Wbk0eKt^D|l;ArP&TWx*z#=imNH1~%9 literal 7533 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 diff --git a/man/figures/README-ggplot-1.png b/man/figures/README-ggplot-1.png index 52b4e00d4150f58abf5361df6c36d5e6118cabf6..4e074e3fa626aa940bf9166e173d9a4a37a3ef98 100644 GIT binary patch literal 8453 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 literal 9358 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 CfAIAH diff --git a/man/figures/README-plot-results-1.png b/man/figures/README-plot-results-1.png index 3be1dc75f82dd0cd6ed4977f005afccdf1ee0335..a54c7860b22d66b6d9bc1f349a873e2638a62c42 100644 GIT binary patch delta 9979 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 delta 10152 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 0}, print verbose updates.} \item{n.jobs}{\code{int}, optional (default: 1) The number of jobs to use for the computation. @@ -140,5 +140,6 @@ if (require(ggplot2)) { phate.tree2 <- phate(tree.data$data, t=150, init=phate.tree) # Extract the embedding matrix to use in downstream analysis embedding <- as.matrix(phate.tree2) + } }