R中因子水平和标签的显示

3
我在使用MICE后,显示因子变量的正确分组存在问题。我认为这是一个R语言问题,但我将其与MICE一起使用以确保它不是其他问题。
所以,我运行了MICE算法,以下是我如何调用和格式化它的片段。请注意,我希望它为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和2。

> 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,它试图绝望地返回一个矩阵。而且你不能将因子存储在矩阵中。你应该考虑不涉及cbind的解决方案。 - Benjamin
我明白你的意思所以,似乎这样会起作用....as.numeric(cbind(as.character(drug)))但这有点笨重。有更简洁的方法吗? - RayVelcoro
我有点犹豫给你建议,因为我不确定你之后打算做什么。 - Benjamin
现在,我只想按原样显示它。我认为以后可能会根据药物分解响应。我现在希望将其显示为0/1的原因是因为它最初是这样编码的,如果1既可以是药物又可以是非药物,那将会非常令人困惑。因此,我希望标准化它,使0始终表示无药物,1始终表示有药物。 - RayVelcoro
由于药物已经编码为0/1,您可能考虑一开始就不将其转换为因子。 - A. Webb
显示剩余3条评论
3个回答

2

0和1是指代您的级别的名称。与名称对应的基础整数是1和2。您可以通过str查看其内容。

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

当你强制将因子转换为数字时,你会丢失名称并得到整数表示。

2
因素从内部表示的第一级开始,编号为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) 

0

这是 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))

1
在R中是否有一种设置可以让你的因子表示从0开始而不是1? - RayVelcoro
我不认为像我描述的那些hack-y方法或@Senor O提到的方法是可行的。 - Carl Frederick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接