我的矢量看起来像这样:
> y
[1] 6.7 5.3 3.3 6.7 3.3 4.7 4.7 6.7 3.3 6.7
我试图使用以下公式计算时移h = 3
时的估计自协方差:
这就是我所做的,我想知道有一种简单的方法可以做到比硬编码:
> 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
答案 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