Я должен признать, что я весьма озадачен вашим кодом. Не воспринимайте это как личную критику, но я настоятельно советую вам научить ваших учеников максимально использовать силу R. Они могут только извлечь из этого пользу, и мой опыт показывает, что они быстрее поймут, что происходит, если я не брошу строки и строки кода в их голову.
Прежде всего, вам не нужно рассчитывать средства вручную. Просто сделай:
df.2$mean <- with(df.2,ave(value,sex.codes,variable,FUN=mean))
См. Также ?ave
. Это более ясно, чем беспорядок в вашем примере. Если у вас есть lizard.model, вы можете просто использовать
fitted(lizard.model)
и сравните эти значения со средними.
Тогда я категорически не согласен с вами. То, что вы рассчитываете, не является стандартной ошибкой вашего прогноза. Чтобы сделать это правильно, используйте функцию predict()
outcome <- predict(lizard.model,se.fit=TRUE)
df.2$CI.half <- outcome$se / 2
Чтобы получить доверительный интервал для предсказанных средних значений, вы должны использовать правильные формулы, если хотите, чтобы ваши ученики правильно поняли это. Взгляните на раздел 3.5 этой невероятно великолепной Практической регрессии и Anova с использованием R от Faraway. Он содержит множество примеров кода, где все вычисляется вручную удобным и лаконичным способом. Он будет служить вам и вашим ученикам. Я многому научился из этого и часто использую его в качестве руководства при объяснении этих вещей студентам.
Теперь, чтобы получить итоговый фрейм данных, у вас есть несколько вариантов, но этот работает и вполне понятен.
summary.df <- unique(df.2[,-c(3,5,6)])
names(summary.df) <- c('Sex','Location','Means','CI.half')
А теперь вы можете просто запустить свой код графика, как он есть.
В качестве альтернативы, если вы хотите, чтобы в ваших значениях была ошибка прогнозирования, вы можете использовать следующее:
lizard.predict <- predict(lizard.model,interval='prediction')
df.2$lower <- lizard.predict[,2]
df.2$upper <- lizard.predict[,3]
summary.df <- unique(df.2[,-3])
names(summary.df)[1:3] <- c('Sex','Location','Means')
qplot(data=summary.df,
y=Means,
x=Location,
group=Sex,
ymin=lower,
ymax=upper,
geom=c("point", "errorbar", "line"),
color=Sex,
shape=Sex,
width=0.25) + theme_bw()
PS: Если я здесь и там говорю грубо, это не предназначено. Английский не мой родной язык, и я до сих пор не знаком с тонкостями языка.