pcalg 包上的 `pdag2allDags` 和 `addBgKnowledge` 函数有问题

Problem with the `pdag2allDags` and `addBgKnowledge` functions on pcalg package

我开始使用 pcalg 包,我对函数 pdag2allDagsaddBgKnowledge:

有一些疑问

我正在使用软件包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(来自 here)。我们应该只需要获取 amat (adjacent matrix) 数据。

根据 the documentation 上的规范,我认为以下应该可行...

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)

但是,它 returns:

Error in sqrt(ncol(res$dags)) : non-numeric argument to mathematical function

我们在 fci's 对象中也看到了 amat。所以,我尝试了:

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

它也returns一样:

Error in sqrt(ncol(res$dags)) : non-numeric argument to mathematical function

但是如果我使用 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 函数。如何从 fci 函数的输出中获取所有等价的 DAG?


函数addBgKnowledge也是如此。它适用于 pc:

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

但不适合 fci,甚至 documentation 说它使用 amat

fci.amat2<-addBgKnowledge(gInput = as(fci.fit,"amat"),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': argument is not a matrix

我认为这应该不是一个理想的答案,它应该有更好的方法来做到这一点,但由于我没有得到任何答案,我做了一些尝试,我正在分享我是如何规避这个问题的现在...

如果我们评估结构,两者确实都在处理邻接矩阵 (amat)...但它们是不同的...pc 输出包含一个 '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

关于 pdag2allDagspcalg 文档没有明确提到...

  • 函数定义说 'a Given Partially Directed Acyclic Graph (PDAG)'.
  • 该示例显示了定义为零和一矩阵的“amat”,与 fcipc 函数
  • 没有任何联系

但我找到的解决方案首先采用“pag”类型 amat 并将其转换为“cpdag”...

嗯... 'pag' 类型 amat 确实不只是由零和一组成... 但是我们现在从 here:

  • 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 . . .

我无法更改类型,但它提供了 cpdagamat 格式的矩阵。并且可以应用于pdag2allDags...

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

到 return 足够所有等效的 DAG...


但它仍然不适用于 addBgKnowledgefci 生成的对象,即使文档说它使用 amat

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

它returns:

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"))