エラーバー付きのグラフ ggplot2

使用するパッケージ(パッケージのインストール

library(ggplot2)
library(ggsignif)

ファイル”ebar”をdatに格納します (ファイルの読み込み)

dat <- read.csv("ebar.csv", header = T, fileEncoding = "UTF-8")
head(dat)

列pre_postの配列を確認します

#まずはfactor変数に変換します
dat$pre_post <- as.factor(dat$pre_post)
#factor変数にすることでレベルが付与されます
levels(dat$pre_post)

このままではx軸が後→前の配列になるので入れ替えます

dat$pre_post <- relevel(dat$pre_post, ref="前") 
#確認してみます
levels(dat$pre_post)

これでx軸の準備は完了

ggplotの基本的な描き方です

(g1 <- ggplot2::ggplot(dat, aes(x = pre_post, y = value)))
(g2 <- g1 + geom_point())
(g3 <- g2 + theme_bw())

それでは実践編へ

標準誤差をエラーバーとしたグラフを描きます

pos1 <- ggplot2::position_jitterdodge(
  jitter.width  = 0,#横にずらす
  jitter.height = 0,#縦にずらす
  dodge.width   = 0.5#カテゴリで分ける
)

(g4 <- ggplot(data = dat,
  aes(
    x = pre_post,
    y = value,
    colour = treat
  )
))
(g5 <- g4 +
  geom_jitter(alpha = 0.4, position = pos1) +  #alpha重なりの濃さ
  stat_summary(aes(x = as.numeric(pre_post) + 0.07),
  fun = "mean", geom = "point", size = 3, position = pos1)
)

標準誤差(fun.data = “mean_se”)

(g6 <- g5 +#平均値のプロット
  stat_summary(aes(x = as.numeric(pre_post) + 0.07),
    fun.data = "mean_se",
    geom = "errorbar",
    width = 0.1,#ひげの横幅
    lwd = 1,#ひげの棒の幅
    position = pos1
))

95%信頼区間(fun.data = “mean_cl_normal”)

(g7 <- g5 +#平均値のプロット
    stat_summary(aes(x = as.numeric(pre_post) + 0.07),
    fun.data = "mean_cl_normal",
    fun.args = list(conf.int = 0.95),#信頼区間のときに使用する
    geom = "errorbar",
    width = 0.1,#ひげの横幅
    lwd = 1,#ひげの棒の幅
    position = pos1
  ))

標準偏差

(g8 <- g5 +
    stat_summary(aes(x = as.numeric(pre_post) + 0.07),
    fun.min=function(x) mean(x)-sd(x),
    fun.max=function(x) mean(x)+sd(x), 
    geom = "errorbar",
    width = 0.1,#ひげの横幅
    lwd = 1,#ひげの棒の幅
    position = pos1
  ))

治療Aと治療Bのそれぞれの前後差をt検定(独立した4群と仮定)

t.test(value ~ pre_post , data =dat[dat$treat=="A",])$p.value
t.test(value ~ pre_post , data =dat[dat$treat=="B",])$p.value

治療Aは有意差あり(**)、治療Bは有意差なし(N.S.)

(g9 <- g6 + 
    ggsignif::geom_signif(
        stat = "identity",
        data = data.frame(
            x = c(0.87, 1.12),
            xend = c(1.87, 2.12),
            y = c(9, 12),
            annotation = c("**", "N.S.")
            ),
        aes(
            x = x, 
            xend = xend,
            y = y,
            yend = y,
            annotation = annotation
            ),
        col = c("red","#20B2AA")
    )
) + ylim (-5,13) + theme_bw()

ダメ出し 間違い、分かりにくい部分などのご意見をお待ちします

タイトルとURLをコピーしました