2017-09-12 6 views
0

Je fais une simulation Monte Carlo, dans laquelle je dois afficher la densité des estimations de coefficients pour des simulations avec différentes tailles d'échantillons sur la même parcelle. Lors de l'utilisation scale_color_grey. J'ai mis mes estimations de coefficient dans le même cadre de données, avec la taille de l'échantillon comme facteur. Si j'interroge le facteur avec levels(), il est dans le bon ordre (du plus petit au plus grand échantillon). Cependant, le code suivant donne une échelle dans laquelle l'ordre est correct dans la légende, mais la couleur passe du gris clair au gris plus foncé dans un ordre apparemment aléatoireCommande de légende incorrecte avec scale_color_grey()

montecarlo <- function(N, nsims, nsamp){ 
    set.seed(8675309) 
    coef.mc <- vector() 
    for(i in 1:nsims){ 
     access <- rnorm(N, 0, 1) 
     health <- rnorm(N, 0, 1) 
     doctorpop <- (access*1) + rnorm(N, 0, 1) 
     sick <- (health*-0.4) + rnorm(N, 0, 1) 
     insurance <- (access*1) + (health*1) + rnorm(N, 0, 1) 
     healthcare <- (insurance*1) + (doctorpop*1) + (sick*1) + rnorm(N, 0, 1) 
     data <- as.data.frame(cbind(healthcare, insurance, sick, doctorpop)) 
     sample.data <- data[sample(nrow(data), nsamp), ] 
     model <- lm(data=sample.data, healthcare ~ insurance + sick + doctorpop) 
     coef.mc[i] <- coef(model)["insurance"] 
    } 
    return(as.data.frame(cbind(coef.mc, nsamp))) 
} 

sample30.df <- montecarlo(N=1000, nsims=1000, nsamp=30) 
sample100.df <- montecarlo(1000,1000,100) 
sample200.df <- montecarlo(1000, 1000, 200) 
sample500.df <- montecarlo(1000, 1000, 500) 
sample1000.df <- montecarlo(1000, 1000, 1000) 
montecarlo.df <- rbind(sample30.df, sample100.df, sample200.df, sample500.df, sample1000.df) 
montecarlo.df$nsamp <- as.factor(montecarlo.df$nsamp) 
levels(montecarlo.df$nsamp) <- c("30", "100", "200", "500", "1000") 

##creating the plot 
montecarlo.plot <- ggplot(data=montecarlo.df, aes(x=coef.mc, color=nsamp))+ 
    geom_line(data = subset(montecarlo.df, nsamp==30), stat="density")+ 
    geom_line(data = subset(montecarlo.df, nsamp==100), stat="density")+ 
    geom_line(data = subset(montecarlo.df, nsamp==200), stat="density")+ 
    geom_line(data = subset(montecarlo.df, nsamp==500), stat="density")+ 
    geom_line(data = subset(montecarlo.df, nsamp==1000), stat="density")+ 
    scale_color_grey(breaks=c("30", "100","200", "500", "1000"))+ 
    labs(x=NULL, y="Density of Coefficient Estimate: Insurance", color="Sample Size")+ 
    theme_bw() 
montecarlo.plot 

Ne pas utiliser l'argument breaks à scale_color_grey renvoie une légende dans lequel les nuances sont dans le bon ordre, mais qui n'augmente pas du plus petit au plus grand.

Que se passe-t-il ici? Pour autant que je comprenne, ggplot2 devrait suivre l'ordre du facteur (ce qui est correct) dans l'attribution des couleurs et la création de la légende. Comment puis-je faire passer la légende et les nuances de gris du plus petit au plus petit?

Répondre

1

Vous devez laisser ggplot poignée tracer les lignes distinctes pour chaque niveau de nsamp: parce que vous avez tracé nsamp à l'esthétique des couleurs, ggplot trace automatiquement une ligne différente pour chaque niveau, de sorte que vous pouvez faire:

montecarlo.plot <- ggplot(data=montecarlo.df, aes(x=coef.mc, color=nsamp))+ 
    geom_line(stat = "density", size = 1.2) + 
    scale_color_grey() + 
    labs(x=NULL, y="Density of Coefficient Estimate: Insurance", color="Sample Size")+ 
    theme_bw() 
montecarlo.plot 

Pas besoin de sous-ensemble manuel des données.