确定模型公式是否只有截距的最简单方法

Easiest way to determine if a model formula only has an intercept

在 R 公式语法中,有时用户会指定一个非常简单的模型,它只有一个截距,例如

fit = lm(Response ~ 1, data)

这些模型允许相对于更复杂的模型进行简化,例如lm(Response ~ A + B + A:B, ...) 并且我希望有一种简单的方法来检测等式的 RHS 何时仅包含 1 而没有其他项。文本操作似乎是可能的,但是有没有其他方法可以使用 R formula class 或其他方法来做到这一点?

最直接的方法是

names(coef(fit))

如果这只显示“(Intercept)”,那你就知道了。


另一种方法是检查 "terms" 对象。其实这是lm独立的。您创建一个公式:

f <- Response ~ 1

然后 terms(f) 创建 "terms" 对象。后来lmObject继承了这个

退房

attr(terms(fit), "intercept")
## to use formula only without actually fitting a model, do
## attr(terms(f), "intercept")

如果这是1,那么你有截距;如果为 0,则您没有。

现在,查看

length(attr(terms(fit), "term.labels"))
## to use formula only without actually fitting a model, do
## attr(terms(f), "terms.labels")

如果大于0,则有其他协变量;如果为 0,宾果。

带有 terms 的答案可能是规范答案,但您也可以使用子集来删除公式的 LHS 并针对 ~1:

进行测试
fit = lm(Response ~ 1, data=data.frame(Response=1:10))
identical(formula(fit)[-2],~1)
  • 这假设一个双面公式
  • 要理解子集,需要知道双面公式被当作二元运算存储为(~,Response,1)的解析树:第一个元素是运算符,第二个元素是第一个参数(LHS),右边的元素是第二个参数(RHS)。 [-2]去掉第二个元素,使公式变成单面公式。

@G.Grothendieck 在评论中提供了一个稍微不那么老套的变体(不需要知道或理解公式对象的内部结构),使用 update 用 0 覆盖响应变量:

identical(update(formula(fit), 0 ~ .), 0 ~ 1)