R代码运算符:〜0 + a表示什么?

时间:2012-10-05 00:14:34

标签: r

我已经看过如何在公式中使用〜运算符。例如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)不同?最后〜操作符的含义是什么?

3 个答案:

答案 0 :(得分:10)

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

来自?`~`

  

Tilde用于分离模型公式中的左侧和右侧

从公式

的帮助中引用
  

通过例如lm和glm函数拟合的模型以紧凑的符号形式指定。 〜运算符是这种模型形成的基础。形式为y~exode的表达式被解释为响应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)不起作用,因为afactor变量,而不是公式或术语对象

来自model.matrix的帮助

  

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

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

的术语对象

一般说明

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

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

答案 1 :(得分:5)

在阅读了几本手册后,我最近发现this excellent book chapter model.matrix(~0+x) ountil的含义让我感到困惑。

在数学中0+a等于a,写一个像0+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-2~x+3之类的内容毫无意义。

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

答案 2 :(得分:2)

要回答部分问题,使用波浪号分隔模型公式中的左侧和右侧。有关更多帮助,请参阅?"~"