OSCR

Integrative multi-omics profiling reveals distinct evolutionary and immunogenic features of brain oligometastasis in lung adenocarcinoma.

Code ↔ Paper

12 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 12 matches
  1. [1] § Methods › Transcription factors activity profiles ↔ Figure 5.R, lines 473–512 · score 0.99 · transcriptional regulatory networks, consensus bootstrap, transcriptome expression profile, Spearman rank, bootstrapping strategy, unstable associations
  2. [2] § Results › Integrative analysis of transcriptome and methylome identified NLGN1 as a prognostic biomarker associated with olig-BMs ↔ Figure 5.R, lines 312–396 · score 0.82 · neuroactive ligand receptor, cell adhesion molecules, receptor interaction, intersection, KEGG, hypo
  3. [3] § Results › DNA methylation profiles between primary LUAD and oligo-BMs ↔ Figure 5.R, lines 53–141 · score 0.62 · mCHG, mCHH, mCpG, metastasis
  4. [4] § Results › DNA methylation profiles between primary LUAD and oligo-BMs ↔ Figure 5.R, lines 473–512 · score 0.62 · transcriptional regulatory networks, RTN, TFs, activity, regulons, reconstructed
  5. [5] § Methods › Immune infiltration classification ↔ Figure 4.R, lines 2–72 · score 0.62 · ConsensusClusterPlus, Euclidean, infiltration, GSVA, ssGSEA, distance
  6. [6] § Results › Comparison of mutational features between paired primary LUAD and oligo-BMs ↔ Figure 1.R, lines 353–416 · score 0.61 · CNV loss burden, CNV gains, correlation, metastatic
  7. [7] § Results › Subclonal architecture, phylogenetic relationships and mutational signatures in matched primary LUAD and oligo-BMs ↔ Figure 1.R, lines 310–351 · score 0.59 · parallel progression model, linear progression model, branches, private, evolution, Metastatic
  8. [8] § Results › Comparison of TIME between primary LUAD and oligo-BMs ↔ Figure 4.R, lines 76–145 · score 0.59 · natural killer, immune score, immature, activated, ssGSEA, cells
  9. [9] § Results › DNA methylation profiles between primary LUAD and oligo-BMs ↔ Figure 5.R, lines 950–989 · score 0.58 · regulon activity, reconstruct transcriptional, RTN, networks, consensus, motifs
  10. [10] § Results › Subclonal architecture, phylogenetic relationships and mutational signatures in matched primary LUAD and oligo-BMs ↔ Figure 1.R, lines 310–351 · score 0.57 · parallel progression model, linear progression model, trunk, branch, private, evolutionary
  11. [11] § Methods › mIHC ↔ Figure 4.R, lines 149–198 · score 0.53 · natural killer, RNA seq, immune, regulatory, cell
  12. [12] § Results › Comparison of mutational features between paired primary LUAD and oligo-BMs ↔ Figure 1.R, lines 353–416 · score 0.53 · CNV loss burden, CNV gain, ratio, SNV, Correlation, metastatic

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 · 1,171 lines · 45 KB · no license · 5 matches

  1. # 原发和脑转整体的甲基化水平比较 ---------------------------------------------------------
  2. methy_level <-read.delim("all.cpg_human.xls",check.names = F)
  3. clincal <- read.delim("../clinical.group.txt")
  4. mc_Mal <- merge(methy_level,clincal,by.x = 'Sample',by.y='sampleid.gm')
  5. colnames(mc_Mal) <- gsub('\\(.*\\)','',colnames(mc_Mal)) # 去除括号及括号内%
  6. mc_Mal$mCpG <- as.numeric(mc_Mal$mCpG)/100 # 暂时只用了mCpG值
  7. mc_Mal$mCHG <- as.numeric(mc_Mal$mCHG)/100 # 暂时只用了mCpG值
  8. mc_Mal$mCHH <- as.numeric(mc_Mal$mCHH)/100 # 暂时只用了mCpG值
  9. mc_Mal$mC <- as.numeric(mc_Mal$mC)/100 # 暂时只用了mCpG值
  10. mc_Mal$group <- factor(mc_Mal$group,levels = c('Primary','Metastases'))
  11. my_comparisons <- c('Primary','Metastases')
  12. ggboxplot(mc_Mal,x='group',y='mCpG',
  13. add='jitter',color='group',
  14. palette = c("#0C7094","#E21D31"),
  15. xlab = '',
  16. ylab ="Rates of mCpG / total C")+stat_compare_means()+theme_bw()+theme(panel.grid = element_blank(),legend.position = 'none')
  17. ggsave(file="../paper1.Figure/mCpG_global_meth.pdf",width=3,height=3)
  18. ggboxplot(mc_Mal,x='group',y='mCHG',
  19. add='jitter',color='group',
  20. palette = c("#0C7094","#E21D31"),
  21. ylab ="Rates of mCHG / total C")+stat_compare_means()+theme_bw()+theme(panel.grid = element_blank(),legend.position = 'none')
  22. ggsave(file="../paper1.Figure/mCHG_global_meth.pdf",width=3,height=3)
  23. ggboxplot(mc_Mal,x='group',y='mCHH',
  24. add='jitter',color='group',
  25. palette = c("#0C7094","#E21D31"),
  26. ylab ="Rates of mCHH / total C")+stat_compare_means()+theme_bw()+theme(panel.grid = element_blank(),legend.position = 'none')
  27. ggsave(file="../paper1.Figure/mCHH_global_meth.pdf",width=3,height=3)
  28. ggboxplot(mc_Mal,x='group',y='mC',
  29. add='jitter',color='group',
  30. palette = c("#0C7094","#E21D31"),
  31. ylab ="Rates of mC / total C")+stat_compare_means()+theme_bw()+theme(panel.grid = element_blank(),legend.position = 'none')
  32. ggsave(file="../paper1.Figure/mC_global_meth.pdf",width=3,height=3)
  33. ### paired
  34. paired_mal <- dcast(mc_Mal,PID~group,value.var = 'mCpG')
  35. ggpaired(paired_mal,cond1 = 'Primary',cond2 = 'Metastases',
  36. color='condition',palette = c("#0C7094","#E21D31"),
  37. ylab='mCpG',
  38. xlab = "",
  39. line.color = 'lightgrey')+stat_compare_means(paired = T)+theme_bw()+theme(panel.grid = element_blank(),legend.position = 'none')
  40. ggsave(file="../paper1.Figure/mCpG_global_meth.paired.pdf",width=3,height=3)
  41. paired_mal <- dcast(mc_Mal,PID~group,value.var = 'mCHG')
  42. ggpaired(paired_mal,cond1 = 'Primary',cond2 = 'Metastases',
  43. color='condition',palette = c("#0C7094","#E21D31"),
  44. ylab='mCHG',
  45. xlab = "",
  46. line.color = 'lightgrey')+stat_compare_means(paired = T)+theme_bw()+theme(panel.grid = element_blank(),legend.position = 'none')
  47. ggsave(file="../paper1.Figure/mCHG_global_meth.paired.pdf",width=3,height=3)
  48. paired_mal <- dcast(mc_Mal,PID~group,value.var = 'mCHH')
  49. ggpaired(paired_mal,cond1 = 'Primary',cond2 = 'Metastases',
  50. color='condition',palette = c("#0C7094","#E21D31"),
  51. ylab='mCHH',
  52. xlab = "",
  53. line.color = 'lightgrey')+stat_compare_means(paired = T)+theme_bw()+theme(panel.grid = element_blank(),legend.position = 'none')
  54. ggsave(file="../paper1.Figure/mCHH_global_meth.paired.pdf",width=3,height=3)
  55. paired_mal <- dcast(mc_Mal,PID~group,value.var = 'mC')
  56. ggpaired(paired_mal,cond1 = 'Primary',cond2 = 'Metastases',
  57. color='condition',palette = c("#0C7094","#E21D31"),
  58. ylab='mC',
  59. xlab = "",
  60. line.color = 'lightgrey')+stat_compare_means(paired = T)+theme_bw()+theme(panel.grid = element_blank(),legend.position = 'none')
  61. ggsave(file="../paper1.Figure/mC_global_meth.paired.pdf",width=3,height=3)
  62. # cpg聚类 ---------------------------------------------------------------------
  63. library(data.table)
  64. cpg.all <- as.data.frame(fread("metilene.DMR/DMC/metilene_case_ctrl.input"))
  65. group <- read.delim("metilene.DMR/metastases_vs_primary.txt")
  66. colnames(cpg.all)[3:ncol(cpg.all)] <- c(unlist(strsplit(group$metastases,",")),unlist(strsplit(group$primary,",")))
  67. clinical <- read.delim("../clinical.group.txt")
  68. rownames(cpg.all) <- paste(cpg.all$chrom,cpg.all$pos,sep=':')
  69. cpg.all <- cpg.all[,c(-1,-2)]
  70. cpg.all1 <- cpg.all[rowSums(!is.na(cpg.all)) >= 40*0.9 & rowSums(cpg.all,na.rm = TRUE)!=0,]
  71. dim(cpg.all1)
  72. high_var_cpg <- selectHighVari(cpg.all1,top=T)
  73. p <- plot(high_var_cpg,"../paper1.Figure/Top1000.highVariableCpG.pdf")
  74. saveRDS(high_var_cpg,file = '../paper1.Figure/Top1000.highVariableCpG.rds')
  75. gc()
  76. g1 <- cpg.all[,clinical$sampleid.gm[clinical$group=='Metastases']]
  77. g11 <- g1[rowSums(!is.na(g1))>=ncol(g1)*0.9 & rowSums(g1,na.rm = TRUE)!=0 ,]
  78. g11_high <- selectHighVari(g11,top=T)
  79. plot(g11_high,"../paper1.Figure/Top1000.meta.highVariableCpG.pdf")
  80. gc()
  81. g3 <- cpg.all[,clinical$sampleid.gm[clinical$group=='Primary']]
  82. g31 <- g3[rowSums(!is.na(g3))>=ncol(g3)*0.9 & rowSums(g3,na.rm = TRUE)!=0,]
  83. g31_high <- selectHighVari(g31,top=T)
  84. plot(g31_high,"../paper1.Figure/Top1000.pri.highVariableCpG.pdf")
  85. gc()
  86. top <- cpg.all1[rownames(cpg.all1) %in% unique(c(rownames(g11_high),rownames(g31_high))),]
  87. plot(top,"../paper1.Figure/Top2000.highVariableCpG.pdf")
  88. gc()
  89. ##############一致性聚类
  90. selectHighVari <- function(cpg,top=T){
  91. ###### 高变
  92. variances <- apply(cpg, 1, function(x){var(x,na.rm = TRUE)}) # 计算每个位点的方差
  93. # 计算前1%的阈值
  94. threshold <- quantile(variances, 0.99)
  95. # 筛选出变异程度最高的前1%的CpG位点
  96. high_var_cpg <- cpg[variances > as.numeric(threshold), ]
  97. print(dim(high_var_cpg))
  98. top.res <- NULL
  99. if(top){
  100. top.res <- high_var_cpg[1:1000,]
  101. }else{
  102. top.res <- high_var_cpg
  103. }
  104. return(top.res)
  105. }
  106. plot <- function(dat,out2){
  107. library(ComplexHeatmap)
  108. group <- read.delim("../variation.group.txt")
  109. clinical <- read.delim("../clinical.group.txt")
  110. group <- merge(clinical,group,by.y='吉因加编码',by.x='sampleid.1021')
  111. rownames(group) <- group$sampleid.gm
  112. attri <- na.omit(unique(c(group$PID.x,group$group,group$time,group$EGFR.19del.21L858R,group$ALK.Fusion,group$MET.Fusion,group$KRAS,group$TP53,group$RBM10,group$CDKN2A.B.Loss,group$MYC.Gain,group$EGFR.gain,group$RB1.loss,group$ZFHX3)))
  113. col <- c(ggsci::pal_npg(palette = 'nrc')(10),ggsci::pal_futurama('planetexpress')(12),"#F3A9AB","#F39E2E","#BCBCC2","#EA500D","#90B5D8","#005599","#7A609F","#E46FA1","#264C53","#5BA98E","#009BC9","#009045","#B34345","red","blue","red")[1:length(attri)]
  114. names(col) <- attri
  115. col.list <- list(PID=col[na.omit(unique(group$PID.x))],Site=col[na.omit(unique(group$group))],Time=col[na.omit(unique(group$time))],EGFR=col[na.omit(unique(group$EGFR.19del.21L858R))],EGFR.gain=col[na.omit(unique(group$EGFR.gain))],ALK=col[na.omit(unique(group$ALK.Fusion))],MET=col[na.omit(unique(group$MET.Fusion))],KRAS=col[na.omit(unique(group$KRAS))],TP53=col[na.omit(unique(group$TP53))],RBM10=col[na.omit(unique(group$RBM10))],`CDKN2A/B`=col[na.omit(unique(group$CDKN2A.B.Loss))],MYC=col[na.omit(unique(group$MYC.Gain))],RB1.loss=col[na.omit(unique(group$RB1.loss))],ZFHX3=col[na.omit(unique(group$ZFHX3))])
  116. group <- group[colnames(dat),]
  117. print(identical(rownames(group),colnames(dat)))
  118. pdf(file = out2,width = 10,height = 6)
  119. p <- Heatmap(as.matrix(dat),show_column_names = F,
  120. show_row_names = F,
  121. #row_km = 2,
  122. #clustering_method_rows = 'pam',
  123. bottom_annotation = columnAnnotation(PID=group$PID.x,Site=group$group,Time=group$time,EGFR=group$EGFR.19del.21L858R,EGFR.gain=group$EGFR.gain,ALK=group$ALK.Fusion,MET=group$MET.Fusion,KRAS=group$KRAS,TP53=group$TP53,RBM10=group$RBM10,`CDKN2A/B`=group$CDKN2A.B.Loss,MYC=group$MYC.Gain,RB1.loss=group$RB1.loss,ZFHX3=group$ZFHX3,
  124. col=col.list,simple_anno_size = unit(2.5, "mm"),annotation_name_gp = gpar(fontsize = 5)),
  125. #left_annotation = rowAnnotation(CpG=top.anno1$annot.type,col=list(CpG=col[40:43]),simple_anno_size = unit(2.5, "mm")),
  126. #right_annotation =rowAnnotation(anno=anno_mark(at=anno_at,labels=anno_mark,labels_gp = gpar(fontsize = 5)))
  127. )
  128. print(p)
  129. dev.off()
  130. return(p)
  131. }
  132. tf_plot <- function(path,qvalue=0.1,pvalue=0.05){
  133. hyper <- read.delim(paste(path,"/motif/hyper/knownResults.txt",sep=""),check.names = F)
  134. hyper$`log10(q.value)` <- -log10(hyper$`q-value (Benjamini)`)
  135. hyper$motifRank <- 1:nrow(hyper)
  136. hyper$TF <- gsub("\\(.*","",hyper$`Motif Name`)
  137. hyper$group <- 'hyper'
  138. hypo <- read.delim(paste(path,"/motif/hypo/knownResults.txt",sep=""),check.names = F)
  139. hypo$`log10(q.value)` <- log10(hypo$`q-value (Benjamini)`)
  140. hypo$motifRank <- 1:nrow(hypo)
  141. hypo$TF <- gsub("\\(.*","",hypo$`Motif Name`)
  142. hypo$group <- 'hypo'
  143. all <- rbind(hyper[,c("motifRank","TF","group","log10(q.value)",'q-value (Benjamini)','P-value')],hypo[,c("motifRank","TF","group","log10(q.value)",'q-value (Benjamini)','P-value')])
  144. library(ggpubr)
  145. all$sizeColor <- ifelse(all$`q-value (Benjamini)`<qvalue & all$`P-value`<pvalue,'red','grey')
  146. show_label <- all[all$`q-value (Benjamini)`<qvalue & all$`P-value`<pvalue,]
  147. p <- ggscatter(all,x='motifRank',y='log10(q.value)',
  148. color = 'sizeColor',
  149. palette = c('grey','red'),
  150. #label = 'TF',
  151. #label.select = list(criteria = "`q-value (Benjamini)` <0.1")
  152. )+ggrepel::geom_text_repel(data = show_label,aes(x=motifRank,y=`log10(q.value)`,label=TF))
  153. return(list(p,show_label))
  154. }
  155. enricher2 <- function(genelist){
  156. library(msigdbr)
  157. library(clusterProfiler)
  158. keggdb = msigdbr(species = "Homo sapiens", category = "C2",subcategory = "KEGG")
  159. keggdb <- keggdb[,c('gs_name','gene_symbol')]
  160. colnames(keggdb) <- c('TERM','GENE')
  161. ekegg.up <- clusterProfiler::enricher(genelist,
  162. TERM2GENE=keggdb,pvalueCutoff = 0.05,
  163. pAdjustMethod = "BH",qvalueCutoff = 0.2)
  164. return(ekegg.up)
  165. }
  166. # Tp53模式分析 ---------------------------------------------------------------------
  167. ### TP53聚成了两类
  168. p@column_names_param$labels[column_order(p)]
  169. ## 一簇是unlist(ht[[1]]);另一簇是unlist(ht[[2]])
  170. ht <- column_dend(p)
  171. c1.tp53.wild <- colnames(high_var_cpg)[unlist(ht[[1]])]
  172. c2.tp53.mut <- colnames(high_var_cpg)[unlist(ht[[2]])]
  173. group <- read.delim("../variation.group.txt")
  174. clinical <- read.delim("../clinical.group.txt")
  175. group <- merge(clinical,group,by.y='吉因加编码',by.x='sampleid.1021')
  176. rownames(group) <- group$sampleid.gm
  177. ### 第二个cluster中都是TP53突变型
  178. raw.tp53.mut <- group$sampleid.gm[!is.na(group$TP53) & group$TP53=='TP53']
  179. ### 去掉第一个cluster中的Tp53突变型,因为第一个cluster认为是TP53野生型
  180. c1.tp53.wild <- setdiff(c1.tp53.wild,raw.tp53.mut)
  181. ### 根据cluster1和cluster2构建cpg位点矩阵
  182. dat.final <- high_var_cpg[,c(c2.tp53.mut,c1.tp53.wild)]
  183. dat.final$p.value <- apply(dat.final,1,function(x) {
  184. res <- wilcox.test(na.omit(as.numeric(x[1:length(c2.tp53.mut)])),na.omit(as.numeric(x[(length(c2.tp53.mut)+1):length(x)])))
  185. return(res$p.value)})
  186. dat.final$TP53.mut.mean <- rowMeans(dat.final[,c2.tp53.mut],na.rm = T)
  187. dat.final$TP53.wild.mean <- rowMeans(dat.final[,c1.tp53.wild],na.rm = T)
  188. dat.final$mean.meth.diff <- dat.final$TP53.mut.mean-dat.final$TP53.wild.mean
  189. #### dat.final进行cpg位点注释
  190. devtools::install_github('rcavalcante/annotatr',force = T)
  191. BiocManager::install('TxDb.Hsapiens.UCSC.hg19.knownGene')
  192. library(GenomicRanges)
  193. library(annotatr)
  194. library(TxDb.Hsapiens.UCSC.hg19.knownGene)
  195. library(readxl)
  196. mat <- dat.final
  197. mat$ID <- rownames(mat)
  198. rownames(mat) <- NULL
  199. mat <- tidyr::separate(mat,col='ID',into=c("chr","end"),sep=':')
  200. mat$end <- as.numeric(mat$end)
  201. mat$start <- mat$end-1
  202. mat$chr <- paste("chr",mat$chr,sep="")
  203. mat_regions <- GRanges(mat)
  204. annotations <- readRDS("metilene.DMR/DMR/annotations.db.rds")
  205. dm.all_annotated = annotate_regions(
  206. regions = mat_regions,
  207. annotations = annotations,
  208. ignore.strand = TRUE,
  209. quiet = FALSE)
  210. # A GRanges object is returned
  211. print(dm.all_annotated)
  212. # Coerce to a data.frame
  213. df_dm.all_annotated = data.frame(dm.all_annotated)
  214. saveRDS(dm.all_annotated,file = '../paper1.Figure/TP53.group.cpg.anno.rds')
  215. # DMC中发生最高频甲基化的基因 ---------------------------------------------------------------------
  216. library(ggpubr)
  217. library(data.table)
  218. library(GenomicRanges)
  219. clinical <- read.delim("../clinical.group.txt")
  220. dmc <- readRDS("metilene.DMR/DMC/DMC.all.annotation.rds")
  221. dmc <- as.data.frame(dmc)
  222. ### 差异DMC
  223. dmc1 <- dmc[dmc$p.value<0.05 & abs(dmc$mean.meth.diff)>0.1,]
  224. dmc1$flag <- paste(gsub("^chr","",dmc1$seqnames),dmc1$end,sep=':')
  225. #dmc11 <- unique(dmc1$flag[dmc1$annot.type %in% c('hg19_cpg_islands',"hg19_genes_promoters","hg19_genes_1to5kb")])
  226. #dmc2 <- unique(dmc1[dmc1$flag %in% dmc11 & !is.na(dmc1$annot.symbol),c("flag","annot.symbol","mean.meth.diff")])
  227. ### 筛选出脑转移高甲基化,且均值不小于0.1, 或者原发高甲基化,且均值不小于0.1的DMC
  228. #dmc11 <- dmc1[(dmc1$mean.meth.diff>0 & dmc1$metastases>0.1) | (dmc1$mean.meth.diff<0 & dmc1$primary>0.1),]
  229. dmc2 <- unique(dmc1[!is.na(dmc1$annot.symbol),c("flag","annot.symbol","mean.meth.diff")])
  230. ### 分别找到hyper和hypo发生高频甲基化的基因
  231. gene.dis.hyper <- as.data.frame(table(dmc2$annot.symbol[dmc2$mean.meth.diff>0]))
  232. gene.dis.hyper <- gene.dis.hyper[order(gene.dis.hyper$Freq,decreasing = T),]
  233. gene.dis.hyper$group <- 'hyper'
  234. gene.dis.hypo <- as.data.frame(table(dmc2$annot.symbol[dmc2$mean.meth.diff<0]))
  235. gene.dis.hypo <- gene.dis.hypo[order(gene.dis.hypo$Freq,decreasing = T),]
  236. gene.dis.hypo$group <- 'hypo'
  237. all.gene.dis <- rbind(gene.dis.hyper[1:20,],gene.dis.hypo[1:20,])
  238. all.gene.dis <- all.gene.dis[order(all.gene.dis$Freq,decreasing = T),]
  239. all.gene.dis$Var1 <- factor(all.gene.dis$Var1,levels = all.gene.dis$Var1[!duplicated(all.gene.dis$Var1)])
  240. ggbarplot(all.gene.dis,x='Var1',y='Freq',color='group',fill='group',position = position_dodge(),palette = c("#D32331","#0E6C8C"),xlab = '')+theme_bw()+theme(panel.grid = element_blank(),axis.text.x = element_text(angle = 90,hjust = 1))
  241. ggsave("../paper1.Figure/highFreq.gene.pdf",width = 8,height = 4)
  242. library(msigdbr)
  243. keggdb = msigdbr(species = "Homo sapiens", category = "C2",subcategory = "KEGG")
  244. keggdb <- keggdb[,c('gs_name','gene_symbol')]
  245. colnames(keggdb) <- c('TERM','GENE')
  246. CAMC <- keggdb$GENE[keggdb$TERM=='KEGG_CELL_ADHESION_MOLECULES_CAMS']
  247. NLRI <- keggdb$GENE[keggdb$TERM=='KEGG_NEUROACTIVE_LIGAND_RECEPTOR_INTERACTION']
  248. intersect(CAMC,gene.dis.hyper$Var1[1:30])
  249. intersect(CAMC,gene.dis.hypo$Var1[1:30])
  250. intersect(NLRI,gene.dis.hyper$Var1[1:30])
  251. intersect(NLRI,gene.dis.hypo$Var1[1:30])
  252. ekegg.up <- clusterProfiler::enricher(gene.dis.hyper$Var1[1:50],
  253. TERM2GENE=keggdb,pvalueCutoff = 1,
  254. pAdjustMethod = "BH",qvalueCutoff = 1)
  255. kegg_res <- ekegg.up@result
  256. kegg_res$generatio <- apply(kegg_res,1,generatio)
  257. p <- enrichplot(kegg_res,"Pathways enriched in metastases (hyper in metastases)")
  258. print(p)
  259. ggsave("../paper1.Figure/highFreqGene.meta.pathway.pdf",width = 6,height = 4)
  260. ekegg.down <- clusterProfiler::enricher(gene.dis.hypo$Var1[1:50],
  261. TERM2GENE=keggdb,pvalueCutoff = 0.05,
  262. pAdjustMethod = "BH",qvalueCutoff = 0.2)
  263. kegg_res <- ekegg.down@result
  264. kegg_res$generatio <- apply(kegg_res,1,generatio)
  265. p <- enrichplot(kegg_res,"Pathways enriched in primary (hyper in primary)")
  266. print(p)
  267. ggsave("../paper1.Figure/highFreqGene.pri.pathway.pdf",width = 8,height = 4)
  268. #### 再从这些高频甲基化基因中查看经常发生甲基化的基因区域
  269. high <- unique(dmc1[!is.na(dmc1$annot.symbol) & dmc1$annot.symbol %in% unique(all.gene.dis$Var1),c("flag","annot.symbol","mean.meth.diff","annot.type")])
  270. high$group <- ifelse(high$mean.meth.diff>0,"hyper","hypo")
  271. high1 <- as.data.frame(table(high[,c("group","annot.symbol","annot.type")]))
  272. # 提取NLGN1的DMC -------------------------------------------------------------
  273. NLGN1 <- dmc1[!is.na(dmc1$annot.symbol) & dmc1$annot.symbol=='NLGN1',]
  274. NLGN1$flag <- paste(NLGN1$seqnames,NLGN1$start,NLGN1$end,sep=":")
  275. all.cpg <- fread("all.CpG.all.txt",check.names = F)
  276. motif.hyper.input <- unique(NLGN1[NLGN1$mean.meth.diff > 0.1,c("flag","seqnames","start","end")])
  277. motif.hyper.input.strand <- as.data.frame(all.cpg[all.cpg$flag %in% motif.hyper.input$flag,])
  278. rownames(motif.hyper.input.strand) <- motif.hyper.input.strand$flag
  279. motif.hyper.input$strand <- motif.hyper.input.strand[motif.hyper.input$flag,'strand']
  280. motif.hypo.input <- unique(NLGN1[NLGN1$mean.meth.diff < -0.1,c("flag","seqnames","start","end")])
  281. motif.hypo.input.strand <- as.data.frame(all.cpg[all.cpg$flag %in% motif.hypo.input$flag,])
  282. rownames(motif.hypo.input.strand) <- motif.hypo.input.strand$flag
  283. motif.hypo.input$strand <- motif.hypo.input.strand[motif.hypo.input$flag,'strand']
  284. write.table(motif.hyper.input,file = "../paper1.Figure/NLGN1.motif.hyper.input.txt",quote = F,sep='\t',row.names = F)
  285. write.table(motif.hypo.input,file = "../paper1.Figure/NLGN1.motif.hypo.input.txt",quote = F,sep='\t',row.names = F)
  286. ### 预测得到的NPAS4转录因子与NLGN1的关系
  287. hyper.tf <- read.delim("../paper1.Figure/NLGN1/hyper/knownResults.txt")
  288. hyper.tf$tf <- toupper(gsub("\\(.*","",hyper.tf$Motif.Name))
  289. hypo.tf <- read.delim("../paper1.Figure/NLGN1/hypo/knownResults.txt")
  290. hypo.tf$tf <- toupper(gsub("\\(.*","",hypo.tf$Motif.Name))
  291. TPM <- read.delim("../RNA-seq/All.TPM_geneSymbol.txt",check.names = F)
  292. group <- read.delim("../clinical.group.txt")
  293. meta.id <- group$sampleid.rna[group$group=='Metastases']
  294. pri.id <- group$sampleid.rna[group$group=='Primary']
  295. for(i in unique(c(hyper.tf$tf[1:20],hypo.tf$tf[1:20]))){
  296. if(!i %in% TPM$GeneSymbol){next}
  297. TPM1 <- TPM[TPM$GeneSymbol %in% c(i,"NLGN1"),]
  298. TPM.meta <- TPM1[,c("GeneSymbol",meta.id)]
  299. TPM.pri <- TPM1[,c("GeneSymbol",pri.id)]
  300. t1 <- cor.test(as.numeric(TPM.meta[1,2:ncol(TPM.meta)]),as.numeric(TPM.meta[2,2:ncol(TPM.meta)]))
  301. t2 <- cor.test(as.numeric(TPM.pri[1,2:ncol(TPM.pri)]),as.numeric(TPM.pri[2,2:ncol(TPM.pri)]))
  302. t3 <- cor.test(as.numeric(TPM1[1,2:ncol(TPM1)]),as.numeric(TPM1[2,2:ncol(TPM1)]))
  303. if(!is.na(t1$p.value) & t1$p.value<0.05){print(i);print(t1$estimate)}
  304. }
  305. library(RTN)
  306. library(snow)
  307. library(ComplexHeatmap)
  308. library(ClassDiscovery)
  309. library(RColorBrewer)
  310. library(gplots)
  311. standarize.fun <- function(indata=NULL, halfwidth=NULL, centerFlag=T, scaleFlag=T) {
  312. outdata=t(scale(t(indata), center=centerFlag, scale=scaleFlag))
  313. if (!is.null(halfwidth)) {
  314. outdata[outdata>halfwidth]=halfwidth
  315. outdata[outdata<(-halfwidth)]= -halfwidth
  316. }
  317. return(outdata)
  318. }
  319. # 加载基因表达以及样本数值信息
  320. tpm <- read.table("../RNA-seq/geneSymbol_tpm.xls",sep = "\t",row.names = 1,check.names = F,stringsAsFactors = F,header = T)
  321. pheno <- read.table("../clinical.group.txt",sep = "\t", check.names = F,stringsAsFactors = F,header = T)
  322. # 加载MIBC特异性的调控子
  323. tfs <- motif
  324. tfs$regulon <- toupper(tfs$TF)
  325. # 取共有的基因名
  326. regulatoryElements <- intersect(tfs$regulon, rownames(tpm))
  327. # 运行TNI构建程序
  328. # we used the R package “RTN” to reconstruct transcriptional regulatory networks (regulons)
  329. tpm.log <- tni.constructor(expData = as.matrix(log2(tpm + 1)), # 样图计算时候没有取对数,
  330. regulatoryElements = regulatoryElements)
  331. # 通过置换以及bootstrap计算reference regulatory network.
  332. # mutual information analysis and Spearman rank-order correlation deduced the possible associations between a regulator and all potential target from the transcriptome expression profile, and permutation analysis was utilized to erase associations with an FDR > 0.00001. Bootstrapping strategy removed unstable associations through one thousand times of resampling with consensus bootstrap greater than 95%.
  333. # 这里量力而行设置多核,或者直接单核运算
  334. options(cluster=snow::makeCluster(spec = 4, "SOCK")) # 打开4核并行计算(不确定是不是4核,不过我windows只用4,服务器我开12)
  335. tpm.log <- tni.permutation(tpm.log, pValueCutoff = 0.05, nPermutations = 100)
  336. tpm.log <- tni.bootstrap(tpm.log, nBootstraps = 100)
  337. stopCluster(getOption("cluster")) # 关闭并行计算
  338. # 计算DPI-filtered regulatory network
  339. # Data processing inequality filtering eliminated the weakest associations in triangles of two regulators and common targets
  340. tpm.log1 <- tni.dpi.filter(tpm.log, eps = 0, sizeThreshold = TRUE, minRegulonSize = 5)
  341. tni.regulon.summary(tpm.log1)
  342. # 保存TNI对象以便后续分析
  343. save(tpm.log1, file="../paper1.Figure/tpm.log.RData")
  344. # load("rtni_tcgaBLCA.RData")
  345. # 计算每个样本的regulon活性
  346. # Individual regulon activity was estimated by two-sided GSEA
  347. tpm.gsea2 <- tni.gsea2(tpm.log1, regulatoryElements = regulatoryElements)
  348. regact <- tni.get(tpm.gsea2, what = "regulonActivity")
  349. # 保存活性对象
  350. save(regact,file = "../paper1.Figure/regact.RData")
  351. # DMC motif --------------------------------------------------------------
  352. p1 <- tf_plot("metilene.DMR/DMC/",0.05,0.05)
  353. p1[[1]]+theme(legend.position = 'none')
  354. ggsave("../paper1.Figure/meta_vs_pri.dmc.motif.pdf",width = 5,height = 5)
  355. motif <- p1[[2]]
  356. toprank <- motif[!duplicated(motif$TF),]
  357. hyper <- enricher2(toupper(toprank$TF[toprank$group=='hyper']))
  358. hyper <- hyper@result
  359. hypo <- enricher2(toupper(toprank$TF[toprank$group=='hypo']))
  360. hypo <- hypo@result
  361. common <- unique(motif[,c("TF","group")])
  362. motif1 <- motif[motif$TF %in% names(which(table(common$TF)==1)),]
  363. write.table(motif1,file='../paper1.Figure/sig.TF.txt',quote = F,sep='\t',row.names = F)
  364. # DMC甲基化注释 ----------------------------------------------------------------
  365. devtools::install_github('rcavalcante/annotatr',force = T)
  366. BiocManager::install('TxDb.Hsapiens.UCSC.hg19.knownGene')
  367. library(annotatr)
  368. library(GenomicRanges)
  369. library(TxDb.Hsapiens.UCSC.hg19.knownGene)
  370. library(readxl)
  371. dmc.anno <- readRDS("metilene.DMR/DMC/DMC.all.annotation.rds")
  372. dmc.anno <- dmc.anno[abs(dmc.anno$mean.meth.diff)>0.1 & dmc.anno$p.value<0.05,]
  373. dmc.anno$regulated <- ifelse(dmc.anno$mean.meth.diff>0,'hyper','hypo')
  374. # See the GRanges column of dm_annotaed expanded
  375. print(head(dmc.anno))
  376. annots_order = c(
  377. 'hg19_genes_1to5kb',
  378. 'hg19_genes_promoters',
  379. 'hg19_genes_5UTRs',
  380. 'hg19_genes_exons',
  381. 'hg19_genes_intronexonboundaries',
  382. 'hg19_genes_introns',
  383. 'hg19_genes_3UTRs',
  384. 'hg19_genes_intergenic')
  385. annotated_regions = as.data.frame(dmc.anno, row.names = NULL)
  386. annotated_regions = subset_order_tbl(tbl = annotated_regions,
  387. col = "annot.type", col_order = annotation_order)
  388. annotated_regions = dplyr::distinct(dplyr::ungroup(annotated_regions),
  389. across(c("seqnames", "start", "end", "annot.type")),
  390. .keep_all = TRUE)
  391. ggplot(annotated_regions, aes_string(x = "annot.type")) +
  392. geom_bar(aes_string(fill = "annot.type"), position = "dodge") +
  393. theme_bw() +scale_fill_manual(values = c("#E55C27","#F1A646","#21579D","#9BBADD","#F2B1B0","#7C65A4","#E37AA9",'black')) + theme(panel.grid = element_blank(),axis.text.x = element_text(angle = 30,
  394. hjust = 1), legend.title = element_blank(), legend.position = "none",
  395. legend.key = element_rect(color = "white"))+xlab("")+ylab("Count")
  396. ggsave("../paper1.Figure/meta_vs_pri.DMC.anno.bar.pdf",width = 5,height = 4)
  397. # The orders for the x-axis labels.
  398. x_order = c(
  399. 'hg19_genes_1to5kb',
  400. 'hg19_genes_promoters',
  401. 'hg19_genes_5UTRs',
  402. 'hg19_genes_exons',
  403. 'hg19_genes_introns',
  404. 'hg19_genes_3UTRs',
  405. 'hg19_genes_intergenic')
  406. # The orders for the fill labels.
  407. fill_order = c(
  408. 'hyper',
  409. 'hypo',
  410. 'none')
  411. dm_vs_kg_cat = plot_categorical(
  412. annotated_regions = dmc.anno, x='annot.type', fill='regulated',
  413. x_order = x_order, fill_order = fill_order, position='fill',
  414. legend_title = 'DM Status',
  415. x_label = 'knownGene Annotations',
  416. y_label = 'Proportion')+theme_bw()
  417. dm_vs_kg_cat+scale_fill_manual(values = c("#E21D31","#0C7094"))
  418. ggsave("../paper1.Figure/meta_vs_pri.DMC.anno.pdf",width = 5,height = 4)
  419. dmc.anno.df <- as.data.frame(dmc.anno)
  420. num <- as.data.frame(table(dmc.anno.df$regulated))
  421. num$percentage <- round(num$Freq/sum(num$Freq),2)*100
  422. labs <- paste0(num$Var1, " (", num$percentage, "%)")
  423. ggpie(num,x='percentage', label = labs,fill = "Var1", color = "white",
  424. palette = c("#E21D31","#0C7094"))+theme(legend.position = 'none')
  425. ggsave("../paper1.Figure/DMC.hyper.hypo.distribution.pdf",width = 3,height = 3)
  426. # DMC甲基化&表达共分析 -------------------------------------------------------
  427. df1 <- as.data.frame(readRDS("metilene.DMR/DMC/DMC.all.annotation.rds"))
  428. df11 <- df1[abs(df1$mean.meth.diff)>0.1 & df1$p.value<0.05,]
  429. #df11 <- df1[abs(df1$mean.meth.diff)>0.1 & df1$p.value<0.05 & df1$q.value<0.2,]
  430. meta_vs_pri <- read.delim("../RNA-seq/metastases_versus_primary.deseq.xls")
  431. colnames(meta_vs_pri)[1] <- 'GeneID'
  432. meta_vs_pri <- meta_vs_pri[abs(meta_vs_pri$log2FoldChange)>=1 & meta_vs_pri$pvalue<0.05,]
  433. p10 <- co_analysis(df11,meta_vs_pri,show_label = F)
  434. p10[[1]]
  435. ggsave("../paper1.Figure/co_expr.pdf",width=6,height=6)
  436. pro_gb <- p10[[2]]
  437. write.table(p10[[2]],file = '../paper1.Figure/deg_dmc.coanalysis.txt',quote = F,sep='\t',row.names = F)
  438. up <- pro_gb$annot.symbol[(pro_gb$group=='gene body' & pro_gb$mean.meth.diff>0 & pro_gb$log2FoldChange>0)|
  439. (pro_gb$group=='promoter' & pro_gb$mean.meth.diff<0 & pro_gb$log2FoldChange>0)]
  440. down <- pro_gb$annot.symbol[(pro_gb$group=='gene body' & pro_gb$mean.meth.diff<0 & pro_gb$log2FoldChange<0)|
  441. (pro_gb$group=='promoter' & pro_gb$mean.meth.diff>0 & pro_gb$log2FoldChange<0)]
  442. library(msigdbr)
  443. keggdb = msigdbr(species = "Homo sapiens", category = "C2",subcategory = "KEGG")
  444. keggdb <- keggdb[,c('gs_name','gene_symbol')]
  445. colnames(keggdb) <- c('TERM','GENE')
  446. NLRI <- keggdb$GENE[keggdb$TERM=='KEGG_NEUROACTIVE_LIGAND_RECEPTOR_INTERACTION']
  447. intersect(NLRI,up)
  448. intersect(NLRI,down)
  449. ekegg.up <- clusterProfiler::enricher(unique(down),
  450. TERM2GENE=keggdb,pvalueCutoff = 1,
  451. pAdjustMethod = "BH",qvalueCutoff = 1)
  452. kegg_res <- ekegg.up@result[ekegg.up@result$p.adjust < 0.05,]
  453. kegg_res$generatio <- apply(kegg_res,1,generatio)
  454. p <- enrichplot(kegg_res,"Pathways enriched in Primary (genes upregulated in primary but hyper in metastases)")
  455. print(p)
  456. ggsave("../paper1.Figure/co.meta.pathway.pdf",width = 6,height = 4)
  457. ekegg.down <- clusterProfiler::enricher(unique(up),
  458. TERM2GENE=keggdb,pvalueCutoff = 0.05,
  459. pAdjustMethod = "BH",qvalueCutoff = 0.2)
  460. kegg_res <- ekegg.down@result[ekegg.down@result$p.adjust < 0.05,]
  461. kegg_res$generatio <- apply(kegg_res,1,generatio)
  462. p <- enrichplot(kegg_res,"Pathways enriched in metastases (genes upregulated in metastases but hyper in primary)")
  463. print(p)
  464. ggsave("../paper1.Figure/co.primary.pathway.pdf",width = 8,height = 4)
  465. co_analysis <- function(df_dm_annotated,deg,show_label=F){
  466. exp <- read.delim("../RNA-seq/all_samples_cluster_TPM.xls",check.names = F)
  467. deg <- merge(deg,exp[,1:2],by='GeneID')
  468. combined <- merge(df_dm_annotated,deg,by.x='annot.symbol',by.y='Symbol')
  469. combined$group[combined$annot.type=="hg19_genes_promoters"] <- 'promoter'
  470. combined$group[combined$annot.type %in% c('hg19_genes_introns','hg19_genes_exons','hg19_genes_intronexonboundaries','hg19_genes_5UTRs')] <- 'gene body'
  471. combined <- combined[!is.na(combined$group),]
  472. combined1 <- unique(combined[,c("annot.symbol","seqnames","start","end","mean.meth.diff","log2FoldChange",'group')])
  473. combined1$flag <- paste(combined1$seqnames,combined1$start,combined1$end,combined1$annot.symbol,sep = ":")
  474. combined1 <- combined1[(combined1$mean.meth.diff*combined1$log2FoldChange>0 & combined1$group=='gene body') | (combined1$mean.meth.diff*combined1$log2FoldChange<0 & combined1$group=='promoter'),]
  475. combined1$label <- ifelse((abs(combined1$log2FoldChange)>4) | abs(combined1$mean.meth.diff)>0.2,combined1$annot.symbol,"")
  476. p <- ggscatter(combined1,x='mean.meth.diff',y='log2FoldChange',fill = 'group',palette = 'npg',shape = 21)+
  477. geom_vline(xintercept=c(0.1,-0.1),linetype=2)+
  478. geom_hline(yintercept=c(-1,1),linetype=2)
  479. if(show_label){
  480. p <- p + ggrepel::geom_text_repel(aes(label=label),max.overlaps = 100)
  481. }
  482. return(list(p,combined1))
  483. }
  484. generatio <- function(x){
  485. ratio <- strsplit(x[3],"/")
  486. count <- as.integer(ratio[[1]][1])
  487. total <- as.integer(ratio[[1]][2])
  488. return(count/total)
  489. }
  490. enrichplot <- function(data,title){
  491. library(ggplot2)
  492. library(dplyr)
  493. #library(ggthemes)
  494. #data <- data %>% group_by(cell) %>% top_n(n=5,wt=-p.adjust)
  495. p <- ggplot(data)+geom_point(aes(y=generatio,x=reorder(Description,generatio),fill=-log10(p.adjust),size=Count),shape=21,colour='black')+
  496. ggtitle(title)+
  497. coord_flip()+
  498. scale_fill_gradient(low = 'white',high = '#af2934')+
  499. theme_light()+
  500. theme(axis.text.x = element_text(angle = 90,hjust=1,vjust=0.5),axis.text=element_text(size = 10,color = "black"))+
  501. theme(axis.text.y = element_text(size = 10),axis.title = element_text(size = 10))+
  502. #facet_grid(rows=vars(Class),scales = "free_y",space = "free_y")+
  503. theme(strip.background=element_rect(fill = c("blue")))
  504. return(p)
  505. }
  506. # 比较NLGN1的甲基化和表达的相关性 ------------------------------------------------------
  507. NLGN1.dmc <- df1[df1$annot.symbol=='NLGN1',]
  508. promoter <- NLGN1.dmc[NLGN1.dmc$annot.type=='hg19_genes_promoters',]
  509. genbody <- NLGN1.dmc[NLGN1.dmc$annot.type %in% c('hg19_genes_introns','hg19_genes_exons','hg19_genes_intronexonboundaries','hg19_genes_5UTRs'),]
  510. promoter.dmc <- as.data.frame(all.cpg[all.cpg$flag %in% unique(paste(promoter$seqnames,promoter$start,promoter$end,sep=":")),])
  511. genbody.dmc <- as.data.frame(all.cpg[all.cpg$flag %in% unique(paste(genbody$seqnames,genbody$start,genbody$end,sep=":")),])
  512. rownames(genbody.dmc) <- genbody.dmc$flag
  513. genbody.dmc <- as.data.frame(t(genbody.dmc[,c(-1,-42,-43)]))
  514. genbody.dmc$mean <- rowMeans(genbody.dmc,na.rm = T)
  515. group <- read.delim("../clinical.group.txt")
  516. genbody.dmc <- merge(genbody.dmc,group,by.x='row.names',by.y='sampleid.gm')
  517. tpm <- read.delim("../RNA-seq/All.TPM_geneSymbol.xls",check.names = F,row.names = 1)
  518. nlgn1.tpm <- as.data.frame(t(tpm['NLGN1',,drop=F]))
  519. genbody.dmc <- merge(genbody.dmc,nlgn1.tpm,by.x='sampleid.rna',by.y='row.names')
  520. cor.test(genbody.dmc$mean,genbody.dmc$NLGN1)
  521. cor.test(genbody.dmc$mean[genbody.dmc$group=='Primary'],genbody.dmc$NLGN1[genbody.dmc$group=='Primary'])
  522. cor.test(genbody.dmc$mean[genbody.dmc$group=='Metastases'],genbody.dmc$NLGN1[genbody.dmc$group=='Metastases'])
  523. rownames(promoter.dmc) <- promoter.dmc$flag
  524. promoter.dmc <- as.data.frame(t(promoter.dmc[,c(-1,-42,-43)]))
  525. promoter.dmc$mean <- rowMeans(promoter.dmc,na.rm = T)
  526. group <- read.delim("../clinical.group.txt")
  527. promoter.dmc <- merge(promoter.dmc,group,by.x='row.names',by.y='sampleid.gm')
  528. tpm <- read.delim("../RNA-seq/All.TPM_geneSymbol.xls",check.names = F,row.names = 1)
  529. nlgn1.tpm <- as.data.frame(t(tpm['NLGN1',,drop=F]))
  530. promoter.dmc <- merge(promoter.dmc,nlgn1.tpm,by.x='sampleid.rna',by.y='row.names')
  531. cor.test(promoter.dmc$mean,promoter.dmc$NLGN1)
  532. cor.test(promoter.dmc$mean[promoter.dmc$group=='Primary'],promoter.dmc$NLGN1[promoter.dmc$group=='Primary'])
  533. cor.test(promoter.dmc$mean[promoter.dmc$group=='Metastases'],promoter.dmc$NLGN1[promoter.dmc$group=='Metastases'])
  534. # DMC cpg types basis -----------------------------------------------------
  535. library(data.table)
  536. dmc.tp53 <- cpg.bais('../paper1.Figure/TP53.group.cpg.anno.rds',NULL,"TP53+ .vs. TP53-")
  537. dmc.res <- cpg.bais("metilene.DMR/DMC/DMC.all.annotation.rds",NULL,"meta_vs_pri")
  538. egfr.positive.res <- cpg.bais("EGFR.DMC/EGFR_positive/DMC.all.annotation.rds",NULL,"EGFR.positive.pri_vs_meta")
  539. meta.posVSneg.res <- cpg.bais("EGFR.DMC/EGFR_positive_meta/DMC.all.annotation.rds",NULL,"meta.EGFR.positive_vs_negative")
  540. pri.posVSneg.res <- cpg.bais("EGFR.DMC/EGFR_positive_pri/DMC.all.annotation.rds",NULL,"pri.EGFR.positive_vs_negative")
  541. all <- rbind(dmc.tp53,dmc.res,egfr.positive.res,meta.posVSneg.res,pri.posVSneg.res)
  542. write.table(all,file='../paper1.Figure/all.fisher.txt',quote=F,sep='\t',row.names=F)
  543. all1 <- dcast(all,cpg_type~group+tag,value.var = 'OR')
  544. rownames(all1) <- all1$cpg_type
  545. all1 <- all1[,-1]
  546. all2 <- dcast(all,cpg_type~group+tag,value.var = 'pvalue')
  547. rownames(all2) <- all2$cpg_type
  548. all2 <- all2[,-1]
  549. library(ComplexHeatmap)
  550. library(circlize)
  551. all11 <- t(log10(all1))
  552. all12 <- t(all1)
  553. all21 <- t(all2)
  554. pdf(file = '../paper1.Figure/cpg.basis.pdf',width = 6,height = 6)
  555. Heatmap(all11,
  556. border = F,
  557. name = 'log10(OR)',
  558. row_split = 1:nrow(all11),
  559. col=colorRamp2(c(min(log10(all$OR)),0,max(setdiff(log10(all$OR),Inf))),c("#3980AD","white","#D97166")),
  560. rect_gp = gpar(col = 'black'),
  561. cluster_rows = F,cluster_columns = F,
  562. cell_fun = function(j, i, x, y, width, height, fill) {
  563. grid.text(sprintf("%.1f", all12[i, j]), x, y, gp = gpar(fontsize = 10))
  564. if(!is.na(all21[i,j]) & all21[i,j]<0.05){
  565. grid.rect(x = x, y = y, width = width, height = height,
  566. gp = gpar(col = "black", fill = NA))
  567. }
  568. }
  569. )
  570. dev.off()
  571. cpg.bais <- function(all.input,dmc.input=NULL,tag=NULL){
  572. all <- as.data.frame(readRDS(all.input))
  573. all.count <- unique(all[all$annot.type %in% c("hg19_cpg_inter","hg19_cpg_shores","hg19_cpg_shelves","hg19_cpg_islands"),c("seqnames","start","end",'annot.type')])
  574. all.count <- as.data.frame(table(all.count$annot.type))
  575. if(is.null(dmc.input)){
  576. dmr <- all[all$p.value<0.05 & abs(all$mean.meth.diff)>0.1,]
  577. }else{
  578. dmr <- as.data.frame(readRDS(dmc.input))
  579. }
  580. hypo <- unique(dmr[dmr$mean.meth.diff<0 & dmr$annot.type %in% c("hg19_cpg_inter","hg19_cpg_shores","hg19_cpg_shelves","hg19_cpg_islands"),c("seqnames","start","end",'annot.type')])
  581. hypo.count <- as.data.frame(table(hypo$annot.type))
  582. ### hyper
  583. hyper <- unique(dmr[dmr$mean.meth.diff>0 & dmr$annot.type %in% c("hg19_cpg_inter","hg19_cpg_shores","hg19_cpg_shelves","hg19_cpg_islands"),c("seqnames","start","end",'annot.type')])
  584. hyper.count <- as.data.frame(table(hyper$annot.type))
  585. ### 相比全部cpg位点,hypo的cpg位点富集到island,还是shlef,shore?
  586. all.res <- NULL
  587. for(i in unique(c(hypo.count$Var1,hyper.count$Var1))){
  588. res1 <- NULL
  589. res2 <- NULL
  590. if(i %in% hypo.count$Var1){
  591. ### 分别为该cpg类型的hypo DMC数目、非该cpg类型的hypo DMC数目、该cpg类型的所有cpg数目、非该cpg类型的所有cpg数目
  592. res1 <- fisher.test(matrix(c(hypo.count$Freq[hypo.count$Var1==i],
  593. sum(hypo.count$Freq[hypo.count$Var1!=i]),
  594. all.count$Freq[all.count$Var1==i],
  595. sum(all.count$Freq[all.count$Var1!=i])),byrow = T,nrow = 2))
  596. }
  597. if(i %in% hyper.count$Var1){
  598. res2 <- fisher.test(matrix(c(hyper.count$Freq[hyper.count$Var1==i],
  599. sum(hyper.count$Freq[hyper.count$Var1!=i]),
  600. all.count$Freq[all.count$Var1==i],
  601. sum(all.count$Freq[all.count$Var1!=i])),byrow = T,nrow = 2))
  602. }
  603. if(!is.null(res1)){
  604. tmp.res <- data.frame(group=c('hypo'),
  605. OR=c(res1$estimate),
  606. pvalue=c(res1$p.value),
  607. cpg_type=c(i),
  608. dmc.cpg=c(hypo.count$Freq[hypo.count$Var1==i]),
  609. dmc.cpg.non=c(sum(hypo.count$Freq[hypo.count$Var1!=i])),
  610. all.cpg=c(all.count$Freq[all.count$Var1==i]),
  611. all.cpg.non=c(sum(all.count$Freq[all.count$Var1!=i])))
  612. all.res <- rbind(all.res,tmp.res)
  613. }
  614. if(!is.null(res2)){
  615. tmp.res <- data.frame(group=c('hyper'),
  616. OR=c(res2$estimate),
  617. pvalue=c(res2$p.value),
  618. cpg_type=c(i),
  619. dmc.cpg=c(hyper.count$Freq[hyper.count$Var1==i]),
  620. dmc.cpg.non=c(sum(hyper.count$Freq[hyper.count$Var1!=i])),
  621. all.cpg=c(all.count$Freq[all.count$Var1==i]),
  622. all.cpg.non=c(sum(all.count$Freq[all.count$Var1!=i])))
  623. all.res <- rbind(all.res,tmp.res)
  624. }
  625. }
  626. all.res$tag <- tag
  627. return(all.res)
  628. }
  629. # EGFR variation vs expr vs methylation -----------------------------------
  630. # TF活性-----------------------------------------------------------
  631. BiocManager::install("RTN")
  632. BiocManager::install("ClassDiscovery")
  633. library(RTN)
  634. library(snow)
  635. library(ComplexHeatmap)
  636. library(ClassDiscovery)
  637. library(RColorBrewer)
  638. library(gplots)
  639. standarize.fun <- function(indata=NULL, halfwidth=NULL, centerFlag=T, scaleFlag=T) {
  640. outdata=t(scale(t(indata), center=centerFlag, scale=scaleFlag))
  641. if (!is.null(halfwidth)) {
  642. outdata[outdata>halfwidth]=halfwidth
  643. outdata[outdata<(-halfwidth)]= -halfwidth
  644. }
  645. return(outdata)
  646. }
  647. # 加载基因表达以及样本数值信息
  648. tpm <- read.table("../RNA-seq/geneSymbol_tpm.xls",sep = "\t",row.names = 1,check.names = F,stringsAsFactors = F,header = T)
  649. pheno <- read.table("../clinical.group.txt",sep = "\t", check.names = F,stringsAsFactors = F,header = T)
  650. # 加载MIBC特异性的调控子
  651. tfs <- motif
  652. tfs$regulon <- toupper(tfs$TF)
  653. # 取共有的基因名
  654. regulatoryElements <- intersect(tfs$regulon, rownames(tpm))
  655. # 运行TNI构建程序
  656. # we used the R package “RTN” to reconstruct transcriptional regulatory networks (regulons)
  657. tpm.log <- tni.constructor(expData = as.matrix(log2(tpm + 1)), # 样图计算时候没有取对数,
  658. regulatoryElements = regulatoryElements)
  659. # 通过置换以及bootstrap计算reference regulatory network.
  660. # mutual information analysis and Spearman rank-order correlation deduced the possible associations between a regulator and all potential target from the transcriptome expression profile, and permutation analysis was utilized to erase associations with an FDR > 0.00001. Bootstrapping strategy removed unstable associations through one thousand times of resampling with consensus bootstrap greater than 95%.
  661. # 这里量力而行设置多核,或者直接单核运算
  662. options(cluster=snow::makeCluster(spec = 4, "SOCK")) # 打开4核并行计算(不确定是不是4核,不过我windows只用4,服务器我开12)
  663. tpm.log <- tni.permutation(tpm.log, pValueCutoff = 0.05, nPermutations = 100)
  664. tpm.log <- tni.bootstrap(tpm.log, nBootstraps = 100)
  665. stopCluster(getOption("cluster")) # 关闭并行计算
  666. # 计算DPI-filtered regulatory network
  667. # Data processing inequality filtering eliminated the weakest associations in triangles of two regulators and common targets
  668. tpm.log1 <- tni.dpi.filter(tpm.log, eps = 0, sizeThreshold = TRUE, minRegulonSize = 5)
  669. tni.regulon.summary(tpm.log1)
  670. # 保存TNI对象以便后续分析
  671. save(tpm.log1, file="../paper1.Figure/tpm.log.RData")
  672. # load("rtni_tcgaBLCA.RData")
  673. # 计算每个样本的regulon活性
  674. # Individual regulon activity was estimated by two-sided GSEA
  675. tpm.gsea2 <- tni.gsea2(tpm.log1, regulatoryElements = regulatoryElements)
  676. regact <- tni.get(tpm.gsea2, what = "regulonActivity")
  677. # 保存活性对象
  678. save(regact,file = "../paper1.Figure/regact.RData")
  679. # 设置颜色
  680. clust.col <- c("#0C7094","#E21D31")
  681. blue <- "#5bc0eb"
  682. gold <- "#ECE700"
  683. annCol <- pheno[order(pheno$group),] # 构建样本注释信息,并对亚型进行排序
  684. rownames(annCol) <- annCol$sampleid.rna
  685. regulon <- regact$differential[rownames(annCol),]
  686. plotdata <- standarize.fun(t(regulon),halfwidth = 1.5) # 标准化regulon的活性
  687. annColors <- list()
  688. annColors[["group"]] <- c("Primary" = clust.col[1],
  689. "Metastases" = clust.col[2]
  690. )
  691. hcg <- hclust(distanceMatrix(as.matrix(regulon), "euclidean"), "ward.D")
  692. hm <- pheatmap(plotdata[hcg$order,],
  693. border_color = NA, # 热图单元格无边框
  694. #color = colorpanel(64,low=blue,mid = "black",high=gold),
  695. cluster_rows = T, # 行不聚类
  696. cluster_cols = F, # 列聚类
  697. show_rownames = T, # 显示行名
  698. show_colnames = F, # 不显示列名
  699. gaps_col = cumsum(table(annCol$group))[1:2], # 亚型分割
  700. #cellwidth = 0.8, # 固定单元格宽度
  701. #cellheight = 10, # 固定单元格高度
  702. name = "Regulon", # 图例名字
  703. annotation_col = annCol[,"group",drop = F], # 样本注释
  704. annotation_colors = annColors["group"]) # 样本注释的对应颜色
  705. pdf("../paper1.Figure/regulon.heatmap.pdf", width = 8,height = 6)
  706. draw(hm) # 输出热图
  707. invisible(dev.off())
  708. ############# 加上样本属性,突变、原发转移类型等
  709. group <- read.delim("../clinical.group.txt")
  710. var <- read.delim("../variation.group.txt")
  711. group <- merge(group,var,by.x='sampleid.1021',by.y='吉因加编码')
  712. rownames(group) <- group$sampleid.rna
  713. group <- group[rownames(regact$differential),]
  714. attri <- unique(c(group$group,group$time,group$therapy,group$EGFR.19del.21L858R,group$ALK.Fusion,group$MET.Fusion,group$KRAS,group$TP53,group$RBM10,group$CDKN2A.B.Loss,group$MYC.Gain,group$EGFR.gain,group$RB1.loss,group$ZFHX3))
  715. col <- c(ggsci::pal_npg(palette = 'nrc')(10),ggsci::pal_futurama('planetexpress')(12),"#F3A9AB","#F39E2E","#BCBCC2","white","#EA500D","#90B5D8","#005599","#7A609F","#E46FA1","#264C53","#5BA98E","#009BC9","#009045","#B34345","red","blue","red")[1:length(attri)]
  716. names(col) <- attri
  717. col=list(group=col[1:2],time=col[3:5],therapy=col[6:9],`EGFR.19del.21L858R`=col[10:11],ALK.Fusion=col[12],MET.Fusion=col[13],KRAS=col[14:15],TP53=col[16],RBM10=col[17],`CDKN2A.B.Loss`=col[18],MYC.Gain=col[19],EGFR.gain=col[20],RB1.loss=col[21],ZFHX3=col[22])
  718. pdf("../paper1.Figure/regulon.heatmap2.pdf", width = 10,height = 8)
  719. pheatmap(t(regact$differential),
  720. cluster_rows = T,cluster_cols = T,
  721. show_colnames = F,
  722. fontsize_row = 6,
  723. clustering_method = "ward.D2",
  724. clustering_distance_rows = "correlation",
  725. clustering_distance_cols = "correlation",
  726. border_color = NA,
  727. annotation_col = group[,c("group","time","therapy","EGFR.19del.21L858R","ALK.Fusion" ,"MET.Fusion","KRAS","TP53","RBM10","CDKN2A.B.Loss","MYC.Gain","EGFR.gain","RB1.loss","ZFHX3"),drop = F],
  728. annotation_colors = col
  729. )
  730. dev.off()
  731. ############# 发现原发和转移呈现不同的TF活性模式,再进一步比较在两组中显著的TF活性
  732. dat <- as.data.frame(regact$differential[rownames(annCol),])
  733. dat$group <- annCol$group
  734. dat$ID <- rownames(dat)
  735. dat <- melt(dat,measure.var=1:31)
  736. ##两组间显著的TF活性
  737. final.tfs <- c("ATF1","FOXF1","GATA6","MEF2A","SOX10","SOX21","SP1","TBX5")
  738. ggboxplot(dat[dat$variable %in% final.tfs,],x='variable',y='value',xlab = '',ylab='Regulon score',
  739. color='group',palette = c("#0C7094","#E21D31"),add = 'jitter')+stat_compare_means(aes(group=group,label = ..p.format..))
  740. ggsave("../paper1.Figure/TF.regulonScore.pdf",width = 7,height = 4)
  741. load("../paper1.Figure/tpm.log.RData")
  742. #权重的绝对值表示 MI 值,而符号 (+/-) 表示基于调节器与其目标之间的 Pearson 相关性的预测作用方式。
  743. regulons <- tni.get(tpm.log1, what = "regulons.and.mode", idkey = "ID")
  744. intersect(NLRI,names(regulons$ATF1))
  745. intersect(CAMC,names(regulons$ATF1))
  746. intersect("NLGN1",names(regulons$ATF1))
  747. head(regulons$ATF1)
  748. intersect(NLRI,names(regulons$FOXF1))
  749. intersect(CAMC,names(regulons$FOXF1))
  750. intersect("NLGN1",names(regulons$ATF1))
  751. head(regulons$FOXF1)
  752. intersect(NLRI,names(regulons$GATA6))
  753. intersect(CAMC,names(regulons$GATA6))
  754. intersect("NLGN1",names(regulons$GATA6))
  755. head(regulons$GATA6)
  756. intersect(NLRI,names(regulons$MEF2A))
  757. intersect(CAMC,names(regulons$MEF2A))
  758. intersect("NLGN1",names(regulons$MEF2A))
  759. head(regulons$MEF2A)
  760. intersect(NLRI,names(regulons$TBX5))
  761. intersect(CAMC,names(regulons$TBX5))
  762. intersect("NLGN1",names(regulons$TBX5))
  763. head(regulons$TBX5)
  764. ## SOX10的靶基因TBXA2R与DFS有关,
  765. intersect(NLRI,names(regulons$SOX10))
  766. intersect(CAMC,names(regulons$SOX10))
  767. intersect("NLGN1",names(regulons$SOX10))
  768. head(regulons$SOX10)
  769. intersect(NLRI,names(regulons$SOX21))
  770. intersect(CAMC,names(regulons$SOX21))
  771. intersect("NLGN1",names(regulons$SOX21))
  772. head(regulons$SOX21)
  773. intersect(NLRI,names(regulons$SP1))
  774. intersect(CAMC,names(regulons$SP1))
  775. intersect("NLGN1",names(regulons$SP1))
  776. head(regulons$SP1)
  777. g<-tni.graph(tpm.log1, regulatoryElements = final.tfs)
  778. library(RedeR)
  779. rdp <- RedPort()
  780. calld(rdp,checkcalls=TRUE)
  781. addGraph(rdp, g, layout=NULL)
  782. addLegend.color(rdp, g, type="edge")
  783. addLegend.shape(rdp, g)
  784. relax(rdp, ps = TRUE)
  785. deg <- read.delim("../RNA-seq/metastases_versus_primary.deseq.sig.xls")
  786. t1 <- intersect(gene.dis.hypo$Var1[1:20],intersect(deg$gene_symbol,NLRI))
  787. t2 <- intersect(gene.dis.hyper$Var1[1:20],intersect(deg$gene_symbol,NLRI))
  788. t1 <- intersect(gene.dis.hypo$Var1[1:100],NLRI)
  789. t2 <- intersect(gene.dis.hyper$Var1[1:100],NLRI)
  790. t1 <- gene.dis.hypo$Var1[1:20]
  791. t2 <- gene.dis.hyper$Var1[1:20]
  792. for(i in colnames(test)){
  793. #print(intersect(NLRI,names(regulons[[i]])))
  794. #print(intersect(CAMC,names(regulons[[i]])))
  795. inter <- intersect("NLGN1",names(regulons[[i]]))
  796. if(length(inter)!=0){
  797. print(i)
  798. print("*****************")
  799. print(inter)
  800. }
  801. }

Figure 5.R at commit 5525177, no license · at the source

Overview

Authors: Rongxin Liao1,2, Qian Yu1,2, Yusheng Huang1, Hengqiu He1,2, Mengmeng Song3, Xuan Gao3,4, Lu Shen3, Yihao Tao5, Lin Li6, Gang Xiao7, Rui Kong1,8, Cancan Wang9, Shunping Huang1,2, Xiaoyue Zhang1,2, Zaicheng Xu1,2, Rongrong Zhou7,10,11, Zhenzhou Yang1,2, Yuan Peng1,2
  1. Department of Cancer Center, The Second Affiliated Hospital, Chongqing Medical University, Chongqing, 400010 China
  2. Chongqing Key Laboratory of Immunotherapy, Chongqing, 400037 China
  3. Geneplus-Beijing, Beijing, 100101 China
  4. State Key Laboratory of Microbial Resources, Institute of Microbiology, Chinese Academy of Sciences, Beijing, 100101 China
  5. Department of Neurosurgery, The Second Affiliated Hospital, Chongqing Medical University, Chongqing, 400010 China
  6. Department of Neurosurgery, Southwest Hospital, Third Military Medical University (Army Medical University), Chongqing, 400000 China
  7. Department of Oncology, Xiangya Hospital, Central South University, Changsha, Hunan 410008 China
  8. Department of Oncology, The Third Affiliated Hospital of Chongqing Medical University, Chongqing, 400010 China
  9. Department of Pathology, Xinjiang Medical University Affiliated Tumor Hospital, Urumqi, Xinjiang 830000 China
  10. Xiangya Lung Cancer Center, Xiangya Hospital, Central South University, Changsha, 410008 China
  11. National Clinical Research Center for Geriatric Disorders, Xiangya Hospital, Central South University, Changsha, Hunan Province 410008 China
Journal: Genome medicine, volume 18, issue 1, article 82
Dates: received 16 April 2025; accepted 27 April 2026; published online 30 April 2026
Type: Research article · Language: English
License: CC BY-NC-ND
Identifiers: DOI 10.1186/s13073-026-01664-4 · PMID 42063110 · PMCID PMC13248418 · OpenAlex W7159575644
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), human (organism), mouse (organism), other condition (population)
Methods: Connectivity, Statistics, Machine learning
Keywords: LUAD, Brain oligometastasis, Evolutionary dynamics, Microenvironmental characteristics, NLGN1
MeSH: Adenocarcinoma of Lung*, Brain Neoplasms*, Lung Neoplasms*, Animals, DNA Methylation, Evolution, Molecular, Female, Gene Expression Regulation, Neoplastic, Humans, Male, Mice, Middle Aged, Multiomics, Tumor Microenvironment (* major topic)
Topic: Brain Metastases and Treatment (Pulmonary and Respiratory Medicine, Medicine), according to OpenAlex
Funding: the China Postdoctoral Science Foundation (2022M710555); the National Natural Science Foundation of China (82273572); Natural Science Foundation of China (82573031); Program for Youth Innovation in Future Medicine of Chongqing Medical University (W0172); Public health key specialty construction project of Chongqing
Citations: cited by 1 paper (Europe PMC); 92 references in the paper

Abstract

The abstract is not reproduced here: the paper's license (CC BY-NC-ND) does not allow it. Read it in the paper, at the publisher or on Europe PMC.

Repositories

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

therneau/survival

License: none: the authors keep all their rights
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Commit: 99530e52514804d6138b23f05d23ae8424dc3a63, 25 September 2026
Languages: R (282), C (67), C/C++ (2)
Size: 726 files, 351 scripts
Software Heritage: archived
Found in: the text, “Outcomes and statistical analysis”
Holds: README, environment (DESCRIPTION), tests, documentation, 1 notebook
Not found: license file, CITATION.cff, continuous integration
Tools: survival (120 files)
Availability: 1 check, the latest on 30 September 2026: the link answers
  • 30 September 2026: the link answers
352 files

smengmeng30-dev/luad-oligo-bm-multiomics

License: none: the authors keep all their rights
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Commit: 5525177743dac8cb9778141b46dc9bf9d32ac603, 20 April 2026
Languages: R (6)
Size: 7 files, 6 scripts
Software Heritage: not archived
Found in: “Data availability”
Holds: README
Not found: license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: ggpubr (5 files), ComplexHeatmap (4 files), circlize (3 files), data.table (3 files), tidyverse (3 files), clusterProfiler (2 files), ggplot2 (2 files), cowplot (1 file), reshape2 (1 file)
Availability: 1 check, the latest on 30 September 2026: the link answers
  • 30 September 2026: the link answers
7 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:

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

Data links

Code and data availability statement

The paper has a code and data availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:

Read it in the paper: doi.org/10.1186/s13073-026-01664-4.

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, 30 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 18 authors, 5 keywords, 14 MeSH terms, 5 funders, 89 references.

Cite

This paper

Liao, R., Yu, Q., Huang, Y., He, H., Song, M., Gao, X., Shen, L., Tao, Y., Li, L., Xiao, G., Kong, R., Wang, C., Huang, S., Zhang, X., Xu, Z., Zhou, R., Yang, Z., & Peng, Y. (2026). Integrative multi-omics profiling reveals distinct evolutionary and immunogenic features of brain oligometastasis in lung adenocarcinoma. Genome medicine, 18(1), 82. https://doi.org/10.1186/s13073-026-01664-4

BibTeX

@article{liao2026integrative,
author = {Liao, Rongxin and Yu, Qian and Huang, Yusheng and He, Hengqiu and Song, Mengmeng and Gao, Xuan and Shen, Lu and Tao, Yihao and Li, Lin and Xiao, Gang and Kong, Rui and Wang, Cancan and Huang, Shunping and Zhang, Xiaoyue and Xu, Zaicheng and Zhou, Rongrong and Yang, Zhenzhou and Peng, Yuan},
title = {{Integrative multi-omics profiling reveals distinct evolutionary and immunogenic features of brain oligometastasis in lung adenocarcinoma}},
journal = {Genome medicine},
year = {2026},
month = apr,
volume = {18},
number = {1},
pages = {82},
publisher = {BMC},
issn = {1756-994X},
doi = {10.1186/s13073-026-01664-4},
url = {https://doi.org/10.1186/s13073-026-01664-4},
pmid = {42063110},
pmcid = {PMC13248418}
}

RIS

TY - JOUR
AU - Liao, Rongxin
AU - Yu, Qian
AU - Huang, Yusheng
AU - He, Hengqiu
AU - Song, Mengmeng
AU - Gao, Xuan
AU - Shen, Lu
AU - Tao, Yihao
AU - Li, Lin
AU - Xiao, Gang
AU - Kong, Rui
AU - Wang, Cancan
AU - Huang, Shunping
AU - Zhang, Xiaoyue
AU - Xu, Zaicheng
AU - Zhou, Rongrong
AU - Yang, Zhenzhou
AU - Peng, Yuan
TI - Integrative multi-omics profiling reveals distinct evolutionary and immunogenic features of brain oligometastasis in lung adenocarcinoma
T2 - Genome medicine
J2 - Genome Med
PY - 2026
DA - 2026/04/30
VL - 18
IS - 1
SP - 82
SN - 1756-994X
PB - BMC
DO - 10.1186/s13073-026-01664-4
UR - https://doi.org/10.1186/s13073-026-01664-4
LA - en
ER -

CSL-JSON

{
"id": "10.1186/s13073-026-01664-4",
"type": "article-journal",
"title": "Integrative multi-omics profiling reveals distinct evolutionary and immunogenic features of brain oligometastasis in lung adenocarcinoma",
"container-title": "Genome medicine",
"author": [
{
"family": "Liao",
"given": "Rongxin"
},
{
"family": "Yu",
"given": "Qian"
},
{
"family": "Huang",
"given": "Yusheng"
},
{
"family": "He",
"given": "Hengqiu"
},
{
"family": "Song",
"given": "Mengmeng"
},
{
"family": "Gao",
"given": "Xuan"
},
{
"family": "Shen",
"given": "Lu"
},
{
"family": "Tao",
"given": "Yihao"
},
{
"family": "Li",
"given": "Lin"
},
{
"family": "Xiao",
"given": "Gang"
},
{
"family": "Kong",
"given": "Rui"
},
{
"family": "Wang",
"given": "Cancan"
},
{
"family": "Huang",
"given": "Shunping"
},
{
"family": "Zhang",
"given": "Xiaoyue"
},
{
"family": "Xu",
"given": "Zaicheng"
},
{
"family": "Zhou",
"given": "Rongrong"
},
{
"family": "Yang",
"given": "Zhenzhou"
},
{
"family": "Peng",
"given": "Yuan"
}
],
"container-title-short": "Genome Med",
"volume": "18",
"issue": "1",
"page": "82",
"DOI": "10.1186/s13073-026-01664-4",
"PMID": "42063110",
"PMCID": "PMC13248418",
"ISSN": "1756-994X",
"publisher": "BMC",
"URL": "https://doi.org/10.1186/s13073-026-01664-4",
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
30
]
]
}
}

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/bioinformatics/btag592 [code]
Network-based stratification of allele-specific expression reveals patient subgroups in Huntington's disease.
Journal: Bioinformatics (Oxford, England)
In common: survival, circlize, clusterProfiler, 7 other tools, genetics / omics, other condition, 4 references
[2] doi:10.1038/s42003-026-10252-6 [code]
RET signaling as a mediator of estrogen receptor positive breast cancer brain metastasis.
Journal: Communications biology
In common: survival, circlize, clusterProfiler, 6 other tools, other condition, mouse, 3 references
[3] doi:10.3390/ijms27093997 [code]
Coordinated Multicellular Immune Programs and Drug Targets Revealed by Single-Cell Analysis in Driver-Mutated NSCLC.
Journal: International journal of molecular sciences
In common: survival, circlize, clusterProfiler, 7 other tools, genetics / omics, other condition, 1 reference
[4] doi:10.1016/j.xcrm.2026.102682 [code]
TET CpG sequence-context-specific DNA demethylation shapes progression of IDH-mutant gliomas.
Journal: Cell reports. Medicine
In common: survival, circlize, clusterProfiler, 7 other tools, genetics / omics, other condition, 1 reference
[5] doi:10.1016/j.isci.2026.115657 [code]
Integration of machine learning to develop a disulfidptosis model for predicting glioma prognosis, immunotherapy response, and drug.
Journal: iScience
In common: survival, circlize, clusterProfiler, 7 other tools, other condition, 1 reference
[6] doi:10.1016/j.xcrm.2026.102850 [code]
Patient-derived organoids predict personalized drug response and reveal alternative therapeutic options in glioblastoma.
Journal: Cell reports. Medicine
In common: circlize, clusterProfiler, ComplexHeatmap, 3 other tools, other condition, mouse, 6 references
[7] doi:10.1101/gr.281113.125 [code]
Single-nucleus multiomic profiling of the aging mouse substantia nigra reveals conserved gene alterations linked to Parkinson's disease.
Journal: Genome research
In common: circlize, clusterProfiler, ComplexHeatmap, 6 other tools, genetics / omics, mouse, 2 references
[8] doi:10.1038/s41586-026-10512-9 [code]
Astrocyte glucocorticoid receptor signalling restricts neuronal plasticity.
Journal: Nature
In common: circlize, clusterProfiler, ComplexHeatmap, 6 other tools, mouse, 2 references
[9] doi:10.1038/s41467-026-71525-6 [code]
Single-nucleus brain transcriptomics reveals microglia dysfunction in multiple system atrophy.
Journal: Nature communications
In common: circlize, clusterProfiler, ComplexHeatmap, 6 other tools, genetics / omics, 2 references
[10] doi:10.1016/j.xcrm.2026.102766 [code]
A longitudinal single-cell and spatial multiomic atlas of pediatric high-grade glioma.
Journal: Cell reports. Medicine
In common: circlize, clusterProfiler, ComplexHeatmap, 6 other tools, genetics / omics, other condition, 1 reference

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.