2015-04-02 3 views
0

Предположим, что я хочу сгенерировать условия X и Y предыдущего объекта X и вероятности (F). Мой алгоритм: в определенный день один человек имеет статус 1/0. Если статус 0, то состояние следующего дня будет rbinom(1,1,0.5); если статус 1, то staus следующего дня будет rbinom(1,1,F[this day]). Здесь я хочу генерировать эти данные для N человек и дней.Создание данных на основе условия с использованием кода R

Мой код:

N <- 10 # number of individual 
d <- 10 # days 
F <- c(0.9,0.8, 0.7, 0.6, 0.5, 0.4) # Probabilities 

    for(j in 1:N){ 
     x <- NULL 
     x[1] <- rbinom(1,1,0.5) 
     y <- NULL 
     y[1] <- ifelse(x[1]==1, 1, 0) 
     for(i in 2:d){ 
      if(x[i-1]==0) 
      { 
      y[i] <- x[i-1] 
      x[i] <- rbinom(1,1,0.05) 
      } 
      if(x[i-1]==1) 
      { 
      y[i] <- y[i-1]+x[i-1] 
      x[i] <- rbinom(1,1,F[y[i]]) 
      } 
     } 

    } 

Этот код производит данные, такие как,

> x 
    [1] 1 1 0 0 0 0 0 0 0 1 
    > y 
    [1] 1 2 3 0 0 0 0 0 0 0 

Но я хочу, чтобы генерировать X и Y, как это:

> x 
[1] 1 1 0 0 0 0 0 0 0 1 
> y 
[1] 1 2 0 0 0 0 0 0 0 1 

Я не найти какая часть кода является неправильной. Может ли кто-нибудь помочь?

+0

Если вы используете 'rbinom', то выход будет в некоторой степени ...« random ». Таким образом, возникает вопрос: в каком смысле вы получаете результат не так, как вы ожидаете? Вы еще не объяснили, что этот процесс должен делать, и только создали код, который, по вашему мнению, является ошибочным, поэтому кажется мало смысла пытаться объединить «Fortran-mind», чтобы создать эффективный R-код. –

+0

Спасибо. Я изменил свой вопрос выше. – Rudro88

+0

Первое, что нужно понять, состоит в том, что внешний цикл выполняет этот процесс 10 раз, но только оставляет последний, который нужно изучить. Вы можете удалить внешний контур, и ничего не должно измениться. Я внесу несколько изменений в код, и вы увидите, действительно ли вы уже делаете то, что планируете. –

ответ

0

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

N <- 10 
d <- 20 
F <- c(0.9,0.8, 0.7, 0.6, 0.5, 0.4) 
    replicate(10,{  x <- NULL 
     x[1] <- rbinom(1,1,0.5) 
     y <- NULL 
     y[1] <- ifelse(x[1]==1, 1, 0) 
     for(i in 2:d){ 
      if(x[i-1]==0) 
      { 
      y[i] <- x[i-1] 
      x[i] <- rbinom(1,1,0.05) 
      } 
      if(x[i-1]==1) 
      { 
      y[i] <- y[i-1]+x[i-1] 
      x[i] <- rbinom(1,1,F[y[i]]) 
      } 
     } 
     return(rbind(x,y)) }) 

Через пару пробежек я вижу один, где вы получите то, что (я думаю) вы хотите, а именно два ряда положительных значений х и у. Это случилось быть седьмой экземпляр в этом пробеге 10:

, , 7 

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] 
x 0 0 0 0 0 0 0 0 1  1  1  0  0  0  1  1  1  1  0  0 
y 0 0 0 0 0 0 0 0 0  1  2  3  0  0  0  1  2  3  4  0 

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

res <- replicate(1000, { code block here }) 
+0

Но это не мой обязательный. Например, в столбце 9-12 наблюдения x: 1, 1, 1, 0 и y: 0, 1, 2, 3. Но я хочу, чтобы x: 1, 1, 1, 0 и y: 1, 2, 3, 0. – Rudro88

Смежные вопросы