【问题标题】:R tilde operator: What does ~0+a means?R 波浪号运算符:~0+a 是什么意思?
【发布时间】:2012-10-05 00:14:34
【问题描述】:

我已经看到了如何在公式中使用 ~ 运算符。例如y~x 表示:y 分布为 x。

但是我真的很困惑 ~0+a 在这段代码中的含义:

require(limma)
a = factor(1:3)
model.matrix(~0+a)

为什么只是model.matrix(a) 不起作用?为什么model.matrix(~a) 的结果与model.matrix(~0+a) 不同?最后这里的~操作符是什么意思?

【问题讨论】:

  • 鉴于您的自我回答,我认为这不是R 的具体问题,而是关于线性模型和公式符号的更一般的问题。
  • 如果您可以访问它,您可能需要查看定义此符号的论文:jstor.org/stable/2346786(由 Wilkinson 和 Rogers 撰写,因此此符号通常称为“Wilkinson-Rogers 符号”跨度>
  • @mnel:这是将 ~a-1 作为无截距公式的 R 特定符号。我只是在解决我长期面临的理解 R 公式的问题。
  • @BenBolker - 感谢您的链接,我知道有一篇论文定义了符号,但找不到!
  • @BenBolker:谢谢你的链接。

标签: r


【解决方案1】:

~ 创建一个公式 - 它将公式的左右两边分开

来自?`~`

波浪号用于分隔模型公式中的左右两边

引用公式的帮助

适合的模型,例如,lm 和 glm 函数以紧凑的符号形式指定。 ~ 运算符是形成此类模型的基础。 y ~ model 形式的表达式被解释为响应 y 由模型符号指定的线性预测器建模的规范。这样的模型由一系列由 + 运算符分隔的术语组成。术语本身由变量和因子名称组成,由 : 运算符分隔。这样的术语被解释为术语中出现的所有变量和因素的相互作用。

除了 + 和 : 之外,许多其他运算符在模型公式中也很有用。 * 运算符表示因子交叉:a*b 解释为 a+b+a:b。 ^ 运算符表示交叉到指定的度数。例如 (a+b+c)^2 与 (a+b+c)*(a+b+c) 相同,后者又扩展为包含 a、b 和 c 的主效应及其第二个效应的公式-订单交互。 %in% 运算符表示其左侧的术语嵌套在右侧的术语中。例如 a + b %in% a 扩展为公式 a + a:b。 - 运算符删除指定的项,因此 (a+b+c)^2 - a:b 与 a + b + c + b:c + a:c 相同。它也可以用来移除截距项:当拟合线性模型时,y ~ x - 1 指定一条通过原点的线。没有截距的模型也可以指定为 y ~ x + 0 或 y ~ 0 + x。

所以关于~a+0 的具体问题

  • 您创建了一个没有截距的模型矩阵。由于a 是一个因素,model.matrix(~a) 将返回一个截距列,即a1(您需要n-1 指标来完全指定n 类)

每个函数的帮助文件都写得很好,详细且容易找到!

为什么model.matrix(a) 不起作用

model.matrix(a) 不起作用,因为 a 是 factor 变量,而不是公式或术语对象

来自model.matrix的帮助

object 适当类的对象。对于默认方法,一个 模型公式或术语对象。

R 正在寻找特定类的对象,通过传递一个公式 ~a,您正在传递一个属于 formula 类的对象。 model.matrix(terms(~a)) 也可以工作,(传递与公式 ~a 对应的术语对象


一般说明

@BenBolker 在他的评论中很有帮助地指出,这是 Wilkinson-Rogers 表示法的修改版本。

the Introduction to R中有很好的描述。

【讨论】:

    【解决方案2】:

    看了几本手册后,我对model.matrix(~0+x)的含义感到困惑,直到最近才找到this excellent book chapter。

    在数学中0+a 等于a,写一个像0+a 这样的术语很奇怪。然而,我们在这里处理的是线性模型:一个简单的高中方程,例如 y=ax+b,它揭示了预测变量 (x) 和观察值 (y) 之间的关系。

    所以我们可以将~0+x 或同样的~x+0 视为以下形式的等式:y=ax+b。通过添加0,我们将b 强制为零,这意味着我们正在寻找一条通过原点的线(无截距)。如果我们指定一个像~x+1 或只是~x 的模型,那么拟合方程可能包含一个非零项b。同样,我们可以通过公式~x-1 或~-1+x 来限制b,这两者都意味着:没有截距(与我们通过负索引排除R 中的行或列相同的方式)。然而像~x-2 或~x+3 这样的东西是没有意义的。

    感谢@mnel 的有用评论,最后是什么原因使用~ 而不是=?在标准数学术语/符号学中,y~x 表示 y 等价于 x,它比 y=x 要弱一些。当你拟合一个线性模型时,你并不是真的在说y=x,而是你可以将 y 建模为 x 的线性函数(例如y = ax+b)

    【讨论】:

      【解决方案3】:

      为了回答您的部分问题,波浪号用于分隔模型公式中的左侧和右侧。如需更多帮助,请参阅?"~"。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-22
        • 2013-03-06
        • 2019-05-17
        • 2017-01-28
        • 2015-06-24
        • 2011-04-26
        • 1970-01-01
        相关资源
        最近更新 更多