Exploring longitudinal relationships among Alzheimer's disease biomarkers.
The 2 matches
- [1] § METHODS › Plasma biomarker assays ↔ Movie_Data_code/app.r, lines 1–66 · score 0.76 · PrecivityAD2, LucentAD, NeuroToolKit, ALZpath, Plex, kits
- [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
- #raindrops actual
- # tidyverse in particular is incredibly important for graphing and filtering.
- list.of.packages <- c("tidyverse", "data.table","shiny","RColorBrewer","ggforce","ggbreak","av","polished","shinyjs")
- new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
- if(length(new.packages)) install.packages(new.packages)
- library(colourpicker)
- library(shiny)
- library(ggplot2)
- library(data.table)
- library(RColorBrewer)
- library(ggforce)
- library(av)
- library(shinyjs)
- library(polished)
- source("Needed_Functions.R")
- ##Replace APS with Tipping Point Probability ## Not
- ##X default - Centiloid
- ##Y default - % pt217
- ##Color default - CDR_SB
- #(optional legend)
- scramble_key <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,21,16,17,18,19,20)
- step_size_list <- c(0.1, #C2N Plasma Ptau217 ratio
- 0.2, #C2N Plasma Ptau217 conc
- 0.005, #C2N Plasma Ab4240
- 0.001, #Fujirebio Ptau217
- 0.001, #Fujirebio Ab4240
- 0.005, #Alzpath Ptau217
- 0.005, #Janssen Ptau217
- 0.01, #Roche Ptau181
- 0.005, #Roche Ab4240
- 0.001, #Roche GFAP
- 0.05, #Roche NfL
- 0.01, #Quanterix Ptau 181
- 1, #Quanterix GFAP
- 0.005, #Quanterix Ab4240
- 0.01, #Quanterix NfL
- 1,#Centiloid
- 0.01,#Tau PET Early
- 0.01,#Tau PET Late
- 0.001,#Cortical Thickness Meta ROI
- 0.5, #CDR Sum of Boxes
- 1) #CSF ab42/ptau181
- graph_choices_ref <- c(paste0("C2N PrecivityAD2 ","plasma %p-tau217 (%)"),
- paste0("C2N PrecivityAD2 ","plasma p-tau217 (pg/mL)"),
- paste0("C2N PrecivityAD2 ","plasma A","\U03B2","42/A","\U03B2","40"),
- paste0("Fujirebio Lumipulse ","plasma p-tau217 (pg/mL)"),
- paste0("Fujirebio Lumipulse ","plasma A","\U03B2","42/A","\U03B2","40"),
- paste0("ALZpath Quanterix ","plasma p-tau217 (pg/mL)"),
- paste0("Janssen LucentAD Quanterix ","plasma p-tau217 (pg/mL)"),
- paste0("Roche NeuroToolKit ","plasma p-tau181 (pg/mL)"),
- paste0("Roche NeuroToolKit ","plasma A","\U03B2","42/A","\U03B2","40"),
- paste0("Roche NeuroToolKit ","plasma GFAP (ng/mL)"),
- paste0("Roche NeuroToolKit ","plasma NfL (pg/mL)"),
- paste0("Quanterix Neurology 4-Plex ","plasma p-tau181 (pg/ml)"),
- paste0("Quanterix Neurology 4-Plex ","plasma GFAP (pg/mL)"),
- paste0("Quanterix Neurology 4-Plex ","plasma A","\U03B2","42/A","\U03B2","40"),
- paste0("Quanterix Neurology 4-Plex ","plasma NfL (pg/mL)"),
- "Amyloid PET Centiloid",
- "Tau PET Mesial-Temporal (Early)",
- "Tau PET Temporo-Parietal (Late)",
- "Cortical Thickness (Meta ROI)",
- "Clinical Dementia Rating Sum of Boxes",
- paste0("Roche Elecsys ","CSF A","\U03B2","42/p-tau181"))
- graph_limits_list <- list(c(0,25), #C2N Plasma Ptau217 ratio
- c(0,20), #C2N Plasma Ptau217 conc
- c(0,0.15), #C2N Plasma Ab4240
- c(0,1.8), #Fujirebio Ptau217
- c(0,0.3), #Fujirebio Ab4240
- c(0,3), #Alzpath Ptau217
- c(0,0.35), #Janssen Ptau217
- c(0,4.7), #Roche Ptau181
- c(0,0.23), #Roche Ab4240
- c(0,0.46), #Roche GFAP
- c(0,16), #Roche NfL
- c(0,80), #Quanterix Ptau 181
- c(0,565), #Quanterix GFAP
- c(0,0.125), #Quanterix Ab4240
- c(0,80), #Quanterix NfL
- c(-40,190),#Centiloid
- c(0.85,2),#Tau PET Early
- c(0.9,2.5),#Tau PET Late
- c(1.8,3.25),#Cortical Thickness Meta ROI
- c(-0.5,10),#CDR Sum of Boxes
- c(5,185) #CSF ab42/ptau181
- )
- group_threshold_defaults <- c("1.5, 2.5, 4.1, 8",#C2N Plasma Ptau217 ratio
- "3, 7, 13, 16", #C2N Plasma Ptau217 conc
- "0.04, 0.06, 0.0924, 0.1", #C2N Plasma Ab4240
- "0.06, 0.1, 0.158, 0.5", #Fujirebio Ptau217
- "0.04, 0.06, 0.0869, 1.5", #Fujirebio Ab4240
- "0.2,0.3,0.444,0.5", #Alzpath Ptau217
- "0.04,0.05,0.0615,0.085", #Janssen Ptau217
- "0.65,1.0,1.14,1.3", #Roche Ptau181
- "0.11,0.12,0.126,0.14", #Roche Ab4240
- "0.0661, 0.0916, 0.113, 0.1230", #Roche GFAP
- "2.650, 3.270, 4.29, 7", #Roche NfL
- "12.1, 17.8, 20.5, 30", #Quanterix Ptau 181
- "89, 128, 205, 250", #Quanterix GFAP
- "0.045, 0.053, 0.0582, 0.070", #Quanterix Ab4240
- "13.27, 17.57, 21.7, 28", #Quanterix NfL
- "-5.00, 7.00, 20, 39",#Centiloid
- "1.09, 1.15, 1.328, 1.4",#Tau PET Early
- "1.05, 1.12, 1.269, 1.31",#Tau PET Late
- "2.5, 2.572, 2.932, 3",#Cortical Thickness Meta ROI
- "0.5, 1, 2, 4",#CDR Sum of Boxes
- "10,25,60,91") #CSF ab42/ptau181
- rank_thresholds <- c(
- 236, #C2N Plasma Ptau217 ratio
- 254, #C2N Plasma Ptau217 conc
- 186, #C2N Plasma Ab4240
- 241, #Fujirebio Ptau217
- 160, #Fujirebio Ab4240
- 250, #Alzpath Ptau217
- 252, #Janssen Ptau217
- 237, #Roche Ptau181
- 209, #Roche Ab4240
- 250, #Roche GFAP
- 269, #Roche NfL
- 203, #Quanterix Ptau 181
- 260, #Quanterix GFAP
- 130, #Quanterix Ab4240
- 217, #Quanterix NfL
- 233, #Centiloid
- 103, #Tau PET Early
- 114, #Tau PET Late
- 26, #Cortical Thickness Meta ROI
- 266, #CDR Sum of Boxes
- 53 #CSF ab42/ptau181
- )
- # Default threshold lines for each variable
- value_thresholds <- c(
- 4.06, #C2N Plasma Ptau217 ratio
- 2.34, #C2N Plasma Ptau217 conc
- 0.0924, #C2N Plasma Ab4240
- 0.158, #Fujirebio Ptau217
- 0.0869, #Fujirebio Ab4240
- 0.444, #Alzpath Ptau217
- 0.0615, #Janssen Ptau217
- 1.14, #Roche Ptau181
- 0.126, #Roche Ab4240
- 0.113, #Roche GFAP
- 4.29, #Roche NfL
- 20.5, #Quanterix Ptau 181
- 205, #Quanterix GFAP
- 0.0582, #Quanterix Ab4240
- 21.7, #Quanterix NfL
- 20, #Centiloid
- 1.328, #Tau PET Early
- 1.269, #Tau PET Late
- 2.572, #Cortical Thickness Meta ROI
- 1, #CDR Sum of Boxes
- 25 #CSF ab42/ptau181
- )
- graph_choices_suffixes <- c("C2N_plasma_ptau217_ratio","C2N_plasma_ptau217", "C2N_plasma_Abeta42_Abeta40",
- "Fuji_plasma_ptau217","Fuji_plasma_Ab42_Ab40",
- "AlzPath_plasma_ptau217","Janssen_plasma_ptau217","Roche_plasma_ptau181","Roche_plasma_Ab42_Ab40",
- "Roche_plasma_GFAP", "Roche_plasma_NfL",
- "QX_plasma_ptau181","QX_plasma_GFAP","QX_plasma_Ab42_Ab40","QX_plasma_NfL",
- "CENTILOIDS","MesialTemporal","TemporoParietal","metaROI","CDSOB","AB42_PTAU181")
- high_risk_high <- graph_choices_ref[c(1,2,4,6,7,8,10,11,12,13,15,16,17,18,20)]
- high_risk_low <- graph_choices_ref[c(3,5,9,14,19,21)]
- ui <- shinyUI(fluidPage(
- useShinyjs(),
- tags$head(tags$style(".shiny-notification {
- position: fixed;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- width: 600px;
- height: 200px;
- font-size: 24px;
- text-align: center;
- opacity: 0.95;
- z-index: 1000;
- }")),
- # Hidden inputs - these exist for the code but aren't displayed
- shinyjs::hidden(
- selectInput("graphtype_anim", "Type:", choices=c("Raindrop","Timetrails"), selected="Timetrails"),
- selectInput("y_var", "Y:", choices=graph_choices_ref[scramble_key], selected=graph_choices_ref[1]),
- selectInput("x_var", "X:", choices=graph_choices_ref[scramble_key], selected=graph_choices_ref[16]),
- selectInput("group_xy_check", "Group:", choices=c("Longitudinal","Baseline"), selected="Baseline"),
- selectInput("other_type", "Other:", choices=graph_choices_ref[scramble_key], selected=graph_choices_ref[1]),
- selectInput("otherb_type", "OtherB:", choices=graph_choices_ref[scramble_key], selected=graph_choices_ref[1]),
- checkboxInput("origin_plot", "Origin", value=FALSE),
- sliderInput("cutoff1", "C1", min=0, max=20, step=0.2, value=0),
- sliderInput("cutoff2", "C2", min=0, max=20, step=0.2, value=0),
- sliderInput("cutoff3", "C3", min=0, max=20, step=0.2, value=0),
- sliderInput("cutoff4", "C4", min=0, max=20, step=0.2, value=0),
- numericInput("th1", "Th1", value=0.0673, step=0.0005),
- numericInput("th2_rank", "Th2 Rank", value=90),
- numericInput("th2_trail", "Th2 Trail", value=0.158, step=0.0005),
- actionButton("reset_thresholds", "Reset"),
- downloadButton("downloadData", "Download")
- ),
- # Empty white screen
- tags$div(style = "background-color: white; width: 100%; height: 100vh;")
- ))
- server <- function(input, output, session) {
- load("ADNI_Raindrop_Data_Test_v3.rdata")
- # Auto-trigger download when app loads with URL parameters
- observe({
- query <- parseQueryString(session$clientData$url_search)
- # Only auto-trigger if coming from another app with URL parameters
- if(length(query) > 0){
- delay(1000, click("downloadData")) # Wait 1 second then trigger download
- }
- })
- # Parse URL parameters and update hidden inputs
- observe({
- query <- parseQueryString(session$clientData$url_search)
- if(!is.null(query[['graphtype']])){
- graph_variable_id <- query[['graphtype']]
- updateSelectInput(session, "graphtype_anim", selected = graph_variable_id)
- }
- if(!is.null(query[['xvar']])){
- x_variable_id <- graph_choices_ref[which(graph_choices_suffixes==query[['xvar']])]
- updateSelectInput(session, "x_var", selected = x_variable_id)
- }
- if(!is.null(query[['yvar']])){
- y_variable_id <- graph_choices_ref[which(graph_choices_suffixes==query[['yvar']])]
- updateSelectInput(session, "y_var", selected = y_variable_id)
- }
- if(!is.null(query[['gxyc']])){
- gxyc <- query[['gxyc']]
- updateSelectInput(session, "group_xy_check", selected = gxyc)
- }
- if(!is.null(query[['oty']])){
- oty_variable_id <- graph_choices_ref[which(graph_choices_suffixes==query[['oty']])]
- updateSelectInput(session, "other_type", selected = oty_variable_id)
- }
- if(!is.null(query[['otyb']])){
- otyb_variable_id <- graph_choices_ref[which(graph_choices_suffixes==query[['otyb']])]
- updateSelectInput(session, "otherb_type", selected = otyb_variable_id)
- }
- if(!is.null(query[['co1']])){
- co1 <- as.numeric(query[['co1']])
- updateSliderInput(session, "cutoff1", value = co1)
- }
- if(!is.null(query[['co2']])){
- co2 <- as.numeric(query[['co2']])
- updateSliderInput(session, "cutoff2", value = co2)
- }
- if(!is.null(query[['co3']])){
- co3 <- as.numeric(query[['co3']])
- updateSliderInput(session, "cutoff3", value = co3)
- }
- if(!is.null(query[['co4']])){
- co4 <- as.numeric(query[['co4']])
- updateSliderInput(session, "cutoff4", value = co4)
- }
- if(!is.null(query[['th1']])){
- th1 <- as.numeric(query[['th1']])
- updateNumericInput(session,'th1', value=th1)
- }
- if(!is.null(query[['th2']])){
- th2 <- as.numeric(query[['th2']])
- updateNumericInput(session,'th2_rank', value=th2)
- updateNumericInput(session,'th2_trail', value=th2)
- }
- if(!is.null(query[['ogn']])){
- ogn <- query[['ogn']]
- ogn <- ogn =="TRUE"
- updateCheckboxInput(session,'origin_plot',value = ogn)
- }
- })
- output$secondSelection <- renderUI({
- selectInput("other", "Grouping Variable:", choices = graph_choices_ref[scramble_key])
- })
- # Reactive expressions
- variableids_for_plot <- reactive({
- if(input$graphtype_anim=="Raindrop"){
- graph_choice_y <- graph_choices_suffixes[which(graph_choices_ref==input$y_var)]
- graph_choice_BL <- graph_choices_suffixes[which(graph_choices_ref==input$x_var)]
- graph_vars_list <- c(paste0("N_",graph_choice_BL),
- paste0("BL_EST_",graph_choice_BL),
- paste0("EST_",graph_choice_y))
- }else{
- graph_choice_y <- graph_choices_suffixes[which(graph_choices_ref==input$y_var)]
- graph_choice_x <- graph_choices_suffixes[which(graph_choices_ref==input$x_var)]
- graph_vars_list <- c(paste0("EST_",graph_choice_x),
- paste0("EST_",graph_choice_y))
- }
- graph_vars_list
- })
- param_change <- reactive({
- list(input$graphtype_anim,input$cutoff1,input$cutoff2,input$cutoff3,input$cutoff4,
- input$y_var, input$x_var, input$group_xy_check,
- input$other_type, input$otherb_type)
- })
- update_origin_point <- reactive({input$origin_plot})
- cutoff_change <- reactive({
- list(input$group_xy_check, input$other_type, input$otherb_type, input$reset_thresholds)
- })
- c1_change <- reactive({list(input$cutoff1)})
- c2_change <- reactive({list(input$cutoff2)})
- c3_change <- reactive({list(input$cutoff3)})
- observeEvent(c1_change(),{
- min2 <- input$cutoff1
- updateSliderInput(session, "cutoff2", min = min2)
- })
- observeEvent(c2_change(),{
- min3 <- input$cutoff2
- updateSliderInput(session, "cutoff3", min = min3)
- })
- observeEvent(c3_change(),{
- min4 <- input$cutoff3
- updateSliderInput(session, "cutoff4", min = min4)
- })
- observeEvent(cutoff_change(),{
- req(input$group_xy_check)
- if(input$group_xy_check=="Longitudinal"){
- req(input$other_type)
- var <- input$other_type
- } else {
- req(input$otherb_type)
- var <- input$otherb_type
- }
- group_thresholds <- extract_comma_sep(group_threshold_defaults[which(graph_choices_ref==var)])
- group_choice <- graph_choices_suffixes[which(graph_choices_ref==var)]
- group_var <- paste0("EST_",group_choice)
- var_step <- step_size_list[which(graph_choices_ref==var)]
- dec_count <- decimalplaces(var_step)
- max_value_slider <- paste(signif(max(data_10th_demo[,group_var],na.rm = T),dec_count))
- updateSliderInput(session, "cutoff1",value=group_thresholds[1],
- min = floor(min(data_10th_demo[,group_var],na.rm = T)),
- max = max_value_slider,
- step = var_step)
- updateSliderInput(session, "cutoff2",value=group_thresholds[2],
- min = floor(min(data_10th_demo[,group_var],na.rm = T)),
- max = max_value_slider,
- step = var_step)
- updateSliderInput(session, "cutoff3",value=group_thresholds[3],
- min = floor(min(data_10th_demo[,group_var],na.rm = T)),
- max = max_value_slider,
- step = var_step)
- updateSliderInput(session, "cutoff4",value=group_thresholds[4],
- min = floor(min(data_10th_demo[,group_var],na.rm = T)),
- max = max_value_slider,
- step = var_step)
- query <- parseQueryString(session$clientData$url_search)
- if(!is.null(query[['co1']])){
- co1 <- as.numeric(query[['co1']])
- updateSliderInput(session, "cutoff1", value = co1)
- }
- if(!is.null(query[['co2']])){
- co2 <- as.numeric(query[['co2']])
- updateSliderInput(session, "cutoff2", value = co2)
- }
- if(!is.null(query[['co3']])){
- co3 <- as.numeric(query[['co3']])
- updateSliderInput(session, "cutoff3", value = co3)
- }
- if(!is.null(query[['co4']])){
- co4 <- as.numeric(query[['co4']])
- updateSliderInput(session, "cutoff4", value = co4)
- }
- })
- group_cutoffs <- reactive({
- paste(input$cutoff1,input$cutoff2,input$cutoff3,input$cutoff4,sep=",")
- })
- data_cat <- eventReactive(param_change(),{
- variables_for_plot <- variableids_for_plot()
- group_breaks <- group_cutoffs()
- group_thresholds <- extract_comma_sep(group_breaks)
- if(input$group_xy_check=="Longitudinal"){
- graph_choice <- graph_choices_suffixes[which(graph_choices_ref==input$other_type)]
- splitting_variable <- paste0("EST_",graph_choice)
- if(input$other_type %in% high_risk_high){
- create_groups_EST(data_10th_demo,splitting_variable,group_thresholds)
- } else if (input$other_type %in% high_risk_low) {
- create_groups_ratio_EST(data_10th_demo,splitting_variable,group_thresholds)
- }
- } else if(input$group_xy_check=="Baseline"){
- graph_choice <- graph_choices_suffixes[which(graph_choices_ref==input$otherb_type)]
- splitting_variable <- paste0("BL_EST_",graph_choice)
- if(input$otherb_type %in% high_risk_high){
- create_groups_EST(data_10th_demo,splitting_variable,group_thresholds)
- } else {
- create_groups_ratio_EST(data_10th_demo,splitting_variable,group_thresholds)
- }
- }
- })
- # Download Handler - at top level, not inside observe()
- output$downloadData <- downloadHandler(
- filename = function() {
- xvar_filename <- graph_choices_suffixes[which(graph_choices_ref==input$x_var)]
- yvar_filename <- graph_choices_suffixes[which(graph_choices_ref==input$y_var)]
- if(input$graphtype_anim=="Raindrop"){
- paste0("out_raindrop_",yvar_filename,"_vs_",xvar_filename,".mp4")
- } else {
- paste0("out_timetrails_",yvar_filename,"_vs_",xvar_filename,".mp4")
- }
- },
- content = function(file) {
- source("Needed_Functions.R")
- in.csv.graphdata <- data_cat()
- variables_for_plot <- variableids_for_plot()
- in.csv.graphdata <- in.csv.graphdata[which(complete.cases(in.csv.graphdata[,variables_for_plot])),]
- if(input$graphtype_anim=="Raindrop"){
- in.csv.graphdata[,variables_for_plot[1]] <- as.numeric(factor(in.csv.graphdata[,variables_for_plot[1]]))
- limits_for_plot <- graph_limits_list[[which(graph_choices_ref==input$y_var)]]
- withProgress(message = 'Video being created',
- detail = 'Please wait approximately 1 minute. Video will download automatically when complete.',
- value = 0, {
- av_capture_graphics(create_raindrop_plot_movie(data = in.csv.graphdata,
- variablelist = variables_for_plot,
- ylimits=limits_for_plot,
- graph.xlab = input$x_var,
- graph.ylab = input$y_var,
- th1=input$th1,
- th2=input$th2_rank,
- originpoints=FALSE),
- output = file,
- res=100,
- width=1250,
- height=750,
- framerate = 5)
- }
- )
- showNotification(
- "Video completed and downloading!",
- duration = 3,
- type = "message"
- )
- } else if(input$graphtype_anim=="Timetrails"){
- xlimits_for_plot <- graph_limits_list[[which(graph_choices_ref==input$x_var)]]
- limits_for_plot <- graph_limits_list[[which(graph_choices_ref==input$y_var)]]
- withProgress(message = 'Video being created',
- detail = 'Please wait approximately 1 minute. Video will download automatically when complete.',
- value = 0, {
- av_capture_graphics(create_timepath_plot_video(data = in.csv.graphdata,
- variablelist = variables_for_plot,
- xlimits=xlimits_for_plot,
- ylimits=limits_for_plot,
- graph.xlab = input$x_var,
- graph.ylab = input$y_var,
- th1=input$th1,
- th2=input$th2_trail),
- output = file,
- res=100,
- width=1250,
- height=750,
- framerate = 5)
- }
- )
- showNotification(
- "Video completed and downloading!",
- duration = 3,
- type = "message"
- )
- }
- },
- contentType = "video/mp4"
- )
- outputOptions(output, "downloadData", suspendWhenHidden = FALSE)
- update_group_long <- reactive({
- list(input$group_xy_check, input$other_type, input$otherb_type)
- })
- # Update threshold values when x_var changes
- observeEvent(input$x_var,{
- x = input$x_var
- query <- parseQueryString(session$clientData$url_search)
- updated_threshold_th2 <- rank_thresholds[which(graph_choices_ref==x)]
- updateNumericInput(session,'th2_rank', value=updated_threshold_th2)
- if(!is.null(query[['th2']])){
- th2 <- as.numeric(query[['th2']])
- updateNumericInput(session,'th2_rank', value=th2)
- }
- updated_threshold_th2 <- value_thresholds[which(graph_choices_ref==x)]
- updateNumericInput(session,'th2_trail', value=updated_threshold_th2)
- if(!is.null(query[['th2']])){
- th2 <- as.numeric(query[['th2']])
- updateNumericInput(session,'th2_trail', value=th2)
- }
- })
- # Update threshold values when y_var changes
- observeEvent(input$y_var,{
- y = input$y_var
- query <- parseQueryString(session$clientData$url_search)
- updated_threshold_th1 <- value_thresholds[which(graph_choices_ref==y)]
- updateNumericInput(session,'th1', value=updated_threshold_th1)
- if(!is.null(query[['th1']])){
- th1 <- as.numeric(query[['th1']])
- updateNumericInput(session,'th1', value=th1)
- }
- })
- }
- shinyApp(ui, server)
app.r at commit eea99a6, under MIT · at the source
Overview
and 6 other authors
J. 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. Schindler122 affiliations
- Department of Neurology Washington University in St. Louis St. Louis Missouri USA
- Northern California Institute for Research and Education San Francisco California USA
- Department of Radiology and Biomedical Imaging University of California San Francisco San Francisco California USA
- Department of Pathology and Laboratory Medicine University of Pennsylvania Philadelphia Pennsylvania USA
- Institute of Neuroscience and Physiology Department of Psychiatry and Neurochemistry The Sahlgrenska Academy at University of Gothenburg Mölndal Sweden
- Clinical Neurochemistry Laboratory Sahlgrenska University Hospital Mölndal Sweden
- UK Dementia Research Institute Fluid Biomarkers Laboratory UK DRI at UCL London UK
- Department of Neurodegenerative Disease UCL Queen Square Institute of Neurology London UK
- Hong Kong Center for Neurodegenerative Diseases Clear Water Bay Hong Kong China
- Wisconsin Alzheimer's Disease Research Center University of Wisconsin School of Medicine and Public Health University of Wisconsin–Madison Madison Wisconsin USA
- Department of Neurology Indiana University School of Medicine Indianapolis Indiana USA
- Stark Neurosciences Research Institute Indiana University School of Medicine Indianapolis Indiana USA
- Biogen Cambridge Massachusetts USA
- AbbVie Deutschland GmbH & Co. KG Ludwigshafen am Rhein Rheinland‐Pfalz Germany
- Takeda Pharmaceutical Company Ltd. Cambridge Massachusetts USA
- Precision Measures Johnson & Johnson San Diego California USA
- Banner Alzheimer's Institute Phoenix Arizona USA
- Banner Sun Health Research Institute Sun City Arizona USA
- Alzheimer's Association Chicago Illinois USA
- The Foundation for the National Institutes of Health North Bethesda Maryland USA
- AbbVie North Chicago Illinois USA
- Highly qualified expert Philadelphia Pennsylvania USA
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/
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
eea99a6334b8ff76a8dfc5a0670a7c979fece5be, 6 August 2026Availability: 1 check, the latest on 26 September 2026: the link answers
- 26 September 2026: the link answers
9 files
- Movie_Data_code/
Needed_Functions.R , R, 591 lines - Movie_Data_code/
app.r , R, 568 lines, 1 match - Preprocessing_Code/
prep_code.R , R, 430 lines - Raindrop_Plots_Code/
Needed_Functions.R , R, 600 lines, 1 match - Raindrop_Plots_Code/
app.r , R, 736 lines - Time_Trails_Code/
Needed_Functions.R , R, 575 lines - Time_Trails_Code/
app.r , R, 745 lines - LICENSE, License, 21 lines
- README.md, Text, 193 lines
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://
BibTeX
@article{saef2026explori
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/
url = {https://
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/
VL - 22
IS - 8
SP - e71711
SN - 1552-5260
PB - Wiley
DO - 10.1002/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1002/
"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":
"volume": "22",
"issue": "8",
"page": "e71711",
"DOI": "10.1002/
"PMID": "42535261",
"PMCID": "PMC13425622",
"ISSN": "1552-5260",
"publisher": "Wiley",
"URL": "https://
"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.1073/pnas.2536792123 [code]
- Head-to-head comparison of brain-derived pTau217 and total pTau217 for brain amyloid and tau pathology classification.Journal: Proceedings of the National Academy of Sciences of the United States of AmericaIn common: PET / SPECT, other, Alzheimer's / dementia, 1 other category, 10 references
- [2] 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 learningJournal: medRxiv (preprint)In common: PET / SPECT, other, Alzheimer's / dementia, 1 other category, 7 references
- [3] doi:10.1093/braincomms/fcag074 [code]
- Plasma p-tau217 and glucose metabolism correlate in neocortical association areas in Alzheimer's disease.Journal: Brain communicationsIn common: PET / SPECT, other, Alzheimer's / dementia, 6 references
- [4] 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 & therapyIn common: PET / SPECT, other, Alzheimer's / dementia, 1 other category, 6 references
- [5] 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 diseaseIn common: ggplot2, tidyverse, PET / SPECT, Alzheimer's / dementia, clinical / translational, 4 references
- [6] 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 AssociationIn common: PET / SPECT, other, Alzheimer's / dementia, 5 references
- [7] doi:10.1093/brain/awaf413 [code]
- Estimating the time course of biomarker changes in Alzheimer's disease.Journal: Brain : a journal of neurologyIn common: PET / SPECT, Alzheimer's / dementia, clinical / translational, 5 references
- [8] 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 neurologyIn common: PET / SPECT, other, Alzheimer's / dementia, 1 other category, 4 references
- [9] 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 AssociationIn common: PET / SPECT, other, Alzheimer's / dementia, 1 other category, 4 references
- [10] 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
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.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 7 scripts, and 2 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:67a69050c19cdd9d…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
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.
