OSCR

Molecular Drivers of Mutualistic Association Between Anemone and Anemonefish.

Code ↔ Paper

4 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 4 matches
  1. [1] § Materials and Methods › Differential Expression Analyses ↔ clarkii_brain_DE.R, lines 389–435 · score 0.81 · clustered heatmaps, Brain_region, rlog transformed, clarkii brain, pheatmap, outlier
  2. [2] § Materials and Methods › Differential Expression Analyses ↔ Skin_DE_analysis.R, lines 524–605 · score 0.66 · log2 fold change, clarkii skin, FDR, enriched, enrichment, DE gene
  3. [3] § Materials and Methods › Sample Collection and Experimental Design ↔ clarkii_brain_DE.R, lines 389–435 · score 0.64 · optic tectum, brain stem, brain regions, cerebellum, diencephalon, telencephalon
  4. [4] § Results › Transcriptomic Responses in A. clarkii Skin Upon Acclimation ↔ Skin_DE_analysis.R, lines 524–605 · score 0.61 · log2 fold change, clarkii skin, FDR, enriched, enrichment, DE genes

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 · 803 lines · 32 KB · GPL-2.0 · 2 matches

  1. setwd("D:/A.clarkii/clarkii_brain_DE/featurects_output")
  2. #read featurecounts output
  3. F1_BS <- read.table("F1-BSfeaturecounts_output.txt",header=T) # Read the counts file obtained from featurecounts
  4. F1_BS_1 <- F1_BS[,c(1,7)] # Select the columns of interest - for me it was the 1st and 7th column which is gene ID and the column with the raw counts
  5. ### Repeat for all samples
  6. F2_BS <- read.table("F2-BSfeaturecounts_output.txt",header=T)
  7. F2_BS_1 <- F2_BS[,c(1,7)]
  8. F3_BS <- read.table("F3-BSfeaturecounts_output.txt",header=T)
  9. F3_BS_1 <- F3_BS[,c(1,7)]
  10. F4_BS <- read.table("F4-BSfeaturecounts_output.txt",header=T)
  11. F4_BS_1 <- F4_BS[,c(1,7)]
  12. F5_BS <- read.table("F5-BSfeaturecounts_output.txt",header=T)
  13. F5_BS_1 <- F5_BS[,c(1,7)]
  14. F6_BS <- read.table("F6-BSfeaturecounts_output.txt",header=T)
  15. F6_BS_1 <- F6_BS[,c(1,7)]
  16. F7_BS <- read.table("F7-BSfeaturecounts_output.txt",header=T)
  17. F7_BS_1 <- F7_BS[,c(1,7)]
  18. F8_BS <- read.table("F8-BSfeaturecounts_output.txt",header=T)
  19. F8_BS_1 <- F8_BS[,c(1,7)]
  20. F9_BS <- read.table("F9-BSfeaturecounts_output.txt",header=T)
  21. F9_BS_1 <- F9_BS[,c(1,7)]
  22. F1_DE <- read.table("F1-DEfeaturecounts_output.txt",header=T)
  23. F1_DE_1 <- F1_DE[,c(1,7)]
  24. F2_DE <- read.table("F2-DEfeaturecounts_output.txt",header=T)
  25. F2_DE_1 <- F2_DE[,c(1,7)]
  26. F3_DE <- read.table("F3-DEfeaturecounts_output.txt",header=T)
  27. F3_DE_1 <- F3_DE[,c(1,7)]
  28. F4_DE <- read.table("F4-DEfeaturecounts_output.txt",header=T)
  29. F4_DE_1 <- F4_DE[,c(1,7)]
  30. F5_DE <- read.table("F5-DEfeaturecounts_output.txt",header=T)
  31. F5_DE_1 <- F5_DE[,c(1,7)]
  32. F6_DE <- read.table("F6-DEfeaturecounts_output.txt",header=T)
  33. F6_DE_1 <- F6_DE[,c(1,7)]
  34. F7_DE <- read.table("F7-DEfeaturecounts_output.txt",header=T)
  35. F7_DE_1 <- F7_DE[,c(1,7)]
  36. F8_DE <- read.table("F8-DEfeaturecounts_output.txt",header=T)
  37. F8_DE_1 <- F8_DE[,c(1,7)]
  38. F9_DE <- read.table("F9-DEfeaturecounts_output.txt",header=T)
  39. F9_DE_1 <- F9_DE[,c(1,7)]
  40. F1_OT <- read.table("F1-OTfeaturecounts_output.txt",header=T)
  41. F1_OT_1 <- F1_OT[,c(1,7)]
  42. F2_OT <- read.table("F2-OTfeaturecounts_output.txt",header=T)
  43. F2_OT_1 <- F2_OT[,c(1,7)]
  44. F3_OT <- read.table("F3-OTfeaturecounts_output.txt",header=T)
  45. F3_OT_1 <- F3_OT[,c(1,7)]
  46. F4_OT <- read.table("F4-OTfeaturecounts_output.txt",header=T)
  47. F4_OT_1 <- F4_OT[,c(1,7)]
  48. F5_OT <- read.table("F5-OTfeaturecounts_output.txt",header=T)
  49. F5_OT_1 <- F5_OT[,c(1,7)]
  50. F6_OT <- read.table("F6-OTfeaturecounts_output.txt",header=T)
  51. F6_OT_1 <- F6_OT[,c(1,7)]
  52. F7_OT <- read.table("F7-OTfeaturecounts_output.txt",header=T)
  53. F7_OT_1 <- F7_OT[,c(1,7)]
  54. F8_OT <- read.table("F8-OTfeaturecounts_output.txt",header=T)
  55. F8_OT_1 <- F8_OT[,c(1,7)]
  56. F9_OT <- read.table("F9-OTfeaturecounts_output.txt",header=T)
  57. F9_OT_1 <- F9_OT[,c(1,7)]
  58. F1_TE <- read.table("F1-TEfeaturecounts_output.txt",header=T)
  59. F1_TE_1 <- F1_TE[,c(1,7)]
  60. F2_TE <- read.table("F2-TEfeaturecounts_output.txt",header=T)
  61. F2_TE_1 <- F2_TE[,c(1,7)]
  62. F3_TE <- read.table("F3-TEfeaturecounts_output.txt",header=T)
  63. F3_TE_1 <- F3_TE[,c(1,7)]
  64. F4_TE <- read.table("F4-TEfeaturecounts_output.txt",header=T)
  65. F4_TE_1 <- F4_TE[,c(1,7)]
  66. F5_TE <- read.table("F5-TEfeaturecounts_output.txt",header=T)
  67. F5_TE_1 <- F5_TE[,c(1,7)]
  68. F6_TE <- read.table("F6-TEfeaturecounts_output.txt",header=T)
  69. F6_TE_1 <- F6_TE[,c(1,7)]
  70. F7_TE <- read.table("F7-TEfeaturecounts_output.txt",header=T)
  71. F7_TE_1 <- F7_TE[,c(1,7)]
  72. F8_TE <- read.table("F8-TEfeaturecounts_output.txt",header=T)
  73. F8_TE_1 <- F8_TE[,c(1,7)]
  74. F9_TE <- read.table("F9-TEfeaturecounts_output.txt",header=T)
  75. F9_TE_1 <- F9_TE[,c(1,7)]
  76. F2_CB <- read.table("F2-CBfeaturecounts_output.txt",header=T)
  77. F2_CB_1 <- F2_CB[,c(1,7)]
  78. F3_CB <- read.table("F3-CBfeaturecounts_output.txt",header=T)
  79. F3_CB_1 <- F3_CB[,c(1,7)]
  80. F4_CB <- read.table("F4-CBfeaturecounts_output.txt",header=T)
  81. F4_CB_1 <- F4_CB[,c(1,7)]
  82. F5_CB <- read.table("F5-CBfeaturecounts_output.txt",header=T)
  83. F5_CB_1 <- F5_CB[,c(1,7)]
  84. F6_CB <- read.table("F6-CBfeaturecounts_output.txt",header=T)
  85. F6_CB_1 <- F6_CB[,c(1,7)]
  86. F7_CB <- read.table("F7-CBfeaturecounts_output.txt",header=T)
  87. F7_CB_1 <- F7_CB[,c(1,7)]
  88. F8_CB <- read.table("F8-CBfeaturecounts_output.txt",header=T)
  89. F8_CB_1 <- F8_CB[,c(1,7)]
  90. F9_CB <- read.table("F9-CBfeaturecounts_output.txt",header=T)
  91. F9_CB_1 <- F9_CB[,c(1,7)]
  92. df_list <- list(F1_BS_1,F1_DE_1,F1_OT_1,F1_TE_1,F2_BS_1,F2_DE_1,F2_OT_1,F2_TE_1,F2_CB_1,
  93. F3_BS_1,F3_DE_1,F3_OT_1,F3_TE_1,F3_CB_1,F4_BS_1,F4_DE_1,F4_OT_1,F4_TE_1,F4_CB_1,
  94. F5_BS_1,F5_DE_1,F5_OT_1,F5_TE_1,F5_CB_1,F6_BS_1,F6_DE_1,F6_OT_1,F6_TE_1,F6_CB_1,
  95. F7_BS_1,F7_DE_1,F7_OT_1,F7_TE_1,F7_CB_1,F8_BS_1,F8_DE_1,F8_OT_1,F8_TE_1,F8_CB_1,
  96. F9_BS_1,F9_DE_1,F9_OT_1,F9_TE_1,F9_CB_1)
  97. merge <- Reduce(function(x, y) merge(x, y, all=TRUE), df_list)
  98. write.csv(merge,file="clarkii_brain_cts.csv",row.names=F)
  99. #****************************************************************************
  100. #PCA from rlog transformed counts
  101. # link to guide: https://tavareshugo.github.io/data-carpentry-rnaseq/03_rnaseq_pca.html
  102. library(DESeq2)
  103. library(tidyverse)
  104. setwd("D:/A.clarkii/clarkii_brain_DE")
  105. cts <- read.csv("clarkii_brain_cts.csv",row.names="Geneid")
  106. coldata <- read.csv("brain_metadata.csv",row.names=1)
  107. #convert decimal to int
  108. cts1=round(cts)
  109. cts2 <- cts1[,-40]
  110. coldata1 <- coldata[-40,]
  111. # check if all colnames of count matrix are in the rownames of sample info; if false exit the script
  112. (all(rownames(coldata1) %in% colnames(cts2)) || all(colnames(cts2) %in% rownames(coldata1)))
  113. # check if columns of count matrix are in same order as rows of sample info
  114. (all(colnames(cts2) == rownames(coldata1)))
  115. # all variables in the design formula should be converted to factors
  116. coldata1$Condition <- factor(coldata1$Condition)
  117. coldata1$Sex <- factor(coldata1$Sex)
  118. coldata1$Brain_region <- factor(coldata1$Brain_region)
  119. dds <- DESeqDataSetFromMatrix(countData = cts2, colData = coldata1, design = ~Sex + Brain_region + Condition)
  120. # Keep only genes that have non-zero reads in total
  121. keep <- rowSums(counts(dds)) > 0
  122. dds <- dds[keep,]
  123. #The rlog function transforms the count data to the log2 scale in a way which minimizes differences between samples for rows with small counts, and which normalizes with respect to library size.
  124. #The transformation is useful when checking for outliers.
  125. #Note that neither rlog transformation nor the VST are used by the differential expression estimation in DESeq, which always occurs on the raw count data, through generalized linear modeling which incorporates knowledge of the variance-mean dependence. The rlog transformation and VST are offered as separate functionality which can be used for visualization, clustering or other machine learning tasks.
  126. rlogcounts <- assay(rlog(dds, blind=TRUE)) #blind = T will make the log transformation blind to the sample info)
  127. #Use the rlog transformed counts to do a PCA
  128. #To use prcomp, the samples should be the rows and the variables (in this case genes) should be the columns. So we need to transpose the data
  129. transpose <- t(rlogcounts)
  130. sample_pca <- prcomp(transpose,center=T, scale=T)#Often it is a good idea to standardize the variables before doing the PCA. This is often done by centering the data on the mean and then scaling it by dividing by the standard deviation. This ensures that the PCA is not too influenced by genes with higher absolute expression. By default, the prcomp() function does the centering but not the scaling.
  131. pc_eigenvalues <- sample_pca$sdev^2 # to extract the variance explained by each PC from our sample_pca object.
  132. #pc_eigenvalues is a vector. So to make a plot with ggplot2, we need to transform it to a dataframe/tibble
  133. # create a "tibble" manually with
  134. # a variable indicating the PC number
  135. # and a variable with the variances
  136. pc_eigenvalues <- tibble(PC = factor(1:length(pc_eigenvalues)),
  137. variance = pc_eigenvalues) %>%
  138. # add a new column with the percent variance
  139. mutate(pct = variance/sum(variance)*100) %>%
  140. # add another column with the cumulative variance explained
  141. mutate(pct_cum = cumsum(pct))
  142. # print the result
  143. pc_eigenvalues
  144. # The pc_eigenvalues table can now be used to produce a Scree Plot, which shows the fraction of total variance explained by each principal component.
  145. # The plot will show both the variance explained by individual PCs as well as the cumulative variance, using a type of visualisation known as a pareto chart
  146. #A Pareto chart is a type of chart that contains both bars and a line graph, where individual values are represented in descending order by bars, and the cumulative total is represented by the line.
  147. p <- pc_eigenvalues %>%
  148. ggplot(aes(x = PC)) +
  149. geom_col(aes(y = pct)) +
  150. geom_line(aes(y = pct_cum, group = 1)) +
  151. geom_point(aes(y = pct_cum)) +
  152. labs(x = "Principal component", y = "Fraction variance explained")
  153. p
  154. # The plot shows how successive PCs explain less and less of the total variance in the original data. Also note that in this case 7 components are enough to virtually explain all of the variance in the dataset. This makes sense in this case since we only have 7 biological samples.
  155. p <- p + theme_bw() + theme(axis.text=element_text(size=26), axis.title=element_text(size=30,face = "bold"))
  156. p
  157. setwd("./figures")
  158. ggsave("PCA_variance_for_each_PC_remvedF9BS.png", dpi = 300,units="cm",width=60,height=40)
  159. #Visualising samples on PC space
  160. library(ggpubr)
  161. setwd("D:/A.clarkii/clarkii_brain_DE")
  162. #extract the PC score for each sample from the prcomp object
  163. coldata <- read.csv("brain_metadata.csv")
  164. coldata1 <- coldata[-40,]
  165. pc_scores <- sample_pca$x ## The PC scores are stored in the "x" value of the prcomp object
  166. #The pc_scores object is of class matrix, so we need to first convert it to a data.frame/tibble for ggplot2.
  167. pc_scores <- pc_scores %>%
  168. # convert to a tibble retaining the sample names as a new column
  169. as_tibble(rownames = "Sample")
  170. # print the result
  171. pc_scores
  172. library(ggrepel)
  173. # Finally plot the PCA
  174. p <- pc_scores %>%
  175. # join with "sample_info" table
  176. full_join(coldata1, by = "Sample") %>%
  177. # create the plot
  178. ggplot(aes(x = PC1, y = PC2, colour = Brain_region,label=Sample,group=Brain_region)) +
  179. geom_point(size=5,aes(shape=interaction(Condition,Sex))) + scale_shape_manual(values = c(1, 16, 2, 17)) +
  180. geom_text_repel(size=5,max.overlaps = 15,min.segment.length = 0) +
  181. stat_conf_ellipse(bary=F, level = 0.95,npoint = 1000, geom = "polygon",alpha=0.3, aes (fill=Brain_region))
  182. #library(scales) - to see what default colors are used
  183. #show_col(hue_pal()(5))
  184. p
  185. #no labels
  186. p <- pc_scores %>%
  187. # join with "sample_info" table
  188. full_join(coldata, by = "Sample") %>%
  189. # create the plot
  190. ggplot(aes(x = PC1, y = PC2, colour = Brain_region,group=Brain_region)) +
  191. geom_point(size=5,aes(shape=interaction(Condition,Sex))) + scale_shape_manual(values = c(1, 16, 2, 17)) +
  192. stat_conf_ellipse(bary=F, level = 0.95,npoint = 1000, geom = "polygon",alpha=0.3, aes (fill=Brain_region))
  193. pc1_variance <- pc_eigenvalues[1,3]
  194. pc2_variance <- pc_eigenvalues[2,3]
  195. p <- p + xlab(paste0("PC1: ",round(pc1_variance,digits = 2),"%")) +
  196. ylab(paste0("PC2: ",round(pc2_variance,digits = 2),"%"))
  197. p
  198. p <- p + theme_bw() + theme(axis.text=element_text(size=26), axis.title=element_text(size=30,face = "bold"))
  199. p
  200. p <- p + theme(legend.title = element_text(size=30),
  201. legend.text = element_text(size=26))
  202. p
  203. setwd("./figures")
  204. ggsave("PCA_brain_all_factors_noLabels_removedF9BS.png", dpi = 300)
  205. #Exploring correlation between genes and PCs
  206. #This is to see which genes have the most influence on each PC axis. This information is contained in the variable loadings of the PCA, within the rotation value of the prcomp object.
  207. pc_loadings <- sample_pca$rotation
  208. #The pc_loading object is a matrix, which we can convert to a data.frame/tibble for plotting and data manipulation
  209. pc_loadings <- pc_loadings %>%
  210. as_tibble(rownames = "gene")
  211. # print the result
  212. pc_loadings
  213. #extract the top 10 genes with highest loading on PC1 and PC2
  214. top_genes <- pc_loadings %>%
  215. # select only the PCs we are interested in
  216. select(gene, PC1, PC2) %>%
  217. # convert to a "long" format
  218. pivot_longer(matches("PC"), names_to = "PC", values_to = "loading") %>%
  219. # for each PC
  220. group_by(PC) %>%
  221. # arrange by descending order of loading
  222. arrange(desc(abs(loading))) %>%
  223. # take the 10 top rows
  224. slice(1:10) %>%
  225. # pull the gene column as a vector
  226. pull(gene) %>%
  227. # ensure only unique genes are retained
  228. unique()
  229. top_genes
  230. #Now, we can use this list of gene names to subset the eigenvalues table:
  231. top_loadings <- pc_loadings %>%
  232. filter(gene %in% top_genes)
  233. #plot
  234. loadings_plot <- ggplot(data = top_loadings) +
  235. geom_segment(aes(x = 0, y = 0, xend = PC1, yend = PC2),
  236. arrow = arrow(length = unit(0.1, "in")),
  237. colour = "black",linewidth=1) +
  238. geom_text_repel(aes(x = PC1, y = PC2, label = gene),
  239. size = 8,hjust=2, vjust=3) + theme_bw() +
  240. theme(axis.text=element_text(size=26),
  241. axis.title=element_text(size=30,face = "bold")) +
  242. xlab("PC1") + ylab ("PC2")
  243. loadings_plot
  244. #Interpretation
  245. #Use the loading plot to identify which variables have the largest effect on each component.
  246. #Loadings can range from -1 to 1. Loadings close to -1 or 1 indicate that the variable strongly influences the component.
  247. #Loadings close to 0 indicate that the variable has a weak influence on the component.
  248. #Positive loadings indicate a variable and a principal component are positively correlated. Negative loadings indicate a negative correlation.
  249. setwd("./figures")
  250. ggsave("PCA_loadings_top10genesForeachPC_RemovedF9BS.png", dpi = 300)
  251. # Combining PC scores and PC loadings to see correlation - biplot
  252. #For example, geneA, with a negative score of -0.00605 (loading score), will be associated with whatever samples are shifted toward the negative end of your PC1 on a bi-plot.
  253. if (!requireNamespace('BiocManager', quietly = TRUE))
  254. install.packages('BiocManager')
  255. BiocManager::install('PCAtools')
  256. library(PCAtools)
  257. setwd("D:/A.clarkii/clarkii_brain_DE")
  258. cts <- read.csv("clarkii_brain_cts.csv",row.names="Geneid")
  259. coldata <- read.csv("brain_metadata.csv",row.names = 1)
  260. #convert decimal to int
  261. cts1=round(cts)
  262. cts2 <- cts1[,-40]
  263. coldata1 <- coldata[-40,]
  264. # check if all colnames of count matrix are in the rownames of sample info; if false exit the script
  265. (all(rownames(coldata1) %in% colnames(cts2)) || all(colnames(cts2) %in% rownames(coldata1)))
  266. # check if columns of count matrix are in same order as rows of sample info
  267. (all(colnames(cts2) == rownames(coldata1)))
  268. # all variables in the design formula should be converted to factors
  269. coldata1$Condition <- factor(coldata1$Condition)
  270. coldata1$Sex <- factor(coldata1$Sex)
  271. coldata1$Brain_region <- factor(coldata1$Brain_region)
  272. dds <- DESeqDataSetFromMatrix(countData = cts2, colData = coldata1, design = ~Sex + Condition + Brain_region)
  273. # Keep only genes that have non-zero reads in total
  274. keep <- rowSums(counts(dds)) > 0
  275. dds <- dds[keep,]
  276. #The rlog function transforms the count data to the log2 scale in a way which minimizes differences between samples for rows with small counts, and which normalizes with respect to library size.
  277. #The transformation is useful when checking for outliers.
  278. #Note that neither rlog transformation nor the VST are used by the differential expression estimation in DESeq, which always occurs on the raw count data, through generalized linear modeling which incorporates knowledge of the variance-mean dependence. The rlog transformation and VST are offered as separate functionality which can be used for visualization, clustering or other machine learning tasks.
  279. rlogcounts <- assay(rlog(dds, blind=TRUE)) #blind = T will make the log transformation blind to the sample info)
  280. a <- pca(rlogcounts, metadata = coldata1,center=T,scale=T)
  281. biplot(a, showLoadings = TRUE, colby='Brain_region', shape='Sex',
  282. lab = NULL, pointSize = 5, sizeLoadingsNames = 7,ellipse=F,
  283. ntopLoadings = 10,max.overlaps = 30, boxedLoadingsNames = FALSE,
  284. legendPosition="right",legendLabSize = 20,axisLabSize=26,
  285. legendIconSize = 8,colLegendTitle=NULL,shapeLegendTitle=NULL)
  286. setwd("./figures")
  287. ggsave("PCA_biplot_removedF9BS.png", dpi = 300)
  288. #****************************************************************************
  289. #clustering heatmap to check if samples group by sex
  290. library(DESeq2)
  291. library("pheatmap")
  292. library("dplyr")
  293. setwd("D:/A.clarkii/clarkii_brain_DE")
  294. cts <- read.csv("clarkii_brain_cts.csv",row.names="Geneid")
  295. coldata <- read.csv("brain_metadata.csv",row.names = 1)
  296. #convert decimal to int
  297. cts1=round(cts)
  298. cts2 <- data.frame(cts1[,c(-40)])
  299. coldata1 <- coldata[c(-40),]
  300. # check if all colnames of count matrix are in the rownames of sample info; if false exit the script
  301. (all(rownames(coldata1) %in% colnames(cts2)) || all(colnames(cts2) %in% rownames(coldata1)))
  302. # check if columns of count matrix are in same order as rows of sample info
  303. (all(colnames(cts2) == rownames(coldata1)))
  304. # all variables in the design formula should be converted to factors
  305. coldata1$Condition <- factor(coldata1$Condition)
  306. coldata1$Sex <- factor(coldata1$Sex)
  307. coldata1$Brain_region <- factor(coldata1$Brain_region)
  308. dds <- DESeqDataSetFromMatrix(countData = cts2, colData = coldata1, design = ~Condition + Sex + Brain_region)
  309. # Keep only genes that have non-zero reads in total
  310. keep <- rowSums(counts(dds)) > 0
  311. dds <- dds[keep,]
  312. #The rlog function transforms the count data to the log2 scale in a way which minimizes differences between samples for rows with small counts, and which normalizes with respect to library size.
  313. #The transformation is useful when checking for outliers.
  314. #Note that neither rlog transformation nor the VST are used by the differential expression estimation in DESeq, which always occurs on the raw count data, through generalized linear modeling which incorporates knowledge of the variance-mean dependence. The rlog transformation and VST are offered as separate functionality which can be used for visualization, clustering or other machine learning tasks.
  315. rlogcounts <- assay(rlog(dds, blind=TRUE)) #blind = T will make the log transformation blind to the sample info)
  316. cor <- cor(rlogcounts) #Calculate the correlation values between samples
  317. library(RColorBrewer)
  318. display.brewer.all(colorblindFriendly = T)
  319. heat_colors <- brewer.pal(9, "Greys")
  320. annotation_cols <- list(Condition = c(Control = "#808080", Interaction = "#FEBE00"),
  321. Sex = c(Male = "#6B8E23", Female = "#CC8899"),
  322. Brain_region = c("Brain stem" = "#5BC8E8",
  323. "Cerebellum" = "#1FC4B0",
  324. "Diencephalon" = "#8E9CE0",
  325. "Optic tectum" = "#A0A018",
  326. "Telencephalon" = "#F26FD0"))
  327. p <- pheatmap(cor,color=heat_colors, cellheight=35,cellwidth=40,cluster_rows=TRUE, show_rownames=T,show_colnames=T,legend=T,fontsize = 30,
  328. cluster_cols=T, annotation=select(coldata1,c(Condition,Sex,Brain_region)),,annotation_colors = annotation_cols)
  329. setwd("./figures/")
  330. png("clustering_heatmap_removedF9BS.png",res = 300,units="cm", width = 82, height = 63)
  331. print(p)
  332. dev.off()
  333. #****************************************************************************
  334. #LRT to see the effect of sex, brain_region and condition on gene expression
  335. library(DESeq2)
  336. setwd("D:/A.clarkii/clarkii_brain_DE")
  337. cts <- read.csv("clarkii_brain_cts.csv",row.names="Geneid")
  338. coldata <- read.csv("brain_metadata.csv",row.names = 1)
  339. #convert decimal to int
  340. cts1=round(cts)
  341. cts2 <- data.frame(cts1[,c(-40)])
  342. coldata1 <- coldata[c(-40),]
  343. # check if all colnames of count matrix are in the rownames of sample info; if false exit the script
  344. (all(rownames(coldata1) %in% colnames(cts2)) || all(colnames(cts2) %in% rownames(coldata1)))
  345. # check if columns of count matrix are in same order as rows of sample info
  346. (all(colnames(cts2) == rownames(coldata1)))
  347. # all variables in the design formula should be converted to factors
  348. coldata1$Condition <- factor(coldata1$Condition)
  349. coldata1$Sex <- factor(coldata1$Sex)
  350. coldata1$Brain_region <- factor(coldata1$Brain_region)
  351. dds <- DESeqDataSetFromMatrix(countData = cts2, colData = coldata1,
  352. design = ~Sex + Condition + Brain_region)
  353. # Keep only genes that have non-zero reads in total
  354. keep <- rowSums(counts(dds)) > 0
  355. dds <- dds[keep,]
  356. # total expressed genes in brain (passed the rowSums > 0 filter)
  357. n_expressed_brain <- nrow(dds)
  358. n_expressed_brain #24907
  359. # testing for sex effect
  360. dds_LRT_sex <- DESeq(dds, test = "LRT", reduced = ~ Condition + Brain_region)
  361. res_sex <- results(dds_LRT_sex)
  362. res_sex
  363. summary(res_sex)
  364. results <- data.frame(res_sex)
  365. results <- na.omit(results)
  366. res_sig_padj <- results[results$padj < 0.05, ]
  367. # number significant
  368. n_sig_sex <- sum(res_sex$padj < 0.05, na.rm = TRUE)
  369. n_sig_sex #365
  370. # proportion of expressed genes
  371. round(100 * n_sig_sex / n_expressed_brain, 1)
  372. setwd("./LRT_results/")
  373. write.csv(results,file="LRT_results_sex_effect.csv")
  374. write.csv(res_sig_padj,file="LRT_results_sex_effect_sig.csv")
  375. # testing for condition effect
  376. dds_LRT_condition <- DESeq(dds, test = "LRT", reduced = ~ Sex + Brain_region)
  377. res_condition <- results(dds_LRT_condition)
  378. res_condition
  379. summary(res_condition)
  380. results <- data.frame(res_condition)
  381. results <- na.omit(results)
  382. res_sig_padj <- results[results$padj<0.05,]
  383. setwd("./LRT_results/")
  384. write.csv(results,file="LRT_results_condition_effect.csv")
  385. write.csv(res_sig_padj,file="LRT_results_condition_effect_sig.csv")
  386. # testing for Brain_region effect
  387. dds_LRT_BrainRegion <- DESeq(dds, test = "LRT", reduced = ~ Sex + Condition)
  388. res_BrainRegion <- results(dds_LRT_BrainRegion)
  389. res_BrainRegion
  390. summary(res_BrainRegion)
  391. results <- data.frame(res_BrainRegion)
  392. results <- na.omit(results)
  393. res_sig_padj <- results[results$padj<0.05,]
  394. setwd("./LRT_results/")
  395. write.csv(results,file="LRT_results_BrainRegion_effect.csv")
  396. write.csv(res_sig_padj,file="LRT_results_BrainRegion_effect_sig.csv")
  397. #****************************************************************************
  398. # DE analysis - wald test
  399. library(DESeq2)
  400. setwd("D:/A.clarkii/clarkii_brain_DE")
  401. cts <- read.csv("clarkii_brain_cts.csv",row.names="Geneid")
  402. coldata <- read.csv("brain_metadata.csv",row.names = 1)
  403. #convert decimal to int
  404. cts1=round(cts)
  405. cts2 <- data.frame(cts1[,c(-40)])
  406. coldata1 <- coldata[c(-40),]
  407. #### BS
  408. cts_BS <- cts2[,c(1,5,10,15,20,25,30,35)]
  409. coldata_BS <- coldata1[c(1,5,10,15,20,25,30,35),]
  410. # check if all colnames of count matrix are in the rownames of sample info; if false exit the script
  411. (all(rownames(coldata_BS) %in% colnames(cts_BS)) || all(colnames(cts_BS) %in% rownames(coldata_BS)))
  412. # check if columns of count matrix are in same order as rows of sample info
  413. (all(colnames(cts_BS) == rownames(coldata_BS)))
  414. dds_BS <- DESeqDataSetFromMatrix(countData = cts_BS, colData = coldata_BS,design = ~ Sex + Condition)
  415. levels(dds_BS$Condition)
  416. levels(dds_BS$Sex)
  417. dds_BS$condition <- relevel(dds_BS$Condition, ref = "Control")
  418. # Keep only genes that have non-zero reads in total
  419. keep <- rowSums(counts(dds_BS)) > 0
  420. dds_BS <- dds_BS[keep,]
  421. dds_BS <- DESeq(dds_BS)
  422. resultsNames(dds_BS)
  423. resBS <- results(dds_BS, alpha = 0.05, contrast = c("Condition","Interaction","Control"), test ="Wald")#So up/downregulation refers to interaction i.e upregulated in interaction or downregulated in interaction
  424. summary(resBS)
  425. resBS
  426. resultsBS <- data.frame(resBS)
  427. resultsBS <- na.omit(resultsBS)
  428. sig_results_BS <- resultsBS[resultsBS$padj<0.05, ]
  429. setwd("./DE_results_wald_test/")
  430. write.csv(resultsBS,file="DE_results_all_BS.csv")
  431. write.csv(sig_results_BS,file="DE_results_sig_BS.csv")
  432. #### OT
  433. cts_OT <- cts2[,c(3,7,12,17,22,27,32,37,41)]
  434. coldata_OT <- coldata1[c(3,7,12,17,22,27,32,37,41),]
  435. # check if all colnames of count matrix are in the rownames of sample info; if false exit the script
  436. (all(rownames(coldata_OT) %in% colnames(cts_OT)) || all(colnames(cts_OT) %in% rownames(coldata_OT)))
  437. # check if columns of count matrix are in same order as rows of sample info
  438. (all(colnames(cts_OT) == rownames(coldata_OT)))
  439. dds_OT <- DESeqDataSetFromMatrix(countData = cts_OT, colData = coldata_OT,design = ~ Sex + Condition)
  440. levels(dds_OT$Condition)
  441. levels(dds_OT$Sex)
  442. dds_OT$condition <- relevel(dds_OT$Condition, ref = "Control")
  443. # Keep only genes that have non-zero reads in total
  444. keep <- rowSums(counts(dds_OT)) > 0
  445. dds_OT <- dds_OT[keep,]
  446. dds_OT <- DESeq(dds_OT)
  447. resultsNames(dds_OT)
  448. resOT <- results(dds_OT, alpha = 0.05, contrast = c("Condition","Interaction","Control"), test ="Wald")#So up/downregulation refers to interaction i.e upregulated in interaction or downregulated in interaction
  449. summary(resOT)
  450. resOT
  451. resultsOT <- data.frame(resOT)
  452. resultsOT <- na.omit(resultsOT)
  453. sig_results_OT <- resultsOT[resultsOT$padj<0.05, ]
  454. setwd("./DE_results_wald_test/")
  455. write.csv(resultsOT,file="DE_results_all_OT.csv")
  456. write.csv(sig_results_OT,file="DE_results_sig_OT.csv")
  457. #### TE
  458. cts_TE <- cts2[,c(4,8,13,18,23,28,33,38,42)]
  459. coldata_TE <- coldata1[c(4,8,13,18,23,28,33,38,42),]
  460. # check if all colnames of count matrix are in the rownames of sample info; if false exit the script
  461. (all(rownames(coldata_TE) %in% colnames(cts_TE)) || all(colnames(cts_TE) %in% rownames(coldata_TE)))
  462. # check if columns of count matrix are in same order as rows of sample info
  463. (all(colnames(cts_TE) == rownames(coldata_TE)))
  464. dds_TE <- DESeqDataSetFromMatrix(countData = cts_TE, colData = coldata_TE,design = ~ Sex + Condition)
  465. levels(dds_TE$Condition)
  466. levels(dds_TE$Sex)
  467. dds_TE$condition <- relevel(dds_TE$Condition, ref = "Control")
  468. # Keep only genes that have non-zero reads in total
  469. keep <- rowSums(counts(dds_TE)) > 0
  470. dds_TE <- dds_TE[keep,]
  471. dds_TE <- DESeq(dds_TE)
  472. resultsNames(dds_TE)
  473. resTE <- results(dds_TE, alpha = 0.05, contrast = c("Condition","Interaction","Control"), test ="Wald")#So up/downregulation refers to interaction i.e upregulated in interaction or downregulated in interaction
  474. summary(resTE)
  475. resTE
  476. resultsTE <- data.frame(resTE)
  477. resultsTE <- na.omit(resultsTE)
  478. sig_results_TE <- resultsTE[resultsTE$padj<0.05, ]
  479. setwd("./DE_results_wald_test/")
  480. write.csv(resultsTE,file="DE_results_all_TE.csv")
  481. write.csv(sig_results_TE,file="DE_results_sig_TE.csv")
  482. #### CB
  483. cts_CB <- cts2[,c(9,14,19,24,29,34,39,43)]
  484. coldata_CB <- coldata1[c(9,14,19,24,29,34,39,43),]
  485. # check if all colnames of count matrix are in the rownames of sample info; if false exit the script
  486. (all(rownames(coldata_CB) %in% colnames(cts_CB)) || all(colnames(cts_CB) %in% rownames(coldata_CB)))
  487. # check if columns of count matrix are in same order as rows of sample info
  488. (all(colnames(cts_CB) == rownames(coldata_CB)))
  489. dds_CB <- DESeqDataSetFromMatrix(countData = cts_CB, colData = coldata_CB,design = ~ Sex + Condition)
  490. levels(dds_CB$Condition)
  491. levels(dds_CB$Sex)
  492. dds_CB$condition <- relevel(dds_CB$Condition, ref = "Control")
  493. # Keep only genes that have non-zero reads in total
  494. keep <- rowSums(counts(dds_CB)) > 0
  495. dds_CB <- dds_CB[keep,]
  496. dds_CB <- DESeq(dds_CB)
  497. resultsNames(dds_CB)
  498. resCB <- results(dds_CB, alpha = 0.05, contrast = c("Condition","Interaction","Control"), test ="Wald")#So up/downregulation refers to interaction i.e upregulated in interaction or downregulated in interaction
  499. summary(resCB)
  500. resCB
  501. resultsCB <- data.frame(resCB)
  502. resultsCB <- na.omit(resultsCB)
  503. sig_results_CB <- resultsCB[resultsCB$padj<0.05, ]
  504. setwd("./DE_results_wald_test/")
  505. write.csv(resultsCB,file="DE_results_all_CB.csv")
  506. write.csv(sig_results_CB,file="DE_results_sig_CB.csv")
  507. #### DE
  508. cts_DE <- cts2[,c(2,6,11,16,21,26,31,36,40)]
  509. coldata_DE <- coldata1[c(2,6,11,16,21,26,31,36,40),]
  510. # check if all colnames of count matrix are in the rownames of sample info; if false exit the script
  511. (all(rownames(coldata_DE) %in% colnames(cts_DE)) || all(colnames(cts_DE) %in% rownames(coldata_DE)))
  512. # check if columns of count matrix are in same order as rows of sample info
  513. (all(colnames(cts_DE) == rownames(coldata_DE)))
  514. dds_DE <- DESeqDataSetFromMatrix(countData = cts_DE, colData = coldata_DE,design = ~ Sex + Condition)
  515. levels(dds_DE$Condition)
  516. levels(dds_DE$Sex)
  517. dds_DE$condition <- relevel(dds_DE$Condition, ref = "Control")
  518. # Keep only genes that have non-zero reads in total
  519. keep <- rowSums(counts(dds_DE)) > 0
  520. dds_DE <- dds_DE[keep,]
  521. dds_DE <- DESeq(dds_DE)
  522. resultsNames(dds_DE)
  523. resDE <- results(dds_DE, alpha = 0.05, contrast = c("Condition","Interaction","Control"), test ="Wald")#So up/downregulation refers to interaction i.e upregulated in interaction or downregulated in interaction
  524. summary(resDE)
  525. resDE
  526. resultsDE <- data.frame(resDE)
  527. resultsDE <- na.omit(resultsDE)
  528. sig_results_DE <- resultsDE[resultsDE$padj<0.05, ]
  529. setwd("./DE_results_wald_test/")
  530. write.csv(resultsDE,file="DE_results_all_DE.csv")
  531. write.csv(sig_results_DE,file="DE_results_sig_DE.csv")
  532. #****************************************************************************
  533. # merge DE gene list with GO functional annotation
  534. setwd("D:/A.clarkii/clarkii_brain_DE/DE_results_wald_test/")
  535. GO <- read.csv("A.clarkii_GO_Annotation_edited.csv")
  536. BS <- read.csv("DE_results_sig_final_BS.csv")
  537. merge <- merge(BS,GO,by="Geneid",all.x=T)
  538. write.csv(merge,file="DE_results_sig_final_BS_annotation.csv")
  539. CB <- read.csv("DE_results_sig_final_CB.csv")
  540. merge <- merge(CB,GO,by="Geneid",all.x=T)
  541. write.csv(merge,file="DE_results_sig_final_CB_annotation.csv")
  542. DE <- read.csv("DE_results_sig_final_DE.csv")
  543. merge <- merge(DE,GO,by="Geneid",all.x=T)
  544. write.csv(merge,file="DE_results_sig_final_DE_annotation.csv")
  545. TE <- read.csv("DE_results_sig_final_TE.csv")
  546. merge <- merge(TE,GO,by="Geneid",all.x=T)
  547. write.csv(merge,file="DE_results_sig_final_TE_annotation.csv")
  548. OT <- read.csv("DE_results_sig_final_OT.csv")
  549. merge <- merge(OT,GO,by="Geneid",all.x=T)
  550. write.csv(merge,file="DE_results_sig_final_OT_annotation.csv")
  551. ############################################## Venn Diagrams
  552. # http://www.interactivenn.net/index2.html
  553. ##### merge individual brain regions to get a combined mega file
  554. setwd("D:/A.clarkii/clarkii_brain_DE/DE_results_wald_test/final_files")
  555. BS <- read.csv("DE_results_sig_final_BS_annotation.csv")
  556. CB <- read.csv("DE_results_sig_final_CB_annotation.csv")
  557. DE <- read.csv("DE_results_sig_final_DE_annotation.csv")
  558. OT <- read.csv("DE_results_sig_final_OT_annotation.csv")
  559. TE <- read.csv("DE_results_sig_final_TE_annotation.csv")
  560. df_list <- list(BS,CB,DE,OT,TE)
  561. merge <- Reduce(function(x, y) merge(x, y, all=TRUE), df_list)
  562. write.csv(merge,file="clarkii_DE_final_Allcombined.csv",row.names=F)
  563. ############################################## Heatmap
  564. library(ggplot2)
  565. library(ggbeeswarm) # for beeswarm plot
  566. library(ggrepel)
  567. setwd("D:/A.clarkii/clarkii_brain_DE/DE_results_wald_test/final_files")
  568. file <- read.csv("file_for_box.csv")
  569. file1 <- na.omit(file)
  570. ggplot(file1,aes(x=Brain_Region,y=log2FoldChange,color=Brain_Region)) +
  571. geom_quasirandom(size=4) + theme_bw() + theme(legend.title=element_blank()) +
  572. theme(legend.text=element_text(size=18)) + geom_text_repel(data=file1,aes(label=Gene_symbol_NCBI),position=position_quasirandom(),size=4) +
  573. theme(axis.text=element_text(size=18),axis.title.x = element_blank(), axis.title.y=element_text(size=22)) +
  574. scale_fill_manual(values=c("#F8766D","A3A500","00BF7D","00B0F6","E76BF3")) +
  575. geom_hline(yintercept=0, linetype="dashed",color="black",size=1)
  576. setwd("D:/A.clarkii/clarkii_brain_DE/figures")
  577. ggsave(file="brain_regions_beeswarm.png",dpi=300,width=20, height=20,units="cm")
  578. # ============================================
  579. # Test overlap between sig sex effect genes from LRT and the sig DE genes from Wald test
  580. # ============================================
  581. setwd("D:/A.clarkii/clarkii_brain_DE")
  582. lrt_sex <- read.csv("LRT_results/LRT_results_sex_effect_sig.csv",row.names=1)
  583. sex <- rownames(lrt_sex)
  584. de_genes <- read.csv("DE_results_wald_test/final_files/clarkii_DE_final_Allcombined.csv",row.names=1)
  585. brain_de <- rownames(de_genes)
  586. overlap <- intersect(sex, brain_de)

clarkii_brain_DE.R at commit da1ba09, under GPL-2.0 · at the source

Overview

  1. Swire Institute of Marine Science and School of Biological Sciences, The University of Hong Kong, Hong Kong SAR, China
  2. Department of Environmental Conservation, University of Massachusetts, Amherst, MA 01003, USA
  3. State Key Laboratory of Marine Environmental Health (SKLMEH), City University of Hong Kong, Hong Kong SAR, China
Institutions: University of Massachusetts Amherst (United States); University of Hong Kong (Hong Kong SAR China); City University of Hong Kong (Hong Kong SAR China)
Journal: Genome biology and evolution, volume 18, issue 8, article evag197
Dates: accepted 24 July 2026; published online 31 July 2026; in print August 2026
Type: Research article · Language: English
License: CC BY-NC
Identifiers: DOI 10.1093/gbe/evag197 · PMID 42535633 · PMCID PMC13481981 · OpenAlex W4413614195
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), other (organism), cellular / molecular (subfield)
Methods: Statistics, Smoothing, state filtering, decompositions, Connectivity
Keywords: mutualism, transcriptomics, symbiosis, anemonefish, sea anemone, Amphiprion clarkii
MeSH: Anemone*, Fishes*, Gene Expression Profiling*, Symbiosis*, Animals, Aromatase, Behavior, Animal, Brain, Cnidarian Venoms, Cytoskeletal Proteins, Fish Proteins, Olfactory Perception, Skin (* major topic)
Topic: Marine Invertebrate Physiology and Ecology (Paleontology, Earth and Planetary Sciences), according to OpenAlex
Funding: University of Hong Kong
Citations: not cited yet (Europe PMC); 96 references in the paper

Abstract

The anemone–anemonefish mutualism is one of the most iconic in the marine environment. While the evolution of this mutualistic relationship has contributed to the ecological success of both partners, the underlying molecular processes that establish and maintain it remain poorly understood, particularly how anemonefish tolerate anemone venom. Here, we characterize the transcriptional dynamics in both the anemonefish Amphiprion clarkii and its host anemone Entacmaea quadricolor 48 h after association, providing a rare insight into the coordinated molecular processes in both partners that underlie symbiosis establishment. Upon acclimation with an anemone, anemonefish showed differential regulation of sensory perception and memory genes in key brain regions, indicating activation of neural pathways that may facilitate host recognition and mutualism establishment. In the fish's skin, altered expression of genes involved in neurotransmitter release, cytoskeleton organization, and venom receptor proteins points to mechanisms of resistance to anemone venom. This resistance is particularly remarkable since anemone hosting fish exhibited increased expression of genes encoding mechanoreceptors, putative venom-associated proteins, and ion channels involved in nematocyst discharge, indicating the anemone does indeed mount an active response to their mutualistic partner. By simultaneously capturing the molecular responses of both symbiotic partners, our results reveal the complex, coordinated interplay of molecular events in both species that play a pivotal role in establishing this mutualistic relationship.

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

Repository

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

sneha100895/Anemone-anemonefish-mutualism-RNA-Seq

License: GPL-2.0
State: the link answers, verified on 26 September 2026
Evidence: files inventoried
Commit: da1ba091cf1a7213c50910e8b8c86c83ba1aaadc, 28 July 2026
Languages: R (3)
Size: 6 files, 3 scripts
Software Heritage: not archived
Found in: “Data Availability”
Holds: README, license file
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Tools: DESeq2 (3 files), ggplot2 (3 files), ggpubr (3 files), pheatmap (3 files), tidyverse (3 files)
Availability: 1 check, the latest on 26 September 2026: the link answers
  • 26 September 2026: the link answers
5 files

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;
  • 3 scripts, each with its path and the digest of its content;
  • 4 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

The RNA-Seq raw sequences are deposited in NCBI under BioProject ID PRJNA1056457. Code used for analyses is available at https://github.com/sneha100895/Anemone-anemonefish-mutualism-RNA-Seq

Reproduced under the paper's license (CC BY-NC), 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, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 3 authors, 6 keywords, 13 MeSH terms, 1 funder, 92 references.

Cite

This paper

Suresh, S., Romeo, D., & Schunter, C. (2026). Molecular Drivers of Mutualistic Association Between Anemone and Anemonefish. Genome biology and evolution, 18(8), evag197. https://doi.org/10.1093/gbe/evag197

BibTeX

@article{suresh2026molecular,
author = {Suresh, Sneha and Romeo, Daniele and Schunter, Celia},
title = {{Molecular Drivers of Mutualistic Association Between Anemone and Anemonefish}},
journal = {Genome biology and evolution},
year = {2026},
month = aug,
volume = {18},
number = {8},
pages = {evag197},
publisher = {Oxford University Press},
issn = {1759-6653},
doi = {10.1093/gbe/evag197},
url = {https://doi.org/10.1093/gbe/evag197},
pmid = {42535633},
pmcid = {PMC13481981}
}

RIS

TY - JOUR
AU - Suresh, Sneha
AU - Romeo, Daniele
AU - Schunter, Celia
TI - Molecular Drivers of Mutualistic Association Between Anemone and Anemonefish
T2 - Genome biology and evolution
J2 - Genome Biol Evol
PY - 2026
DA - 2026/08/01
VL - 18
IS - 8
SP - evag197
SN - 1759-6653
PB - Oxford University Press
DO - 10.1093/gbe/evag197
UR - https://doi.org/10.1093/gbe/evag197
LA - en
ER -

CSL-JSON

{
"id": "10.1093/gbe/evag197",
"type": "article-journal",
"title": "Molecular Drivers of Mutualistic Association Between Anemone and Anemonefish",
"container-title": "Genome biology and evolution",
"author": [
{
"family": "Suresh",
"given": "Sneha"
},
{
"family": "Romeo",
"given": "Daniele"
},
{
"family": "Schunter",
"given": "Celia"
}
],
"container-title-short": "Genome Biol Evol",
"volume": "18",
"issue": "8",
"page": "evag197",
"DOI": "10.1093/gbe/evag197",
"PMID": "42535633",
"PMCID": "PMC13481981",
"ISSN": "1759-6653",
"publisher": "Oxford University Press",
"URL": "https://doi.org/10.1093/gbe/evag197",
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
1
]
]
}
}

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.1093/nar/gkag294 [code]
Developmental stage dominates cell-type identity and reveals a chromatin regulatory function for Rad50 in Drosophila.
Journal: Nucleic acids research
In common: DESeq2, pheatmap, ggpubr, 2 other tools, 4 references
[2] doi:10.1038/s41467-026-76688-w [code]
Transcriptome profiling of human hypothalamic agouti-related protein and proopiomelanocortin neurons regulating energy homeostasis.
Journal: Nature communications
In common: DESeq2, pheatmap, ggpubr, 2 other tools, genetics / omics, cellular / molecular, 3 references
[3] doi:10.1038/s41586-026-10629-x [code]
Whole-genome duplication shaped cell-type evolution in the vertebrate brain.
Journal: Nature
In common: DESeq2, pheatmap, ggpubr, 2 other tools, other, genetics / omics, cellular / molecular, 2 references
[4] doi:10.7554/elife.107393 [code]
Chromosome-scale genome assembly of the European common cuttlefish &lt;i&gt;Sepia officinalis&lt;/i&gt;.
Journal: eLife
In common: DESeq2, pheatmap, ggplot2, 1 other tool, other, cellular / molecular, 3 references
[5] doi:10.1093/nar/gkag788 [code]
Neuronal activity-driven 3D chromatin dynamics in cortical pyramidal neurons depend on SATB2.
Journal: Nucleic acids research
In common: DESeq2, pheatmap, ggplot2, 1 other tool, cellular / molecular, 4 references
[6] doi:10.1038/s42003-026-10402-w [code]
Temporal orchestration of transcriptional and epigenomic programming underlying maternal embryonic diapause in a cricket model.
Journal: Communications biology
In common: DESeq2, pheatmap, ggplot2, 1 other tool, other, genetics / omics, 3 references
[7] doi:10.1016/j.stemcr.2026.102930 [code]
ZFHX4 is necessary for dopaminergic neuron differentiation and controls cell cycle by regulating LIN28A.
Journal: Stem cell reports
In common: DESeq2, pheatmap, ggpubr, 2 other tools, genetics / omics, cellular / molecular, 2 references
[8] doi:10.1038/s41586-026-10512-9 [code]
Astrocyte glucocorticoid receptor signalling restricts neuronal plasticity.
Journal: Nature
In common: DESeq2, pheatmap, ggpubr, 2 other tools, cellular / molecular, 2 references
[9] doi:10.21203/rs.3.rs-9927928/v1 [code]
Genome-wide and allele-resolved maps of the radial architecture of the mouse genome
Journal: Research Square (preprint)
In common: DESeq2, pheatmap, ggpubr, 2 other tools, genetics / omics, 2 references
[10] 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: DESeq2, pheatmap, ggpubr, 2 other tools, genetics / omics, 2 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.