代码之家  ›  专栏  ›  技术社区  ›  joran

模型公式中“.”的含义与如何记录?公式

  •  4
  • joran  · 技术社区  · 11 月前

    In ?formula 它说:

    有两种特殊的解释。在一个公式中。通常的一种是在模型拟合函数的数据参数的上下文中,表示公式中没有的所有列:请参阅terms.formula。仅在update.formula的上下文中,它意味着之前在公式的这一部分中的内容。

    阅读该文档的第一部分后,我会认为这段代码:

    dat <- data.frame(
      y = rnorm(10),
      x1 = runif(10),
      x2 = rbinom(10,size = 1,prob = 0.5),
      x3 = rbinom(10,size = 1,prob = 0.5)
    )
    
    mt <- terms.formula(
      x = y ~ x1 + . + (.)^2,
      data = dat
    )
    
    mm <- model.matrix(mt,dat)
    

    …将产生一个具有交互项的模型矩阵 只有 对于 x2:x3 ,因为这是中仅有的两列 dat “公式中没有其他规定”。然而:

    > colnames(mm)
    [1] "(Intercept)" "x1"          "x2"          "x3"          "x1:x2"      
    [6] "x1:x3"       "x2:x3"  
    

    …相反,我们得到了所有的互动。

    当然,如果我明确地写出来,我就会得到我所期望的:

    > mt1 <- terms.formula(
    +   x = y ~ x1 + x2 + x3 + (x2 + x3)^2,
    +   data = dat
    + )
    > 
    > mm1 <- model.matrix(mt1,dat)
    > colnames(mm1)
    [1] "(Intercept)" "x1"          "x2"          "x3"          "x2:x3"  
    

    我知道公式和;模型矩阵有时会微妙地令人困惑,但我很难将我对文档的阅读和行为相协调。

    我是否错误地解释了文档,或者可能错误地编写了公式(针对我试图做的事情)?还是文件不完全准确?

    1 回复  |  直到 11 月前
        1
  •  4
  •   joran    11 月前

    看起来“公式中没有其他地方”可能真的意味着“不在公式的左侧”:例如。

    terms.formula( y + x1 ~ x1 + .^2, data = dat)
    

    (虽然很傻)不包括 x1 在互动中。另一方面,包括 offset(x1) 不算数。

    内部代码 terms 很可怕,但是 this comment

    /*如果dotsxp正在扩展,那么我们需要看看 数据帧中的任何变量是否匹配 具有 lhs上的变量 如果是这样,它们就不应该被包括在内 在因素*/

    (强调)强化了结论。

    不管它值多少钱,这也可以排除 x1 从互动中:

    terms.formula( y ~ x1 + (.-x1)^2 , data = dat)