for 循环:对 R 中所有可能的组合执行协整检验
for loop: performing cointegration test for all possible combinations in R
我想弄清楚我是否可以通过 ADF 检验找到非平稳时间序列的每个组合的协整关系。这可以通过以下函数完成:
coint <- function(x,y) {
vals <- data.frame(x,y)
beta <- coef(lm(vals[,2] ~ vals[,1] + 0, data = vals))[1]
(tseries::adf.test(vals[,2]- beta*vals[,1], alternative = "stationary", k = 0))$p.value
}
如果我 运行 函数 coint(df1, df2),我得到一个 p 值。但是,我想为每种可能的组合执行此操作(并将其存储在数据框中)。我已经知道我可以使用 combn() 函数进行所有可能的组合。但是,我无法让我的 for 循环正确地为所有可能的组合执行此操作。也许这个操作也可以用 purrr 包中的函数来完成?
如有任何建议,我们将不胜感激!我还在下面添加了一个示例数据框。
# A tibble: 18 x 5
`1` `2` `3` `4` `5` `
1 416 850 53 78 66
2 407 922 43 82 67
3 410 901 37 84 71
4 412 945 53 95 77
5 409 998 101 83 86
6 375 947 53 86 84
7 364 908 43 87 71
8 377 952 39 95 64
9 387 961 18 109 69
10 352 932 11 102 69
11 332 920 12 108 69
12 318 987 22 121 83
13 320 961 17 124 88
14 325 931 15 145 64
15 328 816 6 169 44
16 315 925 8 156 55
17 309 737 4 176 49
18 273 626 4 193 59
不是最好和最有效的循环,但我认为没问题:
输入将是一个数据框,其中包含要检查的所有变量
coint <- function(vars) {
d<-as.matrix(vars) #convert data frame to Matrix
n<-length(colnames(vars)) #calculate the total number of variables
m<-combn(n,2) #calculate all possible combinations of pairs for all variables
col_m<-dim(m)[2] #number of all possible combinations
result<-matrix(NA,nrow=col_m,ncol=3) #empty result matrix
colnames(result)<-c("Var_1","Var_2","p_Value")
for (i in 1:col_m){
Var_1<-m[1,i]
Var_2<-m[2,i]
res <- lm(d[,Var_1] ~ d[,Var_2] + 0)$residuals
p<-tseries::adf.test(res, alternative = "stationary", k = 0)$p.value
result[i,1]<-colnames(vars)[Var_1]
result[i,2]<-colnames(vars)[Var_2]
result[i,3]<-p
}
return(result)
}
协整方法是关于2个变量的残差需要平稳。我立即将它们从估计中剔除,而不是重新计算它们。
我想弄清楚我是否可以通过 ADF 检验找到非平稳时间序列的每个组合的协整关系。这可以通过以下函数完成:
coint <- function(x,y) {
vals <- data.frame(x,y)
beta <- coef(lm(vals[,2] ~ vals[,1] + 0, data = vals))[1]
(tseries::adf.test(vals[,2]- beta*vals[,1], alternative = "stationary", k = 0))$p.value
}
如果我 运行 函数 coint(df1, df2),我得到一个 p 值。但是,我想为每种可能的组合执行此操作(并将其存储在数据框中)。我已经知道我可以使用 combn() 函数进行所有可能的组合。但是,我无法让我的 for 循环正确地为所有可能的组合执行此操作。也许这个操作也可以用 purrr 包中的函数来完成?
如有任何建议,我们将不胜感激!我还在下面添加了一个示例数据框。
# A tibble: 18 x 5
`1` `2` `3` `4` `5` `
1 416 850 53 78 66
2 407 922 43 82 67
3 410 901 37 84 71
4 412 945 53 95 77
5 409 998 101 83 86
6 375 947 53 86 84
7 364 908 43 87 71
8 377 952 39 95 64
9 387 961 18 109 69
10 352 932 11 102 69
11 332 920 12 108 69
12 318 987 22 121 83
13 320 961 17 124 88
14 325 931 15 145 64
15 328 816 6 169 44
16 315 925 8 156 55
17 309 737 4 176 49
18 273 626 4 193 59
不是最好和最有效的循环,但我认为没问题: 输入将是一个数据框,其中包含要检查的所有变量
coint <- function(vars) {
d<-as.matrix(vars) #convert data frame to Matrix
n<-length(colnames(vars)) #calculate the total number of variables
m<-combn(n,2) #calculate all possible combinations of pairs for all variables
col_m<-dim(m)[2] #number of all possible combinations
result<-matrix(NA,nrow=col_m,ncol=3) #empty result matrix
colnames(result)<-c("Var_1","Var_2","p_Value")
for (i in 1:col_m){
Var_1<-m[1,i]
Var_2<-m[2,i]
res <- lm(d[,Var_1] ~ d[,Var_2] + 0)$residuals
p<-tseries::adf.test(res, alternative = "stationary", k = 0)$p.value
result[i,1]<-colnames(vars)[Var_1]
result[i,2]<-colnames(vars)[Var_2]
result[i,3]<-p
}
return(result)
}
协整方法是关于2个变量的残差需要平稳。我立即将它们从估计中剔除,而不是重新计算它们。