Modelo Linear Generalizado Hierárquico - Mixed Effects Models

Author

Caio Vallio & Vitor Vallio

Published

July 9, 2025



Análises realizadas: Para as medidas de efeito, foram aplicados modelos lineares generalizados hierárquicos (mixed models), considerando a alocação dos grupos com base na análise por intenção de tratamento. O resultado do modelo é a diferença média (mean difference) entre grupos da diferença intragrupo. A incerteza sobre as diferenças médias são apresentadas em intervalo de confiança 95% (IC95%). Os efeitos fixos foram compostos por variáveis dummy indicando o tempo (pré tratamento e pós tratamento) e os termos de interação com os grupos (tempo\(\times\)grupo). Esta estratégia foi implementada para ajustar possíveis diferenças entre os grupos na avaliação pré tratamento para corrigir o viés de regressão para a média. Foram adicionados para os efeitos randômicos a identificação de cada participante, essa estratégia ajusta o modelo para medidas repetidas, considerando a dependência entre as avaliações de pré e pós tratamento para cada participante.(Twisk 2019, 2013)

Software utilizado para as análises: R Core Team (2024). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing, Vienna, Austria. URL: https://www.R-project.org.

Code
library(readxl)
library(dplyr)
library(gtsummary)
library(gt)
library(qqplotr)
library(nortest)
library(parameters)
library(performance)
library(lme4)
library(lmerTest)
library(emmeans)
library(ggplot2)
library(plotly)
library(DT)
library(jtools)

df_fw1 <- readxl::read_excel(
    # "data/_Coleta de dados - projeto dor lombar oficial (8).xlsx",
    "data/Coleta de dados PLANILHA FINAL revisada.xlsx",
    sheet = 1
) |>
    janitor::clean_names() |>
    select(
        nome,
        intensidade_da_dor_0_10, # Dor
        rm_result, # Roland Morris (função)
        x1_av_epegp, # Efeito global percebido
        etc_result, # cinesiofobia
        eaf_final, # Autoeficácia
        media_fmmmiie, # Força Extensão MMII
        final_fmiif, # Força Flexão MMII
        x1_av_fabs, # Força de abdominal
        fpmd_result, # Força de preensao palmar direita
        fpme_result, # Força de preensao palmar esquerda
        randomiz,
        genero,
        estado_civil,
        escolaridade,
        idade_anos,
        imc_kg_m2
    ) |>
    rename(
        grupo = randomiz,
        idade = idade_anos,
        imc = imc_kg_m2,
        dor = intensidade_da_dor_0_10,
        rm = rm_result,
        epegp = x1_av_epegp,
        cinesiofobia = etc_result,
        autoeficacia = eaf_final,
        fmmmiie = media_fmmmiie,
        fmmmiif = final_fmiif,
        fabs = x1_av_fabs,
        fpmd = fpmd_result,
        fpme = fpme_result
    ) |>
    filter(!is.na(dor)) |>
    mutate(
        nome = nome |>
            tolower() |>
            stringr::str_remove_all("[^a-zA-Z0-9\\s]") |>
            stringr::str_trim() |>
            stringr::str_replace_all("\\s+", "_"),
        tempo = 0
    )

df_fw2 <- readxl::read_excel(
    # "data/_Coleta de dados - projeto dor lombar oficial (8).xlsx",
    "data/Coleta de dados PLANILHA FINAL revisada.xlsx",
    sheet = 2
) |>
    janitor::clean_names() |>
    select(
        nome,
        intensidade_da_dor_0_10,
        rm_2_result,
        x1_av_epegp,
        etc_2_result,
        eaf_final,
        media_fmmiie,
        final_fmmif,
        x1_av_fabs,
        fpmd_result,
        fpme_result
    ) |>
    rename(
        dor = intensidade_da_dor_0_10,
        rm = rm_2_result,
        epegp = x1_av_epegp,
        cinesiofobia = etc_2_result,
        autoeficacia = eaf_final,
        fmmmiie = media_fmmiie,
        fmmmiif = final_fmmif,
        fabs = x1_av_fabs,
        fpmd = fpmd_result,
        fpme = fpme_result
    ) |>
    filter(!is.na(dor) & !is.na(rm)) |>
    mutate(
        nome = nome |>
            tolower() |>
            stringr::str_remove_all("[^a-zA-Z0-9\\s]") |>
            stringr::str_trim() |>
            stringr::str_replace_all("\\s+", "_"),
        tempo = 1
    ) |>
    left_join(
        df_fw1 |>
            select(nome, grupo, idade, imc, genero, estado_civil, escolaridade),
        by = "nome"
    )

df_fw3 <- readxl::read_excel(
    # "data/_Coleta de dados - projeto dor lombar oficial (8).xlsx",
    "data/Coleta de dados PLANILHA FINAL revisada.xlsx",
    sheet = 3
) |>
    janitor::clean_names() |>
    select(
        nome,
        intensidade_da_dor_0_10,
        rm_total,
        x1_av_epegp,
        etc_result,
        eaf_final
    ) |>
    rename(
        dor = intensidade_da_dor_0_10,
        rm = rm_total,
        epegp = x1_av_epegp,
        cinesiofobia = etc_result,
        autoeficacia = eaf_final
    ) |>
    filter(!is.na(dor) & !is.na(rm)) |>
    mutate(
        nome = nome |>
            tolower() |>
            stringr::str_remove_all("[^a-zA-Z0-9\\s]") |>
            stringr::str_trim() |>
            stringr::str_replace_all("\\s+", "_"),
        tempo = 2
    ) |>
    left_join(
        df_fw1 |>
            select(nome, grupo, idade, imc, genero, estado_civil, escolaridade),
        by = "nome"
    )

df_model <- df_fw1 |>
    bind_rows(
        df_fw2 |>
            mutate(
                dor = as.double(dor),
                rm = as.double(rm),
                epegp = as.double(epegp),
                cinesiofobia = as.double(cinesiofobia),
                autoeficacia = as.double(autoeficacia),
                fmmmiie = as.double(fmmmiie),
                fmmmiif = as.double(fmmmiif),
                fabs = as.double(fabs),
                fpmd = as.double(fpmd),
                fpme = as.double(fpme)
            )
    ) |>
    bind_rows(df_fw3)


df_model <- df_model |>
    mutate(grupo = if_else(grupo == 2, 0, 1))

# Dummies para ajuste no baseline mantendo os dois follow-up
for (level in unique(df_model$tempo)) {
    df_model[paste("tempo", level, sep = "_")] <- ifelse(
        df_model$tempo == level,
        1,
        0
    )
}

# Interação grupo x tempo
df_model <- df_model |>
    mutate(grupo_tempo_1 = grupo * tempo_1, grupo_tempo_2 = grupo * tempo_2)

1 Variáveis demográficas

Code
df_model |>
    filter(tempo == 0) |>
    mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
    gtsummary::tbl_summary(
        include = c(
            idade,
            imc,
            genero,
            estado_civil,
            escolaridade
        ),
        by = grupo,
        statistic = list(
            gtsummary::all_continuous() ~ "{mean} ({sd})",
            gtsummary::all_categorical() ~ "{n} ({p}%)"
        ),
        missing_text = "Missing"
    )
Characteristic Controle
N = 441
Intervenção
N = 411
idade 37 (13) 38 (14)
imc 27.4 (4.6) 26.5 (5.6)
genero

    1 19 (43%) 26 (63%)
    2 25 (57%) 15 (37%)
estado_civil

    1 24 (55%) 24 (59%)
    2 16 (36%) 15 (37%)
    4 4 (9.1%) 2 (4.9%)
escolaridade

    0 0 (0%) 1 (2.4%)
    1 2 (4.5%) 2 (4.9%)
    2 0 (0%) 2 (4.9%)
    3 31 (70%) 27 (66%)
    4 3 (6.8%) 0 (0%)
    5 8 (18%) 9 (22%)
1 Mean (SD); n (%)

2 Análises

2.1 Desfechos Primários

2.1.1 Dor

2.1.1.1 Evolução

Code
df_model |>
    mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
    mutate(
        tempo = if_else(
            tempo == 0,
            "Pré tratamento",
            if_else(tempo == 1, "Pós tratamento", "Follow-up")
        ),
        tempo = factor(
            tempo,
            levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
        )
    ) |>
    group_by(tempo, grupo) |>
    summarise(
        média = round(mean(dor, na.rm = T), 2),
        dp = round(sd(dor, na.rm = T), 2),
        .groups = "drop"
    ) |>
    gt() |>
    tab_header(
        title = "Média da dor",
        subtitle = "Por grupo e tempo"
    )
Média da dor
Por grupo e tempo
tempo grupo média dp
Pré tratamento Controle 6.09 1.41
Pré tratamento Intervenção 6.17 1.95
Pós tratamento Controle 1.91 1.93
Pós tratamento Intervenção 1.50 1.64
Follow-up Controle 3.04 2.57
Follow-up Intervenção 2.58 2.86
Code
ggplotly(
    df_model |>
        mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
        group_by(grupo, tempo) |>
        summarise(
            media = mean(dor, na.rm = T),
            dp = sd(dor, na.rm = T),
            .groups = "drop"
        ) |>
        ggplot(aes(y = media, x = tempo, color = factor(grupo))) +
        geom_point(position = position_dodge(0.1), stat = "identity") +
        geom_line(position = position_dodge(0.1), stat = "identity") +
        geom_errorbar(
            aes(ymin = media - dp, ymax = media + dp, width = .2),
            position = position_dodge(0.1)
        ) +
        theme_classic() +
        scale_color_grey() +
        ylab("Média da dor") +
        xlab(NULL) +
        labs(color = "Grupos")
) |>
    layout(
        xaxis = list(
            ticktext = list("Pré tratamento", "Pós tratamento", "Follow-up"),
            tickvals = list(0, 1, 2)
        )
    )

2.1.1.2 Modelo

Code
# Modelo com intercepto aleatório por paciente (modelo 1)
modelo_1.1 <- lmer(
    dor ~ factor(tempo) * factor(grupo) +
        # idade +
        # imc +
        # genero +
        # estado_civil +
        # escolaridade +
        (1 | nome),
    data = df_model
)

tbl_1.1 <- modelo_1.1 |>
    parameters::parameters(effects = "fixed") |>
    tibble()

tbl_1.1 |>
    filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
    mutate(
        Parameter = case_when(
            Parameter == "factor(grupo)1" ~ "Pré tratamento",
            Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
            Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
        )
    ) |>
    select(!c(df_error, SE, CI, Effects)) |>
    datatable(
        rownames = FALSE,
        colnames = c(
            "Acompanhamento",
            "Diferença",
            "IC 95% Inferior",
            "IC 95% Superior",
            "t",
            "p"
        ),
        extensions = "Buttons",
        options = list(
            dom = "Bt",
            buttons = c("copy", "csv", "excel", "pdf"),
            pageLength = 20,
            columnDefs = list(list(
                className = "dt-center",
                targets = c("Coefficient", "CI_low", "CI_high", "t", "p")
            ))
        )
    ) |>
    formatRound(c("Coefficient"), 2) |>
    formatRound(c("CI_low", "CI_high", "t", "p"), 3)
Code
ggplotly(
    tbl_1.1 |>
        filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
        mutate(
            Parameter = case_when(
                Parameter == "factor(grupo)1" ~ "Pré tratamento",
                Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
                Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
            )
        ) |>
        mutate(
            Parameter = factor(
                Parameter,
                levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
            )
        ) |>
        select(!c(df_error, SE, CI, Effects)) |>
        ggplot(aes(x = Parameter, y = Coefficient)) +
        geom_line() +
        geom_errorbar(width = .1, aes(ymin = CI_low, ymax = CI_high)) +
        geom_point(shape = 21, size = 3, fill = "white") +
        theme_classic() +
        ylab("Diferença média da dor") +
        xlab(" ") +
        geom_hline(yintercept = 0)
)
Code
modelo_1.1 |> jtools::summ(confint = TRUE, digits = 3)
Observations 207
Dependent variable dor
Type Mixed effects linear regression
AIC 881.133
BIC 907.795
Pseudo-R² (fixed effects) 0.500
Pseudo-R² (total) 0.596
Fixed Effects
Est. 2.5% 97.5% t val. d.f. p
(Intercept) 6.091 5.499 6.683 20.170 191.136 0.000
factor(tempo)1 -4.170 -4.978 -3.362 -10.113 139.861 0.000
factor(tempo)2 -3.088 -3.992 -2.183 -6.689 150.117 0.000
factor(grupo)1 0.080 -0.772 0.932 0.184 191.136 0.855
factor(tempo)1:factor(grupo)1 -0.473 -1.609 0.663 -0.816 136.181 0.416
factor(tempo)2:factor(grupo)1 -0.408 -1.703 0.887 -0.617 148.712 0.538
p values calculated using Satterthwaite d.f.
Random Effects
Group Parameter Std. Dev.
nome (Intercept) 0.877
Residual 1.801
Grouping Variables
Group # groups ICC
nome 85 0.192
Code
DHARMa::simulateResiduals(modelo_1.1) |> plot()

Code
performance::check_collinearity(modelo_1.1)

2.1.2 Função (RM)

2.1.2.1 Evolução

Code
df_model |>
    mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
    mutate(
        tempo = if_else(
            tempo == 0,
            "Pré tratamento",
            if_else(tempo == 1, "Pós tratamento", "Follow-up")
        ),
        tempo = factor(
            tempo,
            levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
        )
    ) |>
    group_by(tempo, grupo) |>
    summarise(
        média = round(mean(rm, na.rm = T), 2),
        dp = round(sd(rm, na.rm = T), 2),
        .groups = "drop"
    ) |>
    gt() |>
    tab_header(
        title = "Média da função",
        subtitle = "Por grupo e tempo"
    )
Média da função
Por grupo e tempo
tempo grupo média dp
Pré tratamento Controle 10.40 4.49
Pré tratamento Intervenção 10.80 5.05
Pós tratamento Controle 3.69 4.28
Pós tratamento Intervenção 2.84 3.67
Follow-up Controle 4.56 6.21
Follow-up Intervenção 4.29 3.87
Code
ggplotly(
    df_model |>
        mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
        group_by(grupo, tempo) |>
        summarise(
            media = mean(rm, na.rm = T),
            dp = sd(rm, na.rm = T),
            .groups = "drop"
        ) |>
        ggplot(aes(y = media, x = tempo, color = factor(grupo))) +
        geom_point(position = position_dodge(0.1), stat = "identity") +
        geom_line(position = position_dodge(0.1), stat = "identity") +
        geom_errorbar(
            aes(ymin = media - dp, ymax = media + dp, width = .2),
            position = position_dodge(0.1)
        ) +
        theme_classic() +
        scale_color_grey() +
        ylab("Média da função") +
        xlab(NULL) +
        labs(color = "Grupos")
) |>
    layout(
        xaxis = list(
            ticktext = list("Pré tratamento", "Pós tratamento", "Follow-up"),
            tickvals = list(0, 1, 2)
        )
    )

2.1.2.2 Modelo

Code
# Modelo com intercepto aleatório por paciente (modelo 1)
modelo_2.1 <- lmer(
    rm ~ factor(tempo) * factor(grupo) + (1 | nome),
    data = df_model
)

tbl_2.1 <- modelo_2.1 |>
    parameters::parameters(effects = "fixed") |>
    tibble()

tbl_2.1 |>
    filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
    mutate(
        Parameter = case_when(
            Parameter == "factor(grupo)1" ~ "Pré tratamento",
            Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
            Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
        )
    ) |>
    select(!c(df_error, SE, CI, Effects)) |>
    datatable(
        rownames = FALSE,
        colnames = c(
            "Acompanhamento",
            "Diferença",
            "IC 95% Inferior",
            "IC 95% Superior",
            "t",
            "p"
        ),
        extensions = "Buttons",
        options = list(
            dom = "Bt",
            buttons = c("copy", "csv", "excel", "pdf"),
            pageLength = 20,
            columnDefs = list(list(
                className = "dt-center",
                targets = c("Coefficient", "CI_low", "CI_high", "t", "p")
            ))
        )
    ) |>
    formatRound(c("Coefficient"), 2) |>
    formatRound(c("CI_low", "CI_high", "t", "p"), 3)
Code
ggplotly(
    tbl_2.1 |>
        filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
        mutate(
            Parameter = case_when(
                Parameter == "factor(grupo)1" ~ "Pré tratamento",
                Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
                Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
            )
        ) |>
        mutate(
            Parameter = factor(
                Parameter,
                levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
            )
        ) |>
        select(!c(df_error, SE, CI, Effects)) |>
        ggplot(aes(x = Parameter, y = Coefficient)) +
        geom_line() +
        geom_errorbar(width = .1, aes(ymin = CI_low, ymax = CI_high)) +
        geom_point(shape = 21, size = 3, fill = "white") +
        theme_classic() +
        ylab("Diferença média da função") +
        xlab(" ") +
        geom_hline(yintercept = 0)
)
Code
modelo_2.1 |> jtools::summ(confint = TRUE, digits = 3)
Observations 206
Dependent variable rm
Type Mixed effects linear regression
AIC 1198.165
BIC 1224.788
Pseudo-R² (fixed effects) 0.355
Pseudo-R² (total) 0.569
Fixed Effects
Est. 2.5% 97.5% t val. d.f. p
(Intercept) 10.395 9.021 11.770 14.821 171.415 0.000
factor(tempo)1 -6.721 -8.426 -5.016 -7.726 133.179 0.000
factor(tempo)2 -6.047 -7.966 -4.129 -6.177 140.687 0.000
factor(grupo)1 0.410 -1.558 2.377 0.408 171.415 0.684
factor(tempo)1:factor(grupo)1 -1.167 -3.553 1.219 -0.959 130.170 0.340
factor(tempo)2:factor(grupo)1 -0.161 -2.901 2.579 -0.115 139.473 0.909
p values calculated using Satterthwaite d.f.
Random Effects
Group Parameter Std. Dev.
nome (Intercept) 2.652
Residual 3.758
Grouping Variables
Group # groups ICC
nome 84 0.333
Code
DHARMa::simulateResiduals(modelo_2.1) |> plot()

Code
performance::check_collinearity(modelo_2.1)

2.2 Desfechos Secundários

2.2.1 Efeito global percebido

2.2.1.1 Evolução

Code
df_model |>
    mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
    mutate(
        tempo = if_else(
            tempo == 0,
            "Pré tratamento",
            if_else(tempo == 1, "Pós tratamento", "Follow-up")
        ),
        tempo = factor(
            tempo,
            levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
        )
    ) |>
    group_by(tempo, grupo) |>
    summarise(
        média = round(mean(epegp, na.rm = T), 2),
        dp = round(sd(epegp, na.rm = T), 2),
        .groups = "drop"
    ) |>
    gt() |>
    tab_header(
        title = "Média do efeito global percebido",
        subtitle = "Por grupo e tempo"
    )
Média do efeito global percebido
Por grupo e tempo
tempo grupo média dp
Pré tratamento Controle -2.18 2.17
Pré tratamento Intervenção -1.63 2.51
Pós tratamento Controle 4.17 0.82
Pós tratamento Intervenção 3.82 1.01
Follow-up Controle 4.04 1.14
Follow-up Intervenção 3.04 2.10
Code
ggplotly(
    df_model |>
        mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
        group_by(grupo, tempo) |>
        summarise(
            media = mean(epegp, na.rm = T),
            dp = sd(epegp, na.rm = T),
            .groups = "drop"
        ) |>
        ggplot(aes(y = media, x = tempo, color = factor(grupo))) +
        geom_point(position = position_dodge(0.1), stat = "identity") +
        geom_line(position = position_dodge(0.1), stat = "identity") +
        geom_errorbar(
            aes(ymin = media - dp, ymax = media + dp, width = .2),
            position = position_dodge(0.1)
        ) +
        theme_classic() +
        scale_color_grey() +
        ylab("Média do efeito global percebido") +
        xlab(NULL) +
        labs(color = "Grupos")
) |>
    layout(
        xaxis = list(
            ticktext = list("Pré tratamento", "Pós tratamento", "Follow-up"),
            tickvals = list(0, 1, 2)
        )
    )

2.2.1.2 Modelo

Code
# Modelo com intercepto aleatório por paciente (modelo 1)
modelo_3.1 <- lmer(
    epegp ~ factor(tempo) * factor(grupo) + (1 | nome),
    data = df_model
)

tbl_3.1 <- modelo_3.1 |>
    parameters::parameters(effects = "fixed") |>
    tibble()

tbl_3.1 |>
    filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
    mutate(
        Parameter = case_when(
            Parameter == "factor(grupo)1" ~ "Pré tratamento",
            Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
            Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
        )
    ) |>
    select(!c(df_error, SE, CI, Effects)) |>
    datatable(
        rownames = FALSE,
        colnames = c(
            "Acompanhamento",
            "Diferença",
            "IC 95% Inferior",
            "IC 95% Superior",
            "t",
            "p"
        ),
        extensions = "Buttons",
        options = list(
            dom = "Bt",
            buttons = c("copy", "csv", "excel", "pdf"),
            pageLength = 20,
            columnDefs = list(list(
                className = "dt-center",
                targets = c("Coefficient", "CI_low", "CI_high", "t", "p")
            ))
        )
    ) |>
    formatRound(c("Coefficient"), 2) |>
    formatRound(c("CI_low", "CI_high", "t", "p"), 3)
Code
ggplotly(
    tbl_3.1 |>
        filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
        mutate(
            Parameter = case_when(
                Parameter == "factor(grupo)1" ~ "Pré tratamento",
                Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
                Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
            )
        ) |>
        mutate(
            Parameter = factor(
                Parameter,
                levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
            )
        ) |>
        select(!c(df_error, SE, CI, Effects)) |>
        ggplot(aes(x = Parameter, y = Coefficient)) +
        geom_line() +
        geom_errorbar(width = .1, aes(ymin = CI_low, ymax = CI_high)) +
        geom_point(shape = 21, size = 3, fill = "white") +
        theme_classic() +
        ylab("Diferença média do efeito global percebido") +
        xlab(" ") +
        geom_hline(yintercept = 0)
)
Code
modelo_3.1 |> jtools::summ(confint = TRUE, digits = 3)
Observations 207
Dependent variable epegp
Type Mixed effects linear regression
AIC 842.089
BIC 868.750
Pseudo-R² (fixed effects) 0.716
Pseudo-R² (total) 0.728
Fixed Effects
Est. 2.5% 97.5% t val. d.f. p
(Intercept) -2.182 -2.712 -1.652 -8.069 200.414 0.000
factor(tempo)1 6.348 5.567 7.129 15.927 135.112 0.000
factor(tempo)2 6.226 5.359 7.093 14.081 150.227 0.000
factor(grupo)1 0.548 -0.215 1.311 1.407 200.414 0.161
factor(tempo)1:factor(grupo)1 -0.903 -2.003 0.198 -1.607 131.298 0.110
factor(tempo)2:factor(grupo)1 -1.568 -2.810 -0.327 -2.476 149.283 0.014
p values calculated using Satterthwaite d.f.
Random Effects
Group Parameter Std. Dev.
nome (Intercept) 0.368
Residual 1.756
Grouping Variables
Group # groups ICC
nome 85 0.042
Code
DHARMa::simulateResiduals(modelo_3.1) |> plot()

Code
performance::check_collinearity(modelo_3.1)

2.2.2 Cinesiofobia

2.2.2.1 Evolução

Code
df_model |>
    mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
    mutate(
        tempo = if_else(
            tempo == 0,
            "Pré tratamento",
            if_else(tempo == 1, "Pós tratamento", "Follow-up")
        ),
        tempo = factor(
            tempo,
            levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
        )
    ) |>
    group_by(tempo, grupo) |>
    summarise(
        média = round(mean(cinesiofobia, na.rm = T), 2),
        dp = round(sd(cinesiofobia, na.rm = T), 2),
        .groups = "drop"
    ) |>
    gt() |>
    tab_header(
        title = "Média da cinesiofobia",
        subtitle = "Por grupo e tempo"
    )
Média da cinesiofobia
Por grupo e tempo
tempo grupo média dp
Pré tratamento Controle 42.43 6.65
Pré tratamento Intervenção 42.76 6.39
Pós tratamento Controle 38.51 6.87
Pós tratamento Intervenção 37.84 6.47
Follow-up Controle 36.88 8.63
Follow-up Intervenção 38.67 7.55
Code
ggplotly(
    df_model |>
        mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
        group_by(grupo, tempo) |>
        summarise(
            media = mean(cinesiofobia, na.rm = T),
            dp = sd(cinesiofobia, na.rm = T),
            .groups = "drop"
        ) |>
        ggplot(aes(y = media, x = tempo, color = factor(grupo))) +
        geom_point(position = position_dodge(0.1), stat = "identity") +
        geom_line(position = position_dodge(0.1), stat = "identity") +
        geom_errorbar(
            aes(ymin = media - dp, ymax = media + dp, width = .2),
            position = position_dodge(0.1)
        ) +
        theme_classic() +
        scale_color_grey() +
        ylab("Média da cinesiofobia") +
        xlab(NULL) +
        labs(color = "Grupos")
) |>
    layout(
        xaxis = list(
            ticktext = list("Pré tratamento", "Pós tratamento", "Follow-up"),
            tickvals = list(0, 1, 2)
        )
    )

2.2.2.2 Modelo

Code
# Modelo com intercepto aleatório por paciente (modelo 1)
modelo_4.1 <- lmer(
    cinesiofobia ~ factor(tempo) * factor(grupo) + (1 | nome),
    data = df_model
)

tbl_4.1 <- modelo_4.1 |>
    parameters::parameters(effects = "fixed") |>
    tibble()

tbl_4.1 |>
    filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
    mutate(
        Parameter = case_when(
            Parameter == "factor(grupo)1" ~ "Pré tratamento",
            Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
            Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
        )
    ) |>
    select(!c(df_error, SE, CI, Effects)) |>
    datatable(
        rownames = FALSE,
        colnames = c(
            "Acompanhamento",
            "Diferença",
            "IC 95% Inferior",
            "IC 95% Superior",
            "t",
            "p"
        ),
        extensions = "Buttons",
        options = list(
            dom = "Bt",
            buttons = c("copy", "csv", "excel", "pdf"),
            pageLength = 20,
            columnDefs = list(list(
                className = "dt-center",
                targets = c("Coefficient", "CI_low", "CI_high", "t", "p")
            ))
        )
    ) |>
    formatRound(c("Coefficient"), 2) |>
    formatRound(c("CI_low", "CI_high", "t", "p"), 3)
Code
ggplotly(
    tbl_4.1 |>
        filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
        mutate(
            Parameter = case_when(
                Parameter == "factor(grupo)1" ~ "Pré tratamento",
                Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
                Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
            )
        ) |>
        mutate(
            Parameter = factor(
                Parameter,
                levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
            )
        ) |>
        select(!c(df_error, SE, CI, Effects)) |>
        ggplot(aes(x = Parameter, y = Coefficient)) +
        geom_line() +
        geom_errorbar(width = .1, aes(ymin = CI_low, ymax = CI_high)) +
        geom_point(shape = 21, size = 3, fill = "white") +
        theme_classic() +
        ylab("Diferença média da cinesiofobia") +
        xlab(" ") +
        geom_hline(yintercept = 0)
)
Code
modelo_4.1 |> jtools::summ(confint = TRUE, digits = 3)
Observations 207
Dependent variable cinesiofobia
Type Mixed effects linear regression
AIC 1337.782
BIC 1364.444
Pseudo-R² (fixed effects) 0.101
Pseudo-R² (total) 0.584
Fixed Effects
Est. 2.5% 97.5% t val. d.f. p
(Intercept) 42.432 40.392 44.472 40.765 140.749 0.000
factor(tempo)1 -4.054 -6.200 -1.908 -3.702 130.316 0.000
factor(tempo)2 -5.479 -7.910 -3.047 -4.416 134.171 0.000
factor(grupo)1 0.324 -2.613 3.262 0.216 140.749 0.829
factor(tempo)1:factor(grupo)1 -0.821 -3.819 2.176 -0.537 127.459 0.592
factor(tempo)2:factor(grupo)1 1.524 -1.946 4.995 0.861 132.580 0.391
p values calculated using Satterthwaite d.f.
Random Effects
Group Parameter Std. Dev.
nome (Intercept) 5.064
Residual 4.693
Grouping Variables
Group # groups ICC
nome 85 0.538
Code
DHARMa::simulateResiduals(modelo_4.1) |> plot()

Code
performance::check_collinearity(modelo_4.1)

2.2.3 Autoeficácia

2.2.3.1 Evolução

Code
df_model |>
    mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
    mutate(
        tempo = if_else(
            tempo == 0,
            "Pré tratamento",
            if_else(tempo == 1, "Pós tratamento", "Follow-up")
        ),
        tempo = factor(
            tempo,
            levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
        )
    ) |>
    group_by(tempo, grupo) |>
    summarise(
        média = round(mean(autoeficacia, na.rm = T), 2),
        dp = round(sd(autoeficacia, na.rm = T), 2),
        .groups = "drop"
    ) |>
    gt() |>
    tab_header(
        title = "Média da autoeficácia",
        subtitle = "Por grupo e tempo"
    )
Média da autoeficácia
Por grupo e tempo
tempo grupo média dp
Pré tratamento Controle 63.46 11.37
Pré tratamento Intervenção 62.37 18.39
Pós tratamento Controle 79.31 13.89
Pós tratamento Intervenção 81.80 13.93
Follow-up Controle 79.04 18.56
Follow-up Intervenção 78.37 12.47
Code
ggplotly(
    df_model |>
        mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
        group_by(grupo, tempo) |>
        summarise(
            media = mean(autoeficacia, na.rm = T),
            dp = sd(autoeficacia, na.rm = T),
            .groups = "drop"
        ) |>
        ggplot(aes(y = media, x = tempo, color = factor(grupo))) +
        geom_point(position = position_dodge(0.1), stat = "identity") +
        geom_line(position = position_dodge(0.1), stat = "identity") +
        geom_errorbar(
            aes(ymin = media - dp, ymax = media + dp, width = .2),
            position = position_dodge(0.1)
        ) +
        theme_classic() +
        scale_color_grey() +
        ylab("Média da autoeficácia") +
        xlab(NULL) +
        labs(color = "Grupos")
) |>
    layout(
        xaxis = list(
            ticktext = list("Pré tratamento", "Pós tratamento", "Follow-up"),
            tickvals = list(0, 1, 2)
        )
    )

2.2.3.2 Modelo

Code
# Modelo com intercepto aleatório por paciente (modelo 1)
modelo_5.1 <- lmer(
    autoeficacia ~ factor(tempo) * factor(grupo) + (1 | nome),
    data = df_model
)

tbl_5.1 <- modelo_5.1 |>
    parameters::parameters(effects = "fixed") |>
    tibble()

tbl_5.1 |>
    filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
    mutate(
        Parameter = case_when(
            Parameter == "factor(grupo)1" ~ "Pré tratamento",
            Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
            Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
        )
    ) |>
    select(!c(df_error, SE, CI, Effects)) |>
    datatable(
        rownames = FALSE,
        colnames = c(
            "Acompanhamento",
            "Diferença",
            "IC 95% Inferior",
            "IC 95% Superior",
            "t",
            "p"
        ),
        extensions = "Buttons",
        options = list(
            dom = "Bt",
            buttons = c("copy", "csv", "excel", "pdf"),
            pageLength = 20,
            columnDefs = list(list(
                className = "dt-center",
                targets = c("Coefficient", "CI_low", "CI_high", "t", "p")
            ))
        )
    ) |>
    formatRound(c("Coefficient"), 2) |>
    formatRound(c("CI_low", "CI_high", "t", "p"), 3)
Code
ggplotly(
    tbl_5.1 |>
        filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
        mutate(
            Parameter = case_when(
                Parameter == "factor(grupo)1" ~ "Pré tratamento",
                Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
                Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
            )
        ) |>
        mutate(
            Parameter = factor(
                Parameter,
                levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
            )
        ) |>
        select(!c(df_error, SE, CI, Effects)) |>
        ggplot(aes(x = Parameter, y = Coefficient)) +
        geom_line() +
        geom_errorbar(width = .1, aes(ymin = CI_low, ymax = CI_high)) +
        geom_point(shape = 21, size = 3, fill = "white") +
        theme_classic() +
        ylab("Diferença média da autoeficácia") +
        xlab(" ") +
        geom_hline(yintercept = 0)
)
Code
modelo_5.1 |> jtools::summ(confint = TRUE, digits = 3)
Observations 207
Dependent variable autoeficacia
Type Mixed effects linear regression
AIC 1661.382
BIC 1688.044
Pseudo-R² (fixed effects) 0.238
Pseudo-R² (total) 0.575
Fixed Effects
Est. 2.5% 97.5% t val. d.f. p
(Intercept) 63.459 59.074 67.844 28.365 155.592 0.000
factor(tempo)1 15.827 10.789 20.866 6.157 132.426 0.000
factor(tempo)2 15.615 9.921 21.310 5.375 137.747 0.000
factor(grupo)1 -1.091 -7.405 5.223 -0.339 155.592 0.735
factor(tempo)1:factor(grupo)1 3.481 -3.567 10.530 0.968 129.189 0.335
factor(tempo)2:factor(grupo)1 -1.121 -9.256 7.013 -0.270 136.054 0.787
p values calculated using Satterthwaite d.f.
Random Effects
Group Parameter Std. Dev.
nome (Intercept) 9.878
Residual 11.075
Grouping Variables
Group # groups ICC
nome 85 0.443
Code
DHARMa::simulateResiduals(modelo_5.1) |> plot()

Code
performance::check_collinearity(modelo_5.1)

2.2.4 Força Extensão MMII

2.2.4.1 Evolução

Code
df_model |>
    mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
    mutate(
        tempo = if_else(
            tempo == 0,
            "Pré tratamento",
            if_else(tempo == 1, "Pós tratamento", "Follow-up")
        ),
        tempo = factor(
            tempo,
            levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
        )
    ) |>
    group_by(tempo, grupo) |>
    summarise(
        média = round(mean(fmmmiie, na.rm = T), 2),
        dp = round(sd(fmmmiie, na.rm = T), 2),
        .groups = "drop"
    ) |>
    gt() |>
    tab_header(
        title = "Média da força extensão MMII",
        subtitle = "Por grupo e tempo"
    )
Média da força extensão MMII
Por grupo e tempo
tempo grupo média dp
Pré tratamento Controle 25.69 10.11
Pré tratamento Intervenção 27.34 11.53
Pós tratamento Controle 28.56 12.58
Pós tratamento Intervenção 29.97 12.79
Follow-up Controle NaN NA
Follow-up Intervenção NaN NA
Code
ggplotly(
    df_model |>
        mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
        group_by(grupo, tempo) |>
        summarise(
            media = mean(fmmmiie, na.rm = T),
            dp = sd(fmmmiie, na.rm = T),
            .groups = "drop"
        ) |>
        ggplot(aes(y = media, x = tempo, color = factor(grupo))) +
        geom_point(position = position_dodge(0.1), stat = "identity") +
        geom_line(position = position_dodge(0.1), stat = "identity") +
        geom_errorbar(
            aes(ymin = media - dp, ymax = media + dp, width = .2),
            position = position_dodge(0.1)
        ) +
        theme_classic() +
        scale_color_grey() +
        ylab("Média da força extensão MMII") +
        xlab(NULL) +
        labs(color = "Grupos")
) |>
    layout(
        xaxis = list(
            ticktext = list("Pré tratamento", "Pós tratamento", "Follow-up"),
            tickvals = list(0, 1, 2)
        )
    )

2.2.4.2 Modelo

Code
# Modelo com intercepto aleatório por paciente (modelo 1)
modelo_6.1 <- lmer(
    fmmmiie ~ factor(tempo) * factor(grupo) + (1 | nome),
    data = df_model
)

tbl_6.1 <- modelo_6.1 |>
    parameters::parameters(effects = "fixed") |>
    tibble()

tbl_6.1 |>
    filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
    mutate(
        Parameter = case_when(
            Parameter == "factor(grupo)1" ~ "Pré tratamento",
            Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
            Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
        )
    ) |>
    select(!c(df_error, SE, CI, Effects)) |>
    datatable(
        rownames = FALSE,
        colnames = c(
            "Acompanhamento",
            "Diferença",
            "IC 95% Inferior",
            "IC 95% Superior",
            "t",
            "p"
        ),
        extensions = "Buttons",
        options = list(
            dom = "Bt",
            buttons = c("copy", "csv", "excel", "pdf"),
            pageLength = 20,
            columnDefs = list(list(
                className = "dt-center",
                targets = c("Coefficient", "CI_low", "CI_high", "t", "p")
            ))
        )
    ) |>
    formatRound(c("Coefficient"), 2) |>
    formatRound(c("CI_low", "CI_high", "t", "p"), 3)
Code
ggplotly(
    tbl_6.1 |>
        filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
        mutate(
            Parameter = case_when(
                Parameter == "factor(grupo)1" ~ "Pré tratamento",
                Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
                Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
            )
        ) |>
        mutate(
            Parameter = factor(
                Parameter,
                levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
            )
        ) |>
        select(!c(df_error, SE, CI, Effects)) |>
        ggplot(aes(x = Parameter, y = Coefficient)) +
        geom_line() +
        geom_errorbar(width = .1, aes(ymin = CI_low, ymax = CI_high)) +
        geom_point(shape = 21, size = 3, fill = "white") +
        theme_classic() +
        ylab("Diferença média da força extensão MMII") +
        xlab(" ") +
        geom_hline(yintercept = 0)
)
Code
modelo_6.1 |> jtools::summ(confint = TRUE, digits = 3)
Observations 158
Dependent variable fmmmiie
Type Mixed effects linear regression
AIC 1150.557
BIC 1168.932
Pseudo-R² (fixed effects) 0.021
Pseudo-R² (total) 0.793
Fixed Effects
Est. 2.5% 97.5% t val. d.f. p
(Intercept) 25.689 22.250 29.127 14.641 100.147 0.000
factor(tempo)1 3.670 1.191 6.149 2.901 74.692 0.005
factor(grupo)1 1.654 -3.297 6.606 0.655 100.147 0.514
factor(tempo)1:factor(grupo)1 -1.094 -4.541 2.354 -0.622 73.768 0.536
p values calculated using Satterthwaite d.f.
Random Effects
Group Parameter Std. Dev.
nome (Intercept) 10.336
Residual 5.349
Grouping Variables
Group # groups ICC
nome 85 0.789
Code
DHARMa::simulateResiduals(modelo_6.1) |> plot()

Code
performance::check_collinearity(modelo_6.1)

2.2.5 Força Flexão MMII

2.2.5.1 Evolução

Code
df_model |>
    mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
    mutate(
        tempo = if_else(
            tempo == 0,
            "Pré tratamento",
            if_else(tempo == 1, "Pós tratamento", "Follow-up")
        ),
        tempo = factor(
            tempo,
            levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
        )
    ) |>
    group_by(tempo, grupo) |>
    summarise(
        média = round(mean(fmmmiif, na.rm = T), 2),
        dp = round(sd(fmmmiif, na.rm = T), 2),
        .groups = "drop"
    ) |>
    gt() |>
    tab_header(
        title = "Média da força flexão MMII",
        subtitle = "Por grupo e tempo"
    )
Média da força flexão MMII
Por grupo e tempo
tempo grupo média dp
Pré tratamento Controle 17.66 6.12
Pré tratamento Intervenção 19.01 6.70
Pós tratamento Controle 19.41 6.33
Pós tratamento Intervenção 19.04 8.00
Follow-up Controle NaN NA
Follow-up Intervenção NaN NA
Code
ggplotly(
    df_model |>
        mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
        group_by(grupo, tempo) |>
        summarise(
            media = mean(fmmmiif, na.rm = T),
            dp = sd(fmmmiif, na.rm = T),
            .groups = "drop"
        ) |>
        ggplot(aes(y = media, x = tempo, color = factor(grupo))) +
        geom_point(position = position_dodge(0.1), stat = "identity") +
        geom_line(position = position_dodge(0.1), stat = "identity") +
        geom_errorbar(
            aes(ymin = media - dp, ymax = media + dp, width = .2),
            position = position_dodge(0.1)
        ) +
        theme_classic() +
        scale_color_grey() +
        ylab("Média da força flexão MMII") +
        xlab(NULL) +
        labs(color = "Grupos")
) |>
    layout(
        xaxis = list(
            ticktext = list("Pré tratamento", "Pós tratamento", "Follow-up"),
            tickvals = list(0, 1, 2)
        )
    )

2.2.5.2 Modelo

Code
# Modelo com intercepto aleatório por paciente (modelo 1)
modelo_7.1 <- lmer(
    fmmmiif ~ factor(tempo) * factor(grupo) + (1 | nome),
    data = df_model
)

tbl_7.1 <- modelo_7.1 |>
    parameters::parameters(effects = "fixed") |>
    tibble()

tbl_7.1 |>
    filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
    mutate(
        Parameter = case_when(
            Parameter == "factor(grupo)1" ~ "Pré tratamento",
            Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
            Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
        )
    ) |>
    select(!c(df_error, SE, CI, Effects)) |>
    datatable(
        rownames = FALSE,
        colnames = c(
            "Acompanhamento",
            "Diferença",
            "IC 95% Inferior",
            "IC 95% Superior",
            "t",
            "p"
        ),
        extensions = "Buttons",
        options = list(
            dom = "Bt",
            buttons = c("copy", "csv", "excel", "pdf"),
            pageLength = 20,
            columnDefs = list(list(
                className = "dt-center",
                targets = c("Coefficient", "CI_low", "CI_high", "t", "p")
            ))
        )
    ) |>
    formatRound(c("Coefficient"), 2) |>
    formatRound(c("CI_low", "CI_high", "t", "p"), 3)
Code
ggplotly(
    tbl_7.1 |>
        filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
        mutate(
            Parameter = case_when(
                Parameter == "factor(grupo)1" ~ "Pré tratamento",
                Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
                Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
            )
        ) |>
        mutate(
            Parameter = factor(
                Parameter,
                levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
            )
        ) |>
        select(!c(df_error, SE, CI, Effects)) |>
        ggplot(aes(x = Parameter, y = Coefficient)) +
        geom_line() +
        geom_errorbar(width = .1, aes(ymin = CI_low, ymax = CI_high)) +
        geom_point(shape = 21, size = 3, fill = "white") +
        theme_classic() +
        ylab("Diferença média da força flexão MMII") +
        xlab(" ") +
        geom_hline(yintercept = 0)
)
Code
modelo_7.1 |> jtools::summ(confint = TRUE, digits = 3)
Observations 158
Dependent variable fmmmiif
Type Mixed effects linear regression
AIC 1006.439
BIC 1024.814
Pseudo-R² (fixed effects) 0.012
Pseudo-R² (total) 0.699
Fixed Effects
Est. 2.5% 97.5% t val. d.f. p
(Intercept) 17.662 15.657 19.667 17.269 108.181 0.000
factor(tempo)1 2.044 0.318 3.770 2.321 75.917 0.023
factor(grupo)1 1.349 -1.537 4.236 0.916 108.181 0.362
factor(tempo)1:factor(grupo)1 -2.165 -4.569 0.239 -1.765 74.609 0.082
p values calculated using Satterthwaite d.f.
Random Effects
Group Parameter Std. Dev.
nome (Intercept) 5.659
Residual 3.742
Grouping Variables
Group # groups ICC
nome 85 0.696
Code
DHARMa::simulateResiduals(modelo_7.1) |> plot()

Code
performance::check_collinearity(modelo_7.1)

2.2.6 Força de abdominal

2.2.6.1 Evolução

Code
df_model |>
    mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
    mutate(
        tempo = if_else(
            tempo == 0,
            "Pré tratamento",
            if_else(tempo == 1, "Pós tratamento", "Follow-up")
        ),
        tempo = factor(
            tempo,
            levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
        )
    ) |>
    group_by(tempo, grupo) |>
    summarise(
        média = round(mean(fabs, na.rm = T), 2),
        dp = round(sd(fabs, na.rm = T), 2),
        .groups = "drop"
    ) |>
    gt() |>
    tab_header(
        title = "Média da força de abdominal",
        subtitle = "Por grupo e tempo"
    )
Média da força de abdominal
Por grupo e tempo
tempo grupo média dp
Pré tratamento Controle 15.39 9.09
Pré tratamento Intervenção 16.51 12.72
Pós tratamento Controle 23.97 10.68
Pós tratamento Intervenção 26.03 15.08
Follow-up Controle NaN NA
Follow-up Intervenção NaN NA
Code
ggplotly(
    df_model |>
        mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
        group_by(grupo, tempo) |>
        summarise(
            media = mean(fabs, na.rm = T),
            dp = sd(fabs, na.rm = T),
            .groups = "drop"
        ) |>
        ggplot(aes(y = media, x = tempo, color = factor(grupo))) +
        geom_point(position = position_dodge(0.1), stat = "identity") +
        geom_line(position = position_dodge(0.1), stat = "identity") +
        geom_errorbar(
            aes(ymin = media - dp, ymax = media + dp, width = .2),
            position = position_dodge(0.1)
        ) +
        theme_classic() +
        scale_color_grey() +
        ylab("Média da força de abdominal") +
        xlab(NULL) +
        labs(color = "Grupos")
) |>
    layout(
        xaxis = list(
            ticktext = list("Pré tratamento", "Pós tratamento", "Follow-up"),
            tickvals = list(0, 1, 2)
        )
    )

2.2.6.2 Modelo

Code
# Modelo com intercepto aleatório por paciente (modelo 1)
modelo_8.1 <- lmer(
    fabs ~ factor(tempo) * factor(grupo) + (1 | nome),
    data = df_model
)

tbl_8.1 <- modelo_8.1 |>
    parameters::parameters(effects = "fixed") |>
    tibble()

tbl_8.1 |>
    filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
    mutate(
        Parameter = case_when(
            Parameter == "factor(grupo)1" ~ "Pré tratamento",
            Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
            Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
        )
    ) |>
    select(!c(df_error, SE, CI, Effects)) |>
    datatable(
        rownames = FALSE,
        colnames = c(
            "Acompanhamento",
            "Diferença",
            "IC 95% Inferior",
            "IC 95% Superior",
            "t",
            "p"
        ),
        extensions = "Buttons",
        options = list(
            dom = "Bt",
            buttons = c("copy", "csv", "excel", "pdf"),
            pageLength = 20,
            columnDefs = list(list(
                className = "dt-center",
                targets = c("Coefficient", "CI_low", "CI_high", "t", "p")
            ))
        )
    ) |>
    formatRound(c("Coefficient"), 2) |>
    formatRound(c("CI_low", "CI_high", "t", "p"), 3)
Code
ggplotly(
    tbl_8.1 |>
        filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
        mutate(
            Parameter = case_when(
                Parameter == "factor(grupo)1" ~ "Pré tratamento",
                Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
                Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
            )
        ) |>
        mutate(
            Parameter = factor(
                Parameter,
                levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
            )
        ) |>
        select(!c(df_error, SE, CI, Effects)) |>
        ggplot(aes(x = Parameter, y = Coefficient)) +
        geom_line() +
        geom_errorbar(width = .1, aes(ymin = CI_low, ymax = CI_high)) +
        geom_point(shape = 21, size = 3, fill = "white") +
        theme_classic() +
        ylab("Diferença média da força de abdominal") +
        xlab(" ") +
        geom_hline(yintercept = 0)
)
Code
modelo_8.1 |> jtools::summ(confint = TRUE, digits = 3)
Observations 158
Dependent variable fabs
Type Mixed effects linear regression
AIC 1179.999
BIC 1198.375
Pseudo-R² (fixed effects) 0.124
Pseudo-R² (total) 0.740
Fixed Effects
Est. 2.5% 97.5% t val. d.f. p
(Intercept) 15.386 11.849 18.924 8.526 107.834 0.000
factor(tempo)1 8.375 5.363 11.386 5.451 76.140 0.000
factor(grupo)1 1.126 -3.967 6.219 0.433 107.834 0.666
factor(tempo)1:factor(grupo)1 0.852 -3.342 5.046 0.398 74.859 0.692
p values calculated using Satterthwaite d.f.
Random Effects
Group Parameter Std. Dev.
nome (Intercept) 10.035
Residual 6.528
Grouping Variables
Group # groups ICC
nome 85 0.703
Code
DHARMa::simulateResiduals(modelo_8.1) |> plot()

Code
performance::check_collinearity(modelo_8.1)

2.2.7 Força de preensão palmar direita

2.2.7.1 Evolução

Code
df_model |>
    mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
    mutate(
        tempo = if_else(
            tempo == 0,
            "Pré tratamento",
            if_else(tempo == 1, "Pós tratamento", "Follow-up")
        ),
        tempo = factor(
            tempo,
            levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
        )
    ) |>
    group_by(tempo, grupo) |>
    summarise(
        média = round(mean(fpmd, na.rm = T), 2),
        dp = round(sd(fpmd, na.rm = T), 2),
        .groups = "drop"
    ) |>
    gt() |>
    tab_header(
        title = "Média da força de preensão palmar direita",
        subtitle = "Por grupo e tempo"
    )
Média da força de preensão palmar direita
Por grupo e tempo
tempo grupo média dp
Pré tratamento Controle 28.23 11.00
Pré tratamento Intervenção 31.48 10.87
Pós tratamento Controle 31.24 11.08
Pós tratamento Intervenção 33.24 10.67
Follow-up Controle NaN NA
Follow-up Intervenção NaN NA
Code
ggplotly(
    df_model |>
        mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
        group_by(grupo, tempo) |>
        summarise(
            media = mean(fpmd, na.rm = T),
            dp = sd(fpmd, na.rm = T),
            .groups = "drop"
        ) |>
        ggplot(aes(y = media, x = tempo, color = factor(grupo))) +
        geom_point(position = position_dodge(0.1), stat = "identity") +
        geom_line(position = position_dodge(0.1), stat = "identity") +
        geom_errorbar(
            aes(ymin = media - dp, ymax = media + dp, width = .2),
            position = position_dodge(0.1)
        ) +
        theme_classic() +
        scale_color_grey() +
        ylab("Média da força de preensão palmar direita") +
        xlab(NULL) +
        labs(color = "Grupos")
) |>
    layout(
        xaxis = list(
            ticktext = list("Pré tratamento", "Pós tratamento", "Follow-up"),
            tickvals = list(0, 1, 2)
        )
    )

2.2.7.2 Modelo

Code
# Modelo com intercepto aleatório por paciente (modelo 1)
modelo_9.1 <- lmer(
    fpmd ~ factor(tempo) * factor(grupo) + (1 | nome),
    data = df_model
)

tbl_9.1 <- modelo_9.1 |>
    parameters::parameters(effects = "fixed") |>
    tibble()

tbl_9.1 |>
    filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
    mutate(
        Parameter = case_when(
            Parameter == "factor(grupo)1" ~ "Pré tratamento",
            Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
            Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
        )
    ) |>
    select(!c(df_error, SE, CI, Effects)) |>
    datatable(
        rownames = FALSE,
        colnames = c(
            "Acompanhamento",
            "Diferença",
            "IC 95% Inferior",
            "IC 95% Superior",
            "t",
            "p"
        ),
        extensions = "Buttons",
        options = list(
            dom = "Bt",
            buttons = c("copy", "csv", "excel", "pdf"),
            pageLength = 20,
            columnDefs = list(list(
                className = "dt-center",
                targets = c("Coefficient", "CI_low", "CI_high", "t", "p")
            ))
        )
    ) |>
    formatRound(c("Coefficient"), 2) |>
    formatRound(c("CI_low", "CI_high", "t", "p"), 3)
Code
ggplotly(
    tbl_9.1 |>
        filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
        mutate(
            Parameter = case_when(
                Parameter == "factor(grupo)1" ~ "Pré tratamento",
                Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
                Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
            )
        ) |>
        mutate(
            Parameter = factor(
                Parameter,
                levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
            )
        ) |>
        select(!c(df_error, SE, CI, Effects)) |>
        ggplot(aes(x = Parameter, y = Coefficient)) +
        geom_line() +
        geom_errorbar(width = .1, aes(ymin = CI_low, ymax = CI_high)) +
        geom_point(shape = 21, size = 3, fill = "white") +
        theme_classic() +
        ylab("Diferença média da força de preensão palmar direita") +
        xlab(" ") +
        geom_hline(yintercept = 0)
)
Code
modelo_9.1 |> jtools::summ(confint = TRUE, digits = 3)
Observations 158
Dependent variable fpmd
Type Mixed effects linear regression
AIC 1053.442
BIC 1071.817
Pseudo-R² (fixed effects) 0.025
Pseudo-R² (total) 0.937
Fixed Effects
Est. 2.5% 97.5% t val. d.f. p
(Intercept) 28.235 25.002 31.468 17.118 87.703 0.000
factor(tempo)1 3.223 1.920 4.526 4.849 71.877 0.000
factor(grupo)1 3.245 -1.410 7.900 1.366 87.703 0.175
factor(tempo)1:factor(grupo)1 -1.878 -3.686 -0.071 -2.037 71.587 0.045
p values calculated using Satterthwaite d.f.
Random Effects
Group Parameter Std. Dev.
nome (Intercept) 10.579
Residual 2.790
Grouping Variables
Group # groups ICC
nome 85 0.935
Code
DHARMa::simulateResiduals(modelo_9.1) |> plot()

Code
performance::check_collinearity(modelo_9.1)

2.2.8 Força de preensão palmar esquerda

2.2.8.1 Evolução

Code
df_model |>
    mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
    mutate(
        tempo = if_else(
            tempo == 0,
            "Pré tratamento",
            if_else(tempo == 1, "Pós tratamento", "Follow-up")
        ),
        tempo = factor(
            tempo,
            levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
        )
    ) |>
    group_by(tempo, grupo) |>
    summarise(
        média = round(mean(fpme, na.rm = T), 2),
        dp = round(sd(fpme, na.rm = T), 2),
        .groups = "drop"
    ) |>
    gt() |>
    tab_header(
        title = "Média da força de preensão palmar esquerda",
        subtitle = "Por grupo e tempo"
    )
Média da força de preensão palmar esquerda
Por grupo e tempo
tempo grupo média dp
Pré tratamento Controle 26.36 11.36
Pré tratamento Intervenção 29.72 10.65
Pós tratamento Controle 29.11 11.38
Pós tratamento Intervenção 31.63 11.21
Follow-up Controle NaN NA
Follow-up Intervenção NaN NA
Code
ggplotly(
    df_model |>
        mutate(grupo = if_else(grupo == 0, "Controle", "Intervenção")) |>
        group_by(grupo, tempo) |>
        summarise(
            media = mean(fpme, na.rm = T),
            dp = sd(fpme, na.rm = T),
            .groups = "drop"
        ) |>
        ggplot(aes(y = media, x = tempo, color = factor(grupo))) +
        geom_point(position = position_dodge(0.1), stat = "identity") +
        geom_line(position = position_dodge(0.1), stat = "identity") +
        geom_errorbar(
            aes(ymin = media - dp, ymax = media + dp, width = .2),
            position = position_dodge(0.1)
        ) +
        theme_classic() +
        scale_color_grey() +
        ylab("Média da força de preensão palmar esquerda") +
        xlab(NULL) +
        labs(color = "Grupos")
) |>
    layout(
        xaxis = list(
            ticktext = list("Pré tratamento", "Pós tratamento", "Follow-up"),
            tickvals = list(0, 1, 2)
        )
    )

2.2.8.2 Modelo

Code
# Modelo com intercepto aleatório por paciente (modelo 1)
modelo_10.1 <- lmer(
    fpme ~ factor(tempo) * factor(grupo) + (1 | nome),
    data = df_model
)

tbl_10.1 <- modelo_10.1 |>
    parameters::parameters(effects = "fixed") |>
    tibble()

tbl_10.1 |>
    filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
    mutate(
        Parameter = case_when(
            Parameter == "factor(grupo)1" ~ "Pré tratamento",
            Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
            Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
        )
    ) |>
    select(!c(df_error, SE, CI, Effects)) |>
    datatable(
        rownames = FALSE,
        colnames = c(
            "Acompanhamento",
            "Diferença",
            "IC 95% Inferior",
            "IC 95% Superior",
            "t",
            "p"
        ),
        extensions = "Buttons",
        options = list(
            dom = "Bt",
            buttons = c("copy", "csv", "excel", "pdf"),
            pageLength = 20,
            columnDefs = list(list(
                className = "dt-center",
                targets = c("Coefficient", "CI_low", "CI_high", "t", "p")
            ))
        )
    ) |>
    formatRound(c("Coefficient"), 2) |>
    formatRound(c("CI_low", "CI_high", "t", "p"), 3)
Code
ggplotly(
    tbl_10.1 |>
        filter(stringr::str_detect(Parameter, "factor\\(grupo\\)1")) |>
        mutate(
            Parameter = case_when(
                Parameter == "factor(grupo)1" ~ "Pré tratamento",
                Parameter == "factor(tempo)1:factor(grupo)1" ~ "Pós tratamento",
                Parameter == "factor(tempo)2:factor(grupo)1" ~ "Follow-up"
            )
        ) |>
        mutate(
            Parameter = factor(
                Parameter,
                levels = c("Pré tratamento", "Pós tratamento", "Follow-up")
            )
        ) |>
        select(!c(df_error, SE, CI, Effects)) |>
        ggplot(aes(x = Parameter, y = Coefficient)) +
        geom_line() +
        geom_errorbar(width = .1, aes(ymin = CI_low, ymax = CI_high)) +
        geom_point(shape = 21, size = 3, fill = "white") +
        theme_classic() +
        ylab("Diferença média da força de preensão palmar esquerda") +
        xlab(" ") +
        geom_hline(yintercept = 0)
)
Code
modelo_10.1 |> jtools::summ(confint = TRUE, digits = 3)
Observations 158
Dependent variable fpme
Type Mixed effects linear regression
AIC 1071.197
BIC 1089.573
Pseudo-R² (fixed effects) 0.029
Pseudo-R² (total) 0.924
Fixed Effects
Est. 2.5% 97.5% t val. d.f. p
(Intercept) 26.364 23.076 29.651 15.716 88.818 0.000
factor(tempo)1 3.323 1.871 4.774 4.487 72.186 0.000
factor(grupo)1 3.352 -1.382 8.086 1.388 88.818 0.169
factor(tempo)1:factor(grupo)1 -1.499 -3.514 0.515 -1.459 71.839 0.149
p values calculated using Satterthwaite d.f.
Random Effects
Group Parameter Std. Dev.
nome (Intercept) 10.683
Residual 3.110
Grouping Variables
Group # groups ICC
nome 85 0.922
Code
DHARMa::simulateResiduals(modelo_10.1) |> plot()

Code
performance::check_collinearity(modelo_10.1)





References

Twisk, Jos W. R. 2013. Applied Longitudinal Data Analysis for Epidemiology: A Practical Guide. 2nd ed. Cambridge University Press. https://doi.org/10.1017/CBO9781139342834.
———. 2019. Applied Mixed Model Analysis: A Practical Guide. 2nd ed. Cambridge University Press. https://doi.org/10.1017/9781108635660.