2014-05-09 14 views
9

Tôi muốn tính toán sự phân chia của hai phân bố xác suất trong R và tôi cần một số trợ giúp. Để đơn giản, giả sử tôi có một biến x thường được phân phối với giá trị trung bình = 1,0 và stdev = 0,5, và y là phân phối log bình thường với giá trị trung bình = 1,5 và stdev = 0,75. Tôi muốn xác định z = x + y. Tôi hiểu rằng sự phân bố của z không được biết đến là một ưu tiên.Thêm hai biến ngẫu nhiên qua convolution trong R

Ví dụ thế giới thực mà tôi đang làm việc với yêu cầu bổ sung hai biến ngẫu nhiên được phân phối theo một số bản phân phối khác nhau.

Có ai biết cách thêm hai biến ngẫu nhiên bằng cách chuyển đổi các hàm mật độ xác suất của x và y không?

Tôi đã thử tạo n giá trị ngẫu nhiên được phân phối bình thường (với các tham số ở trên) và thêm chúng vào n giá trị ngẫu nhiên được phân phối bình thường. Tuy nhiên, tôi muốn biết nếu tôi có thể sử dụng phương pháp convolution thay thế. Mọi sự trợ giúp sẽ rất được trân trọng.

EDIT

Cảm ơn bạn cho các câu trả lời. Tôi định nghĩa một pdf, và cố gắng làm tích phân chập, nhưng R phàn nàn về bước tích hợp. pdf của tôi là Log Pearson 3 và như sau

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) 

R phàn nàn ở bước cuối cùng kể từ khi chức năng f.t giáp và giới hạn tích hợp của tôi có lẽ không đúng. Bất kỳ ý tưởng về cách giải quyết này?

+1

Tôi khuyên bạn nên xem [gói distr] (http://cran.r-project.org/web/packages/distr/index.html) hoặc ít nhất hãy xem nhanh [họa tiết ] (http://cran.r-project.org/web/packages/distr/vignettes/newDistributions.pdf). Tôi nghĩ đó chính xác là những gì bạn đang tìm kiếm. Mặc dù chiến lược bạn đã sử dụng để tạo các giá trị ngẫu nhiên cũng hoàn toàn hợp lệ. – MrFlick

Trả lời

12

Đây là một cách.

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") 

Cùng một điều sử dụng gói 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

Về phân phối dlp3 của bạn, bạn có chắc phương trình của bạn là chính xác không? Hàm phân tách 'dlp3 (...)' của hàm của bạn. Hãy thử 'x <- seq (0,100, .1); cốt truyện (x, dlp3 (x, 3, -0.2,0.5)) '. Trong thực tế, nó có thể được hiển thị để làm theo ~ x^4 * log (x)^2 cho lớn x. – jlhoward

Các vấn đề liên quan