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

问题描述 投票:39回答:1

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

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)

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

r formula polynomials tilde
1个回答
47
投票

这里的问题是如何解释公式。中缀运算符“+”,“*”,“:”和“^”具有与使用数字向量时完全不同的含义。在公式中,波浪号将左手侧与右手侧分开。在公式中,^算子用于构造相互作用,使得x = x^2 = x^3而不是可能预期的数学能力。 (与自身交互的变量就是同一个变量。)如果你输入了(x+y)^2,R解释器就会生成(为了它自己的内部使用),而不是数学:x^2 +2xy +y^2,而是一个符号:x + y +x:y,其中x:y是一个交互术语。

?formula

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.