多项式拟合模型中的R

问题描述:

数据我读过的答案,这question,他们是相当有帮助的,但我需要帮助特别是在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可以帮我找到最合适的模型?

为了得到一个三阶多项式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个点。这里的*度很低。当然,真实生活中的数据可能会有更多。 – 2010-09-29 15:14:52

+1

感谢您的回答。如何让R找到最合适的模型?有没有这方面的功能? – 2010-09-29 15:40:46

+4

这取决于您对“最佳模式”的定义。给出最大R^2(其中10阶多项式会)的模型不一定是“最佳”模型。您的模型中的术语需要合理选择。您可以通过很多参数获得近乎完美的拟合,但该模型不具备预测能力,除了通过点绘制最合适的线以外,其他任何东西都无用。 – Greg 2010-09-29 17:11:00

关于'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'程序here

更新

另见stepAIC功能(在MASS包)实现自动化模型选择。

+0

如何将Eurequa与R进行交互? – 2013-09-10 12:45:47

+0

@ adam.888伟大的问题 - 我不知道答案,但你可以单独发布它。最后一点是有点离题。 – 2013-09-10 22:14:14

+0

注意:AIC是_Akaike信息标准_,它以一种已被证明在各种意义上最佳的方式奖励紧密配合并惩罚更多数量的模型参数。 http://en.wikipedia.org/wiki/Akaike_information_criterion – 2014-06-02 02:46:46

哪个模型是“最佳拟合模型”取决于您所说的“最佳”。 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') 

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

找到R中最适合的,最简单的方法是将模型代码:

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

使用降压AIC回归

lm.s <- step(lm.1) 
+2

使用'I(x^2)'等不能给出合适的正交多项式进行拟合。 – 2012-09-17 19:24:08