R中的相对方差(Vectorised implementation)

时间:2018-05-02 10:13:34

标签: r loops vectorization

假设我在r中有一个(n×m)矩阵。这是一个可重复的例子。

values <- matrix(rexp(440, rate=.1), ncol=44)

我想计算下面这些相对方差。基本上我想计算这个

enter image description here

这应返回(1 x m)矩阵。第一列中的单个计算就是这样的。

sum((values[10,9] / values[9,9])^2 / length(values[,1]))

我试图将其循环为,

  for (i in 2 : length(values)) {
    values_new <- sum((values[i,i-1] / values[i-1,i-1])) ^ 2 / 10
  }

我不确定如何使用循环或矢量化实现。感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

简单地说:

colMeans((values[-1, ] / values[-nrow(values), ]) ^ 2)

R中的矩阵操作/操作是完全矢量化的。

上面的代码会将所有值(除了第一行除外)除以所有值(最后一行除外),将所有值置于2的幂,然后计算结果列的均值(注意,因为我们得到了{{每列1}}行,我们可以简单地计算列的含义。)

答案 1 :(得分:1)

您可能希望每列尝试一个矢量化版本,并使用apply来遍历所有列。这是一个例子:

apply(values, 2, function(x){
  z <- x[2:length(x)]
  g <- x[1:(length(x)-1)]
  return(sum((z/g)^2)/(length(x)-1))
})

说明:

z与没有第一个元素的x相同 g与没有最后一个元素的x相同

z/g[1]x[2]/x[1]相同,依此类推。换句话说,第一列:

sum((values[2:10,1]/values[1:9,1])^2)/(length(values[,1])-1)

apply逐列遍历矩阵(因为第二个参数MARGIN设置为2)并执行一个函数。这里执行的功能是匿名的(在适当的位置定义)。