【问题标题】:Consistent factor levels for same value over different datasets不同数据集上相同值的一致因子水平
【发布时间】:2016-06-06 08:24:13
【问题描述】:

我不确定我是否完全理解因子的工作原理。因此,如果我错了,请以易于理解的方式纠正我。

我一直认为,在进行回归时,R 在幕后将分类变量转换为整数,但这部分超出了我的思路。

它将使用训练集中的分类值,并在构建模型后,检查测试数据集中的相同分类值。无论潜在的“水平”是什么——对我来说都无关紧要。

但是,我一直在考虑更多......并且需要澄清 - 特别是如果我在如何解决它方面做错了。

     train= c("March","April","January","November","January")
     train=as.factor(train)
     str(train)
     Factor w/ 4 levels "April","January",..: 3 1 2 4 2

     test= c(c("March","April"))
     test=as.factor(test)
      str(test)
     # Factor w/ 2 levels "April","March",..:  1 2

问题

如果您看到以上内容,它会创建因子水平,我相信这就是每个月的名称。但是,级别不一定匹配。

例如,在测试中,“APRIL”在两者中都是“1”,但在火车中,“JANUARY”是 2,而“MARCH”在 2 日是 2。

如果我要将它合并到模型中,我认为我不会出错,因为测试集中的所有分类值都已经在训练集中......但是会使用适当的系数/值?

请帮助我很困惑

【问题讨论】:

    标签: r categorical-data factors


    【解决方案1】:

    当您使用as.factor 将向量转换/强制转换为因子时,R 会获取向量的所有唯一值并将数字 id 与每个值相关联;它还有一个默认的排序方法来决定哪个值得到 1、2 等。

    如果您有不同的向量存在于一个共同的“宇宙”值中,并且您希望将它们转换为一致的因子(即出现在不同向量/dfs 中的值与相同的数字 id 相关联),请执行以下操作:

    x <- letters[1:5]
    y <- letters[3:8]
    allvalues <- unique(union(x,y))  # superfluous but I think it adds clarity
    x <- factor(x, levels = allvalues)
    y <- factor(y, levels = allvalues)
    str(x)   # Factor w/ 8 levels "a","b","c","d",..: 1 2 3 4 5
    str(y)   # Factor w/ 8 levels "a","b","c","d",..: 3 4 5 6 7 8
    

    编辑

    一个小实验表明 R 足够聪明,可以识别不同向量中的因子值,即使它们被分配了不一致的数字 id:

    y <- sample(1:2, size = 20, replace = T)
    x <- factor(letters[y], levels = c("b","a"))  # so a~2 and b~1
    y <- y + rnorm(0, 0.2, n = 20)
    Set <- data.frame(x = x, y = y)
    fit <- lm(data = Set, y ~ x)
    

    要获取所有内容的描述:str(x)str(y)summary(fit)

    因此,fit 被训练为将 x = a(作为一个因子的数字标签为 2)与值 y ~= 1y = b 与值 x ~= 2 相关联。

    现在让我们制作一个“令人困惑”的测试集:

    x2 <- factor(c("a","b"), levels = c("c","d","a","b"))
    str(x2)   # Factor w/ 4 levels "c","d","a","b": 3 4
    

    让我们使用predict 来看看 R 是怎么做的:

    predict(fit, newdata = data.frame(x = x2))
    #        1        2 
    # 1.060569 1.961109 
    

    这是我们对 R 的期望...

    【讨论】:

    • 感谢您的快速响应。这是非常有用的方法。但是,我假设是的,确实,当您在每个值中都有“共同的宇宙”时,虽然代码可能没有错误地工作,但在回归中会使用不适当的因子系数?当测试集只是训练集中因子的一个子集时,可能会出现这种情况,可能具有不同的字母数字排序顺序(我上面的示例)。
    • 什么叫“不合适的因子系数”?如果您的因子变量用作回归中的输入变量,则无论如何都不会使用与每个因子值相关的数字 id,R 只会创建虚拟变量(例如,如果 X = c("a", "b", "c" , "d"), R 选择一个基值,例如 "a",并创建(不告诉你)变量 X-is-b = (0,1,0,0), X-is- c = (0,0,1,0) 和 X-is-d = (0,0,0,1) 并将它们用作回归的输入)。
    • 我的例子中的意思是,在“测试”部分 March==2 和“火车”部分 March==3
    • 好吧,如果您担心这一点,只需强制您的训练和测试集中的因素使用通用级别参数。如果您必须在获取测试集之前训练您的模型,只需强制测试集变量使用训练集变量的级别作为预处理步骤(在测试中但不在训练中的值将转换为 NA)。
    • 我个人会使用table(x)table(y) 而不是上面的str(x) 等recco,因为您看不到完整列表,并且表名按相同的值排序。
    猜你喜欢
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多