我正在尝试计算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之间的相关性的两倍+对角线上的1s):
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
}
}
}
特别是(if
)上的j > i
条件旨在捕获每个成对相关的加倍计算,但未能这样做。在if
中加入mvcorr
条件只会产生错误消息'no observations'
。
这个问题的解决方案是什么?
答案 0 :(得分:0)
@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
答案 1 :(得分:0)
我已经将元组添加到我的保留曲目中,但是,原始的嵌套循环方法可以简化为以下示例的行。
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'"
}
}