はじめに
Yoshihiko Baba
2021/6/11
R とは、統計解析を主目的としたプログラミング言語です。 R の特徴としては、まずプログラミング言語としては、オープンソースとして開発されていること、誰もが拡張を行えること、プログラミング言語としては統計解析に特化した記述があることが挙げられます。 統計解析環境としての特徴は、基本的にコマンドベースであることが初学者にとって大きな障壁となっています。一方、常に最新の統計手法が使用できることは最大の利点です。これは、R がオープンソースであることから、統計学の専門家らが新たな統計手法を開発した際に、R で実装していることが挙げられます。 医療における統計解析を例にとると、ランダム化比較試験で必要な反復測定の二元配置分散分析や混合モデルの二元配置分散分析は、商用ソフトウェアでは基本機能に含まれておらず、追加パッケージを購入する必要があることがおります。 R の場合は、これらの最新解析方法が無料で得られます。
RStudio とは、R を使用する際の統合環境です。 R と RStudio は、開発者は異なります。 また、RStudio をウェブブラウザー上で実行する RStudio.cloud というサービスがあります。 こちらは、 R と RStudio をインストールすることなく使うことができるだけではなく、 初学者がつまづく様々な設定を、あらかじめ設定したうえで提供できるため、学習環境として最適です。
医療従事者(ここでは医師、看護師、理学療法士、作業療法士、言語聴覚士、臨床心理士、臨床検査技師、介護福祉士など)は、統計については苦手意識を持っており、プログラミングは未経験なことケースが多いと思われます。一方で、医療におけるエビデンスを判断するには、統計が避けられないことを熟知しています。
本書は、医療従事者を対象として、RStudio.cloud を利用し、統計解析の基礎から応用を学ぶ場を提供します。 類似所と比較し、本書の特徴は、以下の点があります。
- 研究デザインごとのデータの作成、解析、図の作成が一連の流れになっている。
- データの作成には Google Form など、近年使われるツールを使用している。
- できる限り、実際に論文で使用されているデータを使用している。
- 比較的エラーが発生しにくい方法を採用している。
- 変数名などは命名方法を統一することで、コードを読みやすくしている。
- 図について、可能であれば plot と ggplot を併記している。
一方で、以下の点は行いません。
- コードが読みにくくなるエラー処理
- 処理速度を早くするライブラリの使用
- パイプ記法 (magrittr を使用する記法、4.1 で実装された記法): 近年のバージョンで改定が行われているためです。
R, Rstudio, Rstudio.cloud
作業を記録
R Markdown
R での作業を記録するには、R script, R Notebook, R Markdown の3種類があります。
R script: メモを書くのには不向き。基本的に、コードだけを記述する。
R Markdown: R のコードと実行結果を埋め込んだ HTML, PDF, Word 書類を作成 (「編む (knit)」と言う) することができる。他者への報告に向いている。
R Notebook: R Markdown を拡張したもの。R Markdown が、ファイル全体を「編む」のに対し、R Notebook は、各コード塊 (chunk) ごとに実行することができる。結果は、R Notebook 内のコードの下に挿入される。HTML を 「編む」場合、コードが含まれる。個人で使用するノートとしての使用に向いている。
R Markdown と R Notebook の2つは、RStudio に所属する中国人の開発者 Xie Yihui が精力的に開発してきた。
R Markdown でブログを投稿
R Markdown または R Notebook で書類を「編む」と、右上に Publish というボタンが現れます。 これをクリックすると、簡単にドキュメントを投稿することができます。
- RPubs
- RStudio Connect
R Markdown で本を書く
R Markdown は非常に強力なツールであり、R に関する多くのブログが R Markdown で書かれている。 なかには、R Markdown から書籍化されたものもある。
bookdown
は、R についての本、PDF, ePub など、比較的長いドキュメントを書くことを支援するライブラリです。 また、Bookdown.org というサイトは、実際に bookdown を使って書かれた本の HTML 版が多く掲載されています。 中には、knitr
の作者の Xie Yihui による本もあります。
データフレーム
R において、もっとも頻繁に使うデータは、データフレームと呼ばれるものです。
Wide 形式
- t検定, \(\chi^2\)検定、
Long 形式
- ANOVA
Wide と Long の変換
手元にあるデータフレームのデータ形式と、解析したいデータ形式が異なる場合、変換する必要があります。 このためのツールには、 reshape2 と tidyr があります。 なお、tidyr は version 1.0.0 以前と以後で大きな変化があり、ネット上の情報は新旧混ざったものになっています。
wider 形式から long 形式へ
wider 形式から long 形式へ変換するのは、reshape2::melt() と tidyr::pivot_longer() です。 それぞれ、Console でヘルプを呼び出しみましょう。
?reshape2::melt
?tidyr::pivot_longer
long 形式から wide 形式へ
?reshape2::dcast
?tidyr::pivot_wider
関数名を比較すると、tidyr の pivot_longer と pivot_wider の方が覚えやすいのがわかると思います。 なお、tidyr のバージョンが 1.0.0 になる前は、pivot_longer は gather、pivot_wider は spread という名前でした。 ようやく、覚えやすい名前に落ち着いた印象です。 tidyr の pivot_longer/pivot_wider は今後広まっていくと思いますが、現時点ではまだ reshape2 の melt/dcast を使ったコードも多く見られます。
では、tidyr を使って実際に変換して見ましょう。
library(readxl, warn.conflicts=FALSE, quietly=TRUE)
library(tidyr)
library(data.table)
dfAATSWide <- read_excel("/Volumes/HDD/Sync/baba/2021/Ikeno/MixedEffectModel.xlsx")
dfAATSLong <- pivot_longer(data = dfAATSWide, cols = c("BMS 0H","BMS 12H","BMS 24H","BMS 36H","BMS 48H"), names_to = "Time", values_to = "BMS")
datatable(dfAATSLong)
Long 形式から Wide 形式に戻して見ます。
dfAATSWide2 <- pivot_wider(data = dfAATSLong, id_cols = c("ID","Group"), names_from = "Time", values_from = "BMS")
datatable(dfAATSWide2)
欠測値のあるデータの削除
dfAATSWide3 <- na.omit(dfAATSWide2)
datatable(dfAATSWide3)
欠測値のあるデータの Imputation
今回は、単純な単一代入法を試します。
library(imputeMissings)
dfAATSWide4 <- impute(dfAATSWide2, method = "median/mode")
datatable(dfAATSWide4)
このほか、多重代入法もあります。ライブラリは mice です。
コーディングルール
pivot_longer/wider で見たように、関数名などの決め方は非常に重要です。 このため、熟練のプログラマーは、通常コーディングスタイルを決めています。
例えば、関数名は、英語の動詞と名詞を使い、文章になるようにします。 引数もわかりやすくします。
R については、Google が以下のような提案をしています。
- 関数名
- 良 CalculateAvgClicks
- 非推奨 alculate_avg_clicks, calculateAvgClicks
https://k-metrics.github.io/cabinet/basics_coding_style.html
この例にスタイルにもとづくと、pivot_longer は非推奨ということになります。
私は、データフレームは以下が良いと思っています。
- データフレーム
- 良 dfFrailtyLong
- 非推奨 df, data, x
- データフレーム列名
- 良 Time, BMS24H (大文字で始まるシンプルな英語)
- 非推奨 24, BMS 24H (空白がある)
とくに、列名はエクセルファイルなどを読み込んだままですと、非推奨の状態になる事が多く、のちのちエラーに悩まされます。
R に関する書籍は、コーディングルールが雑なものが多く、オブジェクトなのか引数なのか混乱させるものが多い印象です。
しかし、残念ながら