【问题标题】:Why predicted polynomial changes drastically when only the resolution of prediction grid changes?当只有预测网格的分辨率发生变化时,为什么预测多项式会发生巨大变化?
【发布时间】:2016-11-04 02:23:00
【问题描述】:

为什么我有完全相同的模型,但在不同的网格大小(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)

【问题讨论】:

    标签: r regression linear-regression lm polynomials


    【解决方案1】:

    这是一个编码/编程问题,因为在我的快速运行中,我无法通过将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)
    


    cuttlefish44 指出了您的实施中的错误。 在制作预测矩阵的时候,我们希望使用模型矩阵中的构造信息,而不是构造新的一组基。如果你想知道这样的“构造信息”是什么,也许你可以通过这个非常长答案:How poly() generates orthogonal polynomials? How to understand the “coefs” returned?

    也许我可以尝试做一个简短的总结,然后绕过那个冗长而详细的答案。

    1. 正交多项式的构造始终以输入协变量值x 为中心开始。如果这个中心不同,那么其余的一切都会不同。现在,这就是poly(x, coef = NULL)poly(x, coef = some_coefficients) 之间的区别。前者将始终使用新中心构建一组新基,而后者将使用some_coefficients 中现有的中心信息来预测给定设置的基值。这肯定是我们在进行预测时想要的。
    2. poly(x, coef = some_coefficients) 实际上会调用predict.poly(我在那个长答案中解释过)。当我们需要自己设置coef 参数时,这种情况比较少见,除非我们在进行测试。如果我们使用我在上面的快速运行中介绍的方式设置线性模型,predict.lm 足够聪明,可以实现预测poly 模型项的正确方法,即在内部它将为我们执行poly(new_x, coef = some_coefficients)
    3. 作为一个有趣的对比,普通多项式对此没有问题。例如,如果您在代码中的所有 poly() 调用中指定 raw = TRUE,则不会有任何问题。这是因为原始多项式没有构造信息;它只是在获得1, 2, ... degreex 的权力。

    【讨论】:

    • 找不到更好的词来感谢您提供的所有解释和链接。很长一段时间以来,我都有很多与此相关的问题。比如这个。也许我应该去更多的地方。 stats.stackexchange.com/questions/225156/…
    【解决方案2】:

    首先,预测线不适合原始数据。您未能将poly objs 用于预测。

    ...
    poly_ori <- poly(x, poly_df)    # important
    ...   
    
    plot(x,y)
    
    x_plt1 = seq(-1, 1, 0.001)
    x_plt_exp1 = as.data.frame(poly(x_plt1, poly_df, coefs = attr(poly_ori, "coefs")))
    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, coefs = attr(poly_ori, "coefs")))
    lines(x_plt2, predict(fit, x_plt_exp2), lwd = 3, col = 3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 2019-12-04
      • 2016-06-30
      • 1970-01-01
      • 2015-08-24
      • 2017-05-09
      • 2015-09-14
      相关资源
      最近更新 更多