OSCR

Spatially Contextualized Integrative Genomics Highlights Neuronal and Glial Regulatory Programs in Low Back Pain.

Code ↔ Paper

20 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 20 matches · 6 of them tie a paragraph to a whole file, not to given lines: weak matches, whose lines are not tinted
  1. [1] § Materials and Methods › Spatial Genetic Mapping Using gsMap ↔ scripts/python/make_supp_table_s7_gsmap_cauchy.py, lines 17–43 · score 0.92 · CGND HRA, CGND HRC, E16.5_E1S1_MOSTA, GSM6919906_V160, GSM6919909_V225, adult human spinal
  2. [2] § Materials and Methods › Linkage Disequilibrium Score Regression ↔ scripts/R/make_supplementary_tables_S1_S6.R, lines 95–159 · score 0.91 · scale SNP heritability, attenuation ratio, LDSC intercept, polygenic signal, m13 lowbackpain, confounding
  3. [3] § Results › Genome-Wide Polygenic Signal and Convergent Gene Prioritization for Low Back Pain ↔ scripts/R/make_supplementary_tables_S1_S6.R, lines 95–159 · score 0.87 · chi square, lambda GC, attenuation ratio, polygenic signal, genome wide, S1
  4. [4] § Materials and Methods › Brain Cell-Type-Specific eQTL-Anchored Mendelian Randomization Analysis ↔ scripts/R/step8_run_mr_batch.R, lines 31–119 · score 0.82 · MR Egger regression, weighted median, Wald ratio, pleiotropy, clumping, exposures
  5. [5] § Materials and Methods › Spatial Genetic Mapping Using gsMap ↔ scripts/python/run_gsmap_step3_ldscore_human_5696.sh, the whole file · a weak match · score 0.81 · run_generate_ldscore, v46lift37, HapMap3 SNP, gsMap, GENCODE, human
  6. [6] § Materials and Methods › Spatial Genetic Mapping Using gsMap ↔ scripts/python/run_gsmap_step3_ldscore_human_5699.sh, the whole file · a weak match · score 0.81 · run_generate_ldscore, v46lift37, HapMap3 SNP, gsMap, GENCODE, human
  7. [7] § Results › Spatial Genetic Mapping Localizes LBP-Associated Signals to Neuroaxis-Related Embryonic Regions and Neuronal-Like Adult Spinal Niches ↔ scripts/python/make_supp_table_s7_gsmap_cauchy.py, lines 17–43 · score 0.80 · mitochondrial high secondary, hotspot cluster, adult human spinal, spinal cluster, S7, mouse
  8. [8] § Results › Spatial Genetic Mapping Localizes LBP-Associated Signals to Neuroaxis-Related Embryonic Regions and Neuronal-Like Adult Spinal Niches ↔ scripts/python/make_supp_table_s8_cluster_markers.py, the whole file · a weak match · score 0.79 · hotspot cluster, mitochondrial high secondary, spinal cluster, human spinal, S8, ranked
  9. [9] § Materials and Methods › Spatial Genetic Mapping Using gsMap ↔ scripts/python/make_supp_table_s8_cluster_markers.py, the whole file · a weak match · score 0.74 · spinal clusters, processed h5ad, human spinal, ranked, Enriched, biologically
  10. [10] § Materials and Methods › Brain Cell-Type-Specific eQTL Datasets and Exposure Preprocessing ↔ scripts/python/step5_prepare_eqtl_exposure_clean.py, lines 1–59 · score 0.71 · excitatory neurons, inhibitory neurons, endothelial cells, microglia, OPCs, pericytes
  11. [11] § Materials and Methods › Brain Cell-Type-Specific eQTL Datasets and Exposure Preprocessing ↔ scripts/python/step2_filter_eqtl_stream_8cells.py, the whole file · a weak match · score 0.69 · excitatory neurons, inhibitory neurons, endothelial cells, microglia, OPCs, pericytes
  12. [12] § Materials and Methods › GWAS Summary Statistics for Low Back Pain ↔ scripts/python/step1_standardize_finngen.py, lines 30–115 · score 0.67 · rsID ready, full variant, alt, pos, allele, FinnGen
  13. [13] § Materials and Methods › Bayesian Colocalization Analysis ↔ scripts/R/step12_run_coloc_batch.R, lines 16–97 · score 0.66 · pp h4, cc, quant, H0, coloc, beta
  14. [14] § Results › Brain Cell-Type-Specific eQTL-Anchored MR Highlights Neuronal and Glial Regulatory Associations with Low Back Pain ↔ scripts/python/step5_prepare_eqtl_exposure_clean.py, lines 1–59 · score 0.65 · excitatory neurons, inhibitory neurons, endothelial cells, microglia, OPCs, pericytes
  15. [15] § Results › Brain Cell-Type-Specific eQTL-Anchored MR Highlights Neuronal and Glial Regulatory Associations with Low Back Pain ↔ scripts/python/step10_extract_eqtl_for_coloc.py, the whole file · a weak match · score 0.64 · excitatory neurons, inhibitory neurons, endothelial cells, microglia, OPCs, pericytes
  16. [16] § Results › Genome-Wide Polygenic Signal and Convergent Gene Prioritization for Low Back Pain ↔ scripts/R/plot_helpers_lbp.R, lines 109–126 · score 0.63 · chi square, lambda GC, metrics, intercept, ratio, SE
  17. [17] § Materials and Methods › GWAS Summary Statistics for Low Back Pain ↔ scripts/python/step3_prepare_lbp_ldsc_magma.py, lines 1–64 · score 0.62 · rsID ready, m13 lowbackpain, pos, chr, FinnGen, LDSC
  18. [18] § Materials and Methods › Gene-Level Prioritization Using MAGMA and PoPS ↔ scripts/R/make_supplementary_tables_S1_S6.R, lines 203–272 · score 0.61 · feature selection, PoPS, covariates, training, score, gene
  19. [19] § Results › Genome-Wide Polygenic Signal and Convergent Gene Prioritization for Low Back Pain ↔ scripts/R/plot_helpers_lbp.R, lines 109–126 · score 0.55 · chi square, lambda GC, metrics, intercept, ratio, LDSC
  20. [20] § Results › Genome-Wide Polygenic Signal and Convergent Gene Prioritization for Low Back Pain ↔ scripts/R/plot_figure2_ldsc_magma_pops.R, lines 45–125 · score 0.50 · MAGMA PoPS, MAGMA gene, overlap, scores, Figure 2, LBP

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 · 404 lines · 12 KB · no license · 3 matches

  1. suppressPackageStartupMessages({
  2. library(data.table)
  3. library(dplyr)
  4. library(stringr)
  5. })
  6. # =========================
  7. # 0. CONFIG
  8. # =========================
  9. project_root <- "/home/asset/CLBP_brain_eQTL"
  10. # input files
  11. baseline_log <- file.path(project_root, "04_results/01_ldsc/M13_LOWBACKPAIN_baselineLD.log")
  12. hm3_log <- file.path(project_root, "04_results/01_ldsc/M13_LOWBACKPAIN.hm3.log")
  13. magma_file <- file.path(project_root, "04_results/02_magma/M13_LOWBACKPAIN_ENSG.genes.out")
  14. pops_file <- file.path(project_root, "04_results/03_pops/M13_LOWBACKPAIN_ENSG.preds")
  15. mr_file <- file.path(project_root, "04_results/04_mr/03_mr_results/MR_results_all.tsv")
  16. coloc_file <- file.path(project_root, "04_results/04_mr/04_coloc/coloc_results_nonMHC.tsv")
  17. integrated_file <- file.path(project_root, "04_results/05_integrated_tables/LBP_integrated_candidate_table.tsv")
  18. map_file <- file.path(project_root, "03_scripts_R/ensg_to_symbol_mapping.txt")
  19. # output
  20. out_dir <- file.path(project_root, "04_results/07_supplementary_tables")
  21. dir.create(out_dir, recursive = TRUE, showWarnings = FALSE)
  22. # =========================
  23. # 1. HELPERS
  24. # =========================
  25. stopifnot(file.exists(baseline_log))
  26. stopifnot(file.exists(hm3_log))
  27. stopifnot(file.exists(magma_file))
  28. stopifnot(file.exists(pops_file))
  29. stopifnot(file.exists(mr_file))
  30. stopifnot(file.exists(coloc_file))
  31. stopifnot(file.exists(map_file))
  32. read_symbol_map <- function(path) {
  33. dt <- fread(path, sep = "\t", header = FALSE, fill = TRUE, quote = "", data.table = FALSE)
  34. if (ncol(dt) < 2) stop("Mapping file must have at least 2 columns.")
  35. ensg <- sub("\\..*$", "", as.character(dt[[1]]))
  36. raw2 <- as.character(dt[[2]])
  37. sym <- raw2
  38. has_gene_name <- grepl('gene_name "', raw2)
  39. sym[has_gene_name] <- sub('.*gene_name "([^"]+)".*', '\\1', raw2[has_gene_name])
  40. sym[!has_gene_name] <- sub('^"?([^";]+).*', '\\1', raw2[!has_gene_name])
  41. sym <- gsub('"', "", sym)
  42. sym <- trimws(sym)
  43. sym <- sub(";.*$", "", sym)
  44. out <- data.frame(
  45. ENSGID = ensg,
  46. gene_symbol = sym,
  47. stringsAsFactors = FALSE
  48. )
  49. out %>%
  50. filter(!is.na(ENSGID), ENSGID != "", !is.na(gene_symbol), gene_symbol != "") %>%
  51. distinct(ENSGID, .keep_all = TRUE)
  52. }
  53. extract_main_se <- function(lines, pattern) {
  54. x <- grep(pattern, lines, value = TRUE)
  55. if (length(x) == 0) return(c(value = NA_real_, se = NA_real_))
  56. m <- str_match(x[1], "([-0-9.eE]+) \\(([-0-9.eE]+)\\)")
  57. c(value = as.numeric(m[,2]), se = as.numeric(m[,3]))
  58. }
  59. extract_eq_value <- function(lines, pattern) {
  60. x <- grep(pattern, lines, value = TRUE)
  61. if (length(x) == 0) return(NA_real_)
  62. m <- str_match(x[1], "=\\s*([-0-9.eE]+)")
  63. if (!is.na(m[,2])) return(as.numeric(m[,2]))
  64. m2 <- str_match(x[1], "([-0-9.eE]+)\\s*$")
  65. as.numeric(m2[,2])
  66. }
  67. extract_integer_from_line <- function(lines, pattern) {
  68. x <- grep(pattern, lines, value = TRUE)
  69. if (length(x) == 0) return(NA_integer_)
  70. m <- str_match(x[1], "([0-9,]+)")
  71. as.integer(gsub(",", "", m[,2]))
  72. }
  73. is_mhc_gene <- function(gene_symbol) {
  74. grepl("^HLA-|^BTNL2$|^ZSCAN31$|^MICB$|^TRIM40$|^HCG27$|^MUC21$|^MUC22$|^MUC20$|^C4A$|^C4B$", gene_symbol)
  75. }
  76. yes_no <- function(x) ifelse(isTRUE(x), "Yes", "No")
  77. # =========================
  78. # 2. S1 LDSC SUMMARY
  79. # =========================
  80. base_lines <- readLines(baseline_log, warn = FALSE)
  81. hm3_lines <- readLines(hm3_log, warn = FALSE)
  82. obs_res <- extract_main_se(base_lines, "Total Observed scale h2")
  83. int_res <- extract_main_se(base_lines, "^Intercept:")
  84. rat_res <- extract_main_se(base_lines, "^Ratio")
  85. lambda_gc <- extract_eq_value(hm3_lines, "Lambda GC")
  86. mean_chi2 <- extract_eq_value(hm3_lines, "Mean chi\\^2|Mean Chi\\^2")
  87. max_chi2 <- extract_eq_value(hm3_lines, "Max chi\\^2|Max Chi\\^2")
  88. gws_snps <- extract_integer_from_line(hm3_lines, "Genome-wide significant SNPs")
  89. snp_written <- extract_integer_from_line(hm3_lines, "Writing summary statistics for")
  90. S1 <- data.frame(
  91. Metric = c(
  92. "Observed-scale SNP heritability",
  93. "LDSC intercept",
  94. "Attenuation ratio",
  95. "Lambda GC",
  96. "Mean chi-square",
  97. "Max chi-square",
  98. "Genome-wide significant SNPs",
  99. "SNPs retained in munged summary statistics"
  100. ),
  101. Value = c(
  102. obs_res["value"],
  103. int_res["value"],
  104. rat_res["value"],
  105. lambda_gc,
  106. mean_chi2,
  107. max_chi2,
  108. gws_snps,
  109. snp_written
  110. ),
  111. SE = c(
  112. obs_res["se"],
  113. int_res["se"],
  114. rat_res["se"],
  115. NA, NA, NA, NA, NA
  116. ),
  117. Source_log = c(
  118. "M13_LOWBACKPAIN_baselineLD.log",
  119. "M13_LOWBACKPAIN_baselineLD.log",
  120. "M13_LOWBACKPAIN_baselineLD.log",
  121. "M13_LOWBACKPAIN.hm3.log",
  122. "M13_LOWBACKPAIN.hm3.log",
  123. "M13_LOWBACKPAIN.hm3.log",
  124. "M13_LOWBACKPAIN.hm3.log",
  125. "M13_LOWBACKPAIN.hm3.log"
  126. ),
  127. Notes = c(
  128. "Main observed-scale heritability estimate",
  129. "Confounding assessment",
  130. "Proportion of inflation attributable to confounding",
  131. "Genomic inflation factor",
  132. "Overall polygenic signal strength",
  133. "Maximum chi-square statistic",
  134. "Reported by LDSC after munging",
  135. "Written to munged summary statistics output"
  136. ),
  137. stringsAsFactors = FALSE
  138. )
  139. # =========================
  140. # 3. S2 MAGMA FULL RESULTS
  141. # =========================
  142. map_dt <- read_symbol_map(map_file)
  143. magma <- fread(magma_file) %>%
  144. rename(ENSGID = GENE,
  145. Chromosome = CHR,
  146. Start = START,
  147. Stop = STOP,
  148. No_of_SNPs = NSNPS,
  149. NPARAM = NPARAM,
  150. Sample_size = N,
  151. Z_statistic = ZSTAT,
  152. P_value = P) %>%
  153. mutate(ENSGID = sub("\\..*$", "", ENSGID)) %>%
  154. left_join(map_dt, by = "ENSGID") %>%
  155. mutate(
  156. gene_symbol = ifelse(is.na(gene_symbol) | gene_symbol == "", ENSGID, gene_symbol)
  157. ) %>%
  158. arrange(P_value) %>%
  159. mutate(
  160. Rank = row_number(),
  161. Bonferroni_significant = ifelse(P_value < 0.05 / n(), "Yes", "No")
  162. ) %>%
  163. select(
  164. ENSGID,
  165. gene_symbol,
  166. Chromosome,
  167. Start,
  168. Stop,
  169. No_of_SNPs,
  170. NPARAM,
  171. Sample_size,
  172. Z_statistic,
  173. P_value,
  174. Rank,
  175. Bonferroni_significant
  176. )
  177. S2 <- as.data.frame(magma)
  178. # =========================
  179. # 4. S3 PoPS FULL RESULTS
  180. # =========================
  181. pops <- fread(pops_file) %>%
  182. mutate(ENSGID = sub("\\..*$", "", ENSGID)) %>%
  183. left_join(map_dt, by = "ENSGID") %>%
  184. mutate(
  185. gene_symbol = ifelse(is.na(gene_symbol) | gene_symbol == "", ENSGID, gene_symbol)
  186. ) %>%
  187. arrange(desc(PoPS_Score)) %>%
  188. mutate(Rank = row_number()) %>%
  189. select(
  190. ENSGID,
  191. gene_symbol,
  192. PoPS_Score,
  193. Y,
  194. Y_proj,
  195. project_out_covariates_gene,
  196. feature_selection_gene,
  197. training_gene,
  198. Rank
  199. )
  200. S3 <- as.data.frame(pops)
  201. # =========================
  202. # 5. S4 FULL MR RESULTS
  203. # =========================
  204. mr <- fread(mr_file)
  205. if (!"exposure" %in% names(mr)) stop("MR file must contain 'exposure' column.")
  206. S4 <- mr %>%
  207. mutate(
  208. gene_symbol = sub("^.*::", "", exposure),
  209. Cell_type = cell_type,
  210. Exposure_ID = exposure,
  211. MR_method = method,
  212. No_of_SNPs = nsnp,
  213. Beta = b,
  214. SE = se,
  215. P_value = pval,
  216. Global_FDR = pval_fdr_global,
  217. Direction = ifelse(Beta > 0, "Positive", "Negative"),
  218. MHC_region = ifelse(is_mhc_gene(gene_symbol), "Yes", "No"),
  219. Significant_after_global_FDR = ifelse(Global_FDR < 0.05, "Yes", "No")
  220. ) %>%
  221. arrange(Global_FDR, P_value) %>%
  222. select(
  223. Cell_type,
  224. gene_symbol,
  225. Exposure_ID,
  226. MR_method,
  227. No_of_SNPs,
  228. Beta,
  229. SE,
  230. P_value,
  231. Global_FDR,
  232. Direction,
  233. MHC_region,
  234. Significant_after_global_FDR
  235. ) %>%
  236. as.data.frame()
  237. names(S4)[2] <- "Gene_symbol"
  238. # =========================
  239. # 6. S5 FULL COLOC RESULTS
  240. # =========================
  241. coloc <- fread(coloc_file)
  242. # robust rename
  243. rename_if_exists <- function(dt, from, to) {
  244. if (from %in% names(dt)) setnames(dt, from, to)
  245. dt
  246. }
  247. coloc <- as.data.table(coloc)
  248. coloc <- rename_if_exists(coloc, "gene", "Gene_symbol")
  249. coloc <- rename_if_exists(coloc, "cell_type", "Cell_type")
  250. coloc <- rename_if_exists(coloc, "nsnps", "No_of_shared_SNPs")
  251. coloc <- rename_if_exists(coloc, "PP.H0.abf", "PP.H0")
  252. coloc <- rename_if_exists(coloc, "PP.H1.abf", "PP.H1")
  253. coloc <- rename_if_exists(coloc, "PP.H2.abf", "PP.H2")
  254. coloc <- rename_if_exists(coloc, "PP.H3.abf", "PP.H3")
  255. coloc <- rename_if_exists(coloc, "PP.H4.abf", "PP.H4")
  256. required_cols_s5 <- c("Cell_type", "Gene_symbol", "PP.H3", "PP.H4")
  257. missing_s5 <- setdiff(required_cols_s5, names(coloc))
  258. if (length(missing_s5) > 0) stop(paste("Missing required coloc columns:", paste(missing_s5, collapse = ", ")))
  259. if (!"No_of_shared_SNPs" %in% names(coloc)) coloc$No_of_shared_SNPs <- NA
  260. S5 <- coloc %>%
  261. as.data.frame() %>%
  262. mutate(
  263. Colocalization_tier = case_when(
  264. PP.H4 >= 0.70 ~ "Core",
  265. PP.H4 >= 0.50 ~ "Supportive",
  266. TRUE ~ "Lower-priority"
  267. )
  268. ) %>%
  269. arrange(desc(PP.H4)) %>%
  270. select(
  271. Cell_type,
  272. Gene_symbol,
  273. No_of_shared_SNPs,
  274. dplyr::any_of(c("PP.H0", "PP.H1", "PP.H2")),
  275. PP.H3,
  276. PP.H4,
  277. Colocalization_tier
  278. )
  279. # =========================
  280. # 7. S6 FULL INTEGRATED MATRIX
  281. # =========================
  282. if (file.exists(integrated_file)) {
  283. S6 <- fread(integrated_file) %>% as.data.frame()
  284. } else {
  285. # rebuild if integrated file is absent
  286. magma_gene <- S2 %>%
  287. group_by(gene_symbol) %>%
  288. summarise(
  289. ENSGID = ENSGID[which.min(P_value)][1],
  290. MAGMA_P_value = min(P_value, na.rm = TRUE),
  291. MAGMA_Z_statistic = Z_statistic[which.min(P_value)][1],
  292. .groups = "drop"
  293. )
  294. pops_gene <- S3 %>%
  295. group_by(gene_symbol) %>%
  296. summarise(
  297. PoPS_score = max(PoPS_Score, na.rm = TRUE),
  298. .groups = "drop"
  299. )
  300. mr_sig_nonmhc <- S4 %>%
  301. filter(Significant_after_global_FDR == "Yes", MHC_region == "No") %>%
  302. mutate(
  303. Cell_type = Cell_type,
  304. Gene_symbol = Gene_symbol,
  305. MR_method = MR_method,
  306. MR_beta = Beta,
  307. MR_SE = SE,
  308. MR_P_value = P_value,
  309. MR_FDR = Global_FDR
  310. ) %>%
  311. select(Cell_type, Gene_symbol, MR_method, No_of_SNPs, MR_beta, MR_SE, MR_P_value, MR_FDR)
  312. S6 <- mr_sig_nonmhc %>%
  313. left_join(S5 %>% select(Cell_type, Gene_symbol, PP.H3, PP.H4, Colocalization_tier),
  314. by = c("Cell_type", "Gene_symbol")) %>%
  315. left_join(magma_gene, by = c("Gene_symbol" = "gene_symbol")) %>%
  316. left_join(pops_gene, by = c("Gene_symbol" = "gene_symbol")) %>%
  317. mutate(
  318. Priority_tier = case_when(
  319. !is.na(PP.H4) & PP.H4 >= 0.70 ~ "Core",
  320. !is.na(PP.H4) & PP.H4 >= 0.50 ~ "Supportive",
  321. TRUE ~ "Lower-priority"
  322. )
  323. ) %>%
  324. arrange(desc(PP.H4), MR_FDR, MR_P_value) %>%
  325. as.data.frame()
  326. }
  327. # standardize S6 columns if already exists
  328. if (nrow(S6) > 0) {
  329. nm <- names(S6)
  330. names(S6) <- gsub("^cell_type$", "Cell_type", nm)
  331. names(S6) <- gsub("^gene_symbol$", "Gene_symbol", names(S6))
  332. names(S6) <- gsub("^ENSGID$", "ENSGID", names(S6))
  333. names(S6) <- gsub("^method$", "MR_method", names(S6))
  334. names(S6) <- gsub("^nsnp$", "No_of_SNPs", names(S6))
  335. names(S6) <- gsub("^b$", "MR_beta", names(S6))
  336. names(S6) <- gsub("^se$", "MR_SE", names(S6))
  337. names(S6) <- gsub("^pval$", "MR_P_value", names(S6))
  338. names(S6) <- gsub("^pval_fdr_global$", "MR_FDR", names(S6))
  339. names(S6) <- gsub("^MAGMA_P$", "MAGMA_P_value", names(S6))
  340. names(S6) <- gsub("^MAGMA_Z$", "MAGMA_Z_statistic", names(S6))
  341. names(S6) <- gsub("^PoPS_Score$", "PoPS_score", names(S6))
  342. names(S6) <- gsub("^priority_group$", "Priority_tier", names(S6))
  343. }
  344. # =========================
  345. # 8. WRITE OUTPUTS
  346. # =========================
  347. write_table_pair <- function(df, stem) {
  348. fwrite(df, file.path(out_dir, paste0(stem, ".tsv")), sep = "\t", na = "NA")
  349. write.csv(df, file.path(out_dir, paste0(stem, ".csv")), row.names = FALSE, na = "")
  350. }
  351. write_table_pair(S1, "Supplementary_Table_S1")
  352. write_table_pair(S2, "Supplementary_Table_S2")
  353. write_table_pair(S3, "Supplementary_Table_S3")
  354. write_table_pair(S4, "Supplementary_Table_S4")
  355. write_table_pair(S5, "Supplementary_Table_S5")
  356. write_table_pair(S6, "Supplementary_Table_S6")
  357. cat("Done.\n")
  358. cat("Output directory:\n", out_dir, "\n")
  359. cat("Generated files:\n")
  360. print(list.files(out_dir, full.names = TRUE))

make_supplementary_tables_S1_S6.R at commit b66052f, no license · at the source

Overview

Authors: Guangyi Tao1, Linzi Wang2, Hanzhe Du1, Zhonghe Zeng1, Longming Lei3
ORCID iDs: Guangyi Tao
  1. Graduate School, Guangxi University of Chinese Medicine, Nanning, People’s Republic of China
  2. Department of Plastic Surgery, The Third People’s Hospital of Henan Province, Zhengzhou, People’s Republic of China
  3. Department of Rehabilitation Medicine, The First Affiliated Hospital of Guangxi University of Chinese Medicine, Nanning, People’s Republic of China
Journal: Journal of pain research, volume 19, article 619982
Dates: received 26 April 2026; accepted 28 July 2026; published online 31 August 2026
Type: Research article · Language: English
License: CC BY-NC
Identifiers: DOI 10.2147/jpr.s619982 · PMID 42699694 · PMCID PMC13544130 · OpenAlex W7204780284
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), other (modality), human (organism), pain (population), cellular / molecular (subfield)
Methods: Statistics, Machine learning
Keywords: low back pain, pain genetics, integrative genomics, Mendelian randomization, colocalization, spatial transcriptomics, gsMap, single-nuclei eQTL, neuroaxis, RT-qPCR
Topic: Spine and Intervertebral Disc Pathology (Pathology and Forensic Medicine, Medicine), according to OpenAlex
Citations: not cited yet (Europe PMC); 24 references in the paper

Abstract

Purpose: Low back pain (LBP) is a heterogeneous pain condition with a measurable genetic contribution, but the genes, brain cell types, and spatial tissue contexts through which inherited risk is expressed remain unclear. We aimed to define cell-type-specific and spatially contextualized genetic mechanisms underlying LBP.

Methods: FinnGen R12 LBP GWAS summary statistics (42,521 cases and 353,224 controls) were integrated with brain single-nuclei eQTL data across eight major brain cell classes. We evaluated genome-wide polygenic signal using LDSC, prioritized genes using MAGMA and PoPS, and performed brain cell-type-specific eQTL-anchored Mendelian randomization, primarily based on single-instrument Wald ratio estimates, followed by Bayesian colocalization. Spatial genetic mapping was conducted using gsMap in an E16.5 murine embryonic atlas and two adult human lumbar spinal cord Visium sections. Selected candidates were assessed by RT-qPCR in neuronal-like and astroglial-like inflammatory cell models.

Results: LDSC supported interpretable polygenic signal for LBP. MAGMA and PoPS showed partial gene-level convergence, with TCF4 and TMEFF2 supported by both approaches. Across 1641 tested gene-cell type exposures, significant eQTL-anchored MR associations were concentrated in excitatory neurons, oligodendrocytes, inhibitory neurons, and astrocytes. Integrated eQTL-anchored MR, colocalization, and gene-prioritization evidence highlighted CLEC18A, QPRT, and GMPPB as higher-priority non-MHC candidates with moderate, but not strong, colocalization support. gsMap localized LBP-associated enrichment to neuroaxis-related embryonic regions, including brain, spinal cord, sympathetic nerve, and dorsal root ganglion, and to neuronal-like niches in adult lumbar spinal cord. RT-qPCR showed model-dependent expression changes, with QPRT and LGI4 preferentially responsive in neuronal-like SH-SY5Y cells and GMPPB and DPYSL5 responsive in astroglial-like U251 cells.

Conclusion: These findings support neuronal and glial regulatory programs as plausible contributors to LBP genetic susceptibility and highlight CLEC18A, QPRT, and GMPPB as higher-priority non-MHC candidates with moderate colocalization support. The results provide a spatially contextualized framework for candidate prioritization in LBP, while emphasizing the need for larger cell-type-specific eQTL resources and functional validation before therapeutic or mechanistic conclusions can be drawn.

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 20 matches between paragraphs and lines of code.

zza070952-collab/LBP_brain_eQTL_spatial_genomics

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: b66052f2e2763db9c90e9c30137c3061f6385592, 23 June 2026
Languages: Python (17), R (12), Shell (6)
Size: 80 files, 35 scripts
Software Heritage: not archived
Found in: “Data Sharing Statement”
Holds: README, documentation
Not found: license file, CITATION.cff, environment file, tests, continuous integration
Tools: tidyverse (9 files), data.table (8 files), pandas (7 files), ggplot2 (4 files), Matplotlib (3 files), NumPy (3 files), Scanpy (2 files), patchwork (1 file), SciPy (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
36 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;
  • 35 scripts, each with its path and the digest of its content;
  • 20 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 Sharing Statement

The LBP GWAS summary statistics analyzed in this study were obtained from FinnGen release R12/DF12 endpoint M13_LOWBACKPAIN (“Low back pain”). The endpoint information is available through the FinnGen Risteys browser, and the endpoint-specific summary-statistics file is available from the FinnGen public summary-statistics resource as finngen_R12_M13_LOWBACKPAIN.gz. Brain single-nuclei eQTL summary statistics were obtained from the publicly available Zenodo resource “Summary statistics of eQTLs obtained from single-nuclei RNA-seq in 8 major brain cell types for Mendelian randomisation”. The adult human lumbar spinal cord Visium sections used for spatial genetic mapping correspond to GSM6919906 (https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSM6919906) and GSM6919909 (https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSM6919909) and are available through the NCBI Gene Expression Omnibus. The raw RT-qPCR workbook underlying Figure 7 is provided as Supplementary Data S1 (https://www.dovepress.com/article/supplementary_file/619982/619982 Supplementary Material.pdf). The final supplementary tables supporting the LDSC, MAGMA, PoPS, MR, colocalization, gsMap, and marker-annotation analyses are provided as Supplementary Tables S1 (https://www.dovepress.com/article/supplementary_file/619982/619982 Supplementary Material.pdf)–S8 (https://www.dovepress.com/article/supplementary_file/619982/619982 Supplementary Material.pdf). Processed result tables and figure source files required to reproduce the main results have been deposited in the public GitHub repository described in the Code availability statement.

Custom scripts used for GWAS harmonization, LDSC and MAGMA input preparation, PoPS prioritization, brain cell-type-specific eQTL-anchored Mendelian randomization, Bayesian colocalization, gsMap post-processing, supplementary table generation, and figure generation are available at https://github.com/zza070952-collab/LBP_brain_eQTL_spatial_genomics. The repository also contains a run-order document, software/environment notes, public data-resource descriptions, processed result tables, and figure source files required to reproduce the analytical workflow. Large public datasets and raw third-party resources are not redistributed in the repository; their accessions and download information are provided in the Data availability statement and repository documentation.

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, pages, dates, 5 authors, 10 keywords, 24 references.

Cite

This paper

Tao, G., Wang, L., Du, H., Zeng, Z., & Lei, L. (2026). Spatially Contextualized Integrative Genomics Highlights Neuronal and Glial Regulatory Programs in Low Back Pain. Journal of pain research, 19, 619982. https://doi.org/10.2147/jpr.s619982

BibTeX

@article{tao2026spatially,
author = {Tao, Guangyi and Wang, Linzi and Du, Hanzhe and Zeng, Zhonghe and Lei, Longming},
title = {{Spatially Contextualized Integrative Genomics Highlights Neuronal and Glial Regulatory Programs in Low Back Pain}},
journal = {Journal of pain research},
year = {2026},
month = aug,
volume = {19},
pages = {619982},
publisher = {Dove Press},
issn = {1178-7090},
doi = {10.2147/jpr.s619982},
url = {https://doi.org/10.2147/jpr.s619982},
pmid = {42699694},
pmcid = {PMC13544130}
}

RIS

TY - JOUR
AU - Tao, Guangyi
AU - Wang, Linzi
AU - Du, Hanzhe
AU - Zeng, Zhonghe
AU - Lei, Longming
TI - Spatially Contextualized Integrative Genomics Highlights Neuronal and Glial Regulatory Programs in Low Back Pain
T2 - Journal of pain research
J2 - J Pain Res
PY - 2026
DA - 2026/08/31
VL - 19
SP - 619982
SN - 1178-7090
PB - Dove Press
DO - 10.2147/jpr.s619982
UR - https://doi.org/10.2147/jpr.s619982
LA - en
ER -

CSL-JSON

{
"id": "10.2147/jpr.s619982",
"type": "article-journal",
"title": "Spatially Contextualized Integrative Genomics Highlights Neuronal and Glial Regulatory Programs in Low Back Pain",
"container-title": "Journal of pain research",
"author": [
{
"family": "Tao",
"given": "Guangyi"
},
{
"family": "Wang",
"given": "Linzi"
},
{
"family": "Du",
"given": "Hanzhe"
},
{
"family": "Zeng",
"given": "Zhonghe"
},
{
"family": "Lei",
"given": "Longming"
}
],
"container-title-short": "J Pain Res",
"volume": "19",
"page": "619982",
"DOI": "10.2147/jpr.s619982",
"PMID": "42699694",
"PMCID": "PMC13544130",
"ISSN": "1178-7090",
"publisher": "Dove Press",
"URL": "https://doi.org/10.2147/jpr.s619982",
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
31
]
]
}
}

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

Similar papers

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

[1] doi:10.1038/s41467-026-72164-7 [code]
Multivariate genetic analysis reveals three distinct pathological dimensions in musculoskeletal disorders.
Journal: Nature communications
In common: Scanpy, data.table, ggplot2, 4 other tools, genetics / omics, 5 references
[2] doi:10.1073/pnas.2609814123 [code]
Genetic architectures of brain-related traits are shaped by strong selective constraints.
Journal: Proceedings of the National Academy of Sciences of the United States of America
In common: data.table, patchwork, ggplot2, 5 other tools, genetics / omics, cellular / molecular, 3 references
[3] doi:10.1038/s41467-026-71682-8 [code]
GWAS meta-analysis of cerebrospinal fluid Alzheimer's biomarkers reveals loci regulating lipids, brain volume and autophagy.
Journal: Nature communications
In common: data.table, ggplot2, tidyverse, 3 other tools, genetics / omics, 5 references
[4] doi:10.1038/s41591-026-04492-6 [code]
The genetic architecture of fibromyalgia across 2.5 million individuals.
Journal: Nature medicine
In common: data.table, SciPy, Matplotlib, 1 other tool, pain, genetics / omics, 5 references
[5] doi:10.1038/s41467-026-73007-1 [code]
Single-nucleus epigenomic dysregulation unmasks genetic risk-associated neurodegenerative glia states.
Journal: Nature communications
In common: Scanpy, data.table, patchwork, 5 other tools, genetics / omics, cellular / molecular, 2 references
[6] doi:10.1038/s41380-026-03571-x [code]
Convergent coexpression reveals shared biological mechanisms underlying common and rare variant risk in six neuropsychiatric disorders.
Journal: Molecular psychiatry
In common: data.table, patchwork, ggplot2, 4 other tools, genetics / omics, cellular / molecular, 3 references
[7] doi:10.1038/s41562-026-02486-5 [code]
Genome-wide association studies of infant and toddler temperament in European and multi-ancestry populations.
Journal: Nature human behaviour
In common: data.table, ggplot2, tidyverse, 4 other tools, genetics / omics, 4 references
[8] doi:10.1038/s41467-026-73428-y [code]
Regional heterogeneity in phenotypic and genetic associations between bone and brain in humans.
Journal: Nature communications
In common: data.table, ggplot2, tidyverse, 3 other tools, genetics / omics, cellular / molecular, 4 references
[9] doi:10.1038/s41514-026-00391-9 [code]
Region-specific transcriptional signatures of brain aging in the absence of neuropathology at the single-cell level.
Journal: npj aging
In common: Scanpy, data.table, patchwork, 6 other tools, genetics / omics, cellular / molecular, 1 reference
[10] doi:10.1016/j.stem.2026.05.005 [code]
Generation of human appetite-regulating neurons and tanycytes from pluripotent stem cells.
Journal: Cell stem cell
In common: Scanpy, data.table, patchwork, 6 other tools, cellular / molecular, 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.