在模型矩阵中缺失R级别

3
我将尝试将一个包含分类变量的数据框转换成模型矩阵,但是我会失去一些变量的级别。以下是我的代码:
df1 <- data.frame(id = 1:200, y =rbinom(200, 1, .5),  var1 = factor(rep(c('abc','def','ghi','jkl'),50)))
df1$var2 <- factor(rep(c('ab c','ghi','jkl','def'),50))
df1$var3 <- factor(rep(c('abc','ghi','nop','xyz'),50))

df1$var2 <- as.character(df1$var2)
df1$var2 <- gsub('\\s','',df1$var2)
df1$var2 <- factor(df1$var2)
sapply(df1, levels)

mm1 <- model.matrix(~ 0+.,df1)
head(mm1)

有什么建议吗?这是矩阵不可逆的问题吗?


这是一个表征问题。在R中的矩阵并不保留其输入数据的属性,而这恰好是因子存储其字符值的地方。 - IRTFM
我应该补充一下,如果你正在从因子创建模型矩阵,那么你应该看到列数的扩展,这些列数应该正确地表示各个因子水平。在您的情况下,这意味着对于var2,“abc”级别将与var3中的“abc”级别分开考虑。除了参照水平之外的每个水平都会获得自己的1和0的列。 - IRTFM
1个回答

6

模型矩阵完全正确。对于因子,模型矩阵中的列数比因子数少一列:这个信息已经包含在 (Intercept) 列中了。你之所以缺少这一列是因为在模型术语中指定了 +0。请尝试以下内容:

mm2 <- model.matrix(~., df1)
head(mm2)

现在你将看到(Intercept)列,它编码了“default”信息,并且列名中还缺少var1的第一级。 (Intercept)表示您观察到的“参考水平”,即每个分类属性的第一级的组合。与此参考水平的任何偏差都编码在var*???列中,并且由于您的模型假定这些列之间没有交互作用,因此您会获得(4-1)*3个var*???列以及(Intercept)列(在初始模型矩阵中被var1abc替换)。
不幸的是我缺乏准确的术语来描述这一点。有人可以帮帮我吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接