在 R 中显示因子水平和标签
Displaying of factor levels and labels in R
我在使用 MICE 后显示因子变量的正确分组时遇到问题。我相信这是一个 R 的东西,但为了确定,我将它包含在鼠标中。
所以,我 运行 我的鼠标算法,这是我如何在鼠标算法中格式化它的片段。请注意,我希望它为 0 表示没有药物,1 表示有药物,所以我在 运行 it
之前强制它成为水平 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 的幕后实际发生了什么?
谢谢
0 和 1 是关卡的名称。 names对应的底层整数是1和2,可以用str
,
看
str(drug)
# Factor w/ 2 levels "0","1": 2 2 2 2 2 2 1 1 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)
这就是 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))
我在使用 MICE 后显示因子变量的正确分组时遇到问题。我相信这是一个 R 的东西,但为了确定,我将它包含在鼠标中。
所以,我 运行 我的鼠标算法,这是我如何在鼠标算法中格式化它的片段。请注意,我希望它为 0 表示没有药物,1 表示有药物,所以我在 运行 it
之前强制它成为水平 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 的幕后实际发生了什么?
谢谢
0 和 1 是关卡的名称。 names对应的底层整数是1和2,可以用str
,
str(drug)
# Factor w/ 2 levels "0","1": 2 2 2 2 2 2 1 1 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)
这就是 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))