我一直在用 lm() 在 R 中拟合一个模型,并使用矩阵乘法“手动”进行预测。
当根据使用 predict.lm() 所做的预测检查结果时,我注意到结果有所不同,但只有当我对新数据集(即未训练模型的数据集)和我应用的数据集进行预测时预测变量的多项式(或样条)。
谁能解释为什么会这样?我认为无论我使用的是新数据集还是多项式,这两种方法都会给出相同的答案。
下面的可重现示例。
# Make data, fit model
set.seed(1); df_train = data.frame(matrix(rnorm(3000), ncol = 3))
set.seed(2); df_test = data.frame(matrix(rnorm(300), ncol = 3))
fit = lm(X1 ~ poly(X2, 2) + poly(X3, 2), data = df_train)
# fit = lm(X1 ~ X2 + X3, data = df_train) #no issues using linear terms
mm_train = model.matrix(formula(fit), df_train)
mm_test = model.matrix(formula(fit), df_test)
# Using predict and matrix multiplication give same results on train data
preds_1 = round(predict(fit, df_train), 5)
preds_2 = round(mm_train %*% fit$coefficients, 5)
all(preds_1 == preds_2) #TRUE
# Using predict and matrix multiplication give different results on test data
preds_1 = round(predict(fit, df_test), 5)
preds_2 = round(mm_test %*% fit$coefficients, 5)
all(preds_1 == preds_2) #FALSE