HOWTO · R

replicate() função em R

Este tutorial apresenta os usos da função `replicate()` em R.

Nesta página

A função replicate() do R avalia uma expressão repetidamente e reúne cada resultado. Ela é útil quando o mesmo cálculo, sorteio aleatório ou simulação precisa ser executado várias vezes. O resultado da expressão e o argumento simplify determinam se os valores reunidos formam um vetor, uma matriz, um array ou uma lista.

O que replicate() repete

O primeiro argumento, n, indica o número de avaliações. O segundo argumento, expr, é avaliado uma vez a cada repetição. Por exemplo, o código a seguir retorna cinco cópias do valor escalar 1:

Execute este exemplo:

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

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

O vetor retornado contém um valor para cada avaliação. Se expr usa aleatoriedade, cada avaliação pode produzir um valor diferente; replicate() reúne esses resultados sem torná-los idênticos.

Sintaxe e o argumento simplify

A forma geral é replicate(n, expr, simplify = "array"). Nesse caso, n é o número de repetições, expr é a expressão a avaliar e simplify controla como o R simplifica os resultados reunidos. O valor padrão, "array", permite simplificar os resultados de acordo com seu formato: resultados escalares podem formar um vetor, vetores de mesmo comprimento podem formar uma matriz e resultados com dimensões maiores podem formar um array. Use simplify = FALSE para manter uma lista, por exemplo, quando cada repetição retorna um resultado que deve continuar sendo um objeto separado.

Execute este exemplo:

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

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

typeof() informa o tipo subjacente, e length() conta os elementos da lista.

Repetir um escalar ou vetor

Uma expressão escalar produz um resultado por repetição. Se a expressão retorna um vetor de mesmo comprimento em todas as avaliações, replicate() coloca cada vetor em uma coluna de uma matriz. Assim, as linhas correspondem às posições dentro do vetor e as colunas correspondem às repetições.

Execute este exemplo:

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

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

Use o mesmo padrão para um cálculo que retorna um vetor de comprimento fixo. Se os comprimentos dos resultados variarem, não será possível organizar os valores em uma matriz regular; defina simplify = FALSE para manter cada resultado em um elemento da lista.

Usar replicate() com um loop for()

Um loop for() pode construir um valor que se torna o resultado de cada repetição. Inicialize e preencha um vetor dentro da expressão e, em seguida, faça desse vetor o valor final da expressão:

Execute este exemplo:

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

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

A expressão final é values; por isso, cada avaliação retorna o vetor completo, e o resultado simplificado tem uma coluna por repetição. Um loop for() retorna NULL; imprimir valores dentro do loop não faz com que esses valores impressos sejam seu retorno. Se a expressão repetida consistir apenas em um loop desse tipo, cada repetição retornará NULL. Armazene os valores e retorne o objeto que os contém quando quiser incluí-los no resultado.

Repetir simulações aleatórias

Expressões aleatórias são avaliadas novamente a cada repetição. Por exemplo, rnorm(4) sorteia quatro valores de uma distribuição normal padrão. A matriz resultante tem uma coluna para cada sorteio de quatro valores; os números sorteados variam entre as execuções e não devem ser tratados como resultados fixos.

Execute este exemplo:

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

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

Também é possível repetir uma função de simulação. Defina a função para retornar a estatística ou medida desejada e, em seguida, passe uma chamada a ela como expr. Por exemplo, uma função que sorteia um valor com runif(1) pode ser avaliada várias vezes para estudar a distribuição dos valores simulados. Escolha e registre uma semente quando precisar de uma sequência aleatória reproduzível; sem uma semente fixa, os valores geralmente serão diferentes entre as execuções.

Reamostragem bootstrap com replicate()

A reamostragem bootstrap aproxima a incerteza sorteando amostras com reposição dos dados observados. Em cada repetição, sample() cria um conjunto de dados reamostrado. Quando cada amostra tem o mesmo tamanho que a original, o resultado simplificado é uma matriz cujas colunas são réplicas bootstrap.

Execute este exemplo:

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

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

Cada coluna representa um conjunto de dados reamostrado, e os valores podem aparecer mais de uma vez porque a amostragem é feita com reposição. Para calcular uma estatística bootstrap em vez de manter todos os valores sorteados, calcule a estatística dentro da expressão repetida, por exemplo, mean(sample(original_data, replace = TRUE)). Isso produz uma estatística por repetição, que normalmente é reunida em um vetor.