Chapter 1 はじめに

1.1 R, Rstudio, Rstudio.cloud

本書では、R を手軽に試すことができる RStudio.cloud を使用します。

RStudio.cloud は、R および RStudio を ウェブブラウザ上で遠隔操作するウェブサービスです。 無料版は時間制限などがありますが、手軽に試すことができます。 R はインストールで失敗したり、パッケージのインストールに失敗することがあるので、お勧めです。

1.2 ライブラリ

R では、必要となる機能をライブラリ(あるいはパッケージ)として追加していきながら解析を行います。

本書で、以下のようなコードがあるときは、すでにインストール済みであることが前提です。

library(xfun)
## 
##  次のパッケージを付け加えます: 'xfun'
##  以下のオブジェクトは 'package:base' からマスクされています: 
## 
##      attr, isFALSE

もし、エラーが出るようなら、まずは Tools > Install Packages から、ライブラリをインストールしてください。

1.3 作業を記録

1.3.1 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 などは、RStudio に所属する開発者 Xie Yihui (謝益輝) 氏が精力的に開発してきました。

1.3.2 R Markdown でブログを投稿

R Markdown または R Notebook で書類を「編む」と、右上に Publish というボタンが現れます。 これをクリックすると、簡単にドキュメントを投稿することができます。

  • RPubs
  • RStudio Connect

1.3.3 R Markdown で本を書く

R Markdown は非常に強力なツールであり、R に関する多くのブログが R Markdown で書かれています。 なかには、R Markdown から書籍化されたものもあります。

bookdown は、R についての本、PDF, ePub, Word .docx など、比較的長いドキュメントを書くことを支援するライブラリです。 また、Bookdown.org というサイトは、実際に bookdown を使って書かれた本の HTML 版が多く掲載されています。 中には、knitr の作者の Xie Yihui による本もあります。

ただし、PDFへの出力については、日本語を出力する際にはかなりの労力が必要です。

1.4 データフレーム

R において、もっとも頻繁に使うデータは、データフレームと呼ばれるものです。 データフレームは、エクセルのシートのようなもので、行と列からなる2次元配置のデータです。

1.5 RStudio 内でデータフレームを作成

R の中でデータフレームを作成する方法です。 RStudio は、4つの「パネル」と呼ばれる部分が表示されています。 その左下の Console に、以下のように入力してみます。

dfSample <- read.table(text = "PatientID, Weight, Height
1,55,162
2,60,155
3,68,158
4,69,165
5,76,162", header = TRUE, sep=",")
datatable(dfSample)

最後に、エンターキーを押すことを忘れないでください。

これを実行すると、右上パネルの Environment に、今作ったばかりの dfSample というデータフレームが追加されます。 これをクリックすると、左上パネルに中身が表示されます。

データ型は自動的に判定されています。 PatientID と Year は右寄せになっています。これは、数値型と判定されたことがわかります。

確認するために、左下パネルの Console に、以下のように入力してみましょう。

typeof(dfSample$Weight)
## [1] "integer"

“integer” つまり、整数型であることがわかります。

typeof(dfSample)
## [1] "list"

“data.frame” つまり、データフレーム型であることがわかります。

データフレームの特徴は、列単位での計算などの操作を行うことができる点にあります。 例えば、dfSample には体重と身長データがあるので、BMIを計算することができます。 Console に、以下のように入力してみましょう。

dfSample$BMI <- dfSample$Weight / (dfSample$Height / 100)^2

dfSample\(BMI は、 dfSample の BMI という列を示しています。これはコマンド入力前には存在しないので、新たに作られます。 dfSample\)Height / 100 は、BMI 計算のために㎝からメートルに単位変換しています。 ^2 は、2乗です。

1.5.1 Wide 型と Long 型の変換

ランダム化比較試験をするために、患者の認知機能を測る MMSE を、ベースライン (T0)、12週後 (T1)、1年後 (T2) の3回計測したとします。 通常、このようにデータを整理していると思います。

dfWide <- read.table(text = "PatientID, T0, T1, T2
1,21, 20, 18
2,28, 26, 26
3,18, 15, 18
4,12, 15, 16
5,11, 11, 13", header = TRUE, sep=",")
datatable(dfWide)

このように、複数回計測したものを横に並べる形式が Wide 型です。

手元にあるデータフレームのデータ形式と、解析したいデータ形式が異なる場合、変換する必要があります。 このためのツールには、 reshape2 と tidyr があります。 なお、tidyr は version 1.0.0 以前と以後で大きな変化があり、ネット上の情報は新旧混ざったものになっています。 ここでは、tidyr 1.0.0 以降を紹介しています。

wider 形式から long 形式へ

wider 形式から long 形式へ変換するのは、reshape2::melt() と tidyr::pivot_longer() です。 それぞれ、Console でヘルプを呼び出してみてください。 RStudio の右下ペインに、Help が表示されていると思います(ここでは表示していません)。

library(reshape2)
library(tidyr)
?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(tidyr)
dfLong <- pivot_longer(data = dfWide, 
            cols = c("T0","T1","T2"), 
            names_to = "Time", 
            values_to = "MMSE")
datatable(dfLong)

Long 形式から Wide 形式に戻して見ます。

dfWide2 <- pivot_wider(data = dfLong, 
            id_cols = "PatientID", 
            names_from = "Time", 
            values_from = "MMSE")
datatable(dfWide2)

1.6 欠測値のあるデータフレーム

1.6.1 欠測値のあるデータの削除

dfWideNA <- read.table(text = "PatientID, T0, T1, T2
1,21, 20, 18
2,28, 26, 26
3,18, NA, 18
4,12, 15, NA
5,11, 11, 13", header = TRUE, sep=",")
datatable(dfWideNA)

NA と示されているところは、測定できなかったなど何らかの理由でデータが欠測しています。

dfWide3 <- na.omit(dfWideNA)
datatable(dfWide3)

関数

na.omit: NAのある行を削除します。

1.6.2 欠測値のあるデータの代入 (Imputation)

今回は、単純な単一代入法を試します。

library(imputeMissings)
dfWide4 <- impute(data = dfWideNA, 
            method = "median/mode")
datatable(dfWide4)

impute: NAを、代入します。

引数 内容
data データフレーム
method “median/mode” または “randomForest”

このほか、多重代入法もあります。ライブラリは mice です。

https://techblog.nhn-techorus.com/archives/6309

1.7 ファイル名や変数名、列名の注意

pivot_longer/wider で見たように、関数名などの決め方は非常に重要です。 このため、熟練のプログラマーは、通常、変数や関数名の命名規則を決めています。

例えば、関数名は、英語の動詞と名詞を使い、文章になるようにします。 引数もわかりやすくします。

R については、Google が以下のような提案をしています。

  • 関数名
    • 良 CalculateAvgClicks
    • 非推奨 alculate_avg_clicks, calculateAvgClicks

https://k-metrics.github.io/cabinet/basics_coding_style.html

この例にスタイルにもとづくと、pivot_longer は非推奨ということになります。

私は、データフレームは以下が良いと思っています。

  • データフレーム名
    • 良 dfFrailtyLong
    • 非推奨 df, dat, x

ブログ等で、データフレーム名に df や data を使う理由は、短い方がタイプしやすいというものです、しかし、RStudio では、タブキーを押すことでフレーム名の補完をしてくれます。ですので、タイプしやすさよりも、コードの読みやすさ、RStudio を学ぶという2点で、このような命名は避けた方が良いと思います。

  • データフレーム列名
    • 良 Time, BMS24H (大文字で始まるシンプルな英語)
    • 非推奨 24H (数字から始まっている), BMS 24H (空白がある), 日本語, time (小文字で始まっている)

とくに、列名はエクセルファイルなどを読み込んだままですと、非推奨の状態になる事が多く、のちのちエラーに悩まされます。

メタ分析の章で紹介しますが、実際にはこのようなコードになります。

library(meta)
mpResult <- metaprop(data = dfMeta, 
            event = event, 
            n = sample, 
            studlab = paste(Author, year))

この時、= 記号の左側は関数の引数です。 = 記号の右側は、

metaprop

引数 内容
data データフレーム
event データフレームの列 event
n データフレームの列 sample

となります。event = event とあると、最初のうちは分かりにくいですよね?こういったことを避けるために、列名は大文字から始めるとよいでしょう。 R に関する書籍は、コーディングルールが雑なものが多く、オブジェクトなのか引数なのか混乱させるものが多い印象です。

1.8 CRAN で提供している医療関連データ

R は、機能ごとにライブラリがあります。 ライブラリは、サンプルデータを提供していることが多く、勉強する際に利用することができます。

Framingham データ

心血管疾患の前兆となる因子および自然歴を明らかにするために、1948年からマサチューセッツ州フラミンガム (Framingham) 在住の男女5,209人を対象に開始された大規模研究です。 その後も、1971年 (Offspring Cohort), 1994年 (Omni One Cohort), 2002年 (Generation Three Cohort), 2003年 (Omni Two Cohort) と参加者を増やし、3,000を超える学術論文が生まれました。 内容としては、食事、運動、喫煙、アスピリンなどの薬が心臓病に与える影響を調査しました。

ライブラリ LocalControl には、Framingham の Original Cohort の一部 (2,316件) があります。

https://www.rdocumentation.org/packages/LocalControl/versions/1.1.2.2/topics/framingham

library(LocalControl)
data("framingham")

metamisc ライブラリは、Framingham データを用いた研究のメタ分析用データを提供しています。

library(metamisc)
data("Framingham")

metamisc ライブラリは、このほかにも EuroSCORE, Fiblinogen, Kertai, IMPACT, Roberts, DVTipd, DVTmodels, Collins, Daniels, Zhang といったデータを提供しています。

このほかにも、ライブラリがテスト用データを提供していることが多いので、いろいろ探してみるとよいでしょう。

  • イギリス NHS データ
    • library(NHSRdatasets)
    • LOS_model: 入院期間。
    • ae_attendances dataset
  • エストニア脳卒中データ
    • library(ISwR)
    • stroke
  • メタ分析用禁煙データ
    • library(netmeta)
    • smokingcessation

1.9 オープンアクセスジャーナル

オープンアクセスジャーナルである PLoS ONEScientific Reports, npj Digital Medicine などは、記事掲載時になるべく著者にデータ提供するように求めています。

データ提供手段は、いくつかのパターンが見られます。

  • PLoS ONE 内で、Supplementary Information として提供
  • 他のサイトから提供 (Open Sccience Framework, Kaggle など)
  • 他団体がデータを管理
  • 著者にコンタクト (医療系に多い)