【发布时间】: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