【问题标题】:How to produce just the intercept using model.matrix?如何使用 model.matrix 只产生截距?
【发布时间】:2017-02-27 23:51:19
【问题描述】:

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) 给出的以下结果,除了使用.

【问题讨论】:

  • if (ncol(df) == 0) model.matrix(~ 1, data = df) else model.matrix(~ ., data = df)怎么样
  • 这很有帮助,目前我正在做,但是有没有更直接的方法可以在没有 if 语句的情况下将一些对象传递给 model.matrix。
  • 请问你为什么要传递一个空的data.frame?无中生有的公式很奇怪。最多您可以使用 1 列 data.frame 代替。考虑一下model.matrix(~1,data=data.frame(rep(1,10)))
  • 我有一个自定义的回归类,它接受数据框或矩阵作为协变量的输入。我想计算空模型作为基线,为此,能够传递一些触发对常数回归的“空”数据框对象是有意义的。正如@Gregor 所建议的,我可以在我的函数中使用 if 语句来检测差异,但是,我认为这应该在model.matrix 的级别上处理。

标签: r regression formula


【解决方案1】:

你可以这样做:

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

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

【讨论】:

  • 我喜欢您以编程方式从文本生成公式的想法。你能证明为什么你认为我最好使用 if 语句吗?
  • if 声明的意图非常明确。如果其他人阅读了代码(或者甚至是你几年后)并看到了if 语句,那么它的目的很明确,他们可能会猜到为什么不使用model.matrix(~ .)(0 列输入是一个特殊的案子)。使用这个公式,知道 R 但不知道这个奇怪优势的人可能会认为“这个公式应该只是 ~ .”,甚至可能会更改它,从而产生错误。
  • 我同意 Gregor 的观点,我认为使用 if 语句更清晰一些。要使用字符串并进行转换,基本上是 4 个嵌套函数调用。
  • 此外,您的项目现在似乎范围有限,但也许在某些时候您希望用户能够传入 formula 参数 - 也许 ~ . 是一个很好的默认值,但有人想让代码做~ .^2 或指定自定义公式。 if 声明并不引人注目,您只需将 else 更改为 formula 参数,它就可以轻松扩展。粘贴列名的方法,没那么多。
  • 谢谢,这些都是非常好的观点,尤其是在互动和其他方面。
猜你喜欢
  • 2019-03-31
  • 2015-11-13
  • 2017-09-13
  • 2019-09-28
  • 2016-12-14
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
相关资源
最近更新 更多