for 循环中的维度不正确
Dimension in for loop not correct
我为一个问题苦苦挣扎了两天,就是不明白。
input <- H_t <- matrix(rep(0,2515), 2515, 4)
H_t[,1]=rnorm(2515)
H_t[,2]=rnorm(2515)
H_t[,3]=rnorm(2515)
H_t[,4]=rnorm(2515)
d=dim(H_t)
Sigma=matrix(0,d[1]*4,4)
for( i in 2:d[1])
for(k in seq(from=1, to=10057, by=4))
for(l in seq(from=4, to=10060, by=4))
{
Sigma[k:l ,1:4]=cov(H_t[1:i,1:4]) ##here is the problem of dimensions
}
循环应该创建协方差矩阵的滚动 window。这就是为什么我需要 Sigma 移动 4。R 是否理解 k 和 l 的 for 循环?
是的,R 理解 k 和 l 的循环。
获取您的代码并添加打开和关闭 {} 我们得到:
set.seed(101)
input <- H_t <- matrix(rep(0,2515), 2515, 4)
H_t[,1]=rnorm(2515)
H_t[,2]=rnorm(2515)
H_t[,3]=rnorm(2515)
H_t[,4]=rnorm(2515)
d=dim(H_t)
Sigma = matrix(0, d[1]*4, 4)
for(i in 2:d[1]){
# i <- 2
for(k in seq(from=1, to=10057, by=4)){
# k <- 1
for(l in seq(from=4, to=10060, by=4)){
# l <- 4
Sigma[k:l ,1:4] = cov(H_t[1:i,1:4]) ##here is the problem of dimensions
}
}
}
旁注:在示例中使用随机数生成器时,总是可以使用 set.seed()。
循环有效但导致以下错误:
number of items to replace is not a multiple of replacement length
据我了解你的代码你想逐步计算一个 4x4 cov 矩阵,对吗?
但是循环尝试使用保存这个 4x4
Sigma[k:l, ]
它适用于第一次迭代,即 k = 1 和 l = 4。但在下一次迭代中,l 取值 8,现在代码显示:
Sigma[1:8, ] = cov(H_t[1:i,1:4])
希望对您有所帮助。
编辑回复评论:
这适用于滚动 window 向后看(window 最多 4 个观察):
n <- 15
set.seed(101)
input <- H_t <- matrix(rep(0,n), n, 4)
H_t[,1] <- rnorm(n)
H_t[,2] <- rnorm(n)
H_t[,3] <- rnorm(n)
H_t[,4] <- rnorm(n)
d <- dim(H_t)
Sigma <- matrix(0, (n-1)*4, 4)
k <- seq(from=1, to=(n-1)*4 - 3, by=4)
length(k)
l <- seq(from=4, to=(n-1)*4, by=4)
length(l)
# start the rolling and calculate the cov backwards looking
for(i in 1:(n-1)){
present <- i + 1
past <- present - 3
if(past < 1) past <- 1
Sigma[k[i]:l[i], ] = cov(H_t[past:present, 1:4])
}
从评论中我现在很清楚它应该是一个增长 window:
# start the growing and calculate the cov backwards looking
for(i in 1:(n-1)){
present <- i + 1
Sigma[k[i]:l[i], ] = cov(H_t[1:present, 1:4])
}
我为一个问题苦苦挣扎了两天,就是不明白。
input <- H_t <- matrix(rep(0,2515), 2515, 4)
H_t[,1]=rnorm(2515)
H_t[,2]=rnorm(2515)
H_t[,3]=rnorm(2515)
H_t[,4]=rnorm(2515)
d=dim(H_t)
Sigma=matrix(0,d[1]*4,4)
for( i in 2:d[1])
for(k in seq(from=1, to=10057, by=4))
for(l in seq(from=4, to=10060, by=4))
{
Sigma[k:l ,1:4]=cov(H_t[1:i,1:4]) ##here is the problem of dimensions
}
循环应该创建协方差矩阵的滚动 window。这就是为什么我需要 Sigma 移动 4。R 是否理解 k 和 l 的 for 循环?
是的,R 理解 k 和 l 的循环。
获取您的代码并添加打开和关闭 {} 我们得到:
set.seed(101)
input <- H_t <- matrix(rep(0,2515), 2515, 4)
H_t[,1]=rnorm(2515)
H_t[,2]=rnorm(2515)
H_t[,3]=rnorm(2515)
H_t[,4]=rnorm(2515)
d=dim(H_t)
Sigma = matrix(0, d[1]*4, 4)
for(i in 2:d[1]){
# i <- 2
for(k in seq(from=1, to=10057, by=4)){
# k <- 1
for(l in seq(from=4, to=10060, by=4)){
# l <- 4
Sigma[k:l ,1:4] = cov(H_t[1:i,1:4]) ##here is the problem of dimensions
}
}
}
旁注:在示例中使用随机数生成器时,总是可以使用 set.seed()。
循环有效但导致以下错误:
number of items to replace is not a multiple of replacement length
据我了解你的代码你想逐步计算一个 4x4 cov 矩阵,对吗?
但是循环尝试使用保存这个 4x4
Sigma[k:l, ]
它适用于第一次迭代,即 k = 1 和 l = 4。但在下一次迭代中,l 取值 8,现在代码显示:
Sigma[1:8, ] = cov(H_t[1:i,1:4])
希望对您有所帮助。
编辑回复评论:
这适用于滚动 window 向后看(window 最多 4 个观察):
n <- 15
set.seed(101)
input <- H_t <- matrix(rep(0,n), n, 4)
H_t[,1] <- rnorm(n)
H_t[,2] <- rnorm(n)
H_t[,3] <- rnorm(n)
H_t[,4] <- rnorm(n)
d <- dim(H_t)
Sigma <- matrix(0, (n-1)*4, 4)
k <- seq(from=1, to=(n-1)*4 - 3, by=4)
length(k)
l <- seq(from=4, to=(n-1)*4, by=4)
length(l)
# start the rolling and calculate the cov backwards looking
for(i in 1:(n-1)){
present <- i + 1
past <- present - 3
if(past < 1) past <- 1
Sigma[k[i]:l[i], ] = cov(H_t[past:present, 1:4])
}
从评论中我现在很清楚它应该是一个增长 window:
# start the growing and calculate the cov backwards looking
for(i in 1:(n-1)){
present <- i + 1
Sigma[k[i]:l[i], ] = cov(H_t[1:present, 1:4])
}