testNhoods {miloR} | R Documentation

## Perform differential neighbourhood abundance testing

### Description

This will perform differential neighbourhood abundance testing after cell counting.

### Arguments

`x` | A `Milo` object with a non-empty `nhoodCounts` slot.
`design` | A `formula` or `model.matrix` object describing the experimental design for differential abundance testing. The last component of the formula or last column of the model matrix are by default the test variable. This behaviour can be overridden by setting the `model.contrasts` argument
`design.df` | A `data.frame` containing meta-data to which `design` refers to
`min.mean` | A scalar used to threshold neighbourhoods on the minimum average cell counts across samples.
`model.contrasts` | A string vector that defines the contrasts used to perform DA testing.
`fdr.weighting` | The spatial FDR weighting scheme to use. Choice from max, neighbour-distance, graph-overlap or k-distance (default). If `none` is passed no spatial FDR correction is performed and returns a vector of NAs.
`robust` | If robust=TRUE then this is passed to edgeR and limma which use a robust estimation for the global quasilikelihood dispersion distribution. See `edgeR` and Phipson et al, 2013 for details.
`norm.method` | A character scalar, either `"logMS"`, `"TMM"` or `"RLE"`. The `"logMS"` method normalises the counts across samples using the log columns sums of the count matrix as a model offset. `"TMM"` uses the trimmed mean of M-values normalisation as described in Robinson & Oshlack, 2010, whilst `"RLE"` uses the relative log expression method by Anders & Huber, 2010, to compute normalisation factors relative to a reference computed from the geometric mean across samples. The latter methods provides a degree of robustness against false positives when there are very large compositional differences between samples.
`reduced.dim` | A character scalar referring to the reduced dimensional slot used to compute distances for the spatial FDR. This should be the same as used for graph building.

### Details

This function wraps up several steps of differential abundance testing using the `edgeR` functions. These could be performed separately for users who want to exercise more contol over their DA testing. By default this function sets the `lib.sizes` to the colSums(x), and uses the Quasi-Likelihood F-test in `glmQLFTest` for DA testing. FDR correction is performed separately as the default multiple-testing correction is inappropriate for neighbourhoods with overlapping cells.

### Value

A `data.frame` of model results, which contain:

`logFC`:

  Numeric, the log fold change between conditions, or for an ordered/continous variable the per-unit change in (normalized) cell counts per unit-change in experimental variable.

`logCPM`:

  Numeric, the log counts per million (CPM), which equates to the average log normalized cell counts across all samples.

`F`:

  Numeric, the F-test statistic from the quali-likelihood F-test implemented in `edgeR`.

`PValue`:

  Numeric, the unadjusted p-value from the quasi-likelihood F-test.

`FDR`:

  Numeric, the Benjamini & Hochberg false discovery weight computed from `p.adjust`.

`Nhood`:

  Numeric, a unique identifier corresponding to the specific graph neighbourhood.

`SpatialFDR`:

  Numeric, the weighted FDR, computed to adjust for spatial graph overlaps between neighbourhoods. For details see graphSpatialFDR.

### Author(s)

Mike Morgan

### Examples

    library(SingleCellExperiment)
    ux.1 <- matrix(rpois(12000, 5), ncol=400)
    ux.2 <- matrix(rpois(12000, 4), ncol=400)
    ux <- rbind(ux.1, ux.2)
    vx <- log2(ux + 1)
    pca <- prcomp(t(vx))

    sce <- SingleCellExperiment(assays=list(counts=ux, logcounts=vx),
                                reducedDims=SimpleList(PCA=pca$x))

    milo <- Milo(sce)
    milo <- buildGraph(milo, k=20, d=10, transposed=TRUE)
    milo <- makeNhoods(milo, k=20, d=10, prop=0.3)
    milo <- calcNhoodDistance(milo, d=10)

    cond <- rep("A", ncol(milo))
    cond.a <- sample(1:ncol(milo), size=floor(ncol(milo)*0.25))
    cond.b <- setdiff(1:ncol(milo), cond.a)
    cond[cond.b] <- "B"
    meta.df <- data.frame(Condition=cond, Replicate=c(rep("R1", 132), rep("R2", 132), rep("R3", 136)))
    meta.df$SampID <- paste(meta.df$Condition, meta.df$Replicate, sep="_")
    milo <- countCells(milo, meta.data=meta.df, samples="SampID")

    test.meta <- data.frame("Condition"=c(rep("A", 3), rep("B", 3)), "Replicate"=rep(c("R1", "R2", "R3"), 2))
    test.meta$Sample <- paste(test.meta$Condition, test.meta$Replicate, sep="_")
    rownames(test.meta) <- test.meta$Sample
    da.res <- testNhoods(milo, design=~Condition, design.df=test.meta[colnames(nhoodCounts(milo)), ], norm.method="TMM")
    da.res

[Package miloR version 1.2.0 Index]