ねこすたっと

ねこの気持ちと統計について悩む筆者の備忘録的ページ。

対象者背景表Table1を作成する(gtsummaryパッケージtbl_summary関数)[R]

以前、対象者背景表(通称:Table1)を書くには、CreateTableOneパッケージのtableone( )が便利だというノートを書きました。

necostat.hatenablog.jp

tidyverseのコードに慣れている人は、ここで説明するgt系gtsummaryパッケージが使いやすいかも。

gtパッケージは"grammar of tables"の名前から分かるように、ggplot("grammar of graphics")の感覚でキレイな表を作成できるパッケージ。gtsummaryパッケージはデータや解析結果をキレイな表にしてくれる。

パッケージとデータセットの準備

パッケージに含まれるtrialというシミュレーションデータを使う。以下の3つの変数のみ使う。

  • trt:化学療法
  • age:年齢
  • stage:Tステージ
library(gtsummary)
library(tidyverse)
d <- trial %>% select(trt, age, grade)
> head(d)
# A tibble: 6 × 3
  trt      age grade
  <chr>  <dbl> <fct>
1 Drug A    23 II   
2 Drug B     9 I    
3 Drug A    31 II   
4 Drug A    NA III  
5 Drug A    51 III  
6 Drug B    39 I    

tbl_summary( )でキレイな背景表を作成する

データをtbl_summary( )に渡せば背景表を作成できる。主な引数は以下のとおり。

  • by:群分けの変数を指定する
  • statistic:集計に使う要約統計量を変更する
  • digits:桁数を指定する
  • missing="no"で欠測数を表示しない
  • missing_text:欠測のカテゴリー名を変更する
  • label:ラベル名を変更する
  • include:表に含めたい変数を指定する

群別に要約する

例えば、治療別に要約したいときは下のようにby = trtと指定する。指定しなければ全体まとめて要約。

d %>% tbl_summary(by = trt)

要約統計量を変更する

デフォルトは連続変数は "median (IQR)"、カテゴリー変数は "n(%)"で要約される。

要約統計量を変更したいときは、引数statisticに「変数名 ~ "要約方法"」の要領で指定。変数名は個々に指定してもいいけど、連続変数、カテゴリー変数でまとめて指定する方が楽。複数の指定はlist( )で渡す。 要約値は{ }で囲む。

桁数を指定したいときは引数digitsに小数点以下の桁数を指定(変化がわかるようにカテゴリー変数に対しても1桁にした)。

d %>%
  tbl_summary(
    statistic = list(all_continuous() ~ "{mean} ({sd})",
                     all_categorical() ~ "{n} / {N} ({p}%)"),
    digits = list(all_continuous() ~ 1,
                  all_categorical() ~ 1)
  )

欠測の表示方法を変更する

欠測数を表示しないときはmissing = "no"と書く。 欠測のカテゴリー名を変更したいときはmissing_text = "(Missing)"のように指定する(デフォルトはUnknown)。

変数の表示名を変更する

引数labelに変数名のリストを渡す。「変数名 ~ "表示名"」の要領で指定。複数を指定するときはlist( )でリストとして渡す。

d %>%
  tbl_summary(
    label = list(trt ~ "Treatment, n(%)",
                 age ~ "Age, median(IQR)",
                 grade ~ "Tumor Grade, n(%)")
  )

一部の変数の結果のみ表示する

表に含めたい変数は引数includeで指定できるが、tbl_summary( )に渡す前にselect( )で選んでしまっていてもよい。

表示する情報を追加する

add_***で情報を追加できる。これらは引数ではなく、%>%で繋ぐ。

  • add_p( ):比較のP値を追加。検定の方法を指定したいときはall_continuous( ) ~ "wilcox.test"の要領で指定する。
  • add_overall( ):群分け要約だけでなく、全集団の要約を追加
  • add_n( ):変数ごとの集計対象数を追加
  • add_difference( ):連続変数に対して群間差を追加する。
  • add_q( ):多重性を調整したP値を追加(add_p( )でP値を追加していることが前提
d %>% tbl_summary(by = trt) %>%
  add_p(all_continuous() ~ "wilcox.test") %>%
  add_overall()

表の体裁を変更する

これもtbl_summary( )で作成したオブジェクトに対して%>%で追加する。

太字・イタリック体にする

  • bold_labels( ):変数名を太字にする
  • bold_levels( ):カテゴリー変数のカテゴリー名を太字にする
  • bold_p( ):P値を太字にする
  • italicize_labels( ):変数名をイタリック体にする
  • italicize_levels( ):カテゴリー変数のカテゴリー名をイタリック体にする

見出し名を変更する

modify_header( )で見出し名を変更できる。まずはshow_header_names( )で変更できる箇所を確認。

d %>% tbl_summary() %>%
  show_header_names()
ℹ As a usage guide, the code below re-creates the current column headers.
modify_header(
  label = '**Characteristic**',
  stat_0 = '**N = 200**'
)


Column Name   Column Header      
------------  -------------------
label         **Characteristic** 
stat_0        **N = 200**   

例えば、変数名の見出しをCharacteristicからVariablesに変更したいときは次のように書く。

d %>% tbl_summary() %>%
  modify_header(label = "**Variables**")

マークダウン方式で書けばいいので、** name **は太字、* name *はイタリック体になる。

題名を変更する

modify_caption( )を使う。サンプル数を追加するときは次のように{N}を使う(まだよく理解できてないです)。

d %>% tbl_summary() %>%
  modify_caption("**Patient Characteristics** (N = {N})")

Word形式で出力する

※ 2022-07-19に追記しました。

as_flex_table( )でフォーマットを整えたものをWordでプレビューには以下のコードで。preview = "pptx"とするとPowerpointでプレビューできる。

flextableパッケージが必要なので、インストールするか聞かれる。

d %>% tbl_summary(by = trt) %>%
  as_flex_table() %>%
  print(preview="docx")

おわりに

  • 今のところ細部まで指定するならtableoneパッケージ、ざっと表にしてみるならgtsummaryパッケージという感じです(後者に慣れていないせいかもしれませんが)。

参考資料

  • gtsummaryパッケージのチュートリアル。

www.danieldsjoberg.com

  • Officeに貼り付けるまでを含めて日本語で解説してくださっています。

mittidata.com