Wie kann ich aus einer Mischungsverteilung und insbesondere einer Mischung von Normalverteilungen in probieren R
? Zum Beispiel, wenn ich probieren wollte aus:
wie könnte ich das machen
r
random-generation
mixture
gung - Wiedereinsetzung von Monica
quelle
quelle
Antworten:
Es ist
for
empfehlenswert,R
aus Leistungsgründen keine Schleifen zu bilden. Eine alternative Lösung, die diese Tatsache ausnutzt,rnorm
ist vektorisiert:quelle
samples <- rnorm(N)*sds[components]+mus[components]
. Ich finde es einfacher zu lesen :)Im Allgemeinen ist einer der einfachsten Wege, eine Probe aus einer Gemischverteilung zu entnehmen, der folgende:
Algorithmusschritte
1) Erzeuge eine ZufallsvariableU∼ Uniform ( 0 , 1 )
2) Wenn Intervall, in dem der Wahrscheinlichkeit der -Komponente des Mischungsmodells entsprechen, dann aus der Verteilung der -Komponente erzeugenU∈ [ ∑ki = 1pk, ∑k + 1i = 1pk + 1) pk kt h kt h
3) Wiederholen Sie die Schritte 1) und 2), bis Sie die gewünschte Menge an Proben aus der Gemischverteilung erhalten haben
Unter Verwendung des oben angegebenen allgemeinen Algorithmus können Sie aus Ihrer Beispielmischung von Normalen mit dem folgenden
R
Code ein Beispiel erstellen:Welches erzeugt:
und zur Überprüfung der geistigen Gesundheit:
quelle
Konzeptionell wählen Sie mit einiger Wahrscheinlichkeit nur eine Verteilung (aus Möglichkeiten) aus und generieren dann Pseudozufallsvariablen aus dieser Verteilung. In wäre dies (zB):k
R
quelle
ifelse()
Aussage, aber ich muss es später herausfinden. Ich habe diesen Code mit einer Schleife ersetzt.R
Programmiertrick: Sie können auch die BefehlefindInterval()
und verwendencumsum()
, um den Code zu vereinfachen und, was noch wichtiger ist, die Verallgemeinerung auf eine andere Anzahl von Dimensionen zu vereinfachen. Zum Beispiel wäre für einen Eingabevektor aus Mittelwerten ( ) und Varianzen ( ) und Mischungswahrscheinlichkeiten ( ) eine einfache Funktion zum Erzeugen von n Abtastwerten aus dieser Mischungmu
s
p
mix <- function(n,mu,s,p) { ii <- findInterval(runif(n),cumsum(p))+1; x <- rnorm(n,mean=mu[ii],sd=sqrt(s[ii])); return(x); }
findInterval()
Befehl vorher noch nicht gesehen , aber ich schreibe hier gerne Code so einfach wie möglich, weil ich möchte, dass er eher zum Verständnis als zur Effizienz beiträgt.Bereits perfekte Antworten gegeben, also für diejenigen, die dies in Python erreichen wollen, ist hier meine Lösung:
quelle