Apoyo Plantar

Primero vamos a cargar los datos del fichero spss:

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ 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(haven)
## Warning: package 'haven' was built under R version 4.4.2
library(ggstatsplot)
## Warning: package 'ggstatsplot' was built under R version 4.4.2
## You can cite this package as:
##      Patil, I. (2021). Visualizations with statistical details: The 'ggstatsplot' approach.
##      Journal of Open Source Software, 6(61), 3167, doi:10.21105/joss.03167
#library(lme4) No calcula p, asi que la cambio por otra:
library(lmerTest)
## Loading required package: lme4
## Warning: package 'lme4' was built under R version 4.4.1
## Loading required package: Matrix
## 
## Attaching package: 'Matrix'
## 
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
## 
## 
## Attaching package: 'lmerTest'
## 
## The following object is masked from 'package:lme4':
## 
##     lmer
## 
## The following object is masked from 'package:stats':
## 
##     step
library(patchwork)
## Warning: package 'patchwork' was built under R version 4.4.1
library(gtsummary)
## Warning: package 'gtsummary' was built under R version 4.4.2
library(afex)
## Warning: package 'afex' was built under R version 4.4.1
## ************
## Welcome to afex. For support visit: http://afex.singmann.science/
## - Functions for ANOVAs: aov_car(), aov_ez(), and aov_4()
## - Methods for calculating p-values with mixed(): 'S', 'KR', 'LRT', and 'PB'
## - 'afex_aov' and 'mixed' objects can be passed to emmeans() for follow-up tests
## - Get and set global package options with: afex_options()
## - Set sum-to-zero contrasts globally: set_sum_contrasts()
## - For example analyses see: browseVignettes("afex")
## ************
## 
## Attaching package: 'afex'
## 
## The following object is masked from 'package:lme4':
## 
##     lmer
df=read_sav("PARA ANALIZAR Piloto apoyo plantar - SIN ANOMALOS.sav") %>% select(DNI:Dominante,Actividad,Ocupacion,everything()) %>% filter(!is.na(DNI))

dfLong=df %>% pivot_longer(cols = -c(DNI:Ocupacion),names_to = "VariableWide",values_to = "Valor") %>% 
  separate(col = VariableWide, into=c("Variable","Inmov","Ojos"))%>% 
  mutate(Inmov=factor(Inmov,levels=c("No","dom","ndo"),labels=c("Non inmobilized","Dominant","Not dominant"))) %>% 
  arrange(DNI,Ojos,Inmov,Variable)
dfLong %>% 
  filter(Variable=="LongBalanceo") %>% 
  ggplot(aes(x=Inmov,y=Valor,fill=Ojos))+
  geom_boxplot()+
  theme_bw()+
  scale_fill_discrete(name="Eyes condition")+
  ylab("Antero-posterior oscillation (mm)")+xlab("")

Otra versión de la misma en un formato que tenga effect sizes del tipo d de Cohen para contentar al revisor:

grouped_ggbetweenstats(
  data = dfLong %>% filter(Variable == "LongBalanceo"),
  x = Ojos,
  y = Valor,
  grouping.var = Inmov,
  type = "parametric",
  k = 2,
                    pairwise.display = "significant", 
                  pairwise.grouping.line.type = "segment",
                  bf.message=FALSE,
                  effsize.type = "d",
  results.subtitle = TRUE,
  ggplot.component = list(
    theme_bw(),
    theme(text = element_text(size = 8)),
    coord_cartesian(ylim=c(0,120)),
    ylab("Antero-posterior oscillation (mm)"),
    xlab("")
  ),
  title.text = "Balanceo longitudinal por condición de ojos e inmovilización"
)

Se podría corregir y poner p y cohen’s d debajo en el pie de este gráfico que se vería mejor:

grouped_ggbetweenstats(
  data = dfLong %>% filter(Variable == "LongBalanceo"),
  x = Ojos,
  y = Valor,
  grouping.var = Inmov,
  type = "parametric",
  k = 2,
                    pairwise.display = "significant", 
                  pairwise.grouping.line.type = "segment",
                  bf.message=FALSE,
                  effsize.type = "d",
  results.subtitle = FALSE,
  ggplot.component = list(
    theme_bw(),
    theme(text = element_text(size = 12)),
    coord_cartesian(ylim=c(0,120)),
    ylab("Antero-posterior oscillation (mm)"),
    xlab("")
  ),
  title.text = "Balanceo longitudinal por condición de ojos e inmovilización"
)

Objetivo 1

Nos gustaría estudiar si la variable LongBalanceo presenta diferencias entre Ojos CE y OE ajustando por inmovilización. Para ello, vamos a realizar un modelo lineal mixto con la función lmer de la librería lme4. Nos sale que sí ocurre que hay diferencias.

Queremos también saber si el salto que se produce en Inmov=No entre ojos cerrados y abiertos es diferente al de cuando hay inmovilización dominante o no dominante. Transformamos la base de datos y exploramos las primers líneas:

dfLong %>% names()
##  [1] "DNI"       "Edad"      "Sexo"      "Dominante" "Actividad" "Ocupacion"
##  [7] "Variable"  "Inmov"     "Ojos"      "Valor"
dg=dfLong %>% select(DNI,Ojos,Variable,Inmov, Valor) %>% filter(Variable=="LongBalanceo")

Considerando interacciones

Para más detalle vamos a estudiarlo para experimentos con ojos abiertos y cerrados por separado que es más o menos lo que hace el modelo con interacciones.

p1<-ggwithinstats(dg %>% filter(Ojos=="CE"),subject.id="DNI", x = Inmov, y = Valor,  pairwise.comparisons = TRUE, 
                    results.subtitle = TRUE,
                  pairwise.display = "significant", 
                  pairwise.grouping.line.type = "segment",
                  bf.message=FALSE,
                  point.args = list(position = position_jitter(width = 0.1, height = 0))
                  ) +coord_cartesian(ylim=c(0,150))+labs(title="Closed eyes",y="Anterior-posterior oscillation (mm)")+xlab("") +
   theme(legend.position = "none")+theme(text = element_text(size = 11))
p1

El mismo gráfico pero sin las estadísticas arriba para edición de imágenes:

p1b<-ggwithinstats(dg %>% filter(Ojos=="CE"),subject.id="DNI", x = Inmov, y = Valor,  pairwise.comparisons = TRUE, 
                    results.subtitle = FALSE,
                  pairwise.display = "significant", 
                  pairwise.grouping.line.type = "segment",
                  bf.message=FALSE,
                  point.args = list(position = position_jitter(width = 0.1, height = 0))
                  ) +coord_cartesian(ylim=c(0,150))+labs(title="Closed eyes",y="Anterior-posterior oscillation (mm)")+xlab("") +
   theme(legend.position = "none")+theme(text = element_text(size = 11))
p1b

p2<-ggwithinstats(dg %>% filter(Ojos=="OE"), x = Inmov, y = Valor, pairwise.comparisons = TRUE, pairwise.display = "significant", pairwise.grouping.line.type = "segment",bf.message=FALSE, 
                  results.subtitle = TRUE,
                  point.args = list(position = position_jitter(width = 0.1, height = 0)))  +coord_cartesian(ylim=c(0,150))+labs(title="Open eyes",y="Anterior-posterior oscillation (mm)")+xlab("") +
   theme(legend.position = "none")+theme(text = element_text(size = 11))
p2

Ya ahora la versión sin estadísticos arriba:

p2b<-ggwithinstats(dg %>% filter(Ojos=="OE"), x = Inmov, y = Valor, pairwise.comparisons = TRUE, pairwise.display = "significant", pairwise.grouping.line.type = "segment",bf.message=FALSE, 
                  results.subtitle = FALSE,
                  point.args = list(position = position_jitter(width = 0.1, height = 0)))  +coord_cartesian(ylim=c(0,150))+labs(title="Open eyes",y="Anterior-posterior oscillation (mm)")+xlab("") +
   theme(legend.position = "none")+theme(text = element_text(size = 11))
p2b

Ahora me gustaría ensamblar los gráficos p1 y p2 en uno solo.

patchwork::wrap_plots(p1,p2,ncol=2)

Y la versión sin estadísticas

patchwork::wrap_plots(p1b,p2b,ncol=2)

Ahora ambas en vertical:

patchwork::wrap_plots(p1,p2,ncol=1)

Y la versión sin estadísticas

patchwork::wrap_plots(p1b,p2b,ncol=1)

Objetivo 2

Estudiar si la Superficie total cuando No hay Inmobilización es es más baja que cuando sí la hay, sea dominante o no dominante.

dh=dfLong %>% select(DNI,Ojos,Variable,Dominante,Inmov, Valor) %>% filter(Variable=="SupTotal") 

Vamos a mostrar la gráfica de pruebas ANOVA de medidas repetidas equivalente a la tabla:

p3<-ggwithinstats(dh , x = Inmov, y = Valor, pairwise.comparisons = TRUE, pairwise.display = "significant", pairwise.grouping.line.type = "segment",bf.message=FALSE,
                  point.args = list(position = position_jitter(width = 0.1, height = 0))) +
  labs(y=expression("Total surface (g/cm"^2*")"))+
  xlab("")
#eliminar xlab

p3

Y sin estadísticas arriba:

p3b<-ggwithinstats(dh , x = Inmov, y = Valor, pairwise.comparisons = TRUE, pairwise.display = "significant", pairwise.grouping.line.type = "segment",bf.message=FALSE,
                  results.subtitle = FALSE,
                  point.args = list(position = position_jitter(width = 0.1, height = 0))) +
  labs(y=expression("Total surface (g/cm"^2*")"))+
  xlab("")
#eliminar xlab

p3b