在R中,来自邻域的样本根据分数

时间:2018-04-17 08:48:10

标签: r sample quantile

我有一个数字向量,我想对一个在向量中给定位置和它的邻居之间的数字进行采样,使得两个最近的邻居具有最大的影响,并且这种影响根据距离而减小从参考点开始。

例如,假设我有以下向量:

 vec = c(15, 16, 18, 21, 24, 30, 31)

我的参考是位置#2的数字16。我想抽样一个数字,该数字在15到16之间的概率很高,或者在16到18之间(具有相同的高概率)。抽样的数字可以是浮点数。然后,以16到21之间的数字采样的概率递减,并且在16到24之间的概率更低,依此类推。

参考的位置事先不知道,它可以在矢量中的任何位置。

我尝试使用runif和分位数,但我不确定如何设计邻居的分数。

具体来说,我编写了以下函数,但我怀疑可能有更好/更有效的方法:

GenerateNumbers <- function(Ind,N){
    dist <-  1/abs(Ind- 1:length(N))
    dist <-  dist[!is.infinite(dist)]
    dist <- dist/sum(dist)
    sum(dist) #sanity check --> 1

    V = numeric(length(N) - 1)
    for (i in 1:(length(N)-1)) {
      V[i] = runif(1, N[i], N[i+1])
    }
    sample(V,1,prob = dist)
}

其中Ind是参考号的位置(在这种情况下为16),N是矢量。 “Dist”是衡量概率的一种方式,以便较近的邻居产生更大的影响。

对此代码的改进将受到高度赞赏!

1 个答案:

答案 0 :(得分:1)

我会使用截断的高斯随机样本生成器,例如在truncnorm包中。在你的例子中:

# To install it: install.package("truncnorm")
library(truncnorm)
vec <- c(15, 16, 18, 21, 24, 30, 31)
x <- rtruncnorm(n=100, a=vec[1], b=vec[7], mean=vec[2], sd=1)

生成的样本的直方图符合给定的先决条件。

Histogram