Results

Data Loading

suppressWarnings(suppressMessages(library("tidyverse")))
suppressWarnings(suppressMessages(library("ggpubr")))
suppressWarnings(suppressMessages(library("rstatix")))
suppressWarnings(suppressMessages(library("plyr")))

library(tidyverse)
library(ggpubr)
library(rstatix)
library(plyr)

map_abb <- list("df"="DF", "gm"="GM","wm"="WM", "csf"="CSF")

df_eval <- list("crossval"= data.frame(), "test"= data.frame())


for (evaluation in names(df_eval)){
    for (mod in names(map_abb)){

      filename <- sprintf("%s_%s.csv", mod, evaluation)
      path_col <- file.path(getwd(), "..", "..", "..", "resources", filename)
      
      df_mod <- read.csv(path_col)
      df_mod$modality <- map_abb[[mod]]

      df_eval[[evaluation]] <- rbind(df_eval[[evaluation]], df_mod)
    }
}

df_val <- df_eval[["crossval"]]
df_test <- df_eval[["test"]]

Validation data

head(df_val)
A data.frame: 6 × 4
foldMAEr2modality
<int><dbl><dbl><chr>
104.9102860.8573168DF
214.1777280.7937252DF
326.3368310.7525602DF
436.2207590.7729788DF
545.4949370.7465731DF
656.4715420.7765924DF
aggregate(df_val[,c("r2", "MAE")], list(df_val$modality), mean)
A data.frame: 4 × 3
Group.1r2MAE
<chr><dbl><dbl>
CSF0.70684636.609508
DF 0.76167465.843714
GM 0.75084286.140916
WM 0.72358936.501720

Test data

head(df_test)
A data.frame: 6 × 5
subjectIDgenderagey_hatmodality
<chr><int><dbl><dbl><chr>
1sub-517036.1640.94362DF
2sub-303025.4637.59454DF
3sub-232128.8135.01436DF
4sub-462175.0867.79715DF
5sub-331023.4930.64490DF
6sub-294127.0829.80392DF
df_test["abs_diff"] <- abs(df_test$y_hat - df_test$age)

result_mean <- aggregate(df_test[,c("age", "y_hat", "abs_diff")], list(df_test$modality), mean)
result_mean
A data.frame: 4 × 4
Group.1agey_hatabs_diff
<chr><dbl><dbl><dbl>
CSF42.3730949.540239.124851
DF 42.3730946.259287.096847
GM 42.3730945.496867.956941
WM 42.3730937.310419.990654

Statistics

Repeated Measures ANOVA

df_val$modality <- factor(df_val$modality)

res.aov <- anova_test(data = df_val, dv = MAE, wid = fold, within = modality)
get_anova_table(res.aov)
A anova_test: 1 × 7
EffectDFnDFdFpp<.05ges
<chr><dbl><dbl><dbl><dbl><chr><dbl>
1modality3875.7010.001*0.06

Post-hoc analysis

pwc <- df_val %>%
  pairwise_t_test(
    MAE ~ modality, paired = TRUE,
    p.adjust.method = "bonferroni"
  )
pwc <- pwc %>% add_xy_position(x = "modality")
pwc
A rstatix_test: 6 × 14
.y.group1group2n1n2statisticdfpp.adjp.adj.signify.positiongroupsxminxmax
<chr><chr><chr><int><int><dbl><dbl><dbl><dbl><chr><dbl><named list><dbl><dbl>
MAECSFDF3030 4.4361533290.0001210.000726*** 9.418840CSF, DF 12
MAECSFGM3030 2.0552780290.0490000.294000ns 9.621448CSF, GM 13
MAECSFWM3030 0.4207693290.6770001.000000ns 9.824056CSF, WM 14
MAEDF GM3030-1.5010999290.1440000.864000ns 10.026664DF, GM23
MAEDF WM3030-3.4434066290.0020000.011000* 10.229272DF, WM24
MAEGM WM3030-1.9403815290.0620000.373000ns 10.431880GM, WM34
colors <- c("#909842", "#1E88E5", "#FFC107", "#004D40")

options(repr.plot.width = 7, repr.plot.height = 5)


bxp <- ggboxplot(df_val, x = "modality", y = "MAE", add = "point", 
                 xlab = "Modality", ylab = "MAE [years]", fill=colors) + theme(text = element_text(size=20))


bxp <- bxp + 
  stat_pvalue_manual(pwc, hide.ns = TRUE, coord.flip=FALSE, label = "p = {p.adj}", step.increase=0.035) +
  labs(
    subtitle = get_test_label(res.aov, detailed = TRUE),
  )

# add the MAE results for the test set
bxp <- bxp + geom_point(data = data.frame(x = factor(result_mean[["Group.1"]]), y = result_mean[["abs_diff"]]),
                   aes(x=x, y=y),
                   color = 'red', shape=8, size=5)


bxp
Warning message in if (fill %in% names(data) & is.null(add.params$fill)) add.params$fill <- fill:
“the condition has length > 1 and only the first element will be used”
../../_images/results_14_1.png