R:如何使用 R 的公式表示法来紧凑地生成除选定二次项子集之外的所有项?



我想要一种方法来紧凑地使用R的公式符号 - 或其他一些形式 - 包括一组变量A到E之间的所有二次项,不包括D:E相互作用。(我真正的问题有更长的 A - C 类型变量和 D - E 类型变量列表)

我写了一个小函数来根据这篇文章检查我的工作(谢谢,@Gregor!

expand_form <- function(FUN){
out <- reformulate(labels(terms(FUN)), FUN[[2]])
out
}

我以为这会做到:

f <- y ~ (A + B + C + D + E)^2 -D:E
>expand_form(f)
y ~ A + B + C + D + E + A:B + A:C + A:D + A:E + B:C + B:D + B:E + 
C:D + C:E
<environment: 0x00000218fc153928>

但它不包括单变量平方项。当然,我可以明确地将这些术语添加为A:A, B:B等 - 或者实际上没有。我刚刚尝试过,它对 expand_form() 的输出没有影响。添加A^2, B^2等术语也是如此。不确定这是我的公式还是我的 expand_form() 函数的问题。

我查看了 5 或 6 篇关于相关主题的帖子,但似乎没有一篇在公式符号中提供紧凑的解决方案,我假设存在。

为了回应@Maurits Evers在下面非常清晰和有用的评论/答案,我想澄清我的问题,以便更清楚地认识到:

  1. 我想做的事情是大多数人想做的事情 某些背景;和
  2. 我现在认识到 R 的标准公式表示法,用于其 通常的方式,不会这样做。

如果您有数值变量,则所有双向交互作用项都是二阶多项式。在这种情况下,很明显,如果你包括变量和它之间的交互(你不必这样做),很明显你不希望它们被解释为变量的第二个副本,也不希望它们被删除。如果这是你想要的,你就不会包括自我交互术语。但这就是 R 的标准公式表示法所做的:它将数值变量与自身的交互解释为与变量相同,然后将其删除为冗余。因此,包含自交互的公式与不包含自交互的公式在同义重复上是相同的。我认为这绝不是人们在所有变量都是数字的模型中所希望的行为。

如果总是删除自交互项是你想要的行为 - 并且对于虚拟变量是 - R的公式符号允许你非常简洁地表达任何交互模式,包括一些非常复杂的模式。但是,我发现表达将自我交互视为平方项的交互模式的唯一方法是单独写出所有平方项。这是尴尬和冗长的,在有很多变量的模型中,我认为这通常会导致错误。因此,在我看来,在这种情况下,交互项通常应该是正方形。

所以问题是,有没有直接的方法告诉R的公式符号你想把自交互视为平方,或者,如果你不能得到公式符号,有没有办法简洁地表达这样的表达式。

我认为这部分是学科差异。计量经济学主要是一个准实验领域,我们必须在发现它们时采取我们的治疗方法。因此,虚拟变量的治疗效果解释对我们来说并不自然。

这不是对您的问题的回答,但评论有点太长了,所以我在这里发布这个。如果这不是正确的位置,将删除。

在我看来,你的问题归结为什么

terms(y ~ A)

terms(y ~ A^2)

对应于相同的模型结构。

你没有看到二次项的原因是,在R的公式语法中,A^2对应于交互项A:A;这反过来又是y ~ A,因为依赖于AA相互作用的模型只是一个依赖于A的模型。

一般来说,要包含二次项,您必须使用"AsIs"运算符I(),因此

terms(y ~ I(A^2))

会给你一个加法模型

y = beta[0] + beta[1] * A^2

回到你最初的问题,当你I()里面有多个术语时,terms似乎不起作用,所以我不确定你的问题是否存在简单的解决方案。


更新

我认为您的问题源于对 R 公式语法中的^运算符的作用的一些困惑。

回顾一下(见?formula):

  1. *运算符表示因子交叉:a * ba + b + a:b的缩写
  2. ^运算符指示交叉到指定度数

例如

y ~ (x1 + x2)^2

y ~ (x1 + x2) * (x1 + x2)

这与

y ~ x1 + x2 + x1:x2

在单词中(再次基于?formula中给出的解释),(x1 + x2)^2扩展到包含x1x2的主效应以及它们的二阶相互作用的公式。它不包括二阶(二次)主效应,并且不会扩展到x1 + I(x1^2) + x2 + I(x2^2) + x1:x2

通过相同的参数,y ~ x1^2扩展到y ~ x1 * x1,而又扩展到y ~ x1同样,没有二次主效应。

最新更新