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

Matrix of booleans based on quantile in R

我有一个矩阵,其列为股票 returns,其行为日期,如下所示:

              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

我想要一个函数 returns 一个具有相同列名和行名的矩阵,根据每个行向量中的每个观察值是否属于 1 和 0 来填充两个给定分位数内的某个组。

例如,我可能想将每个行向量分成 3 组,并为属于第二组的所有观察值设置 1,在其他位置设置 0。结果看起来像:

           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 只是视觉结果,数字并不准确)

哪种方法最不冗长?

我们可以使用 applyMARGIN=1 循环遍历行,cut 每个 row 向量 breaksquantile, 转置输出得到一个输出。

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

无需采取中间步骤来查找分位数并针对它们进行测试。只有每个向量的序数属性才重要。

# 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