Integration von ggplot2 mit benutzerdefinierter stat_function ()

Ich versuche, ein @ zu überlagemixed distribution Grundstück mit einem Grundstück von identifiziertenKomponentenverteilungen mitggplot2 Paket und ein benutzerdefinierte Funktion für seinstat_function(). Ich habe versucht zwei Ansätze. DasDistributionsidentifikation ist in beiden Fällen normal:

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 

EIN Allerdings in dererste Ansat, dasAusgab enthält das folgendeErro:

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

Dasreproducible example für diesen Ansatz folgt tre ist ein Built-in R Datensatz):

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)

B) Das zweiter Ansatz erzeugt keine Fehler. Das einzige sichtbare Diagramm ist jedoch das der gemischten Verteilung.Plots seiner Komponentenverteilungen werden nicht erstellt oder sind nicht sichtbar (mit einigem Vertrauen scheint mir die gerade horizontale Linie y = 0 auch sichtbar zu sein, aber ich bin mir nicht 100% sicher):

Das Folgende ist einreproducible example für diesen Ansatz:

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)

Frage: Was sind die Probleme in jedem der Ansätze und welches ist (mehr) richtig?

AKTUALISIEREN Nur wenige Minuten nach dem Posten wurde mir klar, dass ich vergessen hatte, den Strichzeichnungsteil desstat_function() für den zweiten Ansatz, so dass die entsprechenden Zeilen wie folgt lauten:

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]))

Dieses Update erzeugt jedoch einErro, dessen Quelle ich nicht ganz verstehe:

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage