因果模型四:实现因果模型的python工具——pycasual


关于因果模型,我们在前三篇文章中简单介绍了因果模型的研究发展历程、一个因果模型的数学化求解过程和因果模型在医学和商业领域的两个应用实例。今天我们就来简单介绍一个实现因果模型的python工具:pycasual。

pycasual的开发者来自于因果研究中心(Center for Casual Discovery),是一个集合了目前因果研究领域中多种主流算法的因果模型工具包。工具不仅仅局限于python语言,同样支持R语言,java命令行模式以及可以直接拖拉拽的工具软件,更多详细的内容可以参考他们的官方网站:pitt.edu。今天这篇文章,我们就通过一个简单的官方数据案例,来展示一下pycasual如何应用。

因果图模型scm Python 因果图模型 Python_初始化


首先通过pandas导入案例数据,数据中有5个变量,我们的目的就是要在这5个变量之间建立起一个因果关系网络。

因果图模型scm Python 因果图模型 Python_数据_02


导入pycasual工具并初始化。

因果图模型scm Python 因果图模型 Python_数据_03


定制化先验信息。在因果模型三这篇博客中,我们通过两个实际应用案例表明,想要最终获得一个基本符合逻辑的因果关系模型,先验信息的加入十分必要。这其实是让因果发现算法能够站在巨人的肩膀上,本质上是让算法在我们的经验逻辑框架之上,去完善因果关系的细节。pycasual这个工具包就支持先验的设定。如上图forbid这个变量就指定了TangibilityCondition不能够成为Impact的原因,也就是说最终出来的因果图不能够出现一条从TangibilityCondition指向Impact的边。require这个变量指定了Sympathy必须是TangibilityCondition的一个原因。第三行tempForbid这个变量限制了TangibilityCondition和Imaginability之间不能够互为因果,即这两个变量之间不能出现任何方向的边。下一行temporal这个变量指定了所有变量的时间顺序,类似于我们上一篇博客中提到的那个医学领域的例子,他们将所有的相关变量按照时间顺序分为了体质类、童年类、入职类、培训类等等。这里的例子中,我们把这5个变量分为了三个阶段,第一阶段变量:TangibilityCondition和Imaginability;第二阶段变量:Sympathy和AmountDonated;第三阶段变量:Impact。最后初始化先验信息prior,打印出prior可以看到我们设定的所有信息都已经满足。

因果图模型scm Python 因果图模型 Python_因果图模型scm Python_04


然后,我们从search库中初始化tetrad变量,打印出所有目前他们已经封装好的算法如上图,可以看到我们在因果模型二这篇文章中详细介绍的线性非高斯无环模型(lingam)也在其中。

因果图模型scm Python 因果图模型 Python_初始化_05


然后,选择一个算法,初始化这个因果模型,这里我们选择了fast-ges算法进行初始化。

因果图模型scm Python 因果图模型 Python_数据_06


最后,把样本数据喂到因果模型中,执行算法,得到结果,并把结果画出来就得到了上图中所示的因果模型图。可以看到,我们之前指定的从Sympathy到TangibilityCondition的有向边是存在的,我们限制的TangibilityCondition和Sympathy、Impact之间不存在边的联系,除了我们指定的从Sympathy到TangibilityCondition的边之外,其它变量都是按照我们设定的时间顺序进行因果定向的。

对于更多的数据和算法的实例,可以参照pycasual的github网站:bd2kccd,这里同样讲明了安装pycasual所需要的支持环境。对于各种算法和检验方法的的一个详细描述,我们可以参考这个网站:Tetrad