【问题标题】:In R, sample from a neighborhood according to scores在 R 中,根据分数从邻域中采样
【发布时间】:2018-04-17 08:48:09
【问题描述】:

我有一个数字向量,我想对向量中给定位置与其邻居之间的数字进行采样,以使两个最近的邻居影响最大,并且这种影响随着距离而减小从参考点。

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

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

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

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

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

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

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”是一种权衡概率的方式,以便更近的邻居产生更大的影响。

非常感谢您对此代码的改进!

【问题讨论】:

  • 你能扩展一下你目前尝试过的内容吗?
  • @Vincent Guillemot,请查看我的问题的编辑
  • 我认为没有太多需要改进的地方,它看起来已经很好了。也许有人会有想法。您想改进什么?
  • 另外,请参阅此处获取一些有用的信息stats.stackexchange.com/questions/171592/…

标签: r sample quantile


【解决方案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)

生成的样本的直方图满足给定的先决条件。

【讨论】:

  • Vincent, sd =1 没有考虑到左边邻居和右边邻居的距离不同的事实。此外,像这样,超过 19 岁的概率实际上是 0 - 忽略第 4 个邻居及以后
  • 是的,在这个解决方案中,分布是围绕均值“局部”对称的。我认为您需要向我们展示您期望概率质量函数的样子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
  • 2021-12-02
  • 2011-09-27
  • 1970-01-01
  • 2020-05-11
相关资源
最近更新 更多