2014-05-09 40 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