我正在使用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"到底做什么?(