滚动期间的成对相关性忽略双重计算

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'"
        }
    }