2

次のようなベクトルがあります。

> 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
4

4 に答える 4

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ため、ループは含まれないことに注意してください。*

于 2013-10-26T20:01:02.313 に答える
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
于 2013-10-26T20:00:34.880 に答える
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 にする必要があります。)

于 2013-10-26T20:00:18.387 に答える