2013-02-25 6 views
0

J'utilise R pour créer des histogrammes de fréquence de taille pour des individus malades et en bonne santé avec des lignes de distribution normales ajustées. J'ai 2 questions que je cherche des conseils sur.Tracer 2 histogrammes avec des données agrégées

  1. Comment créer un histogramme à partir de données agrégées? Le tableau d'exemple ci-dessous présente le nombre résumé d'individus malades et en bonne santé dans chaque taille.

dput (données)

'structure(list(Size = c(25L, 28L, 31L, 45L, 60L), diseased = c(0L, 
22L, 10L, 5L, 2L), healthy = c(55L, 40L, 15L, 7L, 2L)), .Names = c("Size", 
"diseased", "healthy"), class = "data.frame", row.names = c(NA, 
-5L))' 

2.How-je superposer les deux histogrammes dans une figure avec des lignes de distribution normales ajustées.

J'ai essayé le code suivant pour les données agrégées ggplot (données, aes (x = taille, y = malade)) + geom_bar (stat = 'identité'), qui fonctionne bien, mais je ne peux pas comprendre comment ajouter l'histogramme pour les individus en bonne santé.

J'ai aussi essayé d'utiliser le texte suivant pour revenir les données résumées (appelées "données") au format brut d'origine: < premières - données [rep (1: données, fois = $ data malade), « Taille ", drop = FALSE]

Je reçois le message d'erreur suivant: Erreur dans rep (1: données, times = données $ malades): argument 'times' non valide. De commentaires précédents, il semble que la fonction rep ne peut pas gérer "0"

+1

Est-ce que ce poste Aidez-moi? http://stackoverflow.com/questions/3541713/how-to-plot-two-histograms-together-in-r ou peut-être mieux: http://stackoverflow.com/questions/6957549/overlaying-histograms-with- ggplot2-in-r – jasonflaherty

+0

Pouvez-vous rendre vos données reproductibles en affichant le résultat de 'dput (data)' ou 'dput (head (data))'? De même, comment vos colonnes peuvent-elles avoir des nombres de lignes différents? –

+0

@DavidRobinson, je crois que c'est une copie exacte de l'article lié par buildakicker. – Arun

Répondre

0

Donc, je suis pressé et j'ai en quelque sorte piraté la courbe normale, mais vous pouvez l'utiliser pour tracer deux "histogrammes". style "parcelles les uns sur les autres.

Il serait plus facile d'obtenir les courbes si nous avions l'ensemble de données complet et pas seulement les résumés, bien sûr. Je les ai un peu trafiqués ensemble, mais je pense que c'est suffisant pour avoir l'idée générale ici.

Je ne suis pas tout à fait clair sur la raison pour laquelle vous voulez pour cela, mais vous pouvez ...

library(SDMTools) # Use this to get weighted means 

testdata <- structure(list(Size=c(25L, 28L, 31L, 45L, 60L), 
          diseased=c(0L, 22L, 10L, 5L, 2L), 
          healthy=c(55L, 40L, 15L, 7L, 2L)), 
         .Names = c("Size", "diseased", "healthy"), 
         class = "data.frame", 
         row.names = c(NA, -5L)) 

barplot(testdata$healthy, 
     names.arg=paste("     ",testdata$Size), 
     col="light blue", 
     border="blue", 
     xlim=c(0,6), 
     ylim=c(0,70), 
     width=0.5, 
     space=1) 
par(new=TRUE) 
barplot(testdata$diseased, 
     col="pink", 
     border="red", 
     xlim=c(0,6), 
     ylim=c(0,70), 
     width=0.5, 
     space=c(2,1,1,1,1)) 

healthy_mean <- wt.mean(x=testdata$healthy,wt=testdata$Size) 
healthy_sd <- wt.sd(x=testdata$healthy,wt=testdata$Size) 
diseased_mean <- wt.mean(x=testdata$diseased,wt=testdata$Size) 
diseased_sd <- wt.sd(x=testdata$diseased,wt=testdata$Size) 

yfit_healthy <- as.data.frame(dnorm(0:max(testdata$healthy), 
           mean=healthy_mean,sd=healthy_sd)) 
names(yfit_healthy) <- "y" 
yfit_diseased <- as.data.frame(dnorm(0:max(testdata$diseased), 
           mean=diseased_mean,sd=diseased_sd)) 
names(yfit_diseased) <- "y" 

yfit_healthy$x <- seq(0,6,length.out=length(yfit_healthy$y)) 
yfit_diseased$x <- seq(0,6,length.out=length(yfit_diseased$y)) 

lines(yfit_healthy$x, 
     (max(testdata$healthy)*yfit_healthy$y)/max(yfit_healthy$y), 
     col="blue",lwd=2) 

lines(yfit_diseased$x, 
     (max(testdata$diseased)*yfit_diseased$y)/max(yfit_diseased$y), 
     col="red",lwd=2) 

Ce code me fait:

Not Exactly My Finest Graph

Questions connexes