Надеемся на помощь, чтобы перевести мысленный эксперимент в код R, используя рандомизацию - PullRequest
0 голосов
/ 20 октября 2019

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

У меня есть c (X1, X2, X3,... Xn) для стартовой переменной неслучайное числовое значение. У меня есть c (Y1, Y2, Y3, ... Yn) для изменения переменной, неслучайное числовое значение, обозначающее, насколько нужно изменить X, дать или взять, и значение между 0-10. У меня есть c (Z1, Z2, Z3, ... Zn), который является минимальным и максимальным диапазоном X.

Я хочу наблюдать случайную выборку всех чисел X, у которых все случайным образомсоответствующая переменная Y вычитается или добавляется к ним. В этой задаче я пытаюсь спросить, сколько раз я буду рисовать значения X, которые являются точными значениями X, которые я первоначально ввожу, а также задаю или принимаю только низкое значение Y.

Например,,

Exes<-c(135,462,579,222)
Whys<-c(1,3,3,2)
Zees<-c(c(115,155),c(450,474),c(510,648),c(200,244))

Первая итерация: X = c (135,562,579,222), вторая итерация: X = c (130,471,585,230) <- как вы можете видеть, X второй итерации изменился на (-5 * Y1),(+ 3 * Y2), (+ 2 * Y3) и (+ 11 * Y4) </p>

Я хочу вывести список рандомизированных значений X, которые изменились только с коэффициентом их соответствующего Yзначение, и всегда попадают в диапазон заданных значений Z. Кроме того, я хочу проверить, сколько раз хотя бы одно и только одно значение X будет значительно отличаться от соответствующего начального ввода X.

Мне кажется, что я не формулирую вопрос лаконично,но я также чувствую, что именно поэтому я написал. Я не пытаюсь попросить руки, а ищу совета.

Ответы [ 2 ]

0 голосов
/ 20 октября 2019

Для этого набора данных это возможно:

Exes<-c(135,462,579,222)
Whys<-c(1,3,3,2)
Zees<-c(c(115,155),c(450,474),c(510,648),c(200,244))

n = 10000
x_range_l <- split(Zees, rep(seq_len(length(Zees) / 2), each = 2))

mapply(function(y, x_range) sample(seq(from = x_range[1], to = x_range[2], by = y), size = n, replace = T),
       Whys, x_range_l)  

Обратите внимание, что эта опция больше зависит от Zees, чем Exes. Более полный способ сделать это будет:

Exes<-c(135,462,579,222)
Whys<-c(1,3,3,2)
Why_Range <- c(20, 4, 13, 11)

x_range_l <- Map(function(x, y, rng) c(x - y * rng, x + y * rng), Exes, Whys, Why_Range)

n = 10000

mapply(function(y, x_range) sample(seq(from = x_range[1], to = x_range[2], by = y), size = n, replace = T),
       Whys, x_range_l)
0 голосов
/ 20 октября 2019

Я не уверен, что понял вопрос, вы хотите повторить процесс много раз? это для симуляции? Вот начало решения.

library(dplyr)
x <- c(135,462,579,222)
y <- c(1,3,3,2)
z.lower <- c(115, 450, 510, 200)
z.upper <- c(155, 474, 648, 244)

temp.df <- data.frame(x, y, z.lower, z.upper)

df %>% 
  mutate(samp = sample(seq(-10, 10, 1), nrow(temp.df))) %>% ### Sample numbers between 0 and 10 
  mutate(new.val = x + samp * y) %>% ### Create new X 
  mutate(is.bound = new.val < z.upper & new.val > z.lower) ### Check that falls in bounds

    x y z.lower z.upper samp new.val is.bound
1 135 1     115     155  -10     125     TRUE
2 462 3     450     474   10     492    FALSE
3 579 3     510     648    8     603     TRUE
4 222 2     200     244    6     234     TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...