zoukankan      html  css  js  c++  java
  • ARIMA小记

    partial correlation: 条件相关.

    在某个已知的假设下面,我们考虑其他的一些变量值的情况下,另外两个变量的相关性.

    e.g.
    因变量(response variable):(y), 自变量(predictor variables): (x_{1}, x_{2}, x_{3})
    关于 (y 和 x_{3})的partial correlation是考虑由$x_{1}和 x_{2}分别对y 和 x_{3}的影响的correlation $

    在回归当中,partial correlation是两个不同的回归当中的残差的相关关系:

    (1) 通过(x_{1}和 x_{2}预测y)的回归过程;
    (2) 从(x_{1}和 x_{2}预测x_{3}的回归过程)
    简单来说,我们计算没有从(x_{1}和 x_{2}预测出来的y 和 x_{3})的部分的相关关系
    具体公式:

    [frac{Convariance(y,x_{3}|x_{1}, x_{2})}{sqrt{Variance(y|x_{1},x_{2})Variance(x_{3}|x_{1},x_{2})}} ]

    参考文献1当中对回归模型有一个比较不同的解释, 可以查看

    时间序列. 关于 (x_{t}, x_{t-h})的偏自相关(partial autocorrelation)定义为基于一些列的观测时间点(t和t-h之间的观测值x_{t-h+1}, ...,x_{t-1}的条件下,x_{t}, x_{t-h}的相关性.)

    (1^{st}阶的偏自相关和1^{st}阶的 自相关一致)
    (2^{st})阶(lag)偏自相关是:

    [frac{Convariance(x_t,x_{t-2}|x_{t-1})}{sqrt{Variance(x_{t}|x_{t-1})Variance(x_{t-2}|x_{t-1})}} ]

    在稳态序列当中,分母的两个值会是一样的. 这是两个不同时间片段基于中间的时间的观测值已知的相关性.
    (3^{st})阶(lag)偏自相关是:

    [frac{Convariance(x_t,x_{t-3}|x_{t-1}, x_{t-2})}{sqrt{Variance(x_{t}|x_{t-1},x_{t-2})Variance(x_{t-3}|x_{t-1}, x_{t-2})}} ]

    偏自相关和AR模型当中的p相关.非零值的PACF代表可以选择的p
    非零值的ACF代表可以选择的q,在MA过程当中,这里是拟合误差.

    PACF值只能描述观测和它滞后的(lag, 也就是t-h时刻的数据)观测之间的相关性.

    MA过程是自回归模型当中时间序列和前一个预测值的残差, 也就是基于最近的预测的误差上面来修正未来的预测值.

    稳态性

    单边量的随机过程的稳态性的测试:

    def test_stationary(timeseries):
        plt.figure(figsize=(20,12))
        
        rolmean = pd.rolling_mean(timeseries, window=24)
        rolstd = pd.rolling_std(timeseries, window=24)
        
        orig = plt.plot(timeseries, color='blue', label='original')
        mean = plt.plot(rolmean, color='red', label='rolling mean')
        std = plt.plot(rolstd, color='black', label='rolling std')
        plt.legend(loc='best')
        plt.title('Rolling Mean & Standard Deviation')
        plt.show(block=False)
        
        print("Results of Dickey-Fuller Test:")
        dftest = sm.tsa.adfuller(timeseries, autolag='AIC')
        dfoutput = pd.Series(dftest[0:4],index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
        for key,value in dftest[4].items():
            dfoutput['Critical Values ({})'.format(key)] = value
        print(dfoutput)
    

    这里通过利用Dickey-Fuller Test来查看数据的稳态性

    考虑随机过程如下:

    [y_{i} = phi y_{i-1} + varepsilon_{i} ]

    (mid varphi mid le 1且 varepsilon_{i}是白噪声). 如果(mid varphi mid = 1),这里称为unit root.
    特别的说,当(varphi=1)时, 这个随机过程是不稳定的,(raondom walk,但是没有位移(no drift)).
    事实上当(mid varphi mid = 1,这个过程是不稳定的, 当mid varphi mid le 1, 这个过程是稳定的.我们一般不考虑mid varphi mid ge 1的情形,因为在这种情况下,这个过程是爆炸态的(explosive), 因为是持续增长的.)

    上面的这个随机过程是一阶自回归的过扯恩个AR(1).

    Dickey-Fuller test

    是检验上面的过程是否有一个unit root.这个方法的具体过程如下:
    首先我们会计算一阶差分:

    [y_{i} - y_{i-1} = phi y_{i-1} + varepsilon_{i} - y_{i-1} ]

    [y_{i} - y_{i-1} = (phi-1)y_{i-1} + varepsilon_{i} ]

    定义 (Delta y_{i} = y_{i} - y_{i-1}),定义(eta=varphi-1), 上面的方程变为:

    [Delta y_{i} =eta y_{i-1} + varepsilon_{i} ]

    (eta le 0)所以对(varphi)的验证编程了对斜率参数(eta = 0)的测试.因此,我们有一个单边测试(one-tailed test,因为(eta)不可能是正值):

    [H_{0}: eta = 0( 等同与 varphi = 1) ]

    [H_{1}: eta < 0(等同于 varphi < 1) ]

    在替换假设下,如果(b是正常的最小平方(ordinary least square, OLS)关于 eta的估计,那么 varphi-bar = 1+b是 varphi的 OLS的估计, 对于足够大的n有)

    [sqrt{n}(phi - ilde{phi}) ilde N(0, s.e.) , s.e.=sqrt{1-phi^2} ]

    这里可以利用普通的线性回归的方法, 但是在这里的零假设的系数t不满组正态分布,所以我们不能够采用学生分布(t test), 这里的系数服从tau 分布,
    所以测试当中决定了这个tau的统计量( au)是否小于( au_{crit}), 这个值可以从Dickey-Fuller Table当中找到.

    如果说计算的tau的值小于critical value, 那么我们会有一个显著的结果,否则我们接受零假设, 也就是这个时间序列不是稳态的
    There are the following three versions of the Dickey-Fuller test:

    Type 0 No constant, no trend Δyi = β1 yi-1 + εi
    Type 1 Constant, no trend Δyi = β0 + β1 yi-1 + εi
    Type 2 Constant and trend Δyi = β0 + β1 yi-1 + β2 i+ εi

    当时序数据不是稳定的时候, 需要对时序数据进行分解
    一般分解有乘法分解,一个有加性分解.

    sm.tsa.seasonal_decompose(time_series, model='multiplicative', freq=freq)
    

    上面的拆分是非常简单的将模型拆分了趋势性信息, 季节性信息以及残差信息.
    当模型是加性模型的时候: 线性的条件是, 残差信号随着时间是一个同样大小的值, 线性的周期性信息是同样频率和幅度的, 线性的趋势是一条直线.
    乘法模型就是非线性的,类似与quadratic或者是指数模型.随着时间的增加或者降低.一个非线性的趋势是一条曲线.一个非线性的周期新信息是频率或者是幅度随着时间的变化增加或者降低.

    周期性ARIMA信号

    这里好像计算的都是加性模型的,可能因为arima本身的特性就是因为需要的是平稳信号吧,有待补充

    prophet: facebook的时间预测的开源包

    这里补充一部分的数据问题:

    In statistics, engineering, economics, and medical research, censoring is a condition in which the value of a measurement or observation is only partially known. 
    
    MCAR: mssing completely at random
    MAR: missing at random
    NMAR: not missing at random
    

    参考文献:
    https://newonlinecourses.science.psu.edu/stat510/node/62/
    https://machinelearningmastery.com/gentle-introduction-autocorrelation-partial-autocorrelation/
    http://www.real-statistics.com/time-series-analysis/stochastic-processes/dickey-fuller-test/
    http://www.seanabu.com/2016/03/22/time-series-seasonal-ARIMA-model-in-python/
    https://facebook.github.io/prophet/docs/quick_start.html#python-api
    https://otexts.org/fpp2/seasonal-arima.html
    https://github.com/seanabu/seanabu.github.io/blob/master/Seasonal_ARIMA_model_Portland_transit.ipynb
    https://zhuanlan.zhihu.com/p/50741970

  • 相关阅读:
    CodingSouls团队项目冲刺(4)-个人概况
    第八周周总结
    CodingSouls团队项目冲刺(3)-个人概况
    CodingSouls团队项目冲刺(2)-个人概况
    线程中的join使用
    向线程传递数据的三种方法
    Java collections使用介绍
    Guava Collections使用介绍[超级强大]
    重构改善既有代码的设计--重新组织数据
    重构改善既有代码的设计--在对象之间搬移特性
  • 原文地址:https://www.cnblogs.com/luxuriance-lily/p/10214069.html
Copyright © 2011-2022 走看看