我有一个标准的普通分布表,有4列。其中一行看起来像这样:
z f01(z) F01(z) L(z)
2.42 0.0213 0.9922 0.0026
我知道我可以使用qnorm(0.9922)
来获取z值(2.42),但现在我需要一个函数来获取基于z值的L(z)
- 值。我可以使用什么功能来实现这一目标?
答案 0 :(得分:2)
如果你在谈论标准的正常损失函数,那么:
L <- function(x) exp(-(x^2)/2)/(sqrt(2*pi)) - x*(1-pnorm(x))
L(2.42)
似乎与您的价值一致
答案 1 :(得分:2)
如果你给出L(。)的定义,我们可以很容易地帮助你。 好的,让我们相信Gavin Kelly的答案。
在那种情况下,
L0 <- function(x) exp(-(x^2)/2)/sqrt(2*pi) - x * (1 - pnorm(x))
L <- function(x) dnorm(x) - x * pnorm(x, lower.tail=FALSE)
在数值上更好,也适用于大x
,其中L0
遭受取消:
> L(10)
[1] 7.47456e-25
> L0(10)
[1] 7.694599e-23
由于OP进一步要求逆功能,@ Ben Bolker通过根发现显示标准解决方案,
Linv <- function(y) uniroot(function(x) L(x) - y, interval=c(-10,10))$root
如果参数的长度为1,那么在良好的情况下有效.OTOH,如果Linv
本身应该
vectorize,如果你想要它并且L(.)
也适用于边界情况,那么可以做一些技巧和加速。
---&GT;关于rpubs的好的扩展答案:http://rpubs.com/maechler/16436