Integrando ggplot2 con stat_function definido por el usuario ()

Estoy tratando de superponer undistribución mixta trama con una trama de identificadosdistribuciones de componentes, utilizandoggplot2 paquete y unfunción definida por el usuario por sustat_function(). Yo he tratadodos enfoques. losidentificación de distribución es normal en ambos casos:

number of iterations= 11 
summary of normalmixEM object:
         comp 1  comp 2
lambda 0.348900 0.65110
mu     2.019878 4.27454
sigma  0.237472 0.43542
loglik at estimate:  -276.3643 

UNA) Sin embargo, en elprimer enfoque, elsalida contiene lo siguienteerror:

Error in eval(expr, envir, enclos) : object 'comp.number' not found

losejemplo reproducible para este enfoque sigue (fiel es unincorporado R conjunto de datos):

library(ggplot2)
library(mixtools)

DISTRIB_COLORS <- c("green", "red")
NUM_COMPONENTS <- 2

set.seed(12345)

mix.info <- normalmixEM(faithful$eruptions, k = NUM_COMPONENTS,
                        maxit = 100, epsilon = 0.01)
summary(mix.info)

plot.components <- function(mix, comp.number) {
  g <- stat_function(fun = function(mix, comp.number) 
  {mix$lambda[comp.number] *
     dnorm(x, mean = mix$mu[comp.number],
           sd = mix$sigma[comp.number])}, 
  geom = "line", aes(colour = DISTRIB_COLORS[comp.number]))
  return (g)
}

g <- ggplot(faithful, aes(x = waiting)) +
  geom_histogram(binwidth = 0.5)

distComps <- lapply(seq(NUM_COMPONENTS),
                    function(i) plot.components(mix.info, i))
print(g + distComps)

SI) lossegundo enfoque No produce ningún error. Sin embargo, el único gráfico visible es el de la distribución mixta.Los gráficos de sus distribuciones de componentes no se producen ni son visibles. (con cierto grado de confianza me parece que una línea horizontal recta y = 0 también es visible, pero no estoy 100% seguro):

El siguiente es unejemplo reproducible para este enfoque:

library(ggplot2)
library(mixtools)

DISTRIB_COLORS <- c("green", "red")
NUM_COMPONENTS <- 2

set.seed(12345)

mix.info <- normalmixEM(faithful$eruptions, k = NUM_COMPONENTS,
                        maxit = 100, epsilon = 0.01)
summary(mix.info)

plot.components <- function(x, mix, comp.number, ...) {
  mix$lambda[comp.number] *
    dnorm(x, mean = mix$mu[comp.number],
          sd = mix$sigma[comp.number], ...)
}

g <- ggplot(faithful, aes(x = waiting)) +
  geom_histogram(binwidth = 0.5)

distComps <- lapply(seq(NUM_COMPONENTS), function(i)
  stat_function(fun = plot.components,
                args = list(mix = mix.info, comp.number = i)))
print(g + distComps)

Pregunta: ¿Cuáles son los problemas en cada uno de los enfoques y cuál es (más) correcto?

ACTUALIZAR: Pocos minutos después de publicar, me di cuenta de que olvidé incluir la parte del dibujo lineal delstat_function() para el segundo enfoque, de modo que las líneas correspondientes sean las siguientes:

distComps <- lapply(seq(NUM_COMPONENTS), function(i)
  stat_function(fun = plot.components,
                args = list(mix = mix.info, comp.number = i)),
  geom = "line", aes(colour = DISTRIB_COLORS[i]))

Sin embargo, esta actualización produce unerror, fuente de la cual no entiendo muy bien:

Error in FUN(1:2[[1L]], ...) : 
  unused arguments (geom = "line", list(colour = DISTRIB_COLORS[i]))

Respuestas a la pregunta(1)

Su respuesta a la pregunta