R 的predict
函数可以接受一个newdata
参数,其文档内容如下:
newdata 一个可选的数据框,用于查找用于预测的变量。如果省略,则使用拟合值。
但我发现这并不完全正确,具体取决于模型的拟合方式。例如,以下代码按预期工作:
x <- rnorm(200, sd=10)
y <- x + rnorm(200, sd=1)
data <- data.frame(x, y)
train = sample(1:length(x), size=length(x)/2, replace=F)
dataTrain <- data[train,]
dataTest <- data[-train,]
m <- lm(y ~ x, data=dataTrain)
head(predict(m,type="response"))
head(predict(m,newdata=dataTest,type="response"))
但是,如果模型适合这样:
m2 <- lm(dataTrain$y ~ dataTrain$x)
head(predict(m2,type="response"))
head(predict(m2,newdata=dataTest,type="response"))
最后两行将产生完全相同的结果。该predict
函数以忽略newdata
参数的方式工作,即它根本无法真正计算对新数据的预测。
罪魁祸首当然是lm(y ~ x, data=dataTrain)
对战lm(dataTrain$y ~ dataTrain$x)
。但是我没有找到任何提到这两者之间区别的文件。这是一个已知问题吗?
我正在使用 R 2.15.2。