确定模型公式是否只有截距的最简单方法
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)
在 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)