R矢量的重复数学方程

时间:2013-10-26 19:54:09

标签: r time-series

我的矢量看起来像这样:

> y
 [1] 6.7 5.3 3.3 6.7 3.3 4.7 4.7 6.7 3.3 6.7

我试图使用以下公式计算时移h = 3时的估计自协方差:

enter image description here

这就是我所做的,我想知道有一种简单的方法可以做到比硬编码:

> 1/10 * (
+     (y[4] - mean(y))*(y[1] - mean(y)) + 
+     (y[5] - mean(y))*(y[2] - mean(y)) + 
+     (y[6] - mean(y))*(y[3] - mean(y)) + 
+     (y[7] - mean(y))*(y[4] - mean(y)) + 
+     (y[8] - mean(y))*(y[5] - mean(y)) + 
+     (y[9] - mean(y))*(y[6] - mean(y)) + 
+     (y[10] - mean(y))*(y[7] - mean(y))
+ )
[1] -0.04848

4 个答案:

答案 0 :(得分:4)

您可以像这样定义自己的函数:

my.cov <- function(y,h){
  y.bar <- mean(y)
  T <- length(y)
  (1/T) * sum((y[(h+1):T] - y.bar) * (y[1:(T-h)] -y.bar))
}
#Checking the function
> y <- c(6.7, 5.3, 3.3, 6.7, 3.3, 4.7, 4.7, 6.7, 3.3, 6.7)
> my.cov(y, h=3)
[1] -0.04848

请注意,由于for是向量化运算符,因此不涉及*循环。

答案 1 :(得分:3)

我会做这个矢量化而不是使用循环。更快更清洁:

> y <- c(6.7,5.3,3.3,6.7,3.3,4.7,4.7,6.7,3.3,6.7)
> t <- 1:7
> (1/10)*sum((y[t+3]-mean(y))*(y[t]-mean(y)))
[1] -0.04848

把它变成一个函数是微不足道的......

foo <- function(x,lag) {
    n <- length(x)
    i <- 1:(n-lag)
    (1/n) * sum( (y[ i + lag ] - mean(y) ) *( y[ i ] - mean(y) ) )
    }

foo( y , 3 )
# [1] -0.04848

答案 2 :(得分:2)

这是一种功能性和矢量化的方法:

autocov <- function(x, lag = 3)
  sum((tail(x, -lag) - mean(x)) *
      (head(x, -lag) - mean(x))) / length(x)

x <- c(6.7, 5.3, 3.3, 6.7, 3.3, 4.7, 4.7, 6.7, 3.3, 6.7)
autocov(x)
# [1] -0.04848
autocov(c(1:3, 1:3))
# [1] 0.33333333

最后一个例子是告诉你我如何怀疑你的自协方差公式是错误的。我原以为:

autocov <- function(x, lag = 3) cov(tail(x, -lag), tail(x, -lag))

autocov(c(1:3, 1:3))
# [1] 1

(即,每个信号应该有自己的均值,使用你的例子,缩放比例应为1/7。)

答案 3 :(得分:0)

为什么不在acf包中使用自协方差函数stats

BTW:当你处理时间序列时,我建议使用时间序列对象而不是普通向量。我更喜欢包zoo

library(zoo)
test_zoo=zoo(c(6.7,5.3,3.3,6.7,3.3,4.7,4.7,6.7,3.3,6.7),1:10)
acf(test_zoo,type="covariance",lag.max=3,plot=FALSE)[3]

#Autocovariances of series ‘test_zoo’, by lag
#      3 
#-0.0485