Graphiques alternatifs aux tracés de «guidon»

15

Dans mon domaine de recherche, une façon populaire d'afficher des données consiste à utiliser une combinaison d'un graphique à barres avec des "poignées". Par exemple,

entrez la description de l'image ici

Les "guidons" alternent entre les erreurs types et les écarts types selon l'auteur. En règle générale, les tailles d'échantillon pour chaque "barre" sont assez petites - environ six.

Ces parcelles semblent être particulièrement populaires dans les sciences biologiques - voir les premiers articles de BMC Biology, vol 3 pour des exemples.

Alors, comment présenteriez-vous ces données?

Pourquoi je n'aime pas ces intrigues

Personnellement, je n'aime pas ces parcelles.

  1. Lorsque la taille de l'échantillon est petite, pourquoi ne pas simplement afficher les points de données individuels.
  2. Est-ce le sd ou le se qui est affiché? Personne n'accepte lequel utiliser.
  3. Pourquoi utiliser des barres du tout. Les données ne vont pas (généralement) de 0 mais un premier passage sur le graphique suggère que c'est le cas.
  4. Les graphiques ne donnent aucune idée de la plage ou de la taille de l'échantillon des données.

Script R

Il s'agit du code R que j'ai utilisé pour générer l'intrigue. De cette façon, vous pouvez (si vous le souhaitez) utiliser les mêmes données.

                                        #Generate the data
set.seed(1)
names = c("A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3")
prevs = c(38, 37, 31, 31, 29, 26, 40, 32, 39)

n=6; se = numeric(length(prevs))
for(i in 1:length(prevs))
  se[i] = sd(rnorm(n, prevs, 15))/n

                                        #Basic plot
par(fin=c(6,6), pin=c(6,6), mai=c(0.8,1.0,0.0,0.125), cex.axis=0.8)
barplot(prevs,space=c(0,0,0,3,0,0, 3,0,0), names.arg=NULL, horiz=FALSE,
        axes=FALSE, ylab="Percent", col=c(2,3,4), width=5, ylim=range(0,50))

                                        #Add in the CIs
xx = c(2.5, 7.5, 12.5, 32.5, 37.5, 42.5,  62.5, 67.5, 72.5)
for (i in 1:length(prevs)) {
  lines(rep(xx[i], 2), c(prevs[i], prevs[i]+se[i]))
  lines(c(xx[i]+1/2, xx[i]-1/2), rep(prevs[i]+se[i], 2))
}

                                        #Add the axis
axis(2, tick=TRUE, xaxp=c(0, 50, 5))
axis(1, at=xx+0.1, labels=names, font=1,
     tck=0, tcl=0, las=1, padj=0, col=0, cex=0.1)
csgillespie
la source
6
Aider votre domaine à parvenir à un consensus sur la seule question se v. Sd serait une énorme avancée. Ils signifient des choses complètement différentes.
John
Je suis d'accord - elle est généralement choisie car elle donne une région plus petite!
csgillespie
Peut-être un titre plus informatif?
3
Juste pour référence, j'ai déjà vu ces graphiques à barres avec des barres d'erreur appelées "Graphiques Dynamite". Voici quelques références donnant exactement les mêmes recommandations que tout le monde a à peu près (tableaux de points). Tatsuki Koyama, Méfiez - vous de l'affiche Dynamite et Drummond & Vowler, 2011 .
Andy W
1
Veuillez ajouter à nouveau l'image si vous le pouvez. Utilisez le téléchargeur d'images cette fois pour qu'il ne devienne pas un lien mort.
endolith

Réponses:

16

Merci pour toutes vos réponses. Pour être complet, j'ai pensé que je devrais inclure ce que je fais habituellement. J'ai tendance à faire une combinaison des suggestions données: les points, les boîtes à moustaches (lorsque n est grand) et les plages se (ou sd).

( Supprimé par le modérateur car le site hébergeant l'image ne semble plus fonctionner correctement. )

D'après le graphique en points, il est clair que les données sont beaucoup plus réparties que les graphiques en "guidon" suggèrent. En fait, il y a une valeur négative dans A3!


J'ai fait de cette réponse un CW donc je ne gagne pas de rep

csgillespie
la source
3
Voilà une bonne réponse. De plus, je suggérerais d'agiter horizontalement les points, afin qu'ils ne se chevauchent pas, surtout si vous avez plus de points par groupe que cela. Dans ggplot2, geom_jitter () fera cela.
Harlan du
@Harlan: Je suis d'accord. Bien que si j'avais beaucoup plus de points, j'utiliserais probablement un boxplot.
csgillespie du
1
J'aime aussi les nuages ​​de points pour les petits ensembles de données (nb, j'utilise le terme «pointplot» pour faire référence à un graphique légèrement différent). Cependant, pour ce qu'il vaut, le graphique à barres ci-dessus est plus propre et plus facile à lire que celui-ci. Je ne suis pas sûr que cela améliore les choses, mais cela vaut la peine d'être souligné.
gung - Rétablir Monica
@Harlan: Alternativement, rendre les points transparents afin que plusieurs points s'empilent et produisent un point plus sombre?
endolith
avez-vous l'image originale pour remplacer ce lien mort?
endolith
10

Frank Harrell (le plus excellent) keynote intitulé "Information Allergy" at useR! le mois dernier a montré des alternatives à celles-ci: plutôt que de masquer les données brutes via l'agrégation fournie par les barres, les données brutes sont également affichées sous forme de points (ou points). "Pourquoi cacher les données?" était le commentaire de Frank.

Compte tenu du mélange alpa, cela semble être une suggestion la plus judicieuse (et le discours le plus plein de bonnes et importantes pépites).

Dirk Eddelbuettel
la source
1
Est-il disponible en vidéo? Ça sonne bien.
Henrik
1
Je pense que le mot est "sera éventuellement" - des discours ont été enregistrés.
Dirk Eddelbuettel
1
c'est facile dans ggplot je pense, ie had.co.nz/ggplot2/geom_jitter.html
Mike Dewar
1
jitterest également en clair R.
2
Juste pour le protocole, la conférence de Frank (en vidéo) est maintenant en ligne: r-bloggers.com/RUG/2010/08/user-2010-conference-videos
Tal Galili
7

D'un point de vue psychologique, je préconise de tracer les données ainsi que votre incertitude sur les données. Ainsi, dans une intrigue comme vous le montrez, je ne prendrais jamais la peine d'étendre les barres jusqu'à zéro, ce qui ne sert qu'à minimiser la capacité de l'œil à distinguer les différences dans la plage des données.

De plus, je suis franchement anti-bargraph; les graphiques à barres mettent en correspondance deux variables avec le même attribut esthétique (emplacement sur l'axe des x), ce qui peut prêter à confusion. Une meilleure approche consiste à éviter une cartographie esthétique redondante en mappant une variable sur l'axe des x et une autre variable sur un autre attribut esthétique (par exemple, la forme ou la couleur du point ou les deux).

Enfin, dans votre graphique ci-dessus, vous n'incluez que des barres d'erreur au-dessus de la valeur, ce qui entrave la capacité de comparer les intervalles d'incertitude par rapport aux barres au-dessus et en dessous de la valeur.

Voici comment je tracerais les données (via le package ggplot2). Notez que j'ajoute des lignes reliant des points dans la même série; certains soutiennent que cela n'est approprié que lorsque les séries sur lesquelles les lignes sont connectées sont numériques (comme cela semble être le cas dans ce cas), mais tant qu'il existe une relation ordinale raisonnable entre les niveaux de la variable de l'axe des x, je pense les lignes de connexion sont utiles pour aider l'œil à associer des points sur l'axe des x. Cela peut devenir particulièrement utile pour détecter des interactions qui se démarquent vraiment des lignes.

library(ggplot2)
a = data.frame(names,prevs,se)
a$let = substr(a$names,1,1)
a$num = substr(a$names,2,2)
ggplot(data = a)+
layer(
    geom = 'point'
    , mapping = aes(
        x = num
        , y = prevs
        , colour = let
        , shape = let
    )
)+
layer(
    geom = 'line'
    , mapping = aes(
        x = num
        , y = prevs
        , colour = let
        , linetype = let
        , group = let
    )    
)+
layer(
    geom = 'errorbar'
    , mapping = aes(
        x = num
        , ymin = prevs-se
        , ymax = prevs+se
        , colour = let
    )
    , alpha = .5
    , width = .5
)

entrez la description de l'image ici

Mike Lawrence
la source
1
Je dois ajouter que ma recommandation «tracer uniquement les données et l'incertitude» doit être nuancée: lorsque vous présentez des données à un public qui a l'expérience / l'expertise de la variable tracée, tracez uniquement les données et l'incertitude. Lors de la présentation de données à un public naieve et lorsque zéro est un point de données significatif, je montrerais d'abord les données s'étendant à zéro afin que le public puisse s'orienter sur l'échelle, puis zoomer pour n'afficher que les données et l'incertitude.
Mike Lawrence
puisque vous avez eu du mal à écrire du code R, pourriez-vous inclure une image jpeg du tracé final. Je trouve qu'il suffit de télécharger l'image sur img84.imageshack.us et de la relier à celle-ci est assez facile. Oh merci pour la réponse :)
csgillespie
@csgillespie: c'est fait.
Mike Lawrence
J'ai trouvé qu'il est plus facile de lire un tracé comme celui-ci en geom_ribbon()indiquant l'erreur. Si vous n'aimez pas produire des estimations apparentes pour les régions comprises entre 1 et 2, réduisez au moins la largeur de la barre d'erreur.
JoFrhwld
@JoFrwld: J'aime aussi les rubans, bien que j'ai tendance à les réserver pour les cas où la variable de l'axe des x est vraiment numérique; ma version de la règle "ne pas tracer de lignes sauf si la variable de l'axe des x est numérique" que je déclare violer dans ma réponse ci-dessus: Op
Mike Lawrence
2

Je suis curieux de savoir pourquoi vous n'aimez pas ces intrigues. Je les utilise tout le temps. Sans vouloir énoncer l'évidence de la floraison, ils vous permettent de comparer les moyennes de différents groupes et de voir si leurs IC à 95% se chevauchent (c'est-à-dire que la vraie moyenne est susceptible d'être différente).

Il est important de trouver un équilibre entre simplicité et informations à des fins différentes, je suppose. Mais lorsque j'utilise ces tracés, je dis: «ces deux groupes sont différents l'un de l'autre d'une manière importante» [ou pas].

Cela me semble très bien, mais je serais intéressé d'entendre des contre-exemples. Je suppose implicite dans l'utilisation de l'intrigue est que les données n'ont pas une distribution bizzare qui rend la moyenne invalide ou trompeuse.

Chris Beeley
la source
J'ai ajouté une petite section sur les raisons pour lesquelles je n'aime pas ces intrigues.
csgillespie
1
@Chris vérifier ceci sur l'interprétation des CI qui se chevauchent pubs.amstat.org/doi/abs/10.1198/000313001317097960 De plus, la question initiale concerne également la confusion de l'utilisation interchangeable de SE ou SD alors qu'il s'agit de deux choses différentes
tosonb1
Ou, pour une analyse sur ce site, voir stats.stackexchange.com/questions/18215 . @ tosonb1 Votre lien arrive à expiration. Pourriez-vous fournir une référence au document?
whuber
2

Si les données sont des taux : c'est-à-dire le nombre de succès divisé par le nombre d'essais, alors une méthode très élégante est un graphique en entonnoir. Par exemple, voir http://qshc.bmj.com/content/11/4/390.2.full (excuses si le lien nécessite un abonnement - faites le moi savoir et j'en trouverai un autre).

Il peut être possible de l'adapter à d'autres types de données, mais je n'ai vu aucun exemple.

MISE À JOUR:

Voici un lien vers un exemple qui ne nécessite pas d'abonnement (et a une bonne explication sur la façon dont ils pourraient être utilisés): http://understandinguncertainty.org/fertility

Ils peuvent être utilisés pour des données non tarifaires, en traçant simplement la moyenne par rapport à l'erreur standard, mais ils peuvent perdre une partie de leur simplicité.

L'article de wikipedia n'est pas génial, car il ne traite que de leur utilisation dans les méta-analyses. Je dirais qu'ils pourraient être utiles dans de nombreux autres contextes.

Simon Byrne
la source
Les données ne sont pas des tarifs nécessaires. Ça pourrait être n'importe quoi.
csgillespie
Lien d'abonnement, malheureusement.
Matt Parker
... mais voici le lien Wikipedia sur les tracés en entonnoir: en.wikipedia.org/wiki/Funnel_plot
Matt Parker
2

J'utiliserais des boxplots ici; propre, significatif, non paramétrique ... Ou vioplot si la distribution est plus intéressante.


la source
2
Je ne suis pas sûr que les boxplots ou les vioplots conviendraient avec un si petit échantillon (n = 6)
csgillespie
Bon, j'avoue que je n'ai pas lu la question assez attentivement, donc c'était plutôt une idée générale; néanmoins je pense que 6 points est minime mais suffisant pour un boxplot. J'ai fait quelques expériences et elles étaient significatives. D'un autre côté, évidemment, boxplot n'indique pas le nombre d'observations (ce qui est un élément d'information important ici), donc je préfère utiliser une combinaison de cela et de points.
Avec 6 points - le nuage de points est probablement le meilleur (peut-être en ajoutant un point rouge pour la moyenne)
Tal Galili
2
J'utilise généralement des boxplots avec des points superposés, je trouve ça très "visuel". Les complots de violon, au contraire, sont un peu difficiles à comprendre à mon avis.
nico
1
@csgillespie: Qu'est-ce qui indiquerait que les parcelles de bar et de moustaches sont meilleures? Ils affichent essentiellement les mêmes informations qu'un boxplot (comme vous le faites remarquer, les moustaches peuvent représenter diverses choses), ils ne donnent l'erreur que dans un seul sens, ce qui pourrait être assez déroutant, sinon fallacieux ... Pas d'argument pour les boxplots . Mais les haricots / parcelles de violon devraient toujours fonctionner, même pour des tailles d'échantillon relativement faibles, car ce n'est qu'une estimation de la densité gaussienne, comme je l'ai expliqué ici .
naught101
1

Simplifier le formidable code de @ csgillespie d'en haut:

qplot(
    data=a,
    x=num,
    y=prevs,
    colour=let,
    shape=let,
    group=let,
    ymin=prevs-se,
    ymax=prevs+se,
    position=position_dodge(width=0.25),
    geom=c("point", "line", "errorbar")
    )
James Waters
la source
0

Je préfère geom_pointrange à errorbar et je pense que les lignes sont distrayantes plutôt qu'utiles. Voici la version que je trouve beaucoup plus propre que la version @James ou @csgillespie:

qplot(
 data=a,
 x=num,
 y=prevs,
 colour=let,
 ymin=prevs-se,
 ymax=prevs+se,
 position=position_dodge(width=0.25),
 geom=c("pointrange"), size=I(2)
 )
Kent Johnson
la source