2017-10-08 1 views
1

In R, für ein Schulprojekt, versuche ich eine Funktion, die eine for-Schleife verwendet, zu einer Funktion, die die apply-Funktion verwendet.Für die Loop-Funktion in Apply-Funktion drehen

Meine Funktion simuliert eine Poisson-Verteilung, bei der die Person die Parameter n, Lambda und m eingeben kann. m ist die Anzahl der Simulationen. Es gibt dann den Mittelwert aller Mittel der m Poisson-Simulationen aus und gibt ein 2x2-Gitter von Box-Plots aus, so dass der Benutzer mehrere Plots mit verschiedenen Parameterwerten zeigen kann. Es ist unten veröffentlicht.

Ich kämpfe um herauszufinden, wie man dies in eine Funktion, die die Funktion anwenden verwenden. Da apply eine Matrix benötigt, müsste ich für bestimmte Parameterwerte aus meiner Loop-Funktion for bereits eine Matrix m.out haben. Auch bin ich mir nicht sicher, was genau die Funktion wäre apply. Ich möchte den Mittelwert jedes Wertes in der Matrix nehmen.

Jede Hilfe wird geschätzt.

Venom<-function(n,l,m){ 
    if(!is.numeric(c(n,l,m))){return("Error non-numeric value entered for at `enter code here`least one parameter")} 
    m.out<-NULL 
    for(i in 1:m){ 
     data1<-rpois(n,l) 
     m.sim<-mean(data1) 
     m.out<-rbind(m.out, m.sim) 
    } 
    finalmean<-mean(m.out) 
    hist(m.out, main=paste("Poisson n=",n)) 
    return(c(finalmean, m.out)) 
} 
par(mfrow=c(2,2)) 

Antwort

3

Hier sind ein paar Basis R und Tidyverse Alternativen zu der for-Schleife.

set.seed(0) 
n = 10 
l = 5 
m = 20 

Zuerst, hier ist Ihre ursprüngliche Schleife. Ich ersetzte rbind durch c als m.out wird als ein Vektor und nicht als eine Matrix behandelt.

m.out <- NULL 
for(i in 1:m){ 
    data1 <- rpois(n,l) 
    m.sim <- mean(data1) 
    m.out <- c(m.out, m.sim) 
} 
print(m.out) 
# [1] 6.1 5.1 4.9 5.0 5.3 4.4 4.8 5.8 4.7 5.2 5.5 4.6 5.2 5.2 4.4 4.5 5.1 5.7 6.0 4.7 

Base-R

Wie Sie erwähnt haben, apply nimmt eine Matrix. sapply kann jedoch Vektoren als Eingabe und Ausgabe verwenden.

sapply(seq_len(m), function(x) { 
    mean(rpois(n, l)) 
}) 

Eine weitere Basis R Lösung ist replicate zu verwenden, die m mal einen folgenden Ausdruck wiederholt. simplify = T wird es einen Vektor anstelle einer Liste ausgeben lassen.

replicate(
    m, 
    mean(rpois(n, l)), 
    simplify = T) 

Tidyverse

rerun ist purrr ‚s Version von replicate. Es wird eine Liste erstellen, so dass wir unlist das Ergebnis benötigen.

library('tidyverse') 
rerun(m, mean(rpois(n, l))) %>% 
    unlist 

Ein anderer Weg ist map_dbl zu verwenden, die eine Funktion auf jedes Element in dem Vektor gelten und einen Vektor von Doppel zurück.

map_dbl(seq_len(m), ~mean(rpois(n, l))) 
+0

Okay danke für die Antwort, ich schätze es. –