set.seed() Vem Primeiro
Sorteios aleatórios que mudam a cada execução são inúteis para ensinar, avaliar, depurar ou fazer ciência - se sua simulação diz 0,146 hoje e 0,153 amanhã, qual número vai para o relatório? set.seed() fixa o ponto de partida do gerador, tornando todo o fluxo de "aleatoriedade" seguinte exatamente repetível:
Mesma semente, sorteios idênticos, toda vez, em qualquer máquina. Os números são pseudo-aleatórios: uma sequência determinística projetada para passar em todo teste estatístico de aleatoriedade, com a semente escolhendo em que ponto da sequência você começa. O valor da semente em si não carrega significado - 42, 7, 20260807 - escolha qualquer um; apenas anote-o. O hábito a construir: um set.seed() no topo de todo script que usa aleatoriedade. (Repare que consumir sorteios avança o estado, então a ordem das chamadas também importa para a reprodutibilidade.)
O Sistema d/p/q/r: Uma Tabela Decodifica a Biblioteca Inteira
O R nomeia toda função de distribuição como prefixo + família, e uma vez que você enxerga a grade consegue ler toda a biblioteca estatística:
| Prefixo | Pergunta que responde | Exemplo com a normal |
|---|---|---|
r | Me dê sorteios aleatórios | rnorm(5) |
d | Densidade: qual a altura da curva em x? | dnorm(0) |
p | Probabilidade: P(X ≤ x)? | pnorm(1.96) |
q | Quantil: qual x fica neste percentil? | qnorm(0.975) |
p e q são inversos, e são o par que você conheceu em intervalos de confiança como qt(0.975, df):
Troque o nome da família e tudo se transfere: runif/dunif/punif/qunif, rbinom/..., rpois/..., rt/..., rexp/.... Aprenda quatro prefixos, ganhe dezenas de distribuições.
rnorm(): Sorteios Normais
rnorm(n, mean, sd) sorteia de uma curva em sino - o burro de carga para simular dados de medição:
A média e o sd amostrais caem perto de - não exatamente em - 100 e 15: essa diferença é o ruído amostral, que encolhe conforme n cresce. A última linha é um truque que vale roubar: mean() de um vetor lógico é a proporção de TRUEs, e a fração acima de 130 sai perto do teórico 1 - pnorm(130, 100, 15) ≈ 2,3%. Os padrões são mean = 0, sd = 1 (a normal padrão). Um histograma de iq mostra o sino familiar.
runif(), rbinom(), rpois()
Mais três famílias cobrem a maioria das necessidades de simulação:
runif() espalha os sorteios uniformemente por uma faixa ("uniform", não "run if" - todo mundo lê errado uma vez). rbinom(n, size, prob) simula n experimentos de size tentativas cada, retornando a contagem de sucessos de cada um - então cada valor acima é o número de caras em 10 lançamentos. rpois(n, lambda) gera contagens de eventos que ocorrem independentemente a uma taxa média conhecida: chamados de suporte por hora, erros de digitação por página.
sample(): Amostragem e Embaralhamento
Onde as funções r* inventam valores a partir de uma distribuição, sample() sorteia a partir de valores que você já tem:
O argumento replace é toda a história: FALSE (padrão) distribui cartas - cada valor pode aparecer uma vez, e pedir mais do que você tem é um erro; TRUE joga dados - cada sorteio reinicia. Amostrar com reposição a partir dos seus próprios dados é o motor do bootstrap. Chamado apenas com um vetor, sample(x) retorna uma permutação aleatória - o idioma para embaralhar.
Amostrar linhas de um data frame usa sample() dentro da indexação de linhas:
sample(nrow(mtcars), 5) escolhe 5 números de linha aleatórios; a indexação puxa essas linhas. Esse é o movimento padrão para conferir por amostragem um conjunto de dados grande ou para separar conjuntos de treino/teste.
Uma Mini Simulação de Monte Carlo
Aqui está a recompensa de todo o kit. Pergunta: um processo produz medições distribuídas como N(100, 15); você tira a média de 10 delas - qual é a probabilidade de essa média passar de 105? Em vez de deduzir a resposta, simule - faça o experimento 10.000 vezes e conte:
A simulação cai a poucos milésimos do valor exato (cerca de 0,146). Isso é Monte Carlo em um fôlego: escreva um ensaio como uma função, aplique replicate() milhares de vezes e tire a mean() dos sucessos. A resposta exata existia aqui porque a montagem era simples como um livro-texto - no momento em que a pergunta fica bagunçada (distribuições estranhas, máximo de sorteios correlacionados, um jogo baseado em regras), o caminho analítico se fecha e a receita da simulação continua funcionando sem mudanças. Repare no 15 / sqrt(10) da checagem: médias oscilam menos que sorteios individuais - a mesma lei da raiz quadrada que determina as larguras dos intervalos de confiança.
Bom para Simulação, Não para Segredos
Uma fronteira a respeitar: o gerador padrão do R (Mersenne Twister) foi construído para qualidade estatística e velocidade, não para sigilo. Sua saída é determinística dada a semente, e seu estado interno pode ser reconstruído a partir da saída observada - falhas fatais para senhas, tokens ou qualquer coisa próxima de segurança. Para simulação, bootstrap e ensino ele é excelente; para criptografia, use uma biblioteca feita para isso (por exemplo, o pacote openssl), nunca sample() ou runif().
O Que Você Leva Daqui
set.seed()uma vez no topo torna todo resultado "aleatório" reprodutível - mesma semente, mesmos sorteios.- Os prefixos d/p/q/r decodificam a biblioteca inteira de distribuições: sorteio aleatório, densidade, probabilidade acumulada, quantil.
rnorm(n, mean, sd),runif(n, min, max),rbinom(n, size, prob),rpois(n, lambda)cobrem a maior parte das necessidades de simulação.sample()sorteia a partir dos seus próprios valores -replace = TRUEpara dados, padrão para cartas, semsizepara embaralhar;df[sample(nrow(df), k), ]amostra linhas.- Monte Carlo = função de um ensaio +
replicate()+mean()- a receita que responde perguntas de probabilidade que a matemática não alcança com conforto. - O gerador do R é para simulação, não para criptografia.
A seguir: depuração - o que as mensagens de erro do R realmente significam e como ler um traceback.
Perguntas frequentes
O que set.seed() faz no R?
Ele fixa o ponto de partida do gerador de números aleatórios do R, de modo que os sorteios "aleatórios" seguintes saiam idênticos em toda execução. Chame-o uma vez no topo de qualquer script que use aleatoriedade - set.seed(42) - e sua simulação vira reprodutível: colegas, avaliadores e o seu eu futuro veem todos os mesmos números.
Como gerar números aleatórios no R?
Escolha a distribuição: rnorm(n, mean, sd) para sorteios normais, runif(n, min, max) para uniformes, rbinom(n, size, prob) para contagens de sucessos, rpois(n, lambda) para contagens de eventos. Para amostrar a partir de valores existentes, use sample(x, size).
Qual é a diferença entre rnorm, dnorm, pnorm e qnorm?
Uma distribuição, quatro prefixos: r sorteia valores aleatórios, d dá a altura da curva de densidade, p dá a probabilidade acumulada P(X ≤ x), e q é o inverso dela - o valor em um dado percentil. Os mesmos quatro prefixos funcionam para toda distribuição que o R conhece: runif/dunif/punif/qunif, rbinom/dbinom/pbinom/qbinom, e assim por diante.
Como pegar uma amostra aleatória de linhas de um data frame no R?
Indexe as linhas com sample(): df[sample(nrow(df), 5), ] escolhe 5 linhas sem reposição. Acrescente replace = TRUE para amostragem com reposição (o movimento por trás do bootstrap).