为什么在 R 中制作线性多项式模型时需要 I() "AsIs"?
Why I() "AsIs" is necessary when making a linear polynomial model in R?
我试图了解在使用线性多项式模型或函数 poly
时,I()
基函数在 R 中的作用是什么。当我使用
计算模型时
q + q^2
q + I(q^2)
poly(q, 2)
我有不同的答案。
这是一个例子:
set.seed(20)
q <- seq(from=0, to=20, by=0.1)
y <- 500 + .1 * (q-5)^2
noise <- rnorm(length(q), mean=10, sd=80)
noisy.y <- y + noise
model3 <- lm(noisy.y ~ poly(q,2))
model1 <- lm(noisy.y ~ q + I(q^2))
model2 <- lm(noisy.y ~ q + q^2)
I(q^2)==I(q)^2
I(q^2)==q^2
summary(model1)
summary(model2)
summary(model3)
这是输出:
> summary(model1)
Call:
lm(formula = noisy.y ~ q + I(q^2))
Residuals:
Min 1Q Median 3Q Max
-211.592 -50.609 4.742 61.983 165.792
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 489.3723 16.5982 29.483 <2e-16 ***
q 5.0560 3.8344 1.319 0.189
I(q^2) -0.1530 0.1856 -0.824 0.411
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 79.22 on 198 degrees of freedom
Multiple R-squared: 0.02451, Adjusted R-squared: 0.01466
F-statistic: 2.488 on 2 and 198 DF, p-value: 0.08568
> summary(model2)
Call:
lm(formula = noisy.y ~ q + q^2)
Residuals:
Min 1Q Median 3Q Max
-219.96 -54.42 3.30 61.06 170.79
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 499.5209 11.1252 44.900 <2e-16 ***
q 1.9961 0.9623 2.074 0.0393 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 79.16 on 199 degrees of freedom
Multiple R-squared: 0.02117, Adjusted R-squared: 0.01625
F-statistic: 4.303 on 1 and 199 DF, p-value: 0.03933
> summary(model3)
Call:
lm(formula = noisy.y ~ poly(q, 2))
Residuals:
Min 1Q Median 3Q Max
-211.592 -50.609 4.742 61.983 165.792
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 519.482 5.588 92.966 <2e-16 ***
poly(q, 2)1 164.202 79.222 2.073 0.0395 *
poly(q, 2)2 -65.314 79.222 -0.824 0.4107
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 79.22 on 198 degrees of freedom
Multiple R-squared: 0.02451, Adjusted R-squared: 0.01466
F-statistic: 2.488 on 2 and 198 DF, p-value: 0.08568
为什么在 R 中做多项式模型时需要 I()
。
此外,poly
函数给出的结果与 q + I(q^2)
不同,这正常吗?
?formula
帮助页面中描述了 R 中的公式语法。 ^
符号没有被赋予乘幂的通常含义。相反,它用于指数底部所有项之间的交互。例如
y ~ (a+b)^2
与
相同
y ~ a + b + a:b
但如果你这样做
y ~ a + b^2
y ~ a + b # same as above, no way to "interact" b with itself.
该插入符将只包括 b
项,因为它不能包括与自身的交互。所以公式中的 ^
和 *
与乘法无关,就像 +
并不真正意味着通常意义上的变量加法。
如果您想要 ^2
的 "usual" 定义,您需要按原样放置它。否则它根本不适合平方项。
和 poly()
函数默认 returns 正交多项式,如帮助页面所述。这有助于减少协变量中的共线性。但是,如果您不想要正交版本而只想要 "raw" 多项式项,则只需将 raw=TRUE
传递给您的 poly
调用即可。例如
lm(noisy.y ~ poly(q,2, raw=TRUE))
将 return 与 model1
相同的估计
我试图了解在使用线性多项式模型或函数 poly
时,I()
基函数在 R 中的作用是什么。当我使用
q + q^2
q + I(q^2)
poly(q, 2)
我有不同的答案。
这是一个例子:
set.seed(20)
q <- seq(from=0, to=20, by=0.1)
y <- 500 + .1 * (q-5)^2
noise <- rnorm(length(q), mean=10, sd=80)
noisy.y <- y + noise
model3 <- lm(noisy.y ~ poly(q,2))
model1 <- lm(noisy.y ~ q + I(q^2))
model2 <- lm(noisy.y ~ q + q^2)
I(q^2)==I(q)^2
I(q^2)==q^2
summary(model1)
summary(model2)
summary(model3)
这是输出:
> summary(model1)
Call:
lm(formula = noisy.y ~ q + I(q^2))
Residuals:
Min 1Q Median 3Q Max
-211.592 -50.609 4.742 61.983 165.792
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 489.3723 16.5982 29.483 <2e-16 ***
q 5.0560 3.8344 1.319 0.189
I(q^2) -0.1530 0.1856 -0.824 0.411
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 79.22 on 198 degrees of freedom
Multiple R-squared: 0.02451, Adjusted R-squared: 0.01466
F-statistic: 2.488 on 2 and 198 DF, p-value: 0.08568
> summary(model2)
Call:
lm(formula = noisy.y ~ q + q^2)
Residuals:
Min 1Q Median 3Q Max
-219.96 -54.42 3.30 61.06 170.79
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 499.5209 11.1252 44.900 <2e-16 ***
q 1.9961 0.9623 2.074 0.0393 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 79.16 on 199 degrees of freedom
Multiple R-squared: 0.02117, Adjusted R-squared: 0.01625
F-statistic: 4.303 on 1 and 199 DF, p-value: 0.03933
> summary(model3)
Call:
lm(formula = noisy.y ~ poly(q, 2))
Residuals:
Min 1Q Median 3Q Max
-211.592 -50.609 4.742 61.983 165.792
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 519.482 5.588 92.966 <2e-16 ***
poly(q, 2)1 164.202 79.222 2.073 0.0395 *
poly(q, 2)2 -65.314 79.222 -0.824 0.4107
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 79.22 on 198 degrees of freedom
Multiple R-squared: 0.02451, Adjusted R-squared: 0.01466
F-statistic: 2.488 on 2 and 198 DF, p-value: 0.08568
为什么在 R 中做多项式模型时需要 I()
。
此外,poly
函数给出的结果与 q + I(q^2)
不同,这正常吗?
?formula
帮助页面中描述了 R 中的公式语法。 ^
符号没有被赋予乘幂的通常含义。相反,它用于指数底部所有项之间的交互。例如
y ~ (a+b)^2
与
相同y ~ a + b + a:b
但如果你这样做
y ~ a + b^2
y ~ a + b # same as above, no way to "interact" b with itself.
该插入符将只包括 b
项,因为它不能包括与自身的交互。所以公式中的 ^
和 *
与乘法无关,就像 +
并不真正意味着通常意义上的变量加法。
如果您想要 ^2
的 "usual" 定义,您需要按原样放置它。否则它根本不适合平方项。
和 poly()
函数默认 returns 正交多项式,如帮助页面所述。这有助于减少协变量中的共线性。但是,如果您不想要正交版本而只想要 "raw" 多项式项,则只需将 raw=TRUE
传递给您的 poly
调用即可。例如
lm(noisy.y ~ poly(q,2, raw=TRUE))
将 return 与 model1