for循环中的尺寸不正确

时间:2015-12-18 09:44:47

标签: r dimensions

我现在两天都在努力解决问题而且我只是没有得到它。

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
}

循环应创建协方差矩阵的滚动窗口。这就是我需要Sigma移动4的原因.R是否理解k和l的for循环?

1 个答案:

答案 0 :(得分:2)

是的,R低于k和l的循环。

获取代码并添加oppening和closing {},我们得到:

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])

希望这有帮助。

编辑以回复评论:

这适用于向后看的滚动窗口(最多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])
}

从评论中我很清楚它应该是一个不断增长的窗口:

# 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])
}