我有一个数字向量,我想对一个在向量中给定位置和它的邻居之间的数字进行采样,使得两个最近的邻居具有最大的影响,并且这种影响根据距离而减小从参考点开始。
例如,假设我有以下向量:
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”是衡量概率的一种方式,以便较近的邻居产生更大的影响。
对此代码的改进将受到高度赞赏!
答案 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)
生成的样本的直方图符合给定的先决条件。