2016-09-28 120 views
-1

在R,I需要計算條件期望F(z)的= E [X | X < Z],其中X分佈根據參數分佈(即,對數正態分佈)。計算期望(比如對數正態)中的R

爲了計算例如F(2)我已經做了以下內容:

zz <- rlnorm(1000,meanlog=.7,sdlog=.5) 
mean(zz[zz<2]) 

不過,我不知道是否有一個更直接的方式,不需要生成樣本。

回答

1

您正在查看truncated distribution。將x * f(x)積分爲(-Inf, z),然後將該積分除以F(z)。 [f(x)是無條件的PDF; F(x)是無條件CDF。]

## integrand 
f <- function(x, mu, sigma) x * dlnorm(x, mu, sigma) 

## conditional expectation 
g <- function(z, mu, sigma) { 
    int <- integrate(f, lower = -Inf, upper = z, mu = mu, sigma = sigma) 
    int$value/plnorm(z, mu, sigma) 
    } 

## theoretical value 
g(2, 0.7, 0.5) 
# [1] 1.401472 

## sample estimate 
set.seed(0) 
zz <- rlnorm(1000,meanlog=.7,sdlog=.5) 
mean(zz[zz<2]) 
# [1] 1.40316 

我已經刨去寫乳膠一行或兩行說明了爲什麼我們需要一個整體如上,但它看起來像維基百科的鏈接是足夠的信息。


For some reason, I am not able to plot the resulting function g . plot(1, g(1:10,0.7,0.5)) is giving an error.

要繪製,你需要使它成爲一個量化的功能第一g。有一些關於繪製積分的帖子,如R plotting integral。下面是我們可以做的:

vg <- Vectorize(g, vectorize.args = "z") 
plot(1:10, vg(1:10, 0.7, 0.5), type = "l") 

enter image description here

+0

這似乎是一個很好的解決方案。由於某種原因,懸停,我無法繪製結果函數g。如果我做'z = 1:10',然後'plot(z,g(z,2,3))',那麼結果圖是不正確的。事實上,如果我重新定義'g',以便它不被'plnorm(...)分割',我得到以下錯誤:'xy.coords(x,y,xlabel,ylabel,log)中的錯誤:'x'和'y'長度不同' – Massimo2013

0

宋哲元通過的回答啓發,做了一點點研究上的功能,其中的條件概率密度爲截斷PDF的條件期望。

據我,mean(zz[zz < a])在有條件的宇宙X <一個條件期望,因爲這是用於生成ZZ值是原來的對數正態分佈的PDF而不是的PDF有條件截短的pdf

爲了計算條件期望我們必須使用截斷PDF截斷分佈和不是原來的對數正態分佈得出樣本,然後計算期望。

如可以看到的,的mean(zz[zz < a])值總是從條件期望不同使用期望具有條件(截斷)PDF計算,差值隨着一個增加(任何直覺爲什麼?)。

# compute the truncated pdf with x < a 
tr.pdf <- function(x, a, m, s) (x < a) * (dlnorm(x, m, s)/plnorm(a, m, s)) 

expect.f <- function(x, a, m, s) x * tr.pdf(x, a, m, s) 

cond.expect.f <- function(a, m, s) { 
    return(integrate(expect.f, lower = -Inf, upper = a, a = a, m = m, s = s)$value) 
} 

m <- .7 
s <- .5 
curve(tr.pdf(x, a=2, m, s), 0, 5, col='red', ylab='y') 
curve(tr.pdf(x, a=2.5, m, s), 0, 5, col='green', add=TRUE) 
curve(tr.pdf(x, a=3, m, s), 0, 5, col='blue', add=TRUE) 
curve(dlnorm(x, m, s), 0, 5, add=TRUE) 

enter image description here

n <- 100000 
zz <- rlnorm(n,meanlog=m,sdlog=s) 

a <- 2 
mean(zz[zz<a]) 
#[1] 1.404279 
cond.expect.f(a, m, s) 
#[1] 1.401472 

a <- 2.5 
mean(zz[zz<a]) 
#[1] 1.622174 
cond.expect.f(a, m, s) 
#[1] 1.617784 

a <- 3 
mean(zz[zz<a]) 
#[1] 1.794217 
cond.expect.f(a, m, s) 
#[1] 1.787772 

對這個有什麼想法?

+0

在我看來,你所繪製的密度函數在相關區間內都是相同的(除了它們被歸一化以便它們之間的區域爲1)。您在值中看到的差異只是「精確」值與樣本值之間的差異(如果您生成新樣本,則可以看到樣本均值可以高於或低於計算值) – Massimo2013

+0

@Massimo:I已經使用了相當高的值,這就是爲什麼平均值的波動將會更小。但是我的觀點是不同的:當你計算平均值(zz [zz

+0

正如我寫的,在相關區間(z Massimo2013