r-如何计算lm函数的拟合值



我正在使用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

例如,使用头(数据(输出的第一个值:

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矩阵中的内容(在定义为y = X %*% beta的线性模型的意义上((多项式定义的实际数学细节/定义有点深:R函数"poly"到底做什么?(

最新更新