使用R查找数组中包含90%值的最小间隔的最简单方法是什么?
我得到了介于1和4之间的数字数组,但它们在最小值和最大值之间的差异通常不超过.5。每个元素之间的差异不小于.1。我想找到包含至少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))我认为分位数在偏态分布的情况下不满足要求,尽管它可能是一个起点。在这些情况下,很可能最小
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结束
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