【问题标题】:Displaying of factor levels and labels in R在 R 中显示因子水平和标签
【发布时间】:2015-08-12 16:45:08
【问题描述】:

我在使用 MICE 后显示因子变量的正确分组时遇到问题。我相信这是 R 的东西,但为了确定,我将它包含在鼠标中。

所以,我运行我的鼠标算法,这里是我如何调用我在鼠标算法中格式化它的一个片段。请注意,我希望它为 0 表示没有药物,1 表示有药物,所以我在运行它之前强制它成为 0 和 1 级别的因子

mydat$drug=factor(mydat$drug,levels=c(0,1),labels=c(0,1))

然后我运行小鼠,它对药物以及要估算的其他变量进行逻辑回归(这是默认设置)。

当一个插补完成时,我可以提取其结果

drug=complete(imp,1)$drug

我们可以查看

> head(drug)
[1] 0 0 1 0 1 1
attr(,"contrasts")
  2
0 0
1 1
Levels: 0 1

所以数据肯定是0,1。

但是,当我用它做一些事情时,比如 cbind,它会变成 1's 和 2's

> head(cbind(drug))
 drug
[1,]    1
[2,]    1
[3,]    2
[4,]    1
[5,]    2
[6,]    2

即使我将其强制为数字

> head(as.numeric(drug))
[1] 1 1 2 1 2 2

我想说它与对比有关,但是当我通过这样做删除对比时

attr(drug,"contrasts")=NULL

当被其他人调用和打印时,它仍然显示为 1 和 2。

我可以通过使用 I() 让它正确打印

> head(I(drug))
[1] 0 0 1 0 1 1
Levels: 0 1

所以,我认为这是一个 R 问题,但我不知道如何解决它。使用 I() 是正确的解决方案,还是只是在这里起作用的一种解决方法?使输出显示为 1 和 2 的幕后实际发生了什么?

谢谢

【问题讨论】:

  • cbind 正在返回一个不存储因子的矩阵(它只会存储字符串和数字)。在转换为矩阵时,您的因子由它们的数字编码表示,而不是由字符标签表示。所有因子都存储为整数,其中第一个级别为 1,后续级别被适当编号。补救它的最佳选择是避免将因子存储到矩阵中。
  • 实际上,head(cbind(I(drug))) 仍然会产生 1 和 2,所以这一定不是正确的解决方案。
  • 但您仍在使用cbind,它正在拼命尝试返回一个矩阵。而且您不能将因子存储在矩阵中。您应该考虑不涉及cbind 的解决方案。
  • @Benjamin 我明白你的意思所以,这似乎有效.... as.numeric(cbind(as.character(drug))) 但这有点笨重。有没有更精简的方法来做到这一点?
  • 我有点犹豫是否要建议你如何做你正在做的事情,因为我不确定你以后打算做什么。

标签: r r-mice


【解决方案1】:

因子从内部用 1 表示的第一级开始。

你的两个选择:

1) 调整基于 1 的级别索引:

as.numeric(drug) - 1

2) 取因子的标签并转换为数值:

as.numeric(as.character(drug))

有些人会向您指出执行相同操作的更快选项的方向:

as.numeric(levels(drug))[drug]

我也会首先考虑使用logical 值而不是factor

mydat$drug = as.logical(mydat$drug) 

【讨论】:

    【解决方案2】:

    0 和 1 是关卡的名称。名称对应的底层整数是1和2。可以用str查看,

    str(drug)
    # Factor w/ 2 levels "0","1": 2 2 2 2 2 2 1 1 2 2
    

    当您将因子强制转换为数字时,您会删除名称并获取整数表示。

    【讨论】:

      【解决方案3】:

      这就是 R 编码因子的方式。因子的基本数字表示始终以 1 开头。您可以通过以下示例看到:

      as.numeric(factor(c(0,1)))
      as.numeric(factor(c(A,B)))
      

      不确定 MICE 工作原理的具体细节,但如果它需要一个因子而不是简单的 0/1 数值变量来使用逻辑回归,您总是可以通过以下方式破解结果:

      as.numeric(as.character(factor(c(0,1)))) 
      

      或在您的特定情况下

      drug <- as.numeric(as.character(drug))
      

      【讨论】:

      • R 中是否有一个设置允许您从 0 而不是 1 开始您的因子表示?
      • 我认为这些 hack-y 方法不像我描述的或@Senor O 提到的
      猜你喜欢
      • 2014-09-11
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多