【问题标题】:Relative variance (Vectorised implemantation) in RR中的相对方差(矢量化实现)
【发布时间】:2018-10-12 09:57:36
【问题描述】:

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

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

我想计算以下这些的相对方差。本质上我想计算这个

这应该返回一个(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
  }

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

【问题讨论】:

  • 你链接的图片是空白的
  • 在你的 for 循环中:length(values) 在你的情况下是 440。

标签: r loops vectorization


【解决方案1】:

简单地做:

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

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

上面的代码会将所有值(第一行除外)除以所有值(最后一行除外),将所有值都以 2 的幂次方计算,然后计算得到的列均值(注意,因为我们得到了 @987654322 @ 每列的行数,我们可以简单地计算列均值)。

【讨论】:

    【解决方案2】:

    您可能想尝试每列的矢量化版本并使用 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)并执行一个函数。这里执行的函数是匿名的(就地定义)。

    【讨论】:

    • 不错。这是使用apply() 函数的一个很好的例子。
    • stochastiker 一定要检查@David Arenburg 的答案,它更快、更紧凑。
    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多