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

时间:2016-12-22 21:42:21

标签: r regression formula linear-regression lm

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

fit = lm(Response ~ 1, data)

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

2 个答案:

答案 0 :(得分:7)

最直接的方法是

names(coef(fit))

如果这只显示"(拦截)",那么你知道。

另一种方法是检查"术语"宾语。实际上,这是lm独立的。您创建了一个公式:

f <- Response ~ 1

然后terms(f)创建&#34;术语&#34;宾语。之后,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,宾果。

答案 1 :(得分:6)

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)