Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Shorts is R package that creates short sprint profiles

License

Unknown, MIT licenses found

Licenses found

Unknown
LICENSE
MIT
LICENSE.md
NotificationsYou must be signed in to change notification settings

mladenjovanovic/shorts

Repository files navigation

DOIR-CMD-checkCRAN status

{shorts} is an R package aimed for the analysis of the un-resistedand resisted short sprints (<6sec; without deceleration), creation ofacceleration-velocity profiles (AVP),force-velocity profiles (FVP),andoptimization profiles using variety of sprint traces (e.g.,time-velocity from laser/radar gun, distance-time from timinggates/photocells). It represents a simple to use tool for researcher andpractitioners interested in modeling short sprints performance.

Installation

# Install from CRANinstall.packages("shorts")# Or the development version from GitHub# install.packages("remotes")remotes::install_github("mladenjovanovic/shorts")

Examples

{shorts} comes with multiple sample data sets. Let’s loadsplit_times andradar_gun_data with N=5 athletes:

library(shorts)library(tidyverse)library(knitr)data("split_times","radar_gun_data")

Profiling using split times

{shorts} package utilizes modifiedmono-exponential functions tomodel short sprint performance. To model sprint performance using splittimes, distance will be used as predictor and time as target. Sincesplit_times dataset contains data for multiple athletes, let’s extractonly one athlete and model it usingshorts::model_timing_gates()function.

kimberley_data<- filter(split_times,athlete=="Kimberley")kable(kimberley_data)
athletebodyweightdistancetime
Kimberley5551.16
Kimberley55101.89
Kimberley55152.54
Kimberley55203.15
Kimberley55304.31
Kimberley55405.44

Parameters estimated using mono-exponential equation aremaximalsprinting speed ($MSS$), andmaximal acceleration (MAC). Additionalparameters computed from$MSS$ and$MAC$ arerelative acceleration($TAU$) andmaximal relative power ($PMAX$) (which is calculated as$MAC \cdot MSS\div4$).

kimberley_profile<-shorts::model_timing_gates(distance=kimberley_data$distance,time=kimberley_data$time)kimberley_profile#> Estimated model parameters#> --------------------------#>    MSS    MAC    TAU   PMAX#>  8.591 10.589  0.811 22.743#>#> Model fit estimators#> --------------------#>             R2        meanErr   meanErr_perc         minErr#>        0.99966       -0.00309       -0.53860       -0.05293#>    minErr_perc         maxErr    maxErr_perc      maxAbsErr#>       -4.57121        0.02699        0.85715        0.05293#> maxAbsErr_perc           RMSE      RMSE_perc            MAE#>        4.57121        0.02779        1.93922        0.02333#>       MAE_perc#>        1.19263summary(kimberley_profile)#>#> Formula: time ~ predict_time_at_distance(distance, MSS, MAC)#>#> Parameters:#>     Estimate Std. Error t value   Pr(>|t|)#> MSS    8.591      0.123    70.1 0.00000025 ***#> MAC   10.589      0.460    23.0 0.00002108 ***#> ---#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1#>#> Residual standard error: 0.034 on 4 degrees of freedom#>#> Number of iterations to convergence: 5#> Achieved convergence tolerance: 0.0000000149coef(kimberley_profile)#>   MSS   MAC#>  8.59 10.59confint(kimberley_profile,level=0.95)#>     2.5% 97.5%#> MSS 8.27  8.96#> MAC 9.42 12.02

To return the predicted/fitted values (in this case time variable), usepredict() function:

predict(kimberley_profile)#> [1] 1.21 1.90 2.52 3.12 4.30 5.47

To create a simple plot use S3plot() method. There are four typeoptions:"model" (default),"kinematics-time","kinematics-distance", or"residuals":

plot(kimberley_profile)

plot(kimberley_profile,"kinematics-time")

plot(kimberley_profile,"kinematics-distance")

plot(kimberley_profile,"residuals")

If you are interested in calculating average split velocity, useshorts::format_splits()

kable(shorts::format_splits(distance=kimberley_data$distance,time=kimberley_data$time))
splitsplit_distance_startsplit_distance_stopsplit_distancesplit_time_startsplit_time_stopsplit_timesplit_mean_velocitysplit_mean_acceleration
10550.001.161.1584.323.729
251051.161.890.7356.803.381
3101551.892.540.6487.721.409
4152052.543.150.6088.220.835
52030103.154.311.1648.590.316
63040104.315.441.1318.840.222

To plot predicted velocity, acceleration, air resistance, force, andpower over distance, useshorts:predict_XXX(). Please note that tocalculate force, air resistance, and power, we need Kimberley’s bodymassand height (as well as other characteristics such as air pressure,temperature and wind - seeget_air_resistance() function).

kimberley_bodymass<-60# in kilogramskimberley_bodyheight<-1.7# in meterskimberley_pred<- tibble(distance= seq(0,40,length.out=1000),# Velocitypred_velocity=shorts::predict_velocity_at_distance(distance,kimberley_profile$parameters$MSS,kimberley_profile$parameters$TAU  ),# Accelerationpred_acceleration=shorts::predict_acceleration_at_distance(distance,kimberley_profile$parameters$MSS,kimberley_profile$parameters$TAU  ),# Air resistancepred_air_resistance=shorts::predict_air_resistance_at_distance(distance,kimberley_profile$parameters$MSS,kimberley_profile$parameters$TAU,bodymass=kimberley_bodymass,bodyheight=kimberley_bodyheight  ),# Forcepred_force=shorts::predict_force_at_distance(distance,kimberley_profile$parameters$MSS,kimberley_profile$parameters$TAU,bodymass=kimberley_bodymass,bodyheight=kimberley_bodyheight  ),# Powerpred_power=shorts::predict_power_at_distance(distance,kimberley_profile$parameters$MSS,kimberley_profile$parameters$TAU,bodymass=kimberley_bodymass,bodyheight=kimberley_bodyheight  ),)# Convert to longkimberley_pred<- gather(kimberley_pred,"metric","value",-distance)ggplot(kimberley_pred, aes(x=distance,y=value))+  geom_line()+  facet_wrap(~metric,scales="free_y")+  xlab("Distance (m)")+  ylab(NULL)

To do prediction simpler, useshorts::predict_kinematics() function.This will provide kinetics and kinematics for 0-6$s$ sprint using 100$Hz$.

predicted_kinematics<- predict_kinematics(kimberley_profile,bodymass=kimberley_bodymass,bodyheight=kimberley_bodyheight)kable(head(predicted_kinematics))
timedistancevelocityaccelerationbodymassinertiaresistanceair_resistancehorizontal_forcehorizontal_force_relativevertical_forceresultant_forceresultant_force_relativepowerpower_relativeworkaverage_poweraverage_power_relativeRFforce_angle
0.000.0000.00010.5960000.00063510.5958986614.400.000.0000.73442.8
0.010.0010.10510.4660000.00362810.4658986014.3661.100.33233.20.5540.72943.2
0.020.0020.20910.3360000.01162010.3358985514.21302.161.31365.61.0940.72543.5
0.030.0050.31210.2160000.02361210.2158984914.21913.182.91897.31.6210.72143.9
0.040.0080.41310.0860000.04160510.0858984414.12504.175.124128.12.1350.71744.2
0.050.0130.5139.9660000.0635979.9658983914.03075.117.910158.22.6370.71244.6

To get model residuals, useresiduals() function:

residuals(kimberley_profile)#> [1] -0.05293 -0.00402  0.01997  0.02699  0.01376 -0.02232

Package{shorts} comes withfind_XXX() family of functions thatallow finding peak power and it’s location, as well ascriticaldistance over which velocity, acceleration, or power drops belowcertain threshold:

# Peak power and locationshorts::find_peak_power_distance(MSS=kimberley_profile$parameters$MSS,MAC=kimberley_profile$parameters$MAC,bodymass=kimberley_bodymass,bodyheight=kimberley_bodyheight)#> $peak_power#> [1] 1384#>#> $distance#> [1] 1.42# Distance over which power is over 80%shorts::find_power_critical_distance(MSS=kimberley_profile$parameters$MSS,MAC=kimberley_profile$parameters$MAC,bodymass=kimberley_bodymass,bodyheight=kimberley_bodyheight,percent=0.8)#> $lower#> [1] 0.342#>#> $upper#> [1] 4.27# Distance over which acceleration is under 50%shorts::find_acceleration_critical_distance(MSS=kimberley_profile$parameters$MSS,MAC=kimberley_profile$parameters$MAC,percent=0.5)#> [1] 1.35# Distance over which velocity is over 95%shorts::find_velocity_critical_distance(MSS=kimberley_profile$parameters$MSS,MAC=kimberley_profile$parameters$MAC,percent=0.95)#> [1] 14.3

Profiling using radar gun data

The radar gun data is modeled using measured velocity as target variableand time as predictor. Individual analysis is performed usingshorts::model_radar_gun() function orshorts::model_laser_gun()(they are aliases). Let’s do analysis for Jim:

jim_data<- filter(radar_gun_data,athlete=="Jim")jim_profile<-shorts::model_radar_gun(time=jim_data$time,velocity=jim_data$velocity)jim_profile#> Estimated model parameters#> --------------------------#>    MSS    MAC    TAU   PMAX#>  7.998  8.999  0.889 17.993#>#> Estimated model corrections#> --------------------------#>       TC#> -0.00011#>#> Model fit estimators#> --------------------#>             R2        meanErr   meanErr_perc         minErr#>   0.9992440860  -0.0000000248           -Inf  -0.1640450506#>    minErr_perc         maxErr    maxErr_perc      maxAbsErr#>           -Inf   0.1511233656   2.3325106593   0.1640450506#> maxAbsErr_perc           RMSE      RMSE_perc            MAE#>            Inf   0.0505025383            Inf   0.0392723633#>       MAE_perc#>            Infsummary(jim_profile)#>#> Formula: velocity ~ predict_velocity_at_time(time - TC, MSS, MAC)#>#> Parameters:#>     Estimate Std. Error t value            Pr(>|t|)#> MSS  7.99801    0.00319 2504.55 <0.0000000000000002 ***#> MAC  8.99871    0.01997  450.61 <0.0000000000000002 ***#> TC  -0.00011    0.00123   -0.09                0.93#> ---#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1#>#> Residual standard error: 0.0506 on 597 degrees of freedom#>#> Number of iterations to convergence: 4#> Achieved convergence tolerance: 0.0000000149confint(jim_profile)#>         2.5%   97.5%#> MSS  7.99175 8.00429#> MAC  8.95959 9.03797#> TC  -0.00253 0.00229plot(jim_profile)

In addition to$MSS$ and$MAC$ parameters,shorts::model_radar_gun()function also estimatedtime-correction ($TC$) parameter.

Rather than estimating$MSS$,shorts::model_radar_gun() functionallows you to utilize peak velocity observed in the data as$MSS$. Thisis done by setting theuse_observed_MSS parameter toTRUE:

jim_profile<-shorts::model_radar_gun(time=jim_data$time,velocity=jim_data$velocity,use_observed_MSS=TRUE)jim_profile#> Estimated model parameters#> --------------------------#>    MSS    MAC    TAU   PMAX#>  8.095  8.678  0.933 17.563#>#> Estimated model corrections#> --------------------------#>      TC#> -0.0112#>#> Model fit estimators#> --------------------#>             R2        meanErr   meanErr_perc         minErr#>         0.9988        -0.0388           -Inf        -0.2287#>    minErr_perc         maxErr    maxErr_perc      maxAbsErr#>           -Inf         0.1825         2.8174         0.2287#> maxAbsErr_perc           RMSE      RMSE_perc            MAE#>            Inf         0.0798            Inf         0.0643#>       MAE_perc#>            Infsummary(jim_profile)#>#> Formula: velocity ~ predict_velocity_at_time(time - TC, MSS, MAC)#>#> Parameters:#>     Estimate Std. Error t value             Pr(>|t|)#> MSS  8.09500    0.00521 1554.10 < 0.0000000000000002 ***#> MAC  8.67822    0.03017  287.60 < 0.0000000000000002 ***#> TC  -0.01118    0.00203   -5.52          0.000000051 ***#> ---#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1#>#> Residual standard error: 0.08 on 597 degrees of freedom#>#> Number of iterations to convergence: 5#> Achieved convergence tolerance: 0.0000000149

Profiling using tether devices

Some tether devices provide data out in a velocity-at-distance format.In this case, velocity is the outcome variable and distance is thepredictor. To estimate sprint profiles fromtether data, useshorts::model_tether() function.

# This creates sprint tracetether_df<-shorts::create_sprint_trace(MSS=7,MAC=6,time= seq(0.01,6,by=0.01))m1<- model_tether(distance=tether_df$distance,velocity=tether_df$velocity)m1#> Estimated model parameters#> --------------------------#>   MSS   MAC   TAU  PMAX#>  7.00  6.00  1.17 10.50#>#> Model fit estimators#> --------------------#>                    R2               meanErr#>  0.999999999999999778  0.000000000000000464#>          meanErr_perc                minErr#>  0.000000000000849181 -0.000000000000038081#>           minErr_perc                maxErr#> -0.000000000032006657  0.000000000000298428#>           maxErr_perc             maxAbsErr#>  0.000000000499514588  0.000000000000298428#>        maxAbsErr_perc                  RMSE#>  0.000000000499514588  0.000000000000012599#>             RMSE_perc                   MAE#>  0.000000000020448893  0.000000000000001438#>              MAE_perc#>  0.000000000000981334plot(m1)

Settinguse_observed_MSS parameter toTRUE in theshorts::model_tether() function also allows you to use observedpeakvelocity as$MSS$.

In the case when distance is not centered at zero, useshorts::model_tether_DC() which also estimated thedistancecorrection ($DC$) parameter, serving as model intercept (for more infoseeUsing corrections section):

# This creates sprint tracetether_df<-shorts::create_sprint_trace(MSS=7,MAC=6,time= seq(0.001,6,by=0.01),# Add distance shiftDC=5)m1<- model_tether_DC(distance=tether_df$distance,velocity=tether_df$velocity)m1#> Estimated model parameters#> --------------------------#>   MSS   MAC   TAU  PMAX#>  7.00  6.00  1.17 10.50#>#> Estimated model corrections#> --------------------------#> DC#>  5#>#> Model fit estimators#> --------------------#>               R2          meanErr     meanErr_perc#>  1.0000000000000  0.0000000000648  0.0000008098034#>           minErr      minErr_perc           maxErr#> -0.0000000000152 -0.0000000002897  0.0000000287380#>      maxErr_perc        maxAbsErr   maxAbsErr_perc#>  0.0004791725496  0.0000000287380  0.0004791725496#>             RMSE        RMSE_perc              MAE#>  0.0000000011812  0.0000195628726  0.0000000000741#>         MAE_perc#>  0.0000008099718plot(m1)

Embedded (i.e.,in-situ) Profiling

With the modern technologies like GPS and LPS, session acceleration andvelocity can be tracked continuously. This provides an opportunity toestimate short sprint profiles fromin-situ, without the need forexplicit testing (assuming the maximal effort was performed). Theanalysis is based on the theoretical model where acceleration andvelocity have linear relationship (i.e., mono-exponential model appliedthus far). The time frame of the analysis can vary from single drills(e.g., sprint drills), session, week, to multiple weeks.

Here is an example of the data collected during one basketball sessionfor a single person. Duration was approx. 90 min with 20$Hz$ samplingrate. This is the positional data:

data("LPS_session")LPS_session %>%  ggplot(aes(x=x,y=y))+  geom_point(alpha=0.1)

The next figure plots instant acceleration and velocity:

LPS_session %>%  ggplot(aes(x=velocity,y=acceleration))+  geom_point(alpha=0.1)

To estimate embedded short sprint profile, we need to filter outpositive acceleration and velocities over 3$ms{-1}$ (default), thenfilter few top acceleration observations per velocity bracket (for moreinformation please see Clavelet al. (2023)). Here is the graphicalrepresentation:

embedded_model<- model_in_situ(LPS_session$velocity,LPS_session$acceleration,velocity_threshold=4)LPS_session %>%  filter(acceleration>0) %>%  ggplot(aes(x=velocity,y=acceleration))+  geom_point(alpha=0.1)+  geom_point(data=embedded_model$data,color="red"  )+  geom_abline(intercept=embedded_model$parameters$MAC,slope=-embedded_model$parameters$MAC/embedded_model$parameters$MSS,linetype="dotted",color="red")+  scale_x_continuous(expand= c(0,0),limits= c(0,embedded_model$parameters$MSS))+  scale_y_continuous(expand= c(0,0),limits= c(0,embedded_model$parameters$MAC))

Force-Velocity Profiling

To estimateForce-Velocity Profile (FVP) using approach by Samozinoet al. (2016, 2022) useshorts::create_FVP():

kimberley_fv<-shorts::create_FVP(MSS=kimberley_profile$parameters$MSS,MAC=kimberley_profile$parameters$MAC,# These are needed to estimate air resistancebodymass=kimberley_bodymass,bodyheight=kimberley_bodyheight)kimberley_fv#> $bodymass#> [1] 60#>#> $F0#> [1] 635#>#> $F0_rel#> [1] 10.6#>#> $V0#> [1] 8.85#>#> $Pmax#> [1] 1405#>#> $Pmax_rel#> [1] 23.4#>#> $FV_slope#> [1] -1.2

To convert back toAcceleration-Velocity Profile (AVP), use:

kimberley_avp<-shorts::convert_FVP(F0=kimberley_fv$F0,V0=kimberley_fv$V0,bodymass=kimberley_bodymass,bodyheight=kimberley_bodyheight)kimberley_avp#> $MSS#> [1] 8.59#>#> $MAC#> [1] 10.6

Using external load

{shorts} package also allows utilizing external load in estimatingFVP, as well as using FVP parameters to predict kinematic and kineticvariables. External load is represented either with additionalinertia (i.e., weight vest), horizontalresistance (i.e., tetherdevice that create additional resistance or help, or a hill sprinting),or both (i.e., a sled, which have both inertia and resistance due tofriction forces). One might also consider head and tail wind as a formof resistance (or assistance).

Let’s see how theoretical model, assuming FVP isdeterminant ofperformance (which I do not agree with, BTW), predicts changes insprint characteristics (i.e.,$MSS$ and$MAC$) under different externalload conditions and magnitudes using Kimberley’s estimated FVP:

loads_df<- rbind(  tibble(type="Weight vest",magnitude= seq(0,20,length.out=100),inertia=magnitude,resistance=0),  tibble(type="Tether",magnitude= seq(-50,200,length.out=100),inertia=0,resistance=magnitude),  tibble(type="Sled",magnitude= seq(0,40,length.out=100),inertia=magnitude,resistance=magnitude*9.81*0.4)) %>%  mutate(data.frame(shorts::convert_FVP(F0=kimberley_fv$F0,V0=kimberley_fv$V0,bodymass=kimberley_bodymass,bodyheight=kimberley_bodyheight,inertia=inertia,resistance=resistance    ))  )loads_df %>%  pivot_longer(cols= c(MSS,MAC),names_to="parameter") %>%  ggplot(aes(x=magnitude,y=value,color=parameter))+  geom_vline(xintercept=0,linetype="dotted")+  geom_line()+  facet_wrap(~type,scales="free_x")+  ylab(NULL)

Following figure depicts the effect on split times under different loadtypes and magnitudes, assuming FVP to be determinant of performance(i.e., causal mechanism):

dist_df<- expand_grid(loads_df,distance= c(5,10,20,30,40)) %>%  mutate(time= predict_time_at_distance(distance,MSS,MAC),distance=factor(      paste0(distance,"m"),levels= c("5m","10m","20m","30m","40m"))  )dist_df %>%  ggplot(aes(x=magnitude,y=time,color=distance))+  geom_vline(xintercept=0,linetype="dotted")+  geom_line()+  facet_wrap(~type,scales="free_x")+  ylab("Time (s)")

One can use external resistance when predicting force or power:

shorts::predict_force_at_time(time=0.5,MSS=9,MAC=7,bodymass=75,inertia=20,resistance=50)#> [1] 503shorts::predict_power_at_time(time=0.5,MSS=9,MAC=7,bodymass=75,inertia=20,resistance=50)#> [1] 1459shorts::predict_time_at_distance_FV(distance=10,F0=750,V0=8,bodymass=75,inertia=20,resistance=50)#> [1] 2.26

External resistances can also be utilized in theOptimization functions, covered later.

Using corrections

You have probably noticed that estimated$MSS$ and$TAU$ were a bit toohigh for splits data. Biased estimates are due to differences instarting positions andtiming triggering methods for certainmeasurement approaches (e.g. starting behind first timing gate, orallowing for body rocking).

Here I will provide quick summary (see more in Jovanović M., 2023).Often, this bias in estimates is dealt with by using heuristic rule ofthumb of adding time correction (time_correction) to split times(e.g. from 0.3-0.5$sec$; see more in Haugenet al., 2012). To dothis, just add time correction to time split:

kimberley_profile_fixed_TC<-shorts::model_timing_gates(distance=kimberley_data$distance,time=kimberley_data$time+0.3)kimberley_profile_fixed_TC#> Estimated model parameters#> --------------------------#>   MSS   MAC   TAU  PMAX#>  9.13  6.63  1.38 15.12#>#> Model fit estimators#> --------------------#>             R2        meanErr   meanErr_perc         minErr#>        0.99997        0.00101        0.12559       -0.00769#>    minErr_perc         maxErr    maxErr_perc      maxAbsErr#>       -0.22296        0.01640        1.12474        0.01640#> maxAbsErr_perc           RMSE      RMSE_perc            MAE#>        1.12474        0.00814        0.47704        0.00639#>       MAE_perc#>        0.28570summary(kimberley_profile_fixed_TC)#>#> Formula: time ~ predict_time_at_distance(distance, MSS, MAC)#>#> Parameters:#>     Estimate Std. Error t value     Pr(>|t|)#> MSS   9.1278     0.0536     170 0.0000000071 ***#> MAC   6.6257     0.0657     101 0.0000000579 ***#> ---#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1#>#> Residual standard error: 0.00997 on 4 degrees of freedom#>#> Number of iterations to convergence: 5#> Achieved convergence tolerance: 0.0000000149coef(kimberley_profile_fixed_TC)#>  MSS  MAC#> 9.13 6.63

Instead of providing forTC, this parameter can be estimated usingshorts::model_timing_gates_TC().

kimberley_profile_TC<-shorts::model_timing_gates_TC(distance=kimberley_data$distance,time=kimberley_data$time)kimberley_profile_TC#> Estimated model parameters#> --------------------------#>   MSS   MAC   TAU  PMAX#>  8.97  7.27  1.23 16.31#>#> Estimated model corrections#> --------------------------#>     TC#> -0.235#>#> Model fit estimators#> --------------------#>               R2          meanErr     meanErr_perc#>  0.9999996942338  0.0000000000185  0.0018162748771#>           minErr      minErr_perc           maxErr#> -0.0011807344888 -0.0623737183716  0.0012094657303#>      maxErr_perc        maxAbsErr   maxAbsErr_perc#>  0.0597477188383  0.0012094657303  0.0623737183716#>             RMSE        RMSE_perc              MAE#>  0.0007983564900  0.0374822377932  0.0006586033619#>         MAE_perc#>  0.0282353234295

Instead of estimatingTC,{shorts} package features a method ofestimating flying start distance (FD):

kimberley_profile_FD<-shorts::model_timing_gates_FD(distance=kimberley_data$distance,time=kimberley_data$time)kimberley_profile_FD#> Estimated model parameters#> --------------------------#>   MSS   MAC   TAU  PMAX#>  9.00  6.99  1.29 15.74#>#> Estimated model corrections#> --------------------------#>    FD#> 0.302#>#> Model fit estimators#> --------------------#>             R2        meanErr   meanErr_perc         minErr#>    0.999999963    0.000000645    0.000318263   -0.000403616#>    minErr_perc         maxErr    maxErr_perc      maxAbsErr#>   -0.012817270    0.000455703    0.010565804    0.000455703#> maxAbsErr_perc           RMSE      RMSE_perc            MAE#>    0.012817270    0.000275866    0.008402638    0.000236754#>       MAE_perc#>    0.007829105

If you want to use fixedFD parameter (e.g., when you know what is theflying distance), useshorts::model_timing_gates_FD_fixed() function:

kimberley_profile_fixed_FD<-shorts::model_timing_gates_FD_fixed(distance=kimberley_data$distance,time=kimberley_data$time,FD=0.5)kimberley_profile_fixed_FD#> Estimated model parameters#> --------------------------#>   MSS   MAC   TAU  PMAX#>  9.18  6.23  1.47 14.30#>#> Estimated model corrections#> --------------------------#>  FD#> 0.5#>#> Model fit estimators#> --------------------#>             R2        meanErr   meanErr_perc         minErr#>        0.99997        0.00125        0.17740       -0.00790#>    minErr_perc         maxErr    maxErr_perc      maxAbsErr#>       -0.25099        0.01546        1.33523        0.01546#> maxAbsErr_perc           RMSE      RMSE_perc            MAE#>        1.33523        0.00794        0.56493        0.00672#>       MAE_perc#>        0.34991

There are other corrections involving time correction (TC), distancecorrection (DC), flying distance correction (FD), and time anddistance corrections (TC+DC). They are implemented in themodel_timing_gates_ andmodel_time_distance_ functions. Thedifference between themodel_timing_gates_ andmodel_time_distance_is in reversing predictor and outcome variables.

Cross-Validation (CV)

model_ family of functions come with CV feature that is performed bysetting the function parameter CV to desired number of folds. Thisfeature is very useful for checking model parameters robustness andmodel predictions on unseen data. Let’s use Kimberley again, but thistime perform special kind of CV, leave-one-out-cross-validation (LOOCV):

kimberley_profile_CV<-shorts::model_timing_gates(distance=kimberley_data$distance,time=kimberley_data$time,# To perform LOOCV number of folds is equal to# number of observationsCV= nrow(kimberley_data))kimberley_profile_CV#> Estimated model parameters#> --------------------------#>    MSS    MAC    TAU   PMAX#>  8.591 10.589  0.811 22.743#>#> Model fit estimators#> --------------------#>             R2        meanErr   meanErr_perc         minErr#>        0.99966       -0.00309       -0.53860       -0.05293#>    minErr_perc         maxErr    maxErr_perc      maxAbsErr#>       -4.57121        0.02699        0.85715        0.05293#> maxAbsErr_perc           RMSE      RMSE_perc            MAE#>        4.57121        0.02779        1.93922        0.02333#>       MAE_perc#>        1.19263#>#>#> Cross-Validation#> ------------------------------#> Parameters:#>   .fold  MSS  MAC   TAU PMAX#> 1     1 8.69 10.2 0.856 22.1#> 2     2 8.56 10.8 0.795 23.0#> 3     3 8.39 11.1 0.760 23.2#> 4     4 8.57 10.8 0.797 23.0#> 5     5 8.61 10.6 0.813 22.8#> 6     6 8.60 10.5 0.815 22.7#>#> Testing model fit estimators (overall):#>             R2        meanErr   meanErr_perc         minErr#>         0.9990        -0.0124        -0.8548        -0.0801#>    minErr_perc         maxErr    maxErr_perc      maxAbsErr#>        -5.9601         0.0344         1.0940         0.0801#> maxAbsErr_perc           RMSE      RMSE_perc            MAE#>         5.9601         0.0474         2.5920         0.0392#>       MAE_perc#>         1.7227

Radar gun data often comes with much more observations, thus we can setsmaller CV parameter:

jim_profile_CV<-shorts::model_radar_gun(time=jim_data$time,velocity=jim_data$velocity,CV=10)jim_profile_CV#> Estimated model parameters#> --------------------------#>    MSS    MAC    TAU   PMAX#>  7.998  8.999  0.889 17.993#>#> Estimated model corrections#> --------------------------#>       TC#> -0.00011#>#> Model fit estimators#> --------------------#>             R2        meanErr   meanErr_perc         minErr#>   0.9992440860  -0.0000000248           -Inf  -0.1640450506#>    minErr_perc         maxErr    maxErr_perc      maxAbsErr#>           -Inf   0.1511233656   2.3325106593   0.1640450506#> maxAbsErr_perc           RMSE      RMSE_perc            MAE#>            Inf   0.0505025383            Inf   0.0392723633#>       MAE_perc#>            Inf#>#>#> Cross-Validation#> ------------------------------#> Parameters:#>    .fold MSS  MAC   TAU PMAX#> 1      1   8 8.99 0.889   18#> 2      2   8 9.00 0.888   18#> 3      3   8 9.00 0.889   18#> 4      4   8 9.00 0.889   18#> 5      5   8 9.00 0.889   18#> 6      6   8 9.00 0.888   18#> 7      7   8 9.00 0.889   18#> 8      8   8 9.00 0.889   18#> 9      9   8 9.01 0.888   18#> 10    10   8 8.99 0.890   18#>#> Testing model fit estimators (overall):#>             R2        meanErr   meanErr_perc         minErr#>      0.9992387     -0.0000138           -Inf     -0.1616499#>    minErr_perc         maxErr    maxErr_perc      maxAbsErr#>           -Inf      0.1507892      2.3273526      0.1616499#> maxAbsErr_perc           RMSE      RMSE_perc            MAE#>            Inf      0.0506812            Inf      0.0394415#>       MAE_perc#>            Inf

Optimization

Using the method outlined in Samozinoet al (2022), one can find theoptimal profiles, as well as the profile imbalance (compared to theoptimal), for both sprint profiles (i.e.,$MSS$ and$MAC$) andForce-Velocity (FV). In addition to this, one canprobe the profiles(i.e., increase$V0$ /$F0$ or$MSS$ /$MAC$ for say 2.5% to check whichimprovement yield more improvement in sprint time). The following graphdepicts estimate profile imbalances. Note that >100% is velocitydeficit (i.e., increasingvelocity;$MSS$ or$V0$; will yield moreimprovement in sprint times), while <100% isforce deficit.

MSS<-10MAC<-8bodymass<-75fv<- create_FVP(MSS,MAC,bodymass)opt_df<- tibble(dist= seq(5,50,by=5)) %>%  mutate(`Sprint Profile`= optimal_MSS_MAC(distance=dist,MSS,MAC    )[["profile_imb"]],`FV Profile`= optimal_FV(distance=dist,fv$F0,fv$V0,bodymass    )[["profile_imb"]],`FV Profile (PeakPower)`= optimal_FV(distance=dist,fv$F0,fv$V0,bodymass,method="peak"    )[["profile_imb"]],`Probe FV`= probe_FV(distance=dist,fv$F0,fv$V0,bodymass    )[["profile_imb"]],`Probe MSS/MAC`= probe_MSS_MAC(distance=dist,MSS,MAC    )[["profile_imb"]]  ) %>%  pivot_longer(-dist,names_to="profile")opt_dist<- tibble(`Sprint Profile`= find_optimal_distance(MSS,MAC,optimal_func=optimal_MSS_MAC  ),`FV Profile`= find_optimal_distance(fv$F0,fv$V0,bodymass,optimal_func=optimal_FV  ),`FV Profile (PeakPower)`= find_optimal_distance(fv$F0,fv$V0,bodymass,optimal_func=optimal_FV,method="peak"  ),`Probe FV`= find_optimal_distance(fv$F0,fv$V0,bodymass,optimal_func=probe_FV  ),`Probe MSS/MAC`= find_optimal_distance(MSS,MAC,optimal_func=probe_MSS_MAC  )) %>%  pivot_longer(cols=1:5,names_to="profile")ggplot(opt_df, aes(x=dist,y=value,color=profile))+  geom_hline(yintercept=100,linetype="dashed",alpha=0.6)+  geom_line()+  geom_point(data=opt_dist, aes(x=value,y=100),size=2)+  xlab("Distance (m)")+  ylab("Profile imbalance")

Creating your own data

One can use the{shorts}} package for simulating data by using twofunctions:create_sprint_trace() andcreate_timing_gates_splits():

create_sprint_trace(MSS=7,MAC=6,distance= c(5,10,20,30,40),# Add flying distanceFD=0.5)#>   time distance velocity acceleration sprint_time#> 1 1.24        5     5.33       1.4280        1.67#> 2 2.10       10     6.20       0.6839        2.53#> 3 3.63       20     6.78       0.1850        4.06#> 4 5.08       30     6.94       0.0532        5.51#> 5 6.52       40     6.98       0.0155        6.95#>   sprint_distance#> 1             5.5#> 2            10.5#> 3            20.5#> 4            30.5#> 5            40.5create_timing_gates_splits(MSS=7,MAC=6,gates= c(5,10,20,30,40),# Add time-shift (i.e., rection time of 200ms)TC=0.2)#> [1] 1.78 2.65 4.19 5.64 7.08

Usingpredict_ family of functions, one can predict kinematics andkinetics usingknown$MSS$ and$MAC$ parameters.

Publications

  1. Jovanović, M., Vescovi, J.D. (2022).{shorts}: An R Package forModeling Short Sprints.International Journal of Strength andConditioning, 2(1).https://doi.org/10.47206/ijsc.v2i1.74

  2. Jovanović M. (2023).Bias in estimated short sprint profiles usingtiming gates due to the flying start: simulation study and proposedsolutions.Computer Methods in Biomechanics and BiomedicalEngineering:1–11.https://doi.org/10.1080/10255842.2023.2170713

  3. Jovanović M.,et al. (2024).Effects of the Flying Start onEstimated Short Sprint Profiles Using Timing Gates.Sensors 2024,24(9), 2894.https://doi.org/10.3390/s24092894

  4. Jovanović M.,et al. (2024).Agreement and Sensitivity of theAcceleration–Velocity Profile Derived via Local PositioningSystem.Sensors 2024, 24(19), 6192.https://doi.org/10.3390/s24196192

  5. Vescovi, JD and Jovanović, M. (2021).Sprint MechanicalCharacteristics of Female Soccer Players: A Retrospective PilotStudy to Examine a Novel Approach for Correction of Timing GateStarts.Front Sports Act Living 3: 629694, 2021.https://doi.org/10.3389/fspor.2021.629694

Citation

To cite{shorts}, please use the following command to get the BibTexentry:

citation("shorts")

References

Please refer to these publications for more information on short sprintsmodeling using mono-exponential equation:

Chelly SM, Denis C. 2001. Leg power and hopping stiffness: relationshipwith sprint running performance: Medicine and Science in Sports andExercise:326–333. DOI: 10.1097/00005768-200102000-00024.

Clark KP, Rieger RH, Bruno RF, Stearne DJ. 2017. The NFL Combine 40-YardDash: How Important is Maximum Velocity? Journal of Strength andConditioning Research:1. DOI: 10.1519/JSC.0000000000002081.

Clavel, P., Leduc, C., Morin, J.-B., Buchheit, M., & Lacome, M. (2023).Reliability of individual acceleration-speed profile in-situ in eliteyouth soccer players. Journal of Biomechanics, 153, 111602.https://doi.org/10.1016/j.jbiomech.2023.111602

Furusawa K, Hill AV, and Parkinson JL. The dynamics of” sprint” running.Proceedings of the Royal Society of London. Series B, Containing Papersof a Biological Character 102 (713): 29-42, 1927

Greene PR. 1986. Predicting sprint dynamics from maximum-velocitymeasurements. Mathematical Biosciences 80:1–18. DOI:10.1016/0025-5564(86)90063-5.

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, Rabita G, Dorel S, Slawinski J, Peyrot N, Saez de VillarrealE, Morin J-B. 2016. A simple method for measuring power, force, velocityproperties, and mechanical effectiveness in sprint running: Simplemethod to compute sprint mechanics. Scandinavian Journal of Medicine &Science in Sports 26:648–658. DOI: 10.1111/sms.12490.

Samozino P. 2018. A Simple Method for Measuring Force, Velocity andPower 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.

Samozino P, Peyrot N, Edouard P, Nagahara R, Jimenez‐Reyes P,Vanwanseele B, Morin J. 2022. Optimal mechanical force‐velocity profilefor sprint acceleration performance.Scandinavian Journal of Medicine &Science in Sports 32:559–575. DOI: 10.1111/sms.14097.

About

Shorts is R package that creates short sprint profiles

Resources

License

Unknown, MIT licenses found

Licenses found

Unknown
LICENSE
MIT
LICENSE.md

Stars

Watchers

Forks

Packages

No packages published

Languages


[8]ページ先頭

©2009-2025 Movatter.jp