Проблема с функциями pdag2allDags и addBgKnowledge в пакете pcalg.

Я начинаю использовать пакет pcalg, и у меня есть некоторые сомнения относительно функций pdag2allDags и addBgKnowledge:

Я использую образец данных gmG, предоставленный пакетом

library(pcalg)
library(Rgraphviz)
data("gmG")
df<-gmG$x
suffStat <- list(C = cor(df), n = nrow(df))
fci.fit<-fci(suffStat, indepTest = gaussCItest, p = ncol(df),alpha = 0.01)
plot(fci.fit)

Я хотел бы получить все эквивалентные DAG. Судя по документации, должно работать с помощью функции pdag2allDags (из здесь< /а>). Нам нужно просто получить данные amat (adjacent matrix).

Судя по спецификациям в документации, я подумал, что следующее должно работать...

plotAllDags <- function(res) {
    require(graph)
    p <- sqrt(ncol(res$dags))
    nDags <- ceiling(sqrt(nrow(res$dags)))
    par(mfrow = c(nDags, nDags))
    for (i in 1:nrow(res$dags)) {
        tmp <- matrix(res$dags[i,],p,p)
        colnames(tmp) <- rownames(tmp) <- res$nodeNms
        plot(as(tmp, "graphNEL"))
    }
}

res1<-pdag2allDags(as(fci.fit,"amat"))
plotAllDags(res1)

Но вместо этого он возвращает:

Ошибка в sqrt(ncol(res$dags)) : нечисловой аргумент математической функции

Мы также видим amat в объекте fci's. Итак, я попробовал:

res2<-pdag2allDags(fci.fit@amat)
plotAllDags(res2)

Он также возвращает то же самое:

Ошибка в sqrt(ncol(res$dags)) : нечисловой аргумент математической функции

Но если я использую алгоритм pc, он работает:

pc.fit<-pc(suffStat, indepTest = gaussCItest, p = ncol(df),alpha = 0.01)
plot(pc.fit)
res0<-pdag2allDags(as(pc.fit,"amat"))
plotAllDags(res0)

Что происходит? Разве pdag2allDags не предназначено для работы со всеми объектами amat (pc, fci, rfci и т. д.)? Я не смог найти в документации никакой другой функции ...allDags. Как получить все эквивалентные DAG из вывода функции fci?


То же самое происходит и с функцией addBgKnowledge. Это работает для pc:

pc.amat2<-addBgKnowledge(gInput = pc.fit@graph,x=1,y=2)
plot(pc.amat2)

но не для fci, даже в документации это сказано использует amat

fci.amat2<-addBgKnowledge(gInput = as(fci.fit,"amat"),x=1,y=2)
plot(as(t(fci.amat2),"graphNEL"))

Он обеспечивает:

Ошибка в h(simpleError(msg, call)) : ошибка в оценке аргумента 'x' при выборе метода для функции 'plot': аргумент не является матрицей


person hamagust    schedule 25.01.2021    source источник


Ответы (1)


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

Если мы оценим структуру, то оба действительно имеют дело с матрицей смежности (amat)... но они разные... вывод ПК содержит тип 'cpdag' amat, а вывод fci - тип 'pag' amat...

as(pc.fit,"amat")

мы получили:

Adjacency Matrix 'amat' (8 x 8) of type ‘cpdag’:
  1 2 3 4 5 6 7 8
1 . 1 . . . . . .
2 1 . 1 . 1 . . .
3 . 1 . . . . . .
4 . . . . . . . .
5 . 1 . . . . . .
6 1 . . . 1 . . .
7 . . . . . 1 . .
8 1 . . . 1 . . .

и с

as(fci.fit,"amat")

мы получили:

Adjacency Matrix 'amat' (8 x 8) of type ‘pag’:
  1 2 3 4 5 6 7 8
1 . 1 . . . 2 . 2
2 1 . 1 . 1 . . .
3 . 1 . . . . . .
4 . . . . . . . .
5 . 1 . . . 2 . 2
6 3 . . . 3 . 2 .
7 . . . . . 3 . .
8 3 . . . 3 . . .

или, с

fci.fit@amat

мы получили

  1 2 3 4 5 6 7 8
1 0 1 0 0 0 2 0 2
2 1 0 1 0 1 0 0 0
3 0 1 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0
5 0 1 0 0 0 2 0 2
6 3 0 0 0 3 0 2 0
7 0 0 0 0 0 3 0 0
8 3 0 0 0 3 0 0 0

В документации pcalg по pdag2allDags это явно не упоминается...

  • определение функции гласит: «Заданный частично направленный ациклический граф (PDAG)».
  • пример показывает 'amat', определенный как матрица нулей и единиц, без какой-либо связи с функциями fci или pc

Но решение, которое я нашел, начинается с того, что мы берем тип pag amat и преобразуем его в cpdag...

Ну... тип 'pag' amat действительно состоит не только из нулей и единиц... Но теперь мы из здесь:

  • 3 означает, что столбец является причиной, а строка - следствием...
  • а 2 означает, что столбец является следствием, а строка - причиной...

поэтому мы заменяем их, создавая новую функцию

pag2cpdag<-function(fciAlgo){
  res<-as(fciAlgo,"amat")#a amat type pag
  res[res==3]<-1
  res[res==2]<-0
  return(res)
}

Итак, мы получаем с

pag2cpdag(fci.fit)

следующий вывод:

Adjacency Matrix 'amat' (8 x 8) of type ‘pag’:
  1 2 3 4 5 6 7 8
1 . 1 . . . . . .
2 1 . 1 . 1 . . .
3 . 1 . . . . . .
4 . . . . . . . .
5 . 1 . . . . . .
6 1 . . . 1 . . .
7 . . . . . 1 . .
8 1 . . . 1 . . .

Мне не удалось изменить тип, но он выдает матрицу в формате cpdag amat. И может применяться к pdag2allDags...

res1<-pdag2allDags(pag2cpdag(fci.fit))
plotAllDags(res1)

чтобы адекватно вернуть все эквивалентные DAG...


Но он по-прежнему не работает для addBgKnowledge с объектами, сгенерированными fci, даже в документации говорится, что он использует amat

fci.amat2<-addBgKnowledge(gInput = pag2cpdag(fci.fit),x=1,y=2)
plot(as(t(fci.amat2),"graphNEL"))

он возвращает:

Error in h(simpleError(msg, call)) : error in evaluating the argument 'x' in selecting a method for function 'plot': no method or default for coercing “amat” to “graphNEL”

Результат

fci.amat2

вроде нормально...

Adjacency Matrix 'amat' (8 x 8) of type ‘pag’:
  1 2 3 4 5 6 7 8
1 . . . . . . . .
2 1 . . . . . . .
3 . 1 . . . . . .
4 . . . . . . . .
5 . 1 . . . . . .
6 1 . . . 1 . . .
7 . . . . . 1 . .
8 1 . . . 1 . . .

Глядя на пример, простая матрица работает для построения графика как graphNEL... поэтому простое преобразование в простую матрицу решает проблему:

pc.amat2<-addBgKnowledge(pag2cpdag(fci.fit),x=1,y=2)
class(pc.amat2)<-"matrix"
plot(as(t(pc.amat2),"graphNEL"))
person hamagust    schedule 29.01.2021