OSCR

Sex- and age-specific development of ssRNA virus receptor expression in the human brain.

Code ↔ Paper

26 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 26 matches
  1. [1] § Methods › Virus family enrichment across trajectory clusters ↔ byan2/Code/Figure 4.Rmd, lines 1604 to 1748 · score 0.86 · global family frequency, strong enrichment, global distribution, modest, permuting, virus family · Report a mismatch
  2. [2] § Methods › Cell-type fidelity analysis ↔ byan2/Code/Figure 5.Rmd, lines 1000 to 1079 · score 0.86 · temporal cortex, Fidelity scores, cortical area, frontal, occipital, parietal · Report a mismatch
  3. [3] § Methods › Cell-type fidelity analysis ↔ byan2/Code/Supplementary Figure 9.Rmd, lines 1002 to 1081 · score 0.86 · temporal cortex, Fidelity scores, cortical area, frontal, occipital, parietal · Report a mismatch
  4. [4] § Methods › Analysis of virus receptor lifespan trajectories ↔ byan2/Code/Figure 2.Rmd, lines 194 to 284 · score 0.78 · ward.D2, Euclidean distance, cluster sum, hierarchically clustered, squares, optimal · Report a mismatch
  5. [5] § Methods › Analysis of virus receptor lifespan trajectories ↔ byan2/Code/Supplementary Figure 7.Rmd, lines 197 to 289 · score 0.78 · ward.D2, Euclidean distance, cluster sum, hierarchically clustered, squares, optimal · Report a mismatch
  6. [6] § Methods › Analyzing the high-dimensional pattern of virus receptor development among brain areas ↔ byan2/Code/Figure 2.Rmd, lines 342 to 382 · score 0.77 · dens_frac, dens_lambda, t-SNE, brain area sex, perplexity, seeds · Report a mismatch
  7. [7] § Methods › Analyzing the high-dimensional pattern of virus receptor development among brain areas ↔ byan2/Code/Supplementary Figure 7.Rmd, lines 332 to 372 · score 0.77 · dens_frac, dens_lambda, t-SNE, brain area sex, perplexity, seeds · Report a mismatch
  8. [8] § Methods › Human transcriptomic dataset ↔ byan2/Code/Figure 1.Rmd, lines 496 to 555 · score 0.72 · tissue sample, AMY, CBC, HIP, MD, hemispheres · Report a mismatch
  9. [9] § Methods › Human transcriptomic dataset ↔ byan2/Code/Figure 2.Rmd, lines 385 to 432 · score 0.72 · subcortical areas, AMY, CBC, HIP, MD, DFC · Report a mismatch
  10. [10] § Methods › Virus family enrichment across trajectory clusters ↔ byan2/Code/Figure 4.Rmd, lines 1604 to 1748 · score 0.71 · Jensen Shannon, virus family annotations, divergence, gene area, global, enrichment · Report a mismatch
  11. [11] § Methods › Differential expression-sliding window analysis (DE-SWAN) ↔ byan2/Code/Supplementary Figure 8.rmd, lines 509 to 648 · score 0.68 · Benjamini Hochberg procedure, window center, DE SWAN, heatmap, LOESS, ages · Report a mismatch
  12. [12] § Methods › Random Forest model ↔ byan2/Code/Figure 3.Rmd, lines 383 to 453 · score 0.66 · randomForest, accuracy, train, seeds, model, predict · Report a mismatch
  13. [13] § Results › Prenatal cortical virus receptor expression is predominantly male-biased ↔ byan2/Code/Figure 6.Rmd, lines 1548 to 1628 · score 0.64 · female biased expression, cortical virus receptor, sex biases, Figure 6, prenatal, genes · Report a mismatch
  14. [14] § Results › Sex differences in virus receptor development are most pronounced in the cortex ↔ byan2/Code/Supplementary Figure 7.Rmd, lines 375 to 427 · score 0.61 · subcortical areas, den, AMY, CBC, HIP, MD · Report a mismatch
  15. [15] § Results › Sex differences in virus receptor development are most pronounced in the cortex ↔ byan2/Code/Figure 2.Rmd, lines 385 to 432 · score 0.60 · subcortical areas, AMY, CBC, HIP, MD, SNE · Report a mismatch
  16. [16] § Methods › Random Forest model ↔ byan2/Code/Supplementary Figure 2.Rmd, lines 361 to 480 · score 0.59 · LOESS fitted, gene area combinations, LOESS curves, iteration, seeds, model · Report a mismatch
  17. [17] § Methods › Human transcriptomic dataset ↔ byan2/Code/Kang Data Cleaning.Rmd, lines 57 to 74 · score 0.58 · tissue samples, Affymetrix, exon, Gene Expression, Probe, transcriptomic · Report a mismatch
  18. [18] § Methods › Human transcriptomic dataset ↔ byan2/Code/Figure 1.Rmd, lines 1585 to 1640 · score 0.57 · Fr chet distances, area trajectory pairs, male gene, fitted, Figure 1, LOESS · Report a mismatch
  19. [19] § Results › Selective cell-type associations characterize a subset of DE-SWAN clusters ↔ byan2/Code/Figure 5.Rmd, lines 1277 to 1348 · score 0.55 · DE SWAN clusters, unpaired median, confidence intervals, oligodendrocytes, Lollipop, neurons · Report a mismatch
  20. [20] § Results › Cortical virus receptor expression predicts sex at the individual level ↔ byan2/Code/Figure 3.Rmd, lines 513 to 603 · score 0.55 · decision boundary, Random Forest, probability, predict, classification, smoothed · Report a mismatch
  21. [21] § Results › Cortical virus receptor expression predicts sex at the individual level ↔ byan2/Code/Figure 3.Rmd, lines 513 to 603 · score 0.54 · decision boundary, RF, probabilities, SD, prediction, classification · Report a mismatch
  22. [22] § Methods › Analysis of virus receptor lifespan trajectories ↔ byan2/Code/Supplementary Figure 6.Rmd, lines 780 to 811 · score 0.53 · Hodges Lehmann, cluster distance, analytic, median · Report a mismatch
  23. [23] § Methods › Analysis of virus receptor lifespan trajectories ↔ byan2/Code/Supplementary Figure 2.Rmd, lines 361 to 480 · score 0.52 · fitting LOESS curves, nesting, Gaussian, log2, model, family · Report a mismatch
  24. [24] § Results › Dynamic sex-by-age patterns of virus receptor expression in the cortex ↔ byan2/Code/Figure 4.Rmd, lines 1520 to 1602 · score 0.52 · DE SWAN cluster, virus families, Hierarchical clustering, Stacked, compositions, Figure 4 · Report a mismatch
  25. [25] § Methods › Analysis of virus receptor lifespan trajectories ↔ byan2/Code/Supplementary Figure 2.Rmd, lines 517 to 561 · score 0.51 · Fr chet distance, male trajectories, iteration, simulated, female, gene · Report a mismatch
  26. [26] § Results › Prenatal expression of Zika virus candidate entry receptors ↔ byan2/Code/Figure 6.Rmd, lines 1548 to 1628 · score 0.50 · female biased, confidence intervals, sex biased, Virus receptor, Figure 6, median · Report a mismatch

Paper

Loaded from Europe PMC by your browser; OSCR does not store it: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

R Markdown · 749 lines · 25 KB · no license · 4 matches

  1. ---
  2. title: |
  3. | Sex- and Age-Specific Development of ssRNA Virus Receptor Expression in the Human Brain
  4. subtitle: |
  5. Figure 2 A-D: High-dimensional Visulization of Developmental Trajectories
  6. | *Markdown correspondence: [email hidden]
  7. author: |
  8. | Leanne Monteiro, Negeen Halabian, Jiawei Li, Kathryn M. Murphy*
  9. date: "`r Sys.Date()`"
  10. output:
  11. pdf_document: default
  12. ---
  13. ```{r setup, include=FALSE}
  14. knitr::opts_chunk$set(echo = TRUE)
  15. ```
  16. # Load Packages
  17. ```{r, message=FALSE, warning=FALSE}
  18. # Data Manipulation Libraries
  19. library(tidyverse) # A collection of packages for data manipulation and visualization
  20. library(data.table) # Provides an efficient way to handle and manipulate large data sets
  21. library(magrittr) # For the pipe operator (%>%)
  22. # Load libraries for graphics and visualization
  23. library(ggplot2) # Base package for data visualization
  24. library(ggforce) # For the facet_wrap_paginate() function
  25. library(gridExtra) # Arranging ggplot objects on a grid, e.g., grid.arrange()
  26. library(RColorBrewer) # For generating attractive color palettes
  27. library(here) # For reading in data from directory
  28. library(factoextra) # For creating and visualizing dendrograms
  29. library(densvis) # For visualizing densities
  30. # Additional Tools and Utilities
  31. library(R.devices) # For saving plots with different graphical devices
  32. library(elbow) # For finding the elbow point in a plot
  33. library(pathviewr) # For visualizing the elbow point in a plot
  34. library(patchwork) # The composer of plots
  35. library(cowplot) # Streamlined Plot Theme and Plot Annotations for 'ggplot2'
  36. ```
  37. ```{r, echo=FALSE, include=FALSE}
  38. # Define import and export file paths
  39. import.path <- here::here("data")
  40. export.path <- here::here("plots")
  41. ```
  42. # Preparing the Data
  43. ```{r, message=FALSE, warning=FALSE}
  44. # Load in the gene names that was used for the gene/brain area analysis
  45. virus.gene.list <-
  46. read_csv(here::here(import.path, "Human_2023_virus_gene_receptors.csv"))
  47. # Load the raw Kang data
  48. Kang.df <- fread(here::here(import.path, "Kang Data 17528 genes 1340 cases.csv"),
  49. data.table = FALSE) %>%
  50. dplyr::rename(Area = Region) # Rename Region as Brain Area
  51. # Extract and deduplicate gene names
  52. gene.list <- virus.gene.list %>%
  53. select("Gene") %>%
  54. unlist() %>%
  55. as.vector() %>%
  56. unique()
  57. # Specify the areas
  58. area<-c("VFC", "DFC" ,"MFC" ,"OFC","M1C" ,"S1C" ,"IPC" ,"STC" ,
  59. "A1C" ,"ITC" ,"V1C" ,"MD" ,"CBC" ,"HIP" ,"AMY")
  60. # Specify the cell type (used for naming output files)
  61. cell.type <- "Genes"
  62. # Decide whether to use the default span value (0.75)
  63. # If FALSE, the mean span value will be calculated and used instead
  64. include.prenatal <- FALSE
  65. # Filter and retain only relevant genes from the 'gene.list'
  66. gene.list <- intersect(gene.list, colnames(Kang.df)[21:ncol(Kang.df)])
  67. num.genes <- length(gene.list)
  68. ```
  69. \newpage
  70. # Hierarchical Clustering on Brain Areas for Each Sex
  71. ## Data Preparation
  72. ```{r DataPreparation, message=FALSE, warning=FALSE}
  73. # Define identifier columns from the original Kang dataset to retain
  74. identifiers <- c("Sample","Sex", "Area", "Years")
  75. # Specify the number of points/ages to extract for each curve
  76. num.points <- 128
  77. # Select relevant columns
  78. gene.exp <- Kang.df %>%
  79. select(all_of(identifiers), all_of(gene.list)) %>%
  80. # Convert gene expression values to numeric
  81. mutate_at(gene.list, as.numeric) %>%
  82. # Retain only selected brain areas
  83. filter(Area %in% area) # use %in% instead of == when you have multiple areas
  84. # Adjust for prenatal and postnatal samples
  85. if (!include.prenatal) {
  86. # If include.prenatal is FALSE, keep only postnatal samples
  87. gene.exp <- gene.exp %>%
  88. filter(Years > 0)
  89. } else {
  90. # If include.prenatal is TRUE, add 40/52 to the 'Years' column to get rid of
  91. # negative values
  92. gene.exp <- gene.exp %>%
  93. mutate(Years = Years + 40/52)
  94. }
  95. #### Quality Control Checks
  96. # Check if there are duplicate gene labels
  97. # if yes, throw error and return name of duplicates
  98. if (identical(colnames(gene.exp), unique(colnames(gene.exp))) == FALSE) {
  99. stop(paste("Data contains duplicate gene labels. The following gene has a duplicate:",
  100. colnames(gene.exp)[duplicated(colnames(gene.exp))]))
  101. }
  102. # Check if there are any NA values
  103. # if yes, throw error and return name of gene/column with NA
  104. if (sum(is.na(gene.exp)) > 0) {
  105. stop(paste("Data contains NA values in the following columns:",
  106. colnames(gene.exp)[colSums(is.na(gene.exp)) > 0]))
  107. }
  108. #### Z-score normalization
  109. gene.exp.zscore <- gene.exp %>%
  110. mutate_at(gene.list, scale)
  111. # Get long version of z-scored data
  112. gene.exp.zscore.long <- gene.exp.zscore%>%
  113. pivot_longer(cols = all_of(gene.list),
  114. names_to = "Gene",
  115. values_to = "Expression")
  116. ```
  117. ## Calculating the LOESS Fitted Values
  118. ```{r, message=FALSE, warning=FALSE}
  119. # Group data by Gene, Sex, and Area and nest the data for each group
  120. gene.exp.zscore.loess <- gene.exp.zscore.long %>%
  121. group_by(Gene, Sex, Area) %>%
  122. nest() %>%
  123. # Fit a LOESS model for each group, smoothing expression as a function of log2(Years)
  124. mutate(loess.model =
  125. purrr::map(.x = data, ~loess(.x,
  126. formula = Expression ~log2(Years),
  127. span = 0.75,
  128. degree = 2,
  129. family = "gaussian",
  130. control =
  131. loess.control(surface = "interpolate")))) %>%
  132. # Determine min and max age value for each LOESS curve
  133. mutate(min = purrr::map(.x = data, .f = ~min(log2(0.5))),
  134. max = purrr::map(.x = data, .f = ~max(log2(64)))) %>%
  135. unnest(min) %>% unnest(max) %>%
  136. # Create a vector of log2 age values for each LOESS curve
  137. mutate(age.values =
  138. map2(.x = min, .y = max, ~seq(.x, .y, (.y - .x)/(num.points-1)))) %>%
  139. # Extract fitted expression values from the LOESS model along the specified age values
  140. mutate(fitted.values = map2(.x = loess.model,
  141. .y = age.values,
  142. # Reverse log2 transformation to get actual Years
  143. ~data.frame("Years" = 2^(.y),
  144. "Expression" = predict(.x, newdata = .y))))
  145. # Create a data frame including only the fitted values of the LOESS curves of
  146. # the z-scored data, including columns for Gene, Sex, and Race
  147. gene.exp.zscore.loess.fitted <- gene.exp.zscore.loess %>%
  148. select(Gene, Sex, Area, fitted.values) %>% # Select necessary columns
  149. unnest(cols = c(fitted.values)) # Unnest the fitted values into separate rows
  150. # Unite the Years and Gene columns,
  151. # Area and Sex columns into a single column for following analysis
  152. gene.exp.zscore.loess.fitted <- gene.exp.zscore.loess.fitted %>%
  153. unite("Gene", c("Gene","Years"), sep = "_") %>%
  154. unite("Area", c("Area", "Sex"), sep="_")
  155. # Convert the data frame to wide format (one column per Gene_Sex_Area)
  156. # and remove rows with any missing (N/A) values
  157. wide.zscore.loess.fitted <- gene.exp.zscore.loess.fitted %>%
  158. spread(key = Gene, value = Expression) %>%
  159. drop_na()
  160. ```
  161. \newpage
  162. ## Performing Hierarchical Clustering on Area-Sex
  163. ```{r, message=FALSE, warning=FALSE}
  164. #===============#
  165. # Set Parameters
  166. #===============#
  167. # Rename columns for easier processing
  168. df.elbow <- wide.zscore.loess.fitted %>% column_to_rownames(var = "Area")
  169. # Calculate the within-cluster sum of squares (WSS) for multiple number of clusters
  170. nb_data <- fviz_nbclust(df.elbow, hcut,
  171. method = c("wss"),
  172. k.max = 15,
  173. verbose = TRUE)
  174. # Get the within-cluster sum of squares number and cluster size
  175. wss_values<- nb_data$data$y
  176. cluster_sizes <- 1:length(wss_values)
  177. # Create a dataframe with cluster sizes and WSS values
  178. df <-as.data.frame(cbind (cluster_sizes,wss_values))
  179. #============#
  180. # Elbow Plot
  181. #============#
  182. # We use 2 different elbow method pacakges to confirm the optimal number of clusters
  183. # Plot elbow graph to identify optimal number of clusters
  184. # Print the number of clusters
  185. num.clusters <- find_curve_elbow(df, plot_curve = FALSE)
  186. num.clusters
  187. # Create a data frame with only loess values for the elbow plot
  188. elbow.plot <- fviz_nbclust(df.elbow, hcut, method = "wss", diss = NULL,
  189. k.max = 15)+
  190. geom_vline(xintercept = num.clusters, linetype = 2) + #sets x intercept
  191. theme(axis.text.x = element_text(size=10,angle = 90, vjust = 0.5))
  192. # Print elbow plot
  193. elbow.plot
  194. #========================#
  195. # Hierarchical Clustering
  196. #========================#
  197. # Create data frame for Hclust
  198. all.loess.hclust <- wide.zscore.loess.fitted %>% column_to_rownames(var = "Area")
  199. # Calculate Euclidean distance and perform hierarchical clustering
  200. distance.row <- dist(all.loess.hclust,
  201. method = "euclidean")
  202. # Set seed
  203. set.seed(123)
  204. cluster.row <- hclust(distance.row,
  205. method = "ward.D2")
  206. # Cut the tree into k clusters and get the region clusters
  207. region.cluster <- cutree(cluster.row, k = num.clusters)
  208. # Assign the names to the clusters, store clusters in 'loess.cluster.members'
  209. assign("loess.cluster.members", split(names(region.cluster), region.cluster))
  210. #============#
  211. # Dendrogram
  212. #============#
  213. # Create vector of colours to use for figures
  214. colours <- c("#990099CC","#00DEA3", "#F7D823", "#F88800","#6693DE")
  215. # Create dendrogram
  216. dendrogram <- fviz_dend(cluster.row, k = num.clusters,
  217. cex = 1, # Label size
  218. horiz = FALSE,
  219. k_colors = colours,
  220. color_labels_by_k = TRUE, # Color labels by groups
  221. rect=TRUE, rect_border="black", rect_lty = 1,
  222. ggtheme = theme_classic(), # Change theme
  223. labels_track_height = 25,
  224. main = NULL) +
  225. theme(axis.title.y = element_text(size=20),
  226. axis.text.y = element_text(size=15),
  227. axis.ticks = element_line(size=1),
  228. axis.ticks.length.y = unit(0.25, "cm"),
  229. plot.margin = margin(0, 10, 20, 10)
  230. )
  231. # Print Dendrogram
  232. dendrogram
  233. ```
  234. ```{r, include=FALSE, echo=FALSE}
  235. # Save plot
  236. devEval(type = "tiff",
  237. path = paste(export.path, "Fig 2", sep = "/"),
  238. name = str_trim(paste("Dendrogram for", num.genes,"Genes-", num.clusters,
  239. "Clusters", ifelse(include.prenatal, "(Prenatal)", ""))),
  240. height = 9, width = 15, res=300, units ="in",
  241. expr = {
  242. print(dendrogram)
  243. }
  244. )
  245. ```
  246. \newpage
  247. # Dense tSNE visualization of the brain areas
  248. ```{r, message=FALSE, warning=FALSE}
  249. # Define breaks for labeling age
  250. mybreaks <- c(0.5, 1, 2, 4, 8, 16, 32, 64)
  251. # Create custom color palette to match the area clusters
  252. # Determined by hierarchical clustering
  253. custom_palette <- c(
  254. "CBC_F" = "#990099CC","CBC_M" = "#990099CC",
  255. "STC_F" = "#F88800", "OFC_F" = "#F88800", "M1C_F" = "#F88800",
  256. "V1C_F" = "#F88800", "IPC_F" = "#F88800", "ITC_F" = "#F88800", "DFC_F" = "#F88800",
  257. "A1C_F" = "#F88800", "S1C_F" = "#F88800", "MFC_F" = "#F88800", "VFC_F" = "#F88800",
  258. "MD_F" = "#F7D823", "MD_M" = "#F7D823",
  259. "STC_M" = "#00DEA3", "OFC_M" = "#00DEA3", "M1C_M" = "#00DEA3", "V1C_M" = "#00DEA3",
  260. "IPC_M" = "#00DEA3", "ITC_M" = "#00DEA3", "DFC_M" = "#00DEA3", "A1C_M" = "#00DEA3",
  261. "S1C_M" = "#00DEA3", "MFC_M" = "#00DEA3", "VFC_M" = "#00DEA3", "AMY_M" = "#00DEA3",
  262. "HIP_F" = "#6693DE", "HIP_M" = "#6693DE", "AMY_F" = "#6693DE"
  263. )
  264. # Create the custom color palette for Sex and Area
  265. sex_area_palette <- c("F_Cortical" = "#ff68a1",
  266. "M_Cortical" = "#4fae26",
  267. "F_Subcortical" = "#FFC2D9",
  268. "M_Subcortical" = "#B8DEA8")
  269. # Separate the Gene column into two new columns: Gene and Years
  270. # Convert to wide format
  271. densne.df <- gene.exp.zscore.loess.fitted %>%
  272. separate(Gene, into = c("Gene", "Years"), sep = "_") %>%
  273. spread(key = Gene, value = Expression)
  274. # Combine Area and Years to create a unique identifier for each row
  275. densne.df$Years_Area <- paste(densne.df$Area, densne.df$Years, sep = "_")
  276. densne.df.bind <- densne.df %>%
  277. as.data.frame()
  278. # Set the Years_Area as row names
  279. row.names(densne.df) <- densne.df$Years_Area
  280. # Remove the Area, Years, and Years_Area columns from the dataframe
  281. densne.df <- densne.df[ , !(names(densne.df) %in% c("Area", "Years", "Years_Area"))]
  282. # Set the parameters for the Dense t-SNE.
  283. # Parameters were chosen by running the "Optimizing dense-tSNE code" at the end of
  284. # this markdown.
  285. seed <- 5555
  286. perplexity <- 30
  287. dens_frac <- 0.9
  288. dens_lambda <- 0.1
  289. # Set the seed
  290. set.seed(seed)
  291. # Run dense t-SNE using densne function
  292. densne_result <-
  293. densne(densne.df,
  294. perplexity = perplexity,
  295. dens_frac = dens_frac,
  296. dens_lambda = dens_lambda,
  297. max_iter = 1000,
  298. verbose=FALSE) %>%
  299. as.data.frame()
  300. # Combine densne dataframe with the densne result and separate Area column into "Area" and "Sex"
  301. densne_combined <- cbind(densne.df.bind, densne_result) %>%
  302. mutate(Area_Sex = Area) %>%
  303. separate(Area, into = c("Area", "Sex"), sep = "_")
  304. # Define the order of brain areas combined with sex for plotting
  305. Area_Sex_order <- c(
  306. "CBC_F", "CBC_M", "AMY_M", "STC_M", "OFC_M", "M1C_M", "V1C_M", "IPC_M",
  307. "ITC_M", "DFC_M", "A1C_M", "S1C_M", "MFC_M", "VFC_M", "MD_F", "MD_M",
  308. "HIP_F", "HIP_M", "AMY_F", "STC_F", "OFC_F", "M1C_F", "V1C_F", "IPC_F",
  309. "ITC_F", "DFC_F", "A1C_F", "S1C_F", "MFC_F", "VFC_F"
  310. )
  311. # Reorder the levels of Area_Sex
  312. densne_combined$Area_Sex <-
  313. factor(densne_combined$Area_Sex, levels = Area_Sex_order)
  314. # Define the cortical and subcortical areas
  315. cortical_areas <- c("STC", "OFC", "M1C",
  316. "V1C", "IPC", "ITC", "DFC",
  317. "A1C", "S1C", "MFC", "VFC")
  318. subcortical_areas <- c("MD", "CBC", "AMY", "HIP")
  319. # Add a new column "Area_Type" to classify regions as cortical, subcortical, or unknown
  320. densne_combined <- densne_combined %>%
  321. mutate(Area_Type = case_when(
  322. Area %in% cortical_areas ~ "Cortical",
  323. Area %in% subcortical_areas ~ "Subcortical",
  324. TRUE ~ "Unknown" # Catch-all for any areas not specified above
  325. ))
  326. # Create a new variable that combines Sex and Area_Type information
  327. densne_combined$Sex_Area <- paste(densne_combined$Sex,
  328. densne_combined$Area_Type, sep = "_")
  329. # Convert the "Years" column to a numeric type for proper visualization
  330. densne_combined$Years <- as.numeric(densne_combined$Years)
  331. # Visualizing dense t-SNE results colored by 'Years'
  332. densne_years_plot <- ggplot(densne_combined) +
  333. aes(V1, V2) +
  334. geom_point(size = 4, shape = 21, colour = "black") +
  335. geom_point(size = 3.5, aes(colour = Years))+
  336. scale_size(breaks = mybreaks) +
  337. scale_colour_gradientn(name = "Age",
  338. breaks = mybreaks,
  339. colours = brewer.pal(9, "YlOrRd"),
  340. trans = "log")+
  341. labs(x = "Dense t-SNE component 1", y = "Dense t-SNE component 2") +
  342. theme(
  343. # plot.title = element_text(size = 15),
  344. axis.title = element_text(size = 20),
  345. axis.text = element_text(size = 20),
  346. legend.text = element_text(size = 18),
  347. legend.title = element_text(size = 19),
  348. legend.key.size = unit(1, "cm"),
  349. aspect.ratio = 5/5,
  350. panel.background = element_rect(fill = "white"),
  351. axis.line = element_line(colour = "black"))
  352. # Visualizing dense t-SNE results colored by 'Area_Sex'
  353. densne_area_sex_plot <- ggplot(densne_combined) +
  354. aes(V1, V2, colour = Area_Sex) +
  355. geom_point(size = 3.5) +
  356. scale_colour_manual(values = custom_palette, name = "Area_Sex") +
  357. # ggtitle(paste("Dense t-SNE,", "Seed =", seed, "Perplexity =", perplexity)) +
  358. labs(x = "Dense t-SNE component 1", y = "Dense t-SNE component 2") +
  359. theme(
  360. # plot.title = element_text(size = 15),
  361. axis.title = element_text(size = 20),
  362. axis.text = element_text(size = 20),
  363. legend.text = element_text(size = 18),
  364. legend.title = element_text(size = 19),
  365. legend.key.size = unit(0.8, "cm"),
  366. aspect.ratio = 5/5,
  367. panel.background = element_rect(fill = "white"),
  368. axis.line = element_line(colour = "black"))
  369. # Visualizing dense t-SNE results colored by combined 'Sex' information
  370. densne_sex_plot <- ggplot(densne_combined) +
  371. aes(x = V1, y = V2, colour = Sex_Area) +
  372. geom_point(size = 3.5) +
  373. scale_color_manual(values = sex_area_palette,
  374. name = "Sex & Area",
  375. labels = c("Female Cortex",
  376. "Female Subcortex",
  377. "Male Cortex",
  378. "Male Subcortex")) +
  379. # ggtitle(paste("Dense t-SNE,", "Seed =", seed, "Perplexity =", perplexity)) +
  380. labs(x = "Dense t-SNE component 1", y = "Dense t-SNE component 2") +
  381. theme(
  382. # plot.title = element_text(size = 15),
  383. axis.title = element_text(size = 20),
  384. axis.text = element_text(size = 20),
  385. legend.text = element_text(size = 18),
  386. legend.title = element_text(size = 19),
  387. legend.key.size = unit(0.8, "cm"),
  388. aspect.ratio = 5/5,
  389. panel.background = element_rect(fill = "white"),
  390. axis.line = element_line(colour = "black"))
  391. ```
  392. \newpage
  393. Area Sex Labelled Dense t-SNE
  394. ```{r , fig.height=10, fig.width=10}
  395. densne_area_sex_plot
  396. ```
  397. \newpage
  398. Years Labelled Dense t-SNE
  399. ```{r , fig.height=10, fig.width=10}
  400. densne_years_plot
  401. ```
  402. \newpage
  403. Area Sex Labelled Dense t-SNE
  404. ```{r , fig.height=10, fig.width=10}
  405. densne_sex_plot
  406. ```
  407. \newpage
  408. Combine all the plots
  409. ```{r Panel, fig.width=8}
  410. layout <- "
  411. AXB
  412. CXD
  413. "
  414. densne_years_plot_with_space <- (plot_spacer() + densne_years_plot + plot_spacer()) +
  415. plot_layout(widths = c(0.1, 1, 0.1))
  416. combined.plot <-wrap_plots(
  417. # assign each plot to corresponding letter
  418. A = ggdraw() + draw_plot(dendrogram, height = 0.95),
  419. B = densne_area_sex_plot,
  420. C = densne_years_plot_with_space,
  421. D = densne_sex_plot,
  422. X = plot_spacer(),
  423. # apply the layout
  424. design = layout
  425. ) +
  426. plot_layout(widths = c(1.5, 0.1, 1),
  427. heights = c(1, 1)) +
  428. # plot_annotation(tag_levels = "A") &
  429. theme(plot.tag = element_text(size = 25),
  430. legend.text = element_text(size = 12),
  431. legend.key.size = unit(0.5, "cm"),
  432. legend.spacing.y = unit(0.10, "cm")
  433. )
  434. # add label manually
  435. # x for "B" and "D" depends on the width and output file size
  436. combined.plot <- ggdraw(combined.plot) +
  437. draw_label("A", x = 0.01, y = 0.99, hjust = 0, vjust = 1, size = 48) +
  438. draw_label("B", x = 0.51, y = 0.99, hjust = 0, vjust = 1, size = 48) +
  439. draw_label("C", x = 0.01, y = 0.51, hjust = 0, vjust = 1, size = 48) +
  440. draw_label("D", x = 0.51, y = 0.51, hjust = 0, vjust = 1, size = 48)
  441. ```
  442. ```{r echo=FALSE}
  443. knitr::include_graphics(
  444. here::here(paste(export.path, "Fig 2",
  445. "Fig2. Densne panel_k5.pdf", sep="/")))
  446. ```
  447. ```{r, include=FALSE, echo=FALSE}
  448. #Saving the plots
  449. devEval(type = "pdf",
  450. path = paste(export.path, "Fig 2", sep = "/"),
  451. name = "Fig2. Densne panel_k5",
  452. width = 25,
  453. height = 20,
  454. expr = {
  455. print(combined.plot)
  456. })
  457. # Save the densne_area_sex_plot as a TIFF image
  458. tiff(filename = paste(export.path, "Fig 2", "Fig2 Dense panel.tiff", sep = "/"),
  459. width = 11.7,
  460. height = 10,
  461. units = "in",
  462. res = 600,
  463. compression = "lzw",
  464. type = "cairo")
  465. print(combined.plot)
  466. dev.off()
  467. ```
  468. ```{r, include=FALSE, echo=FALSE}
  469. #Saving the plots
  470. devEval(type = "pdf",
  471. path = paste(export.path, "Fig 2", sep = "/"),
  472. name = "Fig2A. Sex_Labelled_DtSNE",
  473. width = 10,
  474. height = 10,
  475. expr = {
  476. print(densne_area_sex_plot)
  477. })
  478. devEval(type = "pdf",
  479. path = paste(export.path, "Fig 2", sep = "/"),
  480. name = "Fig2B. YearsLabelled_DtSNE",
  481. width = 10,
  482. height = 10,
  483. expr = {
  484. print(densne_years_plot)
  485. })
  486. devEval(type = "pdf",
  487. path = paste(export.path, "Fig 2", sep = "/"),
  488. name = "Fig2C. Area_SexLabelled_DtSNE",
  489. width = 10,
  490. height = 10,
  491. expr = {
  492. print(densne_area_sex_plot)
  493. })
  494. # Save the densne_area_sex_plot as a TIFF image
  495. tiff(filename = paste(export.path, "Fig 2", "Fig2B Area_Sex_Labelled_DtSNE.tiff", sep = "/"),
  496. width = 11.4,
  497. height = 10,
  498. units = "in",
  499. res = 600,
  500. compression = "lzw",
  501. type = "cairo")
  502. print(densne_area_sex_plot)
  503. dev.off()
  504. # Save the densne_years_plot as a TIFF image
  505. tiff(filename = paste(export.path, "Fig 2", "Fig2C Years_Labelled_DtSNE.tiff", sep = "/"),
  506. width = 10,
  507. height = 10,
  508. units = "in",
  509. res = 600,
  510. compression = "lzw",
  511. type = "cairo")
  512. print(densne_years_plot)
  513. dev.off()
  514. # Save the densne_area_sex_plot as a TIFF image
  515. tiff(filename = paste(export.path, "Fig 2", "Fig2D Sex_Labelled_DtSNE.tiff", sep = "/"),
  516. width = 11.7,
  517. height = 10,
  518. units = "in",
  519. res = 600,
  520. compression = "lzw",
  521. type = "cairo")
  522. print(densne_sex_plot)
  523. dev.off()
  524. ```
  525. \newpage
  526. ## Optimizing the parameters for running the dense-tSNE
  527. ```{r, eval=FALSE, include=TRUE}
  528. # Define your seeds and perplexities
  529. seeds <- c(5555, 611, 9037)
  530. perplexities <- c(30, 60, 90, 120, 150)
  531. dens_frac = 0.9
  532. dens_lambda =0.1
  533. # Initialize an empty list to store the plots
  534. densne_sex_plot_list <- list()
  535. densne_years_plot_list <- list()
  536. densne_area_sex_plot_list <- list()
  537. # Initialize a counter
  538. plot_counter <- 1
  539. # For each seed
  540. for (seed in seeds) {
  541. # Set the seed
  542. set.seed(seed)
  543. print(seed)
  544. # For each perplexity
  545. for (perplexity in perplexities) {
  546. print(perplexity)
  547. # Run dense t-SNE using densne function
  548. densne_result <- densne(densne.df, perplexity = perplexity,
  549. dens_frac = dens_frac, dens_lambda = dens_lambda,
  550. max_iter = 1000, verbose=FALSE) %>% as.data.frame()
  551. densne_combined <- cbind(densne.df.bind, densne_result)
  552. densne_combined <- densne_combined %>%
  553. mutate(Area_Sex = Area) %>%
  554. separate(Area, into = c("Area", "Sex"), sep = "_")
  555. densne_combined$Years <- as.numeric(densne_combined$Years)
  556. # Color the plot by Sex
  557. densne_sex_plot_list[[plot_counter]] <- ggplot(densne_combined) +
  558. aes(V1,V2, colour = densne_combined$Sex) +
  559. geom_point(size=4,shape=21,colour="black") +
  560. geom_point(size=3.5,aes(colour = Sex))+
  561. scale_colour_discrete(name = "Sex") +
  562. labs(x = "Dense t-SNE component 1", y = "Dense t-SNE component 2") +
  563. theme(plot.title =element_text(size=10),
  564. aspect.ratio = 5/5,
  565. panel.background = element_rect(fill = "white"),
  566. axis.line = element_line(colour = "black"))+
  567. ggtitle(paste("Seed =", seed, "Perplexity =", perplexity))
  568. # Color the plot by Years
  569. densne_years_plot_list[[plot_counter]] <- ggplot(densne_combined) +
  570. aes(V1,V2) +
  571. geom_point(size=4,shape=21,colour="black") +
  572. geom_point(size=3.5,aes(colour = Years))+
  573. scale_size(breaks = mybreaks) +
  574. scale_colour_gradientn(name="Age",breaks = mybreaks,
  575. colours =brewer.pal(9, "YlOrRd"),trans="log")+
  576. labs(x = "Dense t-SNE component 1", y = "Dense t-SNE component 2") +
  577. theme(plot.title =element_text(size=10),
  578. aspect.ratio = 5/5,
  579. panel.background = element_rect(fill = "white"),
  580. axis.line = element_line(colour = "black"))+
  581. ggtitle(paste("Seed =", seed, "Perplexity =", perplexity))
  582. # Color the plot by Area_Sex
  583. densne_area_sex_plot_list[[plot_counter]] <- ggplot(densne_combined) +
  584. aes(V1, V2, colour = Area_Sex) +
  585. geom_point(size=3.5) +
  586. scale_colour_discrete(name = "Area_Sex") +
  587. ggtitle(paste("Seed =", seed, "Perplexity =", perplexity)) +
  588. labs(x = "Dense t-SNE component 1", y = "Dense t-SNE component 2") +
  589. theme(plot.title = element_text(size=10),
  590. aspect.ratio = 5/5,
  591. panel.background = element_rect(fill = "white"),
  592. axis.line = element_line(colour = "black"))
  593. # Increment the counter
  594. plot_counter <- plot_counter + 1
  595. }
  596. }
  597. ```
  598. ```{r include=FALSE, eval=FALSE}
  599. devEval(type = "pdf",
  600. path = paste(export.path, "Fig 2", "Perplexity Testing", sep = "/"),
  601. name = "Area_Sex_Labelled_DtSNE_67Genes",
  602. width = 60,
  603. height = 20,
  604. expr = {
  605. print(do.call(grid.arrange, c(densne_area_sex_plot_list, ncol = 5, nrow = 3)))
  606. })
  607. devEval(type = "pdf",
  608. path = paste(export.path, "Fig 2", "Perplexity Testing", sep = "/"),
  609. name = "Sex_Labelled_DtSNE_67Genes",
  610. width = 60,
  611. height = 20,
  612. expr = {
  613. print(do.call(grid.arrange, c(densne_sex_plot_list, ncol = 5, nrow = 3)))
  614. })
  615. devEval(type = "pdf",
  616. path = paste(export.path, "Fig 2", "Perplexity Testing", sep = "/"),
  617. name = "Age_Labelled_DtSNE_67Genes",
  618. width = 60,
  619. height = 20,
  620. expr = {
  621. print(do.call(grid.arrange, c(densne_years_plot_list, ncol = 5, nrow = 3)))
  622. })
  623. ```

Figure 2.Rmd, no license · at the source

Overview

Authors: Leanne Monteiro1, Negeen Halabian1, Jiawei Li2, Maheshwar Panday1, Nadine Barone1, Peiyi Wang2, Kathryn M Murphy1,2
  1. McMaster Neuroscience Graduate Program, McMaster University, Hamilton, Ontario, Canada
  2. Department of Psychology, Neuroscience & Behavior, McMaster University, Hamilton, Ontario, Canada
Institutions: McMaster University (Canada)
Journal: PloS one, volume 21, issue 10, article e0360526
Dates: received 17 April 2026; accepted 24 September 2026; published online 29 October 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1371/journal.pone.0360526 · PMID 42956020 · PMCID PMC13718946 · OpenAlex W7224377623
Open access: gold, a free copy (OpenAlex)
Status: code verified (how the code is found and verified)
Categories: human (organism)
Methods: Connectivity, Statistics, Smoothing, state filtering, decompositions, Machine learning, Preprocessing, Spectral & time-frequency
MeSH: Brain*, Receptors, Virus*, RNA Viruses*, Adolescent, Adult, Age Factors, Aged, Aged, 80 and over, Child, Child, Preschool, Female, Gene Expression Regulation, Developmental, Humans, Infant, Male, Middle Aged, Sex Characteristics, Sex Factors, Young Adult (* major topic)
Topic: Single-cell and spatial transcriptomics (Molecular Biology, Biochemistry, Genetics and Molecular Biology), according to OpenAlex
Citations: not cited yet (Europe PMC); 82 references in the paper

Abstract

Neurotropic single-stranded RNA (ssRNA) viruses can disrupt brain function, yet little is known about how host virus receptor expression develops across the human lifespan or whether these trajectories differ between females and males. We focused on postnatal development using postmortem transcriptomic data from 33 human donors (4 months–82 years; both sexes), comprising 52 cerebral hemispheres and 15 brain areas, to characterize developmental patterns of 67 host receptor genes that mediate entry of major ssRNA viral families. Using sex-specific LOESS trajectory modelling, hierarchical clustering, and sliding-window differential expression analyses, we identified multiple non-linear developmental programs governing virus receptor expression. About half of female–male gene–area trajectory pairs exhibited divergent developmental patterns. Sex differences were most pronounced in the cortex, where high-dimensional receptor expression profiles were sufficient to predict the sex of individual cases. Sex differential expression was most frequent during early childhood, coinciding with sensitive periods of cortical circuit refinement. A targeted prenatal analysis revealed that virus receptor expression was predominantly male-biased before birth, contrasting with the predominantly female-biased expression observed during the early postnatal period. Although receptors from most viral families were broadly distributed across developmental programs, a subset of sex-by-age expression clusters showed some enrichment for specific viral lineages and glial-associated cell-type signatures. Together, these findings reveal that virus receptor expression in the human brain is organized into structured, sex-biased trajectories that dynamically reorganize over development, providing the first developmental atlas of viral entry receptors in the human brain.

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

Repository

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

OSF 4fgka

License: none: the authors keep all their rights
State: the link answers, verified on 31 October 2026
Evidence: files inventoried
Languages: R (16)
Size: 32 files, 16 scripts
Software Heritage: not checked
Found in: “Data Availability”
Holds: 16 notebooks
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: tidyverse (16 files), data.table (15 files), ggplot2 (15 files), cowplot (10 files), patchwork (10 files), reshape2 (10 files), randomForest (1 file)
Availability: 1 check, the latest on 31 October 2026: the link answers (HTTP 200)
  • 31 October 2026: the link answers (HTTP 200)
16 files
At the source: osf.io/4fgka/

The paper's code and data availability statement is in the Data section.

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:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 16 scripts, each with its path and the digest of its content;
  • 26 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

Datasets cited

Data Availability

Data and Code accessibility: The processed dataset analyzed in the current study, along with the R code and supplementary materials (figures and tables), are available on the Open Science Framework (Monteiro et al., 2025) https://osf.io/4fgka/. The transcriptomic dataset is from Kang et. al., (2011) and is available on the Gene Omnibus: (GSE25219).

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 1, 31 October 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 7 authors, 19 MeSH terms, 80 references.

Cite

This paper

Monteiro, L., Halabian, N., Li, J., Panday, M., Barone, N., Wang, P., & Murphy, K. M. (2026). Sex- and age-specific development of ssRNA virus receptor expression in the human brain. PloS one, 21(10), e0360526. https://doi.org/10.1371/journal.pone.0360526

BibTeX

@article{monteiro2026sex,
author = {Monteiro, Leanne and Halabian, Negeen and Li, Jiawei and Panday, Maheshwar and Barone, Nadine and Wang, Peiyi and Murphy, Kathryn M},
title = {{Sex- and age-specific development of ssRNA virus receptor expression in the human brain}},
journal = {PloS one},
year = {2026},
month = oct,
volume = {21},
number = {10},
pages = {e0360526},
publisher = {PLOS},
issn = {1932-6203},
doi = {10.1371/journal.pone.0360526},
url = {https://doi.org/10.1371/journal.pone.0360526},
pmid = {42956020},
pmcid = {PMC13718946}
}

RIS

TY - JOUR
AU - Monteiro, Leanne
AU - Halabian, Negeen
AU - Li, Jiawei
AU - Panday, Maheshwar
AU - Barone, Nadine
AU - Wang, Peiyi
AU - Murphy, Kathryn M
TI - Sex- and age-specific development of ssRNA virus receptor expression in the human brain
T2 - PloS one
J2 - PLoS One
PY - 2026
DA - 2026/10/29
VL - 21
IS - 10
SP - e0360526
SN - 1932-6203
PB - PLOS
DO - 10.1371/journal.pone.0360526
UR - https://doi.org/10.1371/journal.pone.0360526
LA - en
ER -

CSL-JSON

{
"id": "10.1371/journal.pone.0360526",
"type": "article-journal",
"title": "Sex- and age-specific development of ssRNA virus receptor expression in the human brain",
"container-title": "PloS one",
"author": [
{
"family": "Monteiro",
"given": "Leanne"
},
{
"family": "Halabian",
"given": "Negeen"
},
{
"family": "Li",
"given": "Jiawei"
},
{
"family": "Panday",
"given": "Maheshwar"
},
{
"family": "Barone",
"given": "Nadine"
},
{
"family": "Wang",
"given": "Peiyi"
},
{
"family": "Murphy",
"given": "Kathryn M"
}
],
"container-title-short": "PLoS One",
"volume": "21",
"issue": "10",
"page": "e0360526",
"DOI": "10.1371/journal.pone.0360526",
"PMID": "42956020",
"PMCID": "PMC13718946",
"ISSN": "1932-6203",
"publisher": "PLOS",
"URL": "https://doi.org/10.1371/journal.pone.0360526",
"language": "en",
"issued": {
"date-parts": [
[
2026,
10,
29
]
]
}
}

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/s41380-022-01786-2 [code]
SARS-CoV-2 promotes microglial synapse elimination in human brain organoids.
Journal: Molecular psychiatry
In common: patchwork, cowplot, reshape2, 2 other tools, 3 references
[2] doi:10.1016/j.celrep.2025.116159 [code]
Human brain cell types shape host-rabies virus transcriptional interactions revealing a preexisting pro-viral astrocyte subpopulation.
Journal: Cell reports
In common: randomForest, patchwork, cowplot, 3 other tools, 1 reference
[3] doi:10.1093/schbul/sbad140 [code]
Clustering Schizophrenia Genes by Their Temporal Expression Patterns Aids Functional Interpretation.
Journal: Schizophrenia bulletin
In common: patchwork, ggplot2, tidyverse, NCBI GEO GSE25219, 1 reference
[4] doi:10.1038/s41467-025-62048-7 [code]
Hamsters with long COVID present distinct transcriptomic profiles associated with neurodegenerative processes in brainstem.
Journal: Nature communications
In common: randomForest, cowplot, ggplot2, 1 other tool, 3 references
[5] doi:10.1016/j.celrep.2024.114326 [code]
Hofbauer cells and fetal brain microglia share transcriptional profiles and responses to maternal diet-induced obesity.
Journal: Cell reports
In common: patchwork, cowplot, reshape2, 3 other tools, 2 references
[6] doi:10.1038/s41467-023-39411-7 [code]
Spatiotemporal proteomic atlas of multiple brain regions across early fetal to neonatal stages in cynomolgus monkey.
Journal: Nature communications
In common: patchwork, cowplot, reshape2, 3 other tools, 2 references
[7] doi:10.1038/s41467-023-39750-5 [code]
A single-cell transcriptional landscape of immune cells shows disease-specific changes of T cell and macrophage populations in human achalasia.
Journal: Nature communications
In common: randomForest, patchwork, cowplot, 3 other tools, 1 reference
[8] doi:10.1093/bioinformatics/btag592 [code]
Network-based stratification of allele-specific expression reveals patient subgroups in Huntington's disease.
Journal: Bioinformatics (Oxford, England)
In common: randomForest, patchwork, cowplot, 4 other tools
[9] doi:10.3390/ijms27156925 [code]
XGBoost-SHAP Interpretable Modeling Identifies and Validates an Eight-Gene Biomarker for Hepatic Encephalopathy Risk Prediction in Cirrhosis.
Journal: International journal of molecular sciences
In common: randomForest, patchwork, cowplot, 4 other tools
[10] doi:10.1126/sciadv.adu0726 [code]
CHCHD2 mutant mice link mitochondrial deficits to PD pathophysiology.
Journal: Science advances
In common: randomForest, patchwork, cowplot, 4 other tools

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.

Add the badge to the code's README

OSCR: the badge of this paper

If you are an author or a maintainer of this paper's code, you can add this badge. It says what OSCR knows of the paper (its code, its validated tracing map) and links the code to this page. Paste one of these snippets under the README's title. Keep the two marks around it, so that the badge can be replaced in place and is never added twice. OSCR changes nothing in your repository.

Markdown
<!-- oscr-badge:start -->
[![OSCR](https://openscicode.org/badge/doi/10.1371/journal.pone.0360526.svg)](https://openscicode.org/badge/doi/10.1371/journal.pone.0360526)
<!-- oscr-badge:end -->
reStructuredText
.. oscr-badge:start

.. image:: https://openscicode.org/badge/doi/10.1371/journal.pone.0360526.svg
   :target: https://openscicode.org/badge/doi/10.1371/journal.pone.0360526
   :alt: OSCR

.. oscr-badge:end
HTML
<!-- oscr-badge:start -->
<a href="https://openscicode.org/badge/doi/10.1371/journal.pone.0360526"><img src="https://openscicode.org/badge/doi/10.1371/journal.pone.0360526.svg" alt="OSCR"></a>
<!-- oscr-badge:end -->

If you choose to, you can have the badge kept up to date for you, with oscr badge --write from the command line or with the GitHub Action in your repository's workflows. Every other form and option (a card, AsciiDoc, LaTeX, shields.io) is on the badge 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: code errors and mismatches between the code and the paper about this paper and its code, from readers and its authors, beside the paper and its tracing map.

Report a mismatch between the code and the paper · Report a code error (signed in)

Reproductions: reports from readers who ran the authors' code and did not get the paper's result, what they ran, with which environment, commit and data.

Report a reproduction failure (signed in)

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