I have a longitudinal data frame which has some patient symptoms recorded before and after doing vaccination. I am using gt_summary for creating summary table and doing McNemar's test. The test result of McNemar is coming incorrect as the gt_summary doesn't give crosstabs (2X2) for before and after vaccination. This is the code I am using
trial_paired %>%
filter(complete.cases(.)) %>%
group_by(id) %>%
filter(n() == 2) %>%
ungroup() %>%
tbl_summary(type = list(c(Pain, Redness, Swelling, Tiredness, Headache, Muscle, Chills, Fever, Nausea, JointPain, `Allergic reaction`) ~ "categorical"),by = visit, include = -id) %>%
add_p(test = list( c(Pain, Redness, Swelling, Tiredness, Headache, Muscle, Chills, Fever, Nausea, JointPain, `Allergic reaction`) ~ "mcnemar.test"),
group = id)
This is the output I am getting which is not right.

Can someone please help
Following is the sample data
structure(list(visit = c("1", "2", "1", "2", "1", "2", "1", "2",
"1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1",
"2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2",
"1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1",
"2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2",
"1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1",
"2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2",
"1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1",
"2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2",
"1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1",
"2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2",
"1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1",
"2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2",
"1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1",
"2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2",
"1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1", "2", "1",
"2"), Pain = c("No", "No", "Yes", "Yes", "No", "No", "Yes", "Yes",
"Yes", "No", "No", "Yes", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "Yes", "No", "No", "Yes", "No",
"No", "No", "No", "No", "No", "Yes", "No", "No", "Yes", "No",
"No", "No", "No", "Yes", "No", "No", "No", "No", "No", "No",
"Yes", "No", "Yes", "No", "Yes", "Yes", "Yes", "Yes", "Yes",
"No", "No", "No", "No", "No", "No", "Yes", "No", "No", "No",
"No", "No", "No", "Yes", "No", "Yes", "Yes", "No", "No", "Yes",
"No", "Yes", "Yes", "Yes", "No", "No", "No", "No", "No", "Yes",
"No", "Yes", "Yes", "Yes", "No", "Yes", "No", "Yes", "No", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"No", "No", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "No", "No",
"No", "No", "Yes", "Yes", "Yes", "Yes", "No", "No", "No", "No",
"Yes", "No", "No", "No", "No", "No", "No", "No", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "Yes", "Yes", "No", "Yes", "No", "No",
"Yes", "Yes", "No", "No", "Yes", "Yes", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "Yes", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "Yes", "Yes", "No", "Yes"), Redness = c("No", "No",
"No", "Yes", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"Yes", "No", "No", "No", "No", "Yes", "Yes", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "Yes", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "Yes", "Yes", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No"), Swelling = c("No",
"No", "No", "No", "No", "No", "No", "No", "Yes", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "Yes", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "Yes", "Yes", "No", "No",
"No", "No", "No", "No", "No", "No", "Yes", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "Yes", "Yes", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No"),
Chills = c("No", "No", "Yes", "Yes", "No", "No", "No", "No",
"No", "Yes", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "Yes", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "Yes",
"No", "No", "No", "No", "No", "No", "No", "Yes", "No", "No",
"No", "No", "No", "No", "No", "Yes", "No", "No", "No", "No",
"No", "No", "Yes", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"Yes", "Yes", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "Yes", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "Yes", "No", "No",
"Yes", "No", "No", "No", "No", "No")), row.names = c(NA,
-204L), class = c("tbl_df", "tbl", "data.frame"))
CodePudding user response:
The {gtsummary} packages expects paired data to be in a long format (2 observations per ID) and you should be using gtsummary v1.5.0 (the expected data structure was updated in that release).
library(gtsummary)
#> #Uighur
library(tidyverse)
packageVersion("gtsummary")
#> [1] '1.5.0'
# adding a patient ID to the data
df <-
df %>%
select(visit, Pain, Chills) %>%
filter(complete.cases(.)) %>%
group_by(visit) %>%
mutate(id = row_number(), .before = 1) %>%
group_by(id) %>%
filter(n() == 2) %>%
ungroup()
# creating summary table with McNemars test
tbl <-
df %>%
tbl_summary(
type = all_dichotomous() ~ "categorical",
by = visit,
include = -id
) %>%
add_p(test = everything() ~ "mcnemar.test", group = id)
Created on 2022-01-03 by the reprex package (v2.0.1)
