我已经阅读了这个question的答案,他们非常有帮助,但我需要特别是在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) . 我希望它是一个三阶多项式模型 .
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) .
在R中找到最佳拟合的最简单方法是将模型编码为:
lm.1 <- lm(y ~ x + I(x^2) + I(x^3) + I(x^4) + ...)
使用降压AIC回归后
lm.s <- step(lm.1)
哪种模型是“最佳拟合模型”取决于“最佳”的含义 . 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')
哪种型号最好?可以为它们中的任何一个做出参数(但我不想使用紫色参数进行插值) .
关于'可以帮我找到最合适的模型'的问题,可能有一个函数可以做到这一点,假设你可以说明要测试的模型集,但这对于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是你想要使用的标准,
optimize()
AIC()
polyfit() 可能没有最低限度 . 检查一下,例如:
polyfit()
for (i in 2:length(x)-1) print(polyfit(i))
我使用了 as.integer() 函数,因为我不清楚如何解释非整数多项式 .
as.integer()
用于测试任意一组数学方程式,考虑安德鲁·格尔曼审查的'Eureqa'程序here
Update
另请参阅 stepAIC 函数(在MASS包中)以自动选择模型 .
stepAIC
4 回答
要获得x(x ^ 3)中的三阶多项式,您可以这样做
要么
您可以拟合10阶多项式并获得近乎完美的拟合,但是,不是吗?
编辑:poly(x,3)可能是更好的选择(参见下面的@hadley) .
在R中找到最佳拟合的最简单方法是将模型编码为:
使用降压AIC回归后
哪种模型是“最佳拟合模型”取决于“最佳”的含义 . R有工具可以提供帮助,但您需要提供“最佳”的定义,以便在它们之间进行选择 . 请考虑以下示例数据和代码:
哪种型号最好?可以为它们中的任何一个做出参数(但我不想使用紫色参数进行插值) .
关于'可以帮我找到最合适的模型'的问题,可能有一个函数可以做到这一点,假设你可以说明要测试的模型集,但这对于n-1集合来说这将是一个很好的第一种方法 . 度多项式:
笔记
这种方法的有效性取决于你的目标,
optimize()
和AIC()
的假设,如果AIC是你想要使用的标准,polyfit()
可能没有最低限度 . 检查一下,例如:我使用了
as.integer()
函数,因为我不清楚如何解释非整数多项式 .用于测试任意一组数学方程式,考虑安德鲁·格尔曼审查的'Eureqa'程序here
Update
另请参阅
stepAIC
函数(在MASS包中)以自动选择模型 .