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

问题描述

对于我的一个项目,我需要使用加权效果编码,但我需要一个数据集,该数据集包含由 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 (将#修改为@)