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

Chr*_*isW 44 r formula tilde polynomials

我试图了解使用波浪号运算符和相关函数.我的第一个问题是为什么I()需要用来指定算术运算符?例如,这2个图产生不同的结果(前者有一条直线,后者有预期的曲线)

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

plot(y~x^3)
plot(y~I(x^3))
Run Code Online (Sandbox Code Playgroud)

此外,以下两个图也产生预期结果

plot(x^3, y)
plot(I(x^3), y)
Run Code Online (Sandbox Code Playgroud)

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

42-*_*42- 50

这里的问题是如何解释公式.在公式中,波浪号将左手侧与右手侧分开.在公式中,^运算符用于构造交互,使得x= x^2= x^3而不是可能预期的数学幂.如果你输入(x+y)^2了R解释器会产生(为了它自己的良好内部使用),而不是数学:x^2 +2xy +y^2,而是一个符号:x + y +x:y在哪里x:y是一个交互术语.

?formula
Run Code Online (Sandbox Code Playgroud)

I()函数用于将参数转换为"as.is",即您所期望的.所以我(x ^ 2)将返回一个值向量提升到二次幂.

~当在回归函数中看到时,应该被认为是"分布为"或"依赖于".它意味着模型描述中的错误术语通常标记为"(拦截)",并且函数上下文和参数还可以进一步确定链接函数,例如log()或logit().

在plot() - ting函数中,它基本上颠倒( x, y )了绘图函数通常采用的通常的参数顺序.有写入一plot.formula方法使得公式可以用作与R.通信在更"数学"模式graphics::plot.formula,curve以及"格子"和"ggplot"的功能,它支配因素或数值向量如何多个显示和"刻面".

我后来才知道~它实际上是一个中缀(或前缀)原语函数,它创建了一个R'调用',可以使用列表提取操作符进行访问.所有这些都是典型用户隐藏的,但它可以是更高级的函数作者使用的工具.

"+"运算符的重载在下面的注释中讨论,并且也在绘图包中完成:ggplot2和gridExtra,它分隔了传递对象结果的函数,因此它起作用,并作为传递和分层运算符.具有公式方法的聚合函数使用"+"作为"排列"和分组运算符.

  • 不只是操作员意味着不同的东西; 它更基本上是符号.通常,如果输入"x + y",则会对符号"x"和"y"进行求值,并将它们的值相加.在公式上下文中,例如`z~x + y`,符号不会被评估,但公式引用这些实际符号.从符号构造公式有各种运算符,例如符号+符号与值+值的含义不同. (10认同)
  • @ChrisW` +`运算符在公式的上下文中被重载.这样做是为了让公式规范更加直观.否则回归调用看起来像`lm(公式=公式(y.var,x.var1,x.var2))`,这不太容易理解. (3认同)
  • 在回归函数的公式中,您隐含地要求返回与"+"连接的每个术语相关联(通常乘以)的一组(估计)系数. (2认同)