在R公式中的条件(|)

10

我找到了这份关于R公式的PDF,但我无法理解第二页的表格中|的作用。此外,我在网上也找不到任何解释。它似乎偶尔出现在可能的公式符号列表中,但没有任何示例。

我认为它可能已经过时了,因为有其他方法可以实现它所做的任何事情。

有人知道如何在公式中使用|以及它究竟实现的是什么吗?

下面附有一小段代码,显示了我尝试使用|的笨拙尝试。

x <- rnorm(100)
y <- rnorm(100)
z <- sample(c(TRUE, FALSE), 100, replace = TRUE )

lm(y ~ x|z)

1
它在哪里被使用? - Alex
| 是一个逐元素评估的逻辑 OR。我相信这里有大量资源可以帮助解释它。 - Abdou
许多建模软件包都使用它,包括 lfeAER (ivreg) 和 lme4 - lmo
1
@Abdou 我知道在R中逻辑或的工作原理。但是一些符号,如*,如果在公式中使用,则具有特殊含义。这也是我对|的期望。 - Alex
1
@Alex,我不知道有些包将其用于表示条件概率等。好知道。 - Abdou
2个回答

16

符号|的含义取决于上下文:

通用情况

一般来说,|表示OR(或者)。通用建模函数会将任何|看作逻辑运算符并执行它。这相当于使用另一个运算符,例如^,比如:

lm(y~ x + x^2)

首先进行运算,然后使用这个新变量构建模型矩阵并进行拟合。

在您的代码中,|也表示OR。请记住,在使用任何逻辑运算符时,R也会将数字值解释为逻辑值。0被视为FALSE,其他所有值被视为TRUE。

因此,您对lm的调用构建了一个以x OR z为基础的y模型。这没有任何意义。鉴于x的值,这只是y〜TRUE。这也是您的模型不适合的原因。您的模型矩阵有两列1,一列截距和一列x|z中唯一的值为TRUE。因此,x|z的系数甚至无法计算,如输出所示:

> lm(y ~ x|z)

Call:
lm(formula = y ~ x | z)

Coefficients:
(Intercept)    x | zTRUE  
   -0.01925           NA  

混合模型中的公式

在混合模型(例如 lme4 包)中,竖线符号 | 用于表示随机效应。类似于 + 1|X 的术语表示:“为 X 中的每个类别拟合一个随机截距”。您可以将 | 翻译为“给定”。因此,您可以将该术语视为“在给定 X 的情况下拟合截距”。如果您记住这一点,则在指定相关结构的协方差结构的规范(例如,在 nlmemgcv 中)中使用 | 将更加有意义。

但是,您仍然需要小心,因为精确解释 | 的方式在很大程度上取决于您使用的软件包。因此,真正了解其在您使用的建模函数的上下文中具体含义的唯一方法是查看该软件包的手册。

其他用途

还有一些其他函数和软件包在公式界面中使用 | 符号。在这里,它基本上 boils down 指示某种组。其中一个例子是在 lattice 图形系统中使用 | 进行细分,如以下代码所示:

library(lattice)
densityplot(~Sepal.Width|Species,
            data = iris,
            main="Density Plot by Species",
            xlab="Sepal width")

1
因此,它通常不在公式中使用,而只在某些软件包中实现。基本的 R 函数(如 lm())将其作为简单的逻辑运算符进行评估,而在公式的上下文中没有特殊的含义。 - Alex
@Alex,你懂的。我加了那一点信息,让它更明显。 - Joris Meys
您可以在 lme4 包的介绍性文献中找到更多信息:https://cran.r-project.org/web/packages/lme4/vignettes/lmer.pdf - Joris Meys
1
Joris:你还应该丰富一下基于公式(面板/条件)的格栅图形的可能用法——我仍然支持你。 - Eric Lecoutre
@EricLecoutre 很好的观点。现在几乎没有人使用它,但我为了完整性而包括了lattice的使用。 - Joris Meys
有没有办法使用 | 作为分组变量构建一个公式对象,以便在这些包中使用?也就是说,我想调用类似于 rlang::new_formula(lhs, rhs, group) 的东西。 - Dylan Russell

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接