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


83

我已经阅读了该问题的答案,它们非常有帮助,但是我特别需要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可以帮助我找到最佳的拟合模型吗?

Answers:


98

要获得x(x ^ 3)中的三阶多项式,您可以执行

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

要么

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

您可以拟合10阶多项式并获得接近完美的拟合,但是您应该吗?

编辑:poly(x,3)可能是一个更好的选择(请参见下面的@hadley)。


6
在问“你应该”时是现场。样本数据只有8点。这里的自由度非常低。当然,现实生活中的数据可能更多。
JD 2010年

1
感谢您的回答。如何让R找到最佳拟合模型?有什么功能吗?
Mehper C. Palavuzlar

5
这取决于您对“最佳模型”的定义。为您提供最大R ^ 2(10阶多项式将为之)的模型不一定是“最佳”模型。需要合理选择模型中的术语。您可以使用许多参数获得接近完美的拟合,但是该模型没有预测能力,除了对这些点画出一条最合适的线之外,该模型无用。
格雷格

10
你为什么用raw = T?最好使用不相关的变量。
哈德利2010年

2
我这样做是为了获得与相同的结果lm(y ~ x + I(x^2) + I(x^3))。也许不是最优的,只是在同一目的上给出两种手段。
格雷格

45

哪种模型是“最佳拟合模型”取决于“最佳”的含义。R有提供帮助的工具,但是您需要提供“最佳”的定义,以便在它们之间进行选择。考虑以下示例数据和代码:

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')

哪种模式最好?可以为其中任何一个参数(但我不想为紫色插值)。


15

关于“ R是否可以帮助我找到最佳拟合模型”问题,假设您可以陈述要测试的模型集,那么可能会有一个函数可以执行此操作,但这对于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()之所以使用该函数,是因为我不清楚如何解释一个非整数多项式。

  • 用于测试的数学方程式的任意一组,考虑到“Eureqa”由安德鲁·盖尔曼审查程序在这里

更新资料

另请参见stepAIC功能(在MASS软件包中)以自动进行模型选择。


如何将Eurequa与R连接?
adam.888 2013年

@ adam.888很好的问题-我不知道答案,但您可以将其单独发布。最后一点有点离题。
David LeBauer 2013年

注意:AIC是Akaike信息准则,该准则奖励紧密配合并以各种方式被证明是最优的方式惩罚模型的大量参数。en.wikipedia.org/wiki/Akaike_information_criterion
Evgeni Sergeev 2014年

5

在R中找到最佳拟合的最简单方法是将模型编码为:

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

使用逐步AIC回归后

lm.s <- step(lm.1)

5
使用I(x^2)等不会给出合适的正交多项式进行拟合。
Brian Diggs 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.