具有倒置正态分布的 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)
您可以尝试这种迭代方法。使用变量 lower
和 upper
定义排除的中间范围。
首先创建一列 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
我有一个数据框 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)
您可以尝试这种迭代方法。使用变量 lower
和 upper
定义排除的中间范围。
首先创建一列 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