2014-05-09 42 views
9

我想计算R中两个概率分布的卷积,我需要一些帮助。为了简单起见,假设我有一个变量x,它通常以均值= 1.0和stdev = 0.5分布,y是对数正态分布,平均值= 1.5和stdev = 0.75。我想确定z = x + y。我知道z的分布并不是先验的。通过卷积在R中添加两个随机变量

另外,我正在处理的真实世界示例需要添加两个随机变量,这些变量根据多种不同的分布进行分布。

有谁知道如何通过卷积x和y的概率密度函数来添加两个随机变量?

我试着生成n个正态分布的随机值(以上参数)并将它们添加到n个对数正态分布的随机值。但是,我想知道是否可以使用卷积方法。任何帮助将不胜感激。

编辑

感谢您对这些问题的答案。我定义了一个pdf,并尝试进行卷积积分,但R抱怨积分步骤。我对PDF进行登录皮尔逊3如下

dlp3 <- function(x, a, b, g) { 
p1 <- 1/(x*abs(b) * gamma(a)) 
p2 <- ((log(x)-g)/b)^(a-1) 
p3 <- exp(-1* (log(x)-g)/b) 
d <- p1 * p2 * p3 
return(d) 
} 

f.m <- function(x) dlp3(x,3.2594,-0.18218,0.53441) 
f.s <- function(x) dlp3(x,9.5645,-0.07676,1.184) 

f.t <- function(z) integrate(function(x,z) f.s(z-x)*f.m(x),-Inf,Inf,z)$value 
f.t <- Vectorize(f.t) 
integrate(f.t, lower = 0, upper = 3.6) 

因为f.t功能为界[R在最后一步抱怨和我的积分界限可能是不正确的。有关如何解决这个问题的任何想法?

+1

我建议你查看[distr package](http://cran.r-project.org/web/packages/distr/index.html)或者至少快速看一下[vignette ](http://cran.r-project.org/web/packages/distr/vignettes/newDistributions.pdf)。我想这正是你要找的。尽管您用来生成随机值的策略也非常有效。 – MrFlick

回答

12

这是一种方法。

f.X <- function(x) dnorm(x,1,0.5)  # normal (mu=1.5, sigma=0.5) 
f.Y <- function(y) dlnorm(y,1.5, 0.75) # log-normal (mu=1.5, sigma=0.75) 
# convolution integral 
f.Z <- function(z) integrate(function(x,z) f.Y(z-x)*f.X(x),-Inf,Inf,z)$value 
f.Z <- Vectorize(f.Z)     # need to vectorize the resulting fn. 

set.seed(1)        # for reproducible example 
X <- rnorm(1000,1,0.5) 
Y <- rlnorm(1000,1.5,0.75) 
Z <- X + Y 
# compare the methods 
hist(Z,freq=F,breaks=50, xlim=c(0,30)) 
z <- seq(0,50,0.01) 
lines(z,f.Z(z),lty=2,col="red") 
使用包 distr

同样的事情。

library(distr) 
N <- Norm(mean=1, sd=0.5)   # N is signature for normal dist 
L <- Lnorm(meanlog=1.5,sdlog=0.75) # same for log-normal 
conv <- convpow(L+N,1)    # object of class AbscontDistribution 
f.Z <- d(conv)     # distribution function 

hist(Z,freq=F,breaks=50, xlim=c(0,30)) 
z <- seq(0,50,0.01) 
lines(z,f.Z(z),lty=2,col="red") 
+0

关于你的dlp3分布,你确定你的方程是正确的吗?你的函数'dlp3(...)'发散。尝试'x < - seq(0,100,.1);积(X,dlp3(X,3,-0.2,0.5))'。事实上,对于大的x,它可以表示遵循〜x^4 * log(x)^ 2。 – jlhoward