占 change/improvement 的先验率

Accounting for prior rate of change/improvement

我下面有一些值显示了一段时间内的每周结果。在第 19 周,实施了一个新流程,本应进一步降低结果。

但是,很明显,在第 19 周之前,结果已经 week/week 减少。量化 'New Process' 与之前改善率的影响的最佳方法是什么第 19 周?我不想'double-count' New Process的效果。

    Week #  Result  Status
Week 1  849.27  NA
Week 2  807.59  NA
Week 3  803.59  NA
Week 4  849.7   NA
Week 5  852.19  NA
Week 6  845.06  NA
Week 7  833.77  NA
Week 8  788.46  NA
Week 9  800.32  NA
Week 10 814.66  NA
Week 11 829.21  NA
Week 12 799.49  NA
Week 13 812.24  NA
Week 14 772.62  NA
Week 15 782.13  NA
Week 16 779.66  NA
Week 17 752.86  NA
Week 18 758.39  NA
Week 19 738.47  New Process
Week 20 721.11  New Process
Week 21 642.04  New Process
Week 22 718.72  New Process
Week 23 743.47  New Process
Week 24 709.57  New Process
Week 25 704.48  New Process
Week 26 673.51  New Process

计算变化率(即每周/每月的价值变化)可能会给出一个好主意,说明他的变化是否正在加速。

另一种简单的方法是查看 "moving average"。每周计算过去 X 周的平均值。平均值对持续时间较短的变化不太敏感,"noise"。 您可能需要尝试 X (2,3,4) 的几个值以查看哪个效果更好。 绘制数据图(和移动平均线)可能会给你一个更清晰的画面。 如果您可以加载一些可以下载或复制粘贴到 excel 的数据,我可以演示上面的内容。

尝试这个例子,看起来改进大约是 6%,但置信区间很宽。 趋势的突破看起来并不重要。

下面的第一个模型是使用 OLS 估计的,其中常量发生了变化。在第一种情况下,趋势也发生了变化。

我在最后一个模型中使用泊松,因为因变量的值是正的并且它估计一个指数模型。如果我们使用稳健的协方差矩阵,标准误差是正确的。 (我们使用泊松只是为了估计指数模型,我们不假设基础分布是泊松)。

注意:这是一个纯 numpy 版本,我没有费心使用 pandas 或 patsy 公式。如果某些解释变量太大,则泊松存在优化问题。

import numpy as np
import statsmodels.api as sm

data = np.array(
      [ 849.27,  807.59,  803.59,  849.7 ,  852.19,  845.06,  833.77,
        788.46,  800.32,  814.66,  829.21,  799.49,  812.24,  772.62,
        782.13,  779.66,  752.86,  758.39,  738.47,  721.11,  642.04,
        718.72,  743.47,  709.57,  704.48,  673.51])

nobs = len(data)
trend = np.arange(nobs)
proc = (trend >= 18).astype(int)
x = np.column_stack((np.ones(nobs), trend, proc, (trend - 18)*proc))      
res = sm.OLS(data, x).fit()
res.model.exog_names[:] = ['const', 'trend', 'const_diff', 'trend_new']
print(res.summary())

res2 = sm.OLS(data, x).fit()
res2.model.exog_names[:] = ['const', 'trend', 'const_diff']
print(res2.summary())

res4 = sm.OLS(np.log(data), x).fit()
res4.model.exog_names[:] = ['const', 'trend', 'const_diff']
print(res4.summary())

res3 = sm.Poisson(data, x).fit(cov_type='HC0', method='nm', maxiter=5000)
res3 = sm.Poisson(data, x).fit(start_params=res3.params, cov_type='HC0', method='bfgs')
res3.model.exog_names[:] = ['const', 'trend', 'const_diff']
print(res3.summary())
print(np.exp(res3.params))