追記(2022/12/16)
gtsummaryのチートシートが公開されています!壁に貼りましょう!(もうこの記事いらねぇな!)
https://twitter.com/statistishdan/status/1572948856421380097?s=20&t=NF7P-cDUZuzJ_inLMiE0ow
追記 (2020/09/17)
実践編:【R】nestしてggplotしてgtsummaryしようの記事を書きました!良ければこちらもご覧下さい!
また、youtubeでも開発者による解説動画が出ているので布教します!
それは突然やってきた
ある日、Twitterを見てみると...
私「ん?なんか見たことあるFigだな...」
(引用文献 (http://www.danieldsjoberg.com/gtsummary/index.html) )
私「!!gtパッケージやんけ!しかもp-valueとか出しとるやんけ!」
私「gtsummary...そんなモノが出ていたのか...」
心の声「前にgtパッケージの記事書いたんだから、これもまとめるべきでは?」
私「はい...」
ということで記事書きます。
はじめに
この記事はきれいなTableを作るためのパッケージgtsummaryについての解説記事になります。対象者としては、
- p値とかn数とかをテーブルでまとめたい研究者全般
- いままでRを使ったデータ解析をしてきた人
- Rの(特にtidyverse)の美しい描画システムになれてしまった人
- 宗教上の理由でExcelが使用できない人、嫌いな人
のいずれかに該当する人を想定しています。
2021/01/18 追記
この記事はgtsummaryの入門という位置づけであり、gtsummary自体かなり色々なことができます。
2021/01/18現在、多くの日本語解説記事ができておりますので、より深く学びたい方はそちらを参考にされると良いと思います。
- 【1-11-2】医療統計で必要なtable1、集計からofficeに貼り付けるまでをgtsummaryパッケージで一気に行う
- 「gtsummary」を使って論文に載せる表を作成してみた
- 【R】gtsummaryで回帰分析の表を結合する(tbl_stack編)
- 【R】gtsummaryで回帰分析の表を結合する(tbl_merge編)
もちろん、 gtsummary公式も英語でありながら非常にわかりやすいドキュメントになっていますので、ぜひご覧ください!
gtパッケージと何が違うか
公式によると...
The {gtsummary} package provides an elegant and flexible way to create publication-ready analytical and summary tables using the R programming language.
The {gtsummary} package summarizes data sets, regression models, and more, using sensible defaults with highly customizable capabilities.
テキトー訳
gtsummaryパッケージは、Rを介して出版可能な分析表や要約表を作成するためのエレガントで柔軟な方法を提供します。
これはデータの要約、回帰モデルなどなどを超自由自在にカスタマイズできます。
確かにgtパッケージもEasily generate information-rich, publication-quality tables from R (出版に耐えうる情報豊富なTableを簡単にRで作ろぜー)というコンセプトであるので、
その流れをくんだパッケージと言えるでしょう!
ただし、このgtsummaryは回帰モデルの要約までカバーしている点が素晴らしいです!
インストール
CRANにあがっているパッケージなので、いつもどおりinstall.packages("gtsummary")
とR console上で打てばokです。
使い方
tbl_summary()
まぁパパっと書いてみましょう。適当なデータフレームを作り、tbl_summary()
を適用することで、データを要約してくれます。
library(gtsummary)
library(tidyverse)
iris %>% tbl_summary()
by =
で引数に取ることでグループ化も自由にできます
library(gtsummary)
library(tidyverse)
iris %>% tbl_summary(by = Species)
見ての通り、それぞれのサンプルサイズ、 medianおよび四分位範囲(IQR)をまとめてくれます。
これはbase関数であるsummary()
をうまい具合に表にしていると考えてくれればいいと思います。
もしここで、**「いやいやデータって平均±SDが基本でしょ」**と思ってる方!ご安心下さい。
library(gtsummary)
library(tidyverse)
iris %>% tbl_summary(
by = Species,
statistic = list(all_continuous() ~ "{mean} ({sd})"
)
見事! 今回はall_continuous()
で連続量を指定しましたが、
all_categorical()
でカテゴリカル変数を指定することができます。
例えば、statistic = list(all_categorical() ~ "{n} / {N} ({p}%)"))
のように指定することで、
全体に対する特定のカテゴリ変数の割合なんかを表に組み込むことができます。
2022/01/18追記
最新版(バージョン1.3.4.9008以降)では上記のコードを書くことなく、デフォルトでmean(SD)の形にしてくれる関数があります。
theme_gtsummary_mean_sd()
#元に戻す場合は...
reset_gtsummary_theme()
これをコード最初にさえ書いておけばOK!
さらに一つポイントなのは、このTableをなんと様々な形式に出力することができます!
対応している形式はkable, gt, flextable, tibbleなどがあり、as_**()によって簡単に変換することが可能です。
flextableはword, powerpointとの互換性が高いので、wordで論文執筆中の皆さんには非常に有用です。
いちいちExcelで集計することなしに、論文らしいフォーマットの表が生成されます。
library(gtsummary)
library(tidyverse)
library(flextable)
theme_gtsummary_mean_sd()
iris %>%
tbl_summary(by = Species) %>%
as_flex_table() %>%
flextable::save_as_docx(path = "/test.docx") # wordファイルで保存される!
add_p(), add_n()
ここからがgtsummaryの本領です!面倒なtable作りから開放されること請負です!
いま、種間でのSepal.Lengthに有意差があるかを調べているとしましょう。その場合...
library(gtsummary)
library(tidyverse)
iris %>% tbl_summary(by = Species) %>% add_p(include = Sepal.Length)
ハイ終わり! 検定をし(今回はKruskal-Wallis)、有意差があるかどうかを自動的に教えてくれます!今回はinclude = Sepal.Length
という引数を取りましたが、
デフォルトではすべての行について検定を行ってくれます。また、bold_p()
を適用することでこのp値を太字にできます!(すげーなおい)
add_n()
は各サンプルのサンプルサイズを新たに列に加えてくれます。
library(gtsummary)
library(tidyverse)
iris %>% tbl_summary(by = Species) %>% add_p(include = Sepal.Length) %>%
bold_p() %>% add_n()
ここまで来るともうpublication-readyという感じですね!
tbl_regression()
これで終わらないのがgtsummary、最後にtbl_regression()
について説明します!
これは回帰式の要約値を表示してくれる関数です!
library(gtsummary)
library(tidyverse)
cars %>% lm(dist ~ speed, data = .) %>%
tbl_regression(intercept = TRUE)
これによって切片および傾きの推定値、95%信頼区間、p値を自動的に作製してくれます!これは線形回帰にとどまらず様々な回帰式に対応しています。
当然これらもtbl_summary()
と同様、tibbleやgtオブジェクト、flextableとして扱うことが可能です。
最後に
今回解説したgtsummaryは統計をメインにする研究者にとって、あるいはデータサイエンティストにとって強力なツールとなるのではないでしょうか。
また、きれいな表を作りたい... けどExcelは嫌だ... という(私のように)わがままな人にとってもありがたいパッケージであると思います!
今回は概略についての解説でしたが、今後時間があれば実践的な話もしたいと思います。
Enjoy!