R tilde操作符:~0+a的含义是什么?

6

我看到过在公式中使用 ~ 运算符的方法。例如,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 的问题,而是关于线性模型和公式符号的更一般性的问题。 - mnel
4
如果您可以访问该论文,您可能想查看定义此符号的论文:http://www.jstor.org/stable/2346786(由威尔金森和罗杰斯编写,因此这个符号通常被称为“威尔金森-罗杰斯符号”。) - Ben Bolker
@mnel:这是R特定的符号,用于采用~a-1作为无截距公式。我只是解决了我长期以来在理解R公式方面遇到的问题。 - Ali
@BenBolker - 感谢您提供的链接,我知道有一篇论文定义了这个符号,但是找不到它! - mnel
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 an object of an appropriate class. For the default method, a model formula or a terms object.

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


常规说明

@BenBolker在他的评论中提到,这是Wilkinson-Rogers符号的修改版本。

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


6
阅读了几个手册后,我对`model.matrix(~0+x)`的含义感到困惑,直到最近发现了这本优秀的书籍章节
在数学中,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)。

2
为了回答你的问题,波浪号在模型公式中用于分隔左侧和右侧。有关更多帮助,请参见?"~"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接