hxd*_*011 3 regression r linear-regression lm polynomials
为什么我有完全相同的模型,但运行不同网格大小的预测(0.001对比0.01)获得不同的预测?
set.seed(0)
n_data=2000
x=runif(n_data)-0.5
y=0.1*sin(x*30)/x+runif(n_data)
plot(x,y)
poly_df=5
x_exp=as.data.frame(cbind(y,poly(x, poly_df)))
fit=lm(y~.,data=x_exp)
x_plt1=seq(-1,1,0.001)
x_plt_exp1=as.data.frame(poly(x_plt1,poly_df))
lines(x_plt1,predict(fit,x_plt_exp1),lwd=3,col=2)
x_plt2=seq(-1,1,0.01)
x_plt_exp2=as.data.frame(poly(x_plt2,poly_df))
lines(x_plt2,predict(fit,x_plt_exp2),lwd=3,col=3)
Run Code Online (Sandbox Code Playgroud)
这是一个编码/编程问题,因为在我的快速运行中我无法通过放入poly()内部模型公式进行适当的设置来重现这一点.所以我认为这个问题更适合Stack Overflow.
## quick test ##
set.seed(0)
x <- runif(2000) - 0.5
y <- 0.1 * sin(x * 30) / x + runif(2000)
plot(x,y)
x_exp <- data.frame(x, y)
fit <- lm(y ~ poly(x, 5), data = x_exp)
x1 <- seq(-1, 1, 0.001)
y1 <- predict(fit, newdata = list(x = x1))
lines(x1, y1, lwd = 5, col = 2)
x2 <- seq(-1, 1, 0.01)
y2 <- predict(fit, newdata = list(x = x2))
lines(x2, y2, lwd = 2, col = 3)
Run Code Online (Sandbox Code Playgroud)
cuttlefish44指出了你实施中的错误.在制作预测矩阵时,我们要在模型矩阵中使用构造信息,而不是构造一组新的基础.如果你想知道这样的"构造信息"是什么,也许你可以经历这个很长的答案:poly()如何生成正交多项式?如何理解"coefs"归来?
也许我可以尝试做一个简短的总结并绕过这个详尽的答案.
x.如果这个中心不同,那么其余的都将是不同的.现在,这之间的区别poly(x, coef = NULL)和poly(x, coef = some_coefficients).前者将始终使用新中心构建一组新的基础,而后者将使用现有的中心信息some_coefficients来预测给定设置的基础值.当然,这是我们在进行预测时所需要的.poly(x, coef = some_coefficients)实际上会打电话predict.poly(我在那个长答案中解释).coef除非我们正在进行测试,否则我们需要自己设置参数是相对罕见的.如果我们使用我在上面的快速运行中提出的方式设置线性模型,predict.lm就足够聪明地实现预测poly模型术语的正确方法,即在内部它将poly(new_x, coef = some_coefficients)为我们做.raw = TRUE在poly()代码中的所有调用中指定,则不会有任何问题.这是因为原始多项式没有构造信息; 它只是把权力1, 2, ... degree的x.