【问题标题】:How can do multiple stationary tests for multiple timeseries in a dataframe如何对数据框中的多个时间序列进行多个平稳测试
【发布时间】:2017-11-05 20:25:51
【问题描述】:

我有以下df:

head(vardata)
       Month repo Callrate  WPI GDP  FED    nse   usd
1 2001-04-01 9.00     7.49 5.41 4.6 4.50 1125.2 46.79
2 2001-05-01 8.75     8.03 5.60 4.6 4.00 1167.9 46.92
3 2001-06-01 8.50     7.24 5.30 4.6 3.75 1107.9 47.00
4 2001-07-01 8.50     7.19 5.23 5.3 3.75 1072.8 47.14
5 2001-08-01 8.50     6.94 5.41 5.3 3.50 1053.8 47.13
6 2001-09-01 8.50     7.30 4.52 5.3 3.00  913.9 47.65

vardata_num<-df[,2:8]

我想使用以下规则对所有 7 个变量进行 Box.test、adf.test 和 kpss.test:

假设我将显着性水平设置为 5%。那么规则是:

1) 对于 Box.test,如果 p 值 平稳

2) 对于 adf.test,如果 p 值 平稳

3) 对于 kpss.test,如果 p 值 > 0.05 => 平稳(注意不等式的变化)

我个人做了以下测试:

Box.test(ts(vardata_num$repo),lag=20,type="Ljung-Box")

    Box-Ljung test

data:  ts(vardata_num$repo)
X-squared = 1100, df = 20, p-value <2e-16

adf.test(ts(vardata_num$repo),alternative = "stationary")

    Augmented Dickey-Fuller Test

data:  ts(vardata_num$repo)
Dickey-Fuller = -2.7, Lag order = 5, p-value = 0.3
alternative hypothesis: stationary

kpss.test(ts(vardata_num$repo))

    KPSS Test for Level Stationarity

data:  ts(vardata_num$repo)
KPSS Level = 0.32, Truncation lag parameter = 3, p-value = 0.1

# to extract p values
Box.test(ts(vardata_num$repo),lag=20,type="Ljung-Box")$p.value
adf.test(ts(vardata_num$repo),alternative = "stationary")$p.value
kpss.test(ts(vardata_num$repo))$p.value

这是对所有变量一次完成的.....

但如果可能的话,我想一次性对所有 var 和在某种数据框中输出的所有这些测试进行如下操作:

   var         box.pvalue  box  adf.pvalue adf  kpss.pvalue kpss
   repo          0.03      TRUE    0.03   TRUE     0.03    FALSE
   Callrate      0.03      TRUE    0.03   TRUE     0.03    FALSE
   WPI           0.03      TRUE    0.03   TRUE     0.03    FALSE
   GDP           0.03      TRUE    0.03   TRUE     0.03    FALSE
   FED           0.51      FALSE   0.03   TRUE     0.03    FALSE
   nse           0.03      TRUE    0.03   TRUE     0.03    FALSE
   usd           0.45      FALSE   0.03   TRUE     0.03    FALSE

其中 TRUE= 系列是固定的; FALSE= 系列是非平稳的

更新---我的尝试

多个时间序列的平稳性检验

multi_stat_tests<- function(df){
  for(i in 1:dim(df)[2]){
    df_multi<-data.frame(var=names(df)[i],box.pvalue=Box.test(ts(df[,i]),lag=20,type="Ljung-Box")$p.value,adf.pvalue=adf.test(ts(df[,i]),alternative = "stationary")$p.value,kpss.pvalue=kpss.test(ts(df[,i]))$p.value,
box=Box.test(ts(df[,i]),lag=20,type="Ljung-Box")$p.value<0.05,
adf=adf.test(ts(df[,i]),alternative = "stationary")$p.value<0.05,
kpss=kpss.test(ts(df[,i]))$p.value>0.05
)
    return(df_multi)
  }
}

>multi_stat_tests(vardata_num)

  var box.pvalue adf.pvalue  kpss.pvalue  box  adf  kpss
1 repo          0     0.2859         0.1 TRUE FALSE TRUE

它只是拾取一个变量......它没有遍历所有变量......这里缺少一些东西......需要帮助!!!!!

【问题讨论】:

  • 最好包含您迄今为止尝试过的内容。你已经概述了你想做的事情,但究竟是什么让你绊倒了?这里的人向您展示如何调整您的代码,而不是为您编写代码要好得多。
  • @rosscova 我已经为每个变量分别完成了所有这些测试......我需要帮助才能在某种循环中完成......跨度>
  • 发布您用于“一次一个”测试的代码。向您展示如何迭代您已经拥有的代码将比从头开始要好得多。
  • @rosscova 已编辑并包含测试 ....

标签: r time-series


【解决方案1】:

这里是dplyrtidyr 的解决方案:

library(dplyr)
library(tidyr)
library(tseries) # for kpss.test

data <- data.frame(Sys.Date()-1:200, matrix(rnorm(1400, 0, 1), ncol=7) )
colnames(data) <- c("Month", "repo", "Callrate", "WPI", "GDP", "FED", "nse", "usd") 

data %>% 
 gather(Series, Value, -Month) %>%
  group_by(Series) %>%
   summarise(
    box.pvalue = Box.test(Value, lag=20, type="Ljung-Box")$p.value,
    box = Box.test(Value, lag=20, type="Ljung-Box")$p.value<0.05,
    adf.pvalue = adf.test(Value, alternative = "stationary")$p.value,  
    adf = adf.test(Value, alternative = "stationary")$p.value<0.05,
    kpss.pvalue=kpss.test(Value)$p.value,
    kpss=kpss.test(Value)$p.value>0.05
  )

长桌设计让您避免for循环解决方案。相反,您对列Value. 中的值进行条件分析(以Series 为条件)

【讨论】:

  • 太棒了!!!在这里发布通常且不那么有效的方式也......
【解决方案2】:

这是通常的但不是那么有效的方法

multi_stat_tests<- function(df){
    p <- ncol(df)
    df_multi <- data.frame(var=names(df),
                           box.pvalue=sapply(df, function(v) Box.test(ts(v),lag=20,type="Ljung-Box")$p.value),
                           adf.pvalue=sapply(df, function(v) adf.test(ts(v),alternative = "stationary")$p.value),
                           kpss.pvalue=sapply(df, function(v) kpss.test(ts(v))$p.value)
                           )
    df_multi$box <- df_multi$box.pvalue < 0.05
    df_multi$adf <- df_multi$adf.pvalue < 0.05
    df_multi$kpss <- df_multi$kpss.pvalue > 0.05
    row.names(df_multi) <- c()
    df_multi[,c(1,2,5,3,6,4,7)]
}

df2<-multi_stat_tests(vardata_num)
df2
##        var box.pvalue  box adf.pvalue   adf kpss.pvalue  kpss
## 1     repo          0 TRUE    0.28593 FALSE     0.10000  TRUE
## 2 Callrate          0 TRUE    0.06008 FALSE     0.01000 FALSE
## 3      WPI          0 TRUE    0.28803 FALSE     0.03910 FALSE
## 4      GDP          0 TRUE    0.04358  TRUE     0.06211  TRUE
## 5      FED          0 TRUE    0.43113 FALSE     0.01000 FALSE
## 6      nse          0 TRUE    0.02745  TRUE     0.01000 FALSE

【讨论】:

    猜你喜欢
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2018-03-21
    • 2019-03-11
    • 2020-09-13
    • 1970-01-01
    相关资源
    最近更新 更多