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 に、以下のように入力してみます。
<- read.table(text = "PatientID, Weight, Height
dfSample 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 に、以下のように入力してみましょう。
$BMI <- dfSample$Weight / (dfSample$Height / 100)^2 dfSample
dfSample\(BMI は、 dfSample の BMI という列を示しています。これはコマンド入力前には存在しないので、新たに作られます。 dfSample\)Height / 100 は、BMI 計算のために㎝からメートルに単位変換しています。 ^2 は、2乗です。
1.5.1 Wide 型と Long 型の変換
ランダム化比較試験をするために、患者の認知機能を測る MMSE を、ベースライン (T0)、12週後 (T1)、1年後 (T2) の3回計測したとします。 通常、このようにデータを整理していると思います。
<- read.table(text = "PatientID, T0, T1, T2
dfWide 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)
::melt
?reshape2::pivot_longer ?tidyr
long 形式から wide 形式へ
::dcast
?reshape2::pivot_wider ?tidyr
関数名を比較すると、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)
<- pivot_longer(data = dfWide,
dfLong cols = c("T0","T1","T2"),
names_to = "Time",
values_to = "MMSE")
datatable(dfLong)
Long 形式から Wide 形式に戻して見ます。
<- pivot_wider(data = dfLong,
dfWide2 id_cols = "PatientID",
names_from = "Time",
values_from = "MMSE")
datatable(dfWide2)
1.6 欠測値のあるデータフレーム
1.6.1 欠測値のあるデータの削除
<- read.table(text = "PatientID, T0, T1, T2
dfWideNA 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 と示されているところは、測定できなかったなど何らかの理由でデータが欠測しています。
<- na.omit(dfWideNA)
dfWide3 datatable(dfWide3)
関数
na.omit: NAのある行を削除します。
1.6.2 欠測値のあるデータの代入 (Imputation)
今回は、単純な単一代入法を試します。
library(imputeMissings)
<- impute(data = dfWideNA,
dfWide4 method = "median/mode")
datatable(dfWide4)
impute: NAを、代入します。
引数 | 内容 |
---|---|
data | データフレーム |
method | “median/mode” または “randomForest” |
このほか、多重代入法もあります。ライブラリは mice
です。
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)
<- metaprop(data = dfMeta,
mpResult 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 ONE や Scientific Reports, npj Digital Medicine などは、記事掲載時になるべく著者にデータ提供するように求めています。
データ提供手段は、いくつかのパターンが見られます。
- PLoS ONE 内で、Supplementary Information として提供
- 他のサイトから提供 (Open Sccience Framework, Kaggle など)
- 他団体がデータを管理
- 著者にコンタクト (医療系に多い)