R語言——非線性最小二乘迴歸

今天的主角只有一個函數,nls,專業的非線性擬合,光是看說明文件都有點眼花,不過在大致搞明白是怎麼回事之後,我覺得這應該是一個R語言用變量前不做任何聲明導致理解故障的典型

R語言——非線性最小二乘迴歸

由於它的說明裡正兒八經的做出了一個警告,這個擬合工具恰恰不能用於完美擬合的0殘差數據,所以舉例時選擇導個數據不太規則的文件進來

以下是數據的導入和預處理,還有散點圖:

T1 T1$Data plot(T1)
R語言——非線性最小二乘迴歸

先放個直線擬合的結果(以相關係數來評價),以便後頭確定非線性的擬合是否效果更好

#線性迴歸,得到相關係數0.964
FitV1 cor(T1$Data, FitV1)
R語言——非線性最小二乘迴歸

然後是非線性迴歸,這時咱得考慮一下使用什麼樣的曲線形式,先嚐試個簡單點的,從一元一次提到一元二次,這樣的話,方程的計算形式為y=w0 + w1 * x + w2 * x^2,先寫個按此方程計算擬合值的function,再放入nls函數中計算係數組w0, w1, w2

#非線性迴歸(一元二次)
CalCurve y=w0 + w1 * x + w2 * x^2;
return(y)}
Trial1 #求二次模型係數,擬合值和相關係數
coef(Trial1)
FitV2 cor(T1$Data, FitV2)
R語言——非線性最小二乘迴歸

發覺理解障礙的point在哪兒了不?嗯,所有係數(w開頭那3個)都是直接上手就用了,導致整個式子看起來都有點突兀

而中間一大段Warning信息是因為我偷了個懶,沒按著nls的要求輸入係數的初始值,倒是不影響出結果,得到相關係數0.9770,比直線時強了那麼一點

畫個曲線圖看看:

C1 plot(T1)
curve(CalCurve(x,C1[1],C1[2],C1[3]),1,nrow(T1), add = TRUE)
R語言——非線性最小二乘迴歸

然後,有簡單版那對應就得有晉級版,目前的二次曲線如果說基本可以符合所有散點的總體趨勢,那想要再貼近一點的話,可以試試加入週期性,比如把計算公式變成這樣:

y = w0 + w1*x + w2*x^2 + w3 *cos(w4 *x+w5)

動起來做做看

#非線性迴歸(加入週期性)
CTCurve y = w0 + w1*x + w2*x^2 + w3 *cos(w4 *x+w5);
return(y)}
Trial2 #求週期模型係數,擬合值和相關係數
coef(Trial2)
FitV3 cor(T1$Data, FitV3)
R語言——非線性最小二乘迴歸

相關係數0.9771,改進的幅度很小,看來,這個數列並沒有體現出很規律的週期性

再畫個曲線圖,今兒就算是圓滿結束了

C2 plot(T1)
curve(CTCurve(x,C2[1],C2[2],C2[3], C2[4], C2[5],C2[6]),
1,nrow(T1), col ="blue", add = TRUE)
R語言——非線性最小二乘迴歸


分享到:


相關文章: