OSCR

Exploring longitudinal relationships among Alzheimer's disease biomarkers.

Code ↔ Paper

2 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 2 matches
  1. [1] § METHODS › Plasma biomarker assays ↔ Movie_Data_code/app.r, lines 1–66 · score 0.76 · PrecivityAD2, LucentAD, NeuroToolKit, ALZpath, Plex, kits
  2. [2] § METHODS › Plasma biomarker assays ↔ Raindrop_Plots_Code/Needed_Functions.R, lines 1–70 · score 0.65 · LucentAD, NeuroToolKit, ALZpath, Plex, kits, tau181

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 · 568 lines · 23 KB · MIT · 1 match

  1. #raindrops actual
  2. # tidyverse in particular is incredibly important for graphing and filtering.
  3. list.of.packages <- c("tidyverse", "data.table","shiny","RColorBrewer","ggforce","ggbreak","av","polished","shinyjs")
  4. new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
  5. if(length(new.packages)) install.packages(new.packages)
  6. library(colourpicker)
  7. library(shiny)
  8. library(ggplot2)
  9. library(data.table)
  10. library(RColorBrewer)
  11. library(ggforce)
  12. library(av)
  13. library(shinyjs)
  14. library(polished)
  15. source("Needed_Functions.R")
  16. ##Replace APS with Tipping Point Probability ## Not
  17. ##X default - Centiloid
  18. ##Y default - % pt217
  19. ##Color default - CDR_SB
  20. #(optional legend)
  21. scramble_key <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,21,16,17,18,19,20)
  22. step_size_list <- c(0.1, #C2N Plasma Ptau217 ratio
  23. 0.2, #C2N Plasma Ptau217 conc
  24. 0.005, #C2N Plasma Ab4240
  25. 0.001, #Fujirebio Ptau217
  26. 0.001, #Fujirebio Ab4240
  27. 0.005, #Alzpath Ptau217
  28. 0.005, #Janssen Ptau217
  29. 0.01, #Roche Ptau181
  30. 0.005, #Roche Ab4240
  31. 0.001, #Roche GFAP
  32. 0.05, #Roche NfL
  33. 0.01, #Quanterix Ptau 181
  34. 1, #Quanterix GFAP
  35. 0.005, #Quanterix Ab4240
  36. 0.01, #Quanterix NfL
  37. 1,#Centiloid
  38. 0.01,#Tau PET Early
  39. 0.01,#Tau PET Late
  40. 0.001,#Cortical Thickness Meta ROI
  41. 0.5, #CDR Sum of Boxes
  42. 1) #CSF ab42/ptau181
  43. graph_choices_ref <- c(paste0("C2N PrecivityAD2 ","plasma %p-tau217 (%)"),
  44. paste0("C2N PrecivityAD2 ","plasma p-tau217 (pg/mL)"),
  45. paste0("C2N PrecivityAD2 ","plasma A","\U03B2","42/A","\U03B2","40"),
  46. paste0("Fujirebio Lumipulse ","plasma p-tau217 (pg/mL)"),
  47. paste0("Fujirebio Lumipulse ","plasma A","\U03B2","42/A","\U03B2","40"),
  48. paste0("ALZpath Quanterix ","plasma p-tau217 (pg/mL)"),
  49. paste0("Janssen LucentAD Quanterix ","plasma p-tau217 (pg/mL)"),
  50. paste0("Roche NeuroToolKit ","plasma p-tau181 (pg/mL)"),
  51. paste0("Roche NeuroToolKit ","plasma A","\U03B2","42/A","\U03B2","40"),
  52. paste0("Roche NeuroToolKit ","plasma GFAP (ng/mL)"),
  53. paste0("Roche NeuroToolKit ","plasma NfL (pg/mL)"),
  54. paste0("Quanterix Neurology 4-Plex ","plasma p-tau181 (pg/ml)"),
  55. paste0("Quanterix Neurology 4-Plex ","plasma GFAP (pg/mL)"),
  56. paste0("Quanterix Neurology 4-Plex ","plasma A","\U03B2","42/A","\U03B2","40"),
  57. paste0("Quanterix Neurology 4-Plex ","plasma NfL (pg/mL)"),
  58. "Amyloid PET Centiloid",
  59. "Tau PET Mesial-Temporal (Early)",
  60. "Tau PET Temporo-Parietal (Late)",
  61. "Cortical Thickness (Meta ROI)",
  62. "Clinical Dementia Rating Sum of Boxes",
  63. paste0("Roche Elecsys ","CSF A","\U03B2","42/p-tau181"))
  64. graph_limits_list <- list(c(0,25), #C2N Plasma Ptau217 ratio
  65. c(0,20), #C2N Plasma Ptau217 conc
  66. c(0,0.15), #C2N Plasma Ab4240
  67. c(0,1.8), #Fujirebio Ptau217
  68. c(0,0.3), #Fujirebio Ab4240
  69. c(0,3), #Alzpath Ptau217
  70. c(0,0.35), #Janssen Ptau217
  71. c(0,4.7), #Roche Ptau181
  72. c(0,0.23), #Roche Ab4240
  73. c(0,0.46), #Roche GFAP
  74. c(0,16), #Roche NfL
  75. c(0,80), #Quanterix Ptau 181
  76. c(0,565), #Quanterix GFAP
  77. c(0,0.125), #Quanterix Ab4240
  78. c(0,80), #Quanterix NfL
  79. c(-40,190),#Centiloid
  80. c(0.85,2),#Tau PET Early
  81. c(0.9,2.5),#Tau PET Late
  82. c(1.8,3.25),#Cortical Thickness Meta ROI
  83. c(-0.5,10),#CDR Sum of Boxes
  84. c(5,185) #CSF ab42/ptau181
  85. )
  86. group_threshold_defaults <- c("1.5, 2.5, 4.1, 8",#C2N Plasma Ptau217 ratio
  87. "3, 7, 13, 16", #C2N Plasma Ptau217 conc
  88. "0.04, 0.06, 0.0924, 0.1", #C2N Plasma Ab4240
  89. "0.06, 0.1, 0.158, 0.5", #Fujirebio Ptau217
  90. "0.04, 0.06, 0.0869, 1.5", #Fujirebio Ab4240
  91. "0.2,0.3,0.444,0.5", #Alzpath Ptau217
  92. "0.04,0.05,0.0615,0.085", #Janssen Ptau217
  93. "0.65,1.0,1.14,1.3", #Roche Ptau181
  94. "0.11,0.12,0.126,0.14", #Roche Ab4240
  95. "0.0661, 0.0916, 0.113, 0.1230", #Roche GFAP
  96. "2.650, 3.270, 4.29, 7", #Roche NfL
  97. "12.1, 17.8, 20.5, 30", #Quanterix Ptau 181
  98. "89, 128, 205, 250", #Quanterix GFAP
  99. "0.045, 0.053, 0.0582, 0.070", #Quanterix Ab4240
  100. "13.27, 17.57, 21.7, 28", #Quanterix NfL
  101. "-5.00, 7.00, 20, 39",#Centiloid
  102. "1.09, 1.15, 1.328, 1.4",#Tau PET Early
  103. "1.05, 1.12, 1.269, 1.31",#Tau PET Late
  104. "2.5, 2.572, 2.932, 3",#Cortical Thickness Meta ROI
  105. "0.5, 1, 2, 4",#CDR Sum of Boxes
  106. "10,25,60,91") #CSF ab42/ptau181
  107. rank_thresholds <- c(
  108. 236, #C2N Plasma Ptau217 ratio
  109. 254, #C2N Plasma Ptau217 conc
  110. 186, #C2N Plasma Ab4240
  111. 241, #Fujirebio Ptau217
  112. 160, #Fujirebio Ab4240
  113. 250, #Alzpath Ptau217
  114. 252, #Janssen Ptau217
  115. 237, #Roche Ptau181
  116. 209, #Roche Ab4240
  117. 250, #Roche GFAP
  118. 269, #Roche NfL
  119. 203, #Quanterix Ptau 181
  120. 260, #Quanterix GFAP
  121. 130, #Quanterix Ab4240
  122. 217, #Quanterix NfL
  123. 233, #Centiloid
  124. 103, #Tau PET Early
  125. 114, #Tau PET Late
  126. 26, #Cortical Thickness Meta ROI
  127. 266, #CDR Sum of Boxes
  128. 53 #CSF ab42/ptau181
  129. )
  130. # Default threshold lines for each variable
  131. value_thresholds <- c(
  132. 4.06, #C2N Plasma Ptau217 ratio
  133. 2.34, #C2N Plasma Ptau217 conc
  134. 0.0924, #C2N Plasma Ab4240
  135. 0.158, #Fujirebio Ptau217
  136. 0.0869, #Fujirebio Ab4240
  137. 0.444, #Alzpath Ptau217
  138. 0.0615, #Janssen Ptau217
  139. 1.14, #Roche Ptau181
  140. 0.126, #Roche Ab4240
  141. 0.113, #Roche GFAP
  142. 4.29, #Roche NfL
  143. 20.5, #Quanterix Ptau 181
  144. 205, #Quanterix GFAP
  145. 0.0582, #Quanterix Ab4240
  146. 21.7, #Quanterix NfL
  147. 20, #Centiloid
  148. 1.328, #Tau PET Early
  149. 1.269, #Tau PET Late
  150. 2.572, #Cortical Thickness Meta ROI
  151. 1, #CDR Sum of Boxes
  152. 25 #CSF ab42/ptau181
  153. )
  154. graph_choices_suffixes <- c("C2N_plasma_ptau217_ratio","C2N_plasma_ptau217", "C2N_plasma_Abeta42_Abeta40",
  155. "Fuji_plasma_ptau217","Fuji_plasma_Ab42_Ab40",
  156. "AlzPath_plasma_ptau217","Janssen_plasma_ptau217","Roche_plasma_ptau181","Roche_plasma_Ab42_Ab40",
  157. "Roche_plasma_GFAP", "Roche_plasma_NfL",
  158. "QX_plasma_ptau181","QX_plasma_GFAP","QX_plasma_Ab42_Ab40","QX_plasma_NfL",
  159. "CENTILOIDS","MesialTemporal","TemporoParietal","metaROI","CDSOB","AB42_PTAU181")
  160. high_risk_high <- graph_choices_ref[c(1,2,4,6,7,8,10,11,12,13,15,16,17,18,20)]
  161. high_risk_low <- graph_choices_ref[c(3,5,9,14,19,21)]
  162. ui <- shinyUI(fluidPage(
  163. useShinyjs(),
  164. tags$head(tags$style(".shiny-notification {
  165. position: fixed;
  166. top: 50%;
  167. left: 50%;
  168. transform: translate(-50%, -50%);
  169. width: 600px;
  170. height: 200px;
  171. font-size: 24px;
  172. text-align: center;
  173. opacity: 0.95;
  174. z-index: 1000;
  175. }")),
  176. # Hidden inputs - these exist for the code but aren't displayed
  177. shinyjs::hidden(
  178. selectInput("graphtype_anim", "Type:", choices=c("Raindrop","Timetrails"), selected="Timetrails"),
  179. selectInput("y_var", "Y:", choices=graph_choices_ref[scramble_key], selected=graph_choices_ref[1]),
  180. selectInput("x_var", "X:", choices=graph_choices_ref[scramble_key], selected=graph_choices_ref[16]),
  181. selectInput("group_xy_check", "Group:", choices=c("Longitudinal","Baseline"), selected="Baseline"),
  182. selectInput("other_type", "Other:", choices=graph_choices_ref[scramble_key], selected=graph_choices_ref[1]),
  183. selectInput("otherb_type", "OtherB:", choices=graph_choices_ref[scramble_key], selected=graph_choices_ref[1]),
  184. checkboxInput("origin_plot", "Origin", value=FALSE),
  185. sliderInput("cutoff1", "C1", min=0, max=20, step=0.2, value=0),
  186. sliderInput("cutoff2", "C2", min=0, max=20, step=0.2, value=0),
  187. sliderInput("cutoff3", "C3", min=0, max=20, step=0.2, value=0),
  188. sliderInput("cutoff4", "C4", min=0, max=20, step=0.2, value=0),
  189. numericInput("th1", "Th1", value=0.0673, step=0.0005),
  190. numericInput("th2_rank", "Th2 Rank", value=90),
  191. numericInput("th2_trail", "Th2 Trail", value=0.158, step=0.0005),
  192. actionButton("reset_thresholds", "Reset"),
  193. downloadButton("downloadData", "Download")
  194. ),
  195. # Empty white screen
  196. tags$div(style = "background-color: white; width: 100%; height: 100vh;")
  197. ))
  198. server <- function(input, output, session) {
  199. load("ADNI_Raindrop_Data_Test_v3.rdata")
  200. # Auto-trigger download when app loads with URL parameters
  201. observe({
  202. query <- parseQueryString(session$clientData$url_search)
  203. # Only auto-trigger if coming from another app with URL parameters
  204. if(length(query) > 0){
  205. delay(1000, click("downloadData")) # Wait 1 second then trigger download
  206. }
  207. })
  208. # Parse URL parameters and update hidden inputs
  209. observe({
  210. query <- parseQueryString(session$clientData$url_search)
  211. if(!is.null(query[['graphtype']])){
  212. graph_variable_id <- query[['graphtype']]
  213. updateSelectInput(session, "graphtype_anim", selected = graph_variable_id)
  214. }
  215. if(!is.null(query[['xvar']])){
  216. x_variable_id <- graph_choices_ref[which(graph_choices_suffixes==query[['xvar']])]
  217. updateSelectInput(session, "x_var", selected = x_variable_id)
  218. }
  219. if(!is.null(query[['yvar']])){
  220. y_variable_id <- graph_choices_ref[which(graph_choices_suffixes==query[['yvar']])]
  221. updateSelectInput(session, "y_var", selected = y_variable_id)
  222. }
  223. if(!is.null(query[['gxyc']])){
  224. gxyc <- query[['gxyc']]
  225. updateSelectInput(session, "group_xy_check", selected = gxyc)
  226. }
  227. if(!is.null(query[['oty']])){
  228. oty_variable_id <- graph_choices_ref[which(graph_choices_suffixes==query[['oty']])]
  229. updateSelectInput(session, "other_type", selected = oty_variable_id)
  230. }
  231. if(!is.null(query[['otyb']])){
  232. otyb_variable_id <- graph_choices_ref[which(graph_choices_suffixes==query[['otyb']])]
  233. updateSelectInput(session, "otherb_type", selected = otyb_variable_id)
  234. }
  235. if(!is.null(query[['co1']])){
  236. co1 <- as.numeric(query[['co1']])
  237. updateSliderInput(session, "cutoff1", value = co1)
  238. }
  239. if(!is.null(query[['co2']])){
  240. co2 <- as.numeric(query[['co2']])
  241. updateSliderInput(session, "cutoff2", value = co2)
  242. }
  243. if(!is.null(query[['co3']])){
  244. co3 <- as.numeric(query[['co3']])
  245. updateSliderInput(session, "cutoff3", value = co3)
  246. }
  247. if(!is.null(query[['co4']])){
  248. co4 <- as.numeric(query[['co4']])
  249. updateSliderInput(session, "cutoff4", value = co4)
  250. }
  251. if(!is.null(query[['th1']])){
  252. th1 <- as.numeric(query[['th1']])
  253. updateNumericInput(session,'th1', value=th1)
  254. }
  255. if(!is.null(query[['th2']])){
  256. th2 <- as.numeric(query[['th2']])
  257. updateNumericInput(session,'th2_rank', value=th2)
  258. updateNumericInput(session,'th2_trail', value=th2)
  259. }
  260. if(!is.null(query[['ogn']])){
  261. ogn <- query[['ogn']]
  262. ogn <- ogn =="TRUE"
  263. updateCheckboxInput(session,'origin_plot',value = ogn)
  264. }
  265. })
  266. output$secondSelection <- renderUI({
  267. selectInput("other", "Grouping Variable:", choices = graph_choices_ref[scramble_key])
  268. })
  269. # Reactive expressions
  270. variableids_for_plot <- reactive({
  271. if(input$graphtype_anim=="Raindrop"){
  272. graph_choice_y <- graph_choices_suffixes[which(graph_choices_ref==input$y_var)]
  273. graph_choice_BL <- graph_choices_suffixes[which(graph_choices_ref==input$x_var)]
  274. graph_vars_list <- c(paste0("N_",graph_choice_BL),
  275. paste0("BL_EST_",graph_choice_BL),
  276. paste0("EST_",graph_choice_y))
  277. }else{
  278. graph_choice_y <- graph_choices_suffixes[which(graph_choices_ref==input$y_var)]
  279. graph_choice_x <- graph_choices_suffixes[which(graph_choices_ref==input$x_var)]
  280. graph_vars_list <- c(paste0("EST_",graph_choice_x),
  281. paste0("EST_",graph_choice_y))
  282. }
  283. graph_vars_list
  284. })
  285. param_change <- reactive({
  286. list(input$graphtype_anim,input$cutoff1,input$cutoff2,input$cutoff3,input$cutoff4,
  287. input$y_var, input$x_var, input$group_xy_check,
  288. input$other_type, input$otherb_type)
  289. })
  290. update_origin_point <- reactive({input$origin_plot})
  291. cutoff_change <- reactive({
  292. list(input$group_xy_check, input$other_type, input$otherb_type, input$reset_thresholds)
  293. })
  294. c1_change <- reactive({list(input$cutoff1)})
  295. c2_change <- reactive({list(input$cutoff2)})
  296. c3_change <- reactive({list(input$cutoff3)})
  297. observeEvent(c1_change(),{
  298. min2 <- input$cutoff1
  299. updateSliderInput(session, "cutoff2", min = min2)
  300. })
  301. observeEvent(c2_change(),{
  302. min3 <- input$cutoff2
  303. updateSliderInput(session, "cutoff3", min = min3)
  304. })
  305. observeEvent(c3_change(),{
  306. min4 <- input$cutoff3
  307. updateSliderInput(session, "cutoff4", min = min4)
  308. })
  309. observeEvent(cutoff_change(),{
  310. req(input$group_xy_check)
  311. if(input$group_xy_check=="Longitudinal"){
  312. req(input$other_type)
  313. var <- input$other_type
  314. } else {
  315. req(input$otherb_type)
  316. var <- input$otherb_type
  317. }
  318. group_thresholds <- extract_comma_sep(group_threshold_defaults[which(graph_choices_ref==var)])
  319. group_choice <- graph_choices_suffixes[which(graph_choices_ref==var)]
  320. group_var <- paste0("EST_",group_choice)
  321. var_step <- step_size_list[which(graph_choices_ref==var)]
  322. dec_count <- decimalplaces(var_step)
  323. max_value_slider <- paste(signif(max(data_10th_demo[,group_var],na.rm = T),dec_count))
  324. updateSliderInput(session, "cutoff1",value=group_thresholds[1],
  325. min = floor(min(data_10th_demo[,group_var],na.rm = T)),
  326. max = max_value_slider,
  327. step = var_step)
  328. updateSliderInput(session, "cutoff2",value=group_thresholds[2],
  329. min = floor(min(data_10th_demo[,group_var],na.rm = T)),
  330. max = max_value_slider,
  331. step = var_step)
  332. updateSliderInput(session, "cutoff3",value=group_thresholds[3],
  333. min = floor(min(data_10th_demo[,group_var],na.rm = T)),
  334. max = max_value_slider,
  335. step = var_step)
  336. updateSliderInput(session, "cutoff4",value=group_thresholds[4],
  337. min = floor(min(data_10th_demo[,group_var],na.rm = T)),
  338. max = max_value_slider,
  339. step = var_step)
  340. query <- parseQueryString(session$clientData$url_search)
  341. if(!is.null(query[['co1']])){
  342. co1 <- as.numeric(query[['co1']])
  343. updateSliderInput(session, "cutoff1", value = co1)
  344. }
  345. if(!is.null(query[['co2']])){
  346. co2 <- as.numeric(query[['co2']])
  347. updateSliderInput(session, "cutoff2", value = co2)
  348. }
  349. if(!is.null(query[['co3']])){
  350. co3 <- as.numeric(query[['co3']])
  351. updateSliderInput(session, "cutoff3", value = co3)
  352. }
  353. if(!is.null(query[['co4']])){
  354. co4 <- as.numeric(query[['co4']])
  355. updateSliderInput(session, "cutoff4", value = co4)
  356. }
  357. })
  358. group_cutoffs <- reactive({
  359. paste(input$cutoff1,input$cutoff2,input$cutoff3,input$cutoff4,sep=",")
  360. })
  361. data_cat <- eventReactive(param_change(),{
  362. variables_for_plot <- variableids_for_plot()
  363. group_breaks <- group_cutoffs()
  364. group_thresholds <- extract_comma_sep(group_breaks)
  365. if(input$group_xy_check=="Longitudinal"){
  366. graph_choice <- graph_choices_suffixes[which(graph_choices_ref==input$other_type)]
  367. splitting_variable <- paste0("EST_",graph_choice)
  368. if(input$other_type %in% high_risk_high){
  369. create_groups_EST(data_10th_demo,splitting_variable,group_thresholds)
  370. } else if (input$other_type %in% high_risk_low) {
  371. create_groups_ratio_EST(data_10th_demo,splitting_variable,group_thresholds)
  372. }
  373. } else if(input$group_xy_check=="Baseline"){
  374. graph_choice <- graph_choices_suffixes[which(graph_choices_ref==input$otherb_type)]
  375. splitting_variable <- paste0("BL_EST_",graph_choice)
  376. if(input$otherb_type %in% high_risk_high){
  377. create_groups_EST(data_10th_demo,splitting_variable,group_thresholds)
  378. } else {
  379. create_groups_ratio_EST(data_10th_demo,splitting_variable,group_thresholds)
  380. }
  381. }
  382. })
  383. # Download Handler - at top level, not inside observe()
  384. output$downloadData <- downloadHandler(
  385. filename = function() {
  386. xvar_filename <- graph_choices_suffixes[which(graph_choices_ref==input$x_var)]
  387. yvar_filename <- graph_choices_suffixes[which(graph_choices_ref==input$y_var)]
  388. if(input$graphtype_anim=="Raindrop"){
  389. paste0("out_raindrop_",yvar_filename,"_vs_",xvar_filename,".mp4")
  390. } else {
  391. paste0("out_timetrails_",yvar_filename,"_vs_",xvar_filename,".mp4")
  392. }
  393. },
  394. content = function(file) {
  395. source("Needed_Functions.R")
  396. in.csv.graphdata <- data_cat()
  397. variables_for_plot <- variableids_for_plot()
  398. in.csv.graphdata <- in.csv.graphdata[which(complete.cases(in.csv.graphdata[,variables_for_plot])),]
  399. if(input$graphtype_anim=="Raindrop"){
  400. in.csv.graphdata[,variables_for_plot[1]] <- as.numeric(factor(in.csv.graphdata[,variables_for_plot[1]]))
  401. limits_for_plot <- graph_limits_list[[which(graph_choices_ref==input$y_var)]]
  402. withProgress(message = 'Video being created',
  403. detail = 'Please wait approximately 1 minute. Video will download automatically when complete.',
  404. value = 0, {
  405. av_capture_graphics(create_raindrop_plot_movie(data = in.csv.graphdata,
  406. variablelist = variables_for_plot,
  407. ylimits=limits_for_plot,
  408. graph.xlab = input$x_var,
  409. graph.ylab = input$y_var,
  410. th1=input$th1,
  411. th2=input$th2_rank,
  412. originpoints=FALSE),
  413. output = file,
  414. res=100,
  415. width=1250,
  416. height=750,
  417. framerate = 5)
  418. }
  419. )
  420. showNotification(
  421. "Video completed and downloading!",
  422. duration = 3,
  423. type = "message"
  424. )
  425. } else if(input$graphtype_anim=="Timetrails"){
  426. xlimits_for_plot <- graph_limits_list[[which(graph_choices_ref==input$x_var)]]
  427. limits_for_plot <- graph_limits_list[[which(graph_choices_ref==input$y_var)]]
  428. withProgress(message = 'Video being created',
  429. detail = 'Please wait approximately 1 minute. Video will download automatically when complete.',
  430. value = 0, {
  431. av_capture_graphics(create_timepath_plot_video(data = in.csv.graphdata,
  432. variablelist = variables_for_plot,
  433. xlimits=xlimits_for_plot,
  434. ylimits=limits_for_plot,
  435. graph.xlab = input$x_var,
  436. graph.ylab = input$y_var,
  437. th1=input$th1,
  438. th2=input$th2_trail),
  439. output = file,
  440. res=100,
  441. width=1250,
  442. height=750,
  443. framerate = 5)
  444. }
  445. )
  446. showNotification(
  447. "Video completed and downloading!",
  448. duration = 3,
  449. type = "message"
  450. )
  451. }
  452. },
  453. contentType = "video/mp4"
  454. )
  455. outputOptions(output, "downloadData", suspendWhenHidden = FALSE)
  456. update_group_long <- reactive({
  457. list(input$group_xy_check, input$other_type, input$otherb_type)
  458. })
  459. # Update threshold values when x_var changes
  460. observeEvent(input$x_var,{
  461. x = input$x_var
  462. query <- parseQueryString(session$clientData$url_search)
  463. updated_threshold_th2 <- rank_thresholds[which(graph_choices_ref==x)]
  464. updateNumericInput(session,'th2_rank', value=updated_threshold_th2)
  465. if(!is.null(query[['th2']])){
  466. th2 <- as.numeric(query[['th2']])
  467. updateNumericInput(session,'th2_rank', value=th2)
  468. }
  469. updated_threshold_th2 <- value_thresholds[which(graph_choices_ref==x)]
  470. updateNumericInput(session,'th2_trail', value=updated_threshold_th2)
  471. if(!is.null(query[['th2']])){
  472. th2 <- as.numeric(query[['th2']])
  473. updateNumericInput(session,'th2_trail', value=th2)
  474. }
  475. })
  476. # Update threshold values when y_var changes
  477. observeEvent(input$y_var,{
  478. y = input$y_var
  479. query <- parseQueryString(session$clientData$url_search)
  480. updated_threshold_th1 <- value_thresholds[which(graph_choices_ref==y)]
  481. updateNumericInput(session,'th1', value=updated_threshold_th1)
  482. if(!is.null(query[['th1']])){
  483. th1 <- as.numeric(query[['th1']])
  484. updateNumericInput(session,'th1', value=th1)
  485. }
  486. })
  487. }
  488. shinyApp(ui, server)

app.r at commit eea99a6, under MIT · at the source

Overview

Authors: Benjamin Saef1, Kellen K. Petersen1, Katherine Volluz1, Yan Li1, Duygu Tosun2,3, Marta Mila‐Aloma2,3, Leslie M. Shaw4, Henrik Zetterberg5,6,7,8,9,10, Jeffrey L. Dage11,12, Carrie E. Rubel13, Kyle Ferber13, Lei Du‐Cuny14, Janaky Coomaraswamy15, Michael Baratta15, Yulia Mordashova14, Ziad S. Saad16, Gallen Triana‐Baltzer16, Nicholas J. Ashton5,17,18, Emily A. Meyers19, Erin G. Rosenbaugh20
and 6 other authorsJ. Martin Sabandal20, Anthony W. Bannon21, William Z. Potter22, Alzheimer's Disease Neuroimaging Initiative (ADNI), Foundation for the National Institutes of Health (FNIH) Biomarkers Consortium Plasma Aβ and Phosphorylated Tau as Predictors of Amyloid and Tau Positivity in Alzheimer's Disease Project Team, Suzanne E. Schindler1
22 affiliations
  1. Department of Neurology Washington University in St. Louis St. Louis Missouri USA
  2. Northern California Institute for Research and Education San Francisco California USA
  3. Department of Radiology and Biomedical Imaging University of California San Francisco San Francisco California USA
  4. Department of Pathology and Laboratory Medicine University of Pennsylvania Philadelphia Pennsylvania USA
  5. Institute of Neuroscience and Physiology Department of Psychiatry and Neurochemistry The Sahlgrenska Academy at University of Gothenburg Mölndal Sweden
  6. Clinical Neurochemistry Laboratory Sahlgrenska University Hospital Mölndal Sweden
  7. UK Dementia Research Institute Fluid Biomarkers Laboratory UK DRI at UCL London UK
  8. Department of Neurodegenerative Disease UCL Queen Square Institute of Neurology London UK
  9. Hong Kong Center for Neurodegenerative Diseases Clear Water Bay Hong Kong China
  10. Wisconsin Alzheimer's Disease Research Center University of Wisconsin School of Medicine and Public Health University of Wisconsin–Madison Madison Wisconsin USA
  11. Department of Neurology Indiana University School of Medicine Indianapolis Indiana USA
  12. Stark Neurosciences Research Institute Indiana University School of Medicine Indianapolis Indiana USA
  13. Biogen Cambridge Massachusetts USA
  14. AbbVie Deutschland GmbH & Co. KG Ludwigshafen am Rhein Rheinland‐Pfalz Germany
  15. Takeda Pharmaceutical Company Ltd. Cambridge Massachusetts USA
  16. Precision Measures Johnson & Johnson San Diego California USA
  17. Banner Alzheimer's Institute Phoenix Arizona USA
  18. Banner Sun Health Research Institute Sun City Arizona USA
  19. Alzheimer's Association Chicago Illinois USA
  20. The Foundation for the National Institutes of Health North Bethesda Maryland USA
  21. AbbVie North Chicago Illinois USA
  22. Highly qualified expert Philadelphia Pennsylvania USA
Journal: Alzheimer's & dementia : the journal of the Alzheimer's Association, volume 22, issue 8, article e71711
Dates: received 29 January 2026; accepted 9 June 2026; published online 31 July 2026; in print August 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1002/alz.71711 · PMID 42535261 · PMCID PMC13425622 · OpenAlex W7172033668
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: other (modality), PET / SPECT (modality), human (organism), Alzheimer's / dementia (population), clinical / translational (subfield)
Methods: Statistics, Connectivity, fMRI & imaging, Preprocessing
Keywords: Alzheimer's disease, blood biomarkers, data visualization, neuroimaging, plasma biomarkers, R shiny app
MeSH: Alzheimer Disease*, Amyloid beta-Peptides*, Biomarkers*, tau Proteins*, Aged, Brain, Female, Humans, Longitudinal Studies, Male, Peptide Fragments, Positron-Emission Tomography (* major topic)
Topic: Dementia and Cognitive Impairment Research (Psychiatry and Mental health, Medicine), according to OpenAlex
Funding: Foundation for the National Institutes of Health; U.S. Department of Health & Human Services | NIH | National Institute on Aging (U.S. National Institute on Aging) (R01AG070941 (S.E.S.)); AbbVie Inc., Alzheimer's Association, Diagnostics Accelerator at the Alzheimer's Drug Discovery Foundation, Biogen, Janssen Research & Development, LLC, and Takeda Pharmaceutical Company Limited
Citations: not cited yet (Europe PMC); 51 references in the paper

Abstract

INTRODUCTION: While most studies of Alzheimer's disease (AD) examine cross‐sectional relationships among biomarkers, longitudinal relationships are also highly relevant.

METHODS: This study in the Alzheimer's Disease Neuroimaging Initiative cohort (n = 373) used non‐parametric Spearman correlations to explore the relationships of baseline values and rates of change in plasma biomarkers and rates of change in key AD outcomes.

RESULTS: Compared to rates of change of plasma biomarkers, baseline values of plasma biomarkers were more strongly associated with rates of change in key AD outcomes. Change in amyloid positron emission tomography (PET) was most strongly associated with baseline values of amyloid beta (Aβ)42/Aβ40 and phosphorylated tau (p‐tau)217, especially in amyloid PET–‐negative individuals. Changes in cortical thickness and measures of cognition were most strongly associated with baseline p‐tau217, especially in amyloid PET–positive individuals.

DISCUSSION: Baseline p‐tau217 is associated with rates of change of amyloid pathology and cognition. Visualization tools were developed to enable researchers to explore AD biomarker relationships.

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

Repository

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

WashUFluidBiomarkers/Dynamic-Visualization

License: MIT
State: the link answers, verified on 26 September 2026
Evidence: files inventoried
Commit: eea99a6334b8ff76a8dfc5a0670a7c979fece5be, 6 August 2026
Languages: R (7)
Size: 28 files, 7 scripts
Software Heritage: not archived
Found in: the text, “Generation of the R Shiny apps and related datas”
Holds: README, license file
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Tools: data.table (6 files), ggplot2 (6 files), tidyverse (4 files), Plotly (3 files)
Availability: 1 check, the latest on 26 September 2026: the link answers
  • 26 September 2026: the link answers
9 files

Tracing map

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

What the map holds:

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

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

Data

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

Versions

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

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 26 authors, 6 keywords, 12 MeSH terms, 3 funders, 51 references.

Cite

This paper

Saef, B., Petersen, K. K., Volluz, K., Li, Y., Tosun, D., Mila‐Aloma, M., Shaw, L. M., Zetterberg, H., Dage, J. L., Rubel, C. E., Ferber, K., Du‐Cuny, L., Coomaraswamy, J., Baratta, M., Mordashova, Y., Saad, Z. S., Triana‐Baltzer, G., Ashton, N. J., Meyers, E. A., . . . Schindler, S. E. (2026). Exploring longitudinal relationships among Alzheimer's disease biomarkers. Alzheimer's & dementia : the journal of the Alzheimer's Association, 22(8), e71711. https://doi.org/10.1002/alz.71711

BibTeX

@article{saef2026exploring,
author = {Saef, Benjamin and Petersen, Kellen K. and Volluz, Katherine and Li, Yan and Tosun, Duygu and Mila‐Aloma, Marta and Shaw, Leslie M. and Zetterberg, Henrik and Dage, Jeffrey L. and Rubel, Carrie E. and Ferber, Kyle and Du‐Cuny, Lei and Coomaraswamy, Janaky and Baratta, Michael and Mordashova, Yulia and Saad, Ziad S. and Triana‐Baltzer, Gallen and Ashton, Nicholas J. and Meyers, Emily A. and Rosenbaugh, Erin G. and Sabandal, J. Martin and Bannon, Anthony W. and Potter, William Z. and {Alzheimer's Disease Neuroimaging Initiative (ADNI)} and {Foundation for the National Institutes of Health (FNIH) Biomarkers Consortium Plasma Aβ and Phosphorylated Tau as Predictors of Amyloid and Tau Positivity in Alzheimer's Disease Project Team} and Schindler, Suzanne E.},
title = {{Exploring longitudinal relationships among Alzheimer's disease biomarkers}},
journal = {Alzheimer's \& dementia : the journal of the Alzheimer's Association},
year = {2026},
month = aug,
volume = {22},
number = {8},
pages = {e71711},
publisher = {Wiley},
issn = {1552-5260},
doi = {10.1002/alz.71711},
url = {https://doi.org/10.1002/alz.71711},
pmid = {42535261},
pmcid = {PMC13425622}
}

RIS

TY - JOUR
AU - Saef, Benjamin
AU - Petersen, Kellen K.
AU - Volluz, Katherine
AU - Li, Yan
AU - Tosun, Duygu
AU - Mila‐Aloma, Marta
AU - Shaw, Leslie M.
AU - Zetterberg, Henrik
AU - Dage, Jeffrey L.
AU - Rubel, Carrie E.
AU - Ferber, Kyle
AU - Du‐Cuny, Lei
AU - Coomaraswamy, Janaky
AU - Baratta, Michael
AU - Mordashova, Yulia
AU - Saad, Ziad S.
AU - Triana‐Baltzer, Gallen
AU - Ashton, Nicholas J.
AU - Meyers, Emily A.
AU - Rosenbaugh, Erin G.
AU - Sabandal, J. Martin
AU - Bannon, Anthony W.
AU - Potter, William Z.
AU - Alzheimer's Disease Neuroimaging Initiative (ADNI)
AU - Foundation for the National Institutes of Health (FNIH) Biomarkers Consortium Plasma Aβ and Phosphorylated Tau as Predictors of Amyloid and Tau Positivity in Alzheimer's Disease Project Team
AU - Schindler, Suzanne E.
TI - Exploring longitudinal relationships among Alzheimer's disease biomarkers
T2 - Alzheimer's & dementia : the journal of the Alzheimer's Association
J2 - Alzheimers Dement
PY - 2026
DA - 2026/08/01
VL - 22
IS - 8
SP - e71711
SN - 1552-5260
PB - Wiley
DO - 10.1002/alz.71711
UR - https://doi.org/10.1002/alz.71711
LA - en
ER -

CSL-JSON

{
"id": "10.1002/alz.71711",
"type": "article-journal",
"title": "Exploring longitudinal relationships among Alzheimer's disease biomarkers",
"container-title": "Alzheimer's & dementia : the journal of the Alzheimer's Association",
"author": [
{
"family": "Saef",
"given": "Benjamin"
},
{
"family": "Petersen",
"given": "Kellen K."
},
{
"family": "Volluz",
"given": "Katherine"
},
{
"family": "Li",
"given": "Yan"
},
{
"family": "Tosun",
"given": "Duygu"
},
{
"family": "Mila‐Aloma",
"given": "Marta"
},
{
"family": "Shaw",
"given": "Leslie M."
},
{
"family": "Zetterberg",
"given": "Henrik"
},
{
"family": "Dage",
"given": "Jeffrey L."
},
{
"family": "Rubel",
"given": "Carrie E."
},
{
"family": "Ferber",
"given": "Kyle"
},
{
"family": "Du‐Cuny",
"given": "Lei"
},
{
"family": "Coomaraswamy",
"given": "Janaky"
},
{
"family": "Baratta",
"given": "Michael"
},
{
"family": "Mordashova",
"given": "Yulia"
},
{
"family": "Saad",
"given": "Ziad S."
},
{
"family": "Triana‐Baltzer",
"given": "Gallen"
},
{
"family": "Ashton",
"given": "Nicholas J."
},
{
"family": "Meyers",
"given": "Emily A."
},
{
"family": "Rosenbaugh",
"given": "Erin G."
},
{
"family": "Sabandal",
"given": "J. Martin"
},
{
"family": "Bannon",
"given": "Anthony W."
},
{
"family": "Potter",
"given": "William Z."
},
{
"literal": "Alzheimer's Disease Neuroimaging Initiative (ADNI)"
},
{
"literal": "Foundation for the National Institutes of Health (FNIH) Biomarkers Consortium Plasma Aβ and Phosphorylated Tau as Predictors of Amyloid and Tau Positivity in Alzheimer's Disease Project Team"
},
{
"family": "Schindler",
"given": "Suzanne E."
}
],
"container-title-short": "Alzheimers Dement",
"volume": "22",
"issue": "8",
"page": "e71711",
"DOI": "10.1002/alz.71711",
"PMID": "42535261",
"PMCID": "PMC13425622",
"ISSN": "1552-5260",
"publisher": "Wiley",
"URL": "https://doi.org/10.1002/alz.71711",
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
1
]
]
}
}

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

Similar papers

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

[1] doi:10.64898/2026.05.06.26352540 [code]
Generating synthetic tau-PET scans in Alzheimer’s disease from MRI, blood biomarkers and demographics with deep learning
Journal: medRxiv (preprint)
In common: PET / SPECT, other, Alzheimer's / dementia, 1 other category, 7 references
[2] doi:10.1186/s13195-026-02119-z
Age-dependent diagnostic and correlational architecture of multiplex plasma biomarkers in Alzheimer's disease: a cross-ethnic, cross-platform validation study.
Journal: Alzheimer's research & therapy
In common: PET / SPECT, other, Alzheimer's / dementia, 1 other category, 6 references
[3] doi:10.1016/j.tjpad.2026.100622 [code]
The time interval from amyloid to tau PET positivity varies by age, sex and APOE-ε4 status.
Journal: The journal of prevention of Alzheimer's disease
In common: ggplot2, tidyverse, PET / SPECT, Alzheimer's / dementia, clinical / translational, 4 references
[4] doi:10.1002/alz.71773 [code]
Brain-derived plasma p-tau217 shows enhanced dynamic range for Alzheimer's disease neuropathological change.
Journal: Alzheimer's & dementia : the journal of the Alzheimer's Association
In common: PET / SPECT, other, Alzheimer's / dementia, 5 references
[5] doi:10.1093/brain/awaf413 [code]
Estimating the time course of biomarker changes in Alzheimer's disease.
Journal: Brain : a journal of neurology
In common: PET / SPECT, Alzheimer's / dementia, clinical / translational, 5 references
[6] doi:10.1093/brain/awaf375 [code]
Reference proteins to improve Core 1 and Core 2 Alzheimer's disease CSF and plasma biomarkers.
Journal: Brain : a journal of neurology
In common: PET / SPECT, other, Alzheimer's / dementia, 1 other category, 4 references
[7] doi:10.1002/alz.71530 [code]
Differential associations of plasma biomarkers with Alzheimer's disease and small vessel disease: A multimodal imaging study.
Journal: Alzheimer's & dementia : the journal of the Alzheimer's Association
In common: PET / SPECT, other, Alzheimer's / dementia, 1 other category, 4 references
[8] doi:10.34133/research.1392 [code]
Neuroimaging Epicenters as Vulnerable Nodes in Plasma p-tau217/Aβ42-Positive Alzheimer's Disease.
Journal: Research (Washington, D.C.)
In common: other, Alzheimer's / dementia, 5 references
[9] doi:10.1126/sciadv.aee2305 [code]
Prediction of mild cognitive impairment progression using time-sensitive multimodal biomarkers.
Journal: Science advances
In common: ggplot2, tidyverse, PET / SPECT, Alzheimer's / dementia, clinical / translational, 3 references
[10] doi:10.1002/hbm.70508 [code]
Cyclic 2.5D Perceptual Loss for Cross-Modal 3D Medical Image Synthesis: T1w MRI to Tau PET.
Journal: Human brain mapping
In common: PET / SPECT, Alzheimer's / dementia, 5 references

Contribute

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

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

Request its removal

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

Discussion, reproductions, activity

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

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

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