OSCR

Regulators of interferon-responsive microglia uncovered by Genome-wide CRISPRi screening.

Code ↔ Paper

5 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 5 matches
  1. [1] § Methods › RNA-sequencing ↔ R/wilcoxauc.R, lines 1–127 · score 0.75 · Wilcoxon rank sum, Benjamini Hochberg, Seurat, assay, RNA, cells
  2. [2] § Methods › RNA-sequencing ↔ R/scoring_de.R, lines 478–534 · score 0.73 · negative binomial, Mixscale scores, perturbation scores, regression, weight, vectors
  3. [3] § Methods › RNA-sequencing ↔ R/differential_expr_wilcoxon_BH.R, lines 3–25 · score 0.68 · Benjamini Hochberg correction, Seurat, Wilcoxon, DEGs, presto, assay
  4. [4] § Methods › CRISPRi screen analysis ↔ R/differential_expr_wilcoxon_BH.R, lines 3–25 · score 0.59 · Benjamini Hochberg, fold change, cutoff, libraries, RNAs, gene
  5. [5] § Methods › CRISPRi screen analysis ↔ R/wilcoxauc.R, lines 1–127 · score 0.57 · Benjamini Hochberg, fold change, Raw, RNAs, gene

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

R · 395 lines · 15 KB · no license · 2 matches

  1. #' Fast Wilcoxon rank-sum test and auROC across groups
  2. #'
  3. #' For every (feature, group) pair, computes the Wilcoxon rank-sum
  4. #' statistic comparing observations in that group against all other
  5. #' observations, and the area under the ROC curve as a measure of
  6. #' separability. P-values come from the standard Gaussian approximation
  7. #' to the U statistic with a tie correction. Returns one row per
  8. #' (feature, group) with effect-size and percent-expressed columns
  9. #' alongside the test statistics.
  10. #'
  11. #' Designed to be fast enough to run on whole-genome × hundred-thousand-
  12. #' cell single-cell matrices in seconds. Sparse `dgCMatrix` inputs are
  13. #' processed without densification. Convenience dispatchers extract the
  14. #' counts matrix and group labels from `Seurat` and
  15. #' `SingleCellExperiment` objects. See the `getting-started` vignette
  16. #' for an end-to-end example on a real dataset.
  17. #'
  18. #' @param X Input data. One of:
  19. #' \itemize{
  20. #' \item a numeric feature-by-observation matrix or `data.frame`,
  21. #' \item a sparse `dgCMatrix` of the same shape,
  22. #' \item a disk-backed `DelayedMatrix` (e.g. HDF5-backed, from the
  23. #' DelayedArray / HDF5Array packages), which is processed in feature
  24. #' blocks so the whole matrix never has to be loaded in memory,
  25. #' \item any other matrix-like class with an `as(., "dgCMatrix")`
  26. #' coercion method (e.g. BPCells), which is converted up front,
  27. #' \item a `Seurat` (v3+) object,
  28. #' \item a `SingleCellExperiment` object.
  29. #' }
  30. #' `X` must not contain `NA` values. Unlike [stats::wilcox.test()],
  31. #' which drops missing values per observation, `wilcoxauc()` errors on
  32. #' `NA` input rather than returning silently incorrect results; remove
  33. #' or impute missing values first.
  34. #' @param y For matrix input, a character/factor vector of group labels
  35. #' with length equal to `ncol(X)`. Ignored for `Seurat` /
  36. #' `SingleCellExperiment` input (use `group_by` instead).
  37. #' @param groups_use Optional character vector restricting the test to
  38. #' a subset of groups in `y` (or `group_by`). Default `NULL` tests
  39. #' every group.
  40. #' @param group_by For `Seurat` and `SingleCellExperiment` input, name
  41. #' of the metadata column that holds the group labels (e.g.
  42. #' `"cluster"`). For `Seurat`, defaults to `Idents(X)`.
  43. #' @param assay For `Seurat`, the layer name within the selected
  44. #' assay (e.g. `"data"`, `"counts"`, `"scale.data"`). For
  45. #' `SingleCellExperiment`, the assay name (e.g. `"logcounts"`,
  46. #' `"counts"`). Defaults pick a sensible value per input class.
  47. #' @param seurat_assay For `Seurat` input, the name of the assay to
  48. #' pull from (e.g. `"RNA"`). Default `"RNA"`.
  49. #' @param verbose Logical. Print warnings and informational messages.
  50. #' Default `TRUE`.
  51. #' @param nthreads Number of threads for the per-feature ranking of sparse
  52. #' (`dgCMatrix`) input. Default `1` (serial). Values above `1` split the
  53. #' ranking across threads; the result is identical regardless of the
  54. #' thread count. Only sparse input is parallelized -- dense matrix and
  55. #' `data.frame` input are always processed serially. When running under
  56. #' `R CMD check` or on CRAN, keep this at the default so no more than two
  57. #' cores are used.
  58. #' @param transposed Set to `TRUE` when your observations (cells,
  59. #' samples) are in the **rows** of `X` and the features in the
  60. #' columns -- i.e. `X` is the transpose of the default
  61. #' features-by-observations layout. The test then runs directly on
  62. #' that layout without materializing a transposed copy, which saves
  63. #' time and memory on large matrices. Same convention as the
  64. #' `transposed` argument of scater's `calculatePCA()` and
  65. #' `calculateUMAP()`. Only applies to matrix-like input (the `Seurat`
  66. #' / `SingleCellExperiment` dispatchers always extract
  67. #' features-by-observations). Default `FALSE`.
  68. #' @param ... Passed to the input-specific method.
  69. #'
  70. #' @examples
  71. #' ## generate a tiny toy dataset
  72. #' set.seed(42)
  73. #' exprs <- matrix(rpois(25 * 150, lambda = 2), nrow = 25,
  74. #' dimnames = list(paste0("G", 1:25), NULL))
  75. #' y <- rep(c("A", "B", "C"), each = 50)
  76. #'
  77. #' ## on a dense matrix
  78. #' head(wilcoxauc(exprs, y))
  79. #'
  80. #' ## restrict the comparison to a subset of groups
  81. #' head(wilcoxauc(exprs, y, c('A', 'B')))
  82. #'
  83. #' ## on a sparse matrix
  84. #' exprs_sparse <- as(exprs, 'dgCMatrix')
  85. #' head(wilcoxauc(exprs_sparse, y))
  86. #'
  87. #' ## on a Seurat object (>= v3)
  88. #' if (requireNamespace("Seurat", quietly = TRUE) &&
  89. #' packageVersion("Seurat") >= "3.0") {
  90. #' object_seurat <- toy_seurat()
  91. #' head(wilcoxauc(object_seurat, 'cell_type'))
  92. #' }
  93. #'
  94. #' ## on a SingleCellExperiment object
  95. #' if (requireNamespace("SingleCellExperiment", quietly = TRUE)) {
  96. #' object_sce <- toy_sce()
  97. #' head(wilcoxauc(object_sce, 'cell_type'))
  98. #' }
  99. #'
  100. #' @return table with the following columns:
  101. #' \itemize{
  102. #' \item \strong{feature} - feature name (e.g. gene name).
  103. #' \item \strong{group} - group name.
  104. #' \item \strong{avgExpr} - mean value of feature in group.
  105. #' \item \strong{logFC} - difference of mean feature values between
  106. #' observations in the group vs out of the group. When the input is
  107. #' log-transformed expression (e.g. Seurat's `"data"` layer or
  108. #' `logcounts`), this difference of means is a log fold change. On raw
  109. #' (untransformed) values it is a plain difference of means, not a fold
  110. #' change.
  111. #' \item \strong{statistic} - Wilcoxon rank sum U statistic.
  112. #' \item \strong{auc} - area under the receiver operator curve.
  113. #' \item \strong{pval} - nominal p value.
  114. #' \item \strong{padj} - Benjamini-Hochberg adjusted p value.
  115. #' \item \strong{pct_in} - Percent of observations in the group with non-zero
  116. #' feature value.
  117. #' \item \strong{pct_out} - Percent of observations out of the group with
  118. #' non-zero feature value.
  119. #' }
  120. #'
  121. #' @seealso [top_markers()] to summarize markers per group;
  122. #' [pseudobulk_deseq2()] for a count-based pseudobulk alternative.
  123. #'
  124. #' @export
  125. wilcoxauc <- function(X, ...) {
  126. UseMethod("wilcoxauc")
  127. }
  128. #' @rdname wilcoxauc
  129. #' @export
  130. wilcoxauc.seurat <- function(X, ...) {
  131. stop("wilcoxauc only implemented for Seurat Version 3, please upgrade to
  132. run.")
  133. }
  134. #' @rdname wilcoxauc
  135. #' @export
  136. wilcoxauc.Seurat <- function(
  137. X,
  138. group_by = NULL,
  139. assay = "data",
  140. groups_use = NULL,
  141. seurat_assay = "RNA",
  142. ...
  143. ) {
  144. requireNamespace("Seurat")
  145. X_matrix <- Seurat::GetAssayData(X, assay = seurat_assay, layer = assay)
  146. if (is.null(group_by)) {
  147. y <- Seurat::Idents(X)
  148. } else {
  149. y <- Seurat::FetchData(X, group_by) %>% unlist %>% as.character()
  150. }
  151. wilcoxauc(X_matrix, y, groups_use, ...)
  152. }
  153. #' @rdname wilcoxauc
  154. #' @export
  155. wilcoxauc.SingleCellExperiment <- function(
  156. X, group_by = NULL, assay = NULL, groups_use = NULL, ...
  157. ) {
  158. if (is.null(group_by)) {
  159. stop("Must specify group_by with SingleCellExperiment")
  160. } else if (!group_by %in% names(SummarizedExperiment::colData(X))) {
  161. stop("group_by value is not defined in colData.")
  162. }
  163. y <- SummarizedExperiment::colData(X)[[group_by]]
  164. if (is.null(assay)) {
  165. standard_assays <- c(
  166. "normcounts", "logcounts", "cpm", "tpm",
  167. "weights", "counts")
  168. available_assays <- intersect(
  169. standard_assays,
  170. SummarizedExperiment::assayNames(X)
  171. )
  172. if (length(available_assays) == 0) {
  173. stop("No assays in SingleCellExperiment object")
  174. } else {
  175. assay <- available_assays[1]
  176. }
  177. }
  178. X_matrix <- SummarizedExperiment::assay(X, assay)
  179. wilcoxauc(X_matrix, y, groups_use, ...)
  180. }
  181. #' @rdname wilcoxauc
  182. #' @export
  183. wilcoxauc.default <- function(X, y, groups_use = NULL, verbose = TRUE,
  184. nthreads = 1, transposed = FALSE, ...) {
  185. ## Check and possibly correct input values
  186. if (is(X, "dgeMatrix")) X <- as.matrix(X)
  187. if (is(X, "data.frame")) X <- as.matrix(X)
  188. if (is(X, "dgTMatrix")) X <- as(X, "dgCMatrix")
  189. if (is(X, "TsparseMatrix")) X <- as(X, "dgCMatrix")
  190. ## Other matrix-like classes (e.g. BPCells): try a sparse coercion so
  191. ## that anything with an as(., "dgCMatrix") method just works (#26).
  192. if (!is.matrix(X) && !is(X, "dgCMatrix") &&
  193. !inherits(X, "DelayedMatrix")) {
  194. X_class <- class(X)[1]
  195. X <- tryCatch(
  196. as(X, "dgCMatrix"),
  197. error = function(e) {
  198. stop(
  199. "wilcoxauc() does not know how to handle input of ",
  200. "class '", X_class, "'. Convert it to a matrix or ",
  201. "dgCMatrix first.",
  202. call. = FALSE
  203. )
  204. }
  205. )
  206. }
  207. n_obs_dim <- if (transposed) nrow(X) else ncol(X)
  208. if (n_obs_dim != length(y)) {
  209. ## If the other dimension matches length(y), the matrix is most
  210. ## likely in the other orientation: say exactly what to change.
  211. other_dim <- if (transposed) ncol(X) else nrow(X)
  212. hint <- ""
  213. if (other_dim == length(y)) {
  214. hint <- if (transposed) {
  215. paste0(
  216. "\nX has length(y) columns: if it is the default ",
  217. "features x observations layout, drop transposed = TRUE."
  218. )
  219. } else {
  220. paste0(
  221. "\nX has length(y) rows: if your matrix is ",
  222. "observations x features (samples in rows), call ",
  223. "wilcoxauc(X, y, transposed = TRUE)."
  224. )
  225. }
  226. }
  227. stop(
  228. "The number of observations in X (",
  229. if (transposed) "rows" else "columns", " = ", n_obs_dim,
  230. ") does not match length(y) (", length(y), ").", hint,
  231. call. = FALSE
  232. )
  233. }
  234. if (!is.null(groups_use)) {
  235. idx_use <- which(y %in% intersect(groups_use, y))
  236. y <- y[idx_use]
  237. X <- if (transposed) X[idx_use, ] else X[, idx_use]
  238. }
  239. y <- factor(y)
  240. idx_use <- which(!is.na(y))
  241. if (length(idx_use) < length(y)) {
  242. y <- y[idx_use]
  243. X <- if (transposed) X[idx_use, ] else X[, idx_use]
  244. if (verbose)
  245. message("Removing NA values from labels")
  246. }
  247. group.size <- as.numeric(table(y))
  248. if (length(group.size[group.size > 0]) < 2) {
  249. stop("Must have at least 2 groups defined.")
  250. }
  251. ## Feature names live on rows normally, on columns for transposed input.
  252. if (transposed) {
  253. if (is.null(colnames(X))) {
  254. colnames(X) <- paste0("Feature", seq_len(ncol(X)))
  255. }
  256. features <- colnames(X)
  257. } else {
  258. if (is.null(rownames(X))) {
  259. rownames(X) <- paste0("Feature", seq_len(nrow(X)))
  260. }
  261. features <- rownames(X)
  262. }
  263. ## Missing values in X would silently corrupt the ranks (the ranking
  264. ## code sorts values and cannot drop NAs the way stats::wilcox.test
  265. ## does), so fail loudly instead of returning wrong numbers. See #25.
  266. ## DelayedMatrix input is checked per realized block instead, to avoid
  267. ## an extra full pass over the on-disk data.
  268. if (!inherits(X, "DelayedMatrix") && anyNA(X)) {
  269. stop_wilcox_na()
  270. }
  271. ## Compute primary statistics. Group sizes are computed once here (via
  272. ## tabulate) and reused throughout instead of re-running table(y) at every
  273. ## use site.
  274. ngroups <- nlevels(y)
  275. group.size <- as.numeric(tabulate(y, ngroups))
  276. n_obs <- length(y)
  277. grp0 <- as.integer(y) - 1L
  278. n1n2 <- group.size * (n_obs - group.size)
  279. if (inherits(X, "DelayedMatrix")) {
  280. ## Disk-backed input (e.g. HDF5): realize and process feature
  281. ## blocks so the whole matrix never has to fit in memory (#26).
  282. st <- wilcox_stats_delayed(
  283. X, y, grp0, ngroups, group.size, n_obs,
  284. nthreads, transposed, verbose
  285. )
  286. } else {
  287. st <- wilcox_stats_matrix(
  288. X, y, grp0, ngroups, group.size, n_obs, nthreads, transposed
  289. )
  290. }
  291. ustat <- st$ustat
  292. group_sums <- st$group_sums
  293. group_nnz <- st$group_nnz
  294. ties <- st$ties
  295. auc <- t(ustat / n1n2)
  296. pvals <- compute_pval(ustat, ties, n_obs, n1n2)
  297. fdr <- apply(pvals, 2, function(x) p.adjust(x, "BH"))
  298. ### Auxiliary Statistics (AvgExpr, PctIn, LFC, etc)
  299. group_pct <- sweep(group_nnz, 1, group.size, "/") %>% t()
  300. group_pct_out <- -group_nnz %>%
  301. sweep(2, colSums(group_nnz), "+") %>%
  302. sweep(1, n_obs - group.size, "/") %>% t()
  303. group_means <- sweep(group_sums, 1, group.size, "/") %>% t()
  304. cs <- colSums(group_sums)
  305. lfc <- Reduce(cbind, lapply(seq_len(ngroups), function(g) {
  306. group_means[, g] - ((cs - group_sums[g, ]) / (n_obs - group.size[g]))
  307. }))
  308. res_list <- list(auc = auc,
  309. pval = pvals,
  310. padj = fdr,
  311. pct_in = 100 * group_pct,
  312. pct_out = 100 * group_pct_out,
  313. avgExpr = group_means,
  314. statistic = t(ustat),
  315. logFC = lfc)
  316. return(tidy_results(res_list, features, levels(y)))
  317. }
  318. #' Top markers per group from wilcoxauc results
  319. #'
  320. #' Filters and ranks the long-form output of [wilcoxauc()] to give the
  321. #' most distinguishing features per group. The filter arguments combine
  322. #' multiplicatively, then the top `n` features per group are kept by
  323. #' descending `auc` and pivoted into wide form. Counterpart to
  324. #' [top_markers_dds()] for DESeq2-based pseudobulk results.
  325. #'
  326. #' @param res Long-form results table from [wilcoxauc()].
  327. #' @param n Number of top markers to return per group. Default `10`.
  328. #' @param auc_min Drop features with `auc < auc_min`. Default `0`
  329. #' (no filter); set to `0.5` to keep only features that are positive
  330. #' markers (more highly expressed in-group than out).
  331. #' @param pval_max Drop features with raw `pval > pval_max`. Default `1`.
  332. #' @param padj_max Drop features with adjusted `padj > padj_max`.
  333. #' Default `1`.
  334. #' @param pct_in_min Minimum percent (0-100) of in-group observations
  335. #' with non-zero feature value. Default `0`.
  336. #' @param pct_out_max Maximum percent (0-100) of out-of-group
  337. #' observations with non-zero feature value. Default `100`.
  338. #'
  339. #' @return tibble in wide form: a `rank` column (1..`n`) and one
  340. #' column per group containing the feature name of the top-ranked
  341. #' marker at that rank. Cells are `NA` for groups with fewer than
  342. #' `n` features that pass the filters.
  343. #'
  344. #' @examples
  345. #' set.seed(42)
  346. #' exprs <- matrix(rpois(25 * 150, lambda = 2), nrow = 25,
  347. #' dimnames = list(paste0("G", 1:25), NULL))
  348. #' y <- rep(c("A", "B", "C"), each = 50)
  349. #'
  350. #' res <- wilcoxauc(exprs, y)
  351. #'
  352. #' ## top 10 markers per group, restricted to nominally significant,
  353. #' ## up-regulated features (auc > 0.5 means in-group > out-of-group).
  354. #' top_markers(res, n = 10, auc_min = 0.5, pval_max = 0.05)
  355. #'
  356. #' @seealso [wilcoxauc()], [top_markers_dds()]
  357. #'
  358. #' @export
  359. top_markers <- function(res, n = 10, auc_min = 0, pval_max = 1, padj_max = 1,
  360. pct_in_min = 0, pct_out_max = 100) {
  361. res %>%
  362. dplyr::filter(
  363. .data$pval <= pval_max &
  364. .data$padj <= padj_max &
  365. .data$auc >= auc_min &
  366. .data$pct_in >= pct_in_min &
  367. .data$pct_out <= pct_out_max
  368. ) %>%
  369. dplyr::group_by(.data$group) %>%
  370. dplyr::top_n(n = n, wt = .data$auc) %>%
  371. dplyr::mutate(rank = rank(-.data$auc, ties.method = "random")) %>%
  372. dplyr::ungroup() %>%
  373. dplyr::select("feature", "group", "rank") %>%
  374. dplyr::arrange(.data$rank) %>%
  375. tidyr::pivot_wider(
  376. names_from = "group", values_from = "feature", names_sort = TRUE
  377. )
  378. }

wilcoxauc.R at commit b5df6ee, no license · at the source

Overview

Authors: Amanda McQuade1, Vincent Cele Castillo1, Venus Hagan1, Weiwei Liang1, Thomas Ta1, Reet Mishra1,2, Olivia Teter1,2, Layla Gomes1, Bianca Gonzalez1,3, Noam Teyssier1,4, Kun Leng1,5,6, Martin Kampmann1,2,7
ORCID iDs: Martin Kampmann
  1. Institute for Neurodegenerative Diseases, University of California,San Francisco, San Francisco, CA USA
  2. UC Berkeley-UCSF Graduate Program in Bioengineering, University of California,San Francisco, San Francisco, CA USA
  3. Engineering and Technology Department, City College of San Francisco,San Francisco, CA USA
  4. Biomedical Informatics Graduate Program, University of California,San Francisco, San Francisco, CA USA
  5. Medical Scientist Training Program, University of California,San Francisco, San Francisco, CA USA
  6. Biomedical Sciences Graduate Program, University of California,San Francisco, San Francisco, CA USA
  7. Department of Biochemistry and Biophysics, University of California,San Francisco, San Francisco, CA USA
Institutions: University of California, San Francisco (United States); City College of San Francisco (United States)
Journal: NPJ dementia, volume 2, issue 1, article 75
Dates: received 17 December 2025; accepted 1 July 2026; published online 2 September 2026; in print 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1038/s44400-026-00125-4 · PMID 42694111 · PMCID PMC13538059 · OpenAlex W4411100084
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), human (organism), Alzheimer's / dementia (population), cellular / molecular (subfield)
Methods: Statistics, Smoothing, state filtering, decompositions, Machine learning
Keywords: Computational biology and bioinformatics, Immunology, Neurology, Neuroscience
Topic: Neuroinflammation and Neurodegeneration Mechanisms (Neurology, Neuroscience), according to OpenAlex
Citations: cited by 1 paper (Europe PMC); 70 references in the paper

Abstract

Microglia dynamically support brain health through the induction of specialized activation states in response to injury or disease. Activation of the interferon-responsive microglia (IRM) state has been identified across neurodevelopmental windows, age-related cognitive decline, and neurodegenerative diseases. Functionally, IRM have been linked to synaptic pruning, dead cell removal, and neuroinflammation, making this state critical to brain homeostasis. While the functional importance of this state is becoming increasingly clear, our understanding of the regulatory networks that govern IRM induction remain incomplete. To systematically identify genetic regulators of the IRM state, we conducted a genome-wide CRISPR interference screen in human iPSC-derived microglia using IFIT1 as a representative IRM marker. We identified 772 genes that modulate IRM, including canonical type I interferon signaling genes (IFNAR2, TYK2, STAT1/2, USP18) and newly described regulators. We uncovered a non-canonical role for the CCR4-NOT transcription complex subunit 10, CNOT10, in IRM activation. This work provides a comprehensive resource that can be applied to dissect the functions of interferon-responsive microglia and highlights both established and novel targets for modulating microglial interferon signaling in health and disease.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repositories

Its files are read in the Code ↔ Paper reader above, with 5 matches between paragraphs and lines of code.

immunogenomics/presto

License: none: the authors keep all their rights
State: the link answers, verified on 26 September 2026
Evidence: files inventoried
Commit: b5df6ee6097eb62522f2e557aa93ac21bab2d05f, 20 September 2026
Languages: JavaScript (15), R (14), C++ (2)
Size: 148 files, 31 scripts
Software Heritage: archived
Found in: the text, “RNA-sequencing”
Holds: README, environment (DESCRIPTION), tests, continuous integration, documentation, 2 notebooks
Not found: license file, CITATION.cff
Tools: tidyverse (4 files), Seurat (3 files), DESeq2 (2 files), SingleCellExperiment (2 files), broom (1 file), data.table (1 file)
Availability: 1 check, the latest on 26 September 2026: the link answers
  • 26 September 2026: the link answers
32 files

reetm09/mixscale

License: none: the authors keep all their rights
State: the link answers, verified on 26 September 2026
Evidence: files inventoried
Commit: b7515d40cf4301f1d7ef56fb115edd1cd0332d78, 31 March 2025
Languages: R (12)
Size: 48 files, 12 scripts
Software Heritage: not archived
Found in: the text, “RNA-sequencing”
Holds: README, environment (DESCRIPTION), documentation, 4 notebooks
Not found: license file, CITATION.cff, tests, continuous integration
Tools: Seurat (7 files), ggplot2 (3 files), tidyverse (3 files)
Availability: 1 check, the latest on 26 September 2026: the link answers
  • 26 September 2026: the link answers
13 files

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 43 scripts, each with its path and the digest of its content;
  • 5 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

No dataset and no data link were found in the paper.

Data availability

All processed data is included in supplemental tables for this manuscript. Genome-wide CRISPR screening data is also available through CRISPRbrain.org.

Reproduced under the paper's license (CC BY), from the paper cited above.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 3, 28 September 2026

  • Publisher: n/a → Springer Science+Business Media

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 12 authors, 4 keywords, 5 funders, 70 references.

Cite

This paper

McQuade, A., Castillo, V. C., Hagan, V., Liang, W., Ta, T., Mishra, R., Teter, O., Gomes, L., Gonzalez, B., Teyssier, N., Leng, K., & Kampmann, M. (2026). Regulators of interferon-responsive microglia uncovered by Genome-wide CRISPRi screening. NPJ dementia, 2(1), 75. https://doi.org/10.1038/s44400-026-00125-4

BibTeX

@article{mcquade2026regulators,
author = {McQuade, Amanda and Castillo, Vincent Cele and Hagan, Venus and Liang, Weiwei and Ta, Thomas and Mishra, Reet and Teter, Olivia and Gomes, Layla and Gonzalez, Bianca and Teyssier, Noam and Leng, Kun and Kampmann, Martin},
title = {{Regulators of interferon-responsive microglia uncovered by Genome-wide CRISPRi screening}},
journal = {NPJ dementia},
year = {2026},
month = sep,
volume = {2},
number = {1},
pages = {75},
publisher = {Springer Science+Business Media},
issn = {3005-1940},
doi = {10.1038/s44400-026-00125-4},
url = {https://doi.org/10.1038/s44400-026-00125-4},
pmid = {42694111},
pmcid = {PMC13538059}
}

RIS

TY - JOUR
AU - McQuade, Amanda
AU - Castillo, Vincent Cele
AU - Hagan, Venus
AU - Liang, Weiwei
AU - Ta, Thomas
AU - Mishra, Reet
AU - Teter, Olivia
AU - Gomes, Layla
AU - Gonzalez, Bianca
AU - Teyssier, Noam
AU - Leng, Kun
AU - Kampmann, Martin
TI - Regulators of interferon-responsive microglia uncovered by Genome-wide CRISPRi screening
T2 - NPJ dementia
J2 - NPJ Dement
PY - 2026
DA - 2026/09/02
VL - 2
IS - 1
SP - 75
SN - 3005-1940
PB - Springer Science+Business Media
DO - 10.1038/s44400-026-00125-4
UR - https://doi.org/10.1038/s44400-026-00125-4
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s44400-026-00125-4",
"type": "article-journal",
"title": "Regulators of interferon-responsive microglia uncovered by Genome-wide CRISPRi screening",
"container-title": "NPJ dementia",
"author": [
{
"family": "McQuade",
"given": "Amanda"
},
{
"family": "Castillo",
"given": "Vincent Cele"
},
{
"family": "Hagan",
"given": "Venus"
},
{
"family": "Liang",
"given": "Weiwei"
},
{
"family": "Ta",
"given": "Thomas"
},
{
"family": "Mishra",
"given": "Reet"
},
{
"family": "Teter",
"given": "Olivia"
},
{
"family": "Gomes",
"given": "Layla"
},
{
"family": "Gonzalez",
"given": "Bianca"
},
{
"family": "Teyssier",
"given": "Noam"
},
{
"family": "Leng",
"given": "Kun"
},
{
"family": "Kampmann",
"given": "Martin"
}
],
"container-title-short": "NPJ Dement",
"volume": "2",
"issue": "1",
"page": "75",
"DOI": "10.1038/s44400-026-00125-4",
"PMID": "42694111",
"PMCID": "PMC13538059",
"ISSN": "3005-1940",
"publisher": "Springer Science+Business Media",
"URL": "https://doi.org/10.1038/s44400-026-00125-4",
"language": "en",
"issued": {
"date-parts": [
[
2026,
9,
2
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1038/s41467-026-73007-1 [code]
Single-nucleus epigenomic dysregulation unmasks genetic risk-associated neurodegenerative glia states.
Journal: Nature communications
In common: Seurat, data.table, ggplot2, 1 other tool, Alzheimer's / dementia, genetics / omics, cellular / molecular, 6 references
[2] doi:10.1038/s41593-026-02367-0 [code]
A reproducible three-dimensional model of human brain tissue to investigate physiological and disease-associated microglia phenotypes.
Journal: Nature neuroscience
In common: SingleCellExperiment, DESeq2, Seurat, 3 other tools, Alzheimer's / dementia, cellular / molecular, 3 references
[3] doi:10.1038/s41467-026-74104-x [code]
TNF-α induces type I IFN signalling to suppress neurogenesis and recruit T cells.
Journal: Nature communications
In common: Seurat, ggplot2, tidyverse, 6 references
[4] doi:10.1002/imt2.70163 [code]
Spatial multi-omics unveils sphingolipid metabolic reprogramming within the retinal pathological niche.
Journal: iMeta
In common: SingleCellExperiment, DESeq2, Seurat, 3 other tools, genetics / omics, cellular / molecular, 3 references
[5] doi:10.1038/s41593-026-02384-z [code]
cGAS-mediated type I IFN signaling contributes to disease progression in drug-refractory epilepsy.
Journal: Nature neuroscience
In common: SingleCellExperiment, Seurat, data.table, 2 other tools, cellular / molecular, 4 references
[6] doi:10.1016/j.xcrm.2026.102766 [code]
A longitudinal single-cell and spatial multiomic atlas of pediatric high-grade glioma.
Journal: Cell reports. Medicine
In common: SingleCellExperiment, DESeq2, Seurat, 3 other tools, genetics / omics, cellular / molecular, 3 references
[7] doi:10.1038/s41467-026-75882-0 [code]
A massively parallel CRISPR-based screening platform for modifiers of neuronal depolarization.
Journal: Nature communications
In common: cellular / molecular, 4 references, author Martin Kampmann
[8] doi:10.1016/j.celrep.2026.117073 [code]
Single-cell epigenomics uncovers heterochromatin instability and transcription factor dysfunction during mouse brain aging.
Journal: Cell reports
In common: broom, DESeq2, Seurat, 3 other tools, genetics / omics, cellular / molecular, 2 references
[9] doi:10.1038/s42003-026-09948-6 [code]
A scalable human-zebrafish xenotransplantation model reveals gastrosome-mediated processing of dying neurons by human microglia.
Journal: Communications biology
In common: SingleCellExperiment, ggplot2, tidyverse, cellular / molecular, 5 references
[10] doi:10.1038/s41514-026-00391-9 [code]
Region-specific transcriptional signatures of brain aging in the absence of neuropathology at the single-cell level.
Journal: npj aging
In common: broom, Seurat, data.table, 2 other tools, genetics / omics, cellular / molecular, 4 references

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.