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.