滚动期间的成对相关性忽略双重计算
Pairwise correlations over rolling periods ignoring double calculations
我正在尝试通过滚动 windows 计算 n= 40 个变量的成对相关性,其中 2 个给定变量的所有成对相关性都保存在一个新变量中。
我的数据集具有以下结构:
Date V1 V2 V3 . . .
01/01/2009 0.3 0.6 0.5
02/01/2009 0.1 0.5 0.2
03/01/2009 0.7 0.1 0.1
.
.
.
以下代码可以解决问题。 但是,它没有忽略相关矩阵的下对角线(它估计了两次 vars 之间的相关性 + 一次对角线上的 1):
ds (Date), not
gl vars `r(varlist)'
local i = 0
local j = 0
foreach current_variable1 in $vars {
local i = `i'+1
foreach current_variable2 in $vars {
local j = `j'+1
if (`j' > `i') {
mvcorr `current_variable1' `current_variable2', ///
generate(corr_`current_variable1'_`current_variable2') window(60) force
}
}
}
特别是 (j > i
) 上的 if
条件旨在捕获每个成对相关性的加倍计算,但未能做到这一点。在 mvcorr
中包含 if
条件只会产生错误消息 'no observations'
.
这个问题的解决方案是什么?
@William Lisowski 在评论中调试了您的代码,但您可以简化整个过程。
使用用户编写的命令预先创建元组 tuples
(ssc install tuples
)。
clear
set more off
*----- example data -----
sysuse auto
keep mpg weight price
gen time = _n
tsset time
*----- what you want -----
tuples price mpg weight, min(2) max(2)
forvalues i = 1/`ntuples' {
local v1 : word 1 of `tuple`i''
local v2 : word 2 of `tuple`i''
mvcorr `tuple`i'', generate(`v1'_`v2') window(10) force
}
describe
@William 的建议导致相同的结果:
local i = 0
local j = 0
foreach v1 of varlist `vars' {
local i = `i' + 1
foreach v2 of varlist `vars' {
local j = `j' + 1
if (`j' > `i') {
mvcorr `v1' `v2', ///
generate(`v1'_`v2') window(10) force
}
}
local j = 0
}
describe
我已经将元组添加到我的曲目中,而且,原始的嵌套循环方法可以按照以下示例的思路进行简化。
local vars a b c
local n : word count `vars'
forvalues i=1/`n' {
forvalues j=`i'/`n' {
local v1 : word `i' of `vars'
local v2 : word `j' of `vars'
display "`i' `v1' `j' `v2'"
}
}
我正在尝试通过滚动 windows 计算 n= 40 个变量的成对相关性,其中 2 个给定变量的所有成对相关性都保存在一个新变量中。
我的数据集具有以下结构:
Date V1 V2 V3 . . .
01/01/2009 0.3 0.6 0.5
02/01/2009 0.1 0.5 0.2
03/01/2009 0.7 0.1 0.1
.
.
.
以下代码可以解决问题。 但是,它没有忽略相关矩阵的下对角线(它估计了两次 vars 之间的相关性 + 一次对角线上的 1):
ds (Date), not
gl vars `r(varlist)'
local i = 0
local j = 0
foreach current_variable1 in $vars {
local i = `i'+1
foreach current_variable2 in $vars {
local j = `j'+1
if (`j' > `i') {
mvcorr `current_variable1' `current_variable2', ///
generate(corr_`current_variable1'_`current_variable2') window(60) force
}
}
}
特别是 (j > i
) 上的 if
条件旨在捕获每个成对相关性的加倍计算,但未能做到这一点。在 mvcorr
中包含 if
条件只会产生错误消息 'no observations'
.
这个问题的解决方案是什么?
@William Lisowski 在评论中调试了您的代码,但您可以简化整个过程。
使用用户编写的命令预先创建元组 tuples
(ssc install tuples
)。
clear
set more off
*----- example data -----
sysuse auto
keep mpg weight price
gen time = _n
tsset time
*----- what you want -----
tuples price mpg weight, min(2) max(2)
forvalues i = 1/`ntuples' {
local v1 : word 1 of `tuple`i''
local v2 : word 2 of `tuple`i''
mvcorr `tuple`i'', generate(`v1'_`v2') window(10) force
}
describe
@William 的建议导致相同的结果:
local i = 0
local j = 0
foreach v1 of varlist `vars' {
local i = `i' + 1
foreach v2 of varlist `vars' {
local j = `j' + 1
if (`j' > `i') {
mvcorr `v1' `v2', ///
generate(`v1'_`v2') window(10) force
}
}
local j = 0
}
describe
我已经将元组添加到我的曲目中,而且,原始的嵌套循环方法可以按照以下示例的思路进行简化。
local vars a b c
local n : word count `vars'
forvalues i=1/`n' {
forvalues j=`i'/`n' {
local v1 : word `i' of `vars'
local v2 : word `j' of `vars'
display "`i' `v1' `j' `v2'"
}
}