在R公式中,为什么我必须在幂项上使用I()函数,比如y ~ I(x^3)?

63

我试图理解波浪线运算符及其相关函数的使用。我的第一个问题是为什么需要使用I()来指定算术运算符?例如,这两个绘图生成不同的结果(前者生成直线,后者生成期望的曲线)。

x <- c(1:100)
y <- seq(0.1,10,0.1)

plot(y~x^3)
plot(y~I(x^3))
进一步地,以下两个图表也产生了预期的结果。
plot(x^3, y)
plot(I(x^3), y)

我的第二个问题是,也许我一直在使用的例子太简单了,但我不明白~实际上应该在哪里使用。


9
这个问题的优秀答案将大量涉及?formula中包含的内容。 - joran
重复了;我们应该关闭其中一个并使另一个成为规范:R线性回归公式中的大写字母“I”是什么意思? - smci
@smci:你可能是对的。然而,在我注意到我回答中的这个明显遗漏并加入它之前,它们都没有提供更统计学上正确使用“poly”的方式。这是一个在R中公式一般主题上不同的侧重点,我将添加一个单独的答案。 - IRTFM
@IRTFM:好吧,既然我们无法将旧问题合并到新问题中,那么要么我们将那个问题关闭并转移至此,要么至少在那里留下评论,将此问题标记为相关/重复。 - smci
@Achim Zeileis提供了关于回归过程中多项式模型涉及的统计问题更好的描述:https://dev59.com/HV0a5IYBdhLWcg3wva15#30000214 - IRTFM
1个回答

73
波浪号操作符实际上是一个函数,返回一个未计算的表达式,一种语言对象类型。这个表达式然后通过建模函数进行解释,其方式不同于操作数对数值对象的解释。
问题在于公式,特别是其中的“+”,“:”和“^”操作符是如何被解释的。(顺带一提:在尝试制作回归公式中的高阶项时,正确的统计过程应该使用函数“poly”而不是“x^2”、“x^3”等形式。)在R公式中,中缀运算符“+”,“*”,“:”和“^”具有完全不同的含义,与在数值向量计算中使用它们时的含义不同。在公式中,波浪线(~)将左侧和右侧分开。 “^”和“:”运算符用于构造相互作用,以便x = x^2 = x^3,而不是可能预期的数学幂次。 (自己与自己互动的变量只是相同的变量。)如果您键入了(x+y)^2,R解释器会产生(为了自己良好的内部使用),而不是数学上的:x^2 +2xy +y^2,而是一个符号:x + y +x:y,其中x:y是没有其主效应的相互作用项。(^给出了主效应和相互作用。)
?formula
I()函数的作用是将参数转换为“as.is”,即按照您的期望进行。因此,I(x^2)将返回一个值被平方的向量。
~应该被视为在回归函数中表示“分布为”或“依赖于”的意思。 ~本身是一种中缀函数。您可以通过在控制台上键入以下内容来看到LHS ~ RHS几乎等同于formula(LHS, RHS)
`~`(LHS,RHS)
#LHS ~ RHS

class( `~`(LHS,RHS) )
#[1] "formula"

identical( `~`(LHS,RHS), as.formula("LHS~RHS") )
#[1] TRUE   # cannot use `formula` since it interprets its first argument

在回归函数中,模型描述中的误差项将采用回归函数所假设或特定调用family参数的形式。基本水平的均值通常被标记为(Intercept)。函数上下文和参数也可能进一步确定由family值计算出的链接函数,例如log()或logit(),也可以具有非规范的家族/链接组合。

公式中的“+”符号实际上并不是将两个变量相加,而通常是一个隐含的请求,在公式右侧的其他变量的内容上下文中为该变量计算回归系数。回归函数使用`model.matrix`,该函数将识别公式中因子或字符向量的存在,并构建扩展公式离散组件级别的矩阵。

在绘图函数中,它基本上颠倒了通常绘图函数所需的(x,y)参数顺序。编写了一个plot.formula方法,以便可以使用公式作为与R更“数学化”交流的模式。在graphics::plot.formulacurve和'lattice'和'ggplot'函数中,它管理着如何显示和“分面显示”多个因子或数字向量。

"+"运算符的重载在下面的注释中进行了讨论,并且在绘图包ggplot2和gridExtra中也进行了操作,其中它分离提供对象结果的函数。这里它充当一个经过传递和层叠的运算符。一些聚合函数具有公式方法,这些方法使用“+”作为一种“排列”和分组运算符。


1
我已经阅读了?formula(尽管这在我的问题中并不清楚);让我困惑的是模型制定中运算符的概念。例如,我完全不知道+符号如何表示除了将两个值相加之外的其他含义。 - ChrisW
2
在回归函数中的公式中,您隐含地要求返回与“+”连接的每个术语通常相乘的(估计的)系数集。 - IRTFM
4
+ 运算符在公式的上下文中被重载。这样做是为了使公式规范更加直观易懂。否则,回归调用将看起来像 lm( formula=formula(y.var,x.var1,x.var2) ),这样就不那么容易理解了。 - Ari B. Friedman
13
不仅是运算符具有不同的含义,更根本的是符号。通常情况下,如果您键入“x + y”,则会评估符号“x”和“y”,然后将它们的值相加。在公式上下文中,例如“z〜x + y”,符号不会被评估,但公式引用这些实际符号。有各种操作符可用于从符号构建公式,例如符号+符号与值+值并不意味着相同的事情。 - Jouni K. Seppänen

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