我需要证明概率密度函数是CDF的导数。任何分布都可以,但我一直在尝试用正态分布。我已经读到:
set.seed(53)
b <- rnorm(500)
db <- density(b)
plot(db)
然后我可以使用pnorm(b)
计算累积概率,但是我不知道如何微分,因为D()
需要一个表达式而不是pnorm()
。有人能帮忙吗?
这是我演示dnorm
到pnorm
从-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
})