假设我在r中有一个(n×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
}
我不确定如何使用循环或矢量化实现。感谢您的帮助。
答案 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
)并执行一个函数。这里执行的功能是匿名的(在适当的位置定义)。