User Tools

Site Tools


sift:tutorials:openbiomechanics_project:global_gait_measures_for_marathon_runners

Sanford Stride Project : Incorporating Running Kinematics for Marathon Runners with Survey Data

Biomechanics research increasingly integrates motion capture with self-reported training and injury data to study running performance and injury risk. Recently, the Sanford Stride Project collected markerless motion capture data for marathon runners (at 21st mile) and combined it with a self-reported training and injury survey, providing an open resource for studying biomechanics and injury risk.

This tutorial demonstrates how to process and analyze these data using Sift, including performing statistical comparison for biomechanical signals. We show how to compute Global Gait Asymmetry (GGA) metrics, and perform Statistical parameter mapping (SPM) to compare Group participants based on self-reported experience and injury history.


Data

In this tutorial, we will be using the public dataset by Bond, Colin. (2025). Sanford Stride Project. the dataset consists of markerless motion capture and self-reported survey results of (e.g., previous injuries, years of experience, training history). We made a preprocessed version available to download here. The original dataset source can be found on the Sanford Stride Project's Github page.


NOTE: To simplify the tutorial, If you want to skip to the Sift analysis portion of this tutorial, you can download the prepared Sanford_CMZ.zip folder and then skip to the section bellow on this page: 3. Loading Data to Sift. If you want to use or modify the pre-made pipeline, continue with the steps below.


2. Processing Data in Visual3D

Step1: Download the Sanford_Marathon_Dataset.zip folder. You will be provided with a folder named Sanford_Marathon_Dataset which include the following:

  • Data/: directory contains individual .c3d files for each participant.
  • .v3s: two pre-made pipeline files: main_pipeline.v3s and kinematics_events_pipeline.v3s. we will use them for loading the survey results, calculating the link-model-based signals, and building the .cmz files.
  • Sheets/SanfordStrideProject_SiouxFallsMarathon2025.xlsx: Contains the Sanford Stride Project survey data, preprocessing and definitions. This file is provided for your reference and inspection of the survey data.

Step2:

  • Open visual3d and Click on the pipeline icon on the top-left tool bar.
  • Click on Open Pipeline and select the main_pipeline.v3s to load the commands into visual3d as shown in the image. NOTE: there is no need to run kinematics_events_pipeline.v3s, since this file is being called by main_pipeline.v3s internally.

Step3: NOTE: before executing the pipeline, you need to make a single modification to main_pipeline.v3s, to specify the correct directory path of the main project folder, that includes both /data directory, and kinematics_events_pipeline.v3s file (e.g., C:/User/mypc/Downloads/Sanford_Marathon_Dataset)

  • Scroll-up to the first pipeline command
  • select Set_Pipeline_Parameter.
  • Click Edit
  • replace the placeholder of [INSERT_PATH_HERE] to the main directory of the project.
Set_Pipeline_Parameter
/PARAMETER_NAME=ROOT_FOLDER_PATH
/PARAMETER_VALUE= [INSERT_PATH_HERE]
! /PARAMETER_VALUE_SEARCH_FOR=
! /PARAMETER_VALUE_REPLACE_WITH=
! /PARAMETER_VALUE_PREFIX=
! /PARAMETER_VALUE_APPEND=
! /MULTI_PASS=FALSE
;

Step4: Click Execute Pipeline to run all commands

Note: Execution may take approximately 1 minute.

If all steps were completed successfully, a dialog box will appear showing the logs with 0 Errors and 0 Warnings in the top toolbar.


3. Loading Data into Sift

Open SIFT, Use the load library dialog to load the CMZ workspaces into Sift.


Assessing Global Gait Asymmetry

Global Gait Asymmetry and the Linear Global Gait Asymmetry (LGGA) measure were developed to derive a single biofeedback metric for assessing gait asymmetry.

In the main toolbar, click the Gait Scores icon to open the GGA settings dialog.

Ensure the following options are selected:

  • Signal Folder: ORIGINAL
  • Left Cycle Event: LEFT_MIDSTANCE
  • Right Cycle Event: RIGHT_MIDSTANCE
  • Left Signals (multi select): Left_ankle_angles, Left_hip_angles, Left_knee_angles
  • Right Signals (multi select): (automatically selects the reflected right-side signals)

Click Compute LGGA

In the Explore tab on the left, you will see two queries for LGGA and LGGA_Components


1. LGGA for different Experience Level

We aim to incorporate metrics (from the survey data) with our analysis for the GGA, particularly, the number of years of running experience (0-6 years). We can use such data to statistically test whether Gait Asymmetry is significantly different between low experience runners and high experienced runners.

First, we need to divide LGGA query into 2 separate queries (LGGA_Low experience, LGGA_high_experience)

  1. In the explore tab, click Query builder
  2. Select LGGA from the Queries list, Right click on LGGA and select Edit
  3. Modify the Query Name LGGA_Low_Experience, and click Save
  4. Edit the LGGA_Low_Experience condition
    1. Go to the Refinements tab
    2. Check Refine using signal.
    3. Click + Add
    4. You will be prompted with a dialogue for the Signal
      • Refinement Name : Low_Experience
      • Type : METRIC
      • Folder : SURVEY_DATA
      • Name : Experience
      • Component: X
      • Value Must Be: Between (Min: 0, Max: 3)
      • Click Save
    5. Click Save.

To create another query for the high experienced group, we can speed the process by duplicating and renaming the existing query, and modifying the Low_Experience refinement to High Experience

  1. From the Queries list, Right click on the LGGA_Low_Experience query, and Select Duplicate
  2. Edit the Query Name from LGGA_Low_Experience_v1 to: LGGA_High_Experience, and click save.
  3. Modify the condition on the new duplicated LGGA_High_Experience query.
  4. Go to Refinements
  5. Right click on the Low_Experience at the Refinements section, select Modify.
    • Change The refinements name from High_Experience to Low_Experience
    • Value Must Be: Between (Min: 4, Max: 6)
    • Click Save
  6. Click Save
  7. Click Calculate All Queries

We can visualize the newly added condition using Metric plot

  1. From the Explore tab, select Plot Type to Metric plot
  2. From the Groups section, multi-select both LGGA_Low_Experience and LGGA_High_Experience (Hold CTRL button on the keyboard, and Select both).
  3. Make sure Select All Workspaces and Plot All Trackes are Checked
  4. Click Data Styles from the plot Options, Choose, Display Styles From.. Groups
  5. select any one of “LGGA_Low_Experience, and LGGA_High_Experience” and change the Color.

Finally, We can visualize the difference between participants with [0-3] years of experience (On the left with blue) with participants with [4-6] years of experience.


2. Statistical testing for LGGA

To statistically test whether there is a significant difference between the two groups, In this example, we will use unpaired student-t test to compare between both groups mean.

From the top menu bar on the right, click the start icon . You will be prompted with the statisitical summary window

  • Statistical Test: Two Sample T-Test
  • Significance Level: 0.2
  • Group: Select both (LGGA_Low_Experience, LGGA_High_Experience)
  • Check Use All Workspace
  • Click Compute State Test.

3. Results for LGGA

Test Results

  • Degrees of Freedom: 27
  • Pooled Standard Deviation: 18.08
  • T Stat: 0.22
  • Do Not Reject Null Hypothesis

The t-statistic (T Stat) measures how large the difference is between two group means relative to the variation within the data. If the results of the T static is a large negative value, this indicates that the mean of Group 1 (i.e., LGGA_Low_Experience) is lower than Group 2 (i.e., LGGA_High_Experience)

If the T Stat Value near 0, indicates that the group means are very similar (i.e., likely no meaningful difference).

In contrast, if the T-stat is a Large positive value, this indicates that Group 1 mean is higher than Group 2.

In this particular example, there is approximately 0.22 difference between the low experience runners and the high experience runners.

The results indicate there is no significant difference in LGGA between low- and high-experience runners, so we do not reject the null hypothesis since the T value is less than the significant threshold.


Comparing Joint Angles for Previously Injured vs Healthy Runners

Our goal in this section is to demonstrate how to incorporate self-reported survey data into the analysis of running kinematics. We illustrate an example on how to build queries that group participants by previous injury and compare joint angles between runners with and without an injury history. We then perform Statistical Parametric Mapping (SPM) to evaluate phase-specific differences across the gait cycle. Here, we focus on knee joint angles as an example, but feel free to extend to other joints and biomechanical signals for further exploration.

  1. In the explore tab, click Query builder
  2. Create a new Query.
  3. Query Name: Knee_Angle_Healthy

Condition 1: Left Knee Angle

  1. Condition Name: Left_Knee_angle
  2. Type: LINK_MODEL_BASED
  3. FOLDER: ORIGINAL
  4. Signal Name: Left_Knee_angles
  5. Component: X
  6. Negate Signal: Checked

Switch to the Events tab

  1. For the Event Signals, add two events: LEFT_ON, LEFT_ON

Go to the Refinements tab, As shown on the figure on the right.

  1. Check Refine Using Signals
  2. Press the +Add button to add a new refinement
    • Refinement Name: Healthy
    • Type: METRIC
    • Folder: SURVEY_DATA
    • Name: left_injuries_knee
    • Component: X
    • Value Must Be: Equal To
    • Value: 0

Since this is the healthy left knee, we choose the refinement value to be 0 (i.e., no previous self-reported left-knee injury)

* Click Save

Condition 2: Right Knee Angle

  1. Condition Name: Right_Knee_angle
  2. Type: LINK_MODEL_BASED
  3. FOLDER: ORIGINAL
  4. Signal Name: Right_Knee_angles
  5. Component: X
  6. Negate Signal: Checked

Switch to the Events tab at the top

  1. For the Event Signals, add two events: RIGHT_ON, RIGHT_ON

Go to the Refinements tab

  1. Check Refine Using Signals
  2. Press the +Add button to add a new refinement
    • Refinement Name: Healthy
    • Type: METRIC
    • Folder: SURVEY_DATA
    • Name: right_injuries_knee
    • Component: X
    • Value Must Be: Equal To
    • Value: 0

* Click Save

Now, we will move to building the query for the injured knee angles. To speed things up, right-click on the Query Knee_Angle_Healthy and select Duplicate. Rename the query from Knee_Angle_Healthy_v1 to Knee_Angle_Injured, and click Save.

We now have an identical copy of the healthy query. The only modification required is to update the refinement to the injured condition.

Repeat the following steps for both conditions: Left_Knee_angle and Right_Knee_angle

  1. Edit each condition and navigate to the Refinements tab.
  2. Right-click on the Healthy refinement and select Modify.
    • Change the refinement name from Healthy to Injured.
    • Folder: SURVEY_DATA.
    • Update the Value to: 1.
    • Click Save to apply the refinement changes.
  3. Click Save again to apply changes to the condition.

Repeat this process for the remaining knee condition so that both left and right knee angle signals are properly refined for the injured group. Click Calculate All Queries

The previous steps can also be applied to different traces (e.g., Knee, hip, angles, etc). Feel free to investigate any other signals, or survey metrics if you have additional research questions you like to explore.


1. Visualization

  1. To add a second plot , Select the general option from the top menu bar , and increase the number of Graph Rows to 2.
  2. Multi select both Knee_Angle_Healthy and Knee_Angle_Injured, and check Select All Workspaces.
  3. You can also exclude some of the outliers, or traces that were produced by tracking errors. By selecting the trace, Right Click. Exclude → Exclude Trace (raw data).
  4. You can also select both Plot Group Mean and Plot Group Dispersion and uncheck Plot All Traces.

2. Curve Registration and Statistical Parameter Mapping (SPM)

To compare both traces, we will use SPM to create a summary statistics like t-tests to describe our data. A good practice before applying SPM is to apply curve registration first.

First, Select the Knee_Angle_Healthy Group from the Groups menu.

  1. At the bottom left click Register Curves…
  2. Check Use Local Max/Min
  3. Local Maximum X-Axis Range :[ 60 to 80 ]
  4. Local Minimum X-Axis Range: [ 30 to 50 ]

Second, Select the Knee_Angle_Injured Group from the Groups menu, and repeate the exact above steps.

  1. At the bottom left click Register Curves…
  2. Check Use Local Max/Min
  3. Local Maximum X-Axis Range :[ 30 to 50 ]
  4. Local Minimum X-Axis Range: [ 60 to 80 ]

Statistical parameter mapping (SPM)

  1. first navigate to the Analysis Tab, from the left side vertical bar.
  2. from the top select SPM
  3. From the Groups menu, mutli-select Knee_Angle_Injured_Registered and Knee_Angle_Healthy_Registered
  4. Click Create GLM
    • GLM Name: Knee_Angle_GLM
    • Statistical Test: Two Sample T-Test
    • Group By: Group
    • Use Workspace Mean: Unckecked
  5. Navigate to the Statistics tap on the bottom of the application.
  6. Click Compute SPM
    • SPM Name: Knee_angle_spm
    • Group 1: Knee_Angle_Healthy_Registered
    • Group 2: Knee_Angle_Injured_Registered
    • Threshold: 0.050
    • Two-Tailed: checked

3. Results for Joint Angle SPM

SPM analysis revealed two phase differences in knee joint kinematics between healthy and previously injured runners (α = 0.05).

A significant difference between approximately 25-40% of the gait cycle (Single Support, late stance phase), where injured runners showed greater knee extension compared to healthy runners.

A second significant region between approximately 45-70% of the gait cycle (Initial Swing), where healthy runners exhibited greater knee flexion, while injured runners showed a relatively more extended knee position.

Overall, previously injured runners demonstrate differences in knee angles during early stance, with differences reversing later in the gait cycle, indicating a phase-dependent shift in knee motion.

Conclusion

This tutorial demonstrated a practical workflow for combining motion capture data with self-reported survey metrics using SIFT. We showed how to compute Global Gait Asymmetry (GGA), divide participants based on experience and injury history, and apply Statistical Parametric Mapping to compare joint kinematics.

While no significant differences were found in GGA between experience levels, knee joint analysis showed interesting results, revealing a higher knee flexion and extension for the injured participants, this result reveal phase differences between healthy and previously injured runners. Specifically, injured runners have a greater knee flexion during early stance, with differences reversing later in the gait cycle.

We show how to integrating biomechanical signals with survey data can provide more detailed insight into movement patterns and support data-driven exploration of injury-related adaptations.

Future work could extend the analysis beyond knee kinematics to include hip and ankle joints, as well as Global Gait Asymmetry components, to determine whether the observed phase-dependent differences in injured runners show a broader multi-joint coordination rather than an isolated knee effect.

sift/tutorials/openbiomechanics_project/global_gait_measures_for_marathon_runners.txt · Last modified: by wikisysop