Adaptive deep brain stimulation for dynamic gait control in Parkinson's disease: a randomized feasibility trial.
The 18 matches · 2 of them tie a paragraph to a whole file, not to given lines: weak matches, whose lines are not tinted
- [1] § Methods › Data analysis ↔ Data Processing/calcGaitMetrics.m, lines 191–261 · score 0.83 · heel strike, foot position, Temporal metrics, gait events, gait metrics, swing
- [2] § Methods › Statistical analysis ↔ Figure Generation/double_blind_aDBS_in-clinic_gait_metrics_rover_summary_motor_diary_plots.R, lines 644–710 · score 0.77 · cardinal symptoms, motor diaries, patient reported, stiffness, worse, rigidity
- [3] § Methods › Adaptive DBS › Double-blind testing ↔ Analysis/double_blind_aDBS_in-clinic_gait_metrics_rover_summary_motor_diary_analysis.R, lines 73–143 · score 0.70 · motor diary, double blind, cDBS, rigidity, day, tremor
- [4] § Methods › Adaptive DBS › Double-blind testing ↔ Figure Generation/double_blind_aDBS_in-clinic_gait_metrics_rover_summary_motor_diary_plots.R, lines 601–642 · score 0.69 · motor diary, double blind, cDBS, rigidity, tremor, freezing
- [5] § Methods › Experimental paradigm ↔ Figure Generation/double_blind_aDBS_in-clinic_gait_metrics_rover_summary_motor_diary_plots.R, lines 601–642 · score 0.66 · motor diaries, gait metrics, double blind, Rover, cDBS, post
- [6] § Methods › Experimental paradigm ↔ Analysis/double_blind_aDBS_in-clinic_gait_metrics_rover_summary_motor_diary_analysis.R, lines 73–143 · score 0.66 · motor diaries, gait metrics, double blind, Rover, cDBS, post
- [7] § Results › Secondary clinical outcome: double-blinded crossover trial shows aDBS decreased falls compared to cDBS ↔ Figure Generation/double_blind_aDBS_in-clinic_gait_metrics_rover_summary_motor_diary_plots.R, lines 644–710 · score 0.63 · patient reported, gait metrics, bar, Rover, stiffness, worse
- [8] § Results › Primary feasibility outcome: neural biomarkers of leg swing during overground walking ↔ Figure Generation/gait_biomarker_canonical_band_heatmap_plot.R, lines 161–235 · score 0.62 · canonical band, contralateral leg swing, Heatmap, Frequency bands, ipsilateral, M1
- [9] § Results › Secondary clinical outcome: double-blinded crossover trial shows aDBS decreased falls compared to cDBS ↔ Data Processing/calcGaitMetrics.m, lines 191–261 · score 0.61 · heel strike, stride length, gait metrics
- [10] § Results › Secondary clinical outcome: double-blinded crossover trial shows aDBS decreased falls compared to cDBS ↔ Figure Generation/double_blind_aDBS_in-clinic_gait_metrics_rover_summary_motor_diary_plots.R, lines 470–531 · score 0.60 · walking speed, stride length, gait metrics, Rover, cDBS, aDBS
- [11] § Methods › Data analysis ↔ Data Processing/aggregateRCSSimSpecData.m, lines 106–170 · score 0.60 · gait events, gait cycle, swing phase, Xsens, Filtered, FFT
- [12] § Results › Primary feasibility outcome: accuracy and stability of contralateral leg swing biomarkers in real-time aDBS control ↔ Analysis/biomarker_pre_post_aDBS_programming_stability_analysis.R, lines 14–60 · score 0.58 · patient biomarker, biomarker power, Cohen, overlap, interval, aDBS
- [13] § Results › Primary feasibility outcome: accuracy and stability of contralateral leg swing biomarkers in real-time aDBS control ↔ Analysis/biomarker_pre_post_aDBS_programming_stability_analysis.R, lines 14–60 · score 0.57 · pre optimized DBS, post optimized DBS, Cohen, biomarker, outliers, aDBS
- [14] § Results › Primary feasibility outcome: neural biomarkers of leg swing during overground walking ↔ Figure Generation/PSD_and_Insert_Plots.m, the whole file · a weak match · score 0.56 · power spectral density, right swing phase, GPi, M1, Min, PM
- [15] § Results › Primary feasibility outcome: accuracy and stability of contralateral leg swing biomarkers in real-time aDBS control ↔ Figure Generation/biomarker_pre_post_aDBS_programming_plots.R, lines 14–42 · score 0.54 · pre optimized DBS, post optimized DBS, density, biomarker, outliers, aDBS
- [16] § Results › Primary feasibility outcome: neural biomarkers of leg swing during overground walking ↔ Figure Generation/gait_biomarker_canonical_band_heatmap_plot.R, lines 1–30 · score 0.53 · canonical bands, frequency band, gait phase, pallidum, M1, PM
- [17] § Methods › Adaptive DBS › Gait phase biomarker search ↔ Figure Generation/gait_biomarker_heatmap_plot.R, the whole file · a weak match · score 0.52 · gait phase, frequency band, 15 %, biomarker, accuracy
- [18] § Methods › Data analysis ↔ rcssim/rcs_sim.py, lines 261–328 · score 0.50 · power spectra, rcssim, signals, raw, FFT, device
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 · 710 lines · 41 KB · no license · 5 matches
- library(tidyverse)
- library(cowplot)
- library(export)
- library(gghalves)
- library(ggsignif)
- ##### Helper functions #####
- outlier_threshold <- function(df,variableName,quantileVal)
- {
- iqr_val <- IQR(df[[variableName]], na.rm = TRUE)
- quantile_val <- quantile(df[[variableName]], probs = quantileVal, na.rm = TRUE)
- if (quantileVal > 0.5) {
- return(quantile_val + 1.5 * iqr_val)
- } else {
- return(quantile_val - 1.5 * iqr_val)
- }
- }
- ##### In-clinic gait metrics #####
- # Load data
- clinic_data <-read.csv('Figure5D_ED2.csv')
- clinic_data <- clinic_data %>%
- mutate(SubjectID = as.factor(SubjectID),
- SubjectID = fct_relevel(SubjectID,c("P2","P3","P4")),
- DBSCondition = factor(case_when(str_detect(DBSCondition,"Clinical") ~ "cDBS",str_detect(DBSCondition,"Ramp-Up") ~ "RU-aDBS",str_detect(DBSCondition,"Ramp-Down") ~ "RD-aDBS"),levels = c("cDBS","RU-aDBS","RD-aDBS")),
- GaitCycle = as.factor(GaitCycle),
- WalkType = as.factor(WalkType))
- clinic_data_filt <- clinic_data %>%
- group_by(SubjectID,DBSCondition) %>%
- filter({
- lower <- outlier_threshold(cur_data(), "StepLength_L", 0.25)
- upper <- outlier_threshold(cur_data(), "StepLength_L", 0.75)
- StepLength_L >= lower & StepLength_L <= upper
- },
- {
- lower <- outlier_threshold(cur_data(), "StepLength_R", 0.25)
- upper <- outlier_threshold(cur_data(), "StepLength_R", 0.75)
- StepLength_R >= lower & StepLength_R <= upper
- },
- {
- lower <- outlier_threshold(cur_data(), "StepTime_L", 0.25)
- upper <- outlier_threshold(cur_data(), "StepTime_L", 0.75)
- StepTime_L >= lower & StepTime_L <= upper
- },
- {
- lower <- outlier_threshold(cur_data(), "StepTime_R", 0.25)
- upper <- outlier_threshold(cur_data(), "StepTime_R", 0.75)
- StepTime_R >= lower & StepTime_R <= upper
- })
- gait_metrics <- clinic_data_filt %>%
- mutate(StepLengthSymm_L = StepLengthSymm, StepTimeSymm_L = StepTimeSymm) %>%
- select(-StepLengthSymm,-StepTimeSymm) %>%
- pivot_longer(cols = ends_with("_L") | ends_with("_R"),names_to = "Metric",values_to = "Value") %>%
- mutate(Side = case_when(grepl("_L$", Metric) ~ "Left",grepl("_R$", Metric) ~ "Right")) %>%
- mutate(Metric = sub("_[LR]$","",Metric)) %>%
- select(-WalkType)
- summary_clinic_data <- gait_metrics %>% group_by(SubjectID,DBSCondition,Metric,Side) %>%
- summarise(mean = mean(abs(Value/100),na.rm = TRUE),
- lower = mean(abs(Value/100),na.rm = TRUE)-(sd(abs(Value/100),na.rm = TRUE)/sqrt(n())),
- upper = mean(abs(Value/100),na.rm = TRUE)+(sd(abs(Value/100),na.rm = TRUE)/sqrt(n())),
- var = var(abs(Value/100),na.rm = TRUE),sd = sd(abs(Value/100),na.rm = TRUE),
- cv = sd(Value,na.rm = TRUE)/mean(Value,na.rm = TRUE)) %>%
- ungroup() %>%
- group_by(SubjectID,Metric,Side) %>%
- mutate(percentChange_C_to_RU = ((mean[2]-mean[1])/mean[1])*100,
- percentChange_C_to_RD = ((mean[3]-mean[1])/mean[1])*100,
- percentChange_RU_to_RD = ((mean[3]-mean[2])/mean[2])*100)
- # Plots
- clinic_sl_plot <- ggplot()+
- geom_half_violin(data = gait_metrics %>% filter(Metric == "StepLength"),
- aes(x = DBSCondition,y = Value, fill = Side, split = Side),
- linewidth = 0.1,position = "identity")+
- geom_signif(data = data.frame(SubjectID = c("P2","P2","P3","P4"),
- start = c("cDBS","RU-aDBS","RU-aDBS","cDBS"),
- end = c("RU-aDBS","RD-aDBS","RD-aDBS","RD-aDBS"),
- y = c(1.02,0.92,0.92,0.97),
- label = c("***","*","***","***")),
- aes(y_position = y,xmin = start,xmax = end,annotations = label), color = "#fb8072", size = 0.25, textsize = 1.5, vjust = 0.5,tip_length = 0, manual = TRUE)+
- geom_signif(data = data.frame(SubjectID = c("P3"),
- start = c("cDBS"),
- end = c("RU-aDBS"),
- y = c(1.02),
- label = c("***")),
- aes(y_position = y,xmin = start,xmax = end,annotations = label), color = "#80b1d3", size = 0.25, textsize = 1.5, vjust = 0.5,tip_length = 0, manual = TRUE)+
- geom_signif(data = data.frame(SubjectID = c("P3","P4","P4"),
- start = c("cDBS","cDBS","RU-aDBS"),
- end = c("RD-aDBS","RU-aDBS","RD-aDBS"),
- y = c(0.97,1.02,0.92),
- label = c("* / ***","*** / ***","*** / ***")),
- aes(y_position = y,xmin = start,xmax = end,annotations = label), color = "#8dd3c7", size = 0.25, textsize = 1.5, vjust = 0.5,tip_length = 0, manual = TRUE)+
- scale_x_discrete()+
- scale_fill_manual(name = "Leg:",
- labels = c("Left","Right"),
- values = c("#fb8072","#80b1d3"))+
- facet_grid(~SubjectID,labeller = labeller(SubjectID = c("P2" = "Patient 2","P3" = "Patient 3","P4" = "Patient 4"))) +
- ylab("meters") +
- ggtitle("Step Length") +
- theme_bw(base_size = 5)+
- theme(plot.title = element_text(hjust = 0.5,size = 8),
- axis.title.x = element_blank(),
- axis.text.x = element_text(size = 5),
- legend.key.size = unit(0.5,"line"),
- legend.text = element_text(size = 5,margin = margin(0,0,0,2)),
- strip.background = element_blank(),
- strip.text = element_text(size = 5),
- panel.grid = element_blank(),
- panel.border = element_blank(),
- panel.spacing = unit(0.25, "lines"),
- axis.line.x = element_line(linetype = "solid", colour = "black"),
- axis.line.y = element_line(linetype = "solid", colour = "black"))
- clinic_st_plot <- ggplot()+
- geom_half_violin(data = gait_metrics %>% filter(Metric == "StepTime"),
- aes(x = DBSCondition,y = Value, fill = Side, split = Side),
- linewidth = 0.1, position = "identity")+
- geom_signif(data = data.frame(SubjectID = c("P4"),
- start = c("RU-aDBS"),
- end = c("RD-aDBS"),
- y = c(0.75),
- label = c("***")),
- aes(y_position = y,xmin = start,xmax = end,annotations = label), color = "#fb8072", size = 0.25, textsize = 1.5, vjust = 0.5,tip_length = 0, manual = TRUE)+
- geom_signif(data = data.frame(SubjectID = c("P4"),
- start = c("cDBS"),
- end = c("RU-aDBS"),
- y = c(0.81),
- label = c("***")),
- aes(y_position = y,xmin = start,xmax = end,annotations = label), color = "#80b1d3", size = 0.25, textsize = 1.5, vjust = 0.5,tip_length = 0, manual = TRUE)+
- geom_signif(data = data.frame(SubjectID = c("P2","P2","P2","P3","P3","P3","P4"),
- start = c("cDBS","cDBS","RU-aDBS","cDBS","cDBS","RU-aDBS","cDBS"),
- end = c("RU-aDBS","RD-aDBS","RD-aDBS","RU-aDBS","RD-aDBS","RD-aDBS","RD-aDBS"),
- y = c(0.81,0.78,0.75,0.81,0.78,0.75,0.78),
- label = c("** / *","* / *","*** / ***","* / ***","*** / ***","*** / ***","** / ***")),
- aes(y_position = y,xmin = start,xmax = end,annotations = label), color = "#8dd3c7", size = 0.25, textsize = 1.5, vjust = 0.5,tip_length = 0, manual = TRUE)+
- scale_x_discrete()+
- scale_fill_manual(name = "Leg:",
- labels = c("Left","Right"),
- values = c("#fb8072","#80b1d3"))+
- facet_grid(~SubjectID,labeller = labeller(SubjectID = c("P2" = "Patient 2","P3" = "Patient 3","P4" = "Patient 4"))) +
- ylab("seconds") +
- ggtitle("Step Time") +
- theme_bw(base_size = 5)+
- theme(plot.title = element_text(hjust = 0.5,size = 8),
- axis.title.x = element_blank(),
- axis.text.x = element_text(size = 5),
- legend.key.size = unit(0.5,"line"),
- legend.text = element_text(size = 5,margin = margin(0,0,0,2)),
- strip.background = element_blank(),
- strip.text = element_text(size = 5),
- panel.grid = element_blank(),
- panel.border = element_blank(),
- panel.spacing = unit(0.25, "lines"),
- axis.line.x = element_line(linetype = "solid", colour = "black"),
- axis.line.y = element_line(linetype = "solid", colour = "black"))
- group_sl_CV_L_plot = ggplot(data = summary_clinic_data %>% filter(Metric == "StepLength", Side == "Left"), aes(x = DBSCondition, y = cv, group = SubjectID))+
- geom_point(data = summary_clinic_data %>% filter(Metric == "StepLength", Side == "Left"),aes(color = SubjectID, shape = SubjectID, fill = SubjectID), position = position_dodge2(width = 0.25), size = 1) +
- geom_line(aes(color = SubjectID),position = position_dodge2(width = 0.25), linewidth = 0.25, show.legend = FALSE)+
- scale_color_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_fill_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_shape_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c(22,23,24))+
- scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
- ylab("Coefficient of Variation")+
- ggtitle("Left") +
- theme_bw(base_size = 5)+
- theme(plot.title = element_text(hjust = 0.5,size = 6),
- axis.title.x = element_blank(),
- axis.title.y = element_text(size = 6),
- axis.text.x = element_text(size = 6),
- legend.key.size = unit(0.5,"line"),
- legend.text = element_text(size = 5,margin = margin(0,0,0,0)),
- panel.grid = element_blank(),
- panel.border = element_blank(),
- panel.spacing = unit(0.25, "lines"),
- axis.line.x = element_line(linetype = "solid", colour = "black"),
- axis.line.y = element_line(linetype = "solid", colour = "black"))
- group_sl_CV_R_plot = ggplot(data = summary_clinic_data %>% filter(Metric == "StepLength", Side == "Right"), aes(x = DBSCondition, y = cv, group = SubjectID))+
- geom_point(data = summary_clinic_data %>% filter(Metric == "StepLength", Side == "Right"),aes(color = SubjectID, shape = SubjectID, fill = SubjectID), position = position_dodge2(width = 0.25), size = 1) +
- geom_line(aes(color = SubjectID),position = position_dodge2(width = 0.25), linewidth = 0.25)+
- scale_color_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_fill_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_shape_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c(22,23,24))+
- scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
- ylab("Coefficient of Variation")+
- ggtitle("Right") +
- theme_bw(base_size = 5)+
- theme(plot.title = element_text(hjust = 0.5,size = 6),
- axis.title.x = element_blank(),
- axis.title.y = element_text(size = 6),
- axis.text.x = element_text(size = 6),
- legend.key.size = unit(0.5,"line"),
- legend.text = element_text(size = 5,margin = margin(0,0,0,0)),
- panel.grid = element_blank(),
- panel.border = element_blank(),
- panel.spacing = unit(0.25, "lines"),
- axis.line.x = element_line(linetype = "solid", colour = "black"),
- axis.line.y = element_line(linetype = "solid", colour = "black"))
- group_st_CV_L_plot = ggplot(data = summary_clinic_data %>% filter(Metric == "StepTime", Side == "Left"), aes(x = DBSCondition, y = cv, group = SubjectID))+
- geom_point(data = summary_clinic_data %>% filter(Metric == "StepTime", Side == "Left"),aes(color = SubjectID, shape = SubjectID, fill = SubjectID), position = position_dodge2(width = 0.25), size = 1) +
- geom_line(aes(color = SubjectID),position = position_dodge2(width = 0.25), linewidth = 0.25)+
- scale_color_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_fill_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_shape_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c(22,23,24))+
- scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
- ylab("Coefficient of Variation")+
- ggtitle("Left") +
- theme_bw(base_size = 5)+
- theme(plot.title = element_text(hjust = 0.5,size = 6),
- axis.title.x = element_blank(),
- axis.title.y = element_text(size = 6),
- axis.text.x = element_text(size = 6),
- legend.key.size = unit(0.5,"line"),
- legend.text = element_text(size = 5,margin = margin(0,0,0,0)),
- panel.grid = element_blank(),
- panel.border = element_blank(),
- panel.spacing = unit(0.25, "lines"),
- axis.line.x = element_line(linetype = "solid", colour = "black"),
- axis.line.y = element_line(linetype = "solid", colour = "black"))
- group_st_CV_R_plot = ggplot(data = summary_clinic_data %>% filter(Metric == "StepTime", Side == "Right"), aes(x = DBSCondition, y = cv, group = SubjectID))+
- geom_point(data = summary_clinic_data %>% filter(Metric == "StepTime", Side == "Right"),aes(color = SubjectID, shape = SubjectID, fill = SubjectID), position = position_dodge2(width = 0.25), size = 1) +
- geom_line(aes(color = SubjectID),position = position_dodge2(width = 0.25), linewidth = 0.25)+
- scale_color_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_fill_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_shape_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c(22,23,24))+
- scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
- ylab("Coefficient of Variation")+
- ggtitle("Right") +
- theme_bw(base_size = 5)+
- theme(plot.title = element_text(hjust = 0.5,size = 6),
- axis.title.x = element_blank(),
- axis.title.y = element_text(size = 6),
- axis.text.x = element_text(size = 6),
- legend.key.size = unit(0.5,"line"),
- legend.text = element_text(size = 5,margin = margin(0,0,0,0)),
- panel.grid = element_blank(),
- panel.border = element_blank(),
- panel.spacing = unit(0.25, "lines"),
- axis.line.x = element_line(linetype = "solid", colour = "black"),
- axis.line.y = element_line(linetype = "solid", colour = "black"))
- group_step_length_symmetry_plot = ggplot(data = summary_clinic_data %>% filter(Metric == "StepLengthSymm"), aes(x = DBSCondition, y = mean, group = SubjectID))+
- geom_point(data = summary_clinic_data %>% filter(Metric == "StepLengthSymm"),aes(color = SubjectID,shape = SubjectID, fill = SubjectID), position = position_dodge2(width = 0.25),size = 1) +
- geom_line(aes(color = SubjectID),position = position_dodge2(width = 0.25), linewidth = 0.25, show.legend = FALSE)+
- geom_errorbar(aes(ymin = lower,ymax = upper,color = SubjectID),width = 0.25,position = position_dodge2(width=0.25), linewidth = 0.25, show.legend = FALSE) +
- geom_signif(data = data.frame(SubjectID = c("P2","P2","P2"),
- start = c("cDBS","cDBS","RU-aDBS"),
- end = c("RD-aDBS","RU-aDBS","RD-aDBS"),
- y = c(0.18,0.17,0.16),
- label = c("")),
- aes(y_position = y,xmin = start,xmax = end,annotations = label), color = "black", size = 0.25, textsize = 2, vjust = 0.5,tip_length = 0, manual = TRUE)+
- scale_color_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_fill_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_shape_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c(22,23,24))+
- scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
- ylab("Absolute Asymmetry")+
- ggtitle("Step Length Symmetry") +
- theme_bw(base_size = 5)+
- theme(plot.title = element_text(hjust = 0.5,size = 8),
- axis.title.x = element_blank(),
- axis.title.y = element_text(size = 6),
- axis.text.x = element_text(size = 6),
- legend.key.size = unit(0.5,"line"),
- legend.text = element_text(size = 5,margin = margin(0,0,0,0)),
- panel.grid = element_blank(),
- panel.border = element_blank(),
- panel.spacing = unit(0.25, "lines"),
- axis.line.x = element_line(linetype = "solid", colour = "black"),
- axis.line.y = element_line(linetype = "solid", colour = "black"))
- group_step_time_symmetry_plot = ggplot(data = summary_clinic_data %>% filter(Metric == "StepTimeSymm"), aes(x = DBSCondition, y = mean, group = SubjectID))+
- geom_point(data = summary_clinic_data %>% filter(Metric == "StepTimeSymm"),aes(color = SubjectID, shape = SubjectID, fill = SubjectID), position = position_dodge2(width = 0.25),size = 1) +
- geom_line(aes(color = SubjectID),position = position_dodge2(width = 0.25), linewidth = 0.25, show.legend = FALSE)+
- geom_errorbar(aes(ymin = lower,ymax = upper,color = SubjectID),width = 0.25,position = position_dodge2(width=0.25), linewidth = 0.25, show.legend = FALSE) +
- geom_signif(data = data.frame(SubjectID = c("P2","P2","P2"),
- start = c("cDBS","cDBS","RU-aDBS"),
- end = c("RD-aDBS","RU-aDBS","RD-aDBS"),
- y = c(0.09,0.085,0.08),
- label = c("")),
- aes(y_position = y,xmin = start,xmax = end,annotations = label), color = "black", size = 0.25, textsize = 2, vjust = 0.5,tip_length = 0, manual = TRUE)+
- scale_color_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_fill_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_shape_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c(22,23,24))+
- scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
- ylab("Absolute Asymmetry")+
- ggtitle("Step Time Symmetry") +
- theme_bw(base_size = 5)+
- theme(plot.title = element_text(hjust = 0.5,size = 8),
- axis.title.x = element_blank(),
- axis.title.y = element_text(size = 6),
- axis.text.x = element_text(size = 6),
- legend.key.size = unit(0.5,"line"),
- legend.text = element_text(size = 5,margin = margin(0,0,0,0)),
- panel.grid = element_blank(),
- panel.border = element_blank(),
- panel.spacing = unit(0.25, "lines"),
- axis.line.x = element_line(linetype = "solid", colour = "black"),
- axis.line.y = element_line(linetype = "solid", colour = "black"))
- signif_color_plot <- ggplot(data = data.frame(x = factor(c("Lunch","Dinner","Lunch","Dinner","Lunch","Dinner"), levels=c("Lunch","Dinner")),
- y = c(1,1,2,2,3,3),
- signif = factor(c("Left Leg Only","Right Leg Only","Both Legs"), levels=c("Left Leg Only","Right Leg Only","Both Legs"))),
- aes(x = x,y = y,color = signif))+
- scale_color_manual(name = "Significance:",
- values = c("#fb8072","#80b1d3","#8dd3c7"))+
- geom_line()+
- theme_bw(base_size = 5) +
- theme(legend.key.size = unit(0.5,"line"),
- legend.text = element_text(size = 5,margin = margin(0,0,0,0)),)
- ##### Combine plots #####
- common_clinic_fill_legend <- get_plot_component(clinic_sl_plot +
- guides(color = guide_legend(nrow = 1,ncol = 2)) +
- theme(legend.position = "bottom",
- legend.text = element_text(margin = margin(0,5,0,5))),
- 'guide-box-bottom',return_all = TRUE)
- common_clinic_color_legend <- get_plot_component(signif_color_plot +
- guides(color = guide_legend(nrow = 1,ncol = 3)) +
- theme(legend.position = "bottom",
- legend.text = element_text(margin = margin(0,5,0,5))),
- 'guide-box-bottom',return_all = TRUE)
- common_clinic_symm_legend <- get_plot_component(group_step_length_symmetry_plot +
- guides(color = guide_legend(nrow = 1,ncol = 3)) +
- theme(legend.position = "bottom",
- legend.text = element_text(margin = margin(0,5,0,5))),
- 'guide-box-bottom',return_all = TRUE)
- common_cv_legend <- get_plot_component(group_sl_CV_L_plot +
- guides(color = guide_legend(nrow = 1,ncol = 3)) +
- theme(legend.position = "bottom",
- legend.text = element_text(margin = margin(0,5,0,5))),
- 'guide-box-bottom',return_all = TRUE)
- combined_legends <- plot_grid(NULL,common_cv_legend,NULL,common_clinic_fill_legend,NULL,common_clinic_color_legend,NULL,
- ncol = 7,
- rel_widths = c(0.5,1,0.5,0.75,0.15,0.75,0.35))
- step_length_cv_plot <- plot_grid(group_sl_CV_L_plot + theme(legend.position = "none"),
- NULL,
- group_sl_CV_R_plot + theme(legend.position = "none"),
- ncol = 3,
- nrow = 1,
- rel_widths = c(1,0.05,1))
- step_length_cv_title <- ggplot() + ggtitle("Step Length Variability") + theme(plot.title = element_text(hjust = 0.5,size = 8))
- step_length_cv_w_title_plot <- plot_grid(step_length_cv_title,step_length_cv_plot,
- nrow = 2,
- rel_heights = c(0.1,1))
- step_time_cv_plot <- plot_grid(group_st_CV_L_plot + theme(legend.position = "none"),
- NULL,
- group_st_CV_R_plot + theme(legend.position = "none"),
- ncol = 3,
- nrow = 1,
- rel_widths = c(1,0.05,1))
- step_time_cv_title <- ggplot() + ggtitle("Step Time Variability") + theme(plot.title = element_text(hjust = 0.5,size = 8))
- step_time_cv_w_title_plot <- plot_grid(step_time_cv_title,step_time_cv_plot,
- nrow = 2,
- rel_heights = c(0.1,1))
- combined_clinic_metrics <- plot_grid(group_step_length_symmetry_plot + theme(legend.position = "none"),NULL,clinic_sl_plot + theme(legend.position = "none"),
- NULL,NULL,NULL,
- group_step_time_symmetry_plot + theme(legend.position = "none"),NULL,clinic_st_plot + theme(legend.position = "none"),
- ncol = 3,
- nrow = 3,
- rel_widths = c(0.5,0.05,1),
- rel_heights = c(1,0.05,1))
- combined_clinic_legend <- plot_grid(NULL,common_clinic_symm_legend,NULL,common_clinic_fill_legend,NULL,common_clinic_color_legend,NULL,
- ncol = 7,
- rel_widths = c(0.25,1,0.25,1,0.01,1,0.4))
- combined_clinic_metrics_w_legend <- plot_grid(combined_clinic_metrics,
- combined_clinic_legend,
- nrow = 2,
- rel_heights = c(1,0.05))
- combined_clinic_var_metrics <- plot_grid(NULL,NULL,NULL,NULL,NULL,
- step_length_cv_w_title_plot,NULL,group_step_length_symmetry_plot + theme(legend.position = "none"),NULL,clinic_sl_plot + theme(legend.position = "none"),
- NULL,NULL,NULL,NULL,NULL,
- step_time_cv_w_title_plot,NULL,group_step_time_symmetry_plot + theme(legend.position = "none"),NULL,clinic_st_plot + theme(legend.position = "none"),
- ncol = 5,
- nrow = 4,
- rel_widths = c(0.75,0.01,0.5,0.01,1.33),
- rel_heights = c(0.05,1,0.05,1))
- combined_clinic_var_metrics_w_legend <- plot_grid(combined_clinic_var_metrics,
- NULL,
- combined_legends,
- nrow = 3,
- rel_heights = c(1,0.01,0.05))
- combined_clinic_var_metrics <- plot_grid(NULL,
- step_length_cv_w_title_plot,
- NULL,
- step_time_cv_w_title_plot,
- nrow = 4,
- rel_heights = c(0.05,1,0.05,1))
- combined_clinic_var_title <- ggplot() + ggtitle("In-clinic Gait Metrics") + theme(plot.title = element_text(hjust = 0.5,size = 8))
- combined_clinic_var_metrics_with_title <- plot_grid(combined_clinic_var_title,combined_clinic_var_metrics,
- nrow = 2,
- rel_heights = c(0.05,1))
- ##### Long-term Rover #####
- # Load data
- rover_data <- read.csv('Figure5C.csv')
- data2 <- rover_data %>%
- mutate(SubjectID = as.factor(SubjectID),
- SubjectID = fct_relevel(SubjectID,c("P2","P3","P4")),
- Condition = as.factor(Condition),
- Condition = fct_relevel(Condition,c("clinical","ramp_up","ramp_down"))) %>%
- select(-Notes) %>%
- pivot_longer(!c(SubjectID,Condition,Day),names_to = "metric",values_to = "value")
- data3 <- data2 %>% group_by(SubjectID,Condition,metric) %>%
- summarise(mean = mean(abs(value), na.rm = TRUE), sd = sd(abs(value), na.rm = TRUE), se = sd/sqrt(n())) %>%
- ungroup() %>%
- mutate(Condition = fct_recode(Condition, "C" = "clinical", "RU" = "ramp_up", "RD" = "ramp_down"))
- # Plots
- rover_sl_plot <- ggplot(data = data3 %>% filter(metric == "Stride_Length"),aes(x = Condition, y = mean, color = SubjectID, shape = SubjectID, fill = SubjectID, group = SubjectID))+
- geom_point(position = position_dodge2(width = 0.25), size = 1) +
- geom_errorbar(aes(ymin = mean - se, ymax = mean + se),position = position_dodge2(width = 0.25),width = 0.25, linewidth = 0.25, show.legend = FALSE) +
- geom_path(position = position_dodge2(width = 0.25), show.legend = FALSE, linewidth = 0.25) +
- scale_color_manual(name = "",
- labels = c("Patient 2","Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_fill_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_shape_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c(22,23,24))+
- scale_x_discrete(labels = c("C" = "cDBS", "RU" = "RU-aDBS", "RD" = "RD-aDBS")) +
- theme_bw(base_size = 5) +
- xlab("") +
- ylab("meters") +
- ggtitle("Stride Length") +
- theme_bw(base_size = 5)+
- theme(plot.title = element_text(hjust = 0.5,size = 8),
- axis.title.x = element_blank(),
- axis.title.y = element_text(size = 6),
- axis.text.x = element_text(size = 6),
- legend.key.size = unit(0.5,"line"),
- legend.text = element_text(size = 5,margin = margin(0,0,0,0)),
- panel.grid = element_blank(),
- panel.border = element_blank(),
- panel.spacing = unit(0.25, "lines"),
- axis.line.x = element_line(linetype = "solid", colour = "black"),
- axis.line.y = element_line(linetype = "solid", colour = "black"))
- rover_ws_plot <- ggplot(data = data3 %>% filter(metric == "Walking_Speed"),aes(x = Condition, y = mean, color = SubjectID, shape = SubjectID, fill = SubjectID, group = SubjectID))+
- geom_point(position = position_dodge2(width = 0.25), size = 1) +
- geom_errorbar(aes(ymin = mean - se, ymax = mean + se),position = position_dodge2(width = 0.25),width = 0.25, linewidth = 0.25, show.legend = FALSE) +
- geom_path(position = position_dodge2(width = 0.25), show.legend = FALSE, linewidth = 0.25) +
- scale_color_manual(name = "",
- labels = c("Patient 2","Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_fill_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_shape_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c(22,23,24))+
- scale_x_discrete(labels = c("C" = "cDBS", "RU" = "RU-aDBS", "RD" = "RD-aDBS")) +
- theme_bw(base_size = 5) +
- xlab("") +
- ylab("meters/second") +
- ggtitle("Walking Speed") +
- theme_bw(base_size = 5)+
- theme(plot.title = element_text(hjust = 0.5,size = 8),
- axis.title.x = element_blank(),
- axis.title.y = element_text(size = 6),
- axis.text.x = element_text(size = 6),
- legend.key.size = unit(0.5,"line"),
- legend.text = element_text(size = 5,margin = margin(0,0,0,0)),
- panel.grid = element_blank(),
- panel.border = element_blank(),
- panel.spacing = unit(0.25, "lines"),
- axis.line.x = element_line(linetype = "solid", colour = "black"),
- axis.line.y = element_line(linetype = "solid", colour = "black"))
- rover_c_plot <- ggplot(data = data3 %>% filter(metric == "Cadence"),aes(x = Condition, y = mean, color = SubjectID, shape = SubjectID, fill = SubjectID, group = SubjectID))+
- geom_point(position = position_dodge2(width = 0.25), size = 1) +
- geom_errorbar(aes(ymin = mean - se, ymax = mean + se),position = position_dodge2(width = 0.25),width = 0.25, linewidth = 0.25, show.legend = FALSE) +
- geom_path(position = position_dodge2(width = 0.25), show.legend = FALSE, linewidth = 0.25) +
- geom_signif(data = data.frame(SubjectID = c("P2"),
- start = c("C"),
- end = c("RD"),
- y = c(118),
- label = c("")),
- aes(y_position = y,xmin = start,xmax = end,annotations = label), color = "#FAA41D", size = 0.25, textsize = 2, vjust = 0.5,tip_length = 0, manual = TRUE)+
- scale_color_manual(name = "",
- labels = c("Patient 2","Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_fill_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_shape_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c(22,23,24))+
- scale_x_discrete(labels = c("C" = "cDBS", "RU" = "RU-aDBS", "RD" = "RD-aDBS")) +
- theme_bw(base_size = 5) +
- xlab("") +
- ylab("steps/min") +
- ggtitle("Cadence") +
- theme_bw(base_size = 5)+
- theme(plot.title = element_text(hjust = 0.5,size = 8),
- axis.title.x = element_blank(),
- axis.title.y = element_text(size = 6),
- axis.text.x = element_text(size = 6),
- legend.key.size = unit(0.5,"line"),
- legend.text = element_text(size = 5,margin = margin(0,0,0,0)),
- panel.grid = element_blank(),
- panel.border = element_blank(),
- panel.spacing = unit(0.25, "lines"),
- axis.line.x = element_line(linetype = "solid", colour = "black"),
- axis.line.y = element_line(linetype = "solid", colour = "black"))
- rover_symm_plot <- ggplot(data = data3 %>% filter(metric == "Symmetry"),aes(x = Condition, y = mean, color = SubjectID, shape = SubjectID, fill = SubjectID, group = SubjectID))+
- geom_point(position = position_dodge2(width = 0.25), size = 1) +
- geom_errorbar(aes(ymin = mean - se, ymax = mean + se),position = position_dodge2(width = 0.25),width = 0.25, linewidth = 0.25, show.legend = FALSE) +
- geom_path(position = position_dodge2(width = 0.25), show.legend = FALSE, linewidth = 0.25) +
- scale_color_manual(name = "",
- labels = c("Patient 2","Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_fill_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c("#FAA41D","#ED2790","#6BBD46"))+
- scale_shape_manual(name = "",
- labels = c("Patient 2", "Patient 3", "Patient 4"),
- values = c(22,23,24))+
- scale_x_discrete(labels = c("C" = "cDBS", "RU" = "RU-aDBS", "RD" = "RD-aDBS")) +
- theme_bw(base_size = 5) +
- xlab("") +
- ylab("Absolute Asymmetry") +
- ggtitle("Step Length Symmetry") +
- theme_bw(base_size = 5)+
- theme(plot.title = element_text(hjust = 0.5,size = 8),
- axis.title.x = element_blank(),
- axis.title.y = element_text(size = 6),
- axis.text.x = element_text(size = 6),
- legend.key.size = unit(0.5,"line"),
- legend.text = element_text(size = 5,margin = margin(0,0,0,0)),
- panel.grid = element_blank(),
- panel.border = element_blank(),
- panel.spacing = unit(0.25, "lines"),
- axis.line.x = element_line(linetype = "solid", colour = "black"),
- axis.line.y = element_line(linetype = "solid", colour = "black"))
- rover_plot_titles <- ggplot() + ggtitle("Home-monitoring Gait Metrics") + theme(plot.title = element_text(hjust = 0.5,size = 8))
- common_rover_legend <- get_plot_component(rover_sl_plot +
- guides(color = guide_legend(nrow = 1,ncol = 3)) +
- theme(legend.position = "bottom"),
- 'guide-box-bottom',return_all = TRUE)
- combined_rover_metrics <- plot_grid(rover_sl_plot + theme(legend.position = "none"),NULL,rover_symm_plot + theme(legend.position = "none"),
- NULL,NULL,NULL,
- rover_c_plot + theme(legend.position = "none"),NULL,rover_ws_plot + theme(legend.position = "none"),
- ncol = 3,
- nrow = 3,
- rel_heights = c(1,0.02,1),
- rel_widths = c(1,0.02,1))
- combined_rover_plots <- plot_grid(combined_rover_metrics,common_rover_legend,
- ncol = 1,
- nrow = 2,
- rel_heights = c(1,0.05))
- rover_plots_with_title <- plot_grid(rover_plot_titles,combined_rover_metrics,
- nrow = 2,
- rel_heights = c(0.05,1))
- ##### Post-motor Diary #####
- # Load data
- motor_diary_data <- read.csv('Figure5AB.csv') %>%
- mutate(Rigidity = as.factor(case_when(str_detect(Rigidity,"Better") ~ "Better",str_detect(Rigidity,"same") ~ "Same",str_detect(Rigidity,"Worse") ~ "Worse")),
- Tremor = as.factor(case_when(str_detect(Tremor,"Better") ~ "Better",str_detect(Tremor,"same") ~ "Same",str_detect(Tremor,"Worse") ~ "Worse")),
- Dyskinesia = as.factor(case_when(str_detect(Dyskinesia,"Better") ~ "Better",str_detect(Dyskinesia,"same") ~ "Same",str_detect(Dyskinesia,"Worse") ~ "Worse")),
- NumFall = factor(NumFall,levels = c("0","1","2-4","5+")),
- NumFreeze = factor(NumFreeze, levels = c("0","1","2-4","5+")))
- aggregate_md_data <- motor_diary_data %>% filter(Setting != "") %>%
- group_by(SubjectID,Setting) %>%
- pivot_longer(cols = c(3:7), names_to = "columns", values_to = "value") %>%
- count(columns, value) %>%
- mutate(columns = as.factor(columns),
- Setting = factor(case_when(str_detect(Setting,"Clinical") ~ "cDBS",str_detect(Setting,"ramp-up") ~ "RU-aDBS",str_detect(Setting,"ramp-down") ~ "RD-aDBS"),levels = c("cDBS","RU-aDBS","RD-aDBS")))
- filt_motor_diary_data <-motor_diary_data %>% filter(Setting != "") %>%
- mutate(Setting = factor(case_when(str_detect(Setting,"Clinical") ~ "cDBS",str_detect(Setting,"ramp-up") ~ "RU-aDBS",str_detect(Setting,"ramp-down") ~ "RD-aDBS"),levels = c("cDBS","RU-aDBS","RD-aDBS")))
- # Plots
- cardinal_symptom_plot <- ggplot(aggregate_md_data %>% filter(columns %in% c("Rigidity", "Tremor", "Dyskinesia")),
- aes(x = Setting, y = n, fill = value)) +
- geom_bar(position="stack", stat="identity",width = 0.75) +
- scale_fill_manual(name = "Rating:",
- # labels = c("Better","Same","Worse"),
- values = c("#1670B9","#4FA747","#BF2026")) +
- ylab("Count") +
- facet_grid(SubjectID ~ columns, switch = "y", labeller = labeller(SubjectID = c("P2" = "Patient 2","P3" = "Patient 3","P4" = "Patient 4"), columns = c("Dyskinesia" = "Dyskinesia","Rigidity" = "Patient-reported\nStiffness","Tremor" = "Tremor"))) +
- theme_bw(base_size = 5)+
- theme(plot.title = element_text(hjust = 0.5,size = 6),
- axis.title.x = element_blank(),
- axis.text.x = element_text(size = 5),
- axis.title.y = element_text(vjust = 0),
- legend.key.size = unit(0.5,"line"),
- legend.position = "bottom",
- strip.background = element_blank(),
- strip.text = element_text(size = 8),
- strip.text.y = element_blank(),
- panel.grid = element_blank(),
- panel.border = element_blank(),
- panel.spacing = unit(0.25, "lines"),
- axis.line.x = element_line(linetype = "solid", colour = "black"),
- axis.line.y = element_line(linetype = "solid", colour = "black"))
- fall_freeze_plot <- ggplot(aggregate_md_data %>% filter(columns %in% c("NumFall", "NumFreeze")) %>% mutate(value = factor(value,levels = c("5+","2-4","1","0"))),
- aes(x = Setting, y = n, fill = value)) +
- geom_bar(position="stack", stat="identity", width = 0.75) +
- scale_fill_manual(name = "Amount:",
- labels = c("5+","2-4", "1","0"),
- values = c("#BF2026","#F7921E","#4FA747","#1670B9")) +
- facet_grid(SubjectID~columns, switch = "y", labeller = labeller(columns = c("NumFall" = "Number of Falls","NumFreeze" = "Number of Freezes"),SubjectID = c("P2" = "Patient 2","P3" = "Patient 3","P4" = "Patient 4"))) +
- theme_bw(base_size = 5) +
- theme(plot.title = element_text(hjust = 0.5,size = 6),
- axis.title.x = element_blank(),
- axis.text.x = element_text(size = 5),
- axis.title.y = element_text(vjust = -8),
- legend.key.size = unit(0.5,"line"),
- legend.position = "bottom",
- strip.background = element_blank(),
- strip.text = element_text(size = 8),
- strip.placement = "outside",
- strip.text.y.left = element_text(size = 5,vjust=5),
- strip.clip = "off",
- panel.grid = element_blank(),
- panel.border = element_blank(),
- panel.spacing = unit(0.25, "lines"),
- axis.line.x = element_line(linetype = "solid", colour = "black"),
- axis.line.y = element_line(linetype = "solid", colour = "black"))
- combined_md_plots <- plot_grid(fall_freeze_plot,NULL,cardinal_symptom_plot,
- ncol = 3,
- rel_widths = c(1,0.01,1.25))
- ##### Combine all plots #####
- clinic_and_rover_gait_metrics <- plot_grid(rover_plots_with_title,NULL,combined_clinic_var_metrics_with_title,
- ncol = 3,
- rel_widths = c(1,0.05,1))
- clinic_and_rover_gait_metrics_w_legend <- plot_grid(clinic_and_rover_gait_metrics,
- common_cv_legend,
- nrow = 2,
- rel_heights = c(1,0.05))
- paper_figure <- plot_grid(combined_md_plots,NULL,clinic_and_rover_gait_metrics_w_legend,
- nrow = 3,
- rel_heights = c(0.75,0.05,1))
double_blind_aDBS_in-clinic_gait_metrics_rover_summary_motor_diary_plots.R at commit 278fdb5, no license · at the source
Overview
- Department of Neurological Surgery, University California, San Francisco, San Francisco, CA USA
- Department of Physical Therapy and Rehabilitation Sciences, University of California, San Francisco, San Francisco, CA USA
- Department of Applied Physiology & Kinesiology, University of Florida, Gainesville, FL USA
- Graduate Program in Bioengineering, University of California, Berkeley and University of California, San Francisco, San Francisco, CA USA
- Weill Institute for Neurosciences, University of California, San Francisco, San Francisco, CA USA
Abstract
A randomized crossover study of five patients with Parkinson’s disease (PD) demonstrates that gait-synchronized adaptive deep brain stimulation is feasible and safe, and reduces falls compared with continuous stimulation. Gait dysfunction in PD is a major source of disability and is often insufficiently treated by continuous deep brain stimulation (cDBS). Although adaptive DBS (aDBS) has shown efficacy for other motor symptoms using β-based, state-driven neural signals, gait is a dynamic, cyclical behavior that may require temporally precise modulation. Here we evaluated a behavior-contingent aDBS approach that synchronizes stimulation to gait phase. We reported a single-center, blinded, randomized, crossover study evaluating the feasibility of identifying patient-specific biomarkers to drive aDBS. The primary outcome was feasibility of successful identification of gait-phase biomarkers to implement aDBS. Five participants with PD undergoing pallidal DBS and subdural electrode paddle implantation were enrolled. We successfully identified personalized gait-phase biomarkers from cortical or pallidal field potentials in all five patients and embedded them into a bidirectional neurostimulator. During acute in-clinic testing, aDBS improved step variability and step symmetry versus cDBS. Three participants subsequently completed a double-blinded, multi-day crossover phase. In this setting, aDBS maintained general motor symptom control, reduced falls and yielded patient-specific gait improvements. No adverse events occurred and aDBS was well tolerated. These findings establish the feasibility of biomarker-driven, movement-synchronized neuromodulation and support the development of a larger randomized trial to determine clinical efficacy. ClinicalTrial.gov registration: NCT04675398.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 18 matches between paragraphs and lines of code.
openmind-consortium/Analysis-rcs-data
e04baae07f56f73d265daa1d0f1b887607930dd2, 22 January 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
157 files
- code/
DEMO_CalculatePowerRCS.m , MATLAB, 117 lines - code/
DEMO_LoadDebugTable.m , MATLAB, 47 lines - code/
DEMO_LoadRCS.m , MATLAB, 15 lines - code/
ProcessRCS.m , MATLAB, 529 lines - code/
addNewEntry_FFTSettings. , MATLAB, 32 linesm - code/
addNewEntry_PowerDomainS , MATLAB, 42 linesettings.m - code/
addNewEntry_StimSettings , MATLAB, 25 lines.m - code/
addNewEntry_TimeDomainSe , MATLAB, 24 linesttings.m - code/
addRowToTable.m , MATLAB, 14 lines - code/
assignTime.m , MATLAB, 461 lines - code/
calculateDeltaSystemTick , MATLAB, 9 lines.m - code/
calculateNewPower.m , MATLAB, 135 lines - code/
convertDetectorCodes.m , MATLAB, 27 lines - code/
convertFFTCodes.m , MATLAB, 76 lines - code/
convertMetadataCodes.m , MATLAB, 133 lines - code/
convertTDcodes.m , MATLAB, 164 lines - code/
convertTherapyStatus.m , MATLAB, 22 lines - code/
createAccelTable.m , MATLAB, 51 lines - code/
createAdaptiveSettingsfr , MATLAB, 272 linesomDeviceSettings.m - code/
createAdaptiveTable.m , MATLAB, 106 lines - code/
createCombinedTable.m , MATLAB, 179 lines - code/
createCombinedTable_debu , MATLAB, 110 linesgTable.m - code/
createDataTableWithMulti , MATLAB, 83 linespleSamplingRates.m - code/
createDeviceSettingsTabl , MATLAB, 502 linese.m - code/
createEventLogTable.m , MATLAB, 29 lines - code/
createFFTtable.m , MATLAB, 46 lines - code/
createPowerTable.m , MATLAB, 100 lines - code/
createStimSettingsFromDe , MATLAB, 164 linesviceSettings.m - code/
createStimSettingsTable. , MATLAB, 173 linesm - code/
createTableFromSparseMat , MATLAB, 10 linesrix.m - code/
createTimeDomainTable.m , MATLAB, 67 lines - code/
deserializeJSON.m , MATLAB, 35 lines - code/
fixMalformedJson.m , MATLAB, 49 lines - code/
getActualAmplifierGains. , MATLAB, 36 linesm - code/
getFFTparameters.m , MATLAB, 33 lines - code/
getPowerBands.m , MATLAB, 70 lines - code/
getPowerFromTimeDomain.m , MATLAB, 153 lines - code/
getSampleRate.m , MATLAB, 38 lines - code/
getSampleRateAcc.m , MATLAB, 22 lines - code/
getStimParameters.m , MATLAB, 53 lines - code/
hannWindow.m , MATLAB, 41 lines - code/
harmonizeTimeAcrossDataS , MATLAB, 68 linestreams.m - code/
rcsPlotter.m , MATLAB, 3,025 lines - code/
rcs_anonymize.m , MATLAB, 171 lines - code/
toolboxes/ , MATLAB, 130 linespanel-2.14/ demo/ demopanel1.m - code/
toolboxes/ , MATLAB, 64 linespanel-2.14/ demo/ demopanel2.m - code/
toolboxes/ , MATLAB, 106 linespanel-2.14/ demo/ demopanel3.m - code/
toolboxes/ , MATLAB, 59 linespanel-2.14/ demo/ demopanel4.m - code/
toolboxes/ , MATLAB, 74 linespanel-2.14/ demo/ demopanel5.m - code/
toolboxes/ , MATLAB, 82 linespanel-2.14/ demo/ demopanel6.m - code/
toolboxes/ , MATLAB, 35 linespanel-2.14/ demo/ demopanel7.m - code/
toolboxes/ , MATLAB, 40 linespanel-2.14/ demo/ demopanel8.m - code/
toolboxes/ , MATLAB, 201 linespanel-2.14/ demo/ demopanel9.m - code/
toolboxes/ , MATLAB, 128 linespanel-2.14/ demo/ demopanelA.m - code/
toolboxes/ , MATLAB, 42 linespanel-2.14/ demo/ demopanelB.m - code/
toolboxes/ , MATLAB, 34 linespanel-2.14/ demo/ demopanelC.m - code/
toolboxes/ , MATLAB, 55 linespanel-2.14/ demo/ demopanelD.m - code/
toolboxes/ , MATLAB, 73 linespanel-2.14/ demo/ demopanelE.m - code/
toolboxes/ , MATLAB, 49 linespanel-2.14/ demo/ demopanelF.m - code/
toolboxes/ , MATLAB, 50 linespanel-2.14/ demo/ demopanelG.m - code/
toolboxes/ , MATLAB, 38 linespanel-2.14/ demo/ demopanelH.m - code/
toolboxes/ , MATLAB, 98 linespanel-2.14/ demo/ demopanelI.m - code/
toolboxes/ , MATLAB, 39 linespanel-2.14/ demo/ demopanelJ.m - code/
toolboxes/ , MATLAB, 103 linespanel-2.14/ demo/ demopanelK.m - code/
toolboxes/ , MATLAB, 25 linespanel-2.14/ demo/ demopanel_callback.m - code/
toolboxes/ , MATLAB, 80 linespanel-2.14/ demo/ demopanel_minihist.m - code/
toolboxes/ , MATLAB, 5,201 linespanel-2.14/ panel.m - code/
toolboxes/ , MATLAB, 29 linesturtle_json/ src/ +json/ +objs/ +token/ +object/ mex_object_info.m - code/
toolboxes/ , MATLAB, 171 linesturtle_json/ src/ +json/ +objs/ +token/ @array/ array.m - code/
toolboxes/ , MATLAB, 212 linesturtle_json/ src/ +json/ +objs/ +token/ @object/ object.m - code/
toolboxes/ , MATLAB, 90 linesturtle_json/ src/ +json/ +objs/ +token/ parsing_info.m - code/
toolboxes/ , MATLAB, 186 linesturtle_json/ src/ +json/ +objs/ @dict/ dict.m - code/
toolboxes/ , MATLAB, 13 linesturtle_json/ src/ +json/ +objs/ @json_parse_error/ json_parse_error.m - code/
toolboxes/ , MATLAB, 274 linesturtle_json/ src/ +json/ +objs/ @lazy_dict/ lazy_dict.m - code/
toolboxes/ , MATLAB, 131 linesturtle_json/ src/ +json/ +objs/ @token/ token.m - code/
toolboxes/ , MATLAB, 121 linesturtle_json/ src/ +json/ +sl/ +cellstr/ contains.m - code/
toolboxes/ , MATLAB, 77 linesturtle_json/ src/ +json/ +sl/ +cellstr/ join.m - code/
toolboxes/ , MATLAB, 41 linesturtle_json/ src/ +json/ +sl/ +dir/ filepartsx.m - code/
toolboxes/ , MATLAB, 24 linesturtle_json/ src/ +json/ +sl/ +in/ NULL.m - code/
toolboxes/ , MATLAB, 214 linesturtle_json/ src/ +json/ +sl/ +in/ processVarargin.m - code/
toolboxes/ , MATLAB, 130 linesturtle_json/ src/ +json/ +sl/ +in/ process_varargin_result. m - code/
toolboxes/ , MATLAB, 78 linesturtle_json/ src/ +json/ +sl/ +in/ propValuePairsToStruct.m - code/
toolboxes/ , MATLAB, 81 linesturtle_json/ src/ +json/ +sl/ +stack/ getMyBasePath.m - code/
toolboxes/ , MATLAB, 30 linesturtle_json/ src/ +json/ +sl/ +stack/ getPackageRoot.m - code/
toolboxes/ , MATLAB, 82 linesturtle_json/ src/ +json/ +sl/ +str/ contains.m - code/
toolboxes/ , MATLAB, 348 linesturtle_json/ src/ +json/ +utils/ @examples/ examples.m - code/
toolboxes/ , MATLAB, 43 linesturtle_json/ src/ +json/ +utils/ @to_data_mex/ to_data_mex.m - code/
toolboxes/ , MATLAB, 13 linesturtle_json/ src/ +json/ +utils/ addBuffer.m - code/
toolboxes/ , MATLAB, 64 linesturtle_json/ src/ +json/ +utils/ getPerformanceLog.m - code/
toolboxes/ , C, 104 linesturtle_json/ src/ +json/ +utils/ private/ tj_get_log_struct_as_mx. c - code/
toolboxes/ , C, 139 linesturtle_json/ src/ +json/ +utils/ setField.c - code/
toolboxes/ , MATLAB, 27 linesturtle_json/ src/ +json/ +utils/ setField.m - code/
toolboxes/ , MATLAB, 102 linesturtle_json/ src/ +json/ +utils/ time_averager.m - code/
toolboxes/ , MATLAB, 142 linesturtle_json/ src/ +json/ load.m - code/
toolboxes/ , MATLAB, 35 linesturtle_json/ src/ +json/ loadExample.m - code/
toolboxes/ , MATLAB, 47 linesturtle_json/ src/ +json/ parse.m - code/
toolboxes/ , MATLAB, 67 linesturtle_json/ src/ +json/ private/ label_generator.m - code/
toolboxes/ , MATLAB, 82 linesturtle_json/ src/ +json/ tokens.m - code/
toolboxes/ , C/C++, 15 linesturtle_json/ src/ c_code/ error_handling.h - code/
toolboxes/ , C, 821 linesturtle_json/ src/ c_code/ json_info_to_data.c - code/
toolboxes/ , C/C++, 83 linesturtle_json/ src/ c_code/ json_info_to_data.h - code/
toolboxes/ , C, 904 linesturtle_json/ src/ c_code/ json_info_to_data__array s.c - code/
toolboxes/ , C, 142 linesturtle_json/ src/ c_code/ json_info_to_data__objec ts.c - code/
toolboxes/ , C, 81 linesturtle_json/ src/ c_code/ json_info_to_data__optio n_handling.c - code/
toolboxes/ , C, 168 linesturtle_json/ src/ c_code/ json_info_to_data__utils .c - code/
toolboxes/ , MATLAB, 175 linesturtle_json/ src/ c_code/ mex_turtle_json.m - code/
toolboxes/ , C, 51 linesturtle_json/ src/ c_code/ not_current_used/ array_writer.c - code/
toolboxes/ , C, 45 linesturtle_json/ src/ c_code/ not_current_used/ init_memory_test.c - code/
toolboxes/ , C, 6 linesturtle_json/ src/ c_code/ not_current_used/ print_test.c - code/
toolboxes/ , C, 92 linesturtle_json/ src/ c_code/ not_current_used/ string_compare_test.c - code/
toolboxes/ , C, 42 linesturtle_json/ src/ c_code/ not_current_used/ string_count_testing.c - code/
toolboxes/ , C, 40 linesturtle_json/ src/ c_code/ not_current_used/ struct_test.c - code/
toolboxes/ , C++, 126 linesturtle_json/ src/ c_code/ printmem.cpp - code/
toolboxes/ , MATLAB, 36 linesturtle_json/ src/ c_code/ private/ prepStructs.m - code/
toolboxes/ , C/C++, 251 linesturtle_json/ src/ c_code/ simd_guard.h - code/
toolboxes/ , C/C++, 399 linesturtle_json/ src/ c_code/ turtle_json.h - code/
toolboxes/ , C, 964 linesturtle_json/ src/ c_code/ turtle_json_main.c - code/
toolboxes/ , C/C++, 156 linesturtle_json/ src/ c_code/ turtle_json_memory.h - code/
toolboxes/ , C, 605 linesturtle_json/ src/ c_code/ turtle_json_mex.c - code/
toolboxes/ , C, 112 linesturtle_json/ src/ c_code/ turtle_json_mex_helpers. c - code/
toolboxes/ , C, 320 linesturtle_json/ src/ c_code/ turtle_json_number_parsi ng.c - code/
toolboxes/ , C, 997 linesturtle_json/ src/ c_code/ turtle_json_post_process .c - code/
toolboxes/ , C, 366 linesturtle_json/ src/ c_code/ turtle_json_pp_objects.c - code/
toolboxes/ , C, 7 linesturtle_json/ src/ c_code/ turtle_json_write.c - code/
toolboxes/ , MATLAB, 145 linesturtle_json/ src/ c_code/ turtle_json_write_v0.m - code/
toolboxes/ , MATLAB, 244 linesturtle_json/ src/ c_code/ write_state.m - code/
toolboxes/ , MATLAB, 34 linesturtle_json/ src/ test_code/ +json_tests/ +performance/ numeric_array_length.m - code/
toolboxes/ , MATLAB, 16 linesturtle_json/ src/ test_code/ +json_tests/ +toData/ +functions/ all_tests.m - code/
toolboxes/ , MATLAB, 42 linesturtle_json/ src/ test_code/ +json_tests/ +toData/ +functions/ f2__get_key_value_type_a nd_index.m - code/
toolboxes/ , MATLAB, 180 linesturtle_json/ src/ test_code/ +json_tests/ +toData/ +functions/ f7__full_options_parse.m - code/
toolboxes/ , MATLAB, 23 linesturtle_json/ src/ test_code/ +json_tests/ +toData/ all_data_tests.m - code/
toolboxes/ , MATLAB, 8 linesturtle_json/ src/ test_code/ +json_tests/ +toData/ array_token_tests.m - code/
toolboxes/ , MATLAB, 22 linesturtle_json/ src/ test_code/ +json_tests/ +toData/ logical_array_tests.m - code/
toolboxes/ , MATLAB, 53 linesturtle_json/ src/ test_code/ +json_tests/ +toData/ mixed_array_tests.m - code/
toolboxes/ , MATLAB, 66 linesturtle_json/ src/ test_code/ +json_tests/ +toData/ numeric_array_tests.m - code/
toolboxes/ , MATLAB, 10 linesturtle_json/ src/ test_code/ +json_tests/ +toData/ object_tests.m - code/
toolboxes/ , MATLAB, 36 linesturtle_json/ src/ test_code/ +json_tests/ +toData/ parse_options_tests.m - code/
toolboxes/ , MATLAB, 50 linesturtle_json/ src/ test_code/ +json_tests/ +toData/ string_array_tests.m - code/
toolboxes/ , MATLAB, 22 linesturtle_json/ src/ test_code/ +json_tests/ +toTokens/ all_token_tests.m - code/
toolboxes/ , MATLAB, 48 linesturtle_json/ src/ test_code/ +json_tests/ +toTokens/ array_tests.m - code/
toolboxes/ , MATLAB, 50 linesturtle_json/ src/ test_code/ +json_tests/ +toTokens/ error_coverage.m - code/
toolboxes/ , MATLAB, 123 linesturtle_json/ src/ test_code/ +json_tests/ +toTokens/ input_options_testing.m - code/
toolboxes/ , MATLAB, 34 linesturtle_json/ src/ test_code/ +json_tests/ +toTokens/ number_tests.m - code/
toolboxes/ , MATLAB, 71 linesturtle_json/ src/ test_code/ +json_tests/ +toTokens/ object_tests.m - code/
toolboxes/ , MATLAB, 46 linesturtle_json/ src/ test_code/ +json_tests/ +toTokens/ string_tests.m - code/
toolboxes/ , MATLAB, 21 linesturtle_json/ src/ test_code/ +json_tests/ +utils/ encodeJSON.m - code/
toolboxes/ , MATLAB, 12 linesturtle_json/ src/ test_code/ +json_tests/ +utils/ permuter.m - code/
toolboxes/ , MATLAB, 87 linesturtle_json/ src/ test_code/ +json_tests/ +utils/ runTest.m - code/
toolboxes/ , MATLAB, 31 linesturtle_json/ src/ test_code/ +json_tests/ +utils/ testExample.m - code/
toolboxes/ , MATLAB, 157 linesturtle_json/ src/ test_code/ +json_tests/ +utils/ time_example_file.m - code/
toolboxes/ , MATLAB, 23 linesturtle_json/ src/ test_code/ +json_tests/ +utils/ tokenErrorTest.m - code/
toolboxes/ , MATLAB, 15 linesturtle_json/ src/ test_code/ +json_tests/ +utils/ tokenPassTest.m - code/
toolboxes/ , MATLAB, 15 linesturtle_json/ src/ test_code/ +json_tests/ all_tests.m - code/
toolboxes/ , MATLAB, 107 linesturtle_json/ src/ test_code/ +json_tests/ json_checker.m - code/
toolboxes/ , C, 112 linesturtle_json/ src/ test_code/ +json_tests/ temp_parse_one_dot_json. c - testDataSets/
Benchtop/ , MATLAB, 15 linesSimultaneous_RCS_and_DAQ / read_NI_DAQ_dataset.m - README.md, Text, 652 lines
Weill-Neurohub-OPTiMaL/rcs-simulation
0b73d44d0518976be3244db4ff3a0f6e91687476, 15 March 2025Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
12 files
- notebooks/
testing/ , Jupyter, 2,279 linesld_testing.ipynb - notebooks/
testing/ , Jupyter, 587 linespb_testing.ipynb - notebooks/
tutorial/ , MATLAB, 23 linescorrect_ld.m - notebooks/
tutorial/ , MATLAB, 103 linesextract_data.m - notebooks/
tutorial/ , MATLAB, 30 linesisolate_state_vector.m - notebooks/
tutorial/ , MATLAB, 29 linesisolate_stim_vector.m - notebooks/
tutorial/ , Jupyter, 273 linesrcs_simulation_tutorial. ipynb - rcssim/
__init__.py , Python, 1 line - rcssim/
rcs_sim.py , Python, 669 lines, 1 match - setup.py, Python, 20 lines
- LICENSE, License, 21 lines
- README.md, Text, 2 lines
UCSF-wang-lab/gp-FaDBS
278fdb51146e11339537a0d592f9d0e7269eecb3, 16 June 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
22 files
- Analysis/
aDBS_gait_metrics_analys , R, 115 linesis.R - Analysis/
biomarker_pre_post_aDBS_ , R, 60 lines, 2 matchesprogramming_stability_an alysis.R - Analysis/
calcAdaptivePerformance. , MATLAB, 358 linesm - Analysis/
double_blind_aDBS_in-cli , R, 143 lines, 2 matchesnic_gait_metrics_rover_s ummary_motor_diary_analy sis.R - Data Processing/
aggregateRCSSimSpecData. , MATLAB, 170 lines, 1 matchm - Data Processing/
calcGaitMetrics.m , MATLAB, 261 lines, 2 matches - Data Processing/
calcRCS_STFT.m , MATLAB, 118 lines - Data Processing/
convertRCS2CSV.m , MATLAB, 190 lines - Data Processing/
patientGaitPhaseBiomarke , MATLAB, 77 linesrSpecPowerExtractionScri pt.m - Data Processing/
removeGaitCyclesTurns.m , MATLAB, 78 lines - Figure Generation/
PSD_and_Insert_Plots.m , MATLAB, 149 lines, 1 match - Figure Generation/
aDBS_Example_plot.m , MATLAB, 86 lines - Figure Generation/
aDBS_accuracy_plots.R , R, 138 lines - Figure Generation/
aDBS_gait_metric_plots.R , R, 474 lines - Figure Generation/
biomarker_pre_post_aDBS_ , R, 207 lines, 1 matchprogramming_plots.R - Figure Generation/
double_blind_aDBS_in-cli , R, 710 lines, 5 matchesnic_gait_metrics_rover_s ummary_motor_diary_plots .R - Figure Generation/
double_blind_in-clinic_g , R, 434 linesait_metrics_turns_plots. R - Figure Generation/
gait_biomarker_canonical , R, 235 lines, 2 matches_band_heatmap_plot.R - Figure Generation/
gait_biomarker_heatmap_p , R, 53 lines, 1 matchlot.R - helper_functions/
addEmptyData.m , MATLAB, 26 lines - helper_functions/
sortGaitEvents.m , MATLAB, 61 lines - README.md, Text, 4 lines
openmind-consortium.github.io
Availability: 1 check, the latest on 27 September 2026: the link is dead (HTTP 404)
- 27 September 2026: the link is dead (HTTP 404)
Code availability
Except for the biomarker identification code, all MATLAB, Python and R analysis code used to analyze and generate the main findings of this study will be made available at https://
Reproduced under the paper's license (CC BY), from the paper cited above.
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:
- 4 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 187 scripts, each with its path and the digest of its content;
- 18 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.
Data availability
Due to the inclusion of identifiable clinical and neurophysiological data from human participants, the data were subject to controlled access to protect participant privacy and comply with institutional and regulatory requirements. Requests for access should be directed to the corresponding author and will be reviewed within a reasonable timeframe (typically within 2–4 weeks), contingent on institutional approvals and data use agreements that restrict re-identification and redistribution. Requests will be reviewed based on scientific merit, ethical review and available resources. Following approved requests, de-identified individual patient data will be made available for reuse. The data used to generate the figures in this paper are available at https://
Reproduced under the paper's license (CC BY), 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 2, 28 September 2026
- Publisher: n/a → Nature Portfolio
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 9 authors, 4 keywords, 10 MeSH terms, 5 funders, 91 references.
Cite
This paper
Louie, K. H., Balakid, J. P., Bath, J. E., Song, S., Fekri Azgomi, H., Marks, J. H., Choi, J. T., Starr, P. A., & Wang, D. D. (2026). Adaptive deep brain stimulation for dynamic gait control in Parkinson's disease: a randomized feasibility trial. Nature medicine, 32(8), 2803-2814. https://
BibTeX
@article{louie2026adapti
author = {Louie, Kenneth H and Balakid, Jannine P and Bath, Jessica E and Song, Seongmi and Fekri Azgomi, Hamid and Marks, Jacob H and Choi, Julia T and Starr, Philip A and Wang, Doris D},
title = {{Adaptive deep brain stimulation for dynamic gait control in Parkinson's disease: a randomized feasibility trial}},
journal = {Nature medicine},
year = {2026},
month = jun,
volume = {32},
number = {8},
pages = {2803--2814},
publisher = {Nature Portfolio},
issn = {1078-8956},
doi = {10.1038/
url = {https://
pmid = {42297980},
pmcid = {PMC13473014}
}
RIS
TY - JOUR
AU - Louie, Kenneth H
AU - Balakid, Jannine P
AU - Bath, Jessica E
AU - Song, Seongmi
AU - Fekri Azgomi, Hamid
AU - Marks, Jacob H
AU - Choi, Julia T
AU - Starr, Philip A
AU - Wang, Doris D
TI - Adaptive deep brain stimulation for dynamic gait control in Parkinson's disease: a randomized feasibility trial
T2 - Nature medicine
J2 - Nat Med
PY - 2026
DA - 2026/
VL - 32
IS - 8
SP - 2803
EP - 2814
SN - 1078-8956
PB - Nature Portfolio
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"type": "article-journal",
"title": "Adaptive deep brain stimulation for dynamic gait control in Parkinson's disease: a randomized feasibility trial",
"container-title": "Nature medicine",
"author": [
{
"family": "Louie",
"given": "Kenneth H"
},
{
"family": "Balakid",
"given": "Jannine P"
},
{
"family": "Bath",
"given": "Jessica E"
},
{
"family": "Song",
"given": "Seongmi"
},
{
"family": "Fekri Azgomi",
"given": "Hamid"
},
{
"family": "Marks",
"given": "Jacob H"
},
{
"family": "Choi",
"given": "Julia T"
},
{
"family": "Starr",
"given": "Philip A"
},
{
"family": "Wang",
"given": "Doris D"
}
],
"container-title-short":
"volume": "32",
"issue": "8",
"page": "2803-2814",
"DOI": "10.1038/
"PMID": "42297980",
"PMCID": "PMC13473014",
"ISSN": "1078-8956",
"publisher": "Nature Portfolio",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
15
]
]
}
}
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/s41591-026-04432-4 [code]
- Activity-dependent adaptive deep brain stimulation improves gait in Parkinson's disease.Journal: Nature medicineIn common: scikit-learn, SciPy, Matplotlib, 1 other tool, Parkinson's, clinical / translational, 10 references
- [2] doi:10.1093/brain/awaf466 [code]
- Cortico-basal oscillations index naturalistic movements during deep brain stimulation.Journal: Brain : a journal of neurologyIn common: Parkinson's, 12 references
- [3] doi:10.1016/j.ebiom.2026.106293 [code]
- Dynamic neural states underpin motor symptom severity in Parkinson's disease: a longitudinal analysis of chronic cortico-subthalamic nucleus recordings.Journal: EBioMedicineIn common: pandas, SciPy, Matplotlib, 1 other tool, Parkinson's, 10 references
- [4] doi:10.1038/s44172-026-00688-3
- N2G calibrator: a cross-subject adversarial learning framework for neural signal-driven gait tracking in Parkinson's disease.Journal: Communications engineeringIn common: Parkinson's, 10 references
- [5] doi:10.1038/s41593-026-02228-w [code]
- Circuit response to neuromodulation characterized with simultaneous deep brain stimulation and precision neuroimaging in humans.Journal: Nature neuroscienceIn common: rstatix, emmeans, lmerTest, 7 other tools, Parkinson's, 2 references
- [6] doi:10.1093/braincomms/fcag245 [code]
- Reduced pre-movement subthalamic beta desynchronization marks motor deficit in Parkinson's disease.Journal: Brain communicationsIn common: Signal Processing Toolbox, Statistics and Machine Learning Toolbox, Parkinson's, 7 references
- [7] doi:10.1038/s41531-026-01421-9 [code]
- Cortico-pallidal beta dynamics underlie impaired turning in Parkinson's disease.Journal: NPJ Parkinson's diseaseIn common: Image Processing Toolbox, Signal Processing Toolbox, Statistics and Machine Learning Toolbox, Parkinson's, 6 references
- [8] doi:10.1038/s41531-026-01439-z [code]
- DBSsync: combining intracranial and multimodal data to investigate new biomarkers in Parkinson's disease.Journal: NPJ Parkinson's diseaseIn common: Signal Processing Toolbox, Statistics and Machine Learning Toolbox, pandas, 3 other tools, Parkinson's, clinical / translational, 4 references
- [9] doi:10.1016/j.nicl.2026.104012 [code]
- Structural-functional multilayer brain network properties and outcome of combined repetitive transcranial magnetic stimulation and psychotherapy for obsessive-compulsive disorder.Journal: NeuroImage. ClinicalIn common: rstatix, lmerTest, Image Processing Toolbox, 9 other tools
- [10] doi:10.1016/j.celrep.2026.117646 [code]
- Medial entorhinal-hippocampal desynchronization parallels the emergence of memory impairment in a mouse model of Alzheimer's disease pathology.Journal: Cell reportsIn common: rstatix, emmeans, lmerTest, 8 other tools
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: 4 repositories of the authors' code, each at its verified commit and with its license, 187 scripts, and 18 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:5e54e831c542d846…
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.
