Build a shared or k-nearest-neighbors graph of observations for downstream community detection.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
makeSNNGraph( x, k = 10, type = c("rank", "number", "jaccard"), BNPARAM = KmknnParam(), BPPARAM = SerialParam() ) makeKNNGraph( x, k = 10, directed = FALSE, BNPARAM = KmknnParam(), BPPARAM = SerialParam() ) neighborsToSNNGraph(indices, type = c("rank", "number", "jaccard")) neighborsToKNNGraph(indices, directed = FALSE)
A matrix-like object containing expression values for each observation (row) and dimension (column).
An integer scalar specifying the number of nearest neighbors to consider during graph construction.
A string specifying the type of weighting scheme to use for shared neighbors.
A BiocNeighborParam object specifying the nearest neighbor algorithm.
A BiocParallelParam object to use for parallel processing.
A logical scalar indicating whether the output of
An integer matrix where each row corresponds to an observation
and contains the indices of the
makeSNNGraph method builds a shared nearest-neighbour graph using observations as nodes.
For each observation, its
k nearest neighbours are identified using the
based on distances between their expression profiles (Euclidean by default).
An edge is drawn between all pairs of observations that share at least one neighbour,
weighted by the characteristics of the shared nearest neighbors:
type="rank", the weighting scheme defined by Xu and Su (2015) is used.
The weight between two nodes is k - r/2 where r is the smallest sum of ranks for any shared neighboring node.
For example, if one node was the closest neighbor of each of two nodes, the weight between the two latter nodes would be k - 1.
For the purposes of this ranking, each node has a rank of zero in its own nearest-neighbor set.
More shared neighbors, or shared neighbors that are close to both observations, will generally yield larger weights.
type="number", the weight between two nodes is simply the number of shared nearest neighbors between them.
The weight can range from zero to k + 1, as the node itself is included in its own nearest-neighbor set.
This is a simpler scheme that is also slightly faster but does not account for the ranking of neighbors within each set.
type="jaccard", the weight between two nodes is the Jaccard similarity between the two sets of neighbors for those nodes.
This weight can range from zero to 1, and is a monotonic transformation of the weight used by
It is provided for consistency with other clustering algorithms such as those in seurat.
The aim is to use the SNN graph to perform clustering of observations via community detection algorithms in the igraph package. This is faster and more memory efficient than hierarchical clustering for large numbers of observations. In particular, it avoids the need to construct a distance matrix for all pairs of observations. Only the identities of nearest neighbours are required, which can be obtained quickly with methods in the BiocNeighbors package.
The choice of
k controls the connectivity of the graph and the resolution of community detection algorithms.
Smaller values of
k will generally yield smaller, finer clusters, while increasing
k will increase the connectivity of the graph and make it more difficult to resolve different communities.
The value of
k can be roughly interpreted as the anticipated size of the smallest subpopulation.
If a subpopulation in the data has fewer than
buildKNNGraph will forcibly construct edges between observations in that subpopulation and observations in other subpopulations.
This increases the risk that the subpopulation will not form its own cluster as it is more interconnected with the rest of the observations in the dataset.
Note that the setting of
k here is slightly different from that used in SNN-Cliq.
The original implementation considers each observation to be its first nearest neighbor that contributes to
k nearest neighbours refers to the number of other observations.
makeKNNGraph method builds a simpler k-nearest neighbour graph.
Observations are again nodes, and edges are drawn between each observation and its k-nearest neighbours.
No weighting of the edges is performed.
In theory, these graphs are directed as nearest neighour relationships may not be reciprocal.
However, by default,
directed=FALSE such that an undirected graph is returned.
neighborsToKNNGraph functions operate directly on a matrix of nearest neighbor indices,
obtained using functions like
This may be useful for constructing a graph from precomputed nearest-neighbor search results.
Note that the user is responsible for ensuring that the indices are valid (i.e.,
range(indices) is positive and no greater than
A graph where nodes are cells and edges represent connections between nearest neighbors.
buildSNNGraph, these edges are weighted by the number of shared nearest neighbors.
buildKNNGraph, edges are not weighted but may be directed if
Aaron Lun, with KNN code contributed by Jonathan Griffiths.
Xu C and Su Z (2015). Identification of cell types from single-cell transcriptomes using a novel clustering method. Bioinformatics 31:1974-80
make_graph for details on the graph output object.
findKNN for specifics of the nearest-neighbor search.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
m <- matrix(rnorm(10000), ncol=10) g <- makeSNNGraph(m) clusters <- igraph::cluster_fast_greedy(g)$membership table(clusters) # Any clustering method from igraph can be used: clusters <- igraph::cluster_walktrap(g)$membership table(clusters) # Smaller 'k' usually yields finer clusters: g <- makeSNNGraph(m, k=5) clusters <- igraph::cluster_walktrap(g)$membership table(clusters)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.