dfClong=dfC %>% rename(C_pre_12_8=C_basal_temporada) %>% select(CODE,contains("_pre_")) %>% pivot_longer(-CODE) %>% 
  mutate(mesDia=str_replace(name,"C_pre_([0-9]+)_([0-9]+)","\\2-\\1")) %>% 
  separate(col = "mesDia",into = c("mes","dia"),sep = "-") %>% 
  mutate(mes=as.integer(mes),dia=as.integer(dia),ano=as.integer(ifelse(mes>=7,2022,2023))) %>% 
  mutate(Fecha=make_date(month = mes,day = dia, year=ano)) %>% 
  select(CODE,Fecha,Cortisol=value) %>% filter(complete.cases(.))%>% 
  group_by(CODE) %>% mutate(CortisolZ=scale(Cortisol)) %>% ungroup()


dfClong %>% head()
## # A tibble: 6 × 4
##   CODE  Fecha      Cortisol CortisolZ[,1]
##   <chr> <date>        <dbl>         <dbl>
## 1 COD1  2022-08-12     4.8         0.421 
## 2 COD1  2022-08-18     3.99       -0.123 
## 3 COD1  2022-08-26     3.23       -0.634 
## 4 COD1  2022-08-30     4.3         0.0852
## 5 COD1  2022-09-07     5.6         0.958 
## 6 COD1  2022-09-15     6.29        1.42
dfTlong=dfT %>% rename(T_pre_12_8=T_basal_temporada) %>% select(CODE,contains("_pre_")) %>% pivot_longer(-CODE) %>% 
  mutate(mesDia=str_replace(name,"T_pre_([0-9]+)_([0-9]+)","\\2-\\1")) %>% 
  separate(col = "mesDia",into = c("mes","dia"),sep = "-") %>% 
  mutate(mes=as.integer(mes),dia=as.integer(dia),ano=as.integer(ifelse(mes>=7,2022,2023))) %>% 
  mutate(Fecha=make_date(month = mes,day = dia, year=ano)) %>% 
  select(CODE,Fecha,Testosterona=value) %>% filter(complete.cases(.)) %>% 
  group_by(CODE) %>% mutate(TestosteronaZ=scale(Testosterona)) %>% ungroup()

dfTlong %>% head()
## # A tibble: 6 × 4
##   CODE  Fecha      Testosterona TestosteronaZ[,1]
##   <chr> <date>            <dbl>             <dbl>
## 1 COD1  2022-08-12          298             1.66 
## 2 COD1  2022-08-18          254             0.832
## 3 COD1  2022-08-26          277             1.26 
## 4 COD1  2022-08-30          287             1.45 
## 5 COD1  2022-09-07          267             1.08 
## 6 COD1  2022-09-15          250             0.757

Vamos a Unir datos de entrenamientos donde tenemos referencias de distancias, etc, con los datos de T y C del mismo día o primer día posterior Hay muchos entrenamientos, antes de una toma de Cortisol o Testosterona, pero enlazamos con la más cercana en el tiempo posterior o en el mismo dia. Añadimos la restricción que la medición de hormona no puede hacerse más de 3 días más tarde del entrenamiento para considerarse válida.

comp_date <- function(x, y) x <= y
comp_code <- function(x, y) x == y
dfGPS_CPosterior <- dfGPS %>% 
  fuzzy_left_join(dfClong %>% select(CODE,Fecha), by = c("Fecha" = "Fecha","CODE"="CODE"),                  
                  match_fun = list(comp_date, comp_code)) %>%
  group_by(Fecha.x, CODE.x) %>%
  filter(Fecha.y == min(Fecha.y)) %>%
  ungroup() %>% 
  rename(CODE=CODE.x,Fecha=Fecha.x,Fecha_C=Fecha.y) %>% select(-CODE.y) %>% 
  select(CODE,Fecha,Fecha_C,everything())


dfGPS_TPosterior <- dfGPS %>% 
  fuzzy_left_join(dfTlong %>% select(CODE,Fecha), by = c("Fecha" = "Fecha","CODE"="CODE"),                  
                  match_fun = list(comp_date, comp_code)) %>%
  group_by(Fecha.x, CODE.x) %>%
  filter(Fecha.y == min(Fecha.y)) %>%
  ungroup() %>% 
  rename(CODE=CODE.x,Fecha=Fecha.x,Fecha_T=Fecha.y) %>% select(-CODE.y) %>% 
  select(CODE,Fecha,Fecha_T,everything())

dfGPS_CPosterior_apareado=dfGPS_CPosterior %>% select(CODE,Fecha,Fecha_C)  %>% 
  group_by(CODE,Fecha_C) %>% summarise(Fecha=max(Fecha)) %>% 
  ungroup() %>% 
  mutate(tiempoC=as.integer(difftime(Fecha_C,Fecha,units = "days"))) %>% 
  filter(tiempoC<=3) %>% select(CODE,Fecha,Fecha_C,everything())
## `summarise()` has grouped output by 'CODE'. You can override using the
## `.groups` argument.
dfGPS_TPosterior_apareado=dfGPS_TPosterior %>% select(CODE,Fecha,Fecha_T)  %>% 
  group_by(CODE,Fecha_T) %>% summarise(Fecha=max(Fecha)) %>% 
  ungroup() %>% 
  mutate(tiempoT=as.integer(difftime(Fecha_T,Fecha,units = "days"))) %>% 
  filter(tiempoT<=3) %>% select(CODE,Fecha,Fecha_T,everything())
## `summarise()` has grouped output by 'CODE'. You can override using the
## `.groups` argument.
dfGPS_CTPosterior_apareado=dfGPS_CPosterior_apareado %>% left_join(dfGPS_TPosterior_apareado)
## Joining with `by = join_by(CODE, Fecha)`

Observese que cada fecha_C (medición de Cortisol) o fecha_T viene precedido de múltiples entrenamientos (Fecha):

dfGPS_CPosterior %>% select(CODE:Distance)
## # A tibble: 3,097 × 6
##    CODE  Fecha      Fecha_C    Repeticion Duration Distance
##    <chr> <date>     <date>          <int>    <dbl>    <dbl>
##  1 COD10 2022-07-04 2022-08-12          1       91     7925
##  2 COD10 2022-07-05 2022-08-12          0       98     5435
##  3 COD10 2022-07-05 2022-08-12          1       69     4755
##  4 COD10 2022-07-06 2022-08-12          0      108     9169
##  5 COD10 2022-07-07 2022-08-12          0       80     3735
##  6 COD10 2022-07-07 2022-08-12          1       62     3551
##  7 COD10 2022-07-08 2022-08-12          0       92     5755
##  8 COD10 2022-07-08 2022-08-12          1       62     3707
##  9 COD10 2022-07-09 2022-08-12          0       71     5995
## 10 COD10 2022-07-11 2022-08-12          0      108     8543
## # … with 3,087 more rows

Al limitarlo solo al anterior, se reducen muchos los entrenamientos disponibles:

dfGPS_CTPosterior_apareado %>% select(CODE,Fecha,Fecha_C,Fecha_T)
## # A tibble: 560 × 4
##    CODE  Fecha      Fecha_C    Fecha_T   
##    <chr> <date>     <date>     <date>    
##  1 COD10 2022-08-11 2022-08-12 2022-08-12
##  2 COD10 2022-08-18 2022-08-18 2022-08-18
##  3 COD10 2022-08-26 2022-08-26 2022-08-26
##  4 COD10 2022-08-30 2022-08-30 2022-08-30
##  5 COD10 2022-09-07 2022-09-07 2022-09-07
##  6 COD10 2022-09-15 2022-09-15 2022-09-15
##  7 COD10 2022-09-18 2022-09-18 2022-09-18
##  8 COD10 2022-09-30 2022-09-30 2022-09-30
##  9 COD10 2022-10-05 2022-10-05 2022-10-05
## 10 COD10 2022-10-08 2022-10-08 2022-10-08
## # … with 550 more rows

Esas son los dos criterios extremos para unir ambas bases de datos. Tal vez algo intermedio sea conveniente como agregar TODOS los entrenamientos de los dos o tres dias anteriores a la medición de Cortisol y ahí sumar/promediar distancias, promediar/maximo velocidades,… Hay que saber cual es la operación correcta para agregar varios entrenamientos en uno (promedio, suma, maximo…)

En esta versión pequeña de la tabla vamos a explorar la relación entre las variables del entrenamiento y las hormonas, sin tener en cuenta la fecha.

dfWide=dfGPS %>% inner_join(dfGPS_CTPosterior_apareado) %>% 
  left_join(dfClong %>% rename(Fecha_C=Fecha))  %>%
  left_join(dfTlong %>% rename(Fecha_T=Fecha)) %>% 
  select(CODE,Fecha,Fecha_C,Fecha_T,Cortisol,Testosterona,,CortisolZ,TestosteronaZ,everything()) 
## Joining with `by = join_by(CODE, Fecha)`
## Joining with `by = join_by(CODE, Fecha_C)`
## Joining with `by = join_by(CODE, Fecha_T)`
dfLong=dfWide %>% select(CODE,Fecha,Cortisol,Testosterona,CortisolZ,TestosteronaZ,Duration:HMLD) %>% 
  pivot_longer(-c(CODE:TestosteronaZ)) 

Vamos a por el colesterol

dfLong %>% ggplot(aes(y=Cortisol,x=value))+
  geom_point(aes(color=CODE),alpha=0.5,size=0.5)+
  geom_smooth()+
  facet_wrap(~name, scales = "free_x")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Y ahora a por la Testosterona:

dfLong %>% ggplot(aes(y=Testosterona,x=value))+
  geom_point(aes(color=CODE),alpha=0.5,size=0.5)+
  geom_smooth()+
  facet_wrap(~name, scales = "free_x")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Ahora con Colesterol y Testosterona tipificados DENTRO de cada jugador:

dfLong %>% ggplot(aes(y=CortisolZ,x=value))+
  geom_point(aes(color=CODE),alpha=0.5,size=0.5)+
  geom_smooth()+
  facet_wrap(~name, scales = "free_x")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

dfLong %>% ggplot(aes(y=TestosteronaZ,x=value))+
  geom_point(aes(color=CODE),alpha=0.5,size=0.5)+
  geom_smooth()+
  facet_wrap(~name, scales = "free_x")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'