具有倒置正态分布的 R 按行采样

R row-wise sampling with upside down normal distribution

我有一个数据框 DF 如下所示:

Min Max
10  80
20  90
40  120

我想附加一个新的 Random 列,其中在每行的最小值和最大值之间随机生成一个数字。数字的抽样应从倒置的正态分布中得出,并排除如下所示的中间值

下面的带有单个变量的原型代码似乎可以工作,但我对如何按行应用它感到困惑。

min <- 1
max <- 20
q <- min + (max-min)*rbeta(10000, 0.5, 0.5)
q <- q[!(q > 5 & q < 15)][1:10000]
hist(q)

您可以尝试这种迭代方法。使用变量 lowerupper 定义排除的中间范围。

首先创建一列 NA 个值。对于循环的每次迭代,列中的所有 NA 值都会被您的分布中的样本覆盖。然后,排除区域内的样本将被 NA 覆盖并重复循环,直到列中没有 NA 值。

DF    <- data.frame(Min = c(10, 20, 40), Max = c(80, 90, 120))
lower <- 5
upper <- 15

DF$sample <- rep(NA, nrow(DF)); 
while(any(is.na(DF$sample))) 
{ 
  i <- which(is.na(DF$sample)); 
  DF$sample[i] <- DF$Min[i] + (DF$Max[i] - DF$Min[i]) * rbeta(length(i), 0.5, 0.5); 
  DF$sample[DF$sample > lower & DF$sample < upper] <- NA;
}

DF
#>   Min Max   sample
#> 1  10  80 31.88867
#> 2  20  90 33.26248
#> 3  40 120 80.08321

reprex package (v0.3.0)

于 2020 年 2 月 18 日创建

是这样的吗? 这将计算 25% 和 75% 的截断值,其中值可能不会位于和采样之间,直到它可能 return 一个值。它也是按行方式执行的。

library(dplyr)
fun <- function(min, max){
  repeat {
  x <- min + (max-min)*rbeta(1,0.5,0.5)
  q1 <- min + (max-min)*pbeta(0.25,0.5,0.5)
  q2 <- min + (max-min)*pbeta(0.75,0.5,0.5)
  if(x<=q1 | x>=q2) break
  }
  return(x)
}

df <- data.frame(min=1:20, max=21:40)
df %>% rowwise() %>% 
  mutate(value=fun(min, max))


> Source: local data frame [20 x 3]
> Groups: <by row>

> # A tibble: 20 x 3
>      min   max value
>    <int> <int> <dbl>
>  1     1    21  3.38
>  2     2    22  7.48
>  3     3    23  3.02
>  4     4    24  4.47