5

我正在尝试计算这两个向量之间的样本协方差。我定义了一个带有两个输入变量的函数。不知道对不对?我的样本协方差公式也不会运行。谁能帮我用R写出来?

  xv = c(1., 5.5, 7.8, 4.2, -2.7, -5.4, 8.9)
  yv = c(0.1, 1.5, 0.8, -4.2, 2.7, -9.4, -1.9)
  sampleCov= function(x,y){ 
    cov(xv,yv) = frac{sum_{i=1}^{n}(x_i-\mu_x)(y_i-\mu_y)}{n-1}].
    return (Cov(xv,yv)
  }
4

3 回答 3

6

R 中有一个基函数被调用cov,它完全符合您的要求,但如果您想编写一个函数(无需这样做),您可以尝试以下操作:

COV<- function(x,y) {
  if(length(x)!=length(y)) {stop('x must have the same length as y ')}
  x.bar <- mean(x)
  y.bar <- mean(y)
  N <- length(x)

  Cov <- (sum((x-x.bar)*(y-y.bar))) / (N-1)
  return(Cov)
}

COV(xv, yv)
[1] 8.697381

cov(xv, yv)
[1] 8.697381

如您所见COV,给出了相同的结果,cov因此您不必为此编写函数。

此外,您的函数主体没有 R 语法,而是您编写了不一样的 LaTex 语法。

于 2012-10-17T19:45:06.100 回答
5

只需使用内部cov()函数:

xv <- c(1., 5.5, 7.8, 4.2, -2.7, -5.4, 8.9)
yv <- c(0.1, 1.5, 0.8, -4.2, 2.7, -9.4, -1.9)
cov(xv, yv)

R> cov(xv, yv)
[1] 8.697381

如果你真的想重新发明轮子:

sampleCov <- function(x,y){
    stopifnot(identical(length(x), length(y)))
    sum((x - mean(x)) * (y - mean(y))) / (length(x) - 1)
}

R> sampleCov(xv, yv)
[1] 8.697381
于 2012-10-17T19:45:41.820 回答
0

我知道这很旧,但您可以使用以下公式计算两个矩阵的协方差:

  cov_xv_yv <- 1/(length(xv)-1) * t(xv) %*% yv

这是矩阵 xv 和矩阵 yv 的转置的矩阵乘积的 1/(N-1) 倍。

这种形式很容易扩展到许多维度。

于 2017-12-14T00:41:04.860 回答