pcalg 包上的 `pdag2allDags` 和 `addBgKnowledge` 函数有问题
Problem with the `pdag2allDags` and `addBgKnowledge` functions on pcalg package
我开始使用 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
(来自 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
关于 pdag2allDags
的 pcalg
文档没有明确提到...
- 函数定义说 'a Given Partially Directed Acyclic Graph (PDAG)'.
- 该示例显示了定义为零和一矩阵的“
amat
”,与 fci
或 pc
函数 没有任何联系
但我找到的解决方案首先采用“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 . . .
我无法更改类型,但它提供了 cpdag
的 amat
格式的矩阵。并且可以应用于pdag2allDags
...
res1<-pdag2allDags(pag2cpdag(fci.fit))
plotAllDags(res1)
到 return 足够所有等效的 DAG...
但它仍然不适用于 addBgKnowledge
由 fci
生成的对象,即使文档说它使用 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"))
我开始使用 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
(来自 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
关于 pdag2allDags
的 pcalg
文档没有明确提到...
- 函数定义说 'a Given Partially Directed Acyclic Graph (PDAG)'.
- 该示例显示了定义为零和一矩阵的“
amat
”,与fci
或pc
函数 没有任何联系
但我找到的解决方案首先采用“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 . . .
我无法更改类型,但它提供了 cpdag
的 amat
格式的矩阵。并且可以应用于pdag2allDags
...
res1<-pdag2allDags(pag2cpdag(fci.fit))
plotAllDags(res1)
到 return 足够所有等效的 DAG...
但它仍然不适用于 addBgKnowledge
由 fci
生成的对象,即使文档说它使用 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"))