【问题标题】:Easiest way to determine if a model formula only has an intercept确定模型公式是否只有截距的最简单方法
【发布时间】:2017-05-08 14:33:26
【问题描述】:

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

fit = lm(Response ~ 1, data)

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

【问题讨论】:

  • 问题对我来说似乎很清楚。

标签: r regression formula linear-regression lm


【解决方案1】:

最直接的方法是

names(coef(fit))

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


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

f <- Response ~ 1

然后terms(f) 创建“条款”对象。后来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,则宾果游戏。

【讨论】:

    【解决方案2】:

    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 在 cmets 中提供了一个稍微不那么 hacky 的变体(无需知道或理解公式对象的内部结构),使用 update 用 0 覆盖响应变量:

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

    【讨论】:

    • 我真的很喜欢这个,替代品是as.character(formula(Response ~ 1))[3] == "1",但我觉得你的更干净一些
    • 这是一个变体,它用 0 更新 LHS,然后将剩下的内容与 0 ~ 1 进行比较:identical(update(formula(fit), 0 ~ .), 0 ~ 1)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2017-03-01
    • 2019-05-09
    • 2010-11-06
    • 1970-01-01
    • 2020-03-07
    相关资源
    最近更新 更多