Relatório de Análise Nutricional em Oncologia

Associação entre Score PG-SGA e Desfecho Clínico

Autor

Walmes Zeviani

Data de Publicação

28 de novembro de 2025

# Carregamento de pacotes essenciais
library(tidyverse)
library(readxl)
library(gtsummary)   # Para tabelas descritivas e de regressão
library(ggeffects)   # Para gráficos de efeitos marginais
library(performance) # Para diagnóstico do modelo
library(gt)
library(rstatix)
library(ggbeeswarm)
library(patchwork)
library(ggmosaic)

Metodologia da Análise de Dados

A análise estatística foi conduzida utilizando o software R. O estudo segue um delineamento observacional analítico, investigando a associação entre o estado nutricional (mensurado pelo score numérico da Avaliação Subjetiva Global Produzida pelo Paciente - PG-SGA, variável pontos_score) e o desfecho clínico final (variável desfecho_final).

Análise Descritiva e Exploratória

Realizou-se a caracterização da amostra através de estatística descritiva:

  • Variáveis Quantitativas (ex: idade, pontos_score): Descritas por média e desvio padrão ou mediana e intervalo interquartil (IIQ), conforme a distribuição.
  • Variáveis Qualitativas (ex: sexo, topografia, comorbidades): Descritas por frequências absolutas (n) e relativas (%).

Para investigar associações preliminares, foram construídas tabelas de contingência cruzando características clínicas e nutricionais com o desfecho_final. As diferenças entre os grupos (“Alta” vs. “Óbito”) foram testadas via Teste Qui-Quadrado de Pearson (ou Fisher, se necessário) para variáveis categóricas e Teste t de Student ou Mann-Whitney para contínuas.

Modelagem Multivariada (Regressão Logística)

Ajustou-se um Modelo de Regressão Logística Binária para estimar o efeito independente do estado nutricional no óbito.

  • Variável Resposta: desfecho_final (Modelado para a probabilidade de “Óbito”).
  • Variável Explicativa Principal: pontos_score.
  • Ajuste: Covariáveis demográficas e clínicas (idade, sexo, topografia, comorbidades).

Os resultados são apresentados como Odds Ratios (OR) com Intervalos de Confiança de 95%. Investigou-se também a interação entre topografia e pontos_score.


Leitura e Tratamento dos Dados

O código abaixo realiza a importação, limpeza e rotulagem dos dados, conforme definições do dicionário de variáveis do estudo.

# Definição do caminho do arquivo
# Certifique-se que o arquivo está na pasta do projeto
url <- "FICHA DE COLETA - 24.09.25.xlsx"

# Nomes das colunas.
col_names <- c(
    "id",
    "numero_prontuario",
    "iniciais",
    "sexo",
    "idade",
    "topografia",
    "comorbidades",
    "comorbidades_sn",
    "estatura_m",
    "peso_atual_kg",
    "peso_1m_kg",
    "peso_6m_kg",
    "perda_peso_1m_pct",
    "perda_peso_6m_pct",
    "pp_grave_6m_sn",
    "peso_2semanas_kg",
    "ingestao_atual",
    "ingestao_comparada",
    "ingestao_problema_sn",
    "doencas_associadas",
    "febre",
    "codigo_extra",
    "atividades",
    "deficit_gordura",
    "estado_muscular",
    "estado_hidratacao",
    "avaliacao_global",
    "pontos_score",
    "desfecho_final"
)

# Importação dos dados.
tb <-
    read_excel(url,
               sheet = 1,
               skip = 3,
               col_names = col_names) |>
    suppressMessages()

# Arruma valores.
tb <-
    tb |>
    mutate(
        estatura_m = as.numeric(estatura_m),
        peso_6m_kg = as.numeric(peso_6m_kg),
        across(c("sexo", "topografia", "idade"), as.integer),
        across(starts_with("comorbidade"), as.integer),
        across("pp_grave_6m_sn":"pontos_score", as.integer)
    )

#///////////////////////////////////////////////////////////////////////
# Decodificação --------------------------------------------------------

# Sexo
# 0   Feminino
# 1   Masculino
# Nota: Verificando existência antes de fatorar para evitar erros em re-runs
if (exists("sexo", where = tb)){
    tb$sexo <-
        factor(
            tb$sexo,
            levels = c(0, 1),
            labels = c("Feminino", "Masculino")
        )
}

# Topografia
if (exists("topografia", where = tb)) {
    tb$topografia <-
        factor(
            tb$topografia,
            levels = c(1:6),
            labels = c(
                "Cabeça e pescoço",
                "Trato gastrointestinal",
                "Mama e ginecológicos",
                "Urológicos",
                "Hematológicos",
                "Pulmão e outros"
            )
        )
}

# Comorbidades (Categorização 1)
if (exists("comorbidades", where = tb)) {
    tb$comorbidades <-
        factor(tb$comorbidades,
               levels = c(1:4),
               labels = c("0", "1", "2", ">2"))
}

# Comorbidades (Sim/Não)
if (exists("comorbidades_sn", where = tb)) {
    tb$comorbidades_sn <-
        factor(tb$comorbidades_sn,
               levels = c(0, 1),
               labels = c("Sim", "Não"))
}

# Peso nas 2 ultimas semanas
if (exists("peso_2semanas_kg", where = tb)) {
    tb$peso_2semanas_kg <-
        factor(
            tb$peso_2semanas_kg,
            levels = c(1:3),
            labels = c("Manteve", "Diminuiu", "Aumentou")
        )
}

# Atualmente, estou comendo
if (exists("ingestao_atual", where = tb)){
    tb$ingestao_atual <-
        factor(
            tb$ingestao_atual,
            levels = c(1:7),
            labels = c(
                "Alimentos sólidos em menor quantidade",
                "Alimentos sólidos em pouca quantidade",
                "Muito pouco de qualquer comida",
                "Apenas liquidos",
                "Apenas suplementos",
                "Apenas alimentos pela sonda ou veia",
                "Sem alteração"
            )
        )
}

# Comparada a alimentação habitual
if (exists("ingestao_comparada", where = tb)) {
    tb$ingestao_comparada <-
        factor(
            tb$ingestao_comparada,
            levels = c(1:3),
            labels = c("Menos", "Mais", "Sem mudança")
        )
}

# Possui algum problema para se alimentar
if (exists("ingestao_problema_sn", where = tb)){
    tb$ingestao_problema_sn <-
        factor(
            tb$ingestao_problema_sn,
            levels = c(1:3),
            labels = c(
                "Sem sintomas",
                "Até 3 sintomas",
                "Mais que 3 sintomas"
            )
        )
}

# Doenças Associadas
if (exists("doencas_associadas", where = tb)) {
    tb$doencas_associadas <-
        factor(
            tb$doencas_associadas,
            levels = c(1:4),
            labels = c(
                "Sem doença",
                "Apenas 1 doença",
                "Até 3 doenças",
                "Mais que doenças"
            )
        )
}

# Febre
if (exists("febre", where = tb)) {
    tb$febre <-
        factor(
            tb$febre,
            levels = c(1:4),
            labels = c(">72hrs", "72hrs", "<72hrs", "Sem febre")
        )
}

# Atividades e Função
if (exists("atividades", where = tb)){
    tb$atividades <-
        factor(
            tb$atividades,
            levels = c(1:5),
            labels = c(
                "Normal; sem nenhuma limitação",
                "Não totalm. normal; mas capaz ",
                "Capaz de fazer pouca atividade; ",
                "Não me sinto bem para a maioria ",
                "Bastante tempo acamado; "
            )
        )
}

# Déficit de gordura
if (exists("deficit_gordura", where = tb)){
    tb$deficit_gordura <-
        factor(
            tb$deficit_gordura,
            levels = c(1:4),
            labels = c("Leve", "Moderado", "Grave", "Sem deficit")
        )
}

# Déficit muscular
if (exists("estado_muscular", where = tb)){
    tb$estado_muscular <-
        factor(
            tb$estado_muscular,
            levels = c(1:4),
            labels = c("Leve", "Moderado", "Grave", "Sem deficit")
        )
}

# Estado de hidratação
if (exists("estado_hidratacao", where = tb)){
    tb$estado_hidratacao <-
        factor(
            tb$estado_hidratacao,
            levels = c(1:4),
            labels = c("Leve", "Moderado", "Grave", "Sem deficit")
        )
}

# Avaliação global
if (exists("avaliacao_global", where = tb)){
    tb$avaliacao_global <-
        factor(
            tb$avaliacao_global,
            levels = c(1:3),
            labels = c(
                "Bem nutrido",
                "Moderadamente desnutrido",
                "Gravemente desnutrido"
            )
        )
}

# Desfecho final
if (exists("desfecho_final", where = tb)){
    tb$desfecho_final <-
        factor(tb$desfecho_final,
               levels = c(1:2),
               labels = c("Alta", "Óbito"))
}

# pp grave em 6 meses
if (exists("pp_grave_6m_sn", where = tb)) {
    tb$pp_grave_6m_sn <-
        factor(tb$pp_grave_6m_sn,
               levels = c(0, 1),
               labels = c("Sim", "Não"))
}

# Visualização rápida
glimpse(tb)
Rows: 190
Columns: 29
$ id                   <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 16, 18, 2…
$ numero_prontuario    <dbl> 23008519, 23010681, 24000074, 23009647, 1007958, …
$ iniciais             <chr> "M.A.D.S", "O.P", "A.S", "O.P.M", "M.C.D", "J.F.V…
$ sexo                 <fct> Feminino, Feminino, Feminino, Masculino, Feminino…
$ idade                <int> 39, 83, 54, 62, 53, 71, 39, 55, 67, 54, 67, 55, 6…
$ topografia           <fct> Hematológicos, Mama e ginecológicos, Trato gastro…
$ comorbidades         <fct> 0, 2, 1, 1, 0, 2, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 2…
$ comorbidades_sn      <fct> Não, Sim, Sim, Sim, Não, Sim, Não, Não, Não, Sim,…
$ estatura_m           <dbl> 1.59, 1.50, 1.63, 1.70, 1.60, 1.63, 1.62, 1.64, 1…
$ peso_atual_kg        <dbl> 56.7, 48.9, 82.8, 68.8, 72.0, 39.1, 52.0, 73.5, 5…
$ peso_1m_kg           <dbl> 59.3, 49.0, 82.0, 69.6, 71.0, 37.6, 52.0, 75.0, 6…
$ peso_6m_kg           <dbl> 62, 57, 83, 68, 71, 57, 58, 90, 65, 60, 64, 64, 7…
$ perda_peso_1m_pct    <dbl> 4.38, 0.20, -0.90, 1.14, -1.40, -3.90, 0.00, 2.00…
$ perda_peso_6m_pct    <dbl> 8.54, 14.20, 0.20, -1.17, -1.40, 31.40, 10.30, 18…
$ pp_grave_6m_sn       <fct> Não, Sim, Não, Não, Não, Sim, Sim, Sim, Não, Não,…
$ peso_2semanas_kg     <fct> Diminuiu, Manteve, Aumentou, Manteve, Manteve, Au…
$ ingestao_atual       <fct> Sem alteração, Alimentos sólidos em menor quantid…
$ ingestao_comparada   <fct> Sem mudança, Menos, Menos, Sem mudança, Sem mudan…
$ ingestao_problema_sn <fct> Sem sintomas, Até 3 sintomas, Até 3 sintomas, Sem…
$ doencas_associadas   <fct> Apenas 1 doença, Até 3 doenças, Sem doença, Sem d…
$ febre                <fct> Sem febre, Sem febre, Sem febre, Sem febre, Sem f…
$ codigo_extra         <int> 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4…
$ atividades           <fct> Normal; sem nenhuma limitação, Não totalm. normal…
$ deficit_gordura      <fct> Sem deficit, Leve, Sem deficit, Sem deficit, Sem …
$ estado_muscular      <fct> Leve, Sem deficit, Sem deficit, Sem deficit, Sem …
$ estado_hidratacao    <fct> Sem deficit, Sem deficit, Sem deficit, Sem defici…
$ avaliacao_global     <fct> Moderadamente desnutrido, Moderadamente desnutrid…
$ pontos_score         <int> 5, 11, 10, 0, 0, 19, 19, 21, 22, 11, 3, 20, 2, 2,…
$ desfecho_final       <fct> Alta, Alta, Alta, Alta, Alta, Óbito, Óbito, Alta,…

Análise Exploratória e Descritiva

Esta seção apresenta o perfil da coorte, comparando os pacientes que tiveram alta com aqueles que foram a óbito.

Perfil Clínico e Nutricional por Desfecho

A tabela abaixo cruza as variáveis demográficas (idade, sexo), clínicas (topografia, comorbidades) e nutricionais (pontos_score, avaliacao_global) com o desfecho.

tb %>%
    select(
        desfecho_final,
        idade,
        sexo,
        topografia,
        comorbidades,
        pontos_score,
        avaliacao_global,
        perda_peso_6m_pct,
        atividades
    ) %>%
    tbl_summary(
        by = desfecho_final, # Estratificar pela variável resposta
        statistic = list(
            all_continuous() ~ "{mean} ({sd})",
            all_categorical() ~ "{n} ({p}%)"
        ),
        label = list(
            idade ~ "Idade (anos)",
            sexo ~ "Sexo",
            topografia ~ "Topografia do Câncer",
            comorbidades ~ "Nº de Comorbidades",
            pontos_score ~ "Score PG-SGA (Pontos)",
            avaliacao_global ~ "Classificação Subjetiva Global",
            perda_peso_6m_pct ~ "Perda de Peso em 6m (%)",
            atividades ~ "Capacidade Funcional"
        ),
        missing = "no"
    ) %>%
    add_p() %>%
    add_overall() %>%
    bold_labels() %>%
    as_gt() %>%
    tab_header(title = "Comparação entre grupos (Alta vs. Óbito)")
Comparação entre grupos (Alta vs. Óbito)

Characteristic

Overall
N = 190

1

Alta
N = 129

1

Óbito
N = 61

1

p-value

2
Idade (anos) 59 (15) 58 (15) 60 (14) 0.3
Sexo


0.060
    Feminino 115 (61%) 84 (65%) 31 (51%)
    Masculino 75 (39%) 45 (35%) 30 (49%)
Topografia do Câncer


0.7
    Cabeça e pescoço 14 (7.4%) 9 (7.0%) 5 (8.2%)
    Trato gastrointestinal 37 (19%) 23 (18%) 14 (23%)
    Mama e ginecológicos 52 (27%) 38 (29%) 14 (23%)
    Urológicos 19 (10%) 11 (8.5%) 8 (13%)
    Hematológicos 44 (23%) 30 (23%) 14 (23%)
    Pulmão e outros 24 (13%) 18 (14%) 6 (9.8%)
Nº de Comorbidades


0.7
    0 110 (58%) 76 (59%) 34 (56%)
    1 50 (26%) 35 (27%) 15 (25%)
    2 29 (15%) 17 (13%) 12 (20%)
    >2 1 (0.5%) 1 (0.8%) 0 (0%)
Score PG-SGA (Pontos) 10 (9) 8 (8) 16 (8) <0.001
Classificação Subjetiva Global


<0.001
    Bem nutrido 79 (42%) 69 (53%) 10 (17%)
    Moderadamente desnutrido 77 (41%) 46 (36%) 31 (52%)
    Gravemente desnutrido 33 (17%) 14 (11%) 19 (32%)
Perda de Peso em 6m (%) 6 (11) 3 (9) 11 (14) <0.001
Capacidade Funcional


<0.001
    Normal; sem nenhuma limitação 54 (28%) 49 (38%) 5 (8.2%)
    Não totalm. normal; mas capaz 67 (35%) 50 (39%) 17 (28%)
    Capaz de fazer pouca atividade; 21 (11%) 9 (7.0%) 12 (20%)
    Não me sinto bem para a maioria 48 (25%) 21 (16%) 27 (44%)
    Bastante tempo acamado; 0 (0%) 0 (0%) 0 (0%)
1

Mean (SD); n (%)

2

Wilcoxon rank sum test; Pearson’s Chi-squared test; Fisher’s exact test

Associações entre variáveis

Nesta seção, investigamos as relações bivariadas entre as características dos pacientes e o desfecho final. Utilizamos testes estatísticos (Qui-quadrado para variáveis categóricas e testes de comparação de médias/medianas para numéricas) e visualizações gráficas para identificar padrões preliminares.

# 1. Sexo --------------------------------------------------------------
# O sexo biológico pode influenciar a composição corporal e o risco
# basal.

# Distribuição marginal e Tabela Cruzada
tb |>
    count(sexo) |>
    mutate(pct = n / sum(n) * 100,
           acum = cumsum(pct))
# A tibble: 2 × 4
  sexo          n   pct  acum
  <fct>     <int> <dbl> <dbl>
1 Feminino    115  60.5  60.5
2 Masculino    75  39.5 100  
tbx <- xtabs(~ sexo + desfecho_final, data = tb)
addmargins(tbx)
           desfecho_final
sexo        Alta Óbito Sum
  Feminino    84    31 115
  Masculino   45    30  75
  Sum        129    61 190
# Visualização e Teste
mosaicplot(
    tbx,
    main = "Sexo vs Desfecho",
    color = TRUE,
    off = c(1, 1),
    las = 1
)

chisq.test(tbx)

    Pearson's Chi-squared test with Yates' continuity correction

data:  tbx
X-squared = 2.97, df = 1, p-value = 0.08482
# 2. Idade -------------------------------------------------------------
# A idade avançada é um fator de risco natural para mortalidade.

# Medidas de resumo
tb |>
    group_by(desfecho_final) |>
    get_summary_stats(idade, type = "common")
# A tibble: 2 × 11
  desfecho_final variable     n   min   max median   iqr  mean    sd    se    ci
  <fct>          <fct>    <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Alta           idade      129    20    84     59    20  58.0  14.7  1.29  2.56
2 Óbito          idade       61    20    89     61    19  60.3  14.5  1.86  3.71
# Visualização Composta (ECDF + Boxplot com Beeswarm)
patchwork::wrap_plots(
    ncol = 1,
    tb |>
        ggplot(
            mapping = aes(x = idade,
                          color = desfecho_final,
                          fill = desfecho_final)) +
        stat_ecdf(linewidth = 1) +
        geom_rug() +
        labs(title = "Distribuição Acumulada da Idade", y = "ECDF") +
        theme(legend.position = c(0.05, 0.95),
              legend.justification = c(0, 1)),
    tb |>
        ggplot(
            mapping = aes(x = idade,
                          y = desfecho_final,
                          fill = desfecho_final)) +
        geom_boxplot(alpha = 0.5, outlier.shape = NA) +
        geom_beeswarm(side = 1L, alpha = 0.6) +
        labs(y = "Desfecho") +
        theme(legend.position = "none")
)

# 3. Topografia do Câncer ----------------------------------------------
# Diferentes tumores possuem agressividades e impactos metabólicos
# distintos.

# Visualização Mosaic GGplot
ggplot(data = tb) +
    ggmosaic::geom_mosaic(mapping = aes(x = product(topografia),
                                        fill = desfecho_final)) +
    labs(title = "Proporção de Desfechos por Topografia", x = "Topografia") +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Tabela e Teste
tbx <- xtabs(~ topografia + desfecho_final, data = tb)
addmargins(tbx)
                        desfecho_final
topografia               Alta Óbito Sum
  Cabeça e pescoço          9     5  14
  Trato gastrointestinal   23    14  37
  Mama e ginecológicos     38    14  52
  Urológicos               11     8  19
  Hematológicos            30    14  44
  Pulmão e outros          18     6  24
  Sum                     129    61 190
mosaicplot(
    tbx,
    main = "Topografia vs Desfecho",
    color = TRUE,
    off = c(5, 1),
    las = 1,
    cex.axis = 0.7 # Ajuste para caber os nomes longos
)

chisq.test(tbx)

    Pearson's Chi-squared test

data:  tbx
X-squared = 2.7113, df = 5, p-value = 0.7444
# 4. Comorbidades ------------------------------------------------------
# A carga de doenças pré-existentes impacta a sobrevida.

# Agrupamento de níveis (Simplificando >2)
tb$comorbidades <- fct_collapse(tb$comorbidades, ">=2" = c("2", ">2"))

# Tabela e Visualização
tbx <- xtabs(~ comorbidades + desfecho_final, data = tb)
print(tbx)
            desfecho_final
comorbidades Alta Óbito
         0     76    34
         1     35    15
         >=2   18    12
mosaicplot(
    tbx,
    main = "Comorbidades vs Desfecho",
    color = TRUE,
    off = c(2, 1),
    las = 1
)

chisq.test(tbx)

    Pearson's Chi-squared test

data:  tbx
X-squared = 1.0317, df = 2, p-value = 0.597
# 5. Avaliação Subjetiva Global (Categoria ASG-PPP) --------------------
# Classificação qualitativa do estado nutricional (A, B ou C).
# Fundamental para verificar se a categoria clínica está associada ao
# óbito.

# Tabela de contingência
tbx <- xtabs(~ avaliacao_global + desfecho_final, data = tb)
addmargins(tbx)
                          desfecho_final
avaliacao_global           Alta Óbito Sum
  Bem nutrido                69    10  79
  Moderadamente desnutrido   46    31  77
  Gravemente desnutrido      14    19  33
  Sum                       129    60 189
# Visualização Mosaic
mosaicplot(
    tbx,
    main = "Avaliação Global (ASG) vs Desfecho",
    color = TRUE,
    off = c(1, 1),
    las = 1,
    cex.axis = 0.8
)

# Teste de Associação
chisq.test(tbx)

    Pearson's Chi-squared test

data:  tbx
X-squared = 26.021, df = 2, p-value = 2.237e-06
# 6. Perda de Peso em 6 meses (%) --------------------------------------
# A perda de peso involuntária é um dos principais sinais de caquexia.

# Medidas de resumo numérico
tb |>
    group_by(desfecho_final) |>
    get_summary_stats(perda_peso_6m_pct, type = "common")
# A tibble: 2 × 11
  desfecho_final variable     n   min   max median   iqr  mean    sd    se    ci
  <fct>          <fct>    <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Alta           perda_p…   129 -18.2  30.2   1.68  10.4  3.29  8.80 0.775  1.53
2 Óbito          perda_p…    61 -35.4  48.7  10.3   14.4 11.3  13.7  1.75   3.50
# Visualização Composta
patchwork::wrap_plots(
    ncol = 1,
    tb |>
        ggplot(
            mapping = aes(x = perda_peso_6m_pct,
                          color = desfecho_final)) +
        stat_ecdf(linewidth = 1) +
        geom_rug() +
        labs(title = "Perda de Peso em 6 meses (%)",
             x = "% Perda", y = "Acumulado") +
        theme(legend.position = c(0.05, 0.95),
              legend.justification = c(0, 1)),
    tb |>
        ggplot(
            mapping = aes(x = perda_peso_6m_pct,
                          y = desfecho_final,
                          fill = desfecho_final)) +
        geom_boxplot(alpha = 0.5, outlier.shape = NA) +
        geom_beeswarm(side = 1L, alpha = 0.6) +
        labs(x = "% de Perda de Peso", y = "Desfecho") +
        theme(legend.position = "none")
)

# 7. Capacidade Funcional (Atividades) ---------------------------------
# O estado funcional (semelhante ao ECOG) é forte preditor clínico.

# Tabela Cruzada
tbx <-
    tb |>
    select(atividades, desfecho_final) |>
    droplevels() |>
    xtabs(~ atividades + desfecho_final, data = _)
addmargins(tbx)
                                  desfecho_final
atividades                         Alta Óbito Sum
  Normal; sem nenhuma limitação      49     5  54
  Não totalm. normal; mas capaz      50    17  67
  Capaz de fazer pouca atividade;     9    12  21
  Não me sinto bem para a maioria    21    27  48
  Sum                               129    61 190
# Simplificação dos labels para visualização (opcional, mas recomendado)
tb$atividades_relabel <- tb$atividades
levels(tb$atividades_relabel) <-
    c("Normal", "Leve Limit.", "Pouca Ativ.", "Limitado", "Acamado")

# Visualização
xtabs(~ atividades_relabel + desfecho_final, data = tb) |>
    mosaicplot(
        main = "Capacidade Funcional vs Desfecho",
        color = TRUE,
        off = c(1, 1),
        las = 1
    )

# Teste de Associação
chisq.test(tbx)

    Pearson's Chi-squared test

data:  tbx
X-squared = 33.2, df = 3, p-value = 2.923e-07
# 8. Pontos Score (Variável Numérica Principal) ------------------------
# A soma total dos pontos da PG-SGA.

# Medidas de resumo
tb |>
    group_by(desfecho_final) |>
    get_summary_stats(pontos_score, type = "common")
# A tibble: 2 × 11
  desfecho_final variable     n   min   max median   iqr  mean    sd    se    ci
  <fct>          <fct>    <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Alta           pontos_…   129     0    28      4    12  7.82  7.55 0.664  1.32
2 Óbito          pontos_…    61     1    35     18    11 16     8.08 1.03   2.07
# Visualização Composta
gridExtra::grid.arrange(
    tb |>
        ggplot(
            mapping = aes(x = pontos_score,
                          color = desfecho_final,
                          fill = desfecho_final)) +
        stat_ecdf(linewidth = 1) +
        geom_rug() +
        labs(title = "Score Numérico PG-SGA",
             y = "Probabilidade Acumulada") +
        theme(legend.position = c(0.02, 0.98),
              legend.justification = c(0, 1)),
    tb |>
        ggplot(
            mapping = aes(x = pontos_score,
                          y = desfecho_final,
                          fill = desfecho_final)) +
        geom_boxplot(alpha = 0.5) +
        geom_beeswarm(side = 1L, alpha = 0.6) +
        labs(x = "Score Total (Pontos)", y = "Desfecho") +
        theme(legend.position = "none")
)

Visualização: Score Nutricional vs. Desfecho

O boxplot abaixo permite visualizar se os pacientes que faleceram apresentavam, em média, scores nutricionais (pontos_score) mais elevados (pior estado nutricional).

ggplot(tb, aes(x = desfecho_final, y = pontos_score, fill = desfecho_final)) +
    geom_boxplot(alpha = 0.7) +
    geom_jitter(width = 0.2, alpha = 0.3, color = "black") + # Pontos individuais
    theme_minimal() +
    labs(
        title = "Relação entre Score PG-SGA e Desfecho",
        subtitle = "Quanto maior o score, pior o estado nutricional",
        y = "Score PG-SGA Total",
        x = "Desfecho Final"
    ) +
    scale_fill_manual(values = c("Alta" = "#1f77b4", "Óbito" = "#d62728")) +
    theme(legend.position = "none")

Distribuição do Score PG-SGA segundo o desfecho final.

Análise Inferencial: Regressão Logística

Investigação do impacto do score nutricional na chance de óbito, controlando para fatores de confusão.

Ajuste do Modelo

Como a variável desfecho_final é um fator com níveis “Alta” (referência) e “Óbito”, o modelo logístico calculará a probabilidade do segundo nível (“Óbito”).

# Ajuste do Modelo
modelo_logistico <- glm(
    desfecho_final ~
        idade +
        sexo +
        topografia +
        comorbidades +
        pontos_score,
    data = tb,
    family = binomial(link = "logit")
)

par(mfrow = c(2, 2))
plot(modelo_logistico)

layout(1)

car::Anova(modelo_logistico, test = "LR")
Analysis of Deviance Table (Type II tests)

Response: desfecho_final
             LR Chisq Df Pr(>Chisq)    
idade           0.163  1     0.6868    
sexo            1.716  1     0.1902    
topografia      2.302  5     0.8060    
comorbidades    0.770  2     0.6803    
pontos_score   37.888  1  7.493e-10 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# m1 <- step(m0, k = log(nrow(tb)))  # AIC penalizado -> BIC
modelo_logistico_sel <- step(modelo_logistico)
Start:  AIC=216.48
desfecho_final ~ idade + sexo + topografia + comorbidades + pontos_score

               Df Deviance    AIC
- topografia    5   196.78 208.78
- comorbidades  2   195.25 213.25
- idade         1   194.64 214.64
- sexo          1   196.19 216.19
<none>              194.48 216.48
- pontos_score  1   232.36 252.36

Step:  AIC=208.78
desfecho_final ~ idade + sexo + comorbidades + pontos_score

               Df Deviance    AIC
- comorbidades  2   197.70 205.70
- idade         1   196.95 206.95
<none>              196.78 208.78
- sexo          1   198.91 208.91
- pontos_score  1   233.64 243.64

Step:  AIC=205.7
desfecho_final ~ idade + sexo + pontos_score

               Df Deviance    AIC
- idade         1   197.70 203.70
<none>              197.70 205.70
- sexo          1   199.85 205.85
- pontos_score  1   234.21 240.21

Step:  AIC=203.7
desfecho_final ~ sexo + pontos_score

               Df Deviance    AIC
<none>              197.70 203.70
- sexo          1   199.85 203.85
- pontos_score  1   235.00 239.00
summary(modelo_logistico_sel)

Call:
glm(formula = desfecho_final ~ sexo + pontos_score, family = binomial(link = "logit"), 
    data = tb)

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept)   -2.37511    0.36295  -6.544 5.99e-11 ***
sexoMasculino  0.51594    0.35195   1.466    0.143    
pontos_score   0.11968    0.02152   5.562 2.66e-08 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 238.51  on 189  degrees of freedom
Residual deviance: 197.70  on 187  degrees of freedom
AIC: 203.7

Number of Fisher Scoring iterations: 4
anova(modelo_logistico, modelo_logistico_sel, test = "Chisq")
Analysis of Deviance Table

Model 1: desfecho_final ~ idade + sexo + topografia + comorbidades + pontos_score
Model 2: desfecho_final ~ sexo + pontos_score
  Resid. Df Resid. Dev Df Deviance Pr(>Chi)
1       179     194.48                     
2       187     197.70 -8  -3.2252   0.9194
car::Anova(modelo_logistico_sel, test = "LR")
Analysis of Deviance Table (Type II tests)

Response: desfecho_final
             LR Chisq Df Pr(>Chisq)    
sexo             2.15  1     0.1426    
pontos_score    37.30  1  1.013e-09 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Tabela formatada com log Odds Ratios
tbl_regression(modelo_logistico, exponentiate = FALSE) %>%
    bold_p() %>%
    add_global_p() %>% # Teste global para variáveis categóricas (topografia)
    as_gt() %>%
    tab_header(
        title = "Fatores Associados ao Óbito (Regressão Logística)",
        subtitle = "log(Odds Ratio) > 0 indica aumento de risco para óbito"
    )
Fatores Associados ao Óbito (Regressão Logística)
log(Odds Ratio) > 0 indica aumento de risco para óbito

Characteristic

log(OR)

1

95% CI

1

p-value

idade -0.01 -0.03, 0.02 0.7
sexo

0.2
    Feminino
    Masculino 0.58 -0.29, 1.5
topografia

0.8
    Cabeça e pescoço
    Trato gastrointestinal -0.70 -2.2, 0.86
    Mama e ginecológicos -0.34 -1.8, 1.3
    Urológicos -0.33 -2.1, 1.4
    Hematológicos -0.94 -2.5, 0.61
    Pulmão e outros -0.60 -2.2, 1.1
comorbidades

0.7
    0
    1 0.10 -0.80, 0.98
    >=2 0.49 -0.63, 1.6
pontos_score 0.13 0.09, 0.18 <0.001
1

OR = Odds Ratio, CI = Confidence Interval

tbl_regression(modelo_logistico_sel, exponentiate = FALSE) %>%
    bold_p() %>%
    add_global_p() %>% # Teste global para variáveis categóricas (topografia)
    as_gt() %>%
    tab_header(
        title = "Fatores Associados ao Óbito (Regressão Logística) após seleção de variáveis usando o procedimento stepwise com critério de minimização do valor de AIC.",
        subtitle = "log(Odds Ratio) > 0 indica aumento de risco para óbito"
    )
Fatores Associados ao Óbito (Regressão Logística) após seleção de variáveis usando o procedimento stepwise com critério de minimização do valor de AIC.
log(Odds Ratio) > 0 indica aumento de risco para óbito

Characteristic

log(OR)

1

95% CI

1

p-value

sexo

0.14
    Feminino
    Masculino 0.52 -0.17, 1.2
pontos_score 0.12 0.08, 0.16 <0.001
1

OR = Odds Ratio, CI = Confidence Interval

Efeitos Marginais: Score Nutricional

O gráfico ilustra como a probabilidade predita de óbito aumenta conforme o score PG-SGA piora, mantendo as outras variáveis constantes.

# Predição marginal para o score
efeitos <- ggpredict(modelo_logistico_sel,
                     terms = "pontos_score [all]")

plot(efeitos) +
    labs(
        title = "Probabilidade Predita de Óbito pelo Score Nutricional",
        subtitle = "Efeito médio marginal de sexo",
        x = "Score PG-SGA (Pontos)",
        y = "Probabilidade de Óbito"
    ) +
    theme_gray()

efeitos <- ggpredict(modelo_logistico_sel,
                     terms = c("pontos_score", "sexo"))

plot(efeitos) +
    labs(
        title = "Probabilidade Predita de Óbito pelo Score Nutricional",
        subtitle = "Efeito dentro de cada nível de sexo",
        x = "Score PG-SGA (Pontos)",
        y = "Probabilidade de Óbito",
        color = "Sexo"
    ) +
    theme_gray()

Investigação de Interação: Topografia vs. Score

Verificamos se o efeito do pontos_score no desfecho varia dependendo da topografia do câncer.

# Modelo com termo de interação
modelo_interacao <- glm(
      desfecho_final ~
        idade +
        sexo +
        comorbidades +
        topografia * pontos_score,
  data = tb,
  family = binomial(link = "logit")
)

car::Anova(modelo_interacao, test = "LR")
Analysis of Deviance Table (Type II tests)

Response: desfecho_final
                        LR Chisq Df Pr(>Chisq)    
idade                      0.171  1     0.6797    
sexo                       0.814  1     0.3669    
comorbidades               1.519  2     0.4678    
topografia                 2.302  5     0.8060    
pontos_score              37.888  1  7.493e-10 ***
topografia:pontos_score    7.176  5     0.2079    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Comparação estatística (ANOVA) entre o modelo simples e o com interação.
anova(modelo_logistico, modelo_interacao, test = "Chisq")
Analysis of Deviance Table

Model 1: desfecho_final ~ idade + sexo + topografia + comorbidades + pontos_score
Model 2: desfecho_final ~ idade + sexo + comorbidades + topografia * pontos_score
  Resid. Df Resid. Dev Df Deviance Pr(>Chi)
1       179     194.48                     
2       174     187.30  5   7.1758   0.2079

Interpretação da Interação: Se o valor de Pr(>Chi) na tabela acima for menor que 0.05, existe evidência de interação significativa. Isso significaria que a gravidade da desnutrição afeta o risco de óbito de maneira diferente para diferentes tipos de câncer. Caso contrário (p > 0.05), o efeito da desnutrição é considerado homogêneo entre as topografias.

Análise Detalhada das Dimensões do Score (Modelo Ajustado)

Nesta seção, investigamos o impacto individual de cada componente do score PG-SGA no desfecho. Para cada variável de interesse, ajustamos um modelo de regressão logística controlando para os fatores de confusão estabelecidos (idade, sexo, topografia e comorbidades).

Abaixo, definimos a estrutura de programação funcional para automatizar essa investigação.

  1. Dimensão - Peso (Perda de Massa): perda_peso_1m_pct, perda_peso_6m_pct, peso_2semanas_kg.
  2. Dimensão - Ingestão Alimentar: ingestao_atual, ingestao_comparada.
  3. Dimensão - Sintomas de Impacto Nutricional: ingestao_problema_sn, doencas_associadas.
  4. Dimensão - Capacidade Funcional: atividades.
  5. Dimensão - Doença e Demanda Metabólica: febre.
  6. Dimensão - Gordura e Músculo (Reservas): deficit_gordura e estado_muscular.
# Lista nomeada contendo os vetores de variáveis de interesse.
dimensoes_vars <- list(
    "1. Perda de Massa" = c("perda_peso_1m_pct", "perda_peso_6m_pct", "peso_2semanas_kg"),
    "2. Ingestão Alimentar" = c("ingestao_atual", "ingestao_comparada"),
    "3. Sintomas Nutricionais" = c("ingestao_problema_sn", "doencas_associadas"),
    "4. Capacidade Funcional" = c("atividades"),
    "5. Doença e Metabolismo" = c("febre"),
    "6. Gordura e Músculo" = c("deficit_gordura", "estado_muscular")
)

# 2. Definição das Covariáveis de Ajuste (Base do Modelo).
covariaveis_base <- c("idade", "sexo", "topografia", "comorbidades")

# 3. Função para Ajustar o Modelo
# Esta função recebe a variável X, constrói a fórmula e roda o GLM.
ajustar_modelo_dimensao <- function(var_interesse, dados) {
    # Lógica para evitar duplicação na fórmula.
    preditores <- unique(c(covariaveis_base, var_interesse))

    # Construção da fórmula:
    #   desfecho_final ~ covariaveis + var_interesse.
    formula_string <-
        paste("desfecho_final ~", paste(preditores, collapse = " + "))
    formula_obj <- as.formula(formula_string)

    # Ajuste do Modelo Logístico.
    modelo <- glm(formula_obj,
                  data = dados,
                  family = binomial(link = "logit"))
    return(modelo)
}

Perda de Massa

v <- dimensoes_vars[[1]]
m0 <- ajustar_modelo_dimensao(v, tb)
car::Anova(m0, test = "LR")
Analysis of Deviance Table (Type II tests)

Response: desfecho_final
                  LR Chisq Df Pr(>Chisq)   
idade               0.1074  1   0.743092   
sexo                0.5690  1   0.450660   
topografia          0.6161  5   0.987254   
comorbidades        0.9707  2   0.615476   
perda_peso_1m_pct   0.8942  1   0.344335   
perda_peso_6m_pct  10.7662  1   0.001034 **
peso_2semanas_kg    3.2350  2   0.198393   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(m0)

Call:
glm(formula = formula_obj, family = binomial(link = "logit"), 
    data = dados)

Coefficients:
                                  Estimate Std. Error z value Pr(>|z|)   
(Intercept)                      -2.345617   1.104647  -2.123  0.03372 * 
idade                             0.004569   0.013964   0.327  0.74354   
sexoMasculino                     0.326479   0.433432   0.753  0.45130   
topografiaTrato gastrointestinal  0.302147   0.789074   0.383  0.70178   
topografiaMama e ginecológicos    0.216538   0.798577   0.271  0.78627   
topografiaUrológicos              0.510830   0.898466   0.569  0.56966   
topografiaHematológicos           0.141044   0.778690   0.181  0.85627   
topografiaPulmão e outros         0.036921   0.898327   0.041  0.96722   
comorbidades1                    -0.131441   0.433197  -0.303  0.76157   
comorbidades>=2                   0.409511   0.549423   0.745  0.45606   
perda_peso_1m_pct                 0.035090   0.037698   0.931  0.35196   
perda_peso_6m_pct                 0.065162   0.020843   3.126  0.00177 **
peso_2semanas_kgDiminuiu          0.320998   0.535607   0.599  0.54896   
peso_2semanas_kgAumentou          0.951561   0.550932   1.727  0.08413 . 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 238.51  on 189  degrees of freedom
Residual deviance: 209.59  on 176  degrees of freedom
AIC: 237.59

Number of Fisher Scoring iterations: 4
tbl_reg <-
    map(v, function(var) {
        tbl_regression(m0,
                       exponentiate = FALSE,
                       include = all_of(var),
                       intercept = FALSE
                       ) |>
            bold_p()
    })
tbl_merge(
    tbls = tbl_reg,
    tab_spanner = v
) |>
    as_gt()

Characteristic

perda_peso_1m_pct

perda_peso_6m_pct

peso_2semanas_kg

log(OR)

1

95% CI

1

p-value

log(OR)

1

95% CI

1

p-value

log(OR)

1

95% CI

1

p-value

perda_peso_1m_pct 0.04 -0.04, 0.11 0.4





perda_peso_6m_pct


0.07 0.03, 0.11 0.002


peso_2semanas_kg








    Manteve






    Diminuiu





0.32 -0.71, 1.4 0.5
    Aumentou





0.95 -0.10, 2.1 0.084
1

OR = Odds Ratio, CI = Confidence Interval

Ingestão Alimentar

v <- dimensoes_vars[[2]]
m0 <- ajustar_modelo_dimensao(v, tb)
car::Anova(m0, test = "LR")
Analysis of Deviance Table (Type II tests)

Response: desfecho_final
                   LR Chisq Df Pr(>Chisq)   
idade                0.3386  1   0.560625   
sexo                 0.2142  1   0.643483   
topografia           1.7473  5   0.882890   
comorbidades         2.1832  2   0.335684   
ingestao_atual      15.7357  5   0.007641 **
ingestao_comparada   4.1671  2   0.124490   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(m0)

Call:
glm(formula = formula_obj, family = binomial(link = "logit"), 
    data = dados)

Coefficients:
                                                     Estimate Std. Error
(Intercept)                                          0.300406   1.158137
idade                                               -0.008766   0.015073
sexoMasculino                                        0.210801   0.455633
topografiaTrato gastrointestinal                    -0.119696   0.808313
topografiaMama e ginecológicos                       0.061915   0.831753
topografiaUrológicos                                 0.226021   0.908445
topografiaHematológicos                             -0.501880   0.794993
topografiaPulmão e outros                           -0.276963   0.897001
comorbidades1                                       -0.134894   0.479628
comorbidades>=2                                      0.684875   0.564355
ingestao_atualAlimentos sólidos em pouca quantidade -0.096485   0.482681
ingestao_atualMuito pouco de qualquer comida         0.733219   0.670903
ingestao_atualApenas liquidos                        0.114658   1.085071
ingestao_atualApenas alimentos pela sonda ou veia    1.725632   1.250414
ingestao_atualSem alteração                         -2.999130   1.353117
ingestao_comparadaMais                               3.121038   1.712442
ingestao_comparadaSem mudança                        0.851750   1.291817
                                                    z value Pr(>|z|)  
(Intercept)                                           0.259   0.7953  
idade                                                -0.582   0.5609  
sexoMasculino                                         0.463   0.6436  
topografiaTrato gastrointestinal                     -0.148   0.8823  
topografiaMama e ginecológicos                        0.074   0.9407  
topografiaUrológicos                                  0.249   0.8035  
topografiaHematológicos                              -0.631   0.5278  
topografiaPulmão e outros                            -0.309   0.7575  
comorbidades1                                        -0.281   0.7785  
comorbidades>=2                                       1.214   0.2249  
ingestao_atualAlimentos sólidos em pouca quantidade  -0.200   0.8416  
ingestao_atualMuito pouco de qualquer comida          1.093   0.2744  
ingestao_atualApenas liquidos                         0.106   0.9158  
ingestao_atualApenas alimentos pela sonda ou veia     1.380   0.1676  
ingestao_atualSem alteração                          -2.216   0.0267 *
ingestao_comparadaMais                                1.823   0.0684 .
ingestao_comparadaSem mudança                         0.659   0.5097  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 236.23  on 188  degrees of freedom
Residual deviance: 189.07  on 172  degrees of freedom
  (1 observation deleted due to missingness)
AIC: 223.07

Number of Fisher Scoring iterations: 5
tbl_reg <-
    map(v, function(var) {
        tbl_regression(m0,
                       exponentiate = FALSE,
                       include = all_of(var),
                       intercept = FALSE
                       ) |>
            bold_p()
    })
tbl_merge(
    tbls = tbl_reg,
    tab_spanner = v
) |>
    as_gt()

Characteristic

ingestao_atual

ingestao_comparada

log(OR)

1

95% CI

1

p-value

log(OR)

1

95% CI

1

p-value

ingestao_atual





    Alimentos sólidos em menor quantidade



    Alimentos sólidos em pouca quantidade -0.10 -1.1, 0.85 0.8


    Muito pouco de qualquer comida 0.73 -0.56, 2.1 0.3


    Apenas liquidos 0.11 -2.1, 2.4 >0.9


    Apenas alimentos pela sonda ou veia 1.7 -0.53, 4.8 0.2


    Sem alteração -3.0 -6.2, -0.40 0.027


ingestao_comparada





    Menos



    Mais


3.1 -0.20, 6.9 0.068
    Sem mudança


0.85 -1.6, 4.0 0.5
1

OR = Odds Ratio, CI = Confidence Interval

Sintomas de Impacto Nutricional

tb <-
    tb |>
    mutate(doencas_associadas =
               fct_collapse(doencas_associadas,
                            "Até 1 doença" = c("Sem doença", "Apenas 1 doença"),
                            "2 ou mais doenças" = c("Até 3 doenças", "Mais que doenças")))
v <- dimensoes_vars[[3]]

# Combinar 2 níveis de doencas_associadas em 1.

m0 <- ajustar_modelo_dimensao(v, tb)
car::Anova(m0, test = "LR")
Analysis of Deviance Table (Type II tests)

Response: desfecho_final
                     LR Chisq Df Pr(>Chisq)    
idade                   0.715  1     0.3978    
sexo                    2.007  1     0.1565    
topografia              2.062  5     0.8405    
comorbidades            0.072  2     0.9644    
ingestao_problema_sn   34.821  2  2.746e-08 ***
doencas_associadas      1.048  1     0.3060    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(m0)

Call:
glm(formula = formula_obj, family = binomial(link = "logit"), 
    data = dados)

Coefficients:
                                        Estimate Std. Error z value Pr(>|z|)
(Intercept)                             -1.10624    1.11371  -0.993  0.32057
idade                                   -0.01503    0.01782  -0.844  0.39883
sexoMasculino                            0.61916    0.44071   1.405  0.16005
topografiaTrato gastrointestinal        -0.69936    0.78772  -0.888  0.37464
topografiaMama e ginecológicos          -0.21740    0.76974  -0.282  0.77761
topografiaUrológicos                    -0.33193    0.87118  -0.381  0.70319
topografiaHematológicos                 -0.79534    0.77365  -1.028  0.30393
topografiaPulmão e outros               -0.67385    0.82675  -0.815  0.41504
comorbidades1                            0.02956    0.45834   0.064  0.94857
comorbidades>=2                          0.14688    0.55434   0.265  0.79104
ingestao_problema_snAté 3 sintomas       1.46669    0.46161   3.177  0.00149
ingestao_problema_snMais que 3 sintomas  2.59319    0.48552   5.341 9.24e-08
doencas_associadas2 ou mais doenças      0.51091    0.50066   1.020  0.30751
                                           
(Intercept)                                
idade                                      
sexoMasculino                              
topografiaTrato gastrointestinal           
topografiaMama e ginecológicos             
topografiaUrológicos                       
topografiaHematológicos                    
topografiaPulmão e outros                  
comorbidades1                              
comorbidades>=2                            
ingestao_problema_snAté 3 sintomas      ** 
ingestao_problema_snMais que 3 sintomas ***
doencas_associadas2 ou mais doenças        
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 238.51  on 189  degrees of freedom
Residual deviance: 196.82  on 177  degrees of freedom
AIC: 222.82

Number of Fisher Scoring iterations: 4
tbl_reg <-
    map(v, function(var) {
        tbl_regression(m0,
                       exponentiate = FALSE,
                       include = all_of(var),
                       intercept = FALSE
                       ) |>
            bold_p()
    })
tbl_merge(
    tbls = tbl_reg,
    tab_spanner = v
) |>
    as_gt()

Characteristic

ingestao_problema_sn

doencas_associadas

log(OR)

1

95% CI

1

p-value

log(OR)

1

95% CI

1

p-value

ingestao_problema_sn





    Sem sintomas



    Até 3 sintomas 1.5 0.58, 2.4 0.001


    Mais que 3 sintomas 2.6 1.7, 3.6 <0.001


doencas_associadas





    Até 1 doença



    2 ou mais doenças


0.51 -0.47, 1.5 0.3
1

OR = Odds Ratio, CI = Confidence Interval

Capacidade Funcional

v <- dimensoes_vars[[4]]
m0 <- ajustar_modelo_dimensao(v, tb)
car::Anova(m0, test = "LR")
Analysis of Deviance Table (Type II tests)

Response: desfecho_final
             LR Chisq Df Pr(>Chisq)    
idade           0.019  1     0.8890    
sexo            1.828  1     0.1763    
topografia      3.337  5     0.6482    
comorbidades    1.725  2     0.4221    
atividades     37.154  3  4.268e-08 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(m0)

Call:
glm(formula = formula_obj, family = binomial(link = "logit"), 
    data = dados)

Coefficients:
                                            Estimate Std. Error z value
(Intercept)                                -2.128058   1.070569  -1.988
idade                                      -0.001987   0.014234  -0.140
sexoMasculino                               0.597546   0.445351   1.342
topografiaTrato gastrointestinal           -0.235186   0.797552  -0.295
topografiaMama e ginecológicos             -0.541103   0.808180  -0.670
topografiaUrológicos                       -0.155945   0.913807  -0.171
topografiaHematológicos                    -0.853140   0.789662  -1.080
topografiaPulmão e outros                  -1.067313   0.872725  -1.223
comorbidades1                              -0.255832   0.466043  -0.549
comorbidades>=2                             0.482375   0.564735   0.854
atividadesNão totalm. normal; mas capaz     1.504078   0.586322   2.565
atividadesCapaz de fazer pouca atividade;   2.959935   0.700161   4.228
atividadesNão me sinto bem para a maioria   2.780627   0.593752   4.683
                                           Pr(>|z|)    
(Intercept)                                  0.0468 *  
idade                                        0.8890    
sexoMasculino                                0.1797    
topografiaTrato gastrointestinal             0.7681    
topografiaMama e ginecológicos               0.5032    
topografiaUrológicos                         0.8645    
topografiaHematológicos                      0.2800    
topografiaPulmão e outros                    0.2213    
comorbidades1                                0.5830    
comorbidades>=2                              0.3930    
atividadesNão totalm. normal; mas capaz      0.0103 *  
atividadesCapaz de fazer pouca atividade;  2.36e-05 ***
atividadesNão me sinto bem para a maioria  2.83e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 238.51  on 189  degrees of freedom
Residual deviance: 195.21  on 177  degrees of freedom
AIC: 221.21

Number of Fisher Scoring iterations: 5
tbl_reg <-
    map(v, function(var) {
        tbl_regression(m0,
                       exponentiate = FALSE,
                       include = all_of(var),
                       intercept = FALSE
                       ) |>
            bold_p()
    })
tbl_merge(
    tbls = tbl_reg,
    tab_spanner = v
) |>
    as_gt()

Characteristic

atividades

log(OR)

1

95% CI

1

p-value

atividades


    Normal; sem nenhuma limitação
    Não totalm. normal; mas capaz 1.5 0.42, 2.8 0.010
    Capaz de fazer pouca atividade; 3.0 1.7, 4.4 <0.001
    Não me sinto bem para a maioria 2.8 1.7, 4.1 <0.001
1

OR = Odds Ratio, CI = Confidence Interval

Doença e Demanda Metabólica

v <- dimensoes_vars[[5]]
m0 <- ajustar_modelo_dimensao(v, tb)
car::Anova(m0, test = "LR")
Analysis of Deviance Table (Type II tests)

Response: desfecho_final
             LR Chisq Df Pr(>Chisq)
idade          0.3132  1     0.5757
sexo           2.4967  1     0.1141
topografia     1.2713  5     0.9379
comorbidades   0.6004  2     0.7407
febre          4.4664  2     0.1072
summary(m0)

Call:
glm(formula = formula_obj, family = binomial(link = "logit"), 
    data = dados)

Coefficients:
                                   Estimate Std. Error z value Pr(>|z|)
(Intercept)                       1.527e+01  1.455e+03   0.010    0.992
idade                             7.347e-03  1.318e-02   0.558    0.577
sexoMasculino                     6.235e-01  3.980e-01   1.567    0.117
topografiaTrato gastrointestinal  6.489e-03  6.740e-01   0.010    0.992
topografiaMama e ginecológicos   -1.709e-01  6.788e-01  -0.252    0.801
topografiaUrológicos             -3.197e-01  7.962e-01  -0.402    0.688
topografiaHematológicos          -2.116e-01  6.624e-01  -0.319    0.749
topografiaPulmão e outros        -6.032e-01  7.466e-01  -0.808    0.419
comorbidades1                    -1.098e-01  4.136e-01  -0.265    0.791
comorbidades>=2                   2.797e-01  5.010e-01   0.558    0.577
febre<72hrs                      -4.233e-01  2.058e+03   0.000    1.000
febreSem febre                   -1.657e+01  1.455e+03  -0.011    0.991

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 238.51  on 189  degrees of freedom
Residual deviance: 227.90  on 178  degrees of freedom
AIC: 251.9

Number of Fisher Scoring iterations: 14
tbl_reg <-
    map(v, function(var) {
        tbl_regression(m0,
                       exponentiate = FALSE,
                       include = all_of(var),
                       intercept = FALSE
                       ) |>
            bold_p()
    })
tbl_merge(
    tbls = tbl_reg,
    tab_spanner = v
) |>
    as_gt()

Characteristic

febre

log(OR)

1

95% CI

1

p-value

febre


    >72hrs
    <72hrs -0.42 -28, 28 >0.9
    Sem febre -17
>0.9
1

OR = Odds Ratio, CI = Confidence Interval

Gordura e Músculo

v <- dimensoes_vars[[6]]
m0 <- ajustar_modelo_dimensao(v, tb)
car::Anova(m0, test = "LR")
Analysis of Deviance Table (Type II tests)

Response: desfecho_final
                LR Chisq Df Pr(>Chisq)  
idade             0.0888  1    0.76566  
sexo              1.3000  1    0.25422  
topografia        2.1035  5    0.83464  
comorbidades      1.7650  2    0.41375  
deficit_gordura   4.8932  3    0.17979  
estado_muscular   7.2221  3    0.06514 .
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(m0)

Call:
glm(formula = formula_obj, family = binomial(link = "logit"), 
    data = dados)

Coefficients:
                                  Estimate Std. Error z value Pr(>|z|)  
(Intercept)                      -0.131954   1.223732  -0.108   0.9141  
idade                            -0.004488   0.015067  -0.298   0.7658  
sexoMasculino                     0.528683   0.466447   1.133   0.2570  
topografiaTrato gastrointestinal -0.137606   0.813966  -0.169   0.8658  
topografiaMama e ginecológicos    0.035531   0.827895   0.043   0.9658  
topografiaUrológicos             -0.092229   0.923247  -0.100   0.9204  
topografiaHematológicos          -0.641799   0.815247  -0.787   0.4311  
topografiaPulmão e outros        -0.516459   0.891302  -0.579   0.5623  
comorbidades1                    -0.134668   0.473795  -0.284   0.7762  
comorbidades>=2                   0.626331   0.592140   1.058   0.2902  
deficit_gorduraModerado          -0.520792   0.659247  -0.790   0.4295  
deficit_gorduraGrave              1.247294   1.090461   1.144   0.2527  
deficit_gorduraSem deficit       -0.400581   0.593046  -0.675   0.4994  
estado_muscularModerado           0.317619   0.641388   0.495   0.6205  
estado_muscularGrave              0.493809   1.046764   0.472   0.6371  
estado_muscularSem deficit       -1.484971   0.618796  -2.400   0.0164 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 238.51  on 189  degrees of freedom
Residual deviance: 190.44  on 174  degrees of freedom
AIC: 222.44

Number of Fisher Scoring iterations: 4
tbl_reg <-
    map(v, function(var) {
        tbl_regression(m0,
                       exponentiate = FALSE,
                       include = all_of(var),
                       intercept = FALSE
                       ) |>
            bold_p()
    })
tbl_merge(
    tbls = tbl_reg,
    tab_spanner = v
) |>
    as_gt()

Characteristic

deficit_gordura

estado_muscular

log(OR)

1

95% CI

1

p-value

log(OR)

1

95% CI

1

p-value

deficit_gordura





    Leve



    Moderado -0.52 -1.8, 0.77 0.4


    Grave 1.2 -0.82, 3.5 0.3


    Sem deficit -0.40 -1.6, 0.76 0.5


estado_muscular





    Leve



    Moderado


0.32 -0.95, 1.6 0.6
    Grave


0.49 -1.6, 2.5 0.6
    Sem deficit


-1.5 -2.7, -0.28 0.016
1

OR = Odds Ratio, CI = Confidence Interval

Conclusão

Este relatório apresenta evidências sobre a associação entre o score PG-SGA e a mortalidade. A primeira tabela fornece o panorama bruto (análise exploratória), enquanto as demais (saídas de modelo) isolam o efeito do score nutricional ajustando para idade, sexo e tipo de câncer, comorbidades. A análise visual dos efeitos marginais auxilia na interpretação clínica do impacto do estado nutricional na sobrevida dos pacientes. Das variáveis consideradas, a probabilidade de sobreviência teve efeito significativo apenas com o score PG-SGA.