R 大写字母是什么;我";线性回归公式中的均值?
我还没有找到这个问题的答案,主要是因为在谷歌上搜索任何带有独立字母(如“I”)的东西都会引起问题 “我”在这样的模型中做什么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公式解
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)