最近在做因果推断的一些东西,在做因果图发现的时候无意中找到了cdt这个库,发现它集成了很多因果推断相关的算法,打算学习一下。在装好这个库之后(pip install cdt),跑了一下官网里的demo,在跑到model=cdt.causality.graph.GES()这一句的时候出现了一些问题,最后发现和R语言的依赖有关系,费了不少劲才解决,在这里记录一下。
首先,直接跑demo的话会报错:
demo.py:
import cdt
import networkx as nx
import matplotlib.pyplot as plt
if __name__ == '__main__':
data, graph = cdt.data.load_dataset('sachs')
print(data.head())
glasso = cdt.independence.graph.Glasso()
skeleton = glasso.predict(data)
new_skeleton = cdt.utils.graph.remove_indirect_links(skeleton, alg='aracne')
model = cdt.causality.graph.GES()
output_graph = model.predict(data, new_skeleton)
报错信息如下:
这个报错信息很模糊,我初步判断是找不到R的相关依赖,在网上找到了这篇博客https://blog.csdn.net/qq_41365630/article/details/115186063,它是通过直接修改Lib\site-packages\cdt\utils\Settings.py文件来设置与Rscript.exe的链接的,我这里通过在demo的最前面添加一句
cdt.SETTINGS.rpath = 'C:/Program Files/R/R-3.6.2/bin/Rscript.exe'
来得到同样的效果,其中rpath改成自己电脑上装的位置 。
加上这句之后,再次跑demo文件,报错信息有变化,提示我找不到“pcalg”这个包
我尝试直接打开RStudio,install.packages("pcalg"),结果提示我缺少graph和RBGL两个包,并且这两个包也无法直接通过install.packages的方式进行安装,因此我想通过bioconductor这个网站直接下载这两个包的源文件手动安装(bioconductor和CRAN是两个最常用的R依赖包下载网址,但是graph我在CRAN里没找到)
然而当我进了bioconductor尝试直接下载的时候,点了下载链接没反应。。。于是我又在网上找了另一篇博客(很遗憾链接我现在找不到了),在Rstudio里先后运行了以下代码:
if (!requireNamespace("BiocManager", quietly = TRUE))
+ install.packages("BiocManager")
BiocManager::install("graph")
成功将graph包安装好
然后再运行
install.packages("RBGL")
将RBGL包也装好
最后直接运行
install.packages("pcalg")
成功将pcalg包装好了!!!
最后,再次运行demo文件,不再报错,问题解决!
最后的demo.py
import cdt
import networkx as nx
import matplotlib.pyplot as plt
if __name__ == '__main__':
cdt.SETTINGS.rpath = 'C:/Program Files/R/R-3.6.2/bin/Rscript.exe'
data, graph = cdt.data.load_dataset('sachs')
print(data.head())
glasso = cdt.independence.graph.Glasso()
skeleton = glasso.predict(data)
new_skeleton = cdt.utils.graph.remove_indirect_links(skeleton, alg='aracne')
model = cdt.causality.graph.GES()
output_graph = model.predict(data, new_skeleton)
nx.draw_networkx(output_graph)
plt.show()
(其中我加了output_graph的可视化,结果是下面这样的)