lm 函数的 fitted.values 是如何计算的?

How is the fitted.values from lm function calculated?

我正在使用 R 上的 lm 函数调整响应面。输出时,使用 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.values 估计的 67.02

不同

我做错了什么?

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

如果您想查看默认情况下 poly() 在做什么,您可以使用 model.matrix(fit) 查看 X 矩阵中的内容(在定义为 [ 的线性模型的意义上) =16=])(关于如何定义多项式的实际数学 details/definition 有点深:What does the R function `poly` really do?