2010-09-29 254 views
67

數據我讀過的答案,這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可以幫我找到最合適的模型?

回答

71

爲了得到一個三階多項式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

12

關於'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

37

哪個模型是「最佳擬合模型」取決於您所說的「最佳」。 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') 

哪些模型是最好的?可以爲它們中的任何一個提出論據(但我不想用紫色的插值)。

5

找到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