MLS_data_analysis_2

Loading packages

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.0
✔ ggplot2   3.4.4     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.0
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(janitor)

Attaching package: 'janitor'

The following objects are masked from 'package:stats':

    chisq.test, fisher.test
library(readxl)
library(ggplot2)
library(dplyr)
library(gridExtra)

Attaching package: 'gridExtra'

The following object is masked from 'package:dplyr':

    combine

Setting working directory

setwd("/Users/matthewmccarthy/Library/CloudStorage/OneDrive-TeessideUniversity/MSc strength and condtioning /Data_analsysis/Assignment/excel_sheet")

Now we read in the data set and call it “data”, then using the janitor function to clean column names on the data set.

data <- read_excel("2020 Travel Data with All Games.xlsx")

names<-names(data%>%clean_names)
colnames(data) <- names

Home performance

home_performance <- data %>%
  group_by(home) %>%
  summarise(
    HomeWins = sum(home_result == 3),
    HomeDraws = sum(home_result == 1),
    HomeLosses = sum(home_result == 0),
    TotalHomeGames = n()
  ) %>%
  mutate(
    HomeWinRate = HomeWins / TotalHomeGames,
    HomeLossRate = HomeLosses / TotalHomeGames,
    HomeDrawRate = HomeDraws / TotalHomeGames
  )

Away performance

away_performance <- data %>%
  group_by(away) %>%
  summarise(
    AwayWins = sum(away_result == 3),
    AwayDraws = sum(away_result == 1),
    AwayLosses = sum(away_result == 0),
    TotalAwayGames = n()
  ) %>%
  mutate(
    AwayWinRate = AwayWins / TotalAwayGames,
    AwayLossRate = AwayLosses / TotalAwayGames,
    AwayDrawRate = AwayDraws / TotalAwayGames
  )

Creating performance metrics data set

performance_metrics <- inner_join(home_performance, away_performance, by = c("home" = "away"))

Combining the home and away win rates into a single column

winrate_data <- performance_metrics %>%
  select(home, HomeWinRate, AwayWinRate) 

Convert data to long format for plotting

winrate_data_long <- winrate_data %>%
  pivot_longer(cols = c(HomeWinRate, AwayWinRate), names_to = "location", values_to = "WinRate")

Creating box plot to show home and away team win rate

winrate_boxplot <- ggplot(winrate_data_long, aes(x = location, y = WinRate)) +
  geom_boxplot()
print(winrate_boxplot)
Warning: Removed 2 rows containing non-finite values (`stat_boxplot()`).

Customizing box plot and adding theme

winrate_boxplot <- ggplot(winrate_data_long, aes(x = location, y = WinRate, fill = location, color = location)) +
  geom_boxplot(fill = c("lightblue", "lightcoral")) +
  labs(title = "Box Plot of Win Rate", x = "Location", y = "Win Rate") +
  scale_fill_manual(values = c("lightblue", "lightcoral"), labels = c("Home", "Away")) +
  scale_color_manual(values = c("darkblue", "red"), labels = c("Home", "Away")) +
  theme_classic()
print(winrate_boxplot)
Warning: Removed 2 rows containing non-finite values (`stat_boxplot()`).

Performing a t-test on win rate

t.test(performance_metrics$AwayWinRate, performance_metrics$HomeWinRate, paired = TRUE)

    Paired t-test

data:  performance_metrics$AwayWinRate and performance_metrics$HomeWinRate
t = -3.4214, df = 23, p-value = 0.002334
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
 -0.28667159 -0.07063661
sample estimates:
mean difference 
     -0.1786541 

This code uses the dataset “cleaned data” to create a bar chart to show the frequency of points won for away team when travelling in different directions.

Creating graphs for direction of travel and tiem zone difference

# Ensure direction_of_travel is a factor with levels ordered appropriately
data$direction_of_travel <- factor(data$direction_of_travel, levels = c("0", "North", "South", "East", "West"))

# Filter out rows with missing values in direction_of_travel and away_result
cleaned_data <- data[complete.cases(data$direction_of_travel, data$away_result),]

# Create the plot
p <- ggplot(cleaned_data, aes(x = direction_of_travel, fill = factor(away_result))) +
  geom_bar(position = "dodge", colour = "black") +
  scale_fill_manual(values = c("red", "yellow", "green")) +
  labs(x = "Direction of travel", y = "Frequency", fill = "Away Team Results") +
  theme_classic() +
  theme(axis.text = element_text(size = 10, face = "bold"))

# Display the plot
print(p)

cleaned_data <- data[complete.cases(data$direction_of_travel, data$away_result),]

# Filter data to include only "West" and "East" directions of travel
cleaned_data <- subset(cleaned_data, direction_of_travel %in% c("West", "East"))

# Create the first plot
p <- ggplot(cleaned_data, aes(x = direction_of_travel, fill = factor(away_result))) +
  geom_bar(position = "dodge", colour = "black") +
  scale_fill_manual(values = c("red", "yellow", "green")) +
  labs(x = "Direction of travel", y = "Frequency", fill = "Away Team Results", title = "East vs West Direction of Travel") + # Added title
  theme_classic() +
  theme(axis.text = element_text(size = 10, face = "bold"),
        axis.title.x = element_text(face = "bold"),  # Make x-axis title bold
        plot.title = element_text(face = "bold"))   # Make plot title bold

print(p)

This code uses the dataset “cleaned data” to create a bar chart to show the frequency of points won for away team when travelling across different time zones.

cleaned_data <- data[complete.cases(data$away_time_zone_difference, data$away_result),]

# Create the plot
p <- ggplot(cleaned_data, aes(x = away_time_zone_difference, fill = factor(away_result))) +
  geom_bar(position = "dodge", colour = "black") +
  scale_fill_manual(values = c("red", "yellow", "green")) +
  labs(x = "Time Zone Difference", y = "Frequency", fill = "Away Team Results", title = "Time Zone Difference") +
  theme_classic() +
  theme(axis.text = element_text(size = 10, face = "bold"),
        axis.title.x = element_text(face = "bold"),  # Make x-axis title bold
        plot.title = element_text(face = "bold"))   # Make plot title bold
print(p)

Here is a graph to show the frequency of away team scoring when travelling across different time zones.

ggplot(data = data,
       aes(x = away_time_zone_difference,
           y = away_score,
           color = away_time_zone_difference)) +
  geom_jitter() +
  labs(x = "Away Team Time Zone Difference",
       y = "Away Team Score",
       title = "Away Team Score Across Different Time Zones") +
  theme_classic()
Warning: Removed 2 rows containing missing values (`geom_point()`).

ggplot(data = data,
       aes(x = away_time_zone_difference,
           y = home_score,
           color = away_time_zone_difference)) +
  geom_jitter() +
  labs(x = "Away Team Time Zone Difference",
       y = "Away Team Conceding Goals",
       title = "Away Team Conceding Goals Across Different Time Zones") +
  theme_classic()
Warning: Removed 2 rows containing missing values (`geom_point()`).

This graph uses the data set “cleaned_data2” which has cleared any data that does not have any data in and plots a bar chart for the frequency of the away team scoring when travelling in different directions.

cleaned_data2 <- data[complete.cases(data$direction_of_travel, data$away_score),]

# Ensure direction_of_travel is a factor with levels ordered appropriately
cleaned_data2$direction_of_travel <- factor(cleaned_data2$direction_of_travel, levels = c("North", "South", "East", "West"))

# Create the plot
ggplot(cleaned_data2, aes(x = direction_of_travel, fill = factor(away_score))) +
  geom_bar() +
  labs(x = "Direction of travel", y = "Frequency", fill = "Away Team Score") +
  theme_classic()

Just like the code above making a bar chart to see away team scoring when travelling different directions however, i have filtered the code so it only plots the data from the east and west direction of travel.

flitered_data2 <- subset(cleaned_data, direction_of_travel %in% c("West", "East"))


ggplot(flitered_data2, aes(x = direction_of_travel, fill = factor(away_score))) +
  geom_bar() +
  labs(x = "Direction of travel", y = "Frequency", fill = "Away Team Score") +
  theme_classic()

This creates a bar chart for seeing away team conceding goals when travelling either west and east.

cleaned_data <- data[complete.cases(data$direction_of_travel, data$home_score),]
ggplot(cleaned_data, aes(x = direction_of_travel, fill = factor(home_score))) +
  geom_bar() +
  labs(x = "Direction of travel", y = "Frequency", fill = "Away Team Conceding") +
  theme_classic()

Creating bar chart for nights in hotel

This code uses the dataset “cleaned data” to create a bar chart to show the frequency of points won for away team when the away team have stayed nights in hotel after travelling.

p <- ggplot(cleaned_data, aes(x = nights_in_hotel , fill = factor(away_result))) +
  geom_bar(position = "dodge", colour = "black") +
  scale_fill_manual(values = c("red", "yellow", "green")) +
  labs(x = "Nights in hotel", y = "Frequency", fill = "Away Team Results", title = "Nights in hotel") +
  theme_classic() +
  theme(axis.text = element_text(size = 10, face = "bold"),
        axis.title.x = element_text(face = "bold"),  # Make x-axis title bold
        plot.title = element_text(face = "bold"))   # Make plot title bold
print(p)

Creating a data set called “Results”

First I created a data set called home and another called away which included the teams name and the results and location. Then i rbind the two datasets to create another called results.

home <- data %>% subset(select = c(home, home_result)) %>% 
  rename( team = home, result = home_result) %>%
  mutate(location = "home")

away <- data %>% subset(select = c(away, away_result)) %>% 
  rename( team = away, result = away_result) %>%
  mutate(location = "away")

results<-rbind(home, away)
head(results)
# A tibble: 6 × 3
  team  result location
  <chr>  <dbl> <chr>   
1 ORL        1 home    
2 MIA        3 home    
3 NSH        3 home    
4 CHI        3 home    
5 DC         0 home    
6 MIA        1 home    

Creating mixed linear models

This code creates a dataset called “cleaned_data” and filters the direction of travel data so it only uses the data that has the away team travelling East and West.

flitered_data<-data %>%
filter(direction_of_travel %in% c("East" ,"West"))

Creating model 1

This data loads a package called “lme4” which is used so the user can create linear and generalized linear mixed effects models.

The package called “emmenas” is used to estimate marginal means, least squares and performing post hoc comparisons in the mixed linear model.

# Fit linear model
library(lme4)
Loading required package: Matrix

Attaching package: 'Matrix'
The following objects are masked from 'package:tidyr':

    expand, pack, unpack
model1 <- lmer(away_result ~ direction_of_travel + (1 | away), data = flitered_data)
summary(model1)
Linear mixed model fit by REML ['lmerMod']
Formula: away_result ~ direction_of_travel + (1 | away)
   Data: flitered_data

REML criterion at convergence: 270.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.1132 -0.7441 -0.2723  1.2511  1.6326 

Random effects:
 Groups   Name        Variance Std.Dev.
 away     (Intercept) 0.03064  0.175   
 Residual             1.61232  1.270   
Number of obs: 81, groups:  away, 23

Fixed effects:
                        Estimate Std. Error t value
(Intercept)               0.9596     0.1901   5.049
direction_of_travelWest   0.3846     0.2887   1.332

Correlation of Fixed Effects:
            (Intr)
drctn_f_trW -0.634
library(emmeans)
emm <- emmeans(model1, pairwise ~ direction_of_travel)
emm
$emmeans
 direction_of_travel emmean    SE   df lower.CL upper.CL
 East                  0.96 0.193 37.8    0.569     1.35
 West                  1.34 0.230 38.3    0.878     1.81

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
 contrast    estimate    SE   df t.ratio p.value
 East - West   -0.385 0.297 78.7  -1.296  0.1988

Degrees-of-freedom method: kenward-roger 
confint(emm)
$emmeans
 direction_of_travel emmean    SE   df lower.CL upper.CL
 East                  0.96 0.193 37.8    0.569     1.35
 West                  1.34 0.230 38.3    0.878     1.81

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
 contrast    estimate    SE   df lower.CL upper.CL
 East - West   -0.385 0.297 78.7   -0.975    0.206

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

Creating model 2

model2 <- lmer(away_result ~ direction_of_travel + away_time_zone_difference + (1 | away), data = flitered_data)

summary(model2)
Linear mixed model fit by REML ['lmerMod']
Formula: away_result ~ direction_of_travel + away_time_zone_difference +  
    (1 | away)
   Data: flitered_data

REML criterion at convergence: 267.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.4292 -0.7476 -0.3226  1.2258  1.7276 

Random effects:
 Groups   Name        Variance Std.Dev.
 away     (Intercept) 0.1049   0.3238  
 Residual             1.4720   1.2132  
Number of obs: 81, groups:  away, 23

Fixed effects:
                          Estimate Std. Error t value
(Intercept)                 1.2533     0.2311   5.422
direction_of_travelWest    -0.1750     0.3664  -0.478
away_time_zone_difference  -0.4342     0.1898  -2.288

Correlation of Fixed Effects:
            (Intr) drc__W
drctn_f_trW -0.737       
awy_tm_zn_d -0.549  0.639
emm <- emmeans(model2, pairwise ~ direction_of_travel)
emm
$emmeans
 direction_of_travel emmean    SE   df lower.CL upper.CL
 East                  1.19 0.221 39.4    0.742     1.64
 West                  1.01 0.272 46.4    0.466     1.56

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
 contrast    estimate    SE   df t.ratio p.value
 East - West    0.175 0.378 75.7   0.463  0.6445

Degrees-of-freedom method: kenward-roger 

Using the performance package to rate the models

The performance package provides a comprehensive set of tools for evaluating, comparing and analyzing the performance of predictive models.

library(performance)

compare_performance(model1, model2, rank =TRUE)
# Comparison of Model Performance Indices

Name   |   Model | R2 (cond.) | R2 (marg.) |   ICC |  RMSE | Sigma | AIC weights | AICc weights | BIC weights | Performance-Score
---------------------------------------------------------------------------------------------------------------------------------
model2 | lmerMod |      0.141 |      0.080 | 0.067 | 1.159 | 1.213 |       0.808 |        0.786 |       0.560 |           100.00%
model1 | lmerMod |      0.040 |      0.022 | 0.019 | 1.243 | 1.270 |       0.192 |        0.214 |       0.440 |             0.00%

Creating model 3

model3 <- lmer(away_result ~ nights_in_hotel + (1 | away), data = flitered_data)
summary(model3)
Linear mixed model fit by REML ['lmerMod']
Formula: away_result ~ nights_in_hotel + (1 | away)
   Data: flitered_data

REML criterion at convergence: 271.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.1089 -0.8656 -0.2612  1.3086  1.5976 

Random effects:
 Groups   Name        Variance Std.Dev.
 away     (Intercept) 0.09459  0.3075  
 Residual             1.57748  1.2560  
Number of obs: 81, groups:  away, 23

Fixed effects:
                Estimate Std. Error t value
(Intercept)       1.1681     0.1683   6.939
nights_in_hotel  -0.3179     0.3516  -0.904

Correlation of Fixed Effects:
            (Intr)
nghts_n_htl -0.361
library(emmeans)
emm <- emmeans(model3, pairwise ~ nights_in_hotel)
emm
$emmeans
 nights_in_hotel emmean   SE   df lower.CL upper.CL
           0.173   1.11 0.16 17.1    0.776     1.45

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
 contrast  estimate SE df z.ratio p.value
 (nothing)   nonEst NA NA      NA      NA

Degrees-of-freedom method: kenward-roger 
confint(emm)
$emmeans
 nights_in_hotel emmean   SE   df lower.CL upper.CL
           0.173   1.11 0.16 17.1    0.776     1.45

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
 contrast  estimate SE df asymp.LCL asymp.UCL
 (nothing)   nonEst NA NA        NA        NA

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

Creating model 4

model4 <- lmer(result ~ location + (1 | team), data = results)
summary(model1)
Linear mixed model fit by REML ['lmerMod']
Formula: away_result ~ direction_of_travel + (1 | away)
   Data: flitered_data

REML criterion at convergence: 270.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.1132 -0.7441 -0.2723  1.2511  1.6326 

Random effects:
 Groups   Name        Variance Std.Dev.
 away     (Intercept) 0.03064  0.175   
 Residual             1.61232  1.270   
Number of obs: 81, groups:  away, 23

Fixed effects:
                        Estimate Std. Error t value
(Intercept)               0.9596     0.1901   5.049
direction_of_travelWest   0.3846     0.2887   1.332

Correlation of Fixed Effects:
            (Intr)
drctn_f_trW -0.634
library(emmeans)
emm <- emmeans(model4, pairwise ~ location)
emm
$emmeans
 location emmean    SE   df lower.CL upper.CL
 away       1.10 0.097 67.9     0.91     1.30
 home       1.68 0.097 67.6     1.48     1.87

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
 contrast    estimate    SE  df t.ratio p.value
 away - home   -0.573 0.123 419  -4.645  <.0001

Degrees-of-freedom method: kenward-roger 
confint(emm)
$emmeans
 location emmean    SE   df lower.CL upper.CL
 away       1.10 0.097 67.9     0.91     1.30
 home       1.68 0.097 67.6     1.48     1.87

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
 contrast    estimate    SE  df lower.CL upper.CL
 away - home   -0.573 0.123 419   -0.815    -0.33

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

Pearson’s correlation test

# Calculate Pearson correlation coefficient and conduct the test
correlation_result <- cor.test(data$away_time_zone_difference, data$away_result, method = "pearson")

# Print the result
print(correlation_result)

    Pearson's product-moment correlation

data:  data$away_time_zone_difference and data$away_result
t = -1.9621, df = 219, p-value = 0.05102
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.2589176533  0.0005430837
sample estimates:
       cor 
-0.1314376 
correlation_result <- cor.test(data$nights_in_hotel, data$away_result, method = "pearson")

# Print the result
print(correlation_result)

    Pearson's product-moment correlation

data:  data$nights_in_hotel and data$away_result
t = 0.24629, df = 219, p-value = 0.8057
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.1155848  0.1482858
sample estimates:
       cor 
0.01664023 

What does this means ?

T-test on win rate between home and away teams

The test examined the performance metrics of the away and home win rates for the full season of the 2020 year.

The findings from the paired t-test were a t value of -3.42 and a mean difference of 0.2, suggesting that on average teams will perform better at home than away.

This follows the trend that is shown in the paper by Staufenbiel., Lobinger. & Strauss (2015), showing that they is a home advantage when playing football.

Mixed Linear models

Model1

Model 1 aimed to predict outcome variable of result based on the predictor variable of direction of travel, while accounting for random effects. The pairs contrast showed a t-ratio contrast of -1.296 with a p-value of 0.1988 suggesting the means difference between East and West is not statistically significant.

Model2

Model 2 aimed to predict outcome variable of result based on variables of direction of travel and adding time zone difference as well. The pairs contrast showed a t-ratio of 0.463 with a corresponding p-value of 0.644, suggesting that the mean difference is not statistically significant.

The fixed effects have shown t-values with the coefficients that the intercept and away time zone difference are statistically significant (t= 5.422 and t= -2.288) but travelling west was not significant with a score of t=0.478.

Model3

Model 3 suggests that staying in hotels does not effect the teams performance showing a t-value of -0.904 which is not statistically significant. However, you must take in consideration of being the season of the pandemic they is not a lot of data on the data set stating that the away teams stayed in hotels pre or post game.

Model4

Model 4 suggests that there is a statistically significant difference with the results and the location of the game, the trend shows that you get better results when playing at home then away.

The p value is less than 0.0001 indicating that the difference in means between both of the locations are significant.

Pearson correlation

The results from testing correlation between away time zone difference and away result is that there is a weak negative correlation between the variables with a p-value of 0.051.

The results from Pearson’s correlation test between nights in hotel and away results suggest that they is a no significant correlation (p= 0.0166) between the two variables with confidence intervals of -0.1156 and 0.1483.

References

Clements, E., Ehrmann, F., Clark, A., Jones, M., Lu, D. and Duffield, R. (2023). The type and extent of travel for professional footballers undertaking national team duties for a national football federation. Biology of Sport.

Fowler, P., Duffield, R. and Vaile, J. (2014). Effects of simulated domestic and international air travel on sleep, performance, and recovery for team sports. Scandinavian Journal of Medicine & Science in Sports, 25(3), pp.441–451.

Fowler, P.M., Duffield, R., Morrow, I., Roach, G. and Vaile, J. (2014). Effects of sleep hygiene and artificial bright light interventions on recovery from simulated international air travel. European Journal of Applied Physiology, 115(3), pp.541–553.

Fowler, P.M., Knez, W., Thornton, H.R., Sargent, C., Mendham, A.E., Crowcroft, S., Miller, J., Halson, S. and Duffield, R. (2020). Sleep Hygiene and Light Exposure Can Improve Performance Following Long-Haul Air Travel. International Journal of Sports Physiology and Performance, pp.1–10.

Fullagar, H.H.K., Duffield, R., Skorski, S., White, D., Bloomfield, J., Kölling, S. and Meyer, T. (2016). Sleep, Travel, and Recovery Responses of National Footballers During and After Long-Haul International Air Travel. International Journal of Sports Physiology and Performance, 11(1), pp.86–95.

Grantham, J., Cheung, S.S., Connes, P., Febbraio, M.A., Gaoua, N., González-Alonso, J., Hue, O., Johnson, J.M., Maughan, R.J., Meeusen, R., Nybo, L., Racinais, S., Shirreffs, S.M. and Dvorak, J. (2010). Current knowledge on playing football in hot environments. Scandinavian Journal of Medicine & Science in Sports, [online] 20, pp.161–167.

Janse van Rensburg, D.C., Jansen van Rensburg, A., Fowler, P., Fullagar, H., Stevens, D., Halson, S., Bender, A., Vincent, G., Claassen-Smithers, A., Dunican, I., Roach, G.D., Sargent, C., Lastella, M. and Cronje, T. (2020). How to manage travel fatigue and jet lag in athletes? A systematic review of interventions. British Journal of Sports Medicine, 54(16), p.bjsports-2019-101635.

Massey, C.D., Schwind, J.J., Andrews, D.C. and Maneval, M.W. (2009). An Analysis of the Job of Strength and Conditioning Coach for Football at the Division II Level. Journal of Strength and Conditioning Research, 23(9), pp.2493–2499.

McGuckin, T.A., Sinclair, W.H., Sealey, R.M. and Bowman, P. (2012). The effects of air travel on performance measures of elite Australian rugby league players. European Journal of Sport Science, 14(sup1), pp.S116–S122.

Reilly, T., Waterhouse, J. and Edwards, B. (2005). Jet Lag and Air Travel: Implications for Performance. Clinics in Sports Medicine, 24(2), pp.367–380.

Staufenbiel, K., Lobinger, B. and Strauss, B., 2015. Home advantage in soccer–A matter of expectations, goal setting and tactical decisions of coaches?. Journal of sports sciences, 33(18), pp.1932-1941.

Tenan, M.S., Rezai, A.R. and Vigotsky, A.D. (2023). Jet Lag Does Not Impact Football Performance: Using Randomization Inference to Handle Complexity. [online]

Waterhouse, J., Reilly, T., Atkinson, G. and Edwards, B. (2007). Jet lag: trends and coping strategies. The Lancet, 369(9567), pp.1117–1129.

Zhou, Y., Chen, Q., Luo, X., Li, L., Ru, T. and Zhou, G. (2021). Does Bright Light Counteract the Post-lunch Dip in Subjective States and Cognitive Performance Among Undergraduate Students? Frontiers in Public Health, 9.