2014-05-09 10 views
9

Ich möchte die Faltung von zwei Wahrscheinlichkeitsverteilungen in R berechnen und ich brauche Hilfe. Der Einfachheit halber, sagen wir, habe ich eine Variable x, die normalerweise mit Mittelwert = 1.0 und stdev = 0.5 verteilt ist, und y, das logarithmisch normalverteilt ist mit Mittelwert = 1.5 und stdev = 0.75. Ich möchte z = x + y bestimmen. Ich verstehe, dass die Verteilung von z a priori nicht bekannt ist.Hinzufügen von zwei Zufallsvariablen über Faltung in R

Als Nebenbei benötigt das reale Beispiel, mit dem ich arbeite, zusätzlich zu zwei Zufallsvariablen, die nach einer Anzahl verschiedener Distributionen verteilt sind.

Kann jemand zwei Zufallsvariablen hinzufügen, indem er die Wahrscheinlichkeitsdichtefunktionen von x und y faltet?

Ich habe versucht, n normalverteilte Zufallswerte (mit obigen Parametern) zu erzeugen und sie zu n log-normalverteilten Zufallswerten zu addieren. Ich möchte jedoch wissen, ob ich stattdessen die Faltungsmethode verwenden kann. Jede Hilfe würde sehr geschätzt werden.

EDIT

diese Antworten Vielen Dank für. Ich definiere ein pdf und versuche das Faltungsintegral zu machen, aber R beschwert sich über den Integrationsschritt. Mein pdfs sind Log Pearson 3 und sind wie folgt

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 im letzten Schritt beschwert, da die f.t Funktion begrenzt ist und meine Integrationsgrenzen sind wahrscheinlich nicht korrekt. Irgendwelche Ideen, wie man das löst?

+1

Ich schlage vor, Sie überprüfen die [distr Paket] (http://cran.r-project.org/web/packages/distr/index.html) oder zumindest nehmen eine schnelle einen die [Vignette aussehen ] (http://cran.r-project.org/web/packages/distr/vignettes/newDistributions.pdf). Ich denke, es ist genau das, wonach Sie suchen. Die Strategie, die Sie verwendet haben, um zufällige Werte zu generieren, ist jedoch ebenfalls vollkommen gültig. – MrFlick

Antwort

12

Hier ist eine Möglichkeit.

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

Das Gleiche gilt Paket mit 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

In Bezug auf Ihre dlp3-Distributionen, sind Sie sicher, dass Ihre Gleichung korrekt ist? Ihre Funktion 'dlp3 (...)' divergiert. Versuchen Sie 'x <- seq (0,100, .1); plot (x, dlp3 (x, 3, -0,2,0,5)) '. In der Tat kann gezeigt werden, dass für großes x ~ x^4 * log (x)^2 folgt. – jlhoward