在R,I需要計算條件期望F(z)的= E [X | X < Z],其中X分佈根據參數分佈(即,對數正態分佈)。計算期望(比如對數正態)中的R
爲了計算例如F(2)我已經做了以下內容:
zz <- rlnorm(1000,meanlog=.7,sdlog=.5)
mean(zz[zz<2])
不過,我不知道是否有一個更直接的方式,不需要生成樣本。
在R,I需要計算條件期望F(z)的= E [X | X < Z],其中X分佈根據參數分佈(即,對數正態分佈)。計算期望(比如對數正態)中的R
爲了計算例如F(2)我已經做了以下內容:
zz <- rlnorm(1000,meanlog=.7,sdlog=.5)
mean(zz[zz<2])
不過,我不知道是否有一個更直接的方式,不需要生成樣本。
您正在查看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")
宋哲元通過的回答啓發,做了一點點研究上的功能,其中的條件概率密度爲截斷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)
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
對這個有什麼想法?
在我看來,你所繪製的密度函數在相關區間內都是相同的(除了它們被歸一化以便它們之間的區域爲1)。您在值中看到的差異只是「精確」值與樣本值之間的差異(如果您生成新樣本,則可以看到樣本均值可以高於或低於計算值) – Massimo2013
這似乎是一個很好的解決方案。由於某種原因,懸停,我無法繪製結果函數g。如果我做'z = 1:10',然後'plot(z,g(z,2,3))',那麼結果圖是不正確的。事實上,如果我重新定義'g',以便它不被'plnorm(...)分割',我得到以下錯誤:'xy.coords(x,y,xlabel,ylabel,log)中的錯誤:'x'和'y'長度不同' – Massimo2013