2012-06-06 31 views
17

Capisco cosa fa set.seed() e quando posso usarlo, ma ho ancora molte domande sulla funzione. Qui ci sono alcuni:Domande su set.seed() in R

  1. E 'possibile "reset" set.seed() a qualcosa di "più casuale", se avete chiamato set.seed() in precedenza nella sessione? E 'anche necessario?
  2. È possibile visualizzare il seme che R sta attualmente utilizzando?
  3. C'è un modo per rendere set.seed() consentire i semi alfanumerici, il modo in cui è possibile inserirli a random.org (assicurarsi di essere in modalità avanzata e vedere "Parte 3" del modulo per vedere cosa intendo)?
+4

1. Non penso sia necessario; 2. '? .Random.seed' (è un po 'più complicato di così, ma forse qualcun altro risponderà) –

+2

Leggi' 'RNG' per ottenere la maggior parte delle tue risposte – Andrie

risposta

18

Solo per divertimento:

set.seed.alpha <- function(x) { 
    require("digest") 
    hexval <- paste0("0x",digest(x,"crc32")) 
    intval <- type.convert(hexval) %% .Machine$integer.max 
    set.seed(intval) 
} 

modo da poter fare:

set.seed.alpha("hello world") 

(in realtà x può essere qualsiasi Oggetto R, non solo una stringa alfanumerica)

+0

Bello" solo per divertimento " risposta. In realtà, vorrei creare un vettore di semi da utilizzare in una funzione. Quindi, supponendo che sto creando semi basati su un oggetto chiamato 'village.names', probabilmente farei qualcosa di più simile a:' hexval <- paste0 ("0x", sapply (village.names, digest, "crc32")) ; intval <- type.convert (hexval) %% .Machine $ integer.max' per generare una lista di semi da passare ad un'altra funzione. Grazie per tutti i tuoi suggerimenti finora! – A5C1D2H2I1M1N2O1R2T1

12

È possibile, se si imposta il seme su qualcosa come le cifre finali della propria epoca temporale, ma in realtà non è necessario. L'uso previsto dei PRNG è che si imposta il seme una volta all'inizio di una sessione e si utilizzano le variabili generate successive da questo. Fai le cose in modo diverso, e non puoi goderti le varie buone proprietà teoriche ed empiriche che hanno gli R RNG.

Ma non sono sicuro che capiate davvero lo scopo di set.seed. Non è davvero lì per te ottenere numeri "più casuali". Se stai facendo un qualche tipo di applicazione per cui il R PRNG è insufficiente (ad esempio, se hai bisogno di casualità crittografica), potresti anche generare tutti i tuoi numeri casuali con un metodo alternativo e usarli direttamente. Il vero scopo di set.seed è di produrre riproducibilità nei risultati usando gli RNG. Se si avvia la stessa analisi utilizzando la stessa sequenza di generazioni di numeri casuali e si imposta il seme sullo stesso valore, si otterrà sempre lo stesso risultato. Ciò è utile per il debug e per gli altri per la revisione dei risultati.

di utilizzare il tempo dell'epoca, fare qualcosa di simile

t <- as.numeric(Sys.time()) 
seed <- 1e8 * (t - floor(t)) 
set.seed(seed); print(seed) 
+0

Capisco lo scopo di' set.seed() ' in termini di rendere le cose riproducibili e così via. Quello che stavo guardando è, diciamo, che faccio 'set.seed (123); a = campione (300, 30); b = sample (300, 30) 'ma sono interessato solo a rendere' a' "riproducibile" - Voglio che i risultati di 'b' siano diversi ogni volta. Per me, questo significa che tra l'esecuzione della riga per 'a' e la riga per' b', ho bisogno di resettare il seme in qualche modo. – A5C1D2H2I1M1N2O1R2T1

+6

Oh okay. Bene, provando qualcosa come 'as.numeric (Sys.time()) -> t; set.seed ((t - floor (t)) * 1e8 -> seed); print (seed) 'sarà efficace per la maggior parte degli scopi. – Fhnuzoag

+2

Fhnuzoag che dovrebbe essere una risposta, non un commento, IMO. –

6

Per la domanda 3 c'è la funzione char2seed nel pacchetto TeachingDemos che prenderà una stringa di caratteri (alhpa numerico) e la convertirà in un numero intero e, per impostazione predefinita, userà quella per impostare un nuovo seme. L'idea era che gli studenti potessero usare il loro nome (o qualche combinazione/sottoinsieme di nomi) come seme in modo che ogni studente avesse un set di dati diverso, ma l'insegnante può riprodurre il set di dati di ogni studente.

+0

Grazie per il suggerimento. Non l'ho specificato nella mia domanda iniziale, ma ho effettivamente bisogno di creare un vettore di semi basato su un vettore di stringhe di caratteri. Sembra che la tua funzione non sia in grado di farlo; ho ragione? Ottimo pacchetto, a proposito. – A5C1D2H2I1M1N2O1R2T1

+1

La versione corrente genererà solo 1 seme, non un vettore (in base alla progettazione per gli scopi precedenti), c'è un [[1]] codificato in.Ma potrebbe essere modificato (usare sdolcinato invece di afferrare il primo elemento del risultato di 'strsplit') per lavorare con i vettori, o un semplice uso di' sapply', 'mapply', o' Vectorize' potrebbe essere usato con 'char2seed 'per ottenere un risultato vettoriale da un input vettoriale. –

2

Per una risposta a 2, vedere prima la pagina di guida ?RNGkind.

per trovare il tipo di RNG in uso:

RNGkind() 
# [1] "Mersenne-Twister" "Inversion" 

Il Mersenne Twister è il valore predefinito.

Dalla pagina di aiuto:

‘ "Mersenne-Twister":’ Da Matsumoto e Nishimura (1998).A GFSR ritorto con periodo 2^19937-1 e equidistribuzione in 623 dimensioni consecutive (per l'intero periodo). Il "seme" è un insieme 624-dimensionale di numeri interi a 32 bit più una posizione corrente in tale serie.

Per trovare il seme corrente in uso, è necessario prima chiamare il generatore di numeri casuali.

runif(1, 0, 1)                                     
# [1] 0.9834062                                      
.Random.seed 
# [Gives a 626 length vector] 

Calling set.seed(some_integer) seguito da .Random.seed, darà sempre lo stesso vettore 626 di lunghezza, se si utilizza lo stesso some_integer. Per dirla in modo diverso, il vettore di lunghezza 626 è determinato esclusivamente da some_integer, dato che si sta utilizzando il Mersenne Twister, ovviamente.

Inoltre, ovviamente, l'esecuzione di set.seed su un valore fisso fornirà gli stessi valori per le chiamate a routine di numeri casuali che lo seguono. Questo è l'uso principale in pratica, per dare riproducibilità. Per esempio.

set.seed(1) 
runif(5, 0, 1) 
# [1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819 
rnorm(1, 0, 1) 
# [1] 1.272429 
set.seed(1) 
runif(5, 0, 1) 
# [1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819 
rnorm(1, 0, 1) 
# [1] 1.272429 

Tutto il codice generatore di numeri di base in R è nel file src/main/RNG.c nel codice sorgente.

È in C, ma abbastanza facile da seguire.

0

Ho lo stesso problema come in questione 1. Ho quindi immagino che posso semplicemente ripristinare seme nel loop:

set.seed(123) 
x<- rnorm(10,1,1) 
set.seed(null) 

In questo modo alla fine di ogni ciclo del seme appena stato cancellato. Ha funzionato per me.

+0

Grazie per la risposta. Un approccio più comune/ortodosso sarebbe 'rm (.Random.seed, envir = globalenv())', che è menzionato nel file di aiuto per '? .Random.seed' ... che sono arrivato solo dopo questa domanda :-) – A5C1D2H2I1M1N2O1R2T1

+0

'set.seed (null)' non ha funzionato per me. C'è un altro modo per reimpostare il valore di seed o annullarlo. – mockash