R中的公式:使用

来源:互联网 发布:我当鸟人的那几年 知乎 编辑:程序博客网 时间:2024/06/10 23:19

R中很多函数都接收公式(formula)类型的参数,比如lm。来看一个最简单的使用公式的例子:

代码
1
lm(y ~ x, data=dfrm)

这里的公式是 y~ x,有这样几个意思:

  1. y和x之间的关系是线性的;
  2. y是因变量,x是自变量;
  3. x和y都是数据框dfrm中的列。

这是最简单的使用。还有一种稍微复杂点,但也很常用的公式。当dfrm中有多列数据,其中一列是因变量y,要建立一个y对其他所有列的线性模型:

代码
1
lm(y ~ ., data=dfrm)

R中的公式被称为模型公式(Model Formulae,下面还是简称公式),用于描述若干个变量所构成的模型。最早是在S语言中引入,用于描述线性模型,后来不断的演化和扩展使用范围,成为了S语言不可分割的一部分,也自然是R语言中不可分割的一部分。在不同的使用环境中,公式有不同的作用和特性。公式的基本形式是这样的:

代码
1
因变量 ~ 表达式

其中表达式是一串由各种操作符连接起来的变量。延续上面的例子,看这样几个公式:

代码
1
2
3
y ~ x
y ~ x + 1
y ~ x1 + x2

第一个公式的表达式只有变量x,但x和y之间的关系除了线性系数外,还隐含有一个截距。而公式2中则明确指定了截距是1。公式3表示的则是y是x1和x2的线性组合,同样也有一个隐藏的截距。后面两个公式用到了+符号,表示两个变量是线性可加的。在公式中还可以用到下面这些运算符(详见[1-2]):

  1. +:前面已经介绍了,表示变量线性可加。
  2. ::表示变量中的因子之间的interaction。
  3. *:表示factor crossing,即a*b等同于a+b+a:b。
  4. ^:表示crossing的次数。即(a+b+c)^2就等同于(a+b+c)*(a+b+c),再扩展一下就是a、b和c的主效应,加上它们之间的二阶互作:a+b+c+a:b+b:c+a:c。
  5. %in% :表示其左侧的变量是嵌套在右侧变量中的。例如a + b %in% a 就等同于a + a:b。
  6. -:表示移除指定的变量。(a+b+c)^2 – a:b就等同于a + b + c + b:c + a:c。还可以用于消除截距,例如y ~ x – 1 就是通过原点的直线。无截距的模型还可以用y ~ x + 0或y ~ 0 + x表示。
  7. /:a/b等同于a + b %in% a。

除了这些专门针对公式的运算符,公式中还可以使用各种算术运算符,比如log()、poly(),以及各种加减乘除等。但这又导致了一个问题,R怎么才能知道公式中的*号表示的是乘法元算还是factor crossing?为了解决这个问题,R提供了I()函数。把一段公式放入I()中就表示其中所有的运算符都是普通意义上的算术运算符。例如:

代码
1
y ~ a + I(b+c)

其中第二个加号就表示b和c的和,而不是两者线性可加了。


在某些情况下,我们需要通过字符串操作才能组合出一个所需的公式。这时,可以用as.formula函数将其转换成一个公式,例如:

代码
1
2
xnam <- paste0("x", 1:25)
(fmla <- as.formula(paste("y ~ "paste(xnam, collapse= "+"))))

公式的基本使用差不多就这样了。不过正如前面说的,不同的使用环境下,公式会有不同的特性,这个就不可能在此一一说明了。除了公式的构建和使用,另一个问题就是如何在自己编写函数时解析公式,这个过两天再来介绍。




转载自:http://www.dataguru.cn/article-2431-1.html