2016-09-27 98 views
-4

我爲每個溫度數據設置了溫度和不適指數值。當我在溫度(x軸)和計算不適指數值(y軸)之間繪製圖形時,我會得到一個反轉的U形曲線。我想要做非線性迴歸並將其轉換爲PMML模型。我的目標是獲得預測的不適值,如果我給一定的溫度。如何對我的數據執行非線性迴歸

請找到下面的數據集:

Temp <- c(0,5,10,6 ,9,13,15,16,20,21,24,26,29,30,32,34,36,38,40,43,44,45, 50,60) 

Disc<-c(0.00,0.10,0.25,0.15,0.24,0.26,0.30,0.31,0.40,0.41,0.49,0.50,0.56, 0.80,0.90,1.00,1.00,1.00,0.80,0.50,0.40,0.20,0.15,0.00) 

如何爲數據集做非線性迴歸(可能與nls?)?

enter image description here

+0

宋哲元喜力,感謝您的信息。你能分享我的結果嗎?PMML不過是預測建模標記語言,它是一個XML文件,用作預測傳入值的模型。 – Arul

回答

1

我也看看這個,那麼我認爲這是沒有用nls因爲我們大多數人首先想到的那樣簡單。

nls符合參數模型,但從您的數據(散點圖​​)中,很難提出合理的模型假設。我建議爲此使用非參數平滑。

有許多散點圖平滑方法,如內核平滑ksmooth,平滑樣條smooth.spline和LOESS loess。我更喜歡使用smooth.spline,這裏是我們可以用它做:

fit <- smooth.spline(Temp, Disc) 

請它所需要和它返回什麼閱讀?smooth.spline。我們可以通過

plot(Temp, Disc) 
lines(fit, col = 2) 

enter image description here

檢查擬合樣條曲線如果你想預測其他地方,使用predict功能(predict.smooth.spline)。舉例來說,如果我們要預測Temp = 20Temp = 44,我們可以使用

predict(fit, c(20,44))$y 
# [1] 0.3940963 0.3752191 

預測外range(Temp)不推薦,因爲它從潛在的不良影響外推遭受。


之前,我求助於非參數方法,我也試圖與迴歸樣條和正交多項式基礎非線性迴歸,但他們沒有提供令人滿意的結果。主要原因是沒有罰款的順利。舉個例子,我展示一些嘗試poly

try1 <- lm(Disc ~ poly(Temp, degree = 3)) 
try2 <- lm(Disc ~ poly(Temp, degree = 4)) 
try3 <- lm(Disc ~ poly(Temp, degree = 5)) 

plot(Temp, Disc, ylim = c(-0.3,1.0)) 
x<- seq(min(Temp), max(Temp), length = 50) 
newdat <- list(Temp = x) 
lines(x, predict(try1, newdat), col = 2) 
lines(x, predict(try2, newdat), col = 3) 
lines(x, predict(try3, newdat), col = 4) 

enter image description here

我們可以看到,擬合的曲線是人爲的。

+0

真的,很酷!我如何預測使用這個模型。我想將此模型轉換爲PMML文件。能否請你評論一下 – Arul

+0

謝謝你這麼多。我正在得到想要的結果:) – Arul

+0

對不起哲源,我是R編程新手。這是我的學習階段。所以非常摸索。當我下次發佈我的問題時,我會記住這一點:) – Arul

0

我們可以適應的多項式如下,但它會過度擬合數據,因爲我們有更高的程度:

m <- nls(Disc ~ a + b*Temp + c*Temp^2 + d*Temp^3 + e*Temp^4, start=list(a=0, b=1, c=1, d=1, e=1)) 
plot(Temp,Disc,pch=19) 
lines(Temp,predict(m),lty=2,col="red",lwd=3) 

m <- nls(Disc ~ a + b*Temp + c*Temp^2 + d*Temp^3 + e*Temp^4 + f*Temp^5, start=list(a=0, b=1, c=1, d=1, e=1, f=1)) 
lines(Temp,predict(m),lty=2,col="blue",lwd=3) 
m <- nls(Disc ~ a + b*Temp + c*Temp^2 + d*Temp^3 + e*Temp^4 + f*Temp^5 + g*Temp^6, start=list(a=0, b=1, c=1, d=1, e=1, f=1, g=1)) 
lines(Temp,predict(m),lty=2,col="green",lwd=3) 

m.poly <- lm(Disc ~ poly(Temp, degree = 15)) 
lines(Temp,predict(m),lty=2,col="yellow",lwd=3) 

legend(x = "topleft", legend = c("Deg 4", "Deg 5", "Deg 6", "Deg 20"), 
     col = c("red", "green", "blue", "yellow"), 
     lty = 2) 

enter image description here

+0

嗨Sandipan,隨着8的程度我越來越適合的曲線。我想創建一個PMML模型。由於我是R新手,需要幫助來完成這項任務。 – Arul

+0

使用pmml包:https://cran.r-project.org/web/packages/pmml/index.html –