HOWTO · R

funzione replicate() in R

Questo tutorial introduce l'uso della funzione replicate() in R

In questa pagina

In R, replicate() valuta ripetutamente un’espressione e raccoglie ogni risultato. È utile quando occorre eseguire più volte lo stesso calcolo, estrazione casuale o simulazione. Il risultato dell’espressione e l’argomento simplify determinano se i valori raccolti formano un vettore, una matrice, un array o una lista.

Cosa ripete replicate()

Il primo argomento, n, indica il numero di valutazioni. Il secondo, expr, viene valutato una volta per ogni ripetizione. Per esempio, il codice seguente restituisce cinque copie del valore scalare 1:

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

result <- replicate(5, 1)
print(result)

Il vettore restituito contiene un valore per ogni valutazione. Se expr usa la casualità, ogni valutazione può produrre un valore diverso; replicate() raccoglie questi risultati senza renderli identici.

Sintassi e argomento simplify

La forma generale è replicate(n, expr, simplify = "array"). Qui, n è il numero di ripetizioni, expr è l’espressione da valutare e simplify controlla come R semplifica i risultati raccolti. Il valore predefinito, "array", consente di semplificare i risultati in base alla loro forma: i risultati scalari possono formare un vettore, vettori della stessa lunghezza possono formare una matrice e risultati con più dimensioni possono formare un array. Usa simplify = FALSE per mantenere una lista, ad esempio quando ogni ripetizione restituisce un risultato che deve restare un oggetto separato.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

values <- replicate(3, c("red", "blue"), simplify = FALSE)
print(typeof(values))
print(length(values))
[1] "list"
[1] 3

typeof() indica il tipo sottostante, mentre length() conta gli elementi della lista.

Ripetere uno scalare o un vettore

Un’espressione scalare produce un risultato per ogni ripetizione. Se l’espressione restituisce ogni volta un vettore della stessa lunghezza, replicate() inserisce ciascun vettore in una colonna della matrice. Le righe corrispondono quindi alle posizioni nel vettore e le colonne alle ripetizioni.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

result <- replicate(3, seq(1, 4))
print(result)

Puoi usare lo stesso schema per un calcolo che restituisce un vettore di lunghezza fissa. Se le lunghezze dei risultati variano, i valori non possono essere disposti in una matrice regolare: imposta simplify = FALSE per conservare ogni risultato in un elemento della lista.

Usare replicate() con un ciclo for()

Un ciclo for() può costruire un valore che diventa il risultato di ogni ripetizione. Inizializza e riempi un vettore all’interno dell’espressione, quindi fai in modo che quel vettore sia il suo valore finale:

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

result <- replicate(2, {
  values <- numeric(4)
  for (i in seq_len(4)) {
    values[i] <- i * 2
  }
  values
})
print(result)

L’espressione finale è values, quindi ogni valutazione restituisce il vettore completato e il risultato semplificato ha una colonna per ogni ripetizione. Un ciclo for() restituisce NULL; stampare valori all’interno del ciclo non li rende il suo valore restituito. Se l’espressione ripetuta consiste soltanto in un ciclo di questo tipo, ogni ripetizione restituisce NULL. Per includere i valori nel risultato, salvali e restituisci l’oggetto che li contiene.

Ripetere simulazioni casuali

Le espressioni casuali vengono valutate da capo a ogni ripetizione. Per esempio, rnorm(4) estrae quattro valori da una distribuzione normale standard. La matrice risultante ha una colonna per ciascuna estrazione di quattro valori; i numeri estratti variano da un’esecuzione all’altra, quindi non vanno considerati risultati fissi.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

set.seed(42)
draws <- replicate(3, rnorm(4))
print(dim(draws))

Puoi ripetere anche una funzione di simulazione. Definiscila in modo che restituisca la statistica o la misura che ti interessa, quindi passa una chiamata a quella funzione come expr. Per esempio, puoi valutare molte volte una funzione che estrae un valore con runif(1) per studiare la distribuzione dei valori simulati. Scegli e registra un seed se ti serve una sequenza casuale riproducibile; senza un seed fisso, i valori in genere cambiano tra un’esecuzione e l’altra.

Ricampionamento bootstrap con replicate()

Il ricampionamento bootstrap approssima l’incertezza estraendo campioni con reinserimento dai dati osservati. A ogni ripetizione, sample() crea un nuovo dataset ricampionato. Se ogni campione ha la stessa dimensione dell’originale, il risultato semplificato è una matrice le cui colonne rappresentano repliche bootstrap.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

original_data <- c(2, 4, 6, 8, 10)
set.seed(42)
resamples <- replicate(5, sample(original_data, replace = TRUE))
print(dim(resamples))

Ogni colonna rappresenta un dataset ricampionato. Poiché il campionamento avviene con reinserimento, uno stesso valore può comparire più volte. Per applicare il bootstrap a una statistica invece di conservare ogni valore campionato, calcola la statistica nell’espressione ripetuta, per esempio mean(sample(original_data, replace = TRUE)). Otterrai una statistica per ripetizione, raccolta in genere in un vettore.