【发布时间】: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))) 但这有点笨重。有没有更精简的方法来做到这一点?
-
我有点犹豫是否要建议你如何做你正在做的事情,因为我不确定你以后打算做什么。