计算R中1D截断分布(比如log-normal)的期望值

时间:2016-09-28 09:28:56

标签: r

在R中,我需要计算条件期望 f(z)= E [x | x< z] ,其中 x 根据参数分布(即对数正态分布)分布。

计算,例如 f(2)我做了以下事情:

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

但是,我想知道是否有更直接的方式,不需要生成样本。

2 个答案:

答案 0 :(得分:1)

您正在查看truncated distribution。在 ssh-agent bash -c "ssh-add user_rsa_key; ssh-add -l" 上整合x * f(x),然后将此积分除以(-Inf, z)。 [ F(z)是无条件的PDF; f(x)是无条件的CDF。]

F(x)

我曾计划编写一两行LaTeX来说明为什么我们想要一个如上所述的积分,但看起来维基百科的链接足够信息。

  

出于某种原因,我无法绘制结果函数## 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 g发出错误。

要绘制plot(1, g(1:10,0.7,0.5)),首先需要将其设为矢量化函数。有一些关于绘制积分的帖子,如R plotting integral。以下是我们可以做的事情:

g

enter image description here

答案 1 :(得分:0)

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

据我所知,mean(zz[zz < a]) 条件Universe 中的条件期望 <&lt; a ,因为用于生成zz值的pdf是原始lognormal pdf 而不是条件截断pdf

为了计算条件期望,我们必须使用截断的pdf 并从截断的分布中绘制样本而不是原始的对数正态分布,然后计算期望值。

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

# 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

对此有何想法?