如何使用 model.matrix 只产生截距?

How to produce just the intercept using model.matrix?

函数stats::model.matrix可用于将输入数据框转换为适用于求解回归方程等原始代数操作的矩阵。例如:

set.seed(0)
df <- data.frame(a = rnorm(5), n = rnorm(5))
model.matrix(~., data = df)

产生:

  (Intercept)          a            n
1           1  1.2629543 -1.539950042
2           1 -0.3262334 -0.928567035
3           1  1.3297993 -0.294720447
4           1  1.2724293 -0.005767173
5           1  0.4146414  2.404653389

其中一个功能是它控制如何将截距添加到设计矩阵。比较:model.matrix(~ 0 + ., data = df)model.matrix(~ 1 + ., data = df)

现在,公式中的.指定应包括df的所有变量。当我希望传递一个空数据框并因此只创建截距时,这会导致问题,例如:

df <- data.frame(matrix(, nrow=5, ncol=0))
model.matrix(~  ., data = df)

导致:

Error in terms.formula(object, data = data) : 
  '.' in formula and no 'data' argument

有谁知道如何解决这个问题,具体来说,我想生成 model.matrix(~ 1, data = df) 给出的以下结果,除了使用 ..

你可以这样做:

model.matrix(as.formula(paste0("~", colnames(df), "+1", collapse="+")), data=df)

但是,我认为您最好使用 if 语句。我认为 R 中的公式比任何基础知识都更方便。