5

我已经看到如何在公式中使用 ~ 运算符。例如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)?最后,这里的 ~ 运算符是什么意思?

4

3 回答 3

12

~创建一个公式 - 它将公式的右侧和左侧分开

?`~`

波浪号用于分隔模型公式中的左侧和右侧

引用公式的帮助

例如,通过 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,您正在传递一个属于 class 的对象formulamodel.matrix(terms(~a))也可以工作,(传递与公式对应的术语对象~a


一般说明

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

R 简介中有一个很好的描述。

于 2012-10-05T00:21:44.750 回答
6

看了几本手册后,我对 o 的含义感到困惑,model.matrix(~0+x)直到最近我才发现了这个优秀的书籍章节

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

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

Thanking @mnel for the useful comment, finally what's the reason to use ~ and not =? In standard mathematical terminology / symbology y~x denotes that y is equivalent to x, it is somewhat weaker that y=x. When you are fitting a linear model, you aren't really saying y=x, but more that you can model y as a linear function of x (y = ax+b for example)

于 2012-10-08T00:56:41.760 回答
2

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

于 2012-10-05T00:21:14.527 回答