Сохранение смоделированного набора данных с помощью функции list () в R - PullRequest
0 голосов
/ 31 октября 2018

Я использую следующий код r для имитации набора данных normal. Я скопировал их ниже.

set.seed(1234)
ml = matrix(c(4,2,3,5,6,8,1,4,3), nrow = 3, ncol = 3)
ml #left side of parameter
     [,1] [,2] [,3]
[1,]    4    5    1
[2,]    2    6    4
[3,]    3    8    3
mr = matrix(c(6,4,5,2,8,7,6,9,4), nrow = 3, ncol = 3)
mr #right side of parameter
     [,1] [,2] [,3]
[1,]    6    2    6
[2,]    4    8    9
[3,]    5    7    4

n = nrow(ml)

set.seed(1234)
y.all = list()
for(j in 1:ncol(ml)){
   for (i in 1:(n - 1)){
      y.all[[i]] = c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
    }
  }

sim.data = matrix(unlist(y.all), ncol(ml)*(ncol(ml) - 1)*ncol(ml), 1, byrow = TRUE)
sim.data = matrix(sim.data, nrow = ncol(ml), ncol = nrow(sim.data)/nrow(ml))
dim(sim.data)
[1] 3 6
sim.data
          [,1]     [,2]      [,3]     [,4]      [,5]     [,6]
[1,] 0.2237461 3.889715 0.2237461 3.889715 0.2237461 3.889715
[2,] 6.0644588 3.488990 6.0644588 3.488990 6.0644588 3.488990
[3,] 6.9594941 8.088805 6.9594941 8.088805 6.9594941 8.088805

Я использовал приведенный выше код для имитации вышеуказанного 3X6 набора данных матрицы. Первые 2 columns из sim.data созданы с использованием 1st column из ml и 1st column из mr и т. Д.

Однако я проверил их индивидуально следующим образом. К сожалению, они не одинаковы.

set.seed(1234)
j = 1
i = 1
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 2.792934 6.277429 7.084441
i = 2
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] -0.3456977  2.4291247  4.5060559
i = 3
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 2.425260 2.453368 2.435548
set.seed(1234)
j = 2
i = 1
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 3.792934 2.277429 3.084441
i = 2
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 3.654302 6.429125 8.506056
i = 3
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 7.425260 7.453368 7.435548
set.seed(1234)
j = 3
i = 1
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] -0.2070657  6.2774292  7.0844412
i = 2
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 1.654302 4.429125 9.506056
i = 3
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 2.425260 2.453368 2.435548

Я ошибаюсь в приведенном выше коде r? Есть ли способ имитировать набор данных?

Заранее спасибо.

1 Ответ

0 голосов
/ 31 октября 2018
set.seed(1234)
y.all = list()
for(j in 1:ncol(ml)){
   for (i in 1:(n - 1)){
      y.all[[i]] = c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
    }
  }

Ваш цикл for меняет j и i, но ваш y.all смотрит только на i, поэтому при изменении j он перезаписывает i. Простейшим решением было бы добавить счетчик:

y.all = list()
counter = 1
for(j in 1:ncol(ml)){
   for (i in 1:(n - 1)){
      y.all[[counter]] = c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
      counter = counter + 1
    }
  }

Это дает результаты, которые сначала соответствуют вашему нижнему методу. (Они расходятся, когда вы снова используете set.seed() в середине. Возможно, вам нужен set.seed внутри внешнего цикла ??)

         [,1]       [,2]     [,3]     [,4]      [,5]     [,6]
[1,] 2.792934 -0.3456977 4.425260 5.109962 0.2237461 3.889715
[2,] 6.277429  2.4291247 1.453368 5.522807 6.0644588 3.488990
[3,] 7.084441  4.5060559 1.435548 7.001614 6.9594941 8.088805
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...