将多项式模型拟合到R中的数据

我已经阅读了这个问题的答案,他们相当有帮助,但是我特别需要R的帮助。

我在R中有一个示例数据集,如下所示:

x <- c(32,64,96,118,126,144,152.5,158) y <- c(99.5,104.8,108.5,100,86,64,35.3,15) 

我想为这些数据拟合一个模型,使得y = f(x) 。 我希望它是一个三阶多项式模型。

我怎样才能在R?

另外,R可以帮我find最合适的模型吗?

为了得到x(x ^ 3)中的三阶多项式,可以这样做

 lm(y ~ x + I(x^2) + I(x^3)) 

要么

 lm(y ~ poly(x, 3, raw=TRUE)) 

你可以拟合一个10阶多项式并得到近乎完美的拟合,但是你应该?

编辑:poly(x,3)可能是更好的select(请参阅下面的@hadley)。

哪个模型是“最佳拟合模型”取决于你所说的“最好”的含义。 R有帮助的工具,但是你需要提供“最好”的定义来select它们。 考虑以下示例数据和代码:

 x <- 1:10 y <- x + c(-0.5,0.5) plot(x,y, xlim=c(0,11), ylim=c(-1,12)) fit1 <- lm( y~offset(x) -1 ) fit2 <- lm( y~x ) fit3 <- lm( y~poly(x,3) ) fit4 <- lm( y~poly(x,9) ) library(splines) fit5 <- lm( y~ns(x, 3) ) fit6 <- lm( y~ns(x, 9) ) fit7 <- lm( y ~ x + cos(x*pi) ) xx <- seq(0,11, length.out=250) lines(xx, predict(fit1, data.frame(x=xx)), col='blue') lines(xx, predict(fit2, data.frame(x=xx)), col='green') lines(xx, predict(fit3, data.frame(x=xx)), col='red') lines(xx, predict(fit4, data.frame(x=xx)), col='purple') lines(xx, predict(fit5, data.frame(x=xx)), col='orange') lines(xx, predict(fit6, data.frame(x=xx)), col='grey') lines(xx, predict(fit7, data.frame(x=xx)), col='black') 

哪些型号是最好的? 可以为他们中的任何一个提出论据(但我不想用紫色的插值)。

关于“R可以帮我find最合适的模型”的问题,假设你可以陈述要testing的一组模型,可能有一个函数可以做到这一点,但这对于n-1组是一个好的第一种方法度多项式:

 polyfit <- function(i) x <- AIC(lm(y~poly(x,i))) as.integer(optimize(polyfit,interval = c(1,length(x)-1))$minimum) 

笔记

  • 这种方法的有效性将取决于您的目标, optimize()AIC()的假设,如果AIC是您要使用的标准,

  • polyfit()可能没有一个最小值。 检查这个像这样的东西:

     for (i in 2:length(x)-1) print(polyfit(i)) 
  • 我使用了as.integer()函数,因为我不清楚如何解释一个非整数多项式。

  • 为了testing一组任意的math方程,可以考虑一下安德鲁· 盖尔曼 (Andrew Gelman) 在这里回顾的“Eureqa”程序

更新

另请参阅stepAICfunction(在MASS软件包中)来自动select模型。

在R中find最合适的最简单的方法是将模型编码为:

 lm.1 <- lm(y ~ x + I(x^2) + I(x^3) + I(x^4) + ...) 

使用降压AIC回归后

 lm.s <- step(lm.1)