在R公式语法中,用户偶尔会指定一个只有截距的非常简单的模型,例如
fit = lm(Response ~ 1, data)
这些模型允许相对于更复杂的模型进行简化,例如lm(Response ~ A + B + A:B, ...)
我希望有一种简单的方法来检测等式的RHS何时只包含1
而不包含其他术语。文本操作似乎是可行的,但有没有其他方法可以使用R formula
类或其他方法来完成此操作?
答案 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)