Data from: Automatic learning mechanisms for flexible human locomotion
Data files
Mar 30, 2026 version files 19.16 MB
-
Automatic_mechanisms_flexible_locomotion.zip
19.11 MB
-
README.md
49.33 KB
Abstract
Movement flexibility and automaticity are necessary to successfully navigate different environments. When encountering difficult terrains such as a muddy trail, we can change how we step almost immediately so that we can continue walking. This flexibility comes at a cost since we initially must pay deliberate attention to how we are moving. Gradually, after a few minutes on the trail, stepping becomes automatic so that we do not need to think about our movements. Canonical theory indicates that different adaptive motor learning mechanisms confer these essential properties to movement: explicit control confers rapid flexibility, while forward model recalibration confers automaticity. Here, we uncover a distinct mechanism of treadmill walking adaptation – an automatic stimulus-response mapping – that confers both properties to movement. The mechanism is flexible as it learns stepping patterns that can be rapidly changed to suit a range of treadmill configurations. It is also automatic as it can operate without deliberate control or explicit awareness by the participants. Our findings reveal a tandem architecture of forward model recalibration and automatic stimulus-response mapping mechanisms for walking, reconciling different findings of motor adaptation and perceptual realignment.
General information
Paradigm information: Kinematic and behavioral test data were collected in a human walking experiment on a split-belt treadmill.
Source data
raw task data + standardly processed kinematic measures
Location: 'data' folder
Info: contains .mat data files with 'raw' kinematic measures and behavioral task measures for all participants in the study.
Data collection and preprocessing:
- Kinematic data were obtained from ankle marker data recorded at 100Hz with an Optotrak motion sensor (Northern Digital, Waterloo, ON, Canada).
- Data was filtered with a 4th-order Butterworth low-pass filter.
- Heel strike events were selected as the most anterior position of the foot in the gait cycle.
- Kinematic and behavioral measures were computed as explained in the manuscript.
Files: one file per experimental group
- RampDown.mat (group of Experiment 1)
- RampUpAndDown.mat (group of Experiment 2)
- ShortAscend.mat (group of Experiment 3; adaptation duration = 3min, perturbation = 1m/s abrupt, speed match version = ascend)
- MediumAscend.mat (group of Experiment 3; adaptation duration = 15min, perturbation = 1m/s abrupt, speed match version = ascend)
- LongAscend.mat (group of Experiment 3; adaptation duration = 30min, perturbation = 1m/s abrupt, speed match version = ascend)
- ShortDescend.mat (group of Experiment 3; adaptation duration = 3min, perturbation = 1m/s abrupt, speed match version = descend)
- MediumDescend.mat (group of Experiment 3; adaptation duration = 15min, perturbation = 1m/s abrupt, speed match version = descend)
- SmallAbrupt.mat (group of Experiment 3; adaptation duration = 15min, perturbation = 0.4m/s abrupt, speed match version = descend)
- SmallGradual.mat (group of Experiment 3; adaptation duration = 15min, perturbation = 0.4m/s gradual,speed match version = descend)
Variables: each group file contains a variable with the same name, which is a struct containing the following fields:
├─── Measures recorded once per experiment:
│ ├─── Trials: a struct array of length N, with N=number of experimental trials for this group. Contains fields:
│ │ ├─── Condition: string with corresponding experimental phase ('Baseline', 'Adaptation', 'Catch', 'Post-adaptation')
│ │ ├─── Task: string with information on whether the trial was a task, and which task
│ │ │ ('Speed Match Ascend','Speed Match Descend','RampUp','RampDown','RampUpAndDown';'-' is no task)
│ │ ├─── LeftSpeed: speed of the left belt in the trial
│ │ ├─── RightSpeed: speed of the right belt in the trial. The array indicates speed per stride.
│ │ │ Nan indicates a gradual or participant-controlled change in speed.
│ │ ├─── RSpeedMode: information on how the RightSpeed field is defined (constant / per stride / gradual / controlled by keyboard ...)
│ │ └─── Duration: duration in minutes of the trial. NaN if the trial duration varies between participants (trials by stride)
│ │
│ └─── Questionnaire: N Participants X 1 cell, each cell element contains the participant's response to the open-ended questionnaire
│ (Experiment 2 only)
│
├─── Kinematic measures computed by stride:
│ │ * each of the following fields is a (1 x N Trials) cell,\
│ │ with each cell element a (N Participants X N Strides in Trial) matrix,
│ │ with each element in the matrix a sample of that measure for the specific trial, participant, and stride)
│ │
│ ├─── StrideTime: time (in seconds) of the stride lead heel strike (stride start time)\
│ ├─── SLA: step length asymmetry (see Measure Definitions below)
│ ├─── Perturbation (see Measure Definitions below)
│ └─── MotorOutput (see Measure Definitions below)
|
├─── Timeseries measures at 1000Hz:
│ │ * each of the following fields is a (1 x N Trials) cell,
│ │ with each cell element a (N Participants X N timestamps - i.e., N of milliseconds - in Trial) matrix,
│ │ with each element in the matrix, a sample of that measure for the specific trial, participant, and timestamp
│ │ * These measures are only stored for the speed match and ramp tasks.
│ │ Because the timeseries of the right speed varies across participants, and it is a recorded variable,
│ │ Either because it is controlled by the participant with a keyboard or because it depends on the participant's stride frequency.
│ │ For other trials, when the right speed is controlled by us, refer to the Trials variable]
│ │
│ ├─── TaskTime: time stamp in seconds for the TaskRightSpeed measure
│ └─── TaskRightSpeed: speed of the right belt
│
├─── Measures recorded once per trial:
│ * Each of the following fields is a (1 x N Trials) cell,
│ with each cell element a (N Participants X 1 [Exp. 3] or X 2 [Exp. 1]) matrix,
│ with each element in the matrix a sample of that measure for the specific trial & participant.
│ * these measures are only stored for the speed match tasks of Experiment 3,
│ and Ramp tasks of Experiment 1, as these are the only perceptual tasks)
│
├─── TaskRightSpeedFinal: speed of the right belt at the end of each iteration of the speed match task (matrix with 1 column)
│ [groups of Experiment 3 only]
│
└─── TaskButtonPressStride: stride number on which participant pressed a button in the Ramp tasks
(matrix with 2 columns because each task has 2 button presses)
[Ramp Down group of Experiment 1 only]
Analysed data
Data obtained by processing source data with the code provided
Location: 'analyses' folder
Info: Contains .mat data files generated from the code and the source data provided in other folders.
Analysing data is an intermediate step to plotting figures and computing statistics
Files: [all files are saved with .mat extension, and contain only the homonymous variable (with one exception, see below)]
│
├─── [groupname]BootstrapSamples [x9]
│ * bootstrapped resamples - indexes of participants in each sample
│ * 10,000 x N Participants matrix, each row in a sample with 10 participants resampled with replacement from the group
│ * One file per group. The RampUpAndDown file additionally contains samples divided by subgroups, in variables:
│ RampUpAndDownBootstrapSamples_Asymmetric & RampUpAndDownBootstrapSamples_Symmetric
│
├─── [groupname]AdaptationOutput [x8]
│ * measures of adapted normalized motor and perceptual outputs (see Measure Definitions below)
│ * struct with fields: Motor, Perceptual
│ * each field: N Participants X 1 Array, with respective measure for that participant
│ * One file per group, except the RampUpAndDown (Exp. 2)
│
├─── RampDownFits [x1]
│ * measures related to model fits in Experiment 1
│ * 4x10 tables, each row is a model, and each column is a measure.
│ ├─ Rows: RecalibrationPlusMapping, DualState, MemoryOfErrors, OptimalControl
│ └─ Columns:
│ ├─ Function: function-defining model
│ ├─ InitialParameters, LowerBound, UpperBound, ConstraintA, ConstraintB: used for fitting with fmincon
│ ├─ Parameters: parameters that led to the best fit. 20xN Parameters matrix (each row has parameters for 1 participant)
│ ├─ Fits: motor output best fit by the model. 20x63 matrix, each row has fit for 1 participant, each column is a stride (datapoint)
│ └─ RSS, BIC: residual sum of squares and Bayesian Information Criterion.
│ A 20x1 matrix, each row has a value for 1 participant.
│
├─── RampDownPerceptualFits[x1]
│ * measures related to the perceptual model fits in Experiment 1
│ * table, each row is a model, and each column is a measure.
│ ├─ Rows: RecalibrationPlusMapping, PReMo, PEA, PMReMap
│ └─ Columns:
│ ├─ Function: function-defining model
│ ├─ InitialParameters, LowerBound, UpperBound, ConstraintA, ConstraintB: used for fitting with fmincon
│ ├─ Parameters: parameters that led to the best fit. 20xN Parameters matrix (each row has parameters for 1 participant)
│ ├─ Fits: motor output best fit by the model. 20x63 matrix, each row has fit for 1 participant, each column is a stride (datapoint)
│ ├─ PerceptFits: model estimate of perceived perturbation. 20x63 matrix, each row has fit for 1 participant, each column is a stride (datapoint)
│ ├─ Pse, PseStride: model estimate of Pse (point of subjective equality), and the corresponding task stride (when belts feel equal)
│ └─ RSS, BIC: residual sum of squares and Bayesian Information Criterion.
│ A 20x1 matrix, each row has a value for 1 participant.
│
├─── RampDownSLABySpeed [x1]
│ * measures related to SLA by Speed in Ramp Task of Exp. 1 (see Measure Definitions below)
│ * 3x2 cell:
│ ├─ Columns: Baseline Ramp Up Task (#1), Post-adapt. Ramp Down Task (#2)
│ └─ Rows:
│ ├─ (#1): SLA averaged over strides taken at the same speed.
│ │ 20 x NSpeed matrix. Each row is one participant, each column a speed in the task.
│ ├─ (#2): 95% confidence interval for 'group mean' statistic of SLA at each speed (bootstrapped)
│ │ 2 x NSpeed matrix. Row 1 is the lower bound and row is the upper bound of the CI.
│ └─ (#3): Confidence interval for alpha level corrected for multiple comparisons (structured like row 2)
│
├─── RampDown_Clustering [x1]
│ * outlier detection for participants in Exp. 1
│ * 4 variables: (for all variables, each row corresponds to each participant)
│ ├─ RampDown_Outliers: 20x1 double matrix, each row is -1 if participant is an outlier (1 otherwise)
│ ├─ RampUpAndDown_BaselineMean: 20x1 double matrix, mean of baseline (2-min block) SLA for each participant
│ ├─ RampUpAndDown_BaselineCI: 20x2 double matrix, 95% CI of baseline (2-min block) SLA for each participant (column 1 = lower bound, column 2 = upper bound)
│ └─ RampUpAndDown_NStrides: 20x1 double matrix, measure used for clustering for each participant (number of strides in Ramp Down above baseline CI)
│
├─── RampUpAndDown_SymmetricClassification [x1]
│ * subdivision of participants into subgroups in Exp. 2
│ * 4 variables: (for all variables, each row corresponds to each participant)
│ ├─ RampUpAndDown_SymmetricClassification: 20x1 logical matrix, each row is 'true' if participant assigned to 'structure-based' group ('false' for 'memory-based')
│ ├─ RampUpAndDown_BaselineMean: 20x1 double matrix, mean of baseline (2-min block) SLA for each participant
│ ├─ RampUpAndDown_BaselineCI: 20x2 double matrix, 95% CI of baseline (2-min block) SLA for each participant (column 1 = lower bound, column 2 = upper bound)
│ └─ RampUpAndDown_NStrides: 20x1 double matrix, measure used for clustering for each participant (number of strides in Ramp Up and Down teal portion below baseline CI)
│
├─── RampUpAndDownStridesToPlateau [x1]
│ * measures related to strides to plateau analysis of Exp. 2 (see Measure Definitions below)
│ * 20x3 cell:
│ ├─ Rows: each row has data for one participant
│ └─ Columns:
│ ├─ (#1): strides to plateau measure (scalar)
│ ├─ (#2): SLA Plateau range (mean +/- SD of last 30 strides) (1x2 array)
│ └─ (#3): Adaptation SLA timeseries (N Strides x 1)
|
├─── RampUpAndDownSLABySpeed [x1]
│ * measures related to SLA by Speed in Ramp Tasks of Exp. 2
│ * 3x3 cell:
│ ├─ Columns: Baseline Ramp Up Task (#1), Post-adapt. Ramp Up And Down Task teal portion (#2) and magenta portion (#3)
│ └─ Rows:
│ ├─ (#1): SLA averaged over strides taken at the same speed.
│ │ 20 x NSpeed matrix. Each row is one participant, each column a speed in the task.
│ ├─ (#2): 95% confidence interval for 'group mean' statistic of SLA at each speed (bootstrapped)
│ │ 2 x NSpeed matrix. Row 1 is the lower bound and row is the upper bound of CI.
│ └─ (#3): Confidence interval for alpha level corrected for multiple comparisons (structured like row 2)
│
├─── RampUpAndDownFits [x1]
│ * measures related to model fits in Experiment 2
│ * 2x10 table, each row is a model, and each column is a measure.
│ ├─ Rows: RecalibrationPlusMappingFlexible, DualState
│ └─ Columns:
│ ├─ Function: function-defining model
│ ├─ InitialParameters, LowerBound, UpperBound, ConstraintA, ConstraintB: used for fitting with fmincon
│ ├─ Parameters: parameters that led to the best fit. 20xN Parameters matrix (each row has parameters for 1 participant)
│ ├─ Fits: motor output best fit by the model. 20x63 matrix, each row has fit for 1 participant, each column is a stride (datapoint)
│ └─ RSS, BIC: residual sum of squares and Bayesian Information Criterion.
│ A 20x1 matrix, each row has a value for 1 participant.
│
└─── [groupname]InterpolatedTask [x7]
* interpolated SLA vs Speed for first post-adaptation speed match task (see Measure Definitions below)
* struct with fields:
├─ SLA: 10 x N Query Points matrix. Interpolated SLA values for each query speed for each participant.
│ Each row has data for one participant. Each column is a query speed.
└─ Speed: 1 x N Query Points matrix. Query speed points.
Each column is a query speed.
* One file per group of Experiment 3
Stats
.csv files with computed stats
Location: 'stats' folder
Info: Contains .csv files for selected statistical comparisons (involving a large number of results / presented in tables; other stats are included in figure generation)
Files: [all files are saved with .csv extension]
│
├─── E1_RampsSymmetricSpeeds.csv
│ * comparison to zero of SLA for each Ramp task speed ('group mean' statistic, through bootstrapping)
│ * Rows: 2-8 are baseline, 9-29 are post-adapt Ramp
│ * Columns:
│ ├─ 1) Period (baseline, post-adapt)
│ ├─ 2) Mean: of the distribution
│ ├─ 3) 95% confidence interval
│ ├─ 4) Confidence interval with alpha level corrected for multiple comparisons
│ └─ 5) Corrected alpha level
|
├─── E1_FitsComparisons.csv
│ * comparison of BIC between models used to fit Ramp Down motor output in Experiment 1
│ (statistic: difference between the means of BIC Other Model - BIC RecalibrationPlusMapping, compare CI to zero, through bootstrapping)
│ * Rows:
│ ├─ 1) DualState - RecalibrationPlusMapping
│ ├─ 2) MemoryOfErrors - RecalibrationPlusMapping
│ ├─ 3) OptimalControl - RecalibrationPlusMapping
│ ├─ 4) PEA - RecalibrationPlusMapping
│ ├─ 5) PM-ReMap - RecalibrationPlusMapping
│ └─ 6) PReMo - RecalibrationPlusMapping
│ * Columns:
│ ├─ 1) Model for comparison
│ ├─ 2) Mean: of the distribution
│ ├─ 3-4) 95% confidence interval
│ ├─ 5-6) Confidence interval with alpha level corrected for multiple comparisons
│ └─ 7) Corrected alpha level
│
├─── E1_PerceptMotorComparisons.csv
│ * comparison of motor and perceptual measures for Experiment 1 (see Measure Definitions below)
│ * Rows:
│ ├─ 1) Column title
│ ├─ 2) Motor AdaptExtent %: AdaptExtent_norm
│ ├─ 3) Motor r %: r_norm
│ ├─ 4) PMReMap PSE %: PSE estimate from PM-ReMap model
│ ├─ 5) Percept 1 %: PSE_norm from 1st button press
│ ├─ 6) Percept 2 %: PSE_norm from 2nd button press
│ ├─ 7) Motor AdaptExtent % - Percept 1 %: AdaptExtent_norm - PSE_norm, 1st button press
│ ├─ 8) Motor AdaptExtent % - Percept 2 %: AdaptExtent_norm - PSE_norm, 2nd button press
│ ├─ 9) Motor r % - Percept 1 %: r_norm - PSE_norm, 1st button press
│ ├─ 10) Motor r % - Percept 2 %: r_norm - PSE_norm, 1st button press
│ ├─ 11) PMReMap PSE % - Percept 1 %: PM-ReMap PSE estimate - PSE_norm, 1st button press
│ └─ 12) PMReMap PSE % - Percept 2 %: PM-ReMap PSE estimate - PSE_norm, 1st button press
│ * Columns:
│ ├─ 1) Measure Name (that explained in the rows above)
│ ├─ 2) Mean: of the distribution
│ └─ 3) SEM or CI: standard error of the mean (when a single value reported) or Confidence interval [Lower bound, Upper bound] (alpha=0.05 corrected for multiple comparisons)
│
├─── E1_Clustering.csv, E2_Clustering.csv
│ * computation of clustering measure (within-participant) and cluster assignment, Exp. 1 and 2
│ * Rows: each row is a participant
│ * Columns:
│ ├─ 1) mean [95% CI] of measure, within-participant
│ ├─ 2) Clustering measure = #strides > CI (Exp. 1) or #strides < CI (Exp. 2), number of strides in ramp task (Ramp Down / teal portion of Ramp Up and Down) above/below baseline CI of same participant
│ └─ 3) Cluster assignment: Exp 1, -1=outlier, 1=not outlier; Exp 2, 1=structure, 0=memory
│
├─── E1_OutlierValidation.csv
│ * recomputation of Exp. 1 stats, removing outliers
│ * Rows: each row is a measure
│ * Columns:
│ ├─ 1) measure definition
│ └─ 2) statistical results: mean [95% CI] {corrected CI}, or r and p for Pearson correlation
│
├─── E2_SubgroupsComparisons.csv
│ * comparison of strides to plateau, and clustering measures, between Structure and Memory subgroups (see Measure Definitions below)
│ * Rows:
│ ├─ 1) Strides to Plateau
│ └─ 2) Clustering Measure (number of strides in Ramp Up and Down teal portion below baseline CI)
│ * Columns:
│ ├─ 1) Measure Name (that explained in the rows above)
│ ├─ 2) group difference mean [CI]: mean [confidence interval] of the distribution of the difference between the means between the Structure and Memory subgroups
│ ├─ 3) Asym Range: range [lower bound, upper bound] of measure for Memory subgroup
│ └─ 4) Symm Range: range [lower bound, upper bound] of measure for the Structure subgroup
│
├─── E2_RampsSymmetricSpeeds.csv
│ * comparison to zero of SLA for each Ramp task speed ('group mean' statistic', through bootstrapping)
│ * Rows: 2-8 are baseline, 9-28 are Teal portion of post-adapt Ramp, 29-49 are Magenta portion of post-adapt Ramp
│ * Columns:
│ ├─ 1) Period (baseline, post-adapt teal and magenta)
│ ├─ 2) Mean: of the distribution
│ ├─ 3) 95% confidence interval
│ ├─ 4) Confidence interval with alpha level corrected for multiple comparisons
│ ├─ 5) Corrected alpha level
│ └─ 6) Speed difference
│
├─── EC_SpeedMatchSLA.csv
│ * SLA in the first and last stride in speed match task (1st post-adapt task), CI, and comparison to zero, within-group, for Control Experiments
│ * Rows: each row is a Control Experiment; Rows 1-7 = 1st stride, Rows 8-14 = last stride in speed match task
│ * Columns:
│ ├─ 1) Group Name
│ ├─ 2) Mean: of the distribution
│ ├─ 3) 95% confidence interval
│ ├─ 4) Confidence interval with alpha level corrected for multiple comparisons
│ └─ 5) Corrected alpha level
│
├─── EC_RampMediumPerceptComparison.csv
│ * comparison of PSE between selected Control Experiments and Experiment 1
│ (statistic: difference between group means = PSE_Experiment1_mean - PSE_ControlExperiment_mean, compare CI to zero, through bootstrapping)
│ * Rows: each row is a Control Experiment
│ * Columns:
│ ├─ 1) Group Name
│ ├─ 2) Mean: of distribution
│ ├─ 3) 95% confidence interval
│ ├─ 4) Confidence interval with alpha level corrected for multiple comparisons
│ └─ 5) Corrected alpha level
│
├─── EC_Within_MotorMinusPercept.csv
│ * comparison of motor and perceptual outputs within-group for Control Experiments
│ (statistic: group mean of the difference motor output - perceptual output (normalized), compare CI to zero, through bootstrapping)
│ * Rows: each row is a Control Experiment
│ * Columns:
│ ├─ 1) Group Name
│ ├─ 2) Mean: of the distribution
│ ├─ 3) 95% confidence interval
│ ├─ 4) Confidence interval with alpha level corrected for multiple comparisons
│ └─ 5) Corrected alpha level
│
├─── EC_Within_MotorAdaptExtent.csv
│ * comparison of AdaptExtent_norm (extent of adaptation, normalized) to 100%, within-group, for Control Experiments
│ * Rows: each row is a Control Experiment
│ * Columns:
│ ├─ 1) Group Name
│ ├─ 2) Mean: of the distribution
│ ├─ 3) 95% confidence interval
│ ├─ 4) Confidence interval with alpha level corrected for multiple comparisons
│ └─ 5) Corrected alpha level
│
├─── EC_Savings.csv
│ * within-group comparison of motor and perceptual outputs during washout
│ (statistic: group mean of the difference motor output - perceptual output (normalized), compare CI to zero, through bootstrapping)
│ (statistic computed at 6 time points corresponding to the 6 post-adaptation speed match tasks)
│ (motor output: SLA at tied-belt in the task, obtained through interpolation; perceptual output: percept. realignment at the end of the task)
│ (for Groups: Short Ascend, Medium Ascend, Long Ascend) Comparison of AdaptExtent_norm (extent of adaptation, normalized) to 100%, within-group, for Control Experiments
│ * Rows: each row is a time point
│ * Columns:
│ ├─ 1) Minutes post-adapt for this time point
│ ├─ 2) Mean: of distribution (Short Ascend)
│ ├─ 3) 95% confidence interval (Short Ascend)
│ ├─ 4) Confidence interval with alpha level corrected for multiple comparisons (Short Ascend)
│ ├─ 5-7) same as col 2-4 but for Medium Ascend
│ └─ 8-10) same as col 2-4 but for Long Ascend
│
├─── EC_Between_MotorAdaptExtent.csv
│ * comparison of AdaptExtent_norm (extent of adaptation, normalized) between-groups for selected Control Experiments
│ (statistic: difference between group means = AdaptExtent_norm_group1mean - AdaptExtent_norm_group2mean , compare CI to zero, through bootstrapping)
│ * Rows: each row is a comparison between two groups
│ * Columns:
│ ├─ 1) Group 1 Name - Group 2 Name
│ ├─ 2) Mean: of the distribution
│ ├─ 3) 95% confidence interval
│ ├─ 4) Confidence interval with alpha level corrected for multiple comparisons
│ └─ 5) Corrected alpha level
│
└─── EC_Between_PerceptOverMotor.csv
* comparison of relative recalibration contribution between groups for selected Control Experiments
(statistic: difference between group means = recalibration_group1mean - recalibration_group2mean , compare CI to zero, through bootstrapping)
* Rows: each row is a comparison between two groups
* Columns:
├─ 1) Group 1 Name - Group 2 Name
├─ 2) Mean: of the distribution
├─ 3) 95% confidence interval
├─ 4) Confidence interval with alpha level corrected for multiple comparisons
└─ 5) Corrected alpha level
Code
Location: 'code' folder
Info: Contains .m code files for data analysis [all files are saved with .m extension]
Files:
->Main File: "RunAll.m" calls all files in the correct order
->Files used for Background Computations (computing .mat files in analyses folder):
│
├─── E12C_bootstrapSamples.m
│ ├─ Experiments 1, 2, and Controls. Run before any bootstrap analysis.
│ ├─ creates bootstrap samples of participants for each group
│ │ (10,000 samples of N participants, N=group size)
│ └─ Output: .mat file with participants' indexes for each bootstrap sample
│ in analyses[groupname]BootstrapSamples.mat
│
├─── E1C_ComputeOutputMeasures.m
│ ├─ Experiments 1 and Controls.
│ ├─ Creates measures of adapted motor and perceptual outputs (as % of perturbation size), for each group
│ │ (Adapted motor output [%] = motor output perturbation @ adaptation plateau - last 30 strides)
│ │ (Adapted perceptual output [%] = speed difference that feels equal - from percept. task immediately after adaptation/adaptation speed difference)
│ └─ Output: .mat file with [groupname]AdaptationOutput struct, with fields Motor and Perceptual
│ in analyses[groupname]AdaptationOutput.mat
|
├─── E1_ModelFits.m
│ ├─ Experiment 1
│ ├─ Computes fits of E1 Ramp Down motor output data
│ │ (individually per subject; Models: Recalibration+Mapping, Recalibration-Only, Mapping-Only, Dual-State)
│ └─ Output: .mat file with fits info (including fitted motor output, parameters, BIC)
│ in analyses\RampDownFits.mat
|
├─── E1_PerceptualModelsFits.m
│ ├─ Experiment 1
│ ├─ Computes fits of E1 Ramp Down motor & perceptual output data using perceptual models
│ │ (individually per subject; Models: Recalibration+Mapping, PReMo, PEA, PM-ReMap)
│ └─ Output: .mat file with fits info (including fitted motor output, parameters, BIC)
│ in analyses\RampDownPerceptualFits.mat
│
├─── E1_support_optimalControlModel.m
│ ├─ Experiment 1
│ ├─ Support function for E1_ModelFits.m
│ └─ Contains an optimal control model
|
├─── E1_SLASymmetryRamps.m
│ ├─ Experiment 1
│ ├─ Evaluates which speeds in the Ramp Up (BL) and Ramp Down (post-adapt) tasks lead to SLA significantly different from zero
│ ├─ Output #1: .csv file with stats: confidence intervals (95% and multiple-comparison corrected) for SLA mean for each speed in each task
│ │ in stats\E1_RampsSymmetricSpeeds.csv
│ └─ Output #2: .mat file with SLA in Ramp tasks averaged for strides taken at the same speed, and with 95% and corrected CI for SLA mean for each speed in each task
│ in analyses\RampDownSLABySpeed.mat
│
├─── E2_StridesToPlateau.m
│ ├─ Experiment 2. Computes Strides to Plateau measure
│ └─ Output: .mat file with strides to plateau, plateauRange, sla data in adaptation for each participant
│ in analyses\RampUpAndDownStridesToPlateau.mat
│
├─── E2_ModelFits.m
│ ├─ Experiment 2. Computes model fits for step length asymmetry in the Ramp Up & Down
│ └─ Output: .mat file with fits, in analyses\RampUpAndDownFits.mat
│
├─── E2_SLASymmetryRamps.m
│ ├─ Experiment 2
│ ├─ Evaluates which speeds in the Ramp Up (BL) and Ramp Up And Down (post-adapt) tasks lead to SLA significantly different from zero
│ ├─ Output #1: .csv file with stats: confidence intervals (95% and multiple-comparison corrected) for SLA mean for each speed in each task
│ │ in stats\E2_RampsSymmetricSpeeds.csv
│ └─ Output #2: .mat file with SLA in Ramp tasks averaged for strides taken at the same speed, and with 95% and corrected CI for SLA mean for each speed in each task
│ in analyses\RampUpAndDownSLABySpeed.mat
│
└─── EC_SLAInterpolation.m
├─ Control Experiments
├─ computes interpolation of SLA as a function of speed difference in first post-adaptation speed match task, for each group
└─ Output: .mat file that has a struct with fields:
interpolatedSLA: matrix, N Subjects X N Interpolated Points, with interpolated SLA
interpolatedSpeed: vector, 1 X N Interpolated Points, with query speed differences used for interpolation
in analyses[groupname]InterpolatedTask.mat
->Files used for Clustering Analysis (related analyses/figures/statistics):
├─── E12_ClusteringAnalysis.m
│ ├─ Experiment 1&2.
│ ├─ Test if participants should be divided into subgroups and create subgroups
│ │ (based on individual participants' step length asymmetry during the post-adaptation Ramp Task,
│ │ How does it compare to their own baseline asymmetry?
│ ├─ Procedure: for each participant: Computes 95% CI of the mean baseline SL Asym. (2-min block)
│ │ for E1 participants, counts the number of strides in post-adapt Ramp Down that are above CI (aftereffect)
│ │ for E2 participants, counts the number of strides in the first portion of the Ramp task post-adapt,
│ │ the portion with the right speed greater than adaptation, that are below CI
│ ├─ Output #1. Fig. S9. Computes clusters for E1 and E2 (for E1, main cluster analysis)
│ │ .mat file with logical flag for whether participant is symmetric
│ │ in analyses\RampUpAndDown_SymmetricClassification.mat
│ ├─ Output #2. Fig. S10. SE1 Validation, computes clusters based on other measures
│ └─ Output #3. E1 Validation, re-computes all statistics without outliers from main clustering analysis,
│ saves .csv file with stats
│ in stats\E1_OutlierValidation[measure name].csv
│
└─── E2_bootstrapParticipants_RampUpDownSubgroups.m
├─ Experiment 2. Run before bootstrap analysis by subgroup.
├─ Creates bootstrap samples of participants for each subgroup of Ramp Up and Down
│ (10,000 samples of N participants, N=subgroup size)
└─ Output: .mat file with participants' indexes for each bootstrap sample
in analyses\RampUpAndDownBootstrapSamples.mat\
variables: RampUpAndDownBootstrapSamples_Asymmetric, RampUpAndDownBootstrapSamples_Symmetric
->Files used for Figures and Stats:
│
├───EC_PreAnalysisForRampDownDesign.m
│ ├─ Pre-Analysis for Experiment 1 Design
│ │ (related to Paper Supplement "Ramp Down design")
│ └─ Outputs: printed text
│
├─── E1_StatsAndPlots.m
│ ├─ Experiment 1 plots and stats
│ │
│ └─ Outputs:
│ Output #1. Fig. 2A. SLA Timeseries
│ Output #2. Fig. 2B, S2 and S6. SLA in Ramp Tasks
│ Output #3. Fig. 3A and 4A. Motor Output and Perturbation plot, with perception
│ Output #4. Fig. 3, 4A, and 5. Plots of Ramp Down Motor Output Fits by Motor and Perceptual Models
│ Output #5. Fig. 3 and 5 bar insets, and stats (in stats\E1_FitsComparisons.csv). BIC comparisons between fits of E1 Ramp Down data
│ Output #6. Fig. S4 and S5. Individual Fits + Adaptation Plateau Bar Plot
│ Output #7: Fig. 4B. Figure with error bars for: tot adapted motor output, 'r' recalibration portion of motor output, 2x perceptual output (all normalized)
│ Output #8: Stats (in stats\E1_PerceptMotorComparisons.csv). PSE comparison to AdaptExtent,r, and PSE estimate from PEA, PREMO, PMREMAP
│ Output #9: Fig. 4C-D and 5D, and stats in title. Correlations between perceptual measures/parameters from model fits
│ ('r' from recal+map, 'PSE^' and '\eta_p' from PM-ReMap) and perceptual outputs (2 button presses)
│
├─── E1_PerceptualModelsSimulations
│ ├─ Experiment 1, Supplementary Simulations Figures
│ │ (related to Supplement paper section "Evaluation and development of perceptual models")
│ └─ Outputs: Fig S7-S8
│
├─── E12_VarianceAnalysis
│ ├─ Experiment 1 and 2
│ │ (Analyses residual variance of Step Length Asymmetry at the start and end of adaptation,
│ │ and the decay between the two data points. Residual Variance: after subtraction of the double exponential model fit)
│ └─ Outputs:
│ Output #1. Fig. S3. E1 Residual Variance at adapt start, end, and decay
│ Output #2. Fig. S16. E2 Residual Variance at adapt start, end, and decay, separate by subgroup
│ Output #3. Stats in figure titles
│
├─── E2_StatsAndPlots.m
│ ├─ Experiment 2 plots and stats
│ │
│ └─ Outputs:
│ Output #1. Fig. 9B. SLA Timeseries
│ Output #2. Fig. 9C, D, E. SLA in Ramp Tasks
│ Output #3. Fig. S11. Individual SLA First Portion of Ramp Up and Down task.
│ Output #4. Fig. S14. Individual SLA during adaptation with plateau range and strides to plateau.
│ Output #5. Fig. S15. Strides to plateau comparison between two subgroups. With Stats (stats\E2_SubgroupsComparisons.csv)
│ Output #6. Fig. 9D-E Insets. Plots and computes stats on E2 measures related to clustering (stats\E2_SubgroupsComparisons.csv)
│ Output #7. Fig. S10A-B. Plots of Ramp Up & Down Fits: dual state versus flexible recalibration + mapping.
│ Output #8: Fig. S10C and stats. BIC comparisons between fits of E2 Ramp Up and Down magenta portion data
│ Output #9: Fig. S9C and stats. Correlation between the E2 Ramp Up and Down cyan portion and magenta portion that was symmetric in E1
│
├─── E2_Savings.m
│ ├─ Control Experiments, Analysis of decay of motor and perceptual aftereffects during washout
│ │
│ └─ Outputs:
│ Output #1. Fig. 8B. Motor and Perceptual aftereffects washout time course
│ Output #2. Stats in "stats\EC_Savings.csv"
│
└─── EC_StatsAndPlots.m
├─ Control Experiments plots and stats
│
└─ Outputs:
Output #1: Stats for within-group comparisons (motor-perceptual outputs, stats\EC_Within_MotorMinusPercept.csv ; AdaptExtent to 100%, stats\EC_Within_MotorAdaptExtent.csv )
Output #2: Stats for comparisons between selected groups (Relative Recalibration Contribution, stats\EC_Between_MotorOverPercept.csv; AadptExtent, EC_Between_MotorAdaptExtent.csv)
Output #3: Plots for Fig. 7A, 8A. Errorbars for Motor & Perceptual output (Fig. 7A) and Relative Recalibration Contribution (Fig. 8A)
Output #4: Stats & Plots for evaluation of first and last stride SLA in task (stats\EC_SpeedMatchSLA.csv and Fig. 7B, inset)
Output #5: Stats for percept comparisons between E1 Ramp Down and Medium Ascend or Descend (stats\EC_RampMediumPerceptComparison.csv)
Output #6. Fig. 7B. Interpolated SLA as a function of Speed Difference Timeseries, first post-adapt. Speed Match Task
Output #7. Box 2 Figure. MediumAscend baseline and post-adapt task, speeds, and SLA
->Files used for Response to Reviewers and Internal checks only:
│
├─── Reviews_E1_AdditionallModelsFits.m
│ └─ Experiment 1: computes fits of E1 Ramp Down motor output data using additional functions, for response to reviewers
│
└─── Reviews_E1_ModelFits_RFormatEquivalence.m
└─ Experiment 1: computes recalibration + mapping model fits using two equivalent formats of 'r' parameter to demonstrate they are equivalent (sanity check)
->Background helper files (in "lib" folder):
├─── bardata.m
├─── bootstrapMean.m
├─── bootstrapMeanDifference.m
├─── bootstrappedCI.m
├─── cancat.m
├─── catp.m
├─── ccc.m
├─── clearbut.m
├─── closebut.m
├─── containsw.m
├─── correl.m
├─── eachfun.m
├─── evarargin.m
├─── filldata.m
├─── findn.m
├─── getCI.m
├─── getCorrectedAlpha.m
├─── inrange.m
├─── nn.m
├─── numericClasses.m
├─── plotBackgroundColor.m
├─── plotdistrib.m
├─── sem.m
├─── setnox.m
├─── speedDifferenceColor.m
├─── tablec.m
└─── var2string.m
Measure definitions
Stride Events:
-> stride = period from a left heel strike to the subsequent left heel strike
-> RHS = right heel strike
-> LHS = left heel strike
-> LHS1, LHS2 = first and second left heel strikes in stride
Kinematic Measures:
-> stride length = (fast step length + slow step length)
-> mean step time = (right step time + left step time) / 2
-> mean step velocity = (right step velocity + left step velocity) / 2
-> SLA: step length asymmetry = (fast step length - slow step length)/stride length
-> Perturbation = (mean step time) / (stride length) * (right step velocity - left step velocity)
-> Delta Step Position = (right step position at RHS - left step position at LHS1) - (left step position at LHS2 - right step position at RHS)
-> Delta Step Time = (right step time - left step time)
-> MotorOutput: Delta Motor Output = (Delta Step Position) / (stride length) - (mean step velocity) / (stride length) * (Delta Step Time)
Motor Learning Measures:
-> u_plateau = AdaptExtent = mean(Delta Motor Output) over the last 30 strides in adaptation
-> p_plateau = mean(Perturbation) over the last 30 strides in adaptation
-> AdaptationOutput-Motor = AdaptExtent_norm = compensation_motorTotal = u_plateau / p_plateau
-> Strides to Plateau = number of strides in adaptation that it took to reach plateau step length asymmetry
---> 1) take individual participant step length asymmetry in adaptation
---> 2) smooth with a 5-point moving average filter
---> 3) calculate “plateau range” = mean ± 1SD of the last 30 strides of adaptation
---> 4) Strides to Plateau = number of strides till five consecutive strides fall within the “plateau range.”
Perceptual Learning Measures:
-> PSE = point of subjective equality = (right belt speed - left belt speed) @ time of button press
-> AdaptationOutput-Perceptual = PSE_norm = compensation_perceptual = PSE / (1m/s) [%]
-> Percept 1 % = PSE_norm upper bound, recorded from 1st button press
-> Percept 2 % = PSE_norm lower bound, recorded from 2nd button press
Model Fits Measures:
-> r = parameter of PM-ReMap model
-> Motor r % = r_norm = compensation_motorRecalibration = r / p_plateau
-> PMReMap PSE % = PSE estimate from PM-ReMap model
Software
The dataset uses MATLAB (data: .mat extension, code: .m extension). (MATLAB. (2022). Version R2022b. Natick, Massachusetts: The MathWorks Inc. https://www.mathworks.com/products/matlab.html.
Alternative open-source programs include GNU Octave. (John W. Eaton, David Bateman, Søren Hauberg, Rik Wehbring, 2019). GNU Octave version 5.2.0 manual: a high-level interactive language for numerical computations. URL https://www.gnu.org/software/octave/doc/v5.2.0/)
Human subjects data
This dataset does not contain any personally identifiable information. The data has been de-identified: the dataset only contains kinematic data and results of sensory tests. We received explicit written authorization from all participants to use, disclose, and make the information collected in this study available to people and agencies inside and outside of Johns Hopkins in accordance to privacy rules.
110 participants walked on a split-belt treadmill (Woodway, Waukesha, WI) with two separate belts. The speed of each belt was independently controlled using a custom-written Python program in the Vizard (WorldViz) development environment.
Kinematic measures were computed from motion capture data collected at 100Hz with Optotrak (Northern Digital, Waterloo, ON, Canada) using infrared-emitting markers were placed bilaterally over the ankle (lateral malleolus). Marker data was filtered with a 4th-order Butterworth low-pass filter, and heel strike events were selected as the most anterior position of the foot in the gait cycle using standard analyses. Kinematic measures of step length asymmetry, motor output, and perturbation were computed with standard equations described in the manuscript.
Perceptual measures were obtained with perceptual tasks to measure the belt speed difference perceived as "equal speeds" after adaptation. We used different tasks based on the method of adjustment and the method of limits; these are described in the manuscript.
