R中的公式:利用
R中许多函数都吸收公式(formula)范例的参数,好比lm。来看一个最简朴的利用公式的例子:
1 |
> lm (y ~ x, data=dfrm)
|
这里的公式是 y~ x,有这样几个意思:
- y和x之间的干系是线性的;
- y是因变量,x是自变量;
- x和y都是数据框dfrm中的列。
这是最简朴的利用。尚有一种稍微巨大点,但也很常用的公式。当dfrm中有多列数据,个中一列是因变量y,要成立一个y对其他所有列的线性模子:
1 |
> lm (y ~ ., data=dfrm)
|
R中的公式被称为模子公式(Model Formulae,下面照旧简称公式),用于描写若干个变量所组成的模子。最早是在S语言中引入,用于描写线性模子,厥后不绝的演化和扩展利用范畴,成为了S语言不行支解的一部门,也自然是R语言中不行支解的一部门。在差异的利用情况中,公式有差异的浸染和特性。公式的根基形式是这样的:
1 | 因变量 ~ 表达式 |
个中表达式是一串由各类操纵符毗连起来的变量。延续上面的例子,看这样几个公式:
123 |
y ~ x y ~ x + 1 y ~ x1 + x2
|
第一个公式的表达式只有变量x,但x和y之间的干系除了线性系数外,还隐含有一个截距。而公式2中则明晰指定了截距是1。公式3暗示的则是y是x1和x2的线性组合,同样也有一个埋没的截距。后头两个公式用到了+标记,暗示两个变量是线性可加的。在公式中还可以用到下面这些运算符(详见[1-2]):
- +:前面已经先容了,暗示变量线性可加。
- ::暗示变量中的因子之间的interaction。
- *:暗示factor crossing,即a*b等同于a+b+a:b。
- ^:暗示crossing的次数。即(a+b+c)^2就等同于(a+b+c)*(a+b+c),再扩展一下就是a、b和c的主效应,加上它们之间的二阶互作:a+b+c+a:b+b:c+a: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/b等同于a + b %in% a。
除了这些专门针对公式的运算符,公式中还可以利用各类算术运算符,好比log()、poly(),以及各类加减乘除等。但这又导致了一个问题,R怎么才气知道公式中的*号暗示的是乘法元算照旧factor crossing?为了办理这个问题,R提供了I()函数。把一段公式放入I()中就暗示个中所有的运算符都是普通意义上的算术运算符。譬喻:
1 |
y ~ a + I (b+c)
|
个中第二个加号就暗示b和c的和,而不是两者线性可加了。
在某些环境下,我们需要通过字符串操纵才气组合出一个所需的公式。这时,可以用as.formula函数将其转换成一个公式,譬喻:
12 |
xnam <- paste0 ( "x" , 1:25) (fmla <- as.formula ( paste ( "y ~ " , paste (xnam, collapse= "+" ))))
|
公式的根基利用差不多就这样了。不外正如前面说的,差异的利用情况下,公式会有差异的特性,这个就不行能在此一一说明白。除了公式的构建和利用,另一个问题就是如安在本身编写函数时理会公式,这个过两天再来先容。