Oft habe ich die set.seed
Funktion in R gesehen, bevor ich das Programm gestartet habe. Ich weiß, dass es grundsätzlich für die Zufallszahlengenerierung verwendet wird. Gibt es eine spezielle Notwendigkeit, dies einzustellen?
Oft habe ich die set.seed
Funktion in R gesehen, bevor ich das Programm gestartet habe. Ich weiß, dass es grundsätzlich für die Zufallszahlengenerierung verwendet wird. Gibt es eine spezielle Notwendigkeit, dies einzustellen?
Antworten:
Die Notwendigkeit ist der mögliche Wunsch nach reproduzierbaren Ergebnissen, der beispielsweise aus dem Versuch resultieren kann, Ihr Programm zu debuggen, oder natürlich aus dem Versuch, das zu wiederholen, was es tut:
Diese beiden Ergebnisse werden wir "nie" reproduzieren, da ich nur um etwas "Zufälliges" gebeten habe:
R> sample(LETTERS, 5)
[1] "K" "N" "R" "Z" "G"
R> sample(LETTERS, 5)
[1] "L" "P" "J" "E" "D"
Diese beiden sind jedoch identisch, weil ich den Samen gesetzt habe :
R> set.seed(42); sample(LETTERS, 5)
[1] "X" "Z" "G" "T" "O"
R> set.seed(42); sample(LETTERS, 5)
[1] "X" "Z" "G" "T" "O"
R>
Es gibt eine große Literatur zu all dem; Wikipedia ist ein guter Anfang. Im Wesentlichen werden diese RNGs als Pseudo-Zufallszahlengeneratoren bezeichnet, da sie tatsächlich vollständig algorithmisch sind : Bei gleichem Startwert erhalten Sie dieselbe Sequenz. Und das ist eine Funktion und kein Fehler.
char2seed
Funktion im TeachingDemos-Paket können Sie den Startwert (oder einen Startwert, an den übergeben werden soll set.seed
) basierend auf einer Zeichenfolge festlegen. Sie können beispielsweise festlegen, dass Schüler ihren Namen als Startwert verwenden, dann hat jeder Schüler einen eindeutigen Datensatz, aber der Kursleiter kann auch dieselben Datensätze für die Bewertung erstellen.
char2seed
und den Nachnamen des Hauptermittlers für ein Projekt.
set.seed(666)
und die Prüfer den Devils-Startwert im Code nicht mochten ...
Fügen Sie einfach einige zusätzliche Aspekte hinzu. Notwendigkeit, Samen zu setzen: Wenn man in der akademischen Welt behauptet, dass sein Algorithmus beispielsweise eine Leistung von 98,05% in einer Simulation erreicht, müssen andere in der Lage sein, diese zu reproduzieren.
?set.seed
In der Hilfedatei dieser Funktion sind einige interessante Fakten aufgeführt:
(1) set.seed () gibt NULL zurück, unsichtbar
(2) "Anfangs gibt es keinen Startwert. Aus der aktuellen Zeit und der Prozess-ID wird ein neuer erstellt, wenn einer erforderlich ist. Daher führen unterschiedliche Sitzungen standardmäßig zu unterschiedlichen Simulationsergebnissen. Der Startwert kann jedoch aus a wiederhergestellt werden vorherige Sitzung, wenn ein zuvor gespeicherter Arbeitsbereich wiederhergestellt wird. "Aus diesem Grund möchten Sie set.seed () mit denselben ganzzahligen Werten aufrufen, wenn Sie das nächste Mal dieselbe Folge von Zufallsfolgen wünschen.
Das Fixieren des Startwerts ist wichtig, wenn wir versuchen, eine Funktion zu optimieren, die zufällig generierte Zahlen enthält (z. B. bei simulationsbasierten Schätzungen). Wenn wir den Startwert nicht festlegen, führt die Variation aufgrund des Zeichnens unterschiedlicher Zufallszahlen wahrscheinlich dazu, dass der Optimierungsalgorithmus fehlschlägt.
Angenommen, Sie möchten aus irgendeinem Grund die Standardabweichung (sd) einer Mittelwert-Null-Normalverteilung durch Simulation anhand einer Stichprobe schätzen. Dies kann erreicht werden, indem eine numerische Optimierung um Schritte ausgeführt wird
Die folgenden Funktionen tun dies einmal ohne Schritt 1. einmal mit:
# without fixing the seed
simllh <- function(sd, y, Ns){
simdist <- density(rnorm(Ns, mean = 0, sd = sd))
llh <- sapply(y, function(x){ simdist$y[which.min((x - simdist$x)^2)] })
return(-sum(log(llh)))
}
# same function with fixed seed
simllh.fix.seed <- function(sd,y,Ns){
set.seed(48)
simdist <- density(rnorm(Ns,mean=0,sd=sd))
llh <- sapply(y,function(x){simdist$y[which.min((x-simdist$x)^2)]})
return(-sum(log(llh)))
}
Wir können die relative Leistung der beiden Funktionen bei der Ermittlung des wahren Parameterwerts anhand einer kurzen Monte-Carlo-Studie überprüfen:
N <- 20; sd <- 2 # features of simulated data
est1 <- rep(NA,1000); est2 <- rep(NA,1000) # initialize the estimate stores
for (i in 1:1000) {
as.numeric(Sys.time())-> t; set.seed((t - floor(t)) * 1e8 -> seed) # set the seed to random seed
y <- rnorm(N, sd = sd) # generate the data
est1[i] <- optim(1, simllh, y = y, Ns = 1000, lower = 0.01)$par
est2[i] <- optim(1, simllh.fix.seed, y = y, Ns = 1000, lower = 0.01)$par
}
hist(est1)
hist(est2)
Die resultierenden Verteilungen der Parameterschätzungen sind:
Wenn wir den Startwert festlegen, endet die numerische Suche weitaus häufiger nahe am wahren Parameterwert von 2.
Grundsätzlich hilft die Funktion set.seed () dabei, denselben Satz von Zufallsvariablen wiederzuverwenden, den wir möglicherweise in Zukunft benötigen, um eine bestimmte Aufgabe erneut mit denselben zufälligen Varibalen auszuwerten
Wir müssen es nur deklarieren, bevor wir eine Funktion zur Erzeugung von Zufallszahlen verwenden.