R线性回归公式中的大写字母"I"是什么意思?

Nan*_*ncy 19 regression r formula polynomials

我无法找到这个问题的答案,主要是因为使用独立字母(如"我")搜索任何内容都会导致问题.

"I"在这样的模型中做了什么?

data(rock)
lm(area~I(peri - mean(peri)), data = rock)
Run Code Online (Sandbox Code Playgroud)

考虑到以下情况不起作用:

lm(area ~ (peri - mean(peri)), data = rock)
Run Code Online (Sandbox Code Playgroud)

没有问题:

rock$peri - mean(rock$peri)
Run Code Online (Sandbox Code Playgroud)

关于如何自己研究这个问题的任何关键词也会非常有帮助.

Rei*_*son 31

I 从R的公式解析代码的凝视中分离隔离内容I( ... ).它允许标准R运算符像在公式之外使用它们时那样工作,而不是被视为特殊公式运算符.

例如:

y ~ x + x^2
Run Code Online (Sandbox Code Playgroud)

对R来说,意思是"给我:

  1. x=的主要作用x,并
  2. x^2=主要影响和二阶互动x",

不是预期的x加号 - x平方:

> model.frame( y ~ x + x^2, data = data.frame(x = rnorm(5), y = rnorm(5)))
           y           x
1 -1.4355144 -1.85374045
2  0.3620872 -0.07794607
3 -1.7590868  0.96856634
4 -0.3245440  0.18492596
5 -0.6515630 -1.37994358
Run Code Online (Sandbox Code Playgroud)

这是因为^公式中的特殊运算符,如中所述?formula.您最终只包含x在模型框架中,因为主要影响x已经包含x在公式中的术语中,并且没有任何东西可以交叉x以获得x^2术语中的二阶交互.

要获得通常的运算符,您需要使用I()以从公式代码中隔离调用:

> model.frame( y ~ x + I(x^2), data = data.frame(x = rnorm(5), y = rnorm(5)))
            y          x       I(x^2)
1 -0.02881534  1.0865514 1.180593....
2  0.23252515 -0.7625449 0.581474....
3 -0.30120868 -0.8286625 0.686681....
4 -0.67761458  0.8344739 0.696346....
5  0.65522764 -0.9676520 0.936350....
Run Code Online (Sandbox Code Playgroud)

(最后一列是正确的,它看起来很奇怪,因为它是类AsIs.)

在您的示例中,-当在公式中使用时,将指示从模型中删除术语,您希望-在其中具有减法的通常二元运算符含义:

> model.frame( y ~ x - mean(x), data = data.frame(x = rnorm(5), y = rnorm(5)))
Error in model.frame.default(y ~ x - mean(x), data = data.frame(x = rnorm(5),  : 
  variable lengths differ (found for 'mean(x)')
Run Code Online (Sandbox Code Playgroud)

这失败的原因mean(x)是长度为1的向量,并且model.frame()非常正确地告诉您这与其他变量的长度不匹配.这方面的一个方法是I():

> model.frame( y ~ I(x - mean(x)), data = data.frame(x = rnorm(5), y = rnorm(5)))
           y I(x - mean(x))
1  1.1727063   1.142200....
2 -1.4798270   -0.66914....
3 -0.4303878   -0.28716....
4 -1.0516386   0.542774....
5  1.5225863   -0.72865....
Run Code Online (Sandbox Code Playgroud)

因此,如果要使用在公式中具有特殊含义的运算符,但需要其非公式含义,则需要将操作的元素包装在其中I( ).

了解?formula更多关于特殊运算符和?I对函数本身的详细信息数据帧中的其他主用例(这哪里是AsIs位从起源,如果你有兴趣).