Можно ли использовать векторную математику в R для суммирования с интервалами? - PullRequest
1 голос
/ 22 января 2020

Заголовок немного грубый, открыт для предложений по улучшению.

Я пытаюсь вычислить средние по времени ковариации для вектора длины 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 l oop?

Вот for l oop, который я пришел за решение:

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

Спасибо

1 Ответ

0 голосов
/ 22 января 2020

Используя data.table, главным образом для функции shift, чтобы сделать x_ {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 будет NA для первых k индексов из-за смещения на 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)
...