geom_abline が ggplot のファセットでどのように機能するかを理解しようとしています。
学生のテストスコアのデータセットがあります。これらは、4 つの列を持つデータ テーブル dt にあります。
student: unique student ID
cohort: grouping factor for students (A, B, … H)
subject: subject of the test (English, Math, Science)
score: the test score for that student in that subject
目標は、コホートを比較することです。次のスニペットは、サンプル データセットを作成します。
library(data.table)
## cohorts: list of cohorts with number of students in each
cohorts <- data.table(name=toupper(letters[1:8]),size=as.numeric(c(8,25,16,30,10,27,13,32)))
## base: assign students to cohorts
base <- data.table(student=c(1:sum(cohorts$size)),cohort=rep(cohorts$name,cohorts$size))
## scores for each subject
english <- data.table(base,subject="English", score=rnorm(nrow(base), mean=45, sd=50))
math <- data.table(base,subject="Math", score=rnorm(nrow(base), mean=55, sd=25))
science <- data.table(base,subject="Science", score=rnorm(nrow(base), mean=70, sd=25))
## combine
dt <- rbind(english,math,science)
## clip scores to (0,100)
dt$score<- (dt$score>=0) * dt$score
dt$score<- (dt$score<=100)*dt$score + (dt$score>100)*100
以下は、95% CL のコホートごとの平均スコアを、被験者ごとに分割して表示し、(geom_abline を使用して) (青の破線) 参照線を含みます。
library(ggplot2)
library(Hmisc)
ggp <- ggplot(dt,aes(x=cohort, y=score)) + ylim(0,100)
ggp <- ggp + stat_summary(fun.data="mean_cl_normal")
ggp <- ggp + geom_abline(aes(slope=0,intercept=mean(score)),color="blue",linetype="dashed")
ggp <- ggp + facet_grid(subject~.)
ggp
問題は、基準線 (geom_abline から) がすべてのファセットで同じであることです (= すべての学生とすべての科目の総平均スコア)。そのため、stat_summary は facet_grid で暗示されたグループ化 (たとえば、件名による) を尊重しているように見えますが、abline はそうではありません。誰でも理由を説明できますか?
注意: この問題は、グループ平均の別のテーブルを作成し、それを geom_abline (以下) のデータ ソースとして使用することで解決できることを認識していますが、なぜこれが必要なのですか?
means <- dt[,list(mean.score=mean(score)),by="subject"]
ggp <- ggplot(dt,aes(x=cohort, y=score)) + ylim(0,100)
ggp <- ggp + stat_summary(fun.data="mean_cl_normal")
ggp <- ggp + geom_abline(data=means, aes(slope=0,intercept=mean.score),color="blue",linetype="dashed")
ggp <- ggp + facet_grid(subject~.)
ggp