我使用R来创建一个函数,其中包括使用Mills Ratio(参见here)。这不是一个复杂的公式,起初我只是这样编程:
mill <- function(x) {
return((1 - pnorm(x)) / dnorm(x))
}
然而,我很快发现,对于 x 的非常大的值(x> = 9),此函数返回零。更具戏剧性,在x> = 37左右,它开始返回 NaN ,这真的弄乱了我的东西。
在文章之后,我现在已将功能改为:
mill <- function(x) {
if (x >= 9) {
return(1 / x)
} else {
return((1 - pnorm(x)) / dnorm(x))
}
}
这似乎有效。我使用这个函数来计算一个矢量,当我使用模拟来找到相同的矢量时,我得到的答案大致相同,只是它总是有点关闭..
我认为这与我的Mills Ratio的实现有关,因为函数的其余部分只是指数,R应该没有问题。
我想问你们有没有办法解决这个问题:要么更好地实现这个功能,要么给我另一种方法来找到米尔斯比率(也许是通过整合某些种类,但不会我遇到了同样的问题?)。非常感谢您提供任何帮助!
答案 0 :(得分:0)
我会对您原来的mill
函数进行两次更改。
1-pnorm(x)
更改为pnorm(lower.tail=FALSE)
log
并在需要时使用指数。所以这给了
new_mill = function(x)
pnorm(x, lower.tail=FALSE, log.p=TRUE) - dnorm(x, log=TRUE)
所以
R> exp(new_mill(10))
[1] 0.09903
R> exp(new_mill(40))
[1] 0.02498
使用情节作为健全性检查
x = seq(0, 10, 0.001)
plot(x, exp(new_mill(x)), type="l")
lines(x, mill(x), col=2)
给出