关于定义因子变量的一些混淆

Some confusion regarding defining factor variables

在 R 中定义因子变量时,到目前为止我都是这样定义它们的:

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

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

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

我是否必须将一个因子变量明确定义为一个因子变量,或者只需要一个由 1 和 0 组成的向量?

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

1.

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

这是另外两个(基本相同)。他们利用 FALSE/TRUE 被编码为整数 0/1 并将逻辑值强制转换为数字 class.

这一事实
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 不相等。

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, .bincode or findInterval这样的函数是有用的。

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"就会被赋值给最大值。手动分配因子水平可以完全控制结果。