首页 > 解决方案 > 关于定义因子变量的一些混淆

问题描述

在 RI 中定义因子变量时,到目前为止已将它们定义为:

q5_data$high <- ifelse(q5_data$totexp >median(q5_data$totexp),1,0)

但是我注意到人们使用诸如:

factor(directions, levels= c("North", "East", "South", "West"))

我是否必须将因子变量显式定义为因子变量,或者仅使用 1 和 0 的向量?

标签: rregressiondata-sciencedummy-variable

解决方案


这个问题实际上是两个问题。

1.

在 R 中,很少需要创建虚拟变量(如果有的话)。R 的建模功能会自动处理这些问题。但是,如果您想将数字变量二分,在问题的示例中将其设为低于或高于中位数的值,ifelse这只是其中一种方法。

这是另外两个(基本上相同的方式)。他们利用FALSE/TRUE编码为整数的事实0/1并将逻辑值强制转换为数字类。

set.seed(2021)
x <- runif(10, 0, 100)

y <- ifelse(x > median(x), 1, 0)
z <- as.integer(x > median(x))
identical(y, z)
#[1] FALSE

结果是FALSE因为尽管值相等,但对象的类却不相等。

class(y)
#[1] "numeric"
class(z)
#[1] "integer"

除非需要结果,否则解决方案不会关心这identical一点。

z2 <- as.numeric(x > median(x))
identical(y, z2)
#[1] TRUE

要了解为什么这可能不需要,回归函数将自己调用它,运行以下命令。输出省略。

model.matrix(~ x > median(x))

2.

另一个问题是对数据进行分箱。如果您想从数值变量中创建小、中和大的因子,可以使用 或 之类cut的函数.bincodefindInterval

i <- findInterval(x, c(0, 33.33, 66.67, Inf))
levels <- c("Small", "Medium", "Large")
f <- factor(levels[i], levels = levels)

f
# [1] Medium Large  Large  Medium Medium Large  Medium Small  Large 
#[10] Large 
#Levels: Small Medium Large

为什么我要明确设置因子水平?因为 R 将默认为字典顺序,并且"Large"是第一个,然后"Medium""Small"将被分配给最大值。手动分配因子水平可以完全控制结果。


推荐阅读