Artigo escrito com a colaboração de Lara Reis.

O pacote gtsummary apresenta tabelas analíticas e de resumo, prontas para a publicação.

O nome gtsummary surgiu em razão da intenção dos criadores de aproveitar todos os recursos do pacote gt. E a motivação por trás da criação do pacote veio do contato que os desenvolvedores tinham com o trabalho em bioestatistica. Todos os dias eles resumiam conjuntos de dados e modelos de regressão em R, que eventualmente eram incluídos em publicações.

Eles tinham seus próprios scripts para criação de tabelas específicas, mas, mesmo assim, muitas vezes precisavam modificar a formatação em um editor de documentos posteriormente, o que não levava a resultados reproduzíveis.

Instalação do pacote gtsummary

install.packages("gtsummary")
library(gtsummary)

Dados

AVC %>% DT::datatable()

Show 10 entries

IDIdadeSexoAlturaPesoIMCClassificação.IMCDoença.crônicaTempo.de.diagnósticoDiagnóstico.FuncionalPIMáxPEMáxMIFClassificação.MIFEAT.10DisfagiaDASI
1170Feminino1406021.42Baixo PesoHipertensão Arterial Sistêmica e Diabetes Mellitus6Hemiparesia à esquerda5080125Independência completa004.64
2263Masculino1638024.53Adequado ou EutróficoHipertensão Arterial Sistêmica7Hemiparesia à direita60160125Independência completa415.07
3363Masculino1657221.81Baixo PesoHipertensão Arterial Sistêmica12Hemiparesia à esquerda50100119Independência completa005.07
4464Feminino1496120.46Baixo PesoHipertensão Arterial Sistêmica48Hemiparesia à direita5070126Independência completa005.07
5570Feminino1555818.7Baixo PesoHipertensão Arterial Sistêmica6Hemiparesia à direita5050115Independência completa004.64
6668Masculino1637823.92Adequado ou EutróficoHipertensão Arterial Sistêmica6Hemiparesia à esquerda80110123Independência completa003.3
7767Feminino16078.324.4Adequado ou EutróficoHipertensão Arterial Sistêmica132Hemiparesia à esquerda6070124Independência completa005.5
8873Masculino15568.522.8Adequado ou EutróficoNão8Hemiparesia à esquerda4050123Independência completa003.3
9971Masculino16510732.42SobrepesoNão6Hemiparesia à esquerda60100126Independência completa004.64
101060Feminino1606018.75Baixo PesoHipertensão Arterial Sistêmica12Hemiparesia à esquerda8070126Independência completa004.64

Showing 1 to 10 of 61 entries

Funções do gtsummary

O pacote apresenta as seguintes funções principais:

  • tbl_summary( ): calcula estatísticas descritivas e apresenta os resultados em tabelas resumo;
  • tbl_cross( ): compara duas variáveis categóricas;
  • tbl_uvregression( ): realiza uma regressão univariada e retorna uma tabela formatada com as principais estatísticas do modelo;
  • tbl_regression( ): através de um objeto de um modelo de regressão multivariada retorna uma tabela formatada com as principais estatísticas do modelo;
  • inline_text( ): possibilita a criação de relatórios reproduzíveis, relatando os resultados das tabelas no texto de um relatório de Markdown.

tbl_summary()

Uso básico

Por padrão:

  • Os tipos de variáveis são identificadas e as estatísticas apropriadas são calculadas.
  • Os atributos de cada variável do conjunto de dados são impressos automaticamente.
  • Os níveis de variáveis são recuados e notas de rodapé são adicionadas.
AVC %>% tbl_summary()
CharacteristicN = 611
ID31 (16, 46)
Idade68 (63, 73)
Sexo
Feminino25 (41%)
Masculino36 (59%)
Altura160 (155, 165)
Peso69 (64, 78)
IMC24.7 (21.8, 26.9)
Classificação.IMC
Adequado ou Eutrófico30 (49%)
Baixo Peso16 (26%)
Sobrepeso15 (25%)
Doença.crônica
Hipertensão Arterial Sistêmica37 (61%)
Hipertensão Arterial Sistêmica e Diabetes Mellitus15 (25%)
Hipertensão Arterial Sistêmica e Insuficiência Renal1 (1.6%)
Não8 (13%)
Tempo.de.diagnóstico15 (9, 36)
Diagnóstico.Funcional
Hemiparesia à direita25 (41%)
Hemiparesia à esquerda36 (59%)
PIMáx60 (45, 70)
PEMáx70 (50, 80)
MIF118 (95, 125)
Classificação.MIF
Dependência modificada até 25%13 (21%)
Dependência modificada até 50%6 (9.8%)
Independência completa42 (69%)
EAT.100 (0, 3)
Disfagia16 (26%)
DASI4.47 (3.30, 4.98)
Unknown31
1 Statistics presented: Median (IQR); n (%)

É possível personalizar a saída para ter tabelas mais interessantes

  • Funções do gtsummary para modificar a aparência da tabela
ArgumentoDescrição
labelespecificar as etiquetas das variáveis impressas na tabela
typeespecifique o tipo de variável (por exemplo, contínua, categórica, etc.)
byuma variável na qual as estatisticas resumo serão calculadas separadamente para cada nível
statisticalterar as estatísticas de resumo apresentadas
digitsnúmero de dígitos que as estatísticas de resumo serão arredondadas
missingse deve exibir uma linha com o número de observações ausentes
percentimprimir porcentagem de coluna, linha ou célula
  • Funções do gtsummary para adicionar informação à tabela
FunçãoDescrição
add_p()adicione valores p à saída comparando valores entre grupos
add_overall()adicione uma coluna com estatísticas gerais de resumo
add_n()adicione uma coluna com N (ou N faltando) para cada variável
add_stat_label()adicionar etiqueta para as estatísticas de resumo mostradas em cada linha
  • Funções para formatar a tabela
FunçãoDescrição
modify_header()atualizar cabeçalhos de coluna
modify_footnote()atualizar cabeçalhos abrangentes
bold_labels()rótulos de variáveis em negrito
bold_levels()níveis variáveis em negrito
italicize_labels()itálico rótulos de variáveis
italicize_levels()itálico níveis variáveis
bold_p()valores p significativos em negrito

Uso personalizado

  • Análise descritiva para variáveis numéricas
t1 <-
  AVC %>%
  select(Idade, Altura, IMC, Peso,PIMáx, PEMáx, MIF, DASI ) %>%   
  tbl_summary(statistic = all_continuous() ~ "{mean}", missing = "no",
              digits = list(all_continuous()~ 2)) %>%
  modify_header(stat_0 ~ "**Média**") %>% add_n() 

t2 <-
  AVC %>%
  select(Idade, Altura, IMC, Peso,PIMáx, PEMáx, MIF, DASI ) %>%
  tbl_summary(statistic = all_continuous() ~ "{sd}", missing = "no",
              digits = list(all_continuous()~ 2)) %>%
  modify_header(stat_0 ~ "**S.D.**") 
t3 <-
  AVC %>%
  select(Idade, Altura, IMC, Peso,PIMáx, PEMáx, MIF, DASI ) %>%
  tbl_summary(statistic = all_continuous() ~ "{min}", missing = "no",
              digits = list(all_continuous()~ 2)) %>%
  modify_header(stat_0 ~ "**Mín**") 
t4 <-
  AVC %>%
  select(Idade, Altura, IMC, Peso,PIMáx, PEMáx, MIF, DASI ) %>%
  tbl_summary(statistic = all_continuous() ~ "{p25}", missing = "no",
              digits = list(all_continuous()~ 2)) %>%
  modify_header(stat_0 ~ "**1ºQ**") 

t5 <-
  AVC %>%
  select(Idade, Altura, IMC, Peso,PIMáx, PEMáx, MIF, DASI ) %>%
  tbl_summary(statistic = all_continuous() ~ "{p50}", missing = "no",
              digits = list(all_continuous()~ 2)) %>%
  modify_header(stat_0 ~ "**2ºQ**") 

t6 <-
  AVC %>%
  select(Idade, Altura, IMC, Peso,PIMáx, PEMáx, MIF, DASI ) %>%
  tbl_summary(statistic = all_continuous() ~ "{p75}", missing = "no",
              digits = list(all_continuous()~ 2)) %>%
  modify_header(stat_0 ~ "**3ºQ**")

t7 <-
  AVC %>%
  select(Idade, Altura, IMC, Peso,PIMáx, PEMáx, MIF, DASI ) %>%
  tbl_summary(statistic = all_continuous() ~ "{max}", missing = "no",
              digits = list(all_continuous()~ 2)) %>%
  modify_header(stat_0 ~ "**Máx.**") 

tbl_numerica <- tbl_merge(list(t1, t2,t3,t4,t5,t6,t7)) %>% 
  modify_header(update = list(label  ~  "**Variáveis**")) %>%  #modificando o nome da coluna
  modify_footnote(everything() ~ NA_character_) %>% #retiradando os significados das estatisticas
  modify_spanning_header(everything() ~ NA_character_) #retirando o nome da tabela
tbl_numerica
VariáveisNMédiaS.D.Mín1ºQ2ºQ3ºQMáx.
Idade6169.057.3260.0063.0068.0073.0087.00
Altura61160.579.17140.00155.00160.00165.00184.00
IMC6124.754.7115.0021.8124.7126.9041.90
Peso6170.6110.7143.5064.0069.4077.60107.00
PIMáx6158.7717.2925.0045.0060.0070.00100.00
PEMáx6170.0023.6620.0050.0070.0080.00160.00
MIF61108.1321.3750.0095.00118.00125.00126.00
DASI304.301.062.743.304.474.986.70
  • Análise descritiva para variáveis categóricas
categ <- AVC %>%
  select(Sexo, Disfagia,Classificação.IMC, Doença.crônica,Diagnóstico.Funcional, Classificação.MIF, ) %>%
  tbl_summary(
    type = all_categorical() ~ "categorical") %>% 
  modify_header(update =list(label  ~  "**Variáveis**"))%>% 
  bold_labels() #níveis variáveis em negrito
categ
VariáveisN = 611
Sexo
Feminino25 (41%)
Masculino36 (59%)
Disfagia
045 (74%)
116 (26%)
Classificação.IMC
Adequado ou Eutrófico30 (49%)
Baixo Peso16 (26%)
Sobrepeso15 (25%)
Doença.crônica
Hipertensão Arterial Sistêmica37 (61%)
Hipertensão Arterial Sistêmica e Diabetes Mellitus15 (25%)
Hipertensão Arterial Sistêmica e Insuficiência Renal1 (1.6%)
Não8 (13%)
Diagnóstico.Funcional
Hemiparesia à direita25 (41%)
Hemiparesia à esquerda36 (59%)
Classificação.MIF
Dependência modificada até 25%13 (21%)
Dependência modificada até 50%6 (9.8%)
Independência completa42 (69%)
1 Statistics presented: n (%)
  • Tabela de contingência
AVC %>%
  select(Disfagia, Sexo, Classificação.IMC,Doença.crônica, Diagnóstico.Funcional,
         Classificação.MIF,) %>%
  mutate(Disfagia = factor(Disfagia, labels = c("Sem risco", "Com Risco"))) %>%
  tbl_summary(
    by = Disfagia, 
    missing = "no",
  ) %>%
  add_p(pvalue_fun = ~style_pvalue(.x, digits = 3)) %>% 
  modify_header(update =list(label  ~  "**Variáveis**", p.value ~ "**Valor-p**"))%>% 
  bold_labels() %>% 
  bold_p(t = 0.05)
VariáveisSem risco, N = 451Com Risco, N = 161Valor-p2
Sexo0.973
Feminino19 (42%)6 (38%)
Masculino26 (58%)10 (62%)
Classificação.IMC0.098
Adequado ou Eutrófico19 (42%)11 (69%)
Baixo Peso12 (27%)4 (25%)
Sobrepeso14 (31%)1 (6.2%)
Doença.crônica0.782
Hipertensão Arterial Sistêmica26 (58%)11 (69%)
Hipertensão Arterial Sistêmica e Diabetes Mellitus11 (24%)4 (25%)
Hipertensão Arterial Sistêmica e Insuficiência Renal1 (2.2%)0 (0%)
Não7 (16%)1 (6.2%)
Diagnóstico.Funcional0.531
Hemiparesia à direita20 (44%)5 (31%)
Hemiparesia à esquerda25 (56%)11 (69%)
Classificação.MIF0.050
Dependência modificada até 25%9 (20%)4 (25%)
Dependência modificada até 50%2 (4.4%)4 (25%)
Independência completa34 (76%)8 (50%)
1 Statistics presented: n (%)
2 Statistical tests performed: chi-square test of independence; Fisher’s exact test

tbl_cross

  • Adiciona automaticamente um cabeçalho com o nome ou rótulo da variável de comparação.
  • Usa percent = “cell” por padrão.
  • Adiciona totais de margem de linha e coluna (personalizável).
tc1 <- AVC %>%
  tbl_cross(
    row = Sexo,
    col = Disfagia,
    percent = "column"
  ) %>%
  add_p() 
tc1
DISFAGIADISFAGIA
Characteristic01Totalp-value1
Sexo>0.9
Feminino19 (42%)6 (38%)25 (41%)
Masculino26 (58%)10 (62%)36 (59%)
Total45 (100%)16 (100%)61 (100%)
1 chi-square test of independence

As funções tbl_uvregression() e tbl_regression() do gtsummary fornecem tabelas com as estatísticas resumo de um modelo de regressão. Elas apresentam as mesmas funções para personalização

  • Argumentos para modificar a aparência.
ArgumentoDescrição
labelmodificar rótulos de variáveis na tabela
exponentiateexponenciar os coeficientes do modelo
includenomes das variáveis a serem incluídas na saída. O padrão é todas as variáveis
show_single_rowPor padrão, as variáveis categóricas são impressas em várias linhas. Se uma variável é dicotômica e você deseja imprimir o coeficiente de regressão em uma única linha, inclua o nome da variável aqui.
conf.levelnível de confiança do intervalo de confiança
interceptindica se incluir a interceptação
estimate_funfunção para arredondar e formatar estimativas de coeficiente
pvalue_funfunção para arredondar e formatar valores-p

tbl_uvregression()

A tbl_uvregression() produz uma tabela de modelos de regressão univariada.

ArgumentoDescrição
methodmétodo de regressão
yvariável resposta
xvariáveis explicativas. Por padrão, todas as outras são selecionadas
method.argslista de argumentos da regressão

Uso básico

AVC %>%
  select(Disfagia,Idade, Altura,Peso, IMC, Tempo.de.diagnóstico, PIMáx, PEMáx, MIF, DASI) %>%
  tbl_uvregression(
    method = glm,
    y = Disfagia,
    method.args = list(family = binomial),
    exponentiate = TRUE,
  )
CharacteristicNOR195% CI1p-value
Idade611.080.99, 1.170.072
Altura611.061.00, 1.140.078
Peso610.990.93, 1.040.7
IMC610.970.85, 1.100.6
Tempo.de.diagnóstico610.990.96, 1.010.3
PIMáx610.940.89, 0.980.006
PEMáx610.980.95, 1.010.2
MIF610.970.94, 1.000.031
DASI300.620.20, 1.600.4
1 OR = Odds Ratio, CI = Confidence Interval

Uso personalizado

AVC %>%
  select(Disfagia,Idade, Altura,Peso, IMC, Tempo.de.diagnóstico, PIMáx, PEMáx, MIF, DASI) %>%
  tbl_uvregression(
    method = glm,
    y = Disfagia,
    method.args = list(family = binomial),
    exponentiate = TRUE,
    pvalue_fun = ~style_pvalue(.x, digits = 2))%>%
  bold_p() %>%         
  modify_header( 
    update =list(label  ~  "**Variáveis**" ,
                 p.value  ~  "**Valor-p**",
                 ci ~ "**I.C. 95%**"))
VariáveisNOR1I.C. 95%1Valor-p
Idade611.080.99, 1.170.072
Altura611.061.00, 1.140.078
Peso610.990.93, 1.040.70
IMC610.970.85, 1.100.64
Tempo.de.diagnóstico610.990.96, 1.010.27
PIMáx610.940.89, 0.980.006
PEMáx610.980.95, 1.010.22
MIF610.970.94, 1.000.031
DASI300.620.20, 1.600.35
1 OR = Odds Ratio, CI = Confidence Interval

tbl_regression()

A tbl_regression() produz uma tabela de modelos de regressão multivariada.

Uso básico

modelo_mult <- lm(MIF ~ Idade + Peso + Altura + Sexo + 
                      Classificação.IMC + Doença.crônica+ Disfagia+
                    Tempo.de.diagnóstico + Diagnóstico.Funcional +
                    PIMáx + PEMáx , 
                    AVC)
r_multi <- modelo_mult %>% 
  tbl_regression()
r_multi
CharacteristicBeta95% CI1p-value
Idade-1.3-2.1, -0.450.003
Peso0.39-0.36, 1.10.3
Altura-0.10-0.78, 0.580.8
Sexo
Feminino
Masculino9.9-2.4, 220.11
Classificação.IMC
Adequado ou Eutrófico
Baixo Peso4.1-10, 180.6
Sobrepeso-9.1-24, 5.60.2
Doença.crônica
Hipertensão Arterial Sistêmica
Hipertensão Arterial Sistêmica e Diabetes Mellitus2.1-10, 140.7
Hipertensão Arterial Sistêmica e Insuficiência Renal18-23, 580.4
Não3.3-14, 210.7
Disfagia-8.9-22, 4.00.2
Tempo.de.diagnóstico0.05-0.09, 0.190.5
Diagnóstico.Funcional
Hemiparesia à direita
Hemiparesia à esquerda0.24-10.0, 10>0.9
PIMáx0.00-0.38, 0.38>0.9
PEMáx0.06-0.22, 0.340.7
1 CI = Confidence Interval

Uso personalizado

#regresão linear

linear <- lm(PEMáx ~ Sexo +Classificação.IMC + Doença.crônica
             + Diagnóstico.Funcional +Disfagia + Peso+
               Idade + Altura +  IMC+
               Tempo.de.diagnóstico +
                 PIMáx + MIF+ DASI, AVC)
inicial <- linear %>% 
  tbl_regression(pvalue_fun =  ~ style_pvalue ( .x , digits =  3))%>% 
  modify_header(update =list(label  ~  "**Variáveis**",p.value  ~  "**Valor-p**",
                 ci ~ "**I.C. 95%**"))  %>% 
  bold_labels() %>%  #grifa a variavel
  bold_p(t = 0.05)   #grifa os p valores menores que t
inicial
VariáveisBetaI.C. 95%1Valor-p
Sexo
Feminino
Masculino28-8.2, 630.119
Classificação.IMC
Adequado ou Eutrófico
Baixo Peso13-34, 600.552
Sobrepeso-8.0-71, 550.787
Doença.crônica
Hipertensão Arterial Sistêmica
Hipertensão Arterial Sistêmica e Diabetes Mellitus0.03-36, 360.999
Hipertensão Arterial Sistêmica e Insuficiência Renal6.4-69, 820.857
Não-11-70, 470.689
Diagnóstico.Funcional
Hemiparesia à direita
Hemiparesia à esquerda2.7-28, 340.855
Disfagia-10-51, 310.603
Peso-3.7-13, 5.30.386
Idade-1.9-4.7, 1.00.177
Altura0.89-3.1, 4.80.636
IMC16-13, 450.255
Tempo.de.diagnóstico-0.04-0.35, 0.280.803
PIMáx0.49-0.32, 1.30.212
MIF0.21-1.3, 1.70.770
DASI0.89-19, 210.926
1 CI = Confidence Interval

Usando novamente a função tbl_merge() para juntar duas tabelas, podemos chamá-las de modelo inicial e modelo final

linear2 <- lm(PEMáx ~ Sexo +
               Idade +  
               PIMáx, AVC)
final <- linear2 %>% tbl_regression(pvalue_fun =  ~ style_pvalue(.x , digits =  3)) %>% 
          modify_header(update =list(label  ~  "**Variáveis**" ,
                 p.value  ~  "**Valor-p**")) %>% 
  bold_labels() %>%  #grifa a variavel
  bold_p(t = 0.05) %>%   #grifa os p valores menores que t
  modify_header(update =list(label  ~  "**Variáveis**")) 

#Podemos juntar duas tabelas
tbl_merge_ex2 <-
  tbl_merge(
    tbls = list(inicial, final), 
    tab_spanner = c("**Modelo inicial**", "**Modelo final**") 
  )
tbl_merge_ex2
BETAI.C. 95%1VALOR-PBETA95% CI1
Sexo
Feminino
Masculino28-8.2, 630.119110.51, 210.040
Classificação.IMC
Adequado ou Eutrófico
Baixo Peso13-34, 600.552
Sobrepeso-8.0-71, 550.787
Doença.crônica
Hipertensão Arterial Sistêmica
Hipertensão Arterial Sistêmica e Diabetes Mellitus0.03-36, 360.999
Hipertensão Arterial Sistêmica e Insuficiência Renal6.4-69, 820.857
Não-11-70, 470.689
Diagnóstico.Funcional
Hemiparesia à direita
Hemiparesia à esquerda2.7-28, 340.855
Disfagia-10-51, 310.603
Peso-3.7-13, 5.30.386
Idade-1.9-4.7, 1.00.177-0.90-1.6, -0.180.015
Altura0.89-3.1, 4.80.636
IMC16-13, 450.255
Tempo.de.diagnóstico-0.04-0.35, 0.280.803
PIMáx0.49-0.32, 1.30.2120.540.23, 0.860.001
MIF0.21-1.3, 1.70.770
DASI0.89-19, 210.926
1 CI = Confidence Interval

inline_text()

Resultados de uma regressão de forma reproduzível

`r inline_text(tabela, variable = ,pattern = "{}")`

Argumentos:

  • nome da tabela
  • variable: a variável que deseja ter os resultados
  • pattern: as estatísticas que serão imprimidas entre chaves e aspas ({estimate},{conf.low},{conf.high},{p.value},{conf.level},{N})

Houve influência significativa (valor- p=0.001) e positiva (β = 0.54) do PIMáx sobre a PEMáx. Sendo assim, a cada uma unidade acrescida no PIMáx, espera-se um aumento médio de 0.54 unidades na PEMáx.

Houve influência significativa (valor- p=0.015)) e negativa (β = -0.90) da Idade sobre a PEMáx. Sendo assim, a cada uma unidade acrescida na Idade, espera-se um diminuição média de -0.90 unidades na PEMáx.

Resultados de uma análise descritiva de forma reproduzível

`r inline_text(tabela, variable = , column = ,level = ,pattern = "{}")`

Argumentos:

  • nome da tabela;
  • variable: a variável que deseja ter os resultados;
  • column: nível da variável escolhida (coluna);
  • level: nível da variável categórica (linha);
  • pattern: as estatísticas que devem ser imprimidas entre aspas e chaves( ).

Os indivíduos apresentaram, em média, 69.05 anos, com desvio padrão de 7.32. A idade mínima observada foi 60.00 e a idade máxima foi 87.00

A maioria dos indivíduos (59%) é do sexo masculino.

0 respostas

Deixe uma resposta

Quer participar dessa discussão?
Sinta-se livre para contribuir!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *