为什么函数 sparse.model.matrix() 忽略了这些列?

Why the function sparse.model.matrix() ignored the columns?

有人可以帮帮我吗?我想为 XGBoost 预测准备数据,所以我需要编辑因子数据。我使用 sparse.model.matrix() 但是有一个问题。我不知道,为什么函数会忽略某些列。我会尽力解释。我有包含许多变量的数据集数据集,但现在这 3 个很重要:

但是当我使用 sparse.model.matrix() 时,我得到的矩阵只有 15 列,而不是预期的 6+6+5=17。有人可以给ma一个建议吗?

sp_matrix = sparse.model.matrix(Deadly ~ Tsunami.Event.Validity + Tsunami.Cause.Code + Total.Death.Description -1, data = datas)

str(sp_matrix)

Output:
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  ..@ i       : int [1:2510] 0 1 2 3 4 5 6 7 8 9 ...
  ..@ p       : int [1:16] 0 749 757 779 823 892 1495 2191 2239 2241 ...
  ..@ Dim     : int [1:2] 749 15
  ..@ Dimnames:List of 2
  .. ..$ : chr [1:749] "1" "2" "3" "4" ...
  .. ..$ : chr [1:15] "Tsunami.Event.Validity-1" "Tsunami.Event.Validity0" "Tsunami.Event.Validity1" "Tsunami.Event.Validity2" ...
  ..@ x       : num [1:2510] 1 1 1 1 1 1 1 1 1 1 ...
  ..@ factors : list()
  ..$ assign   : int [1:15] 0 1 1 1 1 1 2 2 2 2 ...
  ..$ contrasts:List of 3
  .. ..$ Tsunami.Event.Validity : chr "contr.treatment"
  .. ..$ Tsunami.Cause.Code     : chr "contr.treatment"
  .. ..$ Total.Death.Description: chr "contr.treatment"

此问题与 In R, for categorical data with N unique categories, why does sparse.model.matrix() not produce a one-hot encoding with N columns? 重复...但该问题从未得到回答。

this question explain how you could get the full model matrix you're looking for, but don't explain why you might not want to. (For what it's worth, unlike regular linear models regression trees are robust to multicollinearity 的答案,因此完整的模型矩阵在这种情况下实际上可以工作,但值得理解为什么 R 会为您提供它所提供的答案,以及为什么这不会损害您的预测准确性。 ..)

这是基于(加法)多个分类预测变量的线性模型工作方式(以及 R 构建模型矩阵的方式)的基本方式 属性。当您基于因子 f1, ..., fn 和水平数 n1, ..., nn 构建模型矩阵时,预测变量的数量是 1 + sum(ni-1),而不是 sum(ni)。让我们用一个稍微简单的例子看看它是如何工作的:

xx <- expand.grid(A=factor(1:2), B = factor(1:2), C = factor(1:2))
model.matrix(~A+B+C-1, xx)
  A1 A2 B2 C2
1  1  0  0  0
2  0  1  0  0
3  1  0  1  0
4  0  1  1  0
5  1  0  0  1
6  0  1  0  1
7  1  0  1  1
8  0  1  1  1

我们一共有 (1 + 3*(2-1) =) 4 个参数。 第一个参数 (A1) 描述了所有参数 (A=1B=1C=1) 基线水平的预期平均值。第二个参数描述了 A=1A=2 观察之间的预期 差异 (与其他因素无关)。参数 3 和 4(B2C2)描述了 B1B2 之间的类似差异。

您可能在想“但我想要 所有 水平的预测变量 所有 因素,例如

m <- do.call(cbind, lapply(xx, \(x) t(fac2sparse(x))))
dim(m)
## [1] 8 6

这具有预期的所有六列,而不仅仅是 4 列。但是如果您检查此矩阵,或调用 rankMatrix(m)caret::findLinearCombos(m),您会发现它是多重共线性的。在典型的 (fixed-effect) 加法线性模型中,您只能估计截距加上水平之间的 差异 ,而不是与每个水平相关的值。在回归树模型中,多重共线性会使您的计算效率稍低,并且会使有关变量重要性的结果令人困惑,但不应影响您的预测。