Média e desvio-padrão de muitas variáveis separado por grupos

November 23, 2011
By

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()

#-----------------------------------------------------------------------------


Tags: , , , ,

Comments are closed.