在R中微分pnorm(),表明连续变量的PDF是CDF的导数



我需要证明概率密度函数是CDF的导数。任何分布都可以,但我一直在尝试用正态分布。我已经读到:

set.seed(53)
b <- rnorm(500)
db <- density(b)
plot(db)

然后我可以使用pnorm(b)计算累积概率,但是我不知道如何微分,因为D()需要一个表达式而不是pnorm()。有人能帮忙吗?

这是我演示dnormpnorm从-Inf到选定值的积分接近相等(小数点后5或7位)的控制台剪辑:微积分基本定理说,如果函数f(x)的积分是g(x),那么f(x)是g(x)的导数。(或类似的话)

> sapply(c(0,Inf), function(x) integrate(dnorm, lower=-Inf, upper=x))
[,1]         [,2]        
value        0.5          1           
abs.error    4.680562e-05 9.361124e-05
subdivisions 3            3           
message      "OK"         "OK"        
call         expression   expression  
> sapply(c(0,Inf), function(x) integrate(dnorm, lower=-Inf, upper=x)$value)
[1] 0.5 1.0
> sapply(seq(-3,3, by=0.5), function(x) integrate(dnorm, lower=-Inf, upper=x)$value)
[1] 0.001349899 0.006209665 0.022750132 0.066807201 0.158655254 0.308537539
[7] 0.500000000 0.691462461 0.841344751 0.933192799 0.977249868 0.993790335
[13] 0.998650102
> pnorm(seq(-3,3, by=0.5)
+ )
[1] 0.001349898 0.006209665 0.022750132 0.066807201 0.158655254 0.308537539
[7] 0.500000000 0.691462461 0.841344746 0.933192799 0.977249868 0.993790335
[13] 0.998650102

我不确定D()是否"聪明"。足以证明符号的区别,但我不应该这么怀疑。这一点控制台交互是按照?deriv帮助页面上的示例完成的:

> D(quote(pnorm(x)), "x")
dnorm(x)

也……这里有一些你可以用deriv:

> norm.expr <- expression(pnorm(x))
> deriv(norm.expr, "x")
expression({
.value <- pnorm(x)
.grad <- array(0, c(length(.value), 1L), list(NULL, c("x")))
.grad[, "x"] <- dnorm(x)
attr(.value, "gradient") <- .grad
.value
})

相关内容

  • 没有找到相关文章

最新更新