2014-05-05 6 views
4

J'ai un ensemble de données deux variables continues et une variable de facteur (deux classes). Je veux créer un diagramme de dispersion avec deux centroïdes (un pour chaque classe) qui inclut des barres d'erreur dans R. Les centroïdes doivent être positionnés aux valeurs moyennes pour x et y pour chaque classe.R - ajouter des centroïdes au diagramme de dispersion

Je peux facilement créer le nuage de points en utilisant ggplot2, mais je n'arrive pas à comprendre comment ajouter les centroïdes. Est-il possible de le faire en utilisant ggplot/qplot?

Voici quelques exemples de code:

x <- c(1,2,3,4,5,2,3,5) 
y <- c(10,11,14,5,7,9,8,5) 
class <- c(1,1,1,0,0,1,0,0) 
df <- data.frame(class, x, y) 
qplot(x,y, data=df, color=as.factor(class)) 

Répondre

11

Est-ce que vous aviez en tête?

centroids <- aggregate(cbind(x,y)~class,df,mean) 
ggplot(df,aes(x,y,color=factor(class))) + 
    geom_point(size=3)+ geom_point(data=centroids,size=5) 

Cela crée une trame de données séparée, centroids, avec des colonnes x, y et classx et y sont les valeurs moyennes par classe. Ensuite, nous ajoutons une deuxième couche de géométrie de point en utilisant centroid comme jeu de données.

Ceci est une version légèrement plus intéressante, utile dans l'analyse de cluster.

gg <- merge(df,aggregate(cbind(mean.x=x,mean.y=y)~class,df,mean),by="class") 
ggplot(gg, aes(x,y,color=factor(class)))+geom_point(size=3)+ 
    geom_point(aes(x=mean.x,y=mean.y),size=5)+ 
    geom_segment(aes(x=mean.x, y=mean.y, xend=x, yend=y)) 

EDIT Réponse au commentaire de l'OP.

Des barres d'erreur verticales et horizontales peuvent être ajoutées en utilisant geom_errorbar(...) et geom_errorbarh(...).

centroids <- aggregate(cbind(x,y)~class,df,mean) 
f   <- function(z)sd(z)/sqrt(length(z)) # function to calculate std.err 
se  <- aggregate(cbind(se.x=x,se.y=y)~class,df,f) 
centroids <- merge(centroids,se, by="class") # add std.err column to centroids 
ggplot(gg, aes(x,y,color=factor(class)))+ 
    geom_point(size=3)+ 
    geom_point(data=centroids, size=5)+ 
    geom_errorbar(data=centroids,aes(ymin=y-se.y,ymax=y+se.y),width=0.1)+ 
    geom_errorbarh(data=centroids,aes(xmin=x-se.x,xmax=x+se.x),height=0.1) 

Si vous voulez calculer, par exemple, 95% de confiance au lieu de std. erreur, remplacez

f <- function(z)sd(z)/sqrt(length(z)) # function to calculate std.err 

avec

f <- function(z) qt(0.025,df=length(z)-1, lower.tail=F)* sd(z)/sqrt(length(z)) 
+0

Cela tombe bien, je vous remercie. Est-il possible d'ajouter également des barres horizontales et verticales au centroïde qui représentent l'erreur standard pour les valeurs x et y? – cyril

+0

Voir les modifications à la fin. – jlhoward

+0

Merci! C'est parfait. – cyril

Questions connexes