Настройка слоев для байесовской сети Dynami c с помощью bnstruct в R - PullRequest
2 голосов
/ 07 мая 2020

В настоящее время я создаю DBN, используя пакет bnstruct в R. У меня есть 9 переменных на каждые 6 временных шагов. У меня есть переменные bioti c и abioti c. Я хочу, чтобы переменные bioti c не были родителями переменных abioti c. Для байесовской сети это довольно легко реализовать, используя, например, layering = c(1,1,2,2,2) в learn.dynamic.network().

Но проблема возникает для части Dynami c: я хотел бы, чтобы переменные bioti c были родителями для abioti c на каждом временном шаге, в то же время предотвращая появление ребер между любыми переменными от t + 1 до t.

Если я использую в layering =:

  • 1 для abioti c переменных в t1
  • 2 для bioti c переменных в t1
  • 3 для abioti c переменных в t2
  • 4 для bioti c переменных в t2 ...

Я разрешаю переменные bioti c от t-1 до объясните переменные abioti c в t (и я не хочу этого).

Итак, я попробовал:

## 9 variables for 6 time steps 
test1 <- BNDataset(data = timedData,
                   discreteness = rep('d', 54),
                   variables = colnames(timedData),
                   node.sizes = rep(c(3,3,3,2,2,3,3,3,3), 6)
                   # num.time.steps = 6
                   )


## the 5 first variables are abiotic, the 4 last are biotics
dbn <- learn.dynamic.network(test1, 
                             num.time.steps = 6, 
                             layering = rep(c(1,1,1,1,1,2,2,2,2),6))

Итак, теперь у меня нет ребер от bioti c в abioti c (это хорошо), но у меня есть ребра от variable_t (n + 1) до variable_t (n).

Я знаю, что в bnlearn вы можете создать «черный список» ребер, которые вы не хотите видеть, но я не вижу эквивалентных аргументов в bnstruct. Любая идея?

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Отлично, комбинация обоих аргументов layering = и layer.struct = делает то, что я хотел.

Я публикую то, что использовал здесь, просто чтобы предоставить пример:

## DBN study
dbn <- learn.dynamic.network(test1, 
                             num.time.steps = 6, 
                             layering = rep(c(1,1,1,1,1,2,2,2,2,  # set 2 layers per time step
                                              3,3,3,3,3,4,4,4,4,
                                              5,5,5,5,5,6,6,6,6,
                                              7,7,7,7,7,8,8,8,8,
                                              9,9,9,9,9,10,10,10,10,
                                              11,11,11,11,11,12,12,12,12)),
                             layer.struct = matrix(c(1,0,0,0,0,0,0,0,0,0,0,0,  ## allow certain layers to connect to others by hand
                                                     1,1,0,0,0,0,0,0,0,0,0,0,
                                                     1,0,1,0,0,0,0,0,0,0,0,0,
                                                     1,1,1,1,0,0,0,0,0,0,0,0,
                                                     1,0,1,0,1,0,0,0,0,0,0,0,
                                                     1,1,1,1,1,1,0,0,0,0,0,0,
                                                     1,0,1,0,1,0,1,0,0,0,0,0,
                                                     1,1,1,1,1,1,1,1,0,0,0,0,
                                                     1,0,1,0,1,0,1,0,1,0,0,0,
                                                     1,1,1,1,1,1,1,1,1,1,0,0,
                                                     1,0,1,0,1,0,1,0,1,0,1,0,
                                                     1,1,1,1,1,1,1,1,1,1,1,1),c(12,12)))

Спасибо за быстрый ответ и пакет, кстати

2 голосов
/ 08 мая 2020

С алгоритмом mmhc, который используется по умолчанию, вы можете использовать параметр layer.struct, чтобы указать, какие пары слоев могут иметь края между собой. layer.struct принимает двоичную матрицу, где ячейка i,j равна 1, если могут быть края, идущие от переменных в слое i к переменным в слое j, и 0 в противном случае.

лучший способ использовать это - объединить его с указанным вручную слоем вашего первого решения.

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