Tracer des statistiques récapitulatives avec moyenne, sd, min et max?

10

Je viens d'un milieu économique et habituellement dans la discipline, les statistiques sommaires des variables sont rapportées dans un tableau. Cependant, je souhaite les tracer.

Je pourrais modifier une boîte à moustaches pour lui permettre d'afficher la moyenne, l'écart type, minimum et maximum, mais je ne souhaite pas le faire car les boîtes à moustaches sont traditionnellement utilisées pour afficher les médianes et Q1 et Q3.

Toutes mes variables ont des échelles différentes. Ce serait formidable si quelqu'un pouvait suggérer une manière significative de tracer ces statistiques sommaires. Je peux travailler avec R ou Stata.

Ridhima
la source
1
Bienvenue sur la liste. Si vous posez des questions sur les Rcommandes, cette question est hors sujet ici. Mais il semble que vous vous demandiez principalement à quoi ressemblerait une bonne intrigue et, accessoirement, comment la créer. Si oui, je suggère de supprimer "avec R" de votre titre et peut-être d'indiquer, dans le corps, que vous disposez R.
Peter Flom - Réintègre Monica

Réponses:

16

Il y a une raison pour laquelle le diagramme en boîte de Tukey est universel, il peut être appliqué à des données dérivées de différentes distributions, de la gaussienne à la Poisson, etc. normalité. Cependant, la moyenne et l'écart-type sont plus sujets aux valeurs aberrantes et doivent être interprétés en fonction de la distribution sous-jacente. La solution ci-dessous est plus adaptée aux données normales ou log-normales. Vous pouvez parcourir une sélection de mesures robustes ici et explorer le package WRS R ici .

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

De plus, en ajoutant + geom_jitter()ou + geom_point()au code ci-dessus, vous pouvez visualiser simultanément les valeurs des données brutes.


Merci à @Roland d'avoir signalé l' intrigue du violon . Il présente l'avantage de visualiser la densité de probabilité en même temps que la statistique récapitulative:

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

Les deux exemples sont présentés ci-dessous.

entrez la description de l'image ici

TWL
la source
2
Je préfère un complot de violon à cela.
Roland
1
Selon le but de l'analyse, la moyenne et l'écart-type sont exactement ce dont vous avez besoin. Je ne comprends cependant pas l'incohérence dans le fichier summary.data.frame de R. Il montre des moyens mais pas de sds. Je ne peux pas penser à de nombreuses situations où les moyens sont utiles mais les écarts-types trompeurs.
Michael M
En effet, il faut parfois voir la moyenne et le SD pour juger de leur utilité ....
Nick Cox
1
@TWL: Le sujet est beaucoup trop large pour être discuté ici. Mais prenons par exemple les évaluations économiques des médicaments: pour le patient, il est peut-être important de connaître la durée médiane du traitement, tandis que pour la compagnie d'assurance maladie, c'est la durée moyenne du traitement car ils doivent la payer pour chaque patient. Un fait curieux: dans le cas de la distribution exponentielle, l'écart-type moyen +/- 1 couvre 68% de toute la masse, la moyenne +/- 2 sds couvre environ 95% de toute la masse. Quant à la normale. (Mais ce n'est qu'une chance;))
Michael M
1
Merci à tous, j'aime les complots de violon proposés, alors je vais faire ce choix :-)
Ridhima
9

Il existe une myriade de possibilités.

Une option que j'ai vue utilisée qui évite la confusion avec les boxplots (en supposant que vous ayez des médianes ou des données originales disponibles) est de tracer un boxplot et d'ajouter un symbole qui marque la moyenne (avec une légende pour rendre cela explicite). Cette version du boxplot qui ajoute un marqueur pour la moyenne est mentionnée, par exemple dans Frigge et al (1989) [1]:

Boxplots montrant la moyenne également marquée

Le graphique de gauche montre un symbole + comme marqueur moyen et le graphique de droite utilise un triangle sur le bord, adaptant le marqueur moyen à partir du graphique faisceau-point d'appui de Doane & Tracy [2].

Voir aussi cet article SO et celui-ci

Si vous n'avez pas (ou ne voulez vraiment pas montrer) la médiane, un nouveau tracé sera nécessaire et il serait bon qu'il soit visuellement distinct d'un boxplot.

Peut-être quelque chose comme ça:

entrez la description de l'image ici

... qui trace le minimum, le maximum, la moyenne et la moyenne sd pour chaque échantillon en utilisant différents symboles, puis dessine un rectangle, ou peut-être mieux, quelque chose comme ceci:±

entrez la description de l'image ici

... qui trace le minimum, le maximum, la moyenne et la moyenne sd pour chaque échantillon en utilisant des symboles différents, puis dessine une ligne (en fait, actuellement c'est en fait un rectangle comme avant, mais dessiné étroit; il devrait être changé en dessinant un ligne)±

Si vos chiffres sont sur des échelles très différentes, mais sont tous positifs, vous pourriez envisager de travailler avec des journaux, ou vous pourriez faire de petits multiples avec des échelles différentes (mais clairement marquées)

Code (actuellement pas particulièrement «sympa», mais pour le moment il s'agit juste d'explorer des idées, ce n'est pas un tutoriel pour écrire un bon code 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 et B. Iglewicz (1989),
"Quelques implémentations du diagramme en boîte".
American Statistician , 43 (février): 50-54.

[2] Doane DP et RL Tracy (2000),
«Using Beam and Fulcrum Displays to Explore Data»
American Statistician , 54 (4): 289–290, novembre

Glen_b -Reinstate Monica
la source