59

我试图了解波浪号运算符和相关功能的使用。我的第一个问题是为什么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)

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

4

1 回答 1

70

波浪号运算符实际上是一个函数,它返回一个未计算的表达式,一种语言对象。然后,该表达式由建模函数以不同于对数字对象操作的运算符的解释的方式进行解释。

这里的问题是如何解释公式,特别是其中的 "+、":" 和 "^" 运算符。(附带说明:正确的统计过程是poly在尝试在回归公式。)在 R 公式中,中缀运算符“+”、“*”、“:”和“^”与用于数字向量计算时的含义完全不同。在公式中,波浪号 ( ~) 分隔左侧从右侧。and运算符用于构造交互,因此 = =^而不是成为可能预期的数学幂。(与自身交互的变量只是同一个变量。)如果您键入:xx^2x^3(x+y)^2R 解释器会产生(为了它自己良好的内部使用),而不是数学:x^2 +2xy +y^2,而是符号:x + y +x:ywherex:y是一个没有主要影响的交互项。(这^给了你主要的影响和相互作用。)

?formula

I()函数用于将参数转换为“原样”,即您所期望的。所以 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)。函数上下文和参数还可以从值进一步确定链接函数,例如 log() 或 logit() family,并且还可以具有非规范的族/链接组合。

公式中的“+”符号并不是真正添加两个变量,而是通常隐含请求在公式 RHS 上的其余变量的上下文中计算该变量的回归系数。回归函数使用“model.matrix”,该函数将识别公式中是否存在因子或特征向量,并构建一个矩阵来扩展公式的离散分量的水平。

在 plot()-ting 函数中,它基本上颠倒( x, y )了 plot 函数通常采用的参数的通常顺序。编写了一个 plot.formula 方法,以便可以将公式用作与 R 通信的更“数学”模式。在graphics::plot.formulacurve、 和 'lattice' 和 'ggplot' 函数中,它控制多个因子或数字向量的显示方式和“多面”。

“+”运算符的重载在下面的评论中讨论,并且也在绘图包中完成:ggplot2 和 gridExtra 它在哪里分离提供对象结果的函数。它在那里充当传递和分层运算符。一些聚合函数有一个公式方法,它使用“+”作为“排列”和分组运算符。

于 2011-11-08T18:59:09.270 回答