Как создать случайные векторы другого вектора? - PullRequest
0 голосов
/ 26 декабря 2018

Я выполняю вычисления с константами и векторами (приблизительная длина = 100), для которых мне нужно смоделировать нормальные распределения N (с помощью rnorm).Для констант (K, со стандартным отклонением = KU) я использую rnorm () стандартным способом:

    K  <- 2
    KU <- 0.2
    set.seed(123)
    KN <- rnorm(n = 3, mean = K, sd = KU)

, что обеспечивает вектор длины 3 (KN):

    [1] 1.887905 1.953965 2.311742

Теперь мне нужно сделать то же самое с вектором (V, стандартное отклонение VU).Мое первое предположение заключается в использовании:

    V  <- c(1, 2, 3)
    VU <- 0.1 * V
    set.seed(123)
    VN <- rnorm(3, V, VU)

, но создается только вектор из 3 элементов, по одному для каждого элемента вектора:

    [1] 0.9439524 1.9539645 3.4676125

Это фактически первое моделирование вектора, но мне нужно 3 раза этот вектор.Одним из решений является создание 9 чисел, но VN - это вектор из 9 элементов:

    [1] 0.9439524 1.9539645 3.4676125 1.0070508 2.0258575 3.5145195 1.0460916 1.7469878 2.7939441

, а не 3 векторов из 3 элементов.То, что я хочу, это VN =

    [1] 0.9439524 1.0070508 1.0460916
    [2] 1.9539645 2.0258575 1.7469878
    [3] 3.4676125 3.5145195 2.7939441

, поэтому VN - это 3 вектора, которые я могу впоследствии использовать в других вычислениях, таких как KN * VN.Решение, которое я нашел, это:

    set.seed(123)
    VN <- as.data.frame(t(matrix(rnorm(3 * length(V), V, VU), nrow = length(V))))

, но, на мой взгляд, это довольно громоздкое выражение (которое мне нужно повторить несколько раз в разных местах с довольно длинными именами переменных).Есть ли более простой способ в базе R для получения случайных векторов?Я хотел бы видеть что-то вроде:

    VN <- rnorm.vector(3, V, VU)

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Мы можем использовать replicate

set.seed(123)
replicate(3, rnorm(3, V, VU))
#          [,1]     [,2]     [,3]
#[1,] 0.9439524 1.007051 1.046092
#[2,] 1.9539645 2.025858 1.746988
#[3,] 3.4676125 3.514519 2.793944

Или это может быть

mapply(rnorm, n = 3, mean = V, sd = VU)
0 голосов
/ 26 декабря 2018

В дополнение к замечательным опциям @ akrun, вы также можете использовать что-то немного более простое, чем ваш подход:

matrix(rnorm(n * length(V), V, VU), nrow = n, byrow = TRUE)
#           [,1]     [,2]     [,3]
# [1,] 0.9439524 1.953965 3.467612
# [2,] 1.0070508 2.025858 3.514519
# [3,] 1.0460916 1.746988 2.793944

или также пакет MASS с mvrnorm, позволяющий выбирать из многомерного нормального распределения:

library(MASS)
mvrnorm(n, VU, diag(VU))
#            [,1]        [,2]       [,3]
# [1,]  0.6650715  0.37923044 0.05590089
# [2,]  0.2574341  0.24949882 0.97045721
# [3,] -0.5218990 -0.04857971 0.49707815

где

diag(VU)
#      [,1] [,2] [,3]
# [1,]  0.1  0.0  0.0
# [2,]  0.0  0.2  0.0
# [3,]  0.0  0.0  0.3

Последний вариант - это путь, если вы хотите, чтобы матрица дисперсии-ковариации не была диагональной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...