使用ggplot绘制方差和方差置信区间的图表

3

考虑标准数据集mtcars中的变量gearqsec

require(ggplot2)
ggplot(mtcars, aes(x=gear, y=qsec)) + geom_point()

enter image description here

我想要绘制每个组的内部方差,并带有误差线。

这是我目前的解决方案(使用95%置信区间来绘制误差线):

require(data.table)
dtmtcars = data.table(mtcars)[,list(var.qsec = var(qsec)),by=list(gear)]
samplesize = sapply(unique(mtcars$gear), function(x) nrow(subset(mtcars, gear == x)))
high.EB =  ((samplesize-1)*dtmtcars$var.qsec)/qchisq(0.025,n-1)
low.EB = ((samplesize-1)*dtmtcars$var.qsec)/qchisq(0.975,n-1)
ggplot(dtmtcars, aes(x=gear, y=var.qsec)) + geom_point() + geom_errorbar(aes(ymin=low.EB, ymax=high.EB))

enter image description here

有没有更简单的解决方案(比如ggplot2中已经实现的函数)?如果没有,能否确认我的解决方案是正确的?


令人惊奇的是,尽管只有5个观测值,但gear==5具有最窄的置信区间。 - Khashaa
哦,你说得对。我意识到在“我的解决方案”中犯了一个错误。samplesize 对所有组都是相等的。现在我已经更改了它。谢谢!现在它看起来正确吗?你知道更好的解决方案吗? - Remi.b
1个回答

3

使用stat_summary。请注意,文档中的错误在于它说fun.data应该“以数据框作为输入”。

ggplot(mtcars, aes(x=gear, y=qsec)) + 
  stat_summary(fun.y = var, geom = "point") +
  stat_summary(fun.data = function(y) {
    data.frame(y = var(y),
               ymin = ((length(y)-1)*var(y))/qchisq(0.025,length(y)-1),
               ymax = ((length(y)-1)*var(y))/qchisq(0.975,length(y)-1))
  }, geom = "errorbar") +
  ylab("var.qsec")

resulting plot


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接