微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何根据因子变量的对比代码在数据中创建新列?

如何解决如何根据因子变量的对比代码在数据中创建新列?

对于我的一个项目,我需要使用加权效果编码,但我需要一个数据集,该数据集包含由 contr.X 函数创建的每个对比度的列。对于变量很少的小数据集,我可以手动执行此操作,但我的解决方案无法扩展到更大的数据集。

可重现的示例

下面的代码创建了一个简单的数据集,其中 group 作为我想在统计模型中用作预测变量的主要分类变量在这里,我将分组为一个因子,然后为因子的每个级别分配加权效果对比代码,从而产生对比矩阵。

library(tidyverse)
library(wec)

data <- data.frame(group = c(rep("A",20),rep("B",10),rep("C",5)),value = rnorm(35))

data$group.wec <- as.factor(data$group)
contrasts(data$group.wec) <- contr.wec(data$group.wec,omitted = "C") #using wec package to created weighted effects codes
contrasts(data$group.wec) #contrast matrix

虽然上述方法很有用,但我最终将需要一个数据框,该数据框为 contr.X 函数创建的每个对比都有新的列。以下是低效的手动解决方案:

data_with_contrasts <- data %>% #manually adding new columns with weighted effects contrast codes
  mutate(contrastA = case_when(
      group == 'A' ~ 1,group == 'B' ~ 0,group == 'C' ~ -4
  ),contrastB = case_when(
      group == 'A' ~ 0,group == 'B' ~ 1,group == 'C' ~ -2))

head(data_with_contrasts,35)

   group       value group.wec contrastA contrastB
1      A -0.42421138         A         1         0
2      A  1.00742122         A         1         0
3      A  0.17655497         A         1         0
4      A  1.22269727         A         1         0
5      A -0.99758085         A         1         0
6      A -0.48318298         A         1         0
7      A  0.69056372         A         1         0
8      A -0.04565234         A         1         0
9      A -1.58319022         A         1         0
10     A  0.36660913         A         1         0
11     A -0.06205922         A         1         0
12     A -0.30919663         A         1         0
13     A  1.47817140         A         1         0
14     A  0.05578368         A         1         0
15     A -1.30863169         A         1         0
16     A -1.08232020         A         1         0
17     A  0.26195884         A         1         0
18     A -0.18956560         A         1         0

是否有更好的方法将因子变量的对比度代码矩阵扩展为单独的列,如上例所示?理想情况下,该解决方案适用于具有不同级别数量的多个分类变量,并且不需要手动指定对比度代码

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。