Как сгенерировать случайное равномерное распределение по столбцу значений в фрейме данных без повторения для каждого значения в указанном столбце?

Мне нужно создать генератор случайных величин на основе равномерного распределения с помощью команды runif. У меня есть столбец значений, на которых будут основаны максимальные и минимальные значения. Мне было интересно, есть ли способ применить runif вниз по столбцу без повторения процесса для каждого значения в столбце значений? Никакие другие использовать нельзя. Мы работаем с rnorm и runif и т. д., поэтому никакие другие статистические данные не допускаются.

Например:

set.seed(1234)
values <- (30, 45, 80, 90, 80)
var_1 <- runif(5, 30*(.5), 30*(1.25))
var_2 <- runif(5, 45*(.5), 45*(1.25))
var_3 <- runif(5, 80*(.5), 80*(1.25))
var_4 <- runif(5, 90*(.5), 90*(1.25))
var_5 <- runif(5, 80*(.5), 80*(1.25))

Это в основном то, что мне нужно было бы сделать, но это более крупный фрейм данных, чем просто пять наблюдений. Мне также приходится генерировать намного больше случайных чисел, чем просто 5. Я надеялся, что есть способ ускорить этот процесс, чтобы мне не нужно было повторять часть var_3 <- runif для каждой строки моей дейтаграммы. Если это поможет, я могу превратить столбец фрейма данных в матрицу с одним столбцом и несколькими строками. В конце концов, я буду выбирать из этих случайно сгенерированных чисел, чтобы выполнить моделирование методом Монте-Карло.

Я предполагаю, что некоторые функции применения будут работать, но я все еще не уверен, как работает что-либо из семейства приложений. Я просмотрел некоторые уже опубликованные ответы, но ответы были немного выше моей головы, и я не мог изменить их, чтобы помочь мне, как я изначально думал, что смогу.


person Emm    schedule 09.06.2020    source источник


Ответы (2)


Как это:

set.seed(1234)
values <- c(30, 45, 80, 90, 80)

mat <- sapply(values, function(x) runif(5, x*(.5), x*(1.25)))

colnames(mat) <- values

mat

> mat
           30       45       80        90       80
[1,] 15.79778 33.49176 82.79809 106.63342 84.65663
[2,] 27.71421 27.73334 46.04614 108.84509 94.95845
[3,] 21.30580 26.88622 97.01830  63.84305 99.67589
[4,] 19.59442 37.19917 47.30907  53.33430 96.54164
[5,] 18.00913 23.80419 53.17940  98.80833 69.16812
person Dominik S. Meier    schedule 09.06.2020

Вот еще один вариант использования обратного интегрального преобразования вероятности:

set.seed(1234)
values <- c(30, 45, 80, 90, 80)
n <- length(values)
m <- 10L
t(values * t((1.25 - 0.5) * matrix(runif(m*n), m, n) + 0.5))

CDF распределения OP равен F (x) = 1 / (1,25 - 0,5) * ( x - 0,5 ). Следовательно, F^{-1}(u) = (1,25 - 0,5) * u + 0,5.

Мы генерируем стандартные равномерные случайные величины и преобразуем их в желаемое распределение, используя обратный PIT, используя это F^{-1}(u).

Две операции t: i) для простого масштабирования с помощью values и ii) для обеспечения того, чтобы выходные данные были в том же формате.

Справка:

  1. Выборка с обратным преобразованием, Википедия, https://en.wikipedia.org/wiki/Inverse_transform_sampling
person chinsoon12    schedule 09.06.2020