计算R中一维截断分布(如对数正态分布)的期望值

计算R中一维截断分布(如对数正态分布)的期望值,r,R,在R中,我需要计算条件期望f(z)=E[x | x

在R中,我需要计算条件期望f(z)=E[x | x 为了计算例如f(2),我做了以下工作:

zz <- rlnorm(1000,meanlog=.7,sdlog=.5)
mean(zz[zz<2]) 
zz您正在查看的。将
x*f(x)
积分到
(-Inf,z)
,然后将该积分除以
f(z)
。[
f(x)
是无条件的PDF;
f(x)
是无条件的CDF。]


受Zheyuan答案的启发,对条件pdf为截断pdf的函数的条件期望进行了一些研究

根据我的说法,
mean(zz[zz
不是条件宇宙X 为了计算条件期望,我们必须使用截断pdf,从截断分布和非原始对数正态分布中提取样本,然后计算期望

可以看出,
mean(zz[zz
的值始终不同于使用带条件(截断)pdf的期望值计算的条件期望值,差异随着a的增加而增加(任何直觉为什么?)

#用x这似乎是一个很好的解决方案。悬停,由于某种原因,我无法绘制结果函数g。如果我做了
z=1:10
然后
plot(z,g(z,2,3))
得到的图是不正确的。事实上,如果我重新定义g,使其不被plnorm(…)
除,我会得到以下错误:
xy中的错误。coords(x,y,xlabel,ylabel,log):'x'和'y'长度不同
在我看来,你绘制的密度函数在相关区间内都是相同的(除了将其标准化以使其下的面积为1之外)。您在值中看到的差异只是“精确”值和样本值之间的差异(如果生成新样本,您可以看到样本平均值可能高于或低于计算值)@马西莫:我对n使用了一个相当高的值,这就是为什么平均值的波动会更小。但我的观点不同:当你计算平均值时(zz[zzAs],我写的,在相关的区间内(zok,我得到了你,它们只有在(X=a存在一些非零概率(在截断分布中,我们的概率为零),因此,提取X## 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
vg <- Vectorize(g, vectorize.args = "z")
plot(1:10, vg(1:10, 0.7, 0.5), type = "l")
# 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