当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R formula 模型公式


R语言 formula 位于 stats 包(package)。

说明

通用函数formula 及其特定方法提供了一种提取已包含在其他对象中的公式的方法。

as.formula 几乎相同,此外,当 object 已经继承自 "formula" 时,还保留属性。

用法

formula(x, ...)
DF2formula(x, env = parent.frame())
as.formula(object, env = parent.frame())

## S3 method for class 'formula'
print(x, showEnv = !identical(e, .GlobalEnv), ...)

参数

x , object

R对象,对于DF2formula() a data.frame.

...

传入或传出其他方法的进一步参数。

env

与结果关联的环境(如果还没有公式)。

showEnv

逻辑上指示是否也应该打印环境。

细节

例如,lmglm 函数拟合的模型以紧凑的符号形式指定。 ~ 运算符是形成此类模型的基础。 y ~ model 形式的表达式被解释为响应 ymodel 符号指定的线性预测器建模的规范。这样的模型由一系列由 + 运算符分隔的项组成。这些术语本身由由 : 运算符分隔的变量和因子名称组成。这样的术语被解释为该术语中出现的所有变量和因子的相互作用。

除了 +: 之外,许多其他运算符在模型公式中也很有用。

  • * 运算符表示因子交叉: a*b 被解释为 a + b + a:b

  • ^ 运算符表示交叉到指定的程度。例如, (a+b+c)^2(a+b+c)*(a+b+c) 相同,后者又扩展为包含 abc 的主效应及其二阶相互作用的公式。

  • %in% 运算符表示其左侧的术语嵌套在右侧的术语内。例如 a + b %in% a 扩展为公式 a + a:b

  • / 运算符提供简写,因此 a / b 相当于 a + b %in% a

  • - 运算符删除指定的项,因此 (a+b+c)^2 - a:ba + b + c + b:c + a:c 相同。它还可以用于删除截距项:拟合线性模型时y ~ x - 1指定一条通过原点的线。没有截距的模型也可以指定为 y ~ x + 0y ~ 0 + x

虽然公式通常只涉及变量和因子名称,但它们也可以涉及算术表达式。公式log(y) ~ a + log(x) 是相当合法的。当此类算术表达式涉及在模型公式中也以符号方式使用的运算符时,算术运算符和符号运算符的使用之间可能会出现混淆。

为了避免这种混乱,函数 I() 可用于将模型公式中以算术意义使用运算符的部分括起来。例如,在公式 y ~ a + I(b+c) 中,术语 b+c 将被解释为 bc 之和。

变量名称可以在公式中用反引号 `like this` 引用,但不能保证所有使用公式的代码都接受此类非语法名称。

大多数模型拟合函数接受右侧的公式,包括函数 offset 来指示固定系数为 1 的项。某些函数接受其他‘specials’,例如stratacluster(请参阅terms.formulaspecials参数)。

公式中的 . 有两种特殊解释。通常的一个是在模型拟合函数的 data 参数的上下文中,意味着“公式中没有的所有列”:请参阅 terms.formula 。仅在 update.formula 的上下文中,它意味着“公式这部分之前的内容”。

当在拟合模型对象上调用 formula 时,将使用特定方法(例如类 "nls" 的方法)或默认方法。默认情况下首先查找对象的 "formula" 组件(并对其求值),然后查找 "terms" 组件,然后查找调用的 formula 参数(并求值其值),最后查找 "formula" 属性。

有一个formula数据帧的方法。当有"terms"具有公式的属性,例如,对于model.frame(),返回该公式。如果您想要上一个(R 3.5.x) 行为,使用辅助DF2formula()其中不考虑"terms"属性。否则,如果只有一列,则会形成右侧为空且左侧为空的列。对于更多列,第一列是公式的 LHS,其余列由+形成 RHS。

上述所有函数都会生成 "formula" 类的对象,其中包含符号模型公式。

环境

公式对象具有关联的环境,model.frame 使用该环境(而不是父环境)来计算在提供的 data 参数中找不到的变量。

使用 ~ 运算符创建的公式使用创建它们的环境。使用 as.formula 创建的公式将使用 env 参数作为其环境。

注意

R版本高达 3.6.0,character x长度超过一的被解析为单独的行R代码和第一个完整表达式在可能的情况下被计算为公式。这会默默地截断此类字符向量,效率低下,并且在某种程度上不一致,因为这种行为没有记录。因此,这种用法已被弃用。如果你必须通过性格来工作x,请使用字符串,即长度为一的字符向量。

例如, eval(call("~", quote(foo + bar)))formula(c("~", "foo + bar")) 效率高一个数量级。

此外,现在已弃用需要 eval() 来返回公式的字符 “expressions”。

例子

class(fo <- y ~ x1*x2) # "formula"
fo
typeof(fo)  # R internal : "language"
terms(fo)

environment(fo)
environment(as.formula("y ~ x"))
environment(as.formula("y ~ x", env = new.env()))


## Create a formula for a model with a large number of variables:
xnam <- paste0("x", 1:25)
(fmla <- as.formula(paste("y ~ ", paste(xnam, collapse= "+"))))
## Equivalent with reformulate():
fmla2 <- reformulate(xnam, response = "y")
stopifnot(identical(fmla, fmla2))

参考

Chambers, J. M. and Hastie, T. J. (1992) Statistical models. Chapter 2 of Statistical Models in S eds J. M. Chambers and T. J. Hastie, Wadsworth & Brooks/Cole.

也可以看看

~Ioffset

对于公式操作: termsall.vars 。对于典型用途: lmglmcoplot 。对于公式构造:reformulate

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Model Formulae。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。