如何解决pcalg 包上的 `pdag2allDags` 和 `addBgKnowledge` 函数存在问题
我开始使用 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
(a相邻的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)
但是,它返回:
sqrt(ncol(res$dags)) 中的错误:数学函数的非数字参数
我们还看到 amat
对象中的 fci'
。所以,我试过:
res2<-pdag2allDags(fci.fit@amat)
plotAllDags(res2)
它也返回相同的:
sqrt(ncol(res$dags)) 中的错误:数学函数的非数字参数
但如果我使用 pc
算法,它会起作用:
pc.fit<-pc(suffStat,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"),y=2)
plot(as(t(fci.amat2),"graphNEL"))
它提供:
Error in h(simpleError(msg,call)) : 评估参数时出错 为函数“plot”选择方法时出现“x”:参数不是 矩阵
解决方法
我认为这不应该是一个理想的答案,它应该有更好的方法来做到这一点,但由于我没有得到任何答案,我已经做了一些尝试,我现在分享我是如何规避这个问题的...
如果我们评估结构,两者确实都在处理邻接矩阵(amat)……但它们是不同的……pc输出包含一个'cpdag
'类型amat
,和{ {1}} 输出,“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
文档没有明确提到...
- 函数定义表示“一个给定的部分有向无环图 (PDAG)”。
- 该示例显示了一个定义为 0 和 1 的矩阵的“
pdag2allDags
”,与amat
或fci
函数没有任何联系
但我找到的解决方案首先采用 'pc
' 类型 pag
并将其转换为 'amat
'...
嗯... 'cpdag
' 类型 pag
确实不仅仅由零和一组成...
但是我们现在从here:
- 3 表示列是原因,行是结果...
- 和 2 表示列是结果,行是原因...
所以,我们替换它们创建一个新函数
amat
所以我们得到了
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
充分返回所有等效的 DAG...
但它仍然不适用于带有 res1<-pdag2allDags(pag2cpdag(fci.fit))
plotAllDags(res1)
生成的对象的 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。