我正在尝试计算这两个向量之间的样本协方差。我用两个输入变量定义了一个函数。我不知道它是否正确?我的样本协方差公式也不会运行。任何人都可以帮我把它写在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)
}
答案 0 :(得分: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
答案 1 :(得分:4)
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语法。
答案 2 :(得分:0)
我知道这是旧的,但您可以使用以下公式计算两个矩阵的协方差:
cov_xv_yv <- 1/(length(xv)-1) * t(xv) %*% yv
这是矩阵xv转置和矩阵yv的矩阵乘积的1 /(N-1)倍。
此表格可以轻松扩展到多个维度。