Estou tentando gerar amostras aleatórias de um pdf personalizado usando R. Meu pdf é:
Gerei amostras uniformes e tentei transformá-lo em minha distribuição personalizada. Eu fiz isso encontrando o cdf da minha distribuição ( ) e configurando-o para a amostra uniforme ( ) e resolvendo para .
Para gerar uma amostra aleatória com a distribuição acima, obtenha uma amostra uniforme e resolva em
Eu o implementei R
e não recebo a distribuição esperada. Alguém pode apontar a falha no meu entendimento?
nsamples <- 1000;
x <- runif(nsamples);
f <- function(x, u) {
return(3/2*(x-x^3/3) - u);
}
z <- c();
for (i in 1:nsamples) {
# find the root within (0,1)
r <- uniroot(f, c(0,1), tol = 0.0001, u = x[i])$root;
z <- c(z, r);
}
nsamples <- 1e6
, foi uma boa partida.Respostas:
Parece que você descobriu que seu código funciona, mas a @Aniko apontou que você poderia melhorar sua eficiência. Seu maior ganho de velocidade provavelmente viria da pré-alocação de memória para
z
que você não a cresça dentro de um loop. Algo comoz <- rep(NA, nsamples)
deve fazer o truque. Você pode obter um pequeno ganho de velocidade usandovapply()
(que especifica o tipo de variável retornado) em vez de um loop explícito (há uma ótima pergunta SO na família de aplicativos).E você não precisa do
;
final de cada linha (você é um convertido do MATLAB?).fonte
vapply
. Eu tenho codificadoC/C++
há muito tempo e essa é a razão da;
aflição!uniroot