【问题标题】:R row-wise sampling with upside down normal distribution具有倒置正态分布的 R 行抽样
【发布时间】:2020-02-18 08:57:31
【问题描述】:

我有一个数据框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)

【问题讨论】:

    标签: r random sampling


    【解决方案1】:

    您可以尝试这种迭代方法。使用变量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 日创建

    【讨论】:

    • 运行顺利。尽管具有迭代性质,但在处理方面并不太苛刻;)
    【解决方案2】:

    这样的? 这将计算 25% 和 75% 的截止值,其中值可能不在其间,并且采样时间很长,直到它可能返回一个值。它也以逐行方式执行。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      相关资源
      最近更新 更多