2010-08-25 11 views

Respuesta

8

Esto es bastante sencillo utilizando el " distr" paquete:

library(distr) 

A <- Exp(rate=3) 
B <- Gammad(shape=2, scale=3) 

conv <- 0.5*(A+B) 

plot(conv) 
plot(conv, to.draw.arg=1) 

Editar por JD largo

parcela resultante es la siguiente: alt text

+0

Eso es bastante limpio. No estaba familiarizado con el paquete distr. –

1

No soy un programador R, pero podría ser útil saber que para las variables aleatorias independientes con archivos PDF f (x) y f (x), la PDF de la suma de las dos variables es dada por la convolución f * f (x) de los dos archivos PDF de entrada.

2

Aquí hay un intento de hacer la convolución (a la que se refiere @Jim Lewis) en R. Tenga en cuenta que probablemente haya maneras mucho más eficientes de hacerlo.

lower <- 0 
upper <- 20 
t <- seq(lower,upper,0.01) 
fA <- dexp(t, rate = 0.4) 
fB <- dgamma(t,shape = 8, rate = 2) 
## C has the same distribution as (A + B)/2 
dC <- function(x, lower, upper, exp.rate, gamma.rate, gamma.shape){ 
    integrand <- function(Y, X, exp.rate, gamma.rate, gamma.shape){ 
    dexp(Y, rate = exp.rate)*dgamma(2*X-Y, rate = gamma.rate, shape = gamma.shape)*2 
    } 
    out <- NULL 
    for(ix in seq_along(x)){ 
    out[ix] <- 
     integrate(integrand, lower = lower, upper = upper, 
       X = x[ix], exp.rate = exp.rate, 
       gamma.rate = gamma.rate, gamma.shape = gamma.shape)$value 
    } 
    return(out) 
} 
fC <- dC(t, lower=lower, upper=upper, exp.rate=0.4, gamma.rate=2, gamma.shape=8) 
## plot the resulting distribution 
plot(t,fA, 
    ylim = range(fA,fB,na.rm=TRUE,finite = TRUE), 
    xlab = 'x',ylab = 'f(x)',type = 'l') 
lines(t,fB,lty = 2) 
lines(t,fC,lty = 3) 
legend('topright', c('A ~ exp(0.4)','B ~ gamma(8,2)', 'C ~ (A+B)/2'),lty = 1:3) 
+0

No se moleste en la generación de los datos de las funciones, simplemente dibujar las funciones. Utilizaría curve() en lugar de lines() con add = TRUE. – John

5

Si sólo está buscando gráfica rápida que suele hacer el enfoque de simulación rápida y sucia. Hago un poco de llama, Mate de una densidad de Gauss en los sorteos y el argumento de que el chico malo:

numDraws <- 1e6 
gammaDraws <- rgamma(numDraws, 2) 
expDraws <- rexp(numDraws) 
combined <- .5 * (gammaDraws + expDraws) 
plot(density(combined)) 

resultado debe ser un poco como esto:

alt text

Cuestiones relacionadas