0

我开始使用这个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(相邻矩阵)数据。

根据文档上的规范,我认为以下应该可以工作......

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)) 中的错误:数学函数的非数字参数

我们还在 s 对象中看到amatfci'。所以,我尝试了:

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在文档中找到任何其他功能。如何从fci函数的输出中获取所有等效的 DAG?


函数也是如此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)) 中的错误:在为函数“plot”选择方法时评估参数“x”时出错:参数不是矩阵

4

1 回答 1

0

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

如果我们评估结构,两者确实都在处理邻接矩阵(amat)......但它们是不同的...... pc 输出包括一个 ' cpdag' 类型amatfci输出,一个 ' 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' 定义为 0 和 1 的矩阵,没有任何连接fcipc函数

但我找到的解决方案是从采用 ' 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"))
于 2021-01-29T16:53:58.720 回答