Yoshi Nishikawa Blog

医学となにかのインタラクティブ

ggplot2でグラフ作成 (3)

ggplot2

2016年に出版されたggplot2に関するHadley Wickhamによる著書。その名もggplot2、の続き。この本、最後まで読み解いて分かるが、本当におすすめ。データを扱うすべての人が読んだら良いと思う。

コンテンツ

大きく分けて3部で構成され、全12章にわかれている。最後の第三部は、解析のためのノウハウ。こういうものは、実データを前にしながら学んでいくのが良いと思う。大項目だけ列挙する。

Part3 データ解析
9 データ解析
10 データ変換
11 可視化のためのモデリング
12 プログラミング

途中詳しく取り扱わなかった重要箇所もあるので、補足するかも知れない。

2016年に発売の原著。お世話になりました。

1つ古い版の日本語の訳本はこちら。

MCMC

はじめての統計データ分析

「はじめての統計データ分析」 に関して覚書。
1章の記事はこちら。

2章のハイライト

1) MCMC(Markov chain Monte Carlo method)により事後分布のデータを用い、
2) MCMCには、Metropolis-Hasting method, Gibbs sampling methods, Hamiltonian Monte Carlo methodなどが提案されています。
3) MCMCの欠点は、事後確率が定まらないことです。小数点xx桁まで行くと、施行毎に異なる結果を生じます。

この章をマスターすれば、あとは同じ概念の繰り返しという印象。

survival analysisをRのggplot2で行う

ggplot2でsurvival analysisのプロットをしたいときは、 GGally パッケージに含まれる、ggsurv関数がある。

https://cran.r-project.org/web/packages/GGally/GGally.pdf

自分でggsurv関数を入れ込みたい場合は以下を参照。

www.r-statistics.com

上記から転載。

ggsurv <- function(s, CI = 'def', plot.cens = T, surv.col = 'gg.def',
                   cens.col = 'red', lty.est = 1, lty.ci = 2,
                   cens.shape = 3, back.white = F, xlab = 'Time',
                   ylab = 'Survival', main = ''){
 
  library(ggplot2)
  strata <- ifelse(is.null(s$strata) ==T, 1, length(s$strata))
  stopifnot(length(surv.col) == 1 | length(surv.col) == strata)
  stopifnot(length(lty.est) == 1 | length(lty.est) == strata)
 
  ggsurv.s <- function(s, CI = 'def', plot.cens = T, surv.col = 'gg.def',
                       cens.col = 'red', lty.est = 1, lty.ci = 2,
                       cens.shape = 3, back.white = F, xlab = 'Time',
                       ylab = 'Survival', main = ''){
 
    dat <- data.frame(time = c(0, s$time),
                      surv = c(1, s$surv),
                      up = c(1, s$upper),
                      low = c(1, s$lower),
                      cens = c(0, s$n.censor))
    dat.cens <- subset(dat, cens != 0)
 
    col <- ifelse(surv.col == 'gg.def', 'black', surv.col)
 
    pl <- ggplot(dat, aes(x = time, y = surv)) +
      xlab(xlab) + ylab(ylab) + ggtitle(main) +
      geom_step(col = col, lty = lty.est)
 
    pl <- if(CI == T | CI == 'def') {
      pl + geom_step(aes(y = up), color = col, lty = lty.ci) +
        geom_step(aes(y = low), color = col, lty = lty.ci)
    } else (pl)
 
    pl <- if(plot.cens == T & length(dat.cens) > 0){
      pl + geom_point(data = dat.cens, aes(y = surv), shape = cens.shape,
                       col = cens.col)
    } else if (plot.cens == T & length(dat.cens) == 0){
      stop ('There are no censored observations')
    } else(pl)
 
    pl <- if(back.white == T) {pl + theme_bw()
    } else (pl)
    pl
  }
 
  ggsurv.m <- function(s, CI = 'def', plot.cens = T, surv.col = 'gg.def',
                       cens.col = 'red', lty.est = 1, lty.ci = 2,
                       cens.shape = 3, back.white = F, xlab = 'Time',
                       ylab = 'Survival', main = '') {
    n <- s$strata
 
    groups <- factor(unlist(strsplit(names
                                     (s$strata), '='))[seq(2, 2*strata, by = 2)])
    gr.name <-  unlist(strsplit(names(s$strata), '='))[1]
    gr.df <- vector('list', strata)
    ind <- vector('list', strata)
    n.ind <- c(0,n); n.ind <- cumsum(n.ind)
    for(i in 1:strata) ind[[i]] <- (n.ind[i]+1):n.ind[i+1]
 
    for(i in 1:strata){
      gr.df[[i]] <- data.frame(
        time = c(0, s$time[ ind[[i]] ]),
        surv = c(1, s$surv[ ind[[i]] ]),
        up = c(1, s$upper[ ind[[i]] ]),
        low = c(1, s$lower[ ind[[i]] ]),
        cens = c(0, s$n.censor[ ind[[i]] ]),
        group = rep(groups[i], n[i] + 1))
    }
 
    dat <- do.call(rbind, gr.df)
    dat.cens <- subset(dat, cens != 0)
 
    pl <- ggplot(dat, aes(x = time, y = surv, group = group)) +
      xlab(xlab) + ylab(ylab) + ggtitle(main) +
      geom_step(aes(col = group, lty = group))
 
    col <- if(length(surv.col == 1)){
      scale_colour_manual(name = gr.name, values = rep(surv.col, strata))
    } else{
      scale_colour_manual(name = gr.name, values = surv.col)
    }
 
    pl <- if(surv.col[1] != 'gg.def'){
      pl + col
    } else {pl + scale_colour_discrete(name = gr.name)}
 
    line <- if(length(lty.est) == 1){
      scale_linetype_manual(name = gr.name, values = rep(lty.est, strata))
    } else {scale_linetype_manual(name = gr.name, values = lty.est)}
 
    pl <- pl + line
 
    pl <- if(CI == T) {
      if(length(surv.col) > 1 && length(lty.est) > 1){
        stop('Either surv.col or lty.est should be of length 1 in order
             to plot 95% CI with multiple strata')
      }else if((length(surv.col) > 1 | surv.col == 'gg.def')[1]){
        pl + geom_step(aes(y = up, color = group), lty = lty.ci) +
          geom_step(aes(y = low, color = group), lty = lty.ci)
      } else{pl +  geom_step(aes(y = up, lty = group), col = surv.col) +
               geom_step(aes(y = low,lty = group), col = surv.col)}
    } else {pl}
 
 
    pl <- if(plot.cens == T & length(dat.cens) > 0){
      pl + geom_point(data = dat.cens, aes(y = surv), shape = cens.shape,
                      col = cens.col)
    } else if (plot.cens == T & length(dat.cens) == 0){
      stop ('There are no censored observations')
    } else(pl)
 
    pl <- if(back.white == T) {pl + theme_bw()
    } else (pl)
    pl
  }
  pl <- if(strata == 1) {ggsurv.s(s, CI , plot.cens, surv.col ,
                                  cens.col, lty.est, lty.ci,
                                  cens.shape, back.white, xlab,
                                  ylab, main)
  } else {ggsurv.m(s, CI, plot.cens, surv.col ,
                   cens.col, lty.est, lty.ci,
                   cens.shape, back.white, xlab,
                   ylab, main)}
  pl
}

Pubmedで文献検索

文献検索には型がある

ネット上で色々と教材が有るので、貼り付けておきます。

20170424_PubMedの使い方@洛和会音羽病院

http://www.lib.m.u-tokyo.ac.jp/manual/pubmedmanual.pdf

http://www.med.lib.keio.ac.jp/pdf/ug/ug_pubmed.pdf

http://www.kulib.kyoto-u.ac.jp/modules/refguide/docs/RefGuide_PubMed_basic.pdf

  • The SPELL

EBM資料集−最もシンプルで分かりやすいPubMed 検索法 [The SPELL]

  • 東大 小出先生

文献検索とCritical Reading

  • editage

若手研究者のためのシステマティックレビューの書き方指南 | Editage Insights

Pubmedはいろいろと気を利かしてくれるのですが、その気配りの仕組を知り、MeSH termを用い、型通りに検索するのが大切です。
(MeSH termとは、Medical Subject Headingsの略)

胃のことをstomachという論文もあれば,gastricという論文もあるでしょう.癌についても同様で,cancerという論文もあるでしょうし,adenocarcinomaという論文もあります.これでは,思いついた単語だけでなく似たような単語を全部入れてみないと肝心な論文が漏れてしまう可能性があります.また逆に,この研究で肺癌の患者は除いた,という記述があるだけで検索されてしまいます.こうした不都合をなくすため,胃癌なら胃癌という語句は何か統一したキーワードを登録して検索を容易にしようという工夫がなされています.このキーワードがMeSH termであり,MeSH termを用いることで効率よく検索ができるのです.実際には胃癌は,Stomach neoplasmsというMeSH termで登録されています.(The SPELLより引用)

調べた方法を検索式として提示できるようにし、網羅的で再現性のある検索を心がけましょう。

すべては再現性です!

グラフ理論

読んだ。

1章 グラフの基礎
2章 最小全域木
3章 最短経路問題
4章 オイラー回路とハミルトン閉路
5章 グラフの彩色
6章 最大流問題
7章 マッチング

グラフ理論の入門編としておすすめできる。

私が入門編の書物に求める要素

1. 読みやすい

具体例とともに簡潔に示されている。

2. 用語が明記されている

次の段階も学ぶことを考えると、英語でも併記されていることがベスト。用語がわかれば検索できる。

3. 何となく見渡せる

体系的、というと怒られるかもしれないが、簡潔に、かつ、その分野の雰囲気がわかるものがベスト。

本書は三拍子揃っていた。

大腸がんスクリーニング (Colorectal Cancer Screening)

Colorectal Cancer Screening に関する書籍をざっと読んだ。大腸がんのスクリーニングが焦点。分子生物学的な観点も含めて記述してあって知識の確認になった。

  1. Colorectal Cancer Pathways
    Petr Protiva
  2. Risk Factors and Screening for Colorectal Cancer
    Joseph C. Anderson
  3. Hereditary Adenomatous Colorectal Cancer Syndromes
    Maqsood Khan and Carol A. Burke
  4. Screening and Surveillance Guidelines
    Robert J. Chehade and Douglas J. Robertson
  5. Barriers to Colorectal Cancer Screening: Patient, Physician, and System Factors
    Catherine R. Messina
  6. Screening for Colorectal Cancer Using Colonoscopy
    Douglas K. Rex
  7. New Colonoscopic Technologies for Colorectal Cancer Screening
    Douglas K. Rex
  8. Screening for CRC Using CT Colonography
    Brooks D. Cash
  9. Noninvasive Screening Tests
    Nabil Fayad and Thomas F. Imperiale
  10. Removal of Difficult Colon Polyps
    Jerome Waye
  11. Screening for Colorectal Cancer in the Elderly
    Charles J. Kahi
  12. Chemoprevention
    Jeffrey Singerman and Petr Protiva