在R中,如何通过最小二乘法估计多项式函数?

时间:2019-11-30 07:23:57

标签: r statistics least-squares

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)

polynomial function to be estimated

在R中, 我想通过最小二乘法估算上述多项式函数。

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

我也想了解这个估算器函数下的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中告诉我,我可以使用什么功能或软件包。

谢谢。

1 个答案:

答案 0 :(得分:0)

您需要将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将论坛解释为

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 

或更明确地说,假设我们要计算与x的交互a,我们想将*用作公式运算符:

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