基于R中分位数的布尔矩阵

时间:2015-11-13 16:13:24

标签: r matrix quantile

我有一个矩阵,其列是股票回报,其行是日期,如下所示:

              ES1.Index    VG1.Index   TY1.Comdty    RX1.Comdty   GC1.Comdty
1999-01-05  0.009828476  0.012405717 -0.003058466 -0.0003480884 -0.001723317
1999-01-06  0.021310816  0.027030061  0.001883240  0.0017392317  0.002425398
1999-01-07 -0.001952962 -0.016130850 -0.002826191 -0.0011591516  0.013425435
1999-01-08  0.007989946 -0.004071275 -0.005913678  0.0016224363 -0.001363540

我希望有一个函数返回一个矩阵,该矩阵具有相同的列名和行名,根据每个行向量中的每个观察是否属于两个内的某个组而填充1和0给出分位数。

例如,我可能希望将每个行向量分成3组,并且对于属于第二组的所有观察值和其他地方的0都有1。结果看起来像:

           ES1.Index VG1.Index TY1.Comdty RX1.Comdty GC1.Comdty
1999-01-05         0         0          1          1          0
1999-01-06         1         0          0          1          0
1999-01-07         0         1          0          0          1
1999-01-08         0         0          1          0          1

(我的例子中的1和0只是视觉结果,数字不准确)

哪种方式最简单?

2 个答案:

答案 0 :(得分:1)

没有必要采取找到分位数的中间步骤并对其进行测试。只有每个向量的序数属性才重要。

# set bounds
lb = 1/3
ub = 2/3

# find ranks
p = t(apply(m,1,rank))/ncol(m)

# test ranks against bounds
+( p >= lb & p <= ub )


           ES1.Index VG1.Index TY1.Comdty RX1.Comdty GC1.Comdty
1999-01-05         0         0          0          1          1
1999-01-06         0         0          1          0          1
1999-01-07         1         0          1          0          0
1999-01-08         0         1          0          0          1

答案 1 :(得分:0)

我们可以applyMARGIN=1一起循环使用cut指定row的每个breaks向量行quantile,转置输出以获得输出。

t(apply(df1, 1, function(x) {
       x1 <- cut(x, breaks= quantile(x, seq(0, 1,1/3)))
       +(levels(x1)[2]== x1 & !is.na(x1))}))