Title: | Short Sprints |
---|---|
Description: | Create short sprint acceleration-velocity (AVP) and force-velocity (FVP) profiles and predict kinematic and kinetic variables using the timing-gate split times, laser or radar gun data, tether devices data, as well as the data provided by the GPS and LPS monitoring systems. The modeling method utilized in this package is based on the works of Furusawa K, Hill AV, Parkinson JL (1927) <doi: 10.1098/rspb.1927.0035>, Greene PR. (1986) <doi: 10.1016/0025-5564(86)90063-5>, Chelly SM, Denis C. (2001) <doi: 10.1097/00005768-200102000-00024>, Clark KP, Rieger RH, Bruno RF, Stearne DJ. (2017) <doi: 10.1519/JSC.0000000000002081>, Samozino P. (2018) <doi: 10.1007/978-3-319-05633-3_11>, Samozino P. and Peyrot N., et al (2022) <doi: 10.1111/sms.14097>, Clavel, P., et al (2023) <doi: 10.1016/j.jbiomech.2023.111602>, Jovanovic M. (2023) <doi: 10.1080/10255842.2023.2170713>, Jovanovic M., et al (2024) <doi: 10.3390/s24092894>, and Jovanovic M., et al (2024) <doi: 10.3390/s24196192>. |
Authors: | Mladen Jovanović [aut, cre, cph]
|
Maintainer: | Mladen Jovanović <[email protected]> |
License: | MIT + file LICENSE |
Version: | 3.3.0 |
Built: | 2025-01-25 05:19:48 UTC |
Source: | https://github.com/mladenjovanovic/shorts |
shorts_model
objectS3 method for extracting model parameters from shorts_model
object
## S3 method for class 'shorts_model' coef(object, ...)
## S3 method for class 'shorts_model' coef(object, ...)
object |
|
... |
Extra arguments. Not used |
split_distances <- c(10, 20, 30, 40, 50) split_times <- create_timing_gates_splits( gates = split_distances, MSS = 10, MAC = 9, FD = 0.25, TC = 0 ) # Simple model simple_model <- model_timing_gates(split_distances, split_times) coef(simple_model)
split_distances <- c(10, 20, 30, 40, 50) split_times <- create_timing_gates_splits( gates = split_distances, MSS = 10, MAC = 9, FD = 0.25, TC = 0 ) # Simple model simple_model <- model_timing_gates(split_distances, split_times) coef(simple_model)
shorts_model
S3 method for providing confidence intervals for the shorts_model
## S3 method for class 'shorts_model' confint(object, ...)
## S3 method for class 'shorts_model' confint(object, ...)
object |
|
... |
Forwarded to generic |
## Not run: split_distances <- c(10, 20, 30, 40, 50) split_times <- create_timing_gates_splits( gates = split_distances, MSS = 10, MAC = 9, FD = 0, TC = 0, noise = 0.01 ) # Simple model simple_model <- model_timing_gates(split_distances, split_times) confint(simple_model) ## End(Not run)
## Not run: split_distances <- c(10, 20, 30, 40, 50) split_times <- create_timing_gates_splits( gates = split_distances, MSS = 10, MAC = 9, FD = 0, TC = 0, noise = 0.01 ) # Simple model simple_model <- model_timing_gates(split_distances, split_times) confint(simple_model) ## End(Not run)
This function converts back the Force-Velocity profile (FVP; F0 and V0 parameters) to Acceleration-Velocity profile (AVP; MSS and MAC parameters)
convert_FVP( F0, V0, bodymass = 75, inertia = 0, resistance = 0, wind_velocity = 0, ... )
convert_FVP( F0, V0, bodymass = 75, inertia = 0, resistance = 0, wind_velocity = 0, ... )
F0 , V0
|
Numeric vectors. FV profile parameters |
bodymass |
Body mass in kg. Used to calculate relative power and forwarded to |
inertia |
External inertia in kg (for example a weight vest, or a sled). Not included in the air resistance calculation |
resistance |
External horizontal resistance in Newtons (for example tether device or a sled friction resistance) |
wind_velocity |
In meters per second (m/s). Use negative number as head wind, and positive number as back wind. Default is 0m/s (no wind) |
... |
Forwarded to |
A list with calculated MSS
and MAC
parameters
FVP <- create_FVP(7, 8.3, inertia = 10, resistance = 50) convert_FVP(FVP$F0, FVP$V0, inertia = 10, resistance = 50)
FVP <- create_FVP(7, 8.3, inertia = 10, resistance = 50) convert_FVP(FVP$F0, FVP$V0, inertia = 10, resistance = 50)
Creates Force-Velocity Profile (FVP) modified using ideas by Pierre Samozino and JB-Morin, et al. (2016) and Pierre Samozino and Nicolas Peyror, et al (2021).
create_FVP( MSS, MAC, bodymass = 75, inertia = 0, resistance = 0, wind_velocity = 0, ... )
create_FVP( MSS, MAC, bodymass = 75, inertia = 0, resistance = 0, wind_velocity = 0, ... )
MSS , MAC
|
Numeric vectors. Model parameters |
bodymass |
Body mass in kg. Used to calculate relative power and forwarded to |
inertia |
External inertia in kg (for example a weight vest, or a sled). Not included in the air resistance calculation |
resistance |
External horizontal resistance in Newtons (for example tether device or a sled friction resistance) |
wind_velocity |
In meters per second (m/s). Use negative number as head wind, and positive number as back wind. Default is 0m/s (no wind) |
... |
Forwarded to |
List containing the following elements:
Returned bodymass
used in FV profiling
Horizontal force when velocity=0
F0
divided by bodymass
Velocity when horizontal force=0
Maximal horizontal power
Pmax
divided by bodymass
Slope of the FV profile. See References for more info
Samozino P, Rabita G, Dorel S, Slawinski J, Peyrot N, Saez de Villarreal E, Morin J-B. 2016. A simple method for measuring power, force, velocity properties, and mechanical effectiveness in sprint running: Simple method to compute sprint mechanics. Scandinavian Journal of Medicine & Science in Sports 26:648–658. DOI: 10.1111/sms.12490.
Samozino P, Peyrot N, Edouard P, Nagahara R, Jimenez‐Reyes P, Vanwanseele B, Morin J. 2022. Optimal mechanical force‐velocity profile for sprint acceleration performance. Scandinavian Journal of Medicine & Science in Sports 32:559–575. DOI: 10.1111/sms.14097.
data("jb_morin") m1 <- model_radar_gun(time = jb_morin$time, velocity = jb_morin$velocity) fv_profile <- create_FVP( MSS = m1$parameters$MSS, MAC = m1$parameters$MAC, bodyheight = 1.72, bodymass = 120, ) fv_profile
data("jb_morin") m1 <- model_radar_gun(time = jb_morin$time, velocity = jb_morin$velocity) fv_profile <- create_FVP( MSS = m1$parameters$MSS, MAC = m1$parameters$MAC, bodyheight = 1.72, bodymass = 120, ) fv_profile
This function creates sprint trace either using time
or distance
vectors
create_sprint_trace( MSS, MAC, time = NULL, distance = NULL, TC = 0, DC = 0, FD = 0, remove_leading = FALSE )
create_sprint_trace( MSS, MAC, time = NULL, distance = NULL, TC = 0, DC = 0, FD = 0, remove_leading = FALSE )
MSS , MAC
|
Numeric vector. Model parameters |
time |
Numeric vector. |
distance |
Numeric vector. |
TC |
Numeric vector. Time-shift added to sprint times. Default is 0 |
DC |
Numeric vector. Distance-shift added to sprint distance. Default is 0 |
FD |
Numeric vector. Flying start distance. Default is 0 |
remove_leading |
Should trace leading to sprint be removed? Default is |
Data-frame with following 6 columns
Measurement-scale time vector in seconds. Equal to parameter time
Measurement-scale distance vector in meters. Equal to parameter distance
Velocity vector in m/s
Acceleration vector in m/s/s
Sprint scale time vector in seconds. Sprint always start at t=0s
Sprint scale distance vector in meters. Sprint always start at d=0m
df <- create_sprint_trace(8, 7, time = seq(0, 6, by = 0.01)) df <- create_sprint_trace(8, 7, distance = seq(0, 40, by = 1))
df <- create_sprint_trace(8, 7, time = seq(0, 6, by = 0.01)) df <- create_sprint_trace(8, 7, distance = seq(0, 40, by = 1))
This function is used to generate timing gates splits with predetermined parameters
create_timing_gates_splits( MSS, MAC, gates = c(5, 10, 20, 30, 40), FD = 0, TC = 0, noise = 0 )
create_timing_gates_splits( MSS, MAC, gates = c(5, 10, 20, 30, 40), FD = 0, TC = 0, noise = 0 )
MSS , MAC
|
Numeric vectors. Model parameters |
gates |
Numeric vectors. Distances of the timing gates |
FD |
Numeric vector. Flying start distance. Default is 0 |
TC |
Numeric vector. Time-correction added to split times (e.g., reaction time). Default is 0 |
noise |
Numeric vector. SD of Gaussian noise added to the split times. Default is 0 |
create_timing_gates_splits( gates = c(10, 20, 30, 40, 50), MSS = 10, MAC = 9, FD = 0.5, TC = 0 )
create_timing_gates_splits( gates = c(10, 20, 30, 40, 50), MSS = 10, MAC = 9, FD = 0.5, TC = 0 )
DynaSpeed(TM) data collected for a single athlete (female, 177cm, 64kg) and a single sprint over 40m. Sampling frequency is 1,000Hz. Additional time and distance shift is added to the dataset to provide a sandbox for potential issues during the analysis
data(dynaspeed)
data(dynaspeed)
Data frame with 4 variables and 7,251 observations:
time in seconds
Distance in meters
Smoothed velocity in meters per second
Velocity in meters per second
Håkan Andersson
The High-Performance Center
Växjö, Sweden
[email protected]
Family of functions that serve a purpose of finding maximal value and critical distances and times at which power, acceleration or velocity drops below certain threshold.
find_peak_power_distance
finds peak power and distance
at
which peak power occurs
find_peak_power_time
finds peak power and time
at which
peak power occurs
find_velocity_critical_distance
finds critical distance at which percent
of MSS
is achieved
find_velocity_critical_time
finds critical time at which percent
of MSS
is achieved
find_acceleration_critical_distance
finds critical distance at which percent
of MAC
is reached
find_acceleration_critical_time
finds critical time at which percent
of
MAC
is reached
find_power_critical_distance
finds critical distances at which peak power over
percent
is achieved
find_power_critical_time
finds critical times at which peak power over
percent
is achieved
find_peak_power_distance(MSS, MAC, inertia = 0, resistance = 0, ...) find_peak_power_time(MSS, MAC, inertia = 0, resistance = 0, ...) find_velocity_critical_distance(MSS, MAC, percent = 0.9) find_velocity_critical_time(MSS, MAC, percent = 0.9) find_acceleration_critical_distance(MSS, MAC, percent = 0.9) find_acceleration_critical_time(MSS, MAC, percent = 0.9) find_power_critical_distance( MSS, MAC, inertia = 0, resistance = 0, percent = 0.9, ... ) find_power_critical_time( MSS, MAC, inertia = 0, resistance = 0, percent = 0.9, ... )
find_peak_power_distance(MSS, MAC, inertia = 0, resistance = 0, ...) find_peak_power_time(MSS, MAC, inertia = 0, resistance = 0, ...) find_velocity_critical_distance(MSS, MAC, percent = 0.9) find_velocity_critical_time(MSS, MAC, percent = 0.9) find_acceleration_critical_distance(MSS, MAC, percent = 0.9) find_acceleration_critical_time(MSS, MAC, percent = 0.9) find_power_critical_distance( MSS, MAC, inertia = 0, resistance = 0, percent = 0.9, ... ) find_power_critical_time( MSS, MAC, inertia = 0, resistance = 0, percent = 0.9, ... )
MSS , MAC
|
Numeric vectors. Model parameters |
inertia |
External inertia in kg (for example a weight vest, or a sled). Not included in the air resistance calculation |
resistance |
External horizontal resistance in Newtons (for example tether device or a sled friction resistance) |
... |
Arguments passed on to
|
percent |
Numeric vector. Used to calculate critical distance. Default is 0.9 |
find_peak_power_distance
returns list with two elements: peak_power
and distance
at which peak power occurs
find_peak_power_time
returns list with two elements: peak_power
and
time
at which peak power occurs
Haugen TA, Tønnessen E, Seiler SK. 2012. The Difference Is in the Start: Impact of Timing and Start Procedure on Sprint Running Performance: Journal of Strength and Conditioning Research 26:473–479. DOI: 10.1519/JSC.0b013e318226030b.
Samozino P. 2018. A Simple Method for Measuring Force, Velocity and Power Capabilities and Mechanical Effectiveness During Sprint Running. In: Morin J-B, Samozino P eds. Biomechanics of Training and Testing. Cham: Springer International Publishing, 237–267. DOI: 10.1007/978-3-319-05633-3_11.
dist <- seq(0, 40, length.out = 1000) velocity <- predict_velocity_at_distance( distance = dist, MSS = 10, MAC = 9 ) acceleration <- predict_acceleration_at_distance( distance = dist, MSS = 10, MAC = 9 ) # Use ... to forward parameters to the shorts::get_air_resistance pwr <- predict_power_at_distance( distance = dist, MSS = 10, MAC = 9 # bodyweight = 100, # bodyheight = 1.9, # barometric_pressure = 760, # air_temperature = 25, # wind_velocity = 0 ) # Find critical distance when 90% of MSS is reached plot(x = dist, y = velocity, type = "l") abline(h = 10 * 0.9, col = "gray") abline(v = find_velocity_critical_distance(MSS = 10, MAC = 9), col = "red") # Find critical distance when 20% of MAC is reached plot(x = dist, y = acceleration, type = "l") abline(h = 9 * 0.2, col = "gray") abline(v = find_acceleration_critical_distance(MSS = 10, MAC = 9, percent = 0.2), col = "red") # Find peak power and location of peak power plot(x = dist, y = pwr, type = "l") peak_pwr <- find_peak_power_distance( MSS = 10, MAC = 9 # Use ... to forward parameters to the shorts::get_air_resistance ) abline(h = peak_pwr$peak_power, col = "gray") abline(v = peak_pwr$distance, col = "red") # Find distance in which relative power stays over 75% of PMAX' plot(x = dist, y = pwr, type = "l") abline(h = peak_pwr$peak_power * 0.75, col = "gray") pwr_zone <- find_power_critical_distance(MSS = 10, MAC = 9, percent = 0.75) abline(v = pwr_zone$lower, col = "blue") abline(v = pwr_zone$upper, col = "blue")
dist <- seq(0, 40, length.out = 1000) velocity <- predict_velocity_at_distance( distance = dist, MSS = 10, MAC = 9 ) acceleration <- predict_acceleration_at_distance( distance = dist, MSS = 10, MAC = 9 ) # Use ... to forward parameters to the shorts::get_air_resistance pwr <- predict_power_at_distance( distance = dist, MSS = 10, MAC = 9 # bodyweight = 100, # bodyheight = 1.9, # barometric_pressure = 760, # air_temperature = 25, # wind_velocity = 0 ) # Find critical distance when 90% of MSS is reached plot(x = dist, y = velocity, type = "l") abline(h = 10 * 0.9, col = "gray") abline(v = find_velocity_critical_distance(MSS = 10, MAC = 9), col = "red") # Find critical distance when 20% of MAC is reached plot(x = dist, y = acceleration, type = "l") abline(h = 9 * 0.2, col = "gray") abline(v = find_acceleration_critical_distance(MSS = 10, MAC = 9, percent = 0.2), col = "red") # Find peak power and location of peak power plot(x = dist, y = pwr, type = "l") peak_pwr <- find_peak_power_distance( MSS = 10, MAC = 9 # Use ... to forward parameters to the shorts::get_air_resistance ) abline(h = peak_pwr$peak_power, col = "gray") abline(v = peak_pwr$distance, col = "red") # Find distance in which relative power stays over 75% of PMAX' plot(x = dist, y = pwr, type = "l") abline(h = peak_pwr$peak_power * 0.75, col = "gray") pwr_zone <- find_power_critical_distance(MSS = 10, MAC = 9, percent = 0.75) abline(v = pwr_zone$lower, col = "blue") abline(v = pwr_zone$upper, col = "blue")
Function that finds the distance at which the sprint, probe, or FV profile is optimal (i.e., equal to 100 perc)
find_optimal_distance(..., optimal_func = optimal_FV, min = 1, max = 60)
find_optimal_distance(..., optimal_func = optimal_FV, min = 1, max = 60)
... |
Forwarded to selected |
optimal_func |
Selected profile optimization function. Default is |
min , max
|
Distance over which to find optimal profile distance |
Distance
MSS <- 10 MAC <- 8 bodymass <- 75 fv <- create_FVP(MSS, MAC, bodymass) find_optimal_distance( F0 = fv$F0, V0 = fv$V0, bodymass = fv$bodymass, optimal_func = optimal_FV, method = "max" ) find_optimal_distance( MSS = MSS, MAC = MAC, optimal_func = optimal_MSS_MAC ) find_optimal_distance( MSS = MSS, MAC = MAC, optimal_func = probe_MSS_MAC )
MSS <- 10 MAC <- 8 bodymass <- 75 fv <- create_FVP(MSS, MAC, bodymass) find_optimal_distance( F0 = fv$F0, V0 = fv$V0, bodymass = fv$bodymass, optimal_func = optimal_FV, method = "max" ) find_optimal_distance( MSS = MSS, MAC = MAC, optimal_func = optimal_MSS_MAC ) find_optimal_distance( MSS = MSS, MAC = MAC, optimal_func = probe_MSS_MAC )
shorts_model
S3 method for returning predictions of shorts_model
## S3 method for class 'shorts_model' fitted(object, ...)
## S3 method for class 'shorts_model' fitted(object, ...)
object |
|
... |
Extra arguments. Not used |
split_distances <- c(10, 20, 30, 40, 50) split_times <- create_timing_gates_splits( gates = split_distances, MSS = 10, MAC = 9, FD = 0.25, TC = 0 ) # Simple model simple_model <- model_timing_gates(split_distances, split_times) fitted(simple_model)
split_distances <- c(10, 20, 30, 40, 50) split_times <- create_timing_gates_splits( gates = split_distances, MSS = 10, MAC = 9, FD = 0.25, TC = 0 ) # Simple model simple_model <- model_timing_gates(split_distances, split_times) fitted(simple_model)
Function formats split data and calculates split distances, split times and average split velocity
format_splits(distance, time)
format_splits(distance, time)
distance |
Numeric vector |
time |
Numeric vector |
Data frame with the following columns:
Split number
Distance at which split starts
Distance at which split ends
Split distance
Time at which distance starts
Time at which distance ends
Split time
Mean velocity over split distance
Mean acceleration over split distance
data("split_times") john_data <- split_times[split_times$athlete == "John", ] format_splits(john_data$distance, john_data$time)
data("split_times") john_data <- split_times[split_times$athlete == "John", ] format_splits(john_data$distance, john_data$time)
get_air_resistance
estimates air resistance in Newtons
get_air_resistance( velocity, bodymass = 75, bodyheight = 1.75, barometric_pressure = 760, air_temperature = 25, wind_velocity = 0 )
get_air_resistance( velocity, bodymass = 75, bodyheight = 1.75, barometric_pressure = 760, air_temperature = 25, wind_velocity = 0 )
velocity |
Instantaneous running velocity in meters per second (m/s) |
bodymass |
In kilograms (kg). Default is 75kg |
bodyheight |
In meters (m). Default is 1.75m |
barometric_pressure |
In Torrs. Default is 760Torrs |
air_temperature |
In Celzius (C). Default is 25C |
wind_velocity |
In meters per second (m/s). Use negative number as head wind, and positive number as back wind. Default is 0m/s (no wind) |
Air resistance in Newtons (N)
Arsac LM, Locatelli E. 2002. Modeling the energetics of 100-m running by using speed curves of world champions. Journal of Applied Physiology 92:1781–1788. DOI: 10.1152/japplphysiol.00754.2001.
Samozino P, Rabita G, Dorel S, Slawinski J, Peyrot N, Saez de Villarreal E, Morin J-B. 2016. A simple method for measuring power, force, velocity properties, and mechanical effectiveness in sprint running: Simple method to compute sprint mechanics. Scandinavian Journal of Medicine & Science in Sports 26:648–658. DOI: 10.1111/sms.12490.
van Ingen Schenau GJ, Jacobs R, de Koning JJ. 1991. Can cycle power predict sprint running performance? European Journal of Applied Physiology and Occupational Physiology 63:255–260. DOI: 10.1007/BF00233857.
get_air_resistance( velocity = 5, bodymass = 80, bodyheight = 1.90, barometric_pressure = 760, air_temperature = 16, wind_velocity = -0.5 )
get_air_resistance( velocity = 5, bodymass = 80, bodyheight = 1.90, barometric_pressure = 760, air_temperature = 16, wind_velocity = -0.5 )
Sample radar gun data provided by Jean-Benoît Morin on his website. See https://jbmorin.net/2017/12/13/a-spreadsheet-for-sprint-acceleration-force-velocity-power-profiling/ for more details.
data(jb_morin)
data(jb_morin)
Data frame with 2 variables and 232 observations:
Time in seconds
Velocity in m/s
This dataset represents a sample data provided by Jean-Benoît Morin on a single individual running approximately 35m from a stand still position that is measured with the radar gun. Individual's body mass is 75kg, height is 1.72m. Conditions of the run are the following: air temperature 25C, barometric pressure 760mmHg, wind velocity 0m/s.
The purpose of including this dataset in the package is to check the agreement of the model estimates with Jean-Benoît Morin Microsoft Excel spreadsheet.
Jean-Benoît Morin
Inter-university Laboratory of Human Movement Biology
Saint-Étienne, France
https://jbmorin.net/
Morin JB. 2017.A spreadsheet for Sprint acceleration Force-Velocity-Power profiling. Available at https://jbmorin.net/2017/12/13/a-spreadsheet-for-sprint-acceleration-force-velocity-power-profiling/ (accessed October 27, 2020).
Performance of 35m sprint by a youth basketball player done using standing start. Sample was collected by laser gun (CMP3 Distance Sensor, Noptel Oy, Oulu, Finland) and was sampled at a rate of 2.56 KHz. A polynomial function modeling the relationship between distance and time was employed and subsequently resampled at a frequency of 1,000 Hz using Musclelab™ v10.232.107.5298, a software developed by Ergotest Technology AS located in Langesund, Norway. Data was further modified by calculating raw acceleration using dv/dt (using smoothed velocity provided by the system), and then smoothed out using 4th-order Butterworth filter with a cutoff frequency of 1 Hz.
data(laser_gun_data)
data(laser_gun_data)
Data frame with 6 variables and 4805 observations:
Time vector in seconds
Distance vector in meters
Smoothed velocity vector in m/s; this represent step-averaged velocity
Raw velocity vector in m/s
Raw acceleration vector in m/s/s; calculated using difference in smoothed velocity divided by time difference (i.e., dv/dt method of derivation)
Smoothed acceleration vector in m/s/s; smoothed out using 4th-order Butterworth filter with a cutoff frequency of 1 Hz
LPS Basketball Session Dataset
data(LPS_session)
data(LPS_session)
Data frame with 5 variables and 91,099 observations:
Time in seconds from the start of the session
x-coordinate in meters provided by the LPS
y-coordinate in meters provided by the LPS
Velocity provided by LPS in m/s
Acceleration provided by LPS in m/s
This dataset represents a sample data provided by Local Positioning System (LPS) on a single individual performing a single basketball practice session (aprox. 90min). Sampling frequency is 20Hz.
Family of functions that serve a purpose of estimating short sprint parameters
model_in_situ
estimates short sprint parameters using velocity-acceleration trace,
provided by the monitoring systems like GPS or LPS. See references for the information
model_radar_gun
estimates short sprint parameters using time-velocity trace,
with additional parameter TC
serving as intercept
model_laser_gun
alias for model_radar_gun
model_tether
estimates short sprint parameters using distance-velocity trace
(e.g., tether devices).
model_tether_DC
estimates short sprint parameters using distance-velocity trace
(e.g., tether devices) with additional distance correction DC
parameter
model_time_distance
estimates short sprint parameters using time distance trace
model_time_distance_FD
estimates short sprint parameters using time-distance trace
with additional estimated flying distance correction parameter FD
model_time_distance_FD_fixed
estimates short sprint parameters using time-distance trace
with additional flying distance correction parameter FD
which
is fixed by the user
model_time_distance
estimates short sprint parameters using time distance trace
with additional time correction parameter TC
model_time_distance
estimates short sprint parameters using time distance trace
with additional distance correction parameter DC
model_time_distance
estimates short sprint parameters using time distance trace
with additional time correction TC
and distance correction TC
parameters
model_timing_gates
estimates short sprint parameters using distance-time trace
(e.g., timing gates/photo cells)
model_timing_gates_TC
estimates short sprint parameters using distance-time trace
(e.g., timing gates/photo cells), with additional time correction parameter TC
model_timing_gates_FD
estimates short sprint parameters using distance-time trace
(e.g., timing gates/photo cells), with additional estimated flying distance correction
parameter FD
model_timing_gates_FD_fixed
estimates short sprint parameters using distance-time trace
(e.g., timing gates/photo cells), with additional flying distance correction parameter FD
which
is fixed by the user
model_timing_gates_DC
estimates short sprint parameters using distance-time trace
(e.g., timing gates/photo cells), with additional distance correction parameter DC
model_timing_gates_TC_DC
estimates short sprint parameters using distance-time trace
(e.g., timing gates/photo cells), with additional time correction TC
and
distance correction DC
parameters
model_in_situ( velocity, acceleration, weights = 1, acceleration_threshold = 0, velocity_threshold = NULL, velocity_step = 0.2, n_observations = 2, filter_func = function(x) { x }, CV = NULL, na.rm = FALSE, ... ) model_radar_gun( time, velocity, weights = 1, CV = NULL, use_observed_MSS = FALSE, na.rm = FALSE, ... ) model_laser_gun( time, velocity, weights = 1, CV = NULL, use_observed_MSS = FALSE, na.rm = FALSE, ... ) model_tether( distance, velocity, weights = 1, CV = NULL, use_observed_MSS = FALSE, na.rm = FALSE, ... ) model_tether_DC( distance, velocity, weights = 1, CV = NULL, use_observed_MSS = FALSE, na.rm = FALSE, ... ) model_time_distance(time, distance, weights = 1, CV = NULL, na.rm = FALSE, ...) model_time_distance_FD( time, distance, weights = 1, CV = NULL, na.rm = FALSE, ... ) model_time_distance_FD_fixed( time, distance, weights = 1, FD = 0, CV = NULL, na.rm = FALSE, ... ) model_time_distance_TC( time, distance, weights = 1, CV = NULL, na.rm = FALSE, ... ) model_time_distance_DC( time, distance, weights = 1, CV = NULL, na.rm = FALSE, ... ) model_time_distance_TC_DC( time, distance, weights = 1, CV = NULL, na.rm = FALSE, ... ) model_timing_gates(distance, time, weights = 1, CV = NULL, na.rm = FALSE, ...) model_timing_gates_TC( distance, time, weights = 1, CV = NULL, na.rm = FALSE, ... ) model_timing_gates_FD( distance, time, weights = 1, CV = NULL, na.rm = FALSE, ... ) model_timing_gates_FD_fixed( distance, time, weights = 1, FD = 0, CV = NULL, na.rm = FALSE, ... ) model_timing_gates_DC( distance, time, weights = 1, CV = NULL, na.rm = FALSE, ... ) model_timing_gates_TC_DC( distance, time, weights = 1, CV = NULL, na.rm = FALSE, ... )
model_in_situ( velocity, acceleration, weights = 1, acceleration_threshold = 0, velocity_threshold = NULL, velocity_step = 0.2, n_observations = 2, filter_func = function(x) { x }, CV = NULL, na.rm = FALSE, ... ) model_radar_gun( time, velocity, weights = 1, CV = NULL, use_observed_MSS = FALSE, na.rm = FALSE, ... ) model_laser_gun( time, velocity, weights = 1, CV = NULL, use_observed_MSS = FALSE, na.rm = FALSE, ... ) model_tether( distance, velocity, weights = 1, CV = NULL, use_observed_MSS = FALSE, na.rm = FALSE, ... ) model_tether_DC( distance, velocity, weights = 1, CV = NULL, use_observed_MSS = FALSE, na.rm = FALSE, ... ) model_time_distance(time, distance, weights = 1, CV = NULL, na.rm = FALSE, ...) model_time_distance_FD( time, distance, weights = 1, CV = NULL, na.rm = FALSE, ... ) model_time_distance_FD_fixed( time, distance, weights = 1, FD = 0, CV = NULL, na.rm = FALSE, ... ) model_time_distance_TC( time, distance, weights = 1, CV = NULL, na.rm = FALSE, ... ) model_time_distance_DC( time, distance, weights = 1, CV = NULL, na.rm = FALSE, ... ) model_time_distance_TC_DC( time, distance, weights = 1, CV = NULL, na.rm = FALSE, ... ) model_timing_gates(distance, time, weights = 1, CV = NULL, na.rm = FALSE, ...) model_timing_gates_TC( distance, time, weights = 1, CV = NULL, na.rm = FALSE, ... ) model_timing_gates_FD( distance, time, weights = 1, CV = NULL, na.rm = FALSE, ... ) model_timing_gates_FD_fixed( distance, time, weights = 1, FD = 0, CV = NULL, na.rm = FALSE, ... ) model_timing_gates_DC( distance, time, weights = 1, CV = NULL, na.rm = FALSE, ... ) model_timing_gates_TC_DC( distance, time, weights = 1, CV = NULL, na.rm = FALSE, ... )
weights |
Numeric vector. Default is 1 |
acceleration_threshold |
Acceleration cutoff. Default is 0 |
velocity_threshold |
Velocity cutoff. If |
velocity_step |
Velocity increment size for finding max acceleration. Default is 0.2 m/s |
n_observations |
Number of top acceleration observations to keep in velocity bracket. Default is 2 |
filter_func |
Function to filter outliers within each velocity bracket. This is used to remove
noise in the data. Default is |
CV |
Should cross-validation be used to estimate model fit? Default is |
na.rm |
Logical. Default is FALSE |
... |
Forwarded to |
time , velocity , distance , acceleration
|
Numeric vector |
use_observed_MSS |
Should observed peak |
FD |
Flying distance parameter. Default is 0 |
List object with the following elements:
Data frame used to estimate the sprint parameters
Extra information regarding model used
Model returned by the nlsLM
function
List with the following estimated parameters:
MSS
, MAC
, TAU
, and PMAX
List with additional model correcitons
Data frame with .predictor
, .observed
,
.predicted
, and .residual
columns
List with multiple model fit estimators
If cross-validation is performed, this will included the data as above, but for each fold
Samozino P. 2018. A Simple Method for Measuring Force, Velocity and Power Capabilities and Mechanical Effectiveness During Sprint Running. In: Morin J-B, Samozino P eds. Biomechanics of Training and Testing. Cham: Springer International Publishing, 237–267. DOI: 10.1007/978-3-319-05633-3_11.
Clavel, P., Leduc, C., Morin, J.-B., Buchheit, M., & Lacome, M. (2023). Reliability of individual acceleration-speed profile in-situ in elite youth soccer players. Journal of Biomechanics, 153, 111602. https://doi.org/10.1016/j.jbiomech.2023.111602
Morin, J.-B. (2021). The “in-situ” acceleration-speed profile for team sports: testing players without testing them. JB Morin, PhD – Sport Science website. Accessed 31. Dec. 2023. https://jbmorin.net/2021/07/29/the-in-situ-sprint-profile-for-team-sports-testing-players-without-testing-them/
# Model In-Situ (Embedded profiling) data("LPS_session") m1 <- model_in_situ( velocity = LPS_session$velocity, acceleration = LPS_session$acceleration, # Use specific cutoff value velocity_threshold = 4) m1 plot(m1) # Model Radar Gun (includes Time Correction) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 6, 0.1)) # Add some noise df$velocity <- df$velocity + rnorm(n = nrow(df), 0, 10^-2) m1 <- model_radar_gun(time = df$time, velocity = df$velocity) m1 plot(m1) # Model Laser Gun (includes Time Correction) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 6, 0.1)) # Add some noise df$velocity <- df$velocity + rnorm(n = nrow(df), 0, 10^-2) m1 <- model_laser_gun(time = df$time, velocity = df$velocity) m1 plot(m1) # Model Tether df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 6, 0.5)) m1 <- model_tether(distance = df$distance, velocity = df$velocity) m1 plot(m1) # Model Tether with Distance Correction (DC) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0.001, 6, 0.5), DC = 5) m1 <- model_tether_DC(distance = df$distance, velocity = df$velocity) m1 plot(m1) # Model Time-Distance trace (simple, without corrections) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 5, by = 0.5)) m1 <- model_time_distance(time = df$time, distance = df$distance) m1 plot(m1) # Model Time-Distance trace (with Flying Distance Correction) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 5, by = 0.5), FD = 0.5) m1 <- model_time_distance_FD(time = df$time, distance = df$distance) m1 plot(m1) # Model Time-Distance trace (with Flying Distance Correction fixed) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 5, by = 0.5), FD = 0.5) m1 <- model_time_distance_FD_fixed(time = df$time, distance = df$distance, FD = 0.5) m1 plot(m1) # Model Time-Distance trace (with Time Correction) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 5, by = 0.5), TC = 1.5) m1 <- model_time_distance_TC(time = df$time, distance = df$distance) m1 plot(m1) # Model Time-Distance trace (with Distance Correction) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 5, by = 0.5), DC = -5) m1 <- model_time_distance_DC(time = df$time, distance = df$distance) m1 plot(m1) # Model Time-Distance trace (with Time and Distance Corrections) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 5, by = 0.5), TC = -1.3, DC = 5) m1 <- model_time_distance_TC_DC(time = df$time, distance = df$distance) m1 plot(m1) # Model Timing Gates (simple, without corrections) df <- create_sprint_trace(MSS = 8, MAC = 6, distance = c(5, 10, 20, 30, 40)) m1 <- model_timing_gates(distance = df$distance, time = df$time) m1 plot(m1) # Model Timing Gates (with Time Correction) df <- create_sprint_trace(MSS = 8, MAC = 6, distance = c(5, 10, 20, 30, 40), TC = 0.2) m1 <- model_timing_gates_TC(distance = df$distance, time = df$time) m1 plot(m1) # Model Timing Gates (with Flying Distance Correction) df <- create_sprint_trace(MSS = 8, MAC = 6, distance = c(5, 10, 20, 30, 40), FD = 0.5) m1 <- model_timing_gates_FD(distance = df$distance, time = df$time) m1 plot(m1) # Model Timing Gates (with Flying Distance Correction fixed) df <- create_sprint_trace(MSS = 8, MAC = 6, distance = c(5, 10, 20, 30, 40), FD = 0.5) m1 <- model_timing_gates_FD_fixed(distance = df$distance, time = df$time) m1 plot(m1) # Model Timing Gates (with Distance Correction) df <- create_sprint_trace(MSS = 8, MAC = 6, distance = c(5, 10, 20, 30, 40), DC = 1.5) m1 <- model_timing_gates_DC(distance = df$distance, time = df$time) m1 plot(m1) # Model Timing Gates (with Time and Distance Corrections) df <- create_sprint_trace(MSS = 8, MAC = 6, distance = c(5, 10, 20, 30, 40), TC = 0.25, DC = 1.5) m1 <- model_timing_gates_TC_DC(distance = df$distance, time = df$time) m1 plot(m1)
# Model In-Situ (Embedded profiling) data("LPS_session") m1 <- model_in_situ( velocity = LPS_session$velocity, acceleration = LPS_session$acceleration, # Use specific cutoff value velocity_threshold = 4) m1 plot(m1) # Model Radar Gun (includes Time Correction) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 6, 0.1)) # Add some noise df$velocity <- df$velocity + rnorm(n = nrow(df), 0, 10^-2) m1 <- model_radar_gun(time = df$time, velocity = df$velocity) m1 plot(m1) # Model Laser Gun (includes Time Correction) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 6, 0.1)) # Add some noise df$velocity <- df$velocity + rnorm(n = nrow(df), 0, 10^-2) m1 <- model_laser_gun(time = df$time, velocity = df$velocity) m1 plot(m1) # Model Tether df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 6, 0.5)) m1 <- model_tether(distance = df$distance, velocity = df$velocity) m1 plot(m1) # Model Tether with Distance Correction (DC) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0.001, 6, 0.5), DC = 5) m1 <- model_tether_DC(distance = df$distance, velocity = df$velocity) m1 plot(m1) # Model Time-Distance trace (simple, without corrections) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 5, by = 0.5)) m1 <- model_time_distance(time = df$time, distance = df$distance) m1 plot(m1) # Model Time-Distance trace (with Flying Distance Correction) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 5, by = 0.5), FD = 0.5) m1 <- model_time_distance_FD(time = df$time, distance = df$distance) m1 plot(m1) # Model Time-Distance trace (with Flying Distance Correction fixed) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 5, by = 0.5), FD = 0.5) m1 <- model_time_distance_FD_fixed(time = df$time, distance = df$distance, FD = 0.5) m1 plot(m1) # Model Time-Distance trace (with Time Correction) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 5, by = 0.5), TC = 1.5) m1 <- model_time_distance_TC(time = df$time, distance = df$distance) m1 plot(m1) # Model Time-Distance trace (with Distance Correction) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 5, by = 0.5), DC = -5) m1 <- model_time_distance_DC(time = df$time, distance = df$distance) m1 plot(m1) # Model Time-Distance trace (with Time and Distance Corrections) df <- create_sprint_trace(MSS = 8, MAC = 6, time = seq(0, 5, by = 0.5), TC = -1.3, DC = 5) m1 <- model_time_distance_TC_DC(time = df$time, distance = df$distance) m1 plot(m1) # Model Timing Gates (simple, without corrections) df <- create_sprint_trace(MSS = 8, MAC = 6, distance = c(5, 10, 20, 30, 40)) m1 <- model_timing_gates(distance = df$distance, time = df$time) m1 plot(m1) # Model Timing Gates (with Time Correction) df <- create_sprint_trace(MSS = 8, MAC = 6, distance = c(5, 10, 20, 30, 40), TC = 0.2) m1 <- model_timing_gates_TC(distance = df$distance, time = df$time) m1 plot(m1) # Model Timing Gates (with Flying Distance Correction) df <- create_sprint_trace(MSS = 8, MAC = 6, distance = c(5, 10, 20, 30, 40), FD = 0.5) m1 <- model_timing_gates_FD(distance = df$distance, time = df$time) m1 plot(m1) # Model Timing Gates (with Flying Distance Correction fixed) df <- create_sprint_trace(MSS = 8, MAC = 6, distance = c(5, 10, 20, 30, 40), FD = 0.5) m1 <- model_timing_gates_FD_fixed(distance = df$distance, time = df$time) m1 plot(m1) # Model Timing Gates (with Distance Correction) df <- create_sprint_trace(MSS = 8, MAC = 6, distance = c(5, 10, 20, 30, 40), DC = 1.5) m1 <- model_timing_gates_DC(distance = df$distance, time = df$time) m1 plot(m1) # Model Timing Gates (with Time and Distance Corrections) df <- create_sprint_trace(MSS = 8, MAC = 6, distance = c(5, 10, 20, 30, 40), TC = 0.25, DC = 1.5) m1 <- model_timing_gates_TC_DC(distance = df$distance, time = df$time) m1 plot(m1)
Family of functions that serve a purpose of finding optimal sprint or force-velocity profile
optimal_FV
finds "optimal" F0
and V0
where time at distance is
minimized, while keeping the power the same
optimal_MSS_MAC
finds "optimal" MSS
and MAS
where time at distance is
minimized, while keeping the Pmax
the same
optimal_FV( distance, F0, V0, bodymass = 75, inertia = 0, resistance = 0, method = "max", ... ) optimal_MSS_MAC(distance, MSS, MAC)
optimal_FV( distance, F0, V0, bodymass = 75, inertia = 0, resistance = 0, method = "max", ... ) optimal_MSS_MAC(distance, MSS, MAC)
distance |
Numeric vector |
F0 , V0
|
Numeric vectors. FV profile parameters |
bodymass |
Body mass in kg |
inertia |
External inertia in kg (for example a weight vest, or a sled). Not included in the air resistance calculation |
resistance |
External horizontal resistance in Newtons (for example tether device or a sled friction resistance) |
method |
Method to be utilized. Options are "peak" and "max" (default) |
... |
Arguments passed on to
|
MSS , MAC
|
Numeric vectors. Model parameters |
optimal_FV
returns s data frame with the following columns
Original F0
Original F0
Bodymass
Inertia
Resistance
Maximal power estimated using F0 * V0 / 4
Relative maximal power
FV profile slope
Distance
Time to cover distance
Peak power estimated quantitatively
Relative peak power
Distance at which peak power is manifested
Time at which peak power is manifested
Optimal F0
Ratio between F0_optim an F0
Optimal V0
Ratio between V0_optim an V0
Optimal maximal power estimated F0_optim * V0_optim / 4
Optimal relative maximal power
Optimal FV profile slope
Percent ratio between slope and optimal slope
Time to cover distance when profile is optimal
Difference in time to cover distance between time_optimal and time
Optimal peak power estimated quantitatively
Optimal relative peak power
Distance at which optimal peak power is manifested
Time at which optimal peak power is manifested
optimal_MSS_MAC
returns a data frame with the following columns
Original MSS
Original MAC
Relative maximal power estimated using MSS * MAC / 4
Sprint profile slope
Distance
Time to cover distance
Optimal MSS
Ratio between MSS_optim an MSS
Optimal MAC
Ratio between MAC_optim an MAC
Optimal relative maximal power estimated using MSS_optim * MAC_optim / 4
Optimal sprint profile slope
Percent ratio between slope and optimal slope
Time to cover distance when profile is optimal
Difference in time to cover distance between time_optimal and time
Samozino P, Peyrot N, Edouard P, Nagahara R, Jimenez‐Reyes P, Vanwanseele B, Morin J. 2022. Optimal mechanical force-velocity profile for sprint acceleration performance. Scandinavian Journal of Medicine & Science in Sports 32:559–575. DOI: 10.1111/sms.14097.
MSS <- 10 MAC <- 8 bodymass <- 75 fv <- create_FVP(MSS, MAC, bodymass) dist <- seq(5, 40, by = 5) opt_MSS_MAC_profile <- optimal_MSS_MAC( distance = dist, MSS, MAC )[["profile_imb"]] opt_FV_profile <- optimal_FV( distance = dist, fv$F0, fv$V0, fv$bodymass )[["profile_imb"]] opt_FV_profile_peak <- optimal_FV( distance = dist, fv$F0, fv$V0, fv$bodymass, method = "peak" )[["profile_imb"]] plot(x = dist, y = opt_MSS_MAC_profile, type = "l", ylab = "Profile imbalance") lines(x = dist, y = opt_FV_profile, type = "l", col = "blue") lines(x = dist, y = opt_FV_profile_peak, type = "l", col = "red") abline(h = 100, col = "gray", lty = 2)
MSS <- 10 MAC <- 8 bodymass <- 75 fv <- create_FVP(MSS, MAC, bodymass) dist <- seq(5, 40, by = 5) opt_MSS_MAC_profile <- optimal_MSS_MAC( distance = dist, MSS, MAC )[["profile_imb"]] opt_FV_profile <- optimal_FV( distance = dist, fv$F0, fv$V0, fv$bodymass )[["profile_imb"]] opt_FV_profile_peak <- optimal_FV( distance = dist, fv$F0, fv$V0, fv$bodymass, method = "peak" )[["profile_imb"]] plot(x = dist, y = opt_MSS_MAC_profile, type = "l", ylab = "Profile imbalance") lines(x = dist, y = opt_FV_profile, type = "l", col = "blue") lines(x = dist, y = opt_FV_profile_peak, type = "l", col = "red") abline(h = 100, col = "gray", lty = 2)
shorts_model
objectS3 method for plotting shorts_model
object
## S3 method for class 'shorts_model' plot(x, type = "model", ...)
## S3 method for class 'shorts_model' plot(x, type = "model", ...)
x |
|
type |
Type of plot. Can be "model" (default), "kinematics-time", "kinematics-distance", or "residuals" |
... |
Not used |
ggplot
object
# Simple model with radar gun data instant_velocity <- data.frame( time = c(0, 1, 2, 3, 4, 5, 6), velocity = c(0.00, 4.99, 6.43, 6.84, 6.95, 6.99, 7.00) ) radar_model <- with( instant_velocity, model_radar_gun(time, velocity) ) plot(radar_model) plot(radar_model, "kinematics-time") plot(radar_model, "kinematics-distance") plot(radar_model, "residuals")
# Simple model with radar gun data instant_velocity <- data.frame( time = c(0, 1, 2, 3, 4, 5, 6), velocity = c(0.00, 4.99, 6.43, 6.84, 6.95, 6.99, 7.00) ) radar_model <- with( instant_velocity, model_radar_gun(time, velocity) ) plot(radar_model) plot(radar_model, "kinematics-time") plot(radar_model, "kinematics-distance") plot(radar_model, "residuals")
Predicts kinematic from known MSS
and MAC
parameters
predict_velocity_at_time(time, MSS, MAC) predict_distance_at_time(time, MSS, MAC) predict_acceleration_at_time(time, MSS, MAC) predict_time_at_distance(distance, MSS, MAC) predict_time_at_distance_FV( distance, F0, V0, bodymass = 75, inertia = 0, resistance = 0, ... ) predict_velocity_at_distance(distance, MSS, MAC) predict_acceleration_at_distance(distance, MSS, MAC) predict_acceleration_at_velocity(velocity, MSS, MAC) predict_air_resistance_at_time(time, MSS, MAC, ...) predict_air_resistance_at_distance(distance, MSS, MAC, ...) predict_force_at_velocity( velocity, MSS, MAC, bodymass = 75, inertia = 0, resistance = 0, ... ) predict_force_at_time( time, MSS, MAC, bodymass = 75, inertia = 0, resistance = 0, ... ) predict_force_at_distance( distance, MSS, MAC, bodymass = 75, inertia = 0, resistance = 0, ... ) predict_power_at_distance( distance, MSS, MAC, bodymass = 75, inertia = 0, resistance = 0, ... ) predict_power_at_time( time, MSS, MAC, bodymass = 75, inertia = 0, resistance = 0, ... ) predict_relative_power_at_distance( distance, MSS, MAC, bodymass = 75, inertia = 0, resistance = 0, ... ) predict_relative_power_at_time( time, MSS, MAC, bodymass = 75, inertia = 0, resistance = 0, ... ) predict_work_till_time(time, ...) predict_work_till_distance(distance, ...) predict_kinematics( object = NULL, MSS, MAC, max_time = 6, frequency = 100, bodymass = 75, inertia = 0, resistance = 0, add_inertia_to_vertical = TRUE, ... )
predict_velocity_at_time(time, MSS, MAC) predict_distance_at_time(time, MSS, MAC) predict_acceleration_at_time(time, MSS, MAC) predict_time_at_distance(distance, MSS, MAC) predict_time_at_distance_FV( distance, F0, V0, bodymass = 75, inertia = 0, resistance = 0, ... ) predict_velocity_at_distance(distance, MSS, MAC) predict_acceleration_at_distance(distance, MSS, MAC) predict_acceleration_at_velocity(velocity, MSS, MAC) predict_air_resistance_at_time(time, MSS, MAC, ...) predict_air_resistance_at_distance(distance, MSS, MAC, ...) predict_force_at_velocity( velocity, MSS, MAC, bodymass = 75, inertia = 0, resistance = 0, ... ) predict_force_at_time( time, MSS, MAC, bodymass = 75, inertia = 0, resistance = 0, ... ) predict_force_at_distance( distance, MSS, MAC, bodymass = 75, inertia = 0, resistance = 0, ... ) predict_power_at_distance( distance, MSS, MAC, bodymass = 75, inertia = 0, resistance = 0, ... ) predict_power_at_time( time, MSS, MAC, bodymass = 75, inertia = 0, resistance = 0, ... ) predict_relative_power_at_distance( distance, MSS, MAC, bodymass = 75, inertia = 0, resistance = 0, ... ) predict_relative_power_at_time( time, MSS, MAC, bodymass = 75, inertia = 0, resistance = 0, ... ) predict_work_till_time(time, ...) predict_work_till_distance(distance, ...) predict_kinematics( object = NULL, MSS, MAC, max_time = 6, frequency = 100, bodymass = 75, inertia = 0, resistance = 0, add_inertia_to_vertical = TRUE, ... )
time , distance , velocity
|
Numeric vectors |
MSS , MAC
|
Numeric vectors. Model parameters |
F0 , V0
|
Numeric vectors. FV profile parameters |
bodymass |
Body mass in kg. Used to calculate relative power and forwarded to |
inertia |
External inertia in kg (for example a weight vest, or a sled). Not included in the air resistance calculation |
resistance |
External horizontal resistance in Newtons (for example tether device or a sled friction resistance) |
... |
Arguments passed on to
|
object |
If |
max_time |
Predict from 0 to |
frequency |
Number of samples within one second. Default is 100Hz |
add_inertia_to_vertical |
Should inertia be added to |
Numeric vector
Data frame with kinetic and kinematic variables
Haugen TA, Tønnessen E, Seiler SK. 2012. The Difference Is in the Start: Impact of Timing and Start Procedure on Sprint Running Performance: Journal of Strength and Conditioning Research 26:473–479. DOI: 10.1519/JSC.0b013e318226030b.
Jovanović, M., Vescovi, J.D. (2020). shorts: An R Package for Modeling Short Sprints. Preprint available at SportRxiv. https://doi.org/10.31236/osf.io/4jw62
Samozino P. 2018. A Simple Method for Measuring Force, Velocity and Power Capabilities and Mechanical Effectiveness During Sprint Running. In: Morin J-B, Samozino P eds. Biomechanics of Training and Testing. Cham: Springer International Publishing, 237–267. DOI: 10.1007/978-3-319-05633-3_11.
MSS <- 8 MAC <- 9 time_seq <- seq(0, 6, length.out = 10) df <- data.frame( time = time_seq, distance_at_time = predict_distance_at_time(time_seq, MSS, MAC), velocity_at_time = predict_velocity_at_time(time_seq, MSS, MAC), acceleration_at_time = predict_acceleration_at_time(time_seq, MSS, MAC) ) df$time_at_distance <- predict_time_at_distance(df$distance_at_time, MSS, MAC) df$velocity_at_distance <- predict_velocity_at_distance(df$distance_at_time, MSS, MAC) df$acceleration_at_distance <- predict_acceleration_at_distance(df$distance_at_time, MSS, MAC) df$acceleration_at_velocity <- predict_acceleration_at_velocity(df$velocity_at_time, MSS, MAC) # Power calculation uses shorts::get_air_resistance function and its defaults # values to calculate power. Use the ... to setup your own parameters for power # calculations df$power_at_time <- predict_power_at_time( time = df$time, MSS = MSS, MAC = MAC, # Check shorts::get_air_resistance for available params bodymass = 100, bodyheight = 1.85 ) df # Example for predict_kinematics split_times <- data.frame( distance = c(5, 10, 20, 30, 35), time = c(1.20, 1.96, 3.36, 4.71, 5.35) ) # Simple model simple_model <- with( split_times, model_timing_gates(distance, time) ) predict_kinematics(simple_model)
MSS <- 8 MAC <- 9 time_seq <- seq(0, 6, length.out = 10) df <- data.frame( time = time_seq, distance_at_time = predict_distance_at_time(time_seq, MSS, MAC), velocity_at_time = predict_velocity_at_time(time_seq, MSS, MAC), acceleration_at_time = predict_acceleration_at_time(time_seq, MSS, MAC) ) df$time_at_distance <- predict_time_at_distance(df$distance_at_time, MSS, MAC) df$velocity_at_distance <- predict_velocity_at_distance(df$distance_at_time, MSS, MAC) df$acceleration_at_distance <- predict_acceleration_at_distance(df$distance_at_time, MSS, MAC) df$acceleration_at_velocity <- predict_acceleration_at_velocity(df$velocity_at_time, MSS, MAC) # Power calculation uses shorts::get_air_resistance function and its defaults # values to calculate power. Use the ... to setup your own parameters for power # calculations df$power_at_time <- predict_power_at_time( time = df$time, MSS = MSS, MAC = MAC, # Check shorts::get_air_resistance for available params bodymass = 100, bodyheight = 1.85 ) df # Example for predict_kinematics split_times <- data.frame( distance = c(5, 10, 20, 30, 35), time = c(1.20, 1.96, 3.36, 4.71, 5.35) ) # Simple model simple_model <- with( split_times, model_timing_gates(distance, time) ) predict_kinematics(simple_model)
shorts_model
S3 method for making predictions using shorts_model
## S3 method for class 'shorts_model' predict(object, ...)
## S3 method for class 'shorts_model' predict(object, ...)
object |
|
... |
Forwarded to generic |
split_distances <- c(10, 20, 30, 40, 50) split_times <- create_timing_gates_splits( gates = split_distances, MSS = 10, MAC = 9, FD = 0.25, TC = 0 ) # Simple model simple_model <- model_timing_gates(split_distances, split_times) predict(simple_model)
split_distances <- c(10, 20, 30, 40, 50) split_times <- create_timing_gates_splits( gates = split_distances, MSS = 10, MAC = 9, FD = 0.25, TC = 0 ) # Simple model simple_model <- model_timing_gates(split_distances, split_times) predict(simple_model)
shorts_model
objectS3 method for printing shorts_model
object
## S3 method for class 'shorts_model' print(x, ...)
## S3 method for class 'shorts_model' print(x, ...)
x |
|
... |
Not used |
split_distances <- c(10, 20, 30, 40, 50) split_times <- create_timing_gates_splits( gates = split_distances, MSS = 10, MAC = 9, FD = 0.25, TC = 0 ) # Simple model simple_model <- model_timing_gates(split_distances, split_times) simple_model
split_distances <- c(10, 20, 30, 40, 50) split_times <- create_timing_gates_splits( gates = split_distances, MSS = 10, MAC = 9, FD = 0.25, TC = 0 ) # Simple model simple_model <- model_timing_gates(split_distances, split_times) simple_model
Family of functions that serve a purpose of probing sprint or force-velocity profile. This is done by increasing individual sprint parameter for a percentage and calculating which parameter improvement yield biggest deduction in sprint tim
probe_FV
"probes" F0
and V0
and calculates which one
improves sprint time for a defined distance
probe_MSS_MAC
"probes" MSS
and MAC
and calculates which one
improves sprint time for a defined distance
probe_FV( distance, F0, V0, bodymass = 75, inertia = 0, resistance = 0, perc = 2.5, ... ) probe_MSS_MAC(distance, MSS, MAC, perc = 2.5)
probe_FV( distance, F0, V0, bodymass = 75, inertia = 0, resistance = 0, perc = 2.5, ... ) probe_MSS_MAC(distance, MSS, MAC, perc = 2.5)
distance |
Numeric vector |
F0 , V0
|
Numeric vectors. FV profile parameters |
bodymass |
Body mass in kg |
inertia |
External inertia in kg (for example a weight vest, or a sled). Not included in the air resistance calculation |
resistance |
External horizontal resistance in Newtons (for example tether device or a sled friction resistance) |
perc |
Numeric vector. Probing percentage. Default is 2.5 percent |
... |
Arguments passed on to
|
MSS , MAC
|
Numeric vectors. Model parameters |
probe_FV
returns a data frame with the following columns
Original F0
Original F0
Bodymass
Inertia
Resistance
Maximal power estimated using F0 * V0 / 4
Relative maximal power
FV profile slope
Distance
Time to cover distance
Probe percentage
Probing F0
Predicted time for distance when F0 is probed
Difference in time to cover distance between time_optimal and time
Probing V0
Predicted time for distance when V0 is probed
Difference in time to cover distance between time_optimal and time
Percent ratio between V0_probe_time_gain and F0_probe_time_gain
probe_MSS_MAC
returns a data frame with the following columns
Original MSS
Original MAC
Relative maximal power estimated using MSS * MAC / 4
Sprint profile slope
Distance
Time to cover distance
Probe percentage
Probing MSS
Predicted time for distance when MSS is probed
Difference in time to cover distance between probe time and time
Probing MAC
Predicted time for distance when MAC is probed
Difference in time to cover distance between probing time and time
Percent ratio between MSS_probe_time_gain and MAC_probe_time_gain
MSS <- 10 MAC <- 8 bodymass <- 75 fv <- create_FVP(MSS, MAC, bodymass) dist <- seq(5, 40, by = 5) probe_MSS_MAC_profile <- probe_MSS_MAC( distance = dist, MSS, MAC )[["profile_imb"]] probe_FV_profile <- probe_FV( distance = dist, fv$F0, fv$V0, fv$bodymass )[["profile_imb"]] plot(x = dist, y = probe_MSS_MAC_profile, type = "l", ylab = "Profile imbalance") lines(x = dist, y = probe_FV_profile, type = "l", col = "blue") abline(h = 100, col = "gray", lty = 2)
MSS <- 10 MAC <- 8 bodymass <- 75 fv <- create_FVP(MSS, MAC, bodymass) dist <- seq(5, 40, by = 5) probe_MSS_MAC_profile <- probe_MSS_MAC( distance = dist, MSS, MAC )[["profile_imb"]] probe_FV_profile <- probe_FV( distance = dist, fv$F0, fv$V0, fv$bodymass )[["profile_imb"]] plot(x = dist, y = probe_MSS_MAC_profile, type = "l", ylab = "Profile imbalance") lines(x = dist, y = probe_FV_profile, type = "l", col = "blue") abline(h = 100, col = "gray", lty = 2)
Data generated from known MSS and TAU and measurement error for N=5 athletes using radar gun with sampling frequency of 100Hz over 6 seconds.
data(radar_gun_data)
data(radar_gun_data)
Data frame with 4 variables and 3000 observations:
Character string
Bodyweight in kilograms
Time reported by the radar gun in seconds
Velocity reported by the radar gun in m/s
shorts_model
S3 method for returning residuals of shorts_model
## S3 method for class 'shorts_model' residuals(object, ...)
## S3 method for class 'shorts_model' residuals(object, ...)
object |
|
... |
Extra arguments. Not used |
split_distances <- c(10, 20, 30, 40, 50) split_times <- create_timing_gates_splits( gates = split_distances, MSS = 10, MAC = 9, FD = 0.25, TC = 0 ) # Simple model simple_model <- model_timing_gates(split_distances, split_times) residuals(simple_model)
split_distances <- c(10, 20, 30, 40, 50) split_times <- create_timing_gates_splits( gates = split_distances, MSS = 10, MAC = 9, FD = 0.25, TC = 0 ) # Simple model simple_model <- model_timing_gates(split_distances, split_times) residuals(simple_model)
Data generated from known MSS and TAU and measurement error for N=5 athletes using 6 timing gates: 5m, 10m, 15m, 20m, 30m, 40m
data(split_times)
data(split_times)
Data frame with 4 variables and 30 observations:
Character string
Bodyweight in kilograms
Distance of the timing gates from the sprint start in meters
Time reported by the timing gate
shorts_model
objectS3 method for providing summary for the shorts_model
object
## S3 method for class 'shorts_model' summary(object, ...)
## S3 method for class 'shorts_model' summary(object, ...)
object |
|
... |
Not used |
split_distances <- c(10, 20, 30, 40, 50) split_times <- create_timing_gates_splits( gates = split_distances, MSS = 10, MAC = 9, FD = 0.25, TC = 0 ) # Simple model simple_model <- model_timing_gates(split_distances, split_times) summary(simple_model)
split_distances <- c(10, 20, 30, 40, 50) split_times <- create_timing_gates_splits( gates = split_distances, MSS = 10, MAC = 9, FD = 0.25, TC = 0 ) # Simple model simple_model <- model_timing_gates(split_distances, split_times) summary(simple_model)
Timing gates sprint times involving 52 female athletes. Timing gates were located at 5m, 10m, 20m, 30m, and 35m. See Details for more information.
data(vescovi)
data(vescovi)
Data frame with 17 variables and 52 observations:
Team or sport. Contains the following levels: 'W Soccer' (Women Soccer), 'FH Sr' (Field Hockey Seniors), 'FH U21' (Field Hockey Under 21), and 'FH U17' (Field Hockey Under 17)
Type of testing surface. Contains the following levels: 'Hard Cours' and 'Natural Grass'
Athlete ID
Athlete age in years
Body height in cm
Body weight in kg
Body Mass Index
Body Surface Area. Calculated using Mosteller equation sqrt((height/weight)/3600)
Time in seconds at 5m gate
Time in seconds at 10m gate
Time in seconds at 20m gate
Time in seconds at 30m gate
Time in seconds at 35m gate
Split time in seconds between 10m and 5m gate
Split time in seconds between 20m and 10m gate
Split time in seconds between 30m and 20m gate
Split time in seconds between 35m and 30m gate
This data-set represents sub-set of data from a total of 220 high-level female athletes (151 soccer players and 69 field hockey players). Using a random number generator, a total of 52 players (35 soccer and 17 field hockey) were selected for this data-set. Soccer players were older (24.6±3.6 vs. 18.9±2.7 yr, p < 0.001), however there were no differences for height (167.3±5.9 vs. 167.0±5.7 cm, p = 0.886), body mass (62.5±5.9 vs. 64.0±9.4 kg, p = 0.500) or any sprint interval time (p > 0.650).
The protocol for assessing linear sprint speed has been described previously (Vescovi 2014, 2016, 2012) and was identical for each cohort. Briefly, all athletes performed a standardized warm-up that included general exercises such as jogging, shuffling, multi-directional movements, and dynamic stretching exercises. Infrared timing gates (Brower Timing, Utah) were positioned at the start line and at 5, 10, 20, and 35 meters at a height of approximately 1.0 meter. Participants stood with their lead foot positioned approximately 5 cm behind the initial infrared beam (i.e., start line). Only forward movement was permitted (no leaning or rocking backwards) and timing started when the laser of the starting gate was triggered. The best 35 m time, and all associated split times were kept for analysis. The assessment of linear sprints using infrared timing gates does not require familiarization (Moir, Button, Glaister, and Stone 2004).
Jason D. Vescovi
University of Toronto
Faculty of Kinesiology and Physical Education
Graduate School of Exercise Science
Toronto, ON Canada
[email protected]
Moir G, Button C, Glaister M, Stone MH (2004). "Influence of Familiarization on the Reliability of Vertical Jump and Acceleration Sprinting Performance in Physically Active Men." The Journal of Strength and Conditioning Research, 18(2), 276. ISSN 1064-8011, 1533-4287. doi:10.1519/R-13093.1.
Vescovi JD (2012). "Sprint Speed Characteristics of High-Level American Female Soccer Players: Female Athletes in Motion (FAiM) Study." Journal of Science and Medicine in Sport, 15(5), 474-478. ISSN 14402440. doi:10.1016/j.jsams.2012.03.006.
Vescovi JD (2014). "Impact of Maximum Speed on Sprint Performance During High-Level Youth Female Field Hockey Matches: Female Athletes in Motion (FAiM) Study." International Journal of Sports Physiology and Performance, 9(4), 621-626. ISSN 1555-0265, 1555-0273. doi:10.1123/ijspp.2013-0263.
Vescovi JD (2016). "Locomotor, Heart-Rate, and Metabolic Power Characteristics of Youth Women's Field Hockey: Female Athletes in Motion (FAiM) Study." Research Quarterly for Exercise and Sport, 87(1), 68-77. ISSN 0270-1367, 2168-3824. doi:10.1080/02701367.2015.1124972.