| This post was kindly contributed by Ridículas - go there to comment and to read the full post. |

Gráfico de barras com as médias e desvios-padrões para variáveis resposta de um experimento avaliando cultivares de banana e meios de cultura em cultura de tecidos.
Em estatística descritiva é comum a síntese dos dados em medidas de posição e dispersão. As medidas mais frequentemente usadas são a média e o desvio-padrão. Não raramente, existe a necessidade de obter essas medidas separando as observações por alguma variável categórica do conjunto de dados. Nesse post apresento algumas formas de obter isso. Estou certo de que as soluções que apresento abaixo não cobrem 5% das disponíveis considerando a extensa quantidade de pacotes/funções do R ligadas à análise descritiva, portanto, considere isso apenas como um ponto de partida. Por fim, sintetizo em um gráfico os resultamos aplicados em um conjunto de dados reais. Até a próxima ridícula.
#-----------------------------------------------------------------------------
# gerando um conjunto de dados artificial
da <- expand.grid(A=1:3, B=1:2, r=1:15)
da <- cbind(da, as.data.frame(matrix(rnorm(nrow(da)*3), nrow(da))))
str(da)
#-----------------------------------------------------------------------------
# usando funções do reshape e plyr
require(reshape)
require(plyr)
ddply(da[,-c(1:3)], .(da$A, da$B), mean) # as médias
ddply(da[,-c(1:3)], .(da$A, da$B), sd) # os desvios-padrões
db <- melt(da, id.vars=1:3, id.measures=4:6)
str(db)
#-----------------------------------------------------------------------------
# fazendo empilhamento das observações
ddply(db[,-3], .(A, B, variable), summarise, m=mean(value), sd=sd(value))
#-----------------------------------------------------------------------------
# usando funções do pacote doBy
library(doBy)
summaryBy(V1+V2+V3~A+B, data=da,
FUN=function(x){ c(m=mean(x), sd=sd(x)) })
#-----------------------------------------------------------------------------
# usando funções do Hmisc
require(Hmisc)
with(da, bystats(cbind(V1, V2, V3), A, B,
fun=function(x){ c(m=colMeans(x), s=sd(x)) }))
#-----------------------------------------------------------------------------
# dados reais
bnn <- read.table("http://www.leg.ufpr.br/~walmes/cursoR/cnpaf/banana.txt",
header=TRUE, sep="\t")
str(bnn)
bnn <- melt(bnn, id.measures=4:12)
bnn <- ddply(bnn, .(cult, meio, variable),
summarise, m=mean(value), sd=sd(value))
str(bnn)
#-----------------------------------------------------------------------------
# gráfico de barras com desvio-padrão
require(lattice)
require(RColorBrewer)
display.brewer.all()
cols <- brewer.pal(nlevels(bnn$meio), "Set3")
png("f028.png", 500, 500)
trellis.par.set(superpose.polygon=list(col=cols),
strip.background=list(col="gray90"))
barchart(m~cult|variable, groups=meio, data=bnn,
sdv=bnn$sd, scales="free", layout=c(3,3),
xlab="Cultivar", ylab=expression(bar(x)+sd),
key=list(title="Meio de cultura", cex.title=1.2,
columns=3, text=list(levels(bnn$meio)),
rectangle=list(col=trellis.par.get("superpose.polygon")$col)),
prepanel=function(y, sdv, subscripts=subscripts, ...){
ly <- as.numeric(y+sdv[subscripts])
list(ylim=range(y, ly, finite=TRUE))
},
panel=function(x, y, subscripts, groups, sdv, box.ratio, ...){
panel.barchart(x, y, subscripts=subscripts,
groups=groups, box.ratio=box.ratio, ...)
d <- 1/(nlevels(groups)+nlevels(groups)/box.ratio)
g <- (as.numeric(groups[subscripts])-1); g <- (g-median(g))*d
panel.arrows(as.numeric(x)+g, y, as.numeric(x)+g, y+sdv[subscripts],
angle=90, length=0.025)
})
dev.off()
#-----------------------------------------------------------------------------