시작하기 전에
본 자료에서는 데이터 셋의 변수를 하나의 테이블로 요약하는 방법에 대해 알아볼 것이다. gtsummary 패키지를 이용하면 효율적으로 논문에 들어갈 table1을 만들 수 있다. gtsummary 패키지에 관한 기본 개념 및 함수들을 예제를 통해 다루어 보자.
요약 테이블 만들기
tbl_summary 함수를 이용하여 연속형 및 범주형 변수에 대한 기술 통계량을 계산하고 테이블 형태로 나타낼 수 있다.
Setup
Road file
예제에 사용할 데이터를 fread
함수를 통해 불러오자. 데이터는 09-15년 공단 건강검진 데이터에서 실습용으로 32 명을 뽑은 자료이며, 자세한 내용은 “data/2교시 테이블 세부 레이아웃 소개(최신자료).pdf” 를 참고하자.
## Load file
url <- "https://raw.githubusercontent.com/jinseob2kim/lecture-snuhlab/master/data/example_g1e.csv"
dt <- fread(url, header=T)
dt
tbl_summary
tbl_summary 함수를 사용하여 기본 테이블을 작성할 수 있다. 출력값으로 데이터 셋의 각 열에 대한 기술 통계량을 반환한다. 데이터 셋에 섞인 범주형 변수와 연속형 변수를 자동적으로 인식해 그에 맞는 값을 반환하며, 범주형 변수의 기본 출력값은 n(%)이고 연속형 변수의 기본 출력값은 median(IQR)이다. 결측값은 테이블에 Unknown으로 출력된다.
fread
를 통해 불러온 데이터에서 몇 개의 변수를 추출해 요약 테이블을 만들어보자.
tbl_summary
함수를 통해 간단한 요약 테이블을 만들어보자.
# create table
dt2 %>% tbl_summary()
Characteristic | N = 1,6441 |
---|---|
EXMD_BZ_YYYY | |
2009 | 214 (13%) |
2010 | 236 (14%) |
2011 | 223 (14%) |
2012 | 234 (14%) |
2013 | 243 (15%) |
2014 | 254 (15%) |
2015 | 240 (15%) |
Q_PHX_DX_STK | 12 (1.1%) |
Unknown | 573 |
Q_SMK_YN | |
1 | 995 (61%) |
2 | 256 (16%) |
3 | 391 (24%) |
Unknown | 2 |
HGHT | 165 (158, 171) |
WGHT | 64 (56, 73) |
TOT_CHOL | 193 (170, 218) |
TG | 106 (72, 163) |
1 n (%); Median (IQR) |
- 변수 유형이 자동으로 구분되어 연속형 변수는 median(IQR), 범주형 변수는 n(%)의 형태로 출력된 것을 볼 수 있다.
그룹별 통계
by
tbl_summary
함수에는 다양한 옵션이 존재한다. by 옵션을 이용하여 그룹별 통계량을 계산할 수 있다. by 옵션에 그룹별 통계를 수행할 변수를 지정하여 사용 가능하다. 다음 예시에서 연도 변수인 EXMD_BZ_YYYY를 기준으로 그룹별 통계량을 출력해보자.
dt2 %>% tbl_summary(by = EXMD_BZ_YYYY)
Characteristic | 2009, N = 2141 | 2010, N = 2361 | 2011, N = 2231 | 2012, N = 2341 | 2013, N = 2431 | 2014, N = 2541 | 2015, N = 2401 |
---|---|---|---|---|---|---|---|
Q_PHX_DX_STK | 2 (1.5%) | 2 (1.2%) | 1 (0.7%) | 2 (1.3%) | 2 (1.2%) | 2 (1.3%) | 1 (0.6%) |
Unknown | 82 | 74 | 85 | 78 | 75 | 95 | 84 |
Q_SMK_YN | |||||||
1 | 125 (59%) | 132 (56%) | 140 (63%) | 146 (62%) | 141 (58%) | 157 (62%) | 154 (64%) |
2 | 34 (16%) | 42 (18%) | 35 (16%) | 36 (15%) | 35 (14%) | 38 (15%) | 36 (15%) |
3 | 53 (25%) | 62 (26%) | 48 (22%) | 52 (22%) | 67 (28%) | 59 (23%) | 50 (21%) |
Unknown | 2 | 0 | 0 | 0 | 0 | 0 | 0 |
HGHT | 165 (159, 171) | 165 (159, 171) | 165 (157, 171) | 165 (159, 172) | 165 (159, 171) | 164 (158, 172) | 164 (158, 172) |
WGHT | 64 (55, 72) | 64 (56, 73) | 63 (56, 72) | 64 (57, 74) | 64 (57, 73) | 63 (56, 72) | 64 (57, 74) |
TOT_CHOL | 193 (170, 216) | 193 (168, 220) | 190 (168, 215) | 196 (173, 224) | 190 (168, 218) | 193 (171, 216) | 194 (171, 217) |
TG | 105 (71, 149) | 107 (70, 159) | 104 (75, 165) | 108 (69, 164) | 107 (76, 160) | 108 (75, 163) | 111 (71, 167) |
1 n (%); Median (IQR) |
tbl_strata
by 옵션을 통해 그룹별 통계량을 계산한 것처럼 tbl_strata
함수를 이용하면 여러 계층으로 그룹을 묶을 수 있다. tbl_strata(data, strata, .tbl_fun, …) 형식을 사용하며 strata에 그룹화할 칼럼, .tbl_fun 인자에는 출력할 tbl_summary
formula를 지정한다.
tbl_strata(data = dt2,
strata = EXMD_BZ_YYYY,
.tbl_fun =
~ .x %>%
tbl_summary(by = Q_SMK_YN) %>%
add_p() %>%
add_n(),
.header = "**{strata}**, N={n}")
Characteristic | 2009, N=214 | 2010, N=236 | 2011, N=223 | 2012, N=234 | 2013, N=243 | 2014, N=254 | 2015, N=240 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
N | 1, N = 1251 | 2, N = 341 | 3, N = 531 | p-value2 | N | 1, N = 1321 | 2, N = 421 | 3, N = 621 | p-value2 | N | 1, N = 1401 | 2, N = 351 | 3, N = 481 | p-value2 | N | 1, N = 1461 | 2, N = 361 | 3, N = 521 | p-value2 | N | 1, N = 1411 | 2, N = 351 | 3, N = 671 | p-value2 | N | 1, N = 1571 | 2, N = 381 | 3, N = 591 | p-value2 | N | 1, N = 1541 | 2, N = 361 | 3, N = 501 | p-value2 | |
Q_PHX_DX_STK | 130 | 1 (1.5%) | 1 (3.6%) | 0 (0%) | 0.5 | 162 | 2 (2.3%) | 0 (0%) | 0 (0%) | >0.9 | 138 | 1 (1.1%) | 0 (0%) | 0 (0%) | >0.9 | 156 | 2 (2.1%) | 0 (0%) | 0 (0%) | >0.9 | 168 | 2 (2.1%) | 0 (0%) | 0 (0%) | >0.9 | 159 | 2 (2.2%) | 0 (0%) | 0 (0%) | >0.9 | 156 | 1 (1.0%) | 0 (0%) | 0 (0%) | >0.9 |
Unknown | 58 | 6 | 18 | 44 | 10 | 20 | 53 | 14 | 18 | 52 | 12 | 14 | 44 | 7 | 24 | 67 | 8 | 20 | 58 | 12 | 14 | ||||||||||||||
HGHT | 212 | 160 (155, 166) | 167 (164, 174) | 170 (165, 175) | <0.001 | 236 | 160 (156, 166) | 168 (164, 173) | 172 (165, 176) | <0.001 | 223 | 159 (155, 166) | 170 (166, 174) | 172 (169, 177) | <0.001 | 234 | 161 (156, 167) | 169 (165, 172) | 172 (166, 177) | <0.001 | 243 | 160 (156, 165) | 170 (166, 172) | 171 (167, 174) | <0.001 | 254 | 160 (155, 165) | 169 (165, 174) | 173 (168, 177) | <0.001 | 240 | 161 (155, 166) | 170 (165, 173) | 173 (169, 177) | <0.001 |
WGHT | 212 | 59 (52, 67) | 69 (61, 74) | 71 (62, 77) | <0.001 | 236 | 60 (54, 67) | 71 (66, 77) | 70 (62, 78) | <0.001 | 223 | 60 (53, 67) | 69 (64, 75) | 72 (64, 79) | <0.001 | 234 | 61 (54, 69) | 70 (63, 77) | 72 (64, 80) | <0.001 | 243 | 59 (53, 69) | 68 (63, 73) | 69 (62, 75) | <0.001 | 254 | 59 (53, 66) | 69 (62, 77) | 72 (65, 79) | <0.001 | 240 | 61 (54, 69) | 70 (63, 79) | 74 (62, 84) | <0.001 |
TOT_CHOL | 212 | 192 (166, 215) | 195 (177, 224) | 198 (174, 217) | 0.6 | 236 | 193 (166, 220) | 200 (181, 219) | 187 (168, 218) | 0.5 | 223 | 186 (165, 212) | 195 (172, 222) | 198 (176, 228) | 0.2 | 234 | 198 (173, 224) | 200 (171, 238) | 192 (175, 214) | 0.8 | 243 | 187 (165, 214) | 191 (177, 227) | 196 (170, 220) | 0.3 | 254 | 193 (170, 216) | 194 (174, 220) | 193 (175, 214) | >0.9 | 240 | 189 (170, 216) | 194 (171, 216) | 204 (180, 222) | 0.12 |
TG | 212 | 87 (59, 125) | 130 (79, 189) | 139 (100, 173) | <0.001 | 236 | 86 (64, 133) | 113 (78, 177) | 142 (101, 231) | <0.001 | 223 | 93 (67, 129) | 129 (78, 194) | 148 (91, 200) | <0.001 | 234 | 94 (65, 133) | 131 (91, 188) | 132 (94, 201) | 0.001 | 243 | 96 (72, 140) | 105 (75, 162) | 127 (85, 217) | 0.009 | 254 | 98 (73, 140) | 119 (87, 165) | 134 (83, 202) | 0.005 | 240 | 98 (64, 145) | 125 (97, 255) | 151 (90, 248) | <0.001 |
1 n (%); Median (IQR) | |||||||||||||||||||||||||||||||||||
2 Fisher’s exact test; Kruskal-Wallis rank sum test |
Modifying function arguments
tbl_summary
함수에는 다양한 옵션이 존재하며, 이러한 옵션 조정을 통해 원하는 테이블을 작성할 수 있다. 다음은 tbl_summary
함수의 주요 옵션에 대한 설명이다.
- label : 테이블에 출력되는 변수명 지정
- type : 변수 유형 지정 (ex. 연속형, 범주형)
- statistic : 요약 통계량 지정
- digits : 자릿수 지정
- missing : 결측값이 있는 행을 표시할지 여부
- missing_text : 결측행의 변수명 지정
- sort : 빈도에 따라 범주형 변수의 level 정렬
- percent : 열/행의 백분율 출력
- include : 테이블에 포함할 변수 지정
다음은 옵션을 활용한 예시이다. 연도 변수 EXMD_BZ_YYYY의 그룹별 통계량을 출력하고, Q_SMK_YN 변수를 “smoking y/n”로 바꾸어보자. 이때 연속형 변수의 출력값을 {mean}({sd})으로, 범주형 변수의 출력값을 {n}/{N} ({p}%) 형태로 바꾸어보자. 결측값의 변수명은 “Missing”으로 수정한다.
dt2 %>%
tbl_summary(
by = EXMD_BZ_YYYY,
statistic = list(all_continuous() ~ "{mean} ({sd})",
all_categorical() ~ "{n} / {N} ({p}%)"),
label = Q_SMK_YN ~ "smoking y/n",
missing_text = "Missing"
)
Characteristic | 2009, N = 2141 | 2010, N = 2361 | 2011, N = 2231 | 2012, N = 2341 | 2013, N = 2431 | 2014, N = 2541 | 2015, N = 2401 |
---|---|---|---|---|---|---|---|
Q_PHX_DX_STK | 2 / 132 (1.5%) | 2 / 162 (1.2%) | 1 / 138 (0.7%) | 2 / 156 (1.3%) | 2 / 168 (1.2%) | 2 / 159 (1.3%) | 1 / 156 (0.6%) |
Missing | 82 | 74 | 85 | 78 | 75 | 95 | 84 |
smoking y/n | |||||||
1 | 125 / 212 (59%) | 132 / 236 (56%) | 140 / 223 (63%) | 146 / 234 (62%) | 141 / 243 (58%) | 157 / 254 (62%) | 154 / 240 (64%) |
2 | 34 / 212 (16%) | 42 / 236 (18%) | 35 / 223 (16%) | 36 / 234 (15%) | 35 / 243 (14%) | 38 / 254 (15%) | 36 / 240 (15%) |
3 | 53 / 212 (25%) | 62 / 236 (26%) | 48 / 223 (22%) | 52 / 234 (22%) | 67 / 243 (28%) | 59 / 254 (23%) | 50 / 240 (21%) |
Missing | 2 | 0 | 0 | 0 | 0 | 0 | 0 |
HGHT | 164 (9) | 165 (9) | 164 (10) | 165 (9) | 165 (9) | 164 (9) | 164 (9) |
WGHT | 64 (13) | 65 (12) | 65 (13) | 66 (12) | 65 (12) | 64 (12) | 66 (13) |
TOT_CHOL | 195 (37) | 195 (39) | 194 (38) | 199 (35) | 192 (36) | 195 (36) | 195 (36) |
TG | 129 (90) | 136 (101) | 138 (108) | 129 (89) | 132 (98) | 138 (127) | 141 (113) |
1 n / N (%); Mean (SD) |
functions to add information
gtsummary 패키지에는 add_() 함수를 이용하여 테이블에 통계 정보를 추가하는 기능이 있다. 다음은 add_() 함수들의 주요 설명이다.
- add_p() : 그룹 간 값의 비교를 위한 p-value 추가
- add_overall() : 전체 요약 통계량을 출력하는 열 추가
- add_n() : 각 변수의 행 수와 결측행 개수 추가
- add_difference() : 두 그룹 간의 차이, 신뢰구간 및 p-value 추가
- add_stat_label() : 요약 통계량의 label 추가
- add_stat() : 사용자 지정 함수 추가
- add_q() : 다중 비교를 위한 q-value 추가
add_p()
add_p() 함수를 사용하여 tbl_summary
에 의해 생성된 테이블에 p-value를 추가할 수 있다. 이때 test 인자에 “t.test”, “wilcox.test”, “chisq.test”, “fisher.test”, “aov”, … 와 같이 수행할 통계 test를 지정할 수 있다. add_p(col ~ “.test”) 형식을 사용하며 모든 변수 또는 일부 변수에 대해 적용할 수 있다.
- default test
- 연속형 변수 - 2그룹 wilcox.test, 3그룹 이상 kruskal.test
- 범주형 변수 - 행의 수가 5 이상인 경우 chisq.test, 5 미만인 경우 fisher.test
- 연속형 변수 - t.test, wilcox.test
dt2 %>%
tbl_summary(by = Q_PHX_DX_STK) %>%
add_p(all_continuous() ~ "t.test")
Characteristic | 0, N = 1,0591 | 1, N = 121 | p-value2 |
---|---|---|---|
EXMD_BZ_YYYY | >0.9 | ||
2009 | 130 (12%) | 2 (17%) | |
2010 | 160 (15%) | 2 (17%) | |
2011 | 137 (13%) | 1 (8.3%) | |
2012 | 154 (15%) | 2 (17%) | |
2013 | 166 (16%) | 2 (17%) | |
2014 | 157 (15%) | 2 (17%) | |
2015 | 155 (15%) | 1 (8.3%) | |
Q_SMK_YN | 0.045 | ||
1 | 608 (58%) | 11 (92%) | |
2 | 186 (18%) | 1 (8.3%) | |
3 | 263 (25%) | 0 (0%) | |
Unknown | 2 | 0 | |
HGHT | 166 (160, 172) | 159 (155, 170) | 0.064 |
WGHT | 65 (58, 73) | 64 (56, 67) | 0.051 |
TOT_CHOL | 194 (171, 218) | 163 (146, 192) | 0.035 |
TG | 108 (73, 163) | 128 (116, 149) | 0.5 |
1 n (%); Median (IQR) | |||
2 Fisher’s exact test; Welch Two Sample t-test |
dt2 %>%
tbl_summary(by = Q_PHX_DX_STK) %>%
add_p(HGHT ~ "wilcox.test")
Characteristic | 0, N = 1,0591 | 1, N = 121 | p-value2 |
---|---|---|---|
EXMD_BZ_YYYY | >0.9 | ||
2009 | 130 (12%) | 2 (17%) | |
2010 | 160 (15%) | 2 (17%) | |
2011 | 137 (13%) | 1 (8.3%) | |
2012 | 154 (15%) | 2 (17%) | |
2013 | 166 (16%) | 2 (17%) | |
2014 | 157 (15%) | 2 (17%) | |
2015 | 155 (15%) | 1 (8.3%) | |
Q_SMK_YN | 0.045 | ||
1 | 608 (58%) | 11 (92%) | |
2 | 186 (18%) | 1 (8.3%) | |
3 | 263 (25%) | 0 (0%) | |
Unknown | 2 | 0 | |
HGHT | 166 (160, 172) | 159 (155, 170) | 0.048 |
WGHT | 65 (58, 73) | 64 (56, 67) | 0.2 |
TOT_CHOL | 194 (171, 218) | 163 (146, 192) | 0.022 |
TG | 108 (73, 163) | 128 (116, 149) | 0.10 |
1 n (%); Median (IQR) | |||
2 Fisher’s exact test; Wilcoxon rank sum test |
- 범주형 변수 - chisq.test, fisher.test
dt2 %>%
tbl_summary(by = Q_PHX_DX_STK) %>%
add_p(all_categorical() ~ "chisq.test")
Characteristic | 0, N = 1,0591 | 1, N = 121 | p-value2 |
---|---|---|---|
EXMD_BZ_YYYY | >0.9 | ||
2009 | 130 (12%) | 2 (17%) | |
2010 | 160 (15%) | 2 (17%) | |
2011 | 137 (13%) | 1 (8.3%) | |
2012 | 154 (15%) | 2 (17%) | |
2013 | 166 (16%) | 2 (17%) | |
2014 | 157 (15%) | 2 (17%) | |
2015 | 155 (15%) | 1 (8.3%) | |
Q_SMK_YN | 0.051 | ||
1 | 608 (58%) | 11 (92%) | |
2 | 186 (18%) | 1 (8.3%) | |
3 | 263 (25%) | 0 (0%) | |
Unknown | 2 | 0 | |
HGHT | 166 (160, 172) | 159 (155, 170) | 0.048 |
WGHT | 65 (58, 73) | 64 (56, 67) | 0.2 |
TOT_CHOL | 194 (171, 218) | 163 (146, 192) | 0.022 |
TG | 108 (73, 163) | 128 (116, 149) | 0.10 |
1 n (%); Median (IQR) | |||
2 Pearson’s Chi-squared test; Wilcoxon rank sum test |
dt2 %>%
tbl_summary(by = Q_PHX_DX_STK) %>%
add_p(Q_SMK_YN ~ "fisher.test")
Characteristic | 0, N = 1,0591 | 1, N = 121 | p-value2 |
---|---|---|---|
EXMD_BZ_YYYY | >0.9 | ||
2009 | 130 (12%) | 2 (17%) | |
2010 | 160 (15%) | 2 (17%) | |
2011 | 137 (13%) | 1 (8.3%) | |
2012 | 154 (15%) | 2 (17%) | |
2013 | 166 (16%) | 2 (17%) | |
2014 | 157 (15%) | 2 (17%) | |
2015 | 155 (15%) | 1 (8.3%) | |
Q_SMK_YN | 0.045 | ||
1 | 608 (58%) | 11 (92%) | |
2 | 186 (18%) | 1 (8.3%) | |
3 | 263 (25%) | 0 (0%) | |
Unknown | 2 | 0 | |
HGHT | 166 (160, 172) | 159 (155, 170) | 0.048 |
WGHT | 65 (58, 73) | 64 (56, 67) | 0.2 |
TOT_CHOL | 194 (171, 218) | 163 (146, 192) | 0.022 |
TG | 108 (73, 163) | 128 (116, 149) | 0.10 |
1 n (%); Median (IQR) | |||
2 Fisher’s exact test; Wilcoxon rank sum test |
이외에 다양한 add_()함수를 이용하여 앞에서 만든 table에 여러 통계량을 추가해보자.
dt2 %>%
tbl_summary(by = EXMD_BZ_YYYY) %>%
add_p() %>%
add_overall() %>%
add_n() %>%
add_q()
Characteristic | N | Overall, N = 1,6441 | 2009, N = 2141 | 2010, N = 2361 | 2011, N = 2231 | 2012, N = 2341 | 2013, N = 2431 | 2014, N = 2541 | 2015, N = 2401 | p-value2 | q-value3 |
---|---|---|---|---|---|---|---|---|---|---|---|
Q_PHX_DX_STK | 1,071 | 12 (1.1%) | 2 (1.5%) | 2 (1.2%) | 1 (0.7%) | 2 (1.3%) | 2 (1.2%) | 2 (1.3%) | 1 (0.6%) | >0.9 | >0.9 |
Unknown | 573 | 82 | 74 | 85 | 78 | 75 | 95 | 84 | |||
Q_SMK_YN | 1,642 | 0.9 | >0.9 | ||||||||
1 | 995 (61%) | 125 (59%) | 132 (56%) | 140 (63%) | 146 (62%) | 141 (58%) | 157 (62%) | 154 (64%) | |||
2 | 256 (16%) | 34 (16%) | 42 (18%) | 35 (16%) | 36 (15%) | 35 (14%) | 38 (15%) | 36 (15%) | |||
3 | 391 (24%) | 53 (25%) | 62 (26%) | 48 (22%) | 52 (22%) | 67 (28%) | 59 (23%) | 50 (21%) | |||
Unknown | 2 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | |||
HGHT | 1,644 | 165 (158, 171) | 165 (159, 171) | 165 (159, 171) | 165 (157, 171) | 165 (159, 172) | 165 (159, 171) | 164 (158, 172) | 164 (158, 172) | >0.9 | >0.9 |
WGHT | 1,644 | 64 (56, 73) | 64 (55, 72) | 64 (56, 73) | 63 (56, 72) | 64 (57, 74) | 64 (57, 73) | 63 (56, 72) | 64 (57, 74) | 0.8 | >0.9 |
TOT_CHOL | 1,644 | 193 (170, 218) | 193 (170, 216) | 193 (168, 220) | 190 (168, 215) | 196 (173, 224) | 190 (168, 218) | 193 (171, 216) | 194 (171, 217) | 0.7 | >0.9 |
TG | 1,644 | 106 (72, 163) | 105 (71, 149) | 107 (70, 159) | 104 (75, 165) | 108 (69, 164) | 107 (76, 160) | 108 (75, 163) | 111 (71, 167) | >0.9 | >0.9 |
1 n (%); Median (IQR) | |||||||||||
2 Fisher’s exact test; Pearson’s Chi-squared test; Kruskal-Wallis rank sum test | |||||||||||
3 False discovery rate correction for multiple testing |
- 각 변수의 p-value 및 q-value와 전체 요약 통계량, 행의 수가 출력된 것을 확인할 수 있다.
이번에는 두 그룹 간의 차이를 비교해보자.
dt2 %>%
tbl_summary(by = Q_PHX_DX_STK) %>%
add_difference()
Characteristic | 0, N = 1,0591 | 1, N = 121 | p-value2 | Difference2 | 95% CI2,3 |
---|---|---|---|---|---|
EXMD_BZ_YYYY | |||||
2009 | 130 (12%) | 2 (17%) | |||
2010 | 160 (15%) | 2 (17%) | |||
2011 | 137 (13%) | 1 (8.3%) | |||
2012 | 154 (15%) | 2 (17%) | |||
2013 | 166 (16%) | 2 (17%) | |||
2014 | 157 (15%) | 2 (17%) | |||
2015 | 155 (15%) | 1 (8.3%) | |||
Q_SMK_YN | |||||
1 | 608 (58%) | 11 (92%) | |||
2 | 186 (18%) | 1 (8.3%) | |||
3 | 263 (25%) | 0 (0%) | |||
Unknown | 2 | 0 | |||
HGHT | 166 (160, 172) | 159 (155, 170) | 0.064 | 6.5 | -0.44, 14 |
WGHT | 65 (58, 73) | 64 (56, 67) | 0.051 | 5.4 | -0.04, 11 |
TOT_CHOL | 194 (171, 218) | 163 (146, 192) | 0.035 | 23 | 1.9, 43 |
TG | 108 (73, 163) | 128 (116, 149) | 0.5 | -12 | -50, 26 |
1 n (%); Median (IQR) | |||||
2 Welch Two Sample t-test | |||||
3 CI = Confidence Interval |
- Q_PHX_DX_STK 변수의 두 그룹 간의 차이와 신뢰구간, p-value가 추가된 것을 볼 수 있다.
functions to format table
gtsummary 패키지에는 테이블의 형식을 지정하는 함수 또한 존재한다. 다음과 같은 함수들을 사용하여 테이블의 디자인 및 형식을 설정할 수 있다.
- modify_header() : 테이블 header 형식 지정
- modify_footnote() : 테이블 각주 형식 지정
- modify_spanning_header() : 테이블 spanning header 형식 지정
- modify_caption() : 테이블 캡션 형식 지정
- bold_labels() : 변수명 볼드체
- bold_levels() : 범주 볼드체
- italicize_labels() : 변수명 기울임
- italicize_levels() : 범주 기울임
- bold_p() : p-value 볼드체
위의 함수들을 사용하여 테이블의 디자인을 설정해보자.
dt2 %>%
tbl_summary(by = EXMD_BZ_YYYY) %>%
add_p() %>%
add_n() %>%
modify_header(label ~ "**Variables**") %>%
modify_spanning_header(all_stat_cols() ~ "**Year**") %>%
modify_footnote(all_stat_cols() ~ "Median(IQR) or Frequency(%)") %>%
modify_caption("Table 1") %>%
bold_labels()
Variables | N | Year | p-value2 | ||||||
---|---|---|---|---|---|---|---|---|---|
2009, N = 2141 | 2010, N = 2361 | 2011, N = 2231 | 2012, N = 2341 | 2013, N = 2431 | 2014, N = 2541 | 2015, N = 2401 | |||
Q_PHX_DX_STK | 1,071 | 2 (1.5%) | 2 (1.2%) | 1 (0.7%) | 2 (1.3%) | 2 (1.2%) | 2 (1.3%) | 1 (0.6%) | >0.9 |
Unknown | 82 | 74 | 85 | 78 | 75 | 95 | 84 | ||
Q_SMK_YN | 1,642 | 0.9 | |||||||
1 | 125 (59%) | 132 (56%) | 140 (63%) | 146 (62%) | 141 (58%) | 157 (62%) | 154 (64%) | ||
2 | 34 (16%) | 42 (18%) | 35 (16%) | 36 (15%) | 35 (14%) | 38 (15%) | 36 (15%) | ||
3 | 53 (25%) | 62 (26%) | 48 (22%) | 52 (22%) | 67 (28%) | 59 (23%) | 50 (21%) | ||
Unknown | 2 | 0 | 0 | 0 | 0 | 0 | 0 | ||
HGHT | 1,644 | 165 (159, 171) | 165 (159, 171) | 165 (157, 171) | 165 (159, 172) | 165 (159, 171) | 164 (158, 172) | 164 (158, 172) | >0.9 |
WGHT | 1,644 | 64 (55, 72) | 64 (56, 73) | 63 (56, 72) | 64 (57, 74) | 64 (57, 73) | 63 (56, 72) | 64 (57, 74) | 0.8 |
TOT_CHOL | 1,644 | 193 (170, 216) | 193 (168, 220) | 190 (168, 215) | 196 (173, 224) | 190 (168, 218) | 193 (171, 216) | 194 (171, 217) | 0.7 |
TG | 1,644 | 105 (71, 149) | 107 (70, 159) | 104 (75, 165) | 108 (69, 164) | 107 (76, 160) | 108 (75, 163) | 111 (71, 167) | >0.9 |
1 Median(IQR) or Frequency(%) | |||||||||
2 Fisher’s exact test; Pearson’s Chi-squared test; Kruskal-Wallis rank sum test |
Multi-line Continuous Summaries
연속형 변수의 통계량은 여러 줄로 요약될 수 있다. 여러 줄에 걸쳐 연속형 변수의 요약값을 출력할 때에는 변수 type을 continuous2로 지정해 주어야 한다.
MyTbl <- dt2 %>%
tbl_summary(
by = EXMD_BZ_YYYY,
type = all_continuous() ~ "continuous2",
statistic = all_continuous() ~ c("{N_nonmiss}",
"{median} ({p25}, {p75})",
"{min}, {max}"),
missing = "no"
) %>%
add_p()
MyTbl
Characteristic | 2009, N = 2141 | 2010, N = 2361 | 2011, N = 2231 | 2012, N = 2341 | 2013, N = 2431 | 2014, N = 2541 | 2015, N = 2401 | p-value2 |
---|---|---|---|---|---|---|---|---|
Q_PHX_DX_STK | 2 (1.5%) | 2 (1.2%) | 1 (0.7%) | 2 (1.3%) | 2 (1.2%) | 2 (1.3%) | 1 (0.6%) | >0.9 |
Q_SMK_YN | 0.9 | |||||||
1 | 125 (59%) | 132 (56%) | 140 (63%) | 146 (62%) | 141 (58%) | 157 (62%) | 154 (64%) | |
2 | 34 (16%) | 42 (18%) | 35 (16%) | 36 (15%) | 35 (14%) | 38 (15%) | 36 (15%) | |
3 | 53 (25%) | 62 (26%) | 48 (22%) | 52 (22%) | 67 (28%) | 59 (23%) | 50 (21%) | |
HGHT | >0.9 | |||||||
N | 214 | 236 | 223 | 234 | 243 | 254 | 240 | |
Median (IQR) | 165 (159, 171) | 165 (159, 171) | 165 (157, 171) | 165 (159, 172) | 165 (159, 171) | 164 (158, 172) | 164 (158, 172) | |
Range | 139, 186 | 139, 186 | 134, 188 | 140, 188 | 139, 186 | 136, 185 | 138, 185 | |
WGHT | 0.8 | |||||||
N | 214 | 236 | 223 | 234 | 243 | 254 | 240 | |
Median (IQR) | 64 (55, 72) | 64 (56, 73) | 63 (56, 72) | 64 (57, 74) | 64 (57, 73) | 63 (56, 72) | 64 (57, 74) | |
Range | 35, 110 | 31, 114 | 39, 114 | 39, 111 | 37, 117 | 31, 111 | 36, 118 | |
TOT_CHOL | 0.7 | |||||||
N | 214 | 236 | 223 | 234 | 243 | 254 | 240 | |
Median (IQR) | 193 (170, 216) | 193 (168, 220) | 190 (168, 215) | 196 (173, 224) | 190 (168, 218) | 193 (171, 216) | 194 (171, 217) | |
Range | 112, 300 | 68, 324 | 74, 321 | 120, 300 | 83, 303 | 119, 341 | 101, 363 | |
TG | >0.9 | |||||||
N | 214 | 236 | 223 | 234 | 243 | 254 | 240 | |
Median (IQR) | 105 (71, 149) | 107 (70, 159) | 104 (75, 165) | 108 (69, 164) | 107 (76, 160) | 108 (75, 163) | 111 (71, 167) | |
Range | 26, 654 | 25, 685 | 26, 723 | 24, 572 | 13, 1,017 | 24, 1,210 | 34, 878 | |
1 n (%) | ||||||||
2 Fisher’s exact test; Pearson’s Chi-squared test; Kruskal-Wallis rank sum test |
- 연속형 변수의 요약 통계량이 3줄로 늘어난 것을 확인할 수 있다.
Save individual tables
gtsummary
패키지를 이용해 만든 table을 flextable 객체로 바꾼 후 워드 파일로 저장할 수 있다.
MyTbl %>%
as_flex_table() %>%
flextable::save_as_docx(MyTbl, path = "/cloud/project/table.docx")
마치며
이번 강의를 정리하자.
gtsummary 패키지의
tbl_summary
함수를 사용하여 요약 통계량 테이블을 작성할 수 있다.tbl_summary
함수에는 다양한 옵션이 존재하며 by 옵션을 통해 그룹별 통계량을 계산할 수 있다.tbl_strata
함수를 사용하여 여러 계층별 통계량을 계산할 수 있다.add_p()
함수를 사용하여 수행할 test를 지정하고 p-value를 추가할 수 있다. 이외에도 다양한 함수를 통해 테이블에 통계량을 추가하고 디자인을 설정할 수 있다.gtsummary 패키지로 만든 table을 워드 파일로 저장할 수 있다.
Citation
@online{lee2022,
author = {Lee, Yujin},
title = {Gtsummary {패키지} {소개}},
date = {2022-02-04},
url = {https://blog.zarathu.com/en/posts/2022-02-07-gtsummary},
langid = {en}
}