微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决pcalg 包上的 `pdag2allDags` 和 `addBgKnowledge` 函数存在问题

我开始使用 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)。我们应该只需要获取 amata相邻的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”,与 amatfci 函数没有任何联系

但我找到的解决方案首先采用 '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 举报,一经查实,本站将立刻删除。