當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。