在上一个答案的基础上,如果没有 I() 运算符,lm() 不会 interepret 数学运算符进行数学运算。因此,如果没有 I(),“-1”对 lm() 的影响与使用“+0”类似,即不使用“(Intercept)”术语。因此R-squared 的值更高(details here),因为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)
(1) 不使用术语“(z-1)”
lm.fit <- lm(y ~ x + log(x) + z + log(z), data=df)
summary(lm.fit)
# (2) 使用术语“(z-1)^2”
注意:这里,没有“I((z-1)^2)”中的“I”,lm() 函数不会将“-,^”视为算术运算符
lm.fit <- lm(y ~ x + log(x) + z + log(z) + (z-1)^2, data=df)
summary(lm.fit)
(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)
(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)
(4b) 去掉括号
lm.fit <- lm(y ~ x + log(x) + z + log(z) + z-1 + z-1 + (z-1):(z-1), data=df)
summary(lm.fit)
(4c) 只保留“z:-1”字词
lm.fit <- lm(y ~ x + log(x) + z + log(z) + z:-1, data=df)
summary(lm.fit)
(4d) 与 (4c) 工作方式相同
lm.fit <- lm(y ~ x + log(x) + z + log(z) + z-1, data=df)
summary(lm.fit)
(5) 不使用“-1”,lm() 函数使用“拦截”术语
lm.fit <- lm(y ~ x + log(x) + z + log(z) + z + z + z:z, data=df)
summary(lm.fit)
(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)
(7) 在lm() 函数中使用I():
它允许它解释数学运算符来进行数学运算。在这里,拦截包含在lm()中。
lm.fit <- lm(y ~ x + log(x) + z + log(z) + I((z-1)^2), data=df)
summary(lm.fit)