読者です 読者をやめる 読者になる 読者になる

Take a Risk:林岳彦の研究メモ

自らの研究に関連するエトセトラについてのメモ的ブログです。主にリスク学と統計学を扱っています。

RStudioからknitrでレポートを自動作成してみた

こんにちは。オソブサ*1でおなじみの林です。お盆なのでBON JOVI聞いています*2。論文はまだ書けていませんけど何か。


さて。さいきんTokyo.Rの和田計也さんという方のちょう素晴らしいプレゼンファイルを拝見いたしました。

そろそろRStudioの話でもしてみようと思う
そこでRStudioからレポートを自動作成できるknitrというツールが紹介されていたので、自分でも少しいじってみました。今回はその自習のまとめも兼ねてここにも書いてみたいと思います。

そもそも:Rの結果をどうやって保存してます?

ええと。まずそもそもの問題意識なのですが、みなさまはRでの計算結果ってどう保存してますか?

これって結構メンドクサイ問題で、いままで私は基本的に:

  • テキスト系のアウトプットはテキストファイルへ書き出し(またはコンソールからコピペ)
  • 画像系のアウトプットはpng/PDFなどへ書き出し

していました。

このときに「なんかうまい方法ないかなぁ」と常々思っていたのが、「書きだした結果のファイル」と「その結果を算出した際に用いたパラメータやソースコード」の対応付けの問題です。

Rで行った計算の結果が、どのようなパラメータやソースコードのもとで生成されたものなのかをちゃんと記録しておくのはとっても大事です。しかし、「ソースコードやパラメータ」「コンソールへのアウトプット」「グラフ画像ファイル」などの異なる形式のものをスマートかつ分かりやすい形でまとめておくのは案外むずかしいですよね。


ですよね?


そこで、knitrなのですよ!(ドヤ顔)

knitrってなんすか?

knitrとはその開発者サイトによると、"Elegant, flexible and fast dynamic report generation with R"というものらしいです。

自分で"elegant"とか言うかよ、と一瞬思うかもしれませんが*3、要するにRのソースコードから「ソースコードやパラメータ」「コンソールへのアウトプット」「グラフ画像ファイル」などの異なった形式のオブジェクトが混在したレポートを自動的に生成できるツールです。


とりあえず最新版(0.96.330)のRStudio には実装されているので使ってみましょう。百聞は一見にスガシカオです。

とりあえずは、knitrパッケージをインスコしておきましょう*4

install.packages("knitr")


で、RStudioからknitrへの扉は意外と近くに隠されています。新規ファイルとして"R Markdown"形式のものを開いてみましょう:

そうすると新規ファイルとして"untitled.Rmd"という名のデフォルトのファイルがRStudio内の左上ウィンドウで開きます。そしたら、適当な名前(test.Rmdとか)をつけてそのファイルを保存してから、"Knit HTML"と書いてあるアイコンをとりあえずクリックしてみましょう。

そうすると、Markdown形式で書かれた左上ウィンドウ内のRmdファイルがhtml形式に変換されて表示されます。とりあえずプレビュー画面が出るので、必要に応じて"Save As"から好みの形式で保存したりできます*5


まあ基本的な段取りはだいたいこんなかんじです(←雑)。

ええと、そのMarkdownってなんすか?

Markdownというのは、要するに「はてな記法」みたいなもんです。より一般的に言えば、htmlとかLaTexとかの簡易版みたいなものをイメージすればよいかもしれません。

とりあえずR版Markdownの文法などの情報はこちら:
Using Markdown with RStudio

Markdownの文法の詳しい情報はこちら:
blog::2310 » Markdown文法の全訳


あと、Rstudioでの"knit HTML"の左側にある"MD"と書いてあるアイコンを押すとMarkdownの文法のヘルプが出てきます。


上記のようなMarkdown文法のコードを交えてRのコードを書き、そこでknitrを使うとレポートが自動生成できるわけなのです。

とりあえずサンプル解析ファイルを書いてみたので晒してみる

とはいえとっつきにくいと思うので、自作のRmdサンプル解析ファイルを晒してみます。以下では注を入れるために画像にしていますが、実際にRStudio内で試してみたい方はこちらのblog.Rmd 直ファイルをRStudioで開いてみてください。

ちなみに以下のコードをRStudioで開き、"knitr html"のアイコンをポチるとこういうかんじのhtmlが生成されます*6サンプルhtml

【追加】上記の画像では見ずらいかもと思ったので一応ベタテキスト版も追加しました↓(*リストの部分の"*"がはてな記法と干渉しやがるのでそこだけ改変してます)

論文数とtweet数の関係についての線形回帰分析
========================================================
## 背景
近年、日本の研究者の論文生産数の減少が指摘されている。その原因として、twitterにより研究時間が浪費されている可能性が指摘されている。本解析では、論文数とtweet数の関係について予備的な統計解析を行った。

## データ
データはCounterfactual News (2011)の調査報告書より引用した。ここで *tweet* は一ヶ月あたりのtweet数、 *article* は過去5年間の論文数(第一著者のみ)である。
```{r data}
tweet <- c(259, 265, 367, 699, 293, 395, 843, 986, 833, 373, 560, 704, 394, 138, 881, 17, 873, 157, 764, 250, 24, 583, 81, 946, 175, 534, 458, 168, 32, 776, 616, 292)
article <- c(7.41, 6.35, 6.33, 2.01, 7.07, 6.05, 3.57, 0, 2.67, 7.27, 1.40, 4.96, 7.06, 9.62, 0, 4.83 , 0.27, 12.43, 4.36, 5.50, 8.76, 3.17, 8.19, 0, 7.25, 3.66, 7.42, 6.32, 8.68, 1.24, 0.84, 8.08)
```

## 散布図
散布図は以下の通りであり、明瞭な負の傾向がみられた。
```{r scatter_plot, fig.width=5, fig.height=5}
plot(article ~ tweet, xlab="Number of Tweet (per Month)", ylab="Number of Articles (past 5 years)")
```

## 線形回帰
線形回帰を行ったところ、以下のような結果が得られた。tweet数の効果は有意であり(p<0.001)、1 tweetあたり約0.009本分の論文数の減少に繋がることが示唆された。
```{r linear_regression, fig.width=5, fig.height=5}
lm_res <- lm(article ~ tweet)
plot(article ~ tweet, xlab="Number of Tweet (per Month)", ylab="Number of Articles (past 5 years)")
abline(lm_res,col=2)
summary(lm_res)
```

## 残差分析
線形回帰のチェックのため、残差プロットおよび正規Q-Qプロットを行った。論文数はカウントデータであるため、本来ならばポワソンモデルを用いるべきであるが、残差プロットおよび正規Q-Qプロットの結果を見る限り、残差は良好な正規性を示していると判断できる。
```{r regression_check, fig.width=5, fig.height=5}
plot(lm_res, which=1:2)
```

## 考察
今回の解析より、tweet数が論文数に有意な影響をもたらすことが示唆された。しかしながら、この因果関係の向きについては:

tweet数の増加 → 研究がうまくいかない
研究がうまくいかない → tweet数の増加

の2つの異なる可能性が存在する。今後、この因果関係の向きを明らかにするために、若手研究者を対象とした前向きコホート研究が必要である。

## 参考文献
[津田大介(2012)Twitter社会論~新たなリアルタイム・ウェブの潮流](http://www.amazon.co.jp/Twitter%E7%A4%BE%E4%BC%9A%E8%AB%96-~%E6%96%B0%E3%81%9F%E3%81%AA%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%BB%E3%82%A6%E3%82%A7%E3%83%96%E3%81%AE%E6%BD%AE%E6%B5%81-%E6%96%B0%E6%9B%B8y-%E6%B4%A5%E7%94%B0-%E5%A4%A7%E4%BB%8B/dp/4862484824/ref=sr_1_7?ie=UTF8&qid=1344845029&sr=8-7)

#### このファイルの作成日時
```{r timelog}
Sys.time()
```

使い道は?

おそらくRStudio-knitr-Rmdの組み合わせは(研究者にとっても)以下のような使い道があるのではないでしょうか:

  • 自身のRコードの開発・解析結果の私的ログ管理
  • 共同研究者との統計解析に関するやりとりのためのツール・インフラとして
  • 研究室などでのルーティン統計解析のテンプレとして採用する
  • 論文のSupplementary Materialsにそのまま使うのもいけると思う
  • RやRStudioの講習資料の作成にも使えそう


今回はあまり詳しいことを書けませんでしたが*7、より詳しいTipsについてはknitrの開発者のサイトRMarkdownのサイト和田さんのプレゼン資料を適宜ご参照いただければと思います。



ではよいお盆を!





.

*1:論文を書くのが遅い上にブサイク、の略

*2:

*3:でも使ってみたらたしかにelegantだったよ

*4:R2.14.1以上が必要らしい

*5:"publish"を押すとRPubsというコード公開サイトへの投稿となります

*6:画像ファイルもhtml内に埋め込まれているのでhtmlファイル一つでレポートは完結しているぽい。これはありがたいすね

*7:そもそも詳しいこと知らないので。申し訳ないっす