R рядовая выборка с нормальным распределением вверх ногами - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть фрейм данных 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)

enter image description here

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Вы можете попробовать этот итеративный подход. Используйте переменные lower и upper для определения исключенного среднего диапазона.

Начните с создания столбца значений NA. Для каждой итерации l oop все значения NA в столбце перезаписываются образцами из вашего дистрибутива. Образцы, которые находятся в исключенной зоне, затем перезаписываются NA, и l oop повторяется до тех пор, пока в столбце не останется значений 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

Создано в 2020- 02-18 представьте пакет (v0.3.0)

0 голосов
/ 18 февраля 2020

Как то так? Это вычисляет 25% и 75% срезов, где значения могут не быть l ie между и выборками так долго, пока это не может возвратить значение. Также он выполняется в рядном порядке.

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
...