【问题标题】:Find the two points on the x-axis corresponding to the intersections for a cdf找到 x 轴上对应于 cdf 交点的两个点
【发布时间】:2018-09-21 12:18:45
【问题描述】:

下面给出对应的r code

theta <- seq(0,1, length = 10)
CD_theta <- function(x, p, n){
  1 - pbinom(x, size = n, prob = p) + 1 / 2 * dbinom(x, size = n, prob = p)
}

然后我将数据绘制如下:

mytheta <- CD_theta(5, theta, 10)
df <- data.frame(theta = theta, mytheta = mytheta)
ggplot(df, aes(x = theta, y = mytheta)) +
  geom_line(size = 1, col = "steelblue") +
  ylab("H(Theta)") +
  xlab("Theta")

下面给出了相应的图表。

如您所见,有两条水平线(以红色绘制)和两条垂直线(以黑色绘制)。我需要在 x 轴上找到与 H(theta) 的交点相对应的两个点。

我使用r 中的locator() 函数计算单次迭代的两个x 截距。我想将上面的内容迭代 1000 次,所以单独找到它们真的很乏味。

还有其他的r函数可以用来找到这两个x截点吗?

提前谢谢你。

【问题讨论】:

    标签: r ggplot2 plot binomial-cdf


    【解决方案1】:

    这是使用optimize函数的数值方法:

    library(reprex)
    
    theta <- seq(0,1, length = 10)
    CD_theta <- function(x, p, n){
      1 - pbinom(x, size = n, prob = p) + 1 / 2 * dbinom(x, size = n, prob = p)
    }
    
    # Create a function to compute the difference between the "y" you want 
    # and the "y" computed with CD_theta function 
    # then try to minimize the output of this new function : 
    # get the theta value corresponding to this "y"
    
    my_fn <- function(theta_loc, y, x, n) { 
      # the function to optimize
      abs(y - CD_theta(x, theta_loc, n)) # dont forget abs (absolute)
    }
    
    # Then use optimize function to compute the theta value 
    # between a given interval : c(0,1) in this case
    # Note that you can directly modify here the values of y, x and n
    v1 <- optimize(my_fn, c(0, 1), y = 0.025, x = 5, n = 10)$`minimum` 
    v2 <- optimize(my_fn, c(0, 1), y = 0.975, x = 5, n = 10)$`minimum` 
    
    # print the results
    v1 # 0.025
    #> [1] 0.2120079
    v2 # 0.975
    #> [1] 0.7879756
    

    reprex package (v0.2.0) 于 2018 年 9 月 21 日创建。

    【讨论】:

      【解决方案2】:

      稍微增加曲线的离散化,这变得相当简单:

      theta <- seq(0,1, length = 100) # increase length here for more precision on point locations
      CD_theta <- function(x, p, n){
        1 - pbinom(x, size = n, prob = p) + 1 / 2 * dbinom(x, size = n, prob = p)
      }
      
      mytheta <- CD_theta(5, theta, 10)
      df <- data.frame(theta = theta, mytheta = mytheta)
      ggplot(df, aes(x = theta, y = mytheta)) +
        geom_line(size = 1, col = "steelblue") +
        ylab("H(Theta)") +
        xlab("Theta")
      
      points <- data.frame(x=c(theta[which.min(abs(mytheta - .975))], # find which point is the nearer
                               theta[which.min(abs(mytheta - .025))]),
                           y=c(.975,.025))
      
      ggplot(df, aes(x = theta, y = mytheta)) +
        geom_line(size = 1, col = "steelblue") +
        ylab("H(Theta)") +
        xlab("Theta") + 
        geom_point(data=points,aes(y=y, x=x), size=5, col="red")
      

      【讨论】:

        【解决方案3】:

        如果您想找到精确的 ThetaHTheta 值,与网格大小无关(此处为 N = 10),请将 uniroot 应用于 CD_theta 函数。

        CD_theta <- function(x, p, n) {
            1  -  pbinom (x, size = n, prob = p) + 
            1/2 * dbinom(x, size = n, prob = p)
        }
        
        u1 = uniroot(function(p) CD_theta(5, p, 10) - 0.025, c(0, 1))
        u2 = uniroot(function(p) CD_theta(5, p, 10) - 0.975, c(0, 1))
        (Theta1 = u1$root)  # 0.2119934
        (Theta2 = u2$root)  # 0.7880066
        

        但如果离散化(使用N = 10)对您很重要,那么请在网格点之间对该函数执行线性插值。

        theta <- seq(0, 1, length = 10)
        mytheta <- CD_theta(5, theta, 10)
        f <- approxfun(theta, mytheta, method = "linear", 0.0, 1.0)
        
        u1 = uniroot(function(p) f(p) - 0.025, c(0, 1))
        u2 = uniroot(function(p) f(p) - 0.975, c(0, 1))
        (Theta1 = u1$root)  # 0.2015638
        (Theta2 = u2$root)  # 0.7984362
        

        【讨论】:

          猜你喜欢
          • 2022-10-06
          • 2017-11-30
          • 2022-01-16
          • 2022-11-30
          • 1970-01-01
          • 1970-01-01
          • 2020-09-22
          • 2019-08-19
          • 1970-01-01
          相关资源
          最近更新 更多