0

我正在使用lmR 上的函数调整响应面。在输出中,使用fit[["fitted.values"]],报告的值与实际值一致。但是,当我使用为每个效果生成的系数 ( Intercept, x1, x1*x2) 并进行手动计算时,呈现的值非常不一致。

fitted.values函数如何进行计算?

下面是部分代码和输出:

data = read.csv("data.csv", header = TRUE, sep = ";")
head(data)
fit <- lm(rend ~ poly(wis, enz, degree = 2), data = data)
summary(fit)

的输出head(data)

    wis enz rend
1 10.00   3   68
2 10.25   3   66
3 10.50   3   64
4 10.75   3   62
5 11.00   3   61
6 11.25   3   60

的部分输出fit[["fitted.values"]]

      1        2        3        4        5        6        7        8        9       10       11       12 
67.02258 65.46832 64.01733 62.66962 61.42517 60.28399 59.24609 58.31146 57.48009 56.75200 56.12718 55.60564 
      13       14       15       16       17       18       19       20       21       22       23       24 
55.18736 54.87235 54.66062 54.55215 54.54696 54.64504 54.84639 55.15101 55.55891 56.07007 56.68450 57.40221

总结系数:

Coefficients:
                                Estimate Std. Error  t value Pr(>|t|)    
(Intercept)                     66.23929    0.02293 2888.536   <2e-16 ***
poly(wis, enz, degree = 2)1.0  -24.26976    0.70940  -34.211   <2e-16 ***
poly(wis, enz, degree = 2)2.0  129.35949    0.70940  182.349   <2e-16 ***
poly(wis, enz, degree = 2)0.1  130.19258    0.70940  183.524   <2e-16 ***
poly(wis, enz, degree = 2)1.1 -701.60447   21.94572  -31.970   <2e-16 ***
poly(wis, enz, degree = 2)0.2    0.48360    0.70940    0.682    0.496 

我所做的是如下应用这些系数,只考虑重要的系数:

rend = 66.24 - 24.26*wis + 129.36*wis^2 + 130.19*enz - 701.60*wis*enz

例如,使用 head(data) 输出的第一个值:

rend = 66.24 - 24.26*10 + 129.36*10^2 + 130.19*3 - 701.60*10*3

这导致 7897.79 与估计的fitted.values67.02不同

我究竟做错了什么?

4

1 回答 1

2

poly()函数默认构造正交多项式基b0 + b1*x1 + b2*x2 + b12*x1*x2 ...,这与标准参数化有很大不同。如果您想要标准参数化,您可以使用poly(wiz, env, degree = 2, raw = TRUE).

如果您想查看poly()默认情况下正在做什么,您可以使用model.matrix(fit)来查看X矩阵中的内容(在定义为的线性模型的意义上y = X %*% beta)(实际数学细节/多项式如何定义的定义有点深:什么R函数`poly`真的可以吗?

于 2021-12-17T19:59:30.947 回答