# 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)Relatório de Análise Nutricional em Oncologia
Associação entre Score PG-SGA e Desfecho Clínico
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 |
Alta |
Óbito |
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")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.
- Dimensão - Peso (Perda de Massa):
perda_peso_1m_pct,perda_peso_6m_pct,peso_2semanas_kg. - Dimensão - Ingestão Alimentar:
ingestao_atual,ingestao_comparada. - Dimensão - Sintomas de Impacto Nutricional:
ingestao_problema_sn,doencas_associadas. - Dimensão - Capacidade Funcional:
atividades. - Dimensão - Doença e Demanda Metabólica:
febre. - Dimensão - Gordura e Músculo (Reservas):
deficit_gorduraeestado_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.