【问题标题】:What does the capital letter "I" in R linear regression formula mean?R线性回归公式中的大写字母“I”是什么意思?
【发布时间】:2014-08-03 06:03:11
【问题描述】:

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

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

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

考虑到以下不起作用:

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

并且 this 确实有效:

rock$peri - mean(rock$peri)

任何关于如何自己研究的关键词也将非常有帮助。

【问题讨论】:

  • R 中有优秀的文档。阅读help("I")
  • 是的,谢谢,我看到了。这并不能完全回答为什么在线性模型内部而不是在线性模型之外需要特殊处理。如果答案是“这就是 R 的工作方式”,那么我认为这很重要。
  • "在函数公式中。用于禁止将“+”、“-”、“*”、“^”等运算符解释为公式运算符,因此用作算术运算符运营商。”很清楚。甚至还有一个指向formula 文档的有用链接。
  • 回到原来的问题:“R 简介”中的第 11.1 节(随您的 R 安装一起提供,在帮助菜单下查看)给出了一些提示。它本质上给出了I() = 绝缘的助记符。可能会有所帮助。我同意I() 上的文档是,嗯,简洁
  • @Nancy 这与元素的类别无关,而与 - 在公式中具有特殊含义有关。括号在那里是因为I 一个函数,所以你需要它们就像你在mean() 上需要它们一样。它还(但这种效果是次要的)直观地指示了受公式解析代码保护的内容。

标签: r regression formula polynomials


【解决方案1】:

From the docs:

函数 I 有两个主要用途。

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

解决这一点:

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

str(df1)
str(df2)
  • 在函数公式中。它用于禁止将“+”、“-”、“*”和“^”等运算符解释为公式运算符,因此将它们用作算术运算符。这被 terms.formula 解释为一个符号。

解决这一点:

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

第二行。 “创建一个新的预测变量”,即 disp + drat 的字面总和

【讨论】:

    【解决方案2】:

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

    例如:

    y ~ x + x^2
    

    对于 R 来说,意思是“给我:

    1. x = x 的主要效果,并且
    2. x^2 = x的主效应和二阶交互",

    不是预期的x 加上x-squared:

    > 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)')
    

    这失败的原因是 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....
    

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

    阅读?formula 了解有关特殊运算符的更多信息,阅读?I 了解有关函数本身的更多详细信息它在数据帧中的其他主要用例(AsIs位来自,如果你有兴趣)。

    【讨论】:

    • 很好的答案,我试过 X:X 而不是 X^2 但它仍然有效,你知道为什么吗?
    • 您希望I(X:X) 做什么?我假设它将尝试应用序列运算符,如seq(from = X, to = X, by = 1L)。但这对我来说没有任何意义。
    • 那么,公式中的X: Y 是指XY 之间的交互项吗?
    • X:Y(不包含在I()中)表示XY之间的交互。这就是重点; :^ 和其他一些运算符在一个公式中不同使用/解释中。如果您想要通常的非公式解释,则需要将其包装在 I() 中。我不认为X:X 会做任何事情,因为它并不意味着X * X,因为它不适用于因子变量。 : 表示交互。
    猜你喜欢
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2011-03-28
    相关资源
    最近更新 更多