我试图理解波浪线运算符及其相关函数的使用。我的第一个问题是为什么需要使用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)
我的第二个问题是,也许我一直在使用的例子太简单了,但我不明白~
实际上应该在哪里使用。
我试图理解波浪线运算符及其相关函数的使用。我的第一个问题是为什么需要使用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)
我的第二个问题是,也许我一直在使用的例子太简单了,但我不明白~
实际上应该在哪里使用。
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.formula
、curve
和'lattice'和'ggplot'函数中,它管理着如何显示和“分面显示”多个因子或数字向量。
"+"运算符的重载在下面的注释中进行了讨论,并且在绘图包ggplot2和gridExtra中也进行了操作,其中它分离提供对象结果的函数。这里它充当一个经过传递和层叠的运算符。一些聚合函数具有公式方法,这些方法使用“+”作为一种“排列”和分组运算符。
?formula
(尽管这在我的问题中并不清楚);让我困惑的是模型制定中运算符的概念。例如,我完全不知道+
符号如何表示除了将两个值相加之外的其他含义。 - ChrisW+
运算符在公式的上下文中被重载。这样做是为了使公式规范更加直观易懂。否则,回归调用将看起来像 lm( formula=formula(y.var,x.var1,x.var2) )
,这样就不那么容易理解了。 - Ari B. Friedman
?formula
中包含的内容。 - joran