在R中为大值创建Mills Ratio

时间:2014-06-05 09:24:56

标签: r math distribution normal-distribution

我使用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应该没有问题。

我想问你们有没有办法解决这个问题:要么更好地实现这个功能,要么给我另一种方法来找到米尔斯比率(也许是通过整合某些种类,但不会我遇到了同样的问题?)。非常感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:0)

我会对您原来的mill函数进行两次更改。

  1. 1-pnorm(x)更改为pnorm(lower.tail=FALSE)
  2. 使用log并在需要时使用指数。
  3. 所以这给了

    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)
    

    给出

    enter image description here