5 対応ありパラメトリック群間差
#basic
繰り返しのある一元配置分散分析(repeated one-way ANOVA)です。
以下のようなグラフを描きます。
グラフの描き方としては、3 ノンパラ対応ありでの同一個体データを線で繋ぐ方法と、4 対応のないパラメトリック群間差での平均値±SEMの表示の仕方の合わせ技となります。このページから見てしまうと難しいかもしれませんが、前の章も読んでくれていればどんな関数をどんな目的で使っているかも分かると思います。
https://scrapbox.io/files/63879cbf952e680022c7d301.png
また、反復測定の一元配置分散分析と二元配置以上の分散分析では、僕はANOVA君を使うことにしています。
ANOVA君 http://riseki.php.xdomain.jp/index.php?ANOVA君
作成者の井関先生の上記サイトからDLして読み込んで使います。
Rパッケージ化されたものではありませんが、使い勝手が良く、統計にお詳しい日本の研究者からも評判が良い印象です。
全体のscriptは以下です。
code:r
#---------- preparation in advanca 事前準備--------------------------------------------------
# Install packages if not installed 必要なパッケージが無けれな自動でインストール-----
if(!require("tidyverse")) install.packages("tidyverse")
if(!require("dplyr")) install.packages("dplyr")
if(!require("ggplot2")) install.packages("ggplot2")
if(!require("ggfortify")) install.packages("ggfortify") #先に直接.tar.gzの圧縮fileをCRANからDLしてRstudioのPackgesウィンドウからインストール
# clear R's brain 一度参照したリストもしくは変数を次の作業で消す-----
rm(list = ls())
# Load libraries 必要なパッケージの読み込み-----
library(tidyverse)
library(dplyr) #データ整形に使う
library(ggplot2)
library(ggfortify) #needed for autoplot()
# Data input 今後以下のパスからデータを自動で読み込みする場合-----
library(readr)
CanRsample <- read.csv(file.choose()) #Run and choose CanRsample2021.csv
#ここを実行(Run)するとfile選択画面になるので、どのfileを読み込んだか上に記録!
#横長データをtidyデータに変換したものも予め作っておく(多重比較や作図に便利)
CanRsample_tidy <- gather(CanRsample, key = "Season", value = "aveTemp", aveTemp_SpAut, aveTemp_summer, aveTemp_winter)
#keyは新しく作る列名(カテゴリカル変数名)、valueは値の新しい列名、その後に続くのが縦長に並べ替えたい列名
# # ----------prep done 準備だん------------------------------------------------------------
#【5】comparison of means within 平均値の比較 個体内----------------------------
#--データの分布など確認(診断プロット)--
aveTempEach.lm <-lm(aveTemp ~ Season, data = CanRsample_tidy)
autoplot(aveTempEach.lm, smooth.colour = NA) #ANOVAとか線形モデルを使う前提の診断プロット
#【注意】IDが同一なら反復測定であることを指定できてないので適切なやり方ではかもしれない
source(file.choose()) #"anovakun_489.txt" を読み込み
anovakun(dplyr::select(CanRsample, aveTemp_SpAut, aveTemp_summer, aveTemp_winter), "sA", Season = c("SpAut", "Summer", "Winter"), holm = T, peta = T)
#2--群でpaired t'testしたいとき--
t.test(CanRsample$aveTemp_year, CanRsample$aveTemp_summer, paired=T)
#--1wayCol <- #一元配置系within色付き--
ggplot(CanRsample_tidy, aes(x = Season, y = aveTemp)) +
geom_line(aes(group = ID_town, colour = place), alpha = 0.5) +
#geom_jitter(shape = 21, size = 4, aes(fill = place), width = 0.2, alpha = 0.7) +
geom_point(size = 4, aes(colour = place), alpha = 0.7) + #alphaはdotの透明度、縦一直線のdot
#データセットと使用する変数の指定、colour:群ごとにdotの色を変える
#scale_fill_manual(values = c (Sendai = "deepskyblue3", Tokyo = "gray1", Kagoshima = "orange" )) +
#dotの色をRで自動指定したい場合上記関数を消す
scale_color_manual(values = c (Sendai = "deepskyblue3", Tokyo = "gray1", Kagoshima = "orange" )) +
#個体を繋ぐ線の色をRで自動指定したい場合上記関数を消す
stat_summary(fun.y = mean, geom = "crossbar", colour = "black", width = 0.4) + #棒グラフにしたい場合はcrossbarをbarに変える
stat_summary(fun.data = mean_se, geom = "errorbar", colour = "black", width = 0.2) + #widthは横線の長さ
xlab("季節") + #X軸のラベル
ylab("季節ごとの平均気温") + #Y軸のラベル
#ylim(max, min) + #Y軸の(最大値, 最小値)を指定する場合は記入して先頭の#を消す
ggtitle("【5】comparison of means within 平均値の比較 個体内") +
#coord_flip() + #XとYの入れ替えに使う
theme_classic(base_size = 22, base_family = "HiraKakuProN-W3") # white backgrond グラフの背景を白に
#theme(legend.position = "none") #凡例を消したい時は#を消して上のcodeの最後に+を足して有効にする
【統計について】
csvを読み込む時と同じように、ANOVA君のtxtファイルを読み込むコードを書いてあります。2024年3月現在の最新版を読み込んでいます。その後、分散分析をしてくれる anovakun() に対してデータファイルのオブジェクトからダイレクトにデータを読み込むためのコードを書いてあります。select()関数の使い方がピンと来ない人はググって見て下さい。
詳しくは、公式の「ANOVA君の使い方」のページを見て欲しいのですが、
http://riseki.php.xdomain.jp/index.php?ANOVA君/ANOVA君の使い方
このページのスクリプトでは、データのオブジェクトから使いたい列を取り出して、変数名と水準名を任意に命名できるように、僕が良い感じに整えている感じです。anovakun() で指定するデータオブジェクトは、使うデータのみが過不足なく配置されているオブジェクトじゃないといけないようなので、データのオブジェクトを指定する箇所に
dplyr::select(データのオブジェクト, 水準1となる列名, 水準2となる列名, 水準3となる列名)
というカタチで書きました。ちなみに、dplyr::としているのは、selectという関数が、dplyrパッケージ以外にも存在するために、Rがときおり正しく挙動しなくなることがあるためです(ちゃんと動くこともあるんですが)。「パッケージ名::関数名」と書くと、使いたい関数を迷いなくRに指定することができる、そんな書き方です。
もう1つ、ANOVA君の要因の指定の方法について、簡単に。
anovakun(データのオブジェクト, "XsX", 水準の指定)という感じで書いていくわけですが、データの次に指定している "XsX" の部分が、データの構造の指定の仕方です。
sの左が参加者間要因、sの右が参加者内要因です。
【between】s【within】
です!
今回は、1要因でwithinなので、"sA" と指定しています。
被験者間 x 被験者内 のtwo-way なら "AsB"と指定するわけです。
さて、繰り返しのある一元配置分散分析の結果は有意です。後検定まで一気にやってくれます。
その後に、個別の2条件間で対応のあるt検定をするためのコードも、一応書きました。
【グラフ描画】
上述の通り、3 ノンパラ対応ありと4 対応のないパラメトリック群間差の合わせ技なので、特に解説はいらないかなと思います。3 ノンパラ対応ありでやったグラフから geom_boxplot() を消して、その上で、4 対応のないパラメトリック群間差でやったように stat_summary() で平均値±SEMを表示させています。
以下に、モノクロ版、平均値を記さずに線を引くだけ、など、ちょっとした改変verのスクリプトも置いておきます。
https://scrapbox.io/files/63879ccaa060c20020089b92.png
code:r
#【5_2】1wayMono <- #一元配置系withinモノクロ
ggplot(CanRsample_tidy, aes(x = Season, y = aveTemp)) +
geom_line(aes(group = ID_town), color = "grey", alpha = 0.5) +
#geom_jitter(shape = 21, size = 4, color = "black", width = 0.2, alpha = 0.7) +
geom_point(size = 4, color = "grey", alpha = 0.8) + #alphaはdotの透明度、縦一直線のdot
#データセットと使用する変数の指定、colour:群ごとにdotの色を変える
stat_summary(fun.y = mean, geom = "crossbar", colour = "black", alpha = 0.8, width = 0.4) + #棒グラフにしたい場合はcrossbarをbarに変える
stat_summary(fun.data = mean_se, geom = "errorbar", colour = "black", width = 0.2) + #widthは横線の長さ
xlab("季節") + #X軸のラベル
ylab("季節ごとの平均気温") + #Y軸のラベル
#ylim(max, min) + #Y軸の(最大値, 最小値)を指定する場合は記入して先頭の#を消す
ggtitle("【5_2】1wayMono withinモノクロ") +
#coord_flip() + #XとYの入れ替えに使う
theme_classic(base_size = 22, base_family = "HiraKakuProN-W3") # white backgrond グラフの背景を白に
#theme(legend.position = "none") #凡例を消したい時は#を消して上のcodeの最後に+を足して有効にする
https://scrapbox.io/files/63879d61995115001dfdb802.png
code:r
#【5_3】simple within-comparison only line  個体内比較 同一個体に線を引くだけ----------------------------
ggplot(CanRsample_tidy, aes(x = Season, y = aveTemp, group = ID_town))+ #groupにIDを指定するのが線を引くポイント
#データセットと使用する変数の指定、1つのBoxのドットに複数の色指定したい時はaes内に "colour = 変数名" を追加
geom_line(alpha = 0.5, aes(color = place)) + #alphaはdotの透明度
geom_point(shape = 21, size = 4, aes(fill = place), width = 0.2, alpha = 0.7) +
#geom_point(size = 4, aes(color = Grazing), alpha = 0.9) + #alphaはdotの透明度
scale_fill_manual(values = c (Sendai = "deepskyblue3", Tokyo = "gray1", Kagoshima = "orange" )) +
#dotの色をRで自動指定したい場合上記関数を消す
scale_color_manual(values = c (Sendai = "deepskyblue3", Tokyo = "gray1", Kagoshima = "orange" )) +
#個体を繋ぐ線の色をRで自動指定したい場合上記関数を消す
ggtitle("【5_3】同一個体に色付きで線を引くだけ") +
#coord_flip() + #XとYの入れ替えに使う
theme_classic(base_size = 18, base_family = "HiraKakuProN-W3") # white backgrond グラフの背景を白に
#theme(legend.position = "none") #凡例を消したい時は#を消して上のcodeの最後に+を足して有効にする