今回はTwo-way ANOVAの結果を図に直接示すようなことをしたいと思います。
全ての値をannotateしていると大変なのと、Rにやってもらうことで打ち間違いも防げます。
##データ読み込み
data(iris)
head(iris) #確認
Two-way ANOVAをしたいので、今回も、例によって架空のTemperature列を入れていきます。
元から2要因あるデータを持っている場合はこれは必要ありません。
iris$Temperature <- rep(c(rep("High", 25), rep("Low", 25)), 3)
##Two-way ANOVA
#Two-way ANOVAをやる
anovasummary <- summary(aov(Sepal.Length ~ Species * Temperature, data = iris))
anovasummary <- anovasummary[[1]]
#p値を抜き出す
anovap <- as.data.frame(anovasummary[1:3,5])
#要因の名前の列を作る
anovap$factor <- as.character(row.names(anovasummary)[1:3])
#謎に要因の後ろにスペースができる場合があるので消しておく
anovap$factor <- sub(" .*", "", anovap$factor)
#交互作用のところを良い感じにしてみた。
anovap$factor <- sub(":", " × ", anovap$factor)
colnames(anovap) <- c("p-value", "factor")
#確認
head(anovap)
追記。以下の方法でもスペースを消せるようです。@dfghdfdjftyfghvgjhk様より教えていただきました。また、本題とは関係ないですがTemperature列を作った際のrep()にも、もっと簡潔に書くやり方があるようです。詳細はコメント欄を参照してください。
anovap$factor <- trimws(anova$factor)
##p値の大きさを判別し、全要因の結果を返す関数を作る
changep <- function(a) {
#p値の大きさによって、返す文字列を決める
p <- function(a) {
if (a < 0.001) {
return("p < 0.001")
} else if (a < 0.01){
return("p < 0.01")
} else if (a < 0.05) {
return("p < 0.05")
} else {
return("n.s.")
}
}
#全要因に対して上の関数を当てはめ、結果を返す
c <- NULL
for (i in 1:nrow(a)){
c <- paste0(c, "\n", a[i, 2], " : ", p(a[i, 1]))
}
return(c)
}
@dfghdfdjftyfghvgjhk様にコメントを頂き修正しました。
##ggplot2で図示
#結果入れる用の場所の確保のために、y軸の最大値より少し大きい値を格納しておく
yRoof <- max(iris$Sepal.Length)*1.2
#plot
library(ggplot2)
g <- ggplot(iris, aes(x=Species, y=Sepal.Length, fill=Temperature)) +
geom_boxplot(lwd=1.5) +
theme(panel.grid = element_blank()) +
scale_fill_manual(values = c("grey", "white")) +
labs(y="Sepal Length (cm)", x=NULL) +
theme(axis.text=element_text(size=20, face = "bold", colour = "black"),
axis.title=element_text(size=25,face="bold", colour = "black"),
axis.line = element_line(size = 1.2, colour = "black"),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.background = element_blank(),
legend.position = "none")
g <- g +
annotate("text", x=Inf, y=yRoof,
label=changep(anovap),
hjust="right",
size = 4)
#保存
ggsave("xxx.png", plot = g, width = 8, height = 8)
大きさとかは適宜調整が必要かもしれないです。
快適なggplotライフを送りたいですね。