R lm()中的^符号

5
在R中运行回归:
fit = lm(y ~ x + log(x) + z + log(z) + (z-1)^2, data=data)

我得到了非常高的R^2值。 我用一个变量 q 替换了 (z-1)^2,其中 q 被定义为 (z-1)^2,这样我得到了一个更低的 R^2 值。
现在我清楚了 ^ 在 lm() 中并不像指数一样起作用,但它到底是什么呢? 我在这里看到 http://faculty.chicagobooth.edu/richard.hahn/teaching/FormulaNotation.pdf,但我并没有真正理解它。
2个回答

6
术语(z-1)^2与交互式(z-1)*(z-1)相同,而不是(z-1)的平方。如果您要按照字面意思使用该公式,应该使用I()。您可以参考?I?formula进行进一步了解。

是的,那么它到底是做什么的?我不完全理解交互部分以及为什么会使r^2增加。谢谢。 - japem
这是一个非常适合在Stack Exchange上提出的好问题:回归中的交互作用是什么意思。虽然我不太有资格对此做出充分的回答,非常抱歉! - PavoDive

2
在上一个回答的基础上,如果没有使用 I() 运算符,lm() 将无法将数学运算符解释为数学运算。因此,如果不使用 I(),'-1' 对 lm() 的影响与使用 "+0" 相似,即不使用 "(Intercept)" 项。因此,R-squared 值会更高(详细信息),因为 R-squared 计算中的分母变为 (yi^2) 而不是 (yi - y_bar)^2。下面的代码显示了 lm() 计算的相似之处和不同之处。
# Create sample dataframe
x <- 10 + rnorm(100)
y <- 11 + rnorm(100)
z <- 12 + rnorm(100)
df <- data.frame(x,y,z)

不使用术语“(z-1)
lm.fit <- lm(y ~ x + log(x) + z + log(z), data=df)
summary(lm.fit)

enter image description here

# (2) 使用“(z-1)^2”这个术语 注意:在这里,如果没有“I”作为“I((z-1)^2)”,lm()函数将不会将“-”、“^”视为算术运算符。

lm.fit <- lm(y ~ x + log(x) + z + log(z) + (z-1)^2, data=df)
summary(lm.fit)

enter image description here

(3) 不使用 I() 函数,lm() 函数会将 "(z-1)^2" 解释为互动项 "(z-1)*(z-1)",表示为 "*"
lm.fit <- lm(y ~ x + log(x) + z + log(z) + (z-1)*(z-1), data=df)
summary(lm.fit)

enter image description here

(4a) 不使用 I(),(3) 交互项可以分解如下:
 lm.fit <- lm(y ~ x + log(x) + z + log(z) + (z-1) + (z-1) + (z-1):(z-1), data=df)
 summary(lm.fit)

enter image description here

去除括号。
 lm.fit <- lm(y ~ x + log(x) + z + log(z) + z-1 + z-1 + (z-1):(z-1), data=df)
 summary(lm.fit)

enter image description here

保留 HTML,英译中:(4c) 仅保留 "z:-1" 项
 lm.fit <- lm(y ~ x + log(x) + z + log(z) + z:-1, data=df)
 summary(lm.fit)

enter image description here

(4d) works same as (4c)
 lm.fit <- lm(y ~ x + log(x) + z + log(z) + z-1, data=df)
 summary(lm.fit)

enter image description here

(5) 不使用“-1”,lm()函数将使用“Intercept”项
 lm.fit <- lm(y ~ x + log(x) + z + log(z) + z + z + z:z, data=df)
 summary(lm.fit)

enter image description here

(6) 使用单独的变量在lm()函数外进行数学运算。

因此,截距由lm()包含在内。

var_z <- (z-1)^2
lm.fit <- lm(y ~ x + log(x) + z + log(z) + var_z, data=df)
summary(lm.fit)

enter image description here

(7) 在 lm() 函数内使用 I()

它允许解释数学运算符进行数学计算。在这里,截距由 lm() 包含。

 lm.fit <- lm(y ~ x + log(x) + z + log(z) + I((z-1)^2), data=df)
 summary(lm.fit)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接