Traçando estatísticas resumidas com média, sd, min e max?

10

Tenho experiência em economia e, geralmente, na disciplina, as estatísticas resumidas das variáveis ​​são relatadas em uma tabela. No entanto, desejo traçá-los.

Eu poderia modificar um gráfico de caixas para permitir que ele exibisse a média, desvio padrão, mínimo e máximo, mas não desejo fazer isso, pois os gráficos de caixas são tradicionalmente usados ​​para exibir medianas e Q1 e Q3.

Todas as minhas variáveis ​​têm escalas diferentes. Seria ótimo se alguém pudesse sugerir uma maneira significativa pela qual eu pudesse traçar essas estatísticas resumidas. Eu posso trabalhar com R ou Stata.

Ridhima
fonte
11
Bem-vindo à lista. Se você está perguntando sobre Rcomandos, esta pergunta está fora de tópico aqui. Mas parece que você está perguntando principalmente sobre como seria um bom enredo e, secundariamente, sobre como criá-lo. Nesse caso, sugiro excluir "com R" do seu título e talvez indicar, no corpo, que você tem Rdisponível.
Peter Flom - Restabelece Monica

Respostas:

16

Há uma razão pela qual o boxplot de Tukey é universal, pode ser aplicado a dados derivados de diferentes distribuições, de Gaussian a Poisson, etc. Mediana, MAD (desvio absoluto médio) ou IQR (intervalo interquartil) são medidas mais robustas quando os dados se desviam de normalidade. No entanto, média e DP são mais propensas a discrepâncias e devem ser interpretadas com relação à distribuição subjacente. A solução abaixo é mais adequada para dados normais ou log-normais. Você pode navegar por uma seleção de medidas robustas aqui e explorar o pacote WRS R aqui .

# simulating dataset
set.seed(12)
d1 <- rnorm(100, sd=30)
d2 <- rnorm(100, sd=10)
d <- data.frame(value=c(d1,d2), condition=rep(c("A","B"),each=100))

# function to produce summary statistics (mean and +/- sd), as required for ggplot2
data_summary <- function(x) {
   mu <- mean(x)
   sigma1 <- mu-sd(x)
   sigma2 <- mu+sd(x)
   return(c(y=mu,ymin=sigma1,ymax=sigma2))
}

# require(ggplot2)
ggplot(data=d, aes(x=condition, y=value, fill=condition)) + 
geom_crossbar(stat="summary", fun.y=data_summary, fun.ymax=max, fun.ymin=min)

Além disso, adicionando + geom_jitter()ou + geom_point()ao código acima, você pode visualizar simultaneamente os valores dos dados brutos.


Agradecemos a @Roland por apontar a trama do violino . Tem uma vantagem em visualizar a densidade de probabilidade ao mesmo tempo que a estatística resumida:

# require(ggplot2)
ggplot(data=d, aes(x=condition, y=value, fill=condition)) + 
geom_violin() + stat_summary(fun.data=data_summary)

Ambos os exemplos são mostrados abaixo.

insira a descrição da imagem aqui

TWL
fonte
2
Eu preferiria uma trama de violino a isso.
Roland
11
Dependendo do objetivo da análise, a média e o desvio padrão são exatamente o que você precisa. Não entendo, no entanto, a inconsistência no resumo.data.frame de R. Ele mostra meios, mas não sds. Não consigo pensar em muitas situações em que os meios são úteis, mas os desvios padrão são enganosos.
Michael M
Na verdade, às vezes você precisa ver a média e o SD para que você julgar se eles são úteis ....
Nick Cox
11
@TWL: O tópico é muito amplo para discutir aqui. Mas tome, por exemplo, avaliações econômicas de medicamentos: para o paciente, talvez seja importante saber a duração média do tratamento, enquanto para a companhia de seguros de saúde é a duração média do tratamento, porque eles precisam pagar por cada paciente. Um fato curioso: no caso da distribuição exponencial, o desvio padrão médio de +/- 1 cobre 68% de toda a massa, a média de +/- 2 sds cobre cerca de 95% de toda a massa. Quanto ao normal. (Mas é mero acaso;))
Michael M
11
Obrigado a todos, eu como as parcelas de violino propostas assim vai ir em frente com essa escolha :-)
ridhima
9

Existem inúmeras possibilidades.

Uma opção que eu vi usada que evita confusão com boxplots (supondo que você tenha medianas ou dados originais disponíveis) é plotar um boxplot e adicionar um símbolo que marque a média (espero que com uma legenda para tornar isso explícito). Esta versão do boxplot que adiciona um marcador para a média é mencionada, por exemplo, em Frigge et al (1989) [1]:

Boxplots mostrando a média marcada também

O gráfico esquerdo mostra um símbolo + como marcador médio e o gráfico direito usa um triângulo na borda, adaptando o marcador médio do gráfico de vigas e fulcro de Doane & Tracy [2].

Veja também este post SO e este

Se você não tiver (ou realmente não quiser mostrar) a mediana, será necessário um novo gráfico e, em seguida, seria bom que fosse visualmente distinto de um boxplot.

Talvez algo parecido com isto:

insira a descrição da imagem aqui

... que plota o mínimo, máximo, média e média sd para cada amostra usando símbolos diferentes e depois desenha um retângulo, ou talvez melhor, algo como isto:±

insira a descrição da imagem aqui

... que plota o mínimo, o máximo, a média e a média sd para cada amostra usando símbolos diferentes e desenha uma linha (na verdade, atualmente é na verdade um retângulo como antes, mas estreito; ele deve ser alterado para desenhar um linha)±

Se seus números estiverem em escalas muito diferentes, mas todos positivos, considere trabalhar com logs ou faça pequenos múltiplos com escalas diferentes (mas claramente marcadas)

Código (atualmente não é um código particularmente "legal", mas no momento isso está apenas explorando idéias, não é um tutorial sobre como escrever um bom código R):

fivenum.ms=function(x) {r=range(x);m=mean(x);s=sd(x);c(r[1],m-s,m,m+s,r[2])}
eps=.015

plot(factor(c(1,2)),range(c(A,B)),type="n",border=0)
points((rep(c(1,2),each=5)),c(fivenum.ms(A),fivenum.ms(B)),col=rep(c(2,4),each=5),pch=rep(c(1,16,9,16,1),2),ylim=c(range(A,B)),cex=1.2,lwd=2,xlim=c(0.5,2.5),ylab="",xlab="")
rect(1-1.2*eps,fivenum.ms(A)[2],1+1.4*eps,fivenum.ms(A)[4],lwd=2,col=2,den=0)
rect(2-1.2*eps,fivenum.ms(B)[2],2+1.4*eps,fivenum.ms(B)[4],lwd=2,col=4,den=0)

plot(factor(c(1,2)),range(c(A,B)),type="n",border=0)
points((rep(c(1,2),each=5)),c(fivenum.ms(A),fivenum.ms(B)),col=rep(c(2,4),each=5),pch=rep(c(1,16,9,16,1),2),ylim=c(range(A,B)),cex=1.2,lwd=2,xlim=c(0.5,2.5),ylab="",xlab="")
rect(1-eps/9,fivenum.ms(A)[2],1+eps/3,fivenum.ms(A)[4],lwd=2,col=2,den=0)
rect(2-eps/9,fivenum.ms(B)[2],2+eps/3,fivenum.ms(B)[4],lwd=2,col=4,den=0)

[1] Frigge, M., DC Hoaglin e B. Iglewicz (1989),
"Some implementations of the box plot".
American Statistician , 43 (fev): 50-54.

[2] Doane DP e RL Tracy (2000),
"Utilizando telas de feixe e fulcro para explorar dados"
American Statistician , 54 (4): 289-290, novembro

Glen_b -Reinstate Monica
fonte