R 大写字母是什么;我";线性回归公式中的均值?

R 大写字母是什么;我";线性回归公式中的均值?,r,regression,formula,polynomials,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) 任何关于如何自己研究这一点的关键词都会非常有用。I将I(…)的内容与R公式解

我还没有找到这个问题的答案,主要是因为在谷歌上搜索任何带有独立字母(如“I”)的东西都会引起问题

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

data(rock)
lm(area~I(peri - mean(peri)), data = rock)
考虑到以下情况不起作用:

lm(area ~ (peri - mean(peri)), data = rock)
这确实有效:

rock$peri - mean(rock$peri)
任何关于如何自己研究这一点的关键词都会非常有用。

I
I(…)
的内容与R公式解析代码的凝视隔离开来。它允许标准R运算符在公式之外使用时发挥作用,而不是将其视为特殊的公式运算符

例如:

y ~ x + x^2
对R来说,意思是“给我:

  • x
    =x的主要作用,以及
  • 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
    
    这是因为
    ^
    是公式中的特殊运算符,如
    ?公式
    中所述。您最终只在模型框架中包含
    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

    在您的示例中,在公式中使用时,
    -
    表示从模型中删除了一个术语,您希望
    -
    具有减法的常用二进制运算符含义:

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

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


    阅读
    ?公式
    了解有关特殊运算符的更多信息,阅读
    ?I
    了解有关函数本身及其在数据帧中的其他主要用例(如果您感兴趣,
    AsIs
    位的来源)。

    来自文档:

    函数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)
    
    lm(mpg ~ disp + drat, mtcars)
    lm(mpg ~ I(disp + drat), mtcars)
    

    第二行。“创建一个新的预测器”,即
    disp+drat

    的文字总和。R中有非常好的文档。请阅读
    帮助(“I”)
    。是的,谢谢,我看到了。这并不能完全回答为什么在线性模型内部需要特殊处理,而在线性模型外部不需要特殊处理。如果答案是“这就是R的工作原理”,那么我认为这很重要。“在函数公式中,它用于禁止将“+”、“-”、“*”和“^”等运算符解释为公式运算符,因此它们被用作算术运算符。”这一点非常清楚。甚至还有一个指向
    公式
    文档的有用链接。要返回原始问题:“R简介”(随R安装一起提供,请查看“帮助”菜单下)中的11.1节给出了一些提示。它本质上给出了
    I()
    =隔离的助记符。可能会有帮助。我同意关于
    I()
    的文档是,嗯,简洁的。@Nancy这与元素类无关,而与公式中具有特殊意义的
    -
    有关。括号在那里是因为
    I
    是一个函数,所以您需要它们就像在
    mean()
    上需要它们一样。它还(但这种效果是次要的)直观地表明什么是从公式解析代码中得到保护的。回答很好,我尝试了
    X:X
    而不是
    X^2
    ,但它仍然有效,你知道为什么吗?你期望
    I(X:X)
    做什么?我假设它将尝试应用序列操作符,如
    seq(from=X,to=X,by=1L)
    。但是这对我来说没有任何意义。那么,公式中的
    X:Y
    是否意味着
    X
    Y
    之间的交互作用?是的
    X:Y
    (没有包装在
    I()
    中)意味着
    X
    Y
    之间的交互作用。这就是重点<代码>:和
    ^
    以及其他一些运算符在公式中有不同的用法/解释。如果您想要常规的非公式解释,则需要将其包装在
    I()
    中。我认为
    X:X
    不会有任何作用,因为它不是字面上的
    X*X
    ,因为这对因子变量不起作用<代码>:表示交互。
    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)