須通り
Sudo Masaaki official site
For the reinstatement of
population ecology.

ホーム | 統計 Top | 生物系学生のための統計解析の学び方(02実践編)

準備編に引き続き、大学で生物系の研究室に入ったばかりの学部生・修士過程学生が統計解析で夜な夜な悪さする方法を考える。

生物系学生のための統計解析の学び方(02実践編):目次

実験に先立って統計学を勉強しないという選択肢

のっけから暴論をぶちまけてみる。

パソコン時代の統計解析では、「原理は未勉強だけど名前は知ってる」解析手法を「ひとまず使ってみる」ことも可能だ。筆者の師匠世代あたりまでの研究者には、これは完全にNGな態度と看做されていたようである。ところが21世紀のコンピュータ環境が、以下の通り状況を変えてしまった。

  • 解析手法の選択肢がとにかく増えた。
  • 個々の手法が複雑化し、お勉強するだけで時間が掛かる。

最早、数学専攻ではない学生が、関連分野で使われるかもしれない全手法の数学的背景を予め理解してから研究を始めるのは困難になってきた。もちろん、技術進歩に伴うメリットもある。

  • ネット上のチュートリアルやサンプルデータを活用することで、各手法を用いるべき「シチュエーション」が手軽に感じ取られるようになった。

そこで発想を転換し、先に実験計画を組んでから、その過程で必要となりそうな統計解析をレビューする

もちろん、最終的に採用した解析手法についてはしっかり勉強すべきだし、最低限その手法が、目的とする分析やデータ形式に対して有効である根拠を説明できねばならない。さもないと、研究室のセミナーや論文の査読において火達磨になる(それはもう華麗に炎上する)。

さて、行き当たりばったりの実験計画を組むにあたって、心掛けるべきは何だろう?最低限、以下の項目をはっきりさせておけば、後から強引に解析を進めることは可能である。

  1. 実験結果について具体的に計測される項目(すなわち目的変数)が「個数」であるか、「大きさ(長さ、重さ)」であるか、それとも割合(選択の結果)であるかをはっきりさせておく。
  2. 割合のデータについては、可能であれば「選んだ」「選ばなかった」の2通りに結果が決まるような実験デザインにする。3通り以上の選択肢でも解析は不可能ではないが、面倒くさい。
  3. 実験結果に影響を与えるであろう要因(すなわち説明変数)は、なるべく少なくした方が解析しやすい。たとえば1要因(例:男or女)の実験デザインは、2要因(例:男or女 × 日本人orアメリカ人)の実験デザインよりも結論を導きやすい。3要因以上(例:男or女 × 日本人orアメリカ人 × こどもorおとな)の実験デザインは解析が難しいので、可能ならば実験を分けて実施する。

「解析ノート」のすすめ

この項目は、本ページに掲載されている情報の中で唯一、万人に実践をお勧めする。

「解析ノート」とは要するに、解析を実践(あるいは統計手法を勉強)したとき、その記録を文書化したものである。実験をやったら実験ノートをつけなさいと、指導教員に言われたことがあるだろう。これを解析についても行う。ただし統計処理はデータを扱うものだから、解析ノートは基本的に紙ではなく電子データの形を取るのが便利だ。

解析ノートを作る意義

  1. 過去に自分が行った解析の記録として、あるいは純粋に想ひ出として残せる。
  2. 前項に附随して、自分がその実験を行い、結果を解析したという証拠が(少なくとも電子的には)残る
  3. 解析にあたり参考にした教科書やWebページへのリンクと感想、当日の天気、小っ恥ずかしいポエムの切れ端など、可能な限りその場所にコメントとして残す。これにより関連情報を1つの文書へ集約できると共に、エピソード単位で記憶を強化でき、学習効率を著しく向上させる。
  4. 反復を増やしたときや、手法を変えて再解析するときに、そこからコマンドをコピペすれば容易に手順を再現できる
  5. 以前やったものと類似の解析手法を試す際に、ひな型として使用できる
  6. Rのコンソール上でゼロからコマンドを打ち込むよりも、ノート上で案を練ってからRコンソールにコピペした方が、打ち間違いがあった際のやり直しが利く

記録を取ることで、経験値をそのまま将来の自分へ引き継げる。結果として作業効率を上げるとともに、思考の整理に繋がる。つまるところ解析ノートの作成とは、経験した解析手順を、自らマニュアル化し資産化する行為に他ならない。それは誰にも奪えない(わけでもないけど)君自身の宝となるのだ。

解析ノートのデータ形式

で、結局どんな形で作ればいいのさという話。基本的には、簡潔なテキストファイル形式で保存するのが望ましい。ところがプレーンテキスト(txt)だと、フォントの色を一部分だけ変化させるような処理ができないから、少なくともメモ部分とRコマンド本体を見栄え上区別したければ、リッチテキスト等を使うことになる。

MacOS Xならば.rtfd(添付書類付きリッチテキスト)を使うのが超絶的に便利。通常のリッチテキスト同様にフォントサイズや色を変えられるのはもちろん、Rから出力したfigureのPDFファイルを、なんとベクトルデータを保持したままドラッグ&ドロップして文書に貼れる。惜しむらくはWindowsで開けない点だ。まあWindows派のあなたは、画像を貼れないことを承知で通常のリッチテキストに留めておくか、Word文書を使うと良いですね。

他の方法として、R用のIDE(統合開発環境)であるRStudioと、Rの拡張機能であるknitrを連携させることにより、ノートをHTML形式で管理し、その一部をRコマンドとして実行させることが可能。

解析ノートの実例

何はともあれ、筆者が使っている「解析ノート」の典型を以下に示す。

(ファイル名 "20131352アフリカゾウ卵発育速度と温度.rtfd")

2013年13月52日

「アフリカゾウの卵発育速度に対する温度の影響」

(概要)
昨年エジプトで採集してきたアフリカゾウ雌個体が産んだ卵について、10℃から35℃まで5℃刻みの恒温条件における発育速度を調べた。ハダニ同様、アフリカゾウも変温動物に違いない。俺の仮説を嘲笑った東京の連中に、今度こそ一泡吹かせてやるんだ。

##まず、設定温度(単位:℃)と実測卵期間(単位:日)のデータを入力する
(※このデータはでっちあげです)

Temperature <- c( rep(10,6), rep(15,6), rep(20,6), rep(25,6), rep(30,6), rep(35,6) )
Duration <- c(53,48,50,48,53,48, 16,16,15,15,16,15, 9,8,8,9,9,9, 6,5,6,6,6,6, 4,5,4,4,5,4, 4,4,4,4,4,5)

##データフレームにまとめて、さらに発育速度(卵期間の逆数)を格納しておく

zousan <- data.frame( Temp = Temperature, Dura = Duration )
zousan$Rate <- 1 / zousan$Dura

##ひとまずデータの要約

summary(zousan)

      Temp           Dura            Rate        
 Min.   :10.0   Min.   : 4.00   Min.   :0.01887  
 1st Qu.:15.0   1st Qu.: 4.75   1st Qu.:0.06563  
 Median :22.5   Median : 7.00   Median :0.14583  
 Mean   :22.5   Mean   :14.75   Mean   :0.14126  
 3rd Qu.:30.0   3rd Qu.:15.25   3rd Qu.:0.21250  
 Max.   :35.0   Max.   :53.00   Max.   :0.25000  

##温度と発育速度の関係をあらわす散布図の作成

sunflowerplot( Rate ~ Temp, data = zousan, ylim = c(0,0.3) )

Scatter plot

データを見た印象としては明らかに、15℃から30℃の範囲で温度と発育速度の関係が直線に乗る。いっぽう、35℃の発育速度が横ばいになっている。30℃あたりに発育上限温度があるのでは?

/////////////////////////////////////////

さて、15℃から30℃までのデータのみを用いて回帰分析を行い、ゾウの卵の発育速度が温度で説明されることを示す。
今回は35℃のデータは明らかに直線から外れるもの、とみなす。恣意的に判断するのが気持ち悪い人はこちらを参照

lm.zousan <- lm( Rate ~ Temp, data = zousan[ zousan$Temp<35, ] )
summary(lm.zousan)

Call:
lm(formula = Rate ~ Temp, data = zousan[zousan$Temp < 35, ])

Residuals:
      Min        1Q    Median        3Q       Max 
-0.028029 -0.007940 -0.001094  0.006287  0.025393 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.0925070  0.0074523  -12.41 6.67e-13 ***
Temp         0.0106845  0.0003513   30.41  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01361 on 28 degrees of freedom
Multiple R-squared:  0.9706,	Adjusted R-squared:  0.9696 
F-statistic:   925 on 1 and 28 DF,  p-value: < 2.2e-16

まあ見ての通り直線で回帰され、発育速度のばらつきの97%程度が温度の影響で説明されることになる。このとき

  • 回帰式(y=a+bt)においてa=-0.0925070、b=0.0106845、ただしtは温度(単位℃)
  • 発育零点は-a/bなので、8.658056(単位℃)
  • 有効積算温度定数は1/bなので、93.59352(単位日度)

注意点

  • 最初に日付と、やったことを一言で表すタイトルを記す。フォントサイズを大きくする等して、なるべく見出しは目立つように
  • 次いで用いたデータの出所ないし入力方式を記録。その直後に必ず要約統計(Rの場合、summary関数やxtabs関数など使う)を行う。
  • 複雑なデータであれば可能な限り図示を試みる。要約統計のセクションに散布図などを置いておく。
  • 解析(検定ないし統計モデリング)について、その目的、手順(用いたコマンド)、および結果を具体的に記述する。
  • 可能ならば統計ソフトに直接読み込ませたコマンド部分は色を変える。

最初にグラフを描く習慣を付けよう

上の「解析ノート」の項目でも示したように、データを取り込んだ直後に一度、グラフを描いておく。これによりデータの傾向を把握した上で、解析の方針を立てられるようになる。上のゾウの例でも、35℃での卵発育速度が横ばいになることは、散布図を描いてはじめて分かる情報だ。これを無視して全域で直線回帰を行えば、良好な当てはまりを得られなかっただろう。

最初に描くグラフの種類の選び方。まあ外部に出すものではないから適当で良いが、生データの分布の型が見て取れ、かつ複雑なオプション無しで簡単に描画できるコマンドが好ましい。個人的には、以下のような作画関数から好きなものを選んで使っている。

plot( Rate ~ Temp, data = zousan, ylim = c(0,0.3), type= "p" )

Scatter plot

散布図

/////////////////////////////////////////

sunflowerplot( Rate ~ Temp, data = zousan, ylim = c(0,0.3) )

Sunflower plot

ヒマワリ図

/////////////////////////////////////////

boxplot( Rate ~ Temp, data = zousan, ylim = c(0,0.3) )

Box plot

箱ひげ図