在R中,如何用最小二乘法估计一个多项式函数?

In R, how to estimate a polynomial function by Least Square method?

n = 50
set.seed(100)
x = matrix(runif(n, -2, 2), nrow=n)
y = 2 + 0.75*sin(x) - 0.75*cos(x) + rnorm(n, 0, 0.2)

.

在 R 中, 我想用最小二乘法估计上面的多项式函数

这意味着我想知道 γ0、γ1、γ2 和 γ3 的估计值。

而且我也想知道这个estimator函数下的MSE

我用过这个

summary(lm(y ~ x+ x^2+ x^3))

但只需得到 this output:

Call:
lm(formula = y ~ x + (x^2) + (x^3))

Residuals:
    Min      1Q  Median      3Q     Max 
-0.66448 -0.22251 -0.07694  0.20647  0.79429

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  1.54972    0.04761   32.55    <2e-16 ***
x            0.65279    0.04633   14.09    <2e-16 ***   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3319 on 48 degrees of freedom
Multiple R-squared:  0.8053,    Adjusted R-squared:  0.8013
F-statistic:  198.6 on 1 and 48 DF,  p-value: < 2.2e-16

请在R中告诉我,我可以用什么函数或包来做。

谢谢。

您需要将 I(.) 包裹在您的多项式周围以指示 R ^ 运算符应该用作算术运算符而不是公式运算符。

让我们创建一些示例数据来说明。

set.seed(42)
x <- runif(100)
y <- x + x^2 + x^3 + rnorm(100)

你要的是这个:

lm(y ~ x + I(x^2) + I(x^3))$coe
# (Intercept)           x      I(x^2)      I(x^3) 
#  -0.4069207   3.4580770  -4.0516060   4.3227674 

或:

lm(y ~ poly(x, 3, raw=TRUE))$coe
# (Intercept) poly(x, 3, raw = TRUE)1 poly(x, 3, raw = TRUE)2 poly(x, 3, raw = TRUE)3 
#  -0.4069207               3.4580770              -4.0516060               4.3227674 

没有 I(.) 结果不同,

lm(y ~ x + x^2 + x^3)$coe
# (Intercept)           x 
#  -0.6149136   3.3590395 

因为出于某种原因 R 将 forumla 解释为

lm(y ~ x)$coe
# (Intercept)           x 
#  -0.6149136   3.3590395 

all(lm(y ~ x)$coe - lm(y ~ x + x^2 + x^3)$coe == 0)
# [1] TRUE

但是,请考虑:

lm(y ~ I(x + x^2 + x^3))$coe
# (Intercept) I(x + x^2 + x^3) 
#   -0.191611         1.141912 

创建变量z

z <- x + x^2 + x^3

给出相同的结果:

lm(y ~ z)$coe
# (Intercept)           z 
#   -0.191611    1.141912 

或者,更明确地说,假设我们要计算 xa 的交互作用,我们想使用 * 作为 公式 运算符:

a <- runif(100)
lm(y ~ x*a)$coe
# (Intercept)           x           a         x:a 
# -0.71920356  3.42008631  0.19180499 -0.07049342 

当我们使用 * 作为 算术 运算符时,

lm(y ~ I(x*a))$coe
# (Intercept)    I(x * a) 
#   0.5317547   2.7361742 

结果与:

相同
xa <- x*a

lm(y ~ xa)$coe
# (Intercept)          xa 
#   0.5317547   2.7361742