r 2个矩阵的条件标准差

时间:2013-08-14 15:09:46

标签: r conditional standard-deviation

我试图根据矩阵A的值计算矩阵B(对于每一列)的条件标准差。

#conditional function
foo<-function(x,y)
{
  out<-sd(y[abs(x)==1])
  return(out)
}

#create the matrix
A<-matrix(data=c(1,-1,0,1,0,0,0,0,1,1),nrow=5,ncol=2)
B<-matrix(data=c(3,4,5,6,7,8,9,10,11,12),nrow=5,ncol=2)

#run for the first column
foo(A[,1],B[,1])

#run for both columns
apply(X=A, MARGIN=2, FUN=function(x,y) foo(x,y), y=B)

正确的答案是1.53和0.707,当我直接为每一列直接运行foo时,我得到了。

但是,当我尝试使用apply运行两个列时,我得到此结果3.06 2.94。

任何想法如何更改应用以使其工作因为我有一个大的资产矩阵(在xts对象中)。目前,我正在使用for循环,但我相信它可以通过更有效的方式完成。

提前谢谢你,

尼科斯

1 个答案:

答案 0 :(得分:4)

您的方法存在的问题是,您尝试将矩阵(B)传递给函数foo,该函数需要两个向量(x和{{1} })。

你可以尝试这样的事情:

y

这基本上只是一个循环...

另一种方法是,如果您的sapply(1:ncol(A), function(i) sd(B[as.logical(abs(A[,i])),i])) [1] 1.5275252 0.7071068 A对象是数据框,则可以使用B

mapply

对这两种方法进行基准测试,A <- as.data.frame(A) B <- as.data.frame(B) mapply(foo, A,B) V1 V2 1.5275252 0.7071068 路线的速度可能是原来的两倍。我可以想象这是因为sapply只是将整数向量作为参数和处理矩阵,而sapply方法将数据帧作为参数(数据帧比矩阵慢,并且传递循环的信息更多)而不只是一个索引值)。详细说明:

mapply