google因果影响模型的python版本
pycausalimpact的Python项目详细描述
因果影响
python因果影响(或因果推理)实现Google's模型,所有功能都已完全移植和测试。
工作原理
该算法的主要目的是通过分析预期时间序列数据和观测时间序列数据之间的差异来推断给定干预(或任何行动)对某个响应变量的预期影响。
数据分为两部分:第一部分是所谓的“预干预”期,而Bayesian Structural Time Series的概念被用来拟合一个最能解释所观察到的现象的模型。在数据的第二部分(“干预后”期间)使用拟合模型来预测在没有进行干预的情况下的反应。这些推论是基于观察到的对预测结果的反应之间的差异,这种差异产生了干预对数据造成的绝对和相对预期效果。
该模型假设(建议在您的数据中确认)响应变量可以通过线性回归精确建模,即所谓的“协变量”(或X
),即不得受到发生的干预的影响(例如,如果一家公司想推断一个特定的营销活动将对其“收入”产生什么影响,那么它的每日“访问量”不能用作协变量,因为总访问量可能会受到该活动的影响。
它更常用于推断营销干预对企业的影响,如与给定活动相关联的预期收入,甚至通过完全关闭某个渠道(也称为“坚持”测试)更准确地断言该渠道带来的收入。值得注意的是,该模型可以广泛应用于不同的领域和主题;对时间序列数据的任何干预都有可能被建模,并根据观测和预测数据进行推断。
有关详细信息,请参阅examples
文件夹中的getting started。
安装
pip install pycausalimpact
要求
- Python{2.7,3.5,3.6,3.7}
- 努比
- scipy
- 统计模型
- matplotlib
- Jinja2
开始
我们推荐kay brodersen(r中因果影响实现的创建者之一)的presentation。
我们还创建了这个介绍性的ipython notebook,并举例说明了如何使用这个包。
简单示例
下面是一个在python中运行的简单示例(也可以在原始google的r实现中找到):
importnumpyasnpimportpandasaspdfromstatsmodels.tsa.arima_processimportArmaProcessfromcausalimpactimportCausalImpactnp.random.seed(12345)ar=np.r_[1,0.9]ma=np.array([1])arma_process=ArmaProcess(ar,ma)X=100+arma_process.generate_sample(nsample=100)y=1.2*X+np.random.normal(size=100)y[70:]+=5data=pd.DataFrame({'y':y,'X':X},columns=['y','X'])pre_period=[0,69]post_period=[70,99]ci=CausalImpact(data,pre_period,post_period)print(ci.summary())print(ci.summary(output='report'))ci.plot()
python和r包之间的差异
在使用这个包时,您会注意到一件事,有时结果会收敛到与r包输出类似的程度,有时可能会产生不同的结论。
这是一个相当复杂的话题,我们已经更深入地讨论了第#34、#37和#40个问题,我们强烈推荐阅读这些问题。
简言之,python的实现依赖于statsmodels,后者使用经典的kalman滤波方法来求解状态空间方程,而r使用贝叶斯方法(来自bsts包)和随机kalman滤波技术;这两种算法都有望收敛到类似的最终状态空间解(ref)。
尽管有相似之处,但这两个包对于先前的初始化以及优化过程中涉及的步骤使用了不同的假设:在r中,我们找到了一种依赖于用户先前知识的方法,Python使用古典统计技术,旨在最大化以结构时间序列分量表示的似然函数。
正如我们在前面提到的问题中所讨论的,很难判断哪个是正确的,或者“更正确”;每个包都有自己的假设和技术来弥补最终用户的不足决定合适与否。我们建议比较用例中两个包的结果,以便更全面地了解结论是否一致。
最后,在使用这个python包时,我们强烈建议将prior设置为none如下:
ci = CausalImpact(data, pre_period, post_period, prior_level_sd=None)
这将让statsmodel本身在本地级别组件上对previor进行优化。如果您确信您的本地级别previor应该是一个给定的特定值(比如0.01
),那么在那里使用它可能是可以的(除非您有信心,否则您最终可能会遇到次优解)。
贡献、错误、问题
我们非常欢迎您的贡献!如果您想提出新的更改、修复错误或改进某些内容,请随意转移存储库并向我们发送请求。您还可以打开新的^{