Rによるデータ解析(その3)ggplot2による折れ線グラフの作成方法

日付;2022/07/15(土)
Rによるデータ解析(その3)

Rを使っていて便利だと思うことが、時系列のデータ解析だと思う。リアルタイムでデータの推移を見るという目的にはもしかしたら向いてないかもしれない(自分が知らないだけだと思う。)が、2,3日毎に取得してモニターする様な、例えば腫瘍系や増殖能の評価には非常に優れた方法だと思う。エクセルでは、いちいちグループを手作業でまとめて、よくわからんフォーマットで平均値と標準偏差を計算して、それは生データとは別のシートにコピーしてとか、非常にかったるい作業をしなくてはならない。最悪それをマウス毎にやるとか、別の作業が加われば、また同じような労力でショウもないグラフを必要がある。そして、データというか、そういうのが多くなると、必ずスタックするソフトがエクセルである。Rならば、慣れてくれば簡単に書けるようになり、一度書いたらそれを流せば、全く同じデータがパッと出る。少なくとも、どのデータのコピーをミスったとか、計算を間違えていた、とかエクセルで起こりがちなエラーはない。また、最近のハイインパクトなジャーナルでは個体ごとのデータも示す必要がある場合があり、そういった作業でエクセルやGraphPad Prism(使ったことないけど。でもわかる。)を使っていては時間がいくらあっても足りない。GraphPad Prismについては、別の問題として統計がめちゃくちゃ怪しいといった問題点もある。

そういうことなので、ここではggplot2を使って平均値と標準偏差を加えた折れ線グラフの書き方について記す。

必要なライブラリ

library(tidyverse)

平均値と標準偏差を計算する。

下記は、OriginalDataSetというデータセットの、tumor_volumeとbody_weightの平均値と標準偏差を、Days毎に計算し、Mean_tumor_volume、sd_tumor_volume、Mean_body_weight、SD_body_weightという列を新しく作るというコードである。

NewDataSet_Mean_SD <- OriginalDataSet %>% group_by(Days) %>%
  summarise(
    Mean_tumor_volume = mean(tumor_volume),
    sd_tumor_volume = sd(tumor_volume),
    Mean_body_weight = mean(body_weight),
    SD_body_weight = sd(body_weight))

もし、これをマウス毎にやる必要があるなら、以下のように新しくマウスの種類の入れた列を追加しておけば、後々、全データを結合したときに分類できるので便利だと思う。どんな場合でも、それが識別できるタグの様なデータがあれば、ミスったとしてもなんとかそのミスを見つけることができる。

NewDataSet_Mean_SD <- OriginalDataSet %>% group_by(Days) %>%
  summarise(
    Mean_tumor_volume = mean(tumor_volume),
    sd_tumor_volume = sd(tumor_volume),
    Mean_body_weight = mean(body_weight),
    SD_body_weight = sd(body_weight)) %>% mutate(Species == "NSG")

ggplot2を使って折れ線グラフを書く。

以下はggplot2を使った平均値、標準偏差の時間経過的な折れ線グラフである。基礎生物学では、以下のように折れ線毎にどのデータセットを使うか指定してやっても良いように思う。ggplot2は、なんかそういったグラフを書くための文法的なものに則って書かれているようだが、正直に言えばすごく見難い。文法を使ってくれるのはいいが、グラフの見た目と関数名がマッチしていないように思う。兎にも角にもわかりにくい。自分なりにわかりやすくラベルするか、このように全部指定するくらいのほうが、わかりやすいように思う。

ggplot()+
geom_point(mapping = aes(Days, Mean_tumor_volume, group = 1), data = NewDataSet_Mean_SD1, size = 3, color = "blue") +
geom_point(mapping = aes(Days, Mean_tumor_volume, group = 1), data = NewDataSet_Mean_SD2, size = 3, color = "orange") +
geom_line(mapping = aes(Days, Mean_tumor_volume, group = 1), data = NewDataSet_Mean_SD1, color = "blue") +
geom_line(mapping = aes(Days, Mean_tumor_volume, group = 1), data = NewDataSet_Mean_SD2, color = "orange") +
geom_errorbar(mapping = aes(x = Days, ymin=Mean_tumor_volume-sd_tumor_volume, ymax=Mean_tumor_volume+sd_tumor_volume, group = 1), data = NewDataSet_Mean_SD1, width = 0.2, color = "blue") +
geom_errorbar(mapping = aes(x = Days, ymin=Mean_tumor_volume-sd_tumor_volume, ymax=Mean_tumor_volume+sd_tumor_volume, group = 1), data = NewDataSet_Mean_SD2, width = 0.2, color = "orange") +
theme_classic()

幸い、現時点(2022年7月)の時点では、例えば棒グラフのように、グラフ上に個々のデータポイントを記せ、という指示はジャーナルから来ていないように思う。なので、上記でひとまずOKと考えている。

個々のマウスや細胞についてグラフを書く。

個々のポイントを折れ線グラフ上にプロットするよりも、個々のマウスのデータを出せと言われる可能性の方が高いかもしれない。正直、これをやったところで、特にフェアに評価できるとは思わないが、このような標準偏差の代わりに標準誤差を使っているチート研究者エセ研究者を見破ったり、実験のモニターでどのマウスのデータが可怪しいことになっているのか、それとも単に自分の測定が良くなかったのかを知ることには有効である。

これは、OriginalDataSetを使って横軸にDays、縦軸にtumor_volumeの折れ線グラフを、Mouse_ID毎に書くという意味である。

ggplot(data = OriginalDataSet, aes(x = Days, y = tumor_volume, group = 1)) +
  geom_line() +
  facet_wrap(facets = vars(Mouse_ID)) +
  theme_bw()

facet_wrap()には出力のグラフを何行、何列にするか指定する変数も用意されているので、目的に合わせてhelp(facet_wrap)を見るのも役立つ。