ねこすたっと

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

回帰モデルの結果をキレイに表示する(gtsummaryパッケージtbl_regression関数)[R]

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

gtsummaryパッケージを使って、患者背景表(通称:Table 1)を簡単にキレイに作成する方法については以前まとめた。

necostat.hatenablog.jp

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

パッケージに含まれるtrialというシミュレーションデータを使う。

> library(gtsummary)
> head(trial)
# A tibble: 6 × 9
  trt      age marker stage grade response death death_cr           ttdeath
  <chr>  <dbl>  <dbl> <fct> <fct>    <int> <int> <fct>                <dbl>
1 Drug A    23  0.16  T1    II           0     0 censor                24  
2 Drug B     9  1.11  T2    I            1     0 censor                24  
3 Drug A    31  0.277 T1    II           0     0 censor                24  
4 Drug A    NA  2.07  T3    III          1     1 death other causes    17.6
5 Drug A    51  2.77  T4    III          1     1 death other causes    16.4
6 Drug B    39  0.613 T4    I            0     1 death from cancer     15.6
  • trt:化学療法
  • age:年齢
  • marker:腫瘍マーカー
  • stage:Tステージ
  • grade:グレード
  • response:腫瘍の反応性
  • death:死亡
  • death_cr:腫瘍関連死亡、腫瘍以外による死亡、打ち切り
  • ttdeath:死亡または打ち切りまでの時間

モデルの当てはめ

例として、ロジスティック回帰モデルを当てはめておく。

fit <- glm(response ~ age + stage, data=trial, family = binomial(link="logit"))

tbl_regression( )で結果をキレイに表示する

当てはめた結果をtbl_regression( )に渡す。下のコードのように引数に当てはめ結果を入力してもいいし、%>%を使ってもよい。 そのまま渡すとlog(OR)で表示されるので、exponentiate=TRUEとする。

指定できる引数は次のとおり。

  • exponentiate:説明したとおり。
  • intercept=TRUEとすると切片の結果も表示される。デフォルトはFALSE。
  • conf.level:信頼区間の水準。デフォルトは=0.95になっている。
tbl_regression(fit, exponentiate = TRUE)

これだけでも十分キレイ。

変数の表示名を変更する

引数labelに変数名のリストを渡す。指定の方法は下のコードを参照のこと。以後、引数exponentiateは省略。

fit %>% tbl_regression(label=list(age ~ "年齢", stage ~ "ステージ"))

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

主たる要因や介入の結果のみ表示したいときは多い。ここでは年齢に関しての結果のみ表示した。

fit %>% tbl_regression(include = age)

係数やP値の桁数を変更する

係数の桁数はestimate_funで、P値の桁数はpvalue_funで指定する。 stype_***についてはリンクを参照。

fit %>% tbl_regression(estimate_fun = ~style_number(.x, digits = 2),
                        pvalue_fun = ~style_pvalue(.x, digits = 2))

Style numbers — style_number • gtsummary

Style p-values — style_pvalue • gtsummary

モデル当てはめに関する情報を追加する

add_***で係数・P値以外の情報を追加できる。これらは引数ではなく、%>%で繋ぐ(下のコード参照)。

  • add_global_p( ):カテゴリー変数に対して、個々のダミー変数ごとのP値ではなく、変数全体のP値を表示
  • add_glance_source_note( ):寄与率、モデル全体のP値などを表示
  • add_vif( ):多重共線性の指標である分散拡大係数(variance inflation factor, VIF)を表示する
  • add_q( ):多重性を調整したP値を表示
  • add_nevent( ):サンプル数を追加
fit %>% tbl_regression() %>%
  add_global_p()

それぞれの詳細は以下のリンクから。

表の体裁を変更する

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

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

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

見出し名を変更する

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

fit %>% tbl_regression() %>%
  show_header_names()
ℹ As a usage guide, the code below re-creates the current column headers.
modify_header(
  label = '**Characteristic**',
  estimate = '**log(OR)**',
  ci = '**95% CI**',
  p.value = '**p-value**'
)


Column Name   Column Header      
------------  -------------------
label         **Characteristic** 
estimate      **log(OR)**        
ci            **95% CI**         
p.value       **p-value**    

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

fit %>% tbl_regression() %>%
  modify_header(label = "**Variables**")

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

題名を変更する

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

fit %>% tbl_regression() %>%
  modify_caption("**Regression analysis** (N = {N})")

フッターを変更する

modify_footnote( )を使う。ここもよく理解できてないので、例を2つだけ。

略語を変更したいとき。

fit %>% tbl_regression() %>%
  modify_footnote(ci = "CI = Credible Interval", abbreviation = TRUE)

略語を消したいとき。

fit %>% tbl_regression() %>%
  modify_footnote(update = everything() ~ NA, abbreviation = TRUE)

Word形式で出力する

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

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

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

おわりに

  • gt_summaryに少し慣れてきましたが、まだまだ横にリファレンスは欠かせません...
  • 後から来たオス猫(茶・1歳ちょっと)は、エサを食べるときに気を散らして、先住猫につまみ食いされてます。

参考資料

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

www.danieldsjoberg.com

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

mittidata.com