R 不同数据集上相同值的一致因子水平

R 不同数据集上相同值的一致因子水平,r,categorical-data,factors,R,Categorical Data,Factors,我不确定我是否完全理解这些因素是如何工作的。所以,如果我错了,请用一种简单易懂的方式纠正我 我一直认为,当做回归或其他什么的时候,R在幕后将分类变量协调成整数,但这部分超出了我的思路 它将在训练集中使用分类值,并在构建模型后,在测试数据集中检查相同的分类值。无论潜在的“水平”是什么,对我来说都无关紧要 然而,我一直在想更多。。。并且需要澄清——特别是如果我在如何解决问题上做错了 train= c("March","April","January","November","January

我不确定我是否完全理解这些因素是如何工作的。所以,如果我错了,请用一种简单易懂的方式纠正我

我一直认为,当做回归或其他什么的时候,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
问题 如果你看到上面,它创造了因子水平,我相信这就是每个月的要求。然而,这些水平并不一定匹配

例如,在测试中,两者的“四月”都是“1”,但在火车中,“一月”是2,而“三月”是2

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


请帮助我,我很困惑

当您使用
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
让我们使用
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如果你关心这个问题,只需强制你的训练和测试集中的因子使用一个公共级别参数。如果你必须在得到测试集之前训练你的模型,只需强制测试集变量使用训练集变量的级别作为参数一个预处理步骤(正在测试但不在训练中的值将转换为NAs)。我个人会在上面的
str(x)
等记录上使用
table(x)
table(y)
,因为你看不到完整的列表,并且表名按相同的值排序。
x2 <- factor(c("a","b"), levels = c("c","d","a","b"))
str(x2)   # Factor w/ 4 levels "c","d","a","b": 3 4
predict(fit, newdata = data.frame(x = x2))
#        1        2 
# 1.060569 1.961109