基于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 只是视觉结果,数字并不准确)
哪种方法最不冗长?
我们可以使用 apply
和 MARGIN=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))}))
无需采取中间步骤来查找分位数并针对它们进行测试。只有每个向量的序数属性才重要。
# 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
我有一个矩阵,其列为股票 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 只是视觉结果,数字并不准确)
哪种方法最不冗长?
我们可以使用 apply
和 MARGIN=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))}))
无需采取中间步骤来查找分位数并针对它们进行测试。只有每个向量的序数属性才重要。
# 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