将虚拟变量转化为权重

Posted

技术标签:

【中文标题】将虚拟变量转化为权重【英文标题】:Turn dummy variables into weights 【发布时间】:2021-08-12 14:27:09 【问题描述】:

我有一个虚拟变量表,其中值为 1 或 NA。我知道想为这些假人跨行创建一个统一的权重。这是我开始的数据集,它是 xts 格式:

           NESN ROG NOVN ZURN ABBN UBSG LONN
1989-12-01   1   NA   1   1    NA   1    NA
1990-01-01   1   NA   1   1    1    1    NA

然后我想拆分 1,使行的总和等于 1。结束数据集将如下所示:

            NESN ROG NOVN ZURN ABBN UBSG LONN
1989-12-01  0.25 NA  0.25 0.25 NA   0.25  NA
1990-01-01  0.2  NA  0.2  0.2  0.2  0.2   NA

因此,如果整行中有 5 只股票的虚拟值等于 1,则 1 将更改为 0.2。如果有 4 只股票,它将更改为 0.25,依此类推。到目前为止,我正在考虑使用替换来用它们各自的重量替换 1。但是,我不知道如何在具有不同权重的多行上执行此操作。我这样做是为了最终计算投资组合周转率。

【问题讨论】:

感谢您的回答。然而,我最终使用 portsort 包构建了我的投资组合,其中投资组合周转功能已经内置以及其他有用的功能。 【参考方案1】:

您可以将数据框除以其行总和。

# data structure
df <- structure(list(NESN = c(1L, 1L), ROG = c(NA, NA), NOVN = c(1L, 
1L), ZURN = c(1L, 1L), ABBN = c(NA, 1L), UBSG = c(1L, 1L), LONN = c(NA, 
NA)), class = "data.frame", row.names = c("1989-12-01", "1990-01-01"
))

# solution
df/rowSums(df, na.rm=T)
#           NESN ROG NOVN ZURN ABBN UBSG LONN
#1989-12-01 0.25  NA 0.25 0.25   NA 0.25   NA
#1990-01-01 0.20  NA 0.20 0.20  0.2 0.20   NA

【讨论】:

【参考方案2】:

您可以使用逐行应用和转置:

df <- data.frame(NESN = c(1,1), ROG = c(NA,NA), NOVN = c(1,1),
           ZURN = c(1,1), ABBN = c(NA,1), UBSG = c(1,1),
           LONN = c(NA,NA))

t(apply(df, 1, function(x)x/sum(x, na.rm = TRUE)))

     NESN ROG NOVN ZURN ABBN UBSG LONN
[1,] 0.25  NA 0.25 0.25   NA 0.25   NA
[2,] 0.20  NA 0.20 0.20  0.2 0.20   NA

【讨论】:

以上是关于将虚拟变量转化为权重的主要内容,如果未能解决你的问题,请参考以下文章

进制转化

matlab将字符串转化为变量的方法

R语言as.numeric函数将因子变量(factor)转化为数值变量(Numeric)

R语言将字符型(Character)变量转化为数值型(Numeric)

将PB中的枚举型转化数值型

将字符串转化为整数