最开始在S语言中,会有专门用于表示自变量和因变量之间关系的符号表达式,由于R语言和S语言的关系,在R语言也继承了这一套表达式,大大方便了对这些变量关系的表述。
R语言中的公式一般按照y ~ x的格式,在~左边的是因变量(response variable),右边的是自变量(dependent variables),自变量可以有多个。

公式中符号有:

符号 说明 示例
+ 连接多个变量,说明有多个自变量 y ~ x1 + x2
. 表示使用所有变量 y ~ .
- 排除某个变量 y ~ x1 - x2
: 变量之间的交集 y ~ x1 : x2
* 变量,以及它们之间的交集 y ~ x1 * x2
^ 变量及n个变量之间的交集,n为^右边的数字 y ~ (x1+x2)^2
%in% 嵌套,左边的嵌套于右边 y ~ x1%in%x2
/ 嵌套,右边的嵌套于左边,而且还单独包括一个左边的变量 y ~ x1/x2
| 在给定x2的条件下,处理x1 y ~ x1|x2
I() as.is,按照括号中的表达式进行算术表达式的处理,前面的字母是大写的i y ~ x1 + I(x1^2)

+ . -

+表示有多个变量作为线性回归的自变量,y ~ x1 + x2 + x3表示下面的线性回归公式:
$$ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \beta_3 x_3 $$ 如果有许多个因变量的话,一个一个写出来比较麻烦,这个时候可以使用.,这里的.表示DataFrame中所有columns,除了已经在公式中出现过的变量。比如一个DataFrame中有(y, x1, x2, x3)列,那么公式y ~ . 等价于y ~ x1 + x2 + x3。这里需要注意的是y因变量已经在前面被使用了,所有.中没有包括。
-符号用于排除某个变量,像公式y ~ x1 - x2就表示不使用x2变量,我想这里只写上x1效果应该是一样的。还有一个例子就是像公式y ~ . - x3,这里就等价于y ~ x1 + x2,把后面的x3排除掉了。

在线性回归方程中经常看到一个表示截矩的常数,我们可以利用offset()函数进行设置特定的截矩,y ~ x1 + x2 + offset(2, n),这里设置截矩为2,后面的n参数简单可以看成y的长度,不过一般不用这么设置,R进行回归的时候会自动计算截矩。如果不想要截矩的话,可以使用+0-1来表示去除截矩,像这样y ~ x1 + x2 + 0y ~ x1 + x2 -1

: *

刚开始我也很不明白,这个交集在线性回归中是怎样的用法,后来看了公式之后就明白了。这是一个普通的$y = \beta_0 + \beta_1 x_1 + \beta_2 x_2$,有交集的回归方程类似: $$ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \beta_3 x_1 x_2
$$ 这类方程叫linear regression with interaction terms.后面的一个变量就是$x_1$和$x_2$相乘后得到的。 那方程y ~ x1:x2表示的回归方程就是下面这个了:
$$ y = \beta_0 + \beta_1 x_1 x_2 $$ 复杂一些像y ~ x1 * x2 * x3,等价于y ~ x1 + x2 + x3 + x1:x2 + x1:x3 + x2:x3 + x1:x2:x3

^

刚开始以为^是表示多项式,后来一看不是,只是表示多个变量以及它们之间的交集,y ~ (x1 + x2)^2表示下面方程: $$ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \beta_3 x_1 x_2 $$
y ~ (x1 + x2 + x3)^3表示下面的方程: $$
y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \beta_3 x_3 + \beta_4 x_1 x_2 + \beta_5 x_1 x_3 + \beta_6 x_2 x_3 + \beta_7 x_1 x_2 x_3 $$ 最后的结果倒有些类似多项式的展开。

| / %in% I()

/%in%经常在ANNOV中遇到,y ~ x1/x2 等于y ~ x1 + x1:x2,也等于y ~ x1 + x2 %in% x1

如果遇到一些多项式回归的话,尝试用y ~ x1 + x1^2,最后的结果还是变回了y ~ x1,因为前面介绍过^的用法只是取交集,变量自己和自己取交集,结果还是自己。而且在R公式里面,同一个变量不能多次出现,所以最后也就显示x1变量了。因为R里面用了另一个符号I()表示,对括号中的表达按照算术表达式的规则进行处理,y ~ x1 + I(x2^2)这里的I(x2^2)中就是对变量x2进行平方后得到一个新的变量z,那上面表示方程: $$ y = \beta_0 + \beta_1 x_1 + \beta_2 z \\ z = x_1^2 $$

|这个比较特殊,一般线性回归中几乎没用过,在lme4包用得比较多,具体的说明可以参考StackOverflow上的这个回答

再看一些例子

下面这三个公式:

y ~ x1 + x2 + x3 + x1:x2 + x2:x3 + x1:x3 + x1:x2:x3  
y ~ x1 * x2 * x3  
y ~ (x1 + x2 + x3)^3

都是表示下面这个公式: $$
y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \beta_3 x_3 + \beta_4 x_1 x_2 + \beta_5 x_1 x_3 + \beta_6 x_2 x_3 + \beta_7 x_1 x_2 x_3 $$

y ~ x1 + x2 + x3 + x1:x2 + x2:x3 + x1:x3  
y ~ x1 * x2 * x3 - x1:x2:x3
y ~ (x1 + x2 + x3)^2

表示下面这个公式: $$ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \beta_3 x_3 + \beta_4 x_1 x_2 + \beta_5 x_1 x_3 + \beta_6 x_2 x_3 $$

对于各个公式的区别,可以随便新建一个DataFrame在R里面进行测试一下:

data = data.frame(y=1:10, x1=rnorm(10), x2=rnorm(10), x3=rnorm(10))
f = y ~ x1 
class(f)
as.factor(f)
as.formula("y~x1")

可以看到生成的公式也是R里面一个formula对象,也可以进行转换。

lm(y ~ x1 + x2, data=data)
Call:
lm(formula = y ~ x1 + x2, data = data)

Coefficients:
(Intercept)           x1           x2  
      5.540        1.223       -1.407 
lm(y ~ x1*x2, data=data)
Call:
lm(formula = y ~ x1 * x2, data = data)

Coefficients:
(Intercept)           x1           x2        x1:x2  
     5.5871       1.2254      -1.4108      -0.2776

参考
1. Statistical Formulas
2. Model Formulae
3. R document