Используйте цикл для генерации данных для пустых столбцов информационного кадра с уравнениями, которые ссылаются на другие столбцы - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь смоделировать данные панели в широком фрейме данных, генерируя начальные значения и затем используя уравнения, которые ссылаются на другие столбцы для следующих «моментов времени». Я хотел бы иметь n = 500, t = 21 для n * t = 10500 полных наблюдений.

Я смоделировал некоторые начальные наблюдения (т. Е. T = 0) из многомерного нормального распределения, а затем сгенерировал широкий массив данных со столбцами-заполнителями для следующих 20 последовательных «временных точек» (т. Е. T> 0). Пока мои данные выглядят так (показаны только первые 15 столбцов):

            id        xt0        yt0        wt0        zt0 xt1 yt1 xt2 yt2 xt3 yt3 xt4 yt4 xt5 yt5
1    0.1251041 -0.5202968  0.7444884 -0.1655747 -0.4636554  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
22  -1.4346734  0.2313276  4.4026209  0.6278826 -0.2208187  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
43   3.5234120  1.6617287  1.8510357  0.3680791  1.3616461  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
64   1.9857540  1.5927217 -1.7127041 -0.1823246  0.6032245  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
85   2.0633524  1.8347750  1.5244358  0.5539688  0.5201867  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
106  2.1106941 -1.1516203 -0.1515743 -0.5320694  0.1345948  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA

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

param <- c( 0.2, 0.5, 1.0) 
df$xt1 <- param[ 1]*df$xt0 + param[ 2]*df$yt0 + param[ 3]*df$wt0 + rnorm( 500, 0, 1)
df$yt1 <- param[ 1]*df$yt0 + param[ 2]*df$xt0 + param[ 3]*df$zt0 + rnorm( 500, 0, 1)
df$xt2 <- param[ 1]*df$xt1 + param[ 2]*df$yt1 + param[ 3]*df$wt0 + rnorm( 500, 0, 1)
...
df$yt20 <- param[ 1]*df$yt19 + param[ 2]*df$xt19 + param[ 3]*df$zt0 + rnorm( 500, 0, 1)

Обратите внимание на шаблон: коэффициент1 * переменная с запаздыванием + коэффициент2 * переменная с запаздыванием + коэффициент3 * постоянная + случайный шум.

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

Пока я пытался:

for( i in df[ , 5:ncol( df)]) {
  if( lapply( ncol( df[ , i], '%%', 2) == 0)) {
    df[ , i] <- param[ 1]*df[ , ( i - 4)] + param[ 2]*df[ , ( i - 3)] + param[ 3]*df$wt0 + rnorm( 500, 0, 1)
  } else {
    df[ , i] <- param[ 1]*df[ , ( i - 4)] + param[ 2]*df[ , ( i - 3)] + param[ 3]*df$zt0 + rnorm( 500, 0, 1)
  }
}

Что я пытаюсь сделать с этим кодом:

  1. цикл по столбцам в кадре данных, начиная со столбца # 5
  2. если номер столбца четный (переменные x, которые начинаются с # 6), то применить первое уравнение, если номер столбца нечетный (переменные y), то применить второе уравнение
  3. для каждой итерации цикла, авторегрессионная переменная находится в столбце, который находится на 4 столбца слева, а перекрестная задержка находится в столбце, который находится в 3 столбцах слева, константа (wt0 и yt0 ) всегда находятся в одном и том же столбце (но он отличается для х и у).

Я получаю ошибку

Error in match.fun(FUN) : argument "FUN" is missing, with no default

но этот код только что собран из кусочков, которые я нашел где-то в Интернете. Я уверен, что есть ряд проблем с этим. Поэтому я был бы признателен за любую помощь! Спасибо!

Редактировать: Здесь вывод dput для первых 6 строк и 15 столбцов кадра данных.

structure(list(id = c(-0.409761767417203, -2.16821996677264, 
3.26224532017912, 1.99293159129652, 0.18786842037283, -0.403158586535083
), xt0 = c(-1.08325121689622, -0.257402826652493, 4.51801329740704, 
2.00766925507723, 2.05915331375632, 0.893125999249676), yt0 = c(0.744488400264831, 
4.4026209400443, 1.85103568019496, -1.71270414984045, 1.52443576496701, 
-0.151574338169848), wt0 = c(-0.165574724549133, 0.627882638545303, 
0.368079129633285, -0.182324586908647, 0.553968819325837, -0.532069428215114
), zt0 = c(-0.463655350080687, -0.220818663029958, 1.36164608113302, 
0.603224522813769, 0.520186714928409, 0.134594809514275), xt1 = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), yt1 = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), xt2 = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), yt2 = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), xt3 = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), yt3 = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), xt4 = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), yt4 = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), xt5 = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), yt5 = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_)), row.names = c(1L, 
22L, 43L, 64L, 85L, 106L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...