使用R查找数组中包含90%值的最小间隔的最简单方法是什么?

使用R查找数组中包含90%值的最小间隔的最简单方法是什么?,r,R,我得到了介于1和4之间的数字数组,但它们在最小值和最大值之间的差异通常不超过.5。每个元素之间的差异不小于.1。我想找到包含至少90%(或其他指定比率)元素的最小边距 也就是说,给定数组 c(1, 1.9, 2, 2, 2, 2, 2.1, 2.2, 2.3, 2.3) 我希望我的函数返回.4,因为2.3-1.9=.4(库)。(coda);HPDinterval(as.mcmc(x),prob=0.85))我认为分位数在偏态分布的情况下不满足要求,尽管它可能是一个起点。在这些情况下,很可能最小

我得到了介于1和4之间的数字数组,但它们在最小值和最大值之间的差异通常不超过.5。每个元素之间的差异不小于.1。我想找到包含至少90%(或其他指定比率)元素的最小边距

也就是说,给定数组

c(1, 1.9, 2, 2, 2, 2, 2.1, 2.2, 2.3, 2.3)
我希望我的函数返回.4,因为2.3-1.9=.4<2.3-1=1.3。详情:

  • 2.3-1.9来自长度为90%的子向量,从1.9开始,一直到最后
  • 2.3-1来自90%长度的子向量,从1开始,到前2.3结束
我试过几次构建这个函数,但它一直变得过于复杂,我想知道是否有一种简单的方法可以实现这一点,我还没有考虑过

编辑:它必须能够满足偏态分布。我没有任何完整的代码示例,因为我一直在重建它,但我会制作一些东西并发布它

Edit2:我不能提供任何我想输入函数的数组示例,但这里有一个生成类似值的函数。只要它有效,它不在1到4的范围内并不重要

x = round(rbeta(20,5,2)*100)/10

这可以通过
分位数
解决

  • 计算
    0.05
    0.95
    分位数
  • 获取在这些限制范围内的
    x
    。在_90中调用此向量
    
    
  • 返回_90
  • 值的最小值和最大值之间的差值
  • 指令的顺序是这样的

    qq <- quantile(x, c(0.05, 0.95))
    in_90 <- x[qq[1] <= x & x <= qq[2]]
    diff(range(in_90))
    #[1] 0.4
    
    qq这里有一个方法(与@Aaron的方法相同,除了
    head
    /
    tail
    而不是
    x[i]
    ):

    确认x和n元素的子向量确实具有此范围:

    n_up = which.min(v) - 1
    n_dn = n-n_up
    
    xs = x[(1 + n_up):(xn - n_dn)]
    
    diff(range(xs))
    # [1] 0.4
    length(x) - length(xs) == n
    # [1] TRUE
    
    测试新示例:

    set.seed(1)
    x0 = round(rbeta(20,5,2)*100)/10
    x = sort(x0)
    xn= length(x)
    
    n = round(0.1*xn)
    v = tail(x, n+1) - head(x, n+1)
    
    min(v)
    # [1] 4.1
    
    # confirm...
    n_up = which.min(v) - 1
    n_dn = n-n_up    
    xs = x[(1 + n_up):(xn - n_dn)]
    
    diff(range(xs))
    # [1] 4.1
    length(x) - length(xs) == n
    # [1] TRUE
    

    部分排序可能就足够了(只需获取末端的顶部和底部值);请参见
    ?排序

    最简单的方法是通过测试包括90%的所有可能范围来使用暴力。要做到这一点,我们要计算出有多少项,范围可以从什么指数开始,然后计算每一项的差值,然后是最小值

    x <- c(1, 1.9, 2, 2, 2, 2, 2.1, 2.2, 2.3, 2.3)
    n <- ceiling(length(x)*0.9)   # get the number of terms needed to include 90%
    k <- 1 : (length(x) - n + 1)  # get the possible indices the range can start at
    x <- sort(x)                  # need them sorted...
    d <- x[k + n - 1] - x[k]      # get the difference starting at each range
    min(d)                        # get the smallest difference
    

    x它将帮助您显示一些代码:这听起来像是家庭作业。您应该阅读MetaSO,了解在要求解决硬件问题时,什么是“好问题”。我认为查询至少应该包括您所尝试的代码和一组具有正常、左倾斜和右倾斜数据的测试用例。这不是家庭作业。它可能不太有效,可能是因为舍入/边界不同的假设,但是您可以考虑在<代码> CODA中适应逻辑::HPDPACTION/CODE >(<代码>库)。(coda);HPDinterval(as.mcmc(x),prob=0.85)
    )我认为分位数在偏态分布的情况下不满足要求,尽管它可能是一个起点。在这些情况下,很可能最小间隔是分位数1到分位数90,或分位数10到分位数100。
    n_up = which.min(v) - 1
    n_dn = n-n_up
    
    xs = x[(1 + n_up):(xn - n_dn)]
    
    diff(range(xs))
    # [1] 0.4
    length(x) - length(xs) == n
    # [1] TRUE
    
    set.seed(1)
    x0 = round(rbeta(20,5,2)*100)/10
    x = sort(x0)
    xn= length(x)
    
    n = round(0.1*xn)
    v = tail(x, n+1) - head(x, n+1)
    
    min(v)
    # [1] 4.1
    
    # confirm...
    n_up = which.min(v) - 1
    n_dn = n-n_up    
    xs = x[(1 + n_up):(xn - n_dn)]
    
    diff(range(xs))
    # [1] 4.1
    length(x) - length(xs) == n
    # [1] TRUE
    
    x <- c(1, 1.9, 2, 2, 2, 2, 2.1, 2.2, 2.3, 2.3)
    n <- ceiling(length(x)*0.9)   # get the number of terms needed to include 90%
    k <- 1 : (length(x) - n + 1)  # get the possible indices the range can start at
    x <- sort(x)                  # need them sorted...
    d <- x[k + n - 1] - x[k]      # get the difference starting at each range
    min(d)                        # get the smallest difference