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

时间:2014-06-12 19:26:16

标签: r regression formula polynomials

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

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

data(rock)
lm(area~I(peri - mean(peri)), data = rock)

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

lm(area ~ (peri - mean(peri)), data = rock)

并且确实有效:

rock$peri - mean(rock$peri)

关于如何自己研究这个问题的关键词也会非常有用。

2 个答案:

答案 0 :(得分:28)

I 隔离将<{1}}的内容与R公式解析代码的目标隔离开来。它允许标准R运算符像在公式之外使用它们时那样工作,而不是被视为特殊公式运算符。

例如:

I( ... )

对R来说意味着&#34;给我:

  1. y ~ x + x^2 = x
  2. 的主要影响
  3. x = x^2&#34;的主效应和二阶互动,
  4. 不是预期的xx - 平方:

    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 是公式中的特殊运算符,如^中所述。您最终只在模型框架中包含?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.... 类。)

    在您的示例中,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)') 是长度为1的向量而mean(x)非常正确地告诉您这与其他变量的长度不匹配,因此失败了。这方面的一个方法是model.frame()

    I()

    因此,如果要使用在公式中具有特殊含义的运算符,但需要其非公式含义,则需要在{{1}中包含该运算的元素}。

    有关特殊运算符的详细信息,请阅读> 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.... ,有关函数本身的更多详细信息,请阅读I( ) 数据框中的其他主要用例(这是如果您感兴趣,?formula位源自。

答案 1 :(得分:1)

From the docs:

功能我有两个主要用途。

  • 在函数data.frame中。通过在对data.frame的调用中将对象包含在I()中来保护对象,可以防止将字符向量转换为因数,也可以防止名称丢失,并确保将矩阵作为单列插入。我还可以用来保护要添加到数据框或通过as.data.frame转换为数据框的对象。

要解决这一点:

df1 <- data.frame(stringi = I("dog"))
df2 <- data.frame(stringi = "dog")

str(df1)
str(df2)
  • 在函数公式中。此处用于禁止将运算符(例如“ +”,“-”,“ *”和“ ^”)解释为公式运算符,因此将它们用作算术运算符。术语,公式将其解释为符号。

要解决这一点:

lm(mpg ~ disp + drat, mtcars)
lm(mpg ~ I(disp + drat), mtcars)

第二行。 “创建新的预测变量”,即disp + drat

的字面总和