首页 > 解决方案 > 是否可以在 R 中使用向量数学进行涉及区间的求和?

问题描述

标题有点粗糙,欢迎提出改进建议。

我正在尝试计算 500 长度向量的时间平均协方差。

这是我们使用的方程

我希望的结果是一个向量,其中 k 的条目从 0 到 500(0 只是整个集合的方差)。

我从这样的事情开始,但我知道我还需要在第一个均值比较中引用差距 (i):

x <- rnorm(500)
xMean <-mean(x)
i <- seq(1, 500)

dfGam <- data.frame(i)

dfGam$gamma <- (1/(500-dfGam$i))*(sum((x-xMean)*(x[-dfGam$i]-xMean)))

是否可以使用矢量数学来做到这一点,还是我需要使用某种for循环?

for是我为解决方案提出的循环:

gamma_func <- function(input_vec) {
  output_vec <- c()
  input_mean <- mean(input_vec)
  iter <- seq(1, length(input_vec)-1)
  for(val in iter){
    iter2 <- seq((val+1), length(input_vec))
    gamma_sum <- 0
    for(val2 in iter2){

      gamma_sum <- gamma_sum + (input_vec[val2]-input_mean)*(input_vec[val2-val]-input_mean)
    }
    output_vec[val] <- (1/length(iter2))*gamma_sum
  }

  return(output_vec)
}

谢谢

标签: rtime-series

解决方案


使用data.table, 主要用于生成shiftx_{t - k} 的函数,您可以这样做:

library(data.table)

gammabar <- function(k, x){
  xbar <- mean(x)
  n <- length(x)
  df <- data.table(xt = x, xtk = shift(x, k))[!is.na(xtk)]
  df[, sum((xt - xbar)*(xtk - xbar))/n]
}

gammabar(k = 10, x)
# [1] -0.1553118

过滤器[!is.na(xtk)]在 t = k + 1 处开始求和,因为 xtk 对于前 k 个索引将是 NA,因为移动了 k。

可重现x

x <- c(0.376972124936433, 0.301548373935665, -1.0980231706536, -1.13040590360378, 
-2.79653431987176, 0.720573498411587, 0.93912102300901, -0.229377746707471, 
1.75913134696347, 0.117366786802848, -0.853122822287008, 0.909259181618213, 
1.19637295955276, -0.371583903741348, -0.123260233287436, 1.80004311672545, 
1.70399587729432, -3.03876460529759, -2.28897494991878, 0.0583034949929225, 
2.17436525195634, 1.09818265352131, 0.318220322390854, -0.0731475581637693, 
0.834268741278827, 0.198750636733429, 1.29784138432631, 0.936718306241348, 
-0.147433193833294, 0.110431994640128, -0.812504663900505, -0.743702167768748, 
1.09534507180741, 2.43537370755095, 0.38811846676708, 0.290627670295127, 
-0.285598287083935, 0.0760147178373681, -0.560298603759627, 0.447188372143361, 
0.908501134499943, -0.505059597708343, -0.301004012157305, -0.726035976548133, 
-1.18007702699501, 0.253074712637114, -0.370711296884049, 0.0221795637601637, 
0.660044122429767, 0.48879363533552)

推荐阅读